Files
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

182 lines
3.4 KiB
NASM

PAGE
STTL "--- WARMSTART ROUTINE ---"
; -------------
; ZIP WARMSTART
; -------------
WARM2: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
LDX #ZEROPG
ST0: STA 0,X
INX
CPX #ZPGTOP
BCC ST0
INC ZSP+LO ; INIT Z-STACK POINTERS
INC OLDZSP+LO ; TO "1"
INC SCRIPT ; ENABLE SCRIPTING
INC SCREENF ; TURN DISPLAY ON
INC SIDEFLG ; SET SIDE 1
LDA #%00001110 ; DO IT AGAIN AS JUST
STA BANK0 ; WIPED IT OUT
LDA #%01111111
STA BANK1
; GRAB THE FIRST BLOCK OF PRELOAD
LDA #>ZBEGIN ; MSB OF PRELOAD START ADDRESS
STA ZCODE ; FREEZE IT HERE
STA DBUFF+HI ; LSB IS ALWAYS ZERO
LDA #MAIN
STA DSKBNK ;SET TO MAIN BANK
JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0
BCC CHKGAM
JMP DSKERR ; BAD DISK READ
; EXTRACT GAME DATA FROM Z-CODE HEADER
CHKGAM: LDA ZBEGIN+ZVERS ; (EZIP) IS GAME AN EZIP?
CMP #4
BEQ YESEZ ; YES, CONTINUE
; *** ERROR #16 -- NOT AN EZIP GAME ***
LDA #16
JMP ZERROR
; *** ERROR #0 -- INSUFFICIENT RAM ***
NORAM: LDX #5
LDY #0
CLC
JSR PLOT
LDA #0
JMP ZERROR
YESEZ: LDX ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER
INX ; ADD 1 TO GET
STX ZPURE ; 1ST "PURE" PAGE OF Z-CODE
LDA ZBEGIN+ZMODE ; ENABLE SPLIT-SCREEN,
ORA #%00111011 ; INVERSE, CURSOR CONTROL,
STA ZBEGIN+ZMODE ; SOUND (EZIP)
LDA #EZIPID ; SET INTERPRETER ID
STA ZBEGIN+ZINTWD
LDA #VERSID
STA ZBEGIN+ZINTWD+1
LDA #$18 ; AND SCREEN PARAMETERS
STA ZBEGIN+ZSCRWD
LDA #80
STA ZBEGIN+ZSCRWD+1
LDA ZBEGIN+ZGLOBA ; GET MSB OF GLOBAL TABLE ADDR
CLC ; CONVERT TO
ADC ZCODE ; ABSOLUTE ADDRESS
STA GLOBAL+HI
LDA ZBEGIN+ZGLOBA+1 ; LSB NEEDN'T CHANGE
STA GLOBAL+LO
LDA ZBEGIN+ZFWORD ; DO SAME FOR FWORDS TABLE
CLC
ADC ZCODE
STA FWORDS+HI
LDA ZBEGIN+ZFWORD+1 ; NO CHANGE FOR LSB
STA FWORDS+LO
LDA ZBEGIN+ZOBJEC ; NOT TO MENTION
CLC ; THE OBJECT TABLE
ADC ZCODE
STA OBJTAB+HI
LDA ZBEGIN+ZOBJEC+1 ; LSB SAME
STA OBJTAB+LO
; FIND SIZE AND NUMBER OF SAVES
LDA ZBEGIN+ZPURBT ; SIZE OF IMPURE
CMP #$A0 ; MAXIMUM IMPURE IS $A000 (36K)
BCC SIZE0 ; OKAY, CONTINUE
LDA #13
JMP ZERROR ; ELSE ERROR #13 (IMPURE TOO BIG)
SIZE0:
CLC
ADC #6 ; PLUS ZSTACK &...
STA SAVSIZ ; HOW MANY PAGES PER SAVE
LDX #0
STX NUMSAV
SIZE1: INC NUMSAV ; INC NUMSAVE WITH EACH
CLC ; POSSIBLE SAVE
ADC SAVSIZ
BCC SIZE1
SIZE2: INC NUMSAV ; TOTAL SIZE IS 170K, ($298)
CLC
ADC SAVSIZ ; SO DO LOOP FOR 1ST & 2ND $100
BCC SIZE2
SIZE3: CMP #$98
BCS SIZE4 ; BEYOND TOTAL DISK SIZE
INC NUMSAV
CLC
ADC SAVSIZ
BCC SIZE3
SIZE4: LDA NUMSAV
CMP #9
BCC SIZEj
LDA #9 ; easier to print a 9!
SIZEj:
CLC
ADC #'0'
STA POSTOP ; SET POSITION MSG
LDY #21 ; POSITION MESSAGE
LDX #14
CLC
JSR PLOT
LDX #<TMSG
LDA #>TMSG
LDY #TMSGL
JSR DLINE
JMP ENDTST
TMSG: DB "(Please be patient, this takes a while)"
DB EOL
TMSGL EQU $-TMSG
ENDTST:
LDY #00 ; (CBD) POSITION FOR SIDE2 MESSAGE
LDX #20 ; (CBD)
CLC ; (CBD)
JSR PLOT ; (CBD)
JSR INITPAG
LDA #CLS ; GET RID OF "LOADING" MSG
JSR CHROUT
LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE
STA ZPCM ; MSB
LDA ZBEGIN+ZGO+1 ; AND LSB
STA ZPCL ; HIGH BIT ALREADY ZEROED
JSR VLDZPC ; MAKE ZPC VALID
LDX WWIDTH
STX XSIZE
LDA PSTAT ; CHECK IF RESTART & WERE PRINTING
CMP #1
BNE EX2 ; NO
STA SCRIPTF ; YES, TURN SCRIPT FLAG ON
ORA ZBEGIN+ZSCRIP+1 ; SET GAME FLAG ALSO
STA ZBEGIN+ZSCRIP+1
EX2: LDA #CLS ; CLEAR SCREEN ...
JSR CHROUT
LDY #0
LDX #23 ; start cursor off at bottom of
CLC
JSR PLOT ; screen
; ... AND FALL INTO MAIN LOOP
END