Files
erkyrath.infocom-zcode-terps/apple/zip/warm.g
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

203 lines
3.6 KiB
Plaintext

PAGE
SBTTL "--- WARMSTART ROUTINE ---"
; -------------
; ZIP WARMSTART
; -------------
WARM1: LDA #10 ;CENTER DISPLAY
STA CV
LDA COL80
BNE W1 ;80 COL
LDA #8 ;40 COL
STA CH
BNE W2 ;JMP
W1: LDA #27
STA CH
STA EH
W2: JSR BASCAL
LDA #HIGH STRYM ;DISP. "THE STORY IS LOADING..."
LDX #LOW STRYM
LDY #STRYML
JSR DLINE
LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
LDX #ZEROPG
ST0: STA 0,X
INX
BNE ST0
LDX #PG2SIZ
ST3: STA LRU,X ; CLEAR ALL VARIABLES IN PG 2
DEX
BPL ST3
; LDA #0 ; INIT THE PAGING TABLE
; TAX ; = 0
LDX #4 ; 4 TIMES THRU = 1K
LDY #0
LDA #HIGH PTABL
STA I+HI
LDA #LOW PTABL
STA I+LO
LDA #$FF ; INIT THE PAGING TBL
ST1: STA (I),Y
INY
BNE ST1
INC I+HI ; NEXT PAGE IN BLOCK
DEX
BNE ST1
; CLEAR THE TIMESTAMP MAP
LDA #HIGH LRUMAP
STA I+HI
LDA #LOW LRUMAP
STA I+LO
LDX #4 ; = 1K
LDY #0
TYA ; = 0
ST2: STA (I),Y
INY
BNE ST2
INC I+HI
DEX
BNE ST2
INC ZSP ; INIT Z-STACK POINTERS
INC OLDZSP ; TO "1"
INC SCRIPT ; ENABLE SCRIPTING
INC STAMP+LO ; INIT TIMESTAMP
; GRAB THE FIRST BLOCK OF PRELOAD
LDA #HIGH ZBEGIN ; MSB OF PRELOAD START ADDRESS
STA ZCODE ; FREEZE IT HERE
STA DBUFF+HI ; LSB IS ALWAYS ZERO
JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0
; EXTRACT GAME DATA FROM Z-CODE HEADER
LDX ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER
INX ; ADD 1 TO GET
STX ZPURE+LO ; 1ST "PURE" PAGE OF Z-CODE
TXA ; ADD START PAGE OF PRELOAD
CLC ; TO CALC ABSOLUTE START ADDRESS
ADC ZCODE ; OF PAGING SPACE
STA PAGE0+LO
; JSR MEMTOP ; RETURNS TOP RAM PAGE IN [A]
; SEC
; SBC PAGE0 ; SUBTRACT ADDRESS OF PAGING SPACE
; BEQ NORAM
; BCS SETNP ; ERROR IF NOT ENOUGH RAM
;
; ; *** ERROR #0 -- INSUFFICIENT RAM ***
;
;NORAM: LDA #0
; JMP ZERROR
;
JSR MEMTOP ; RETURN TOP RAM PG IN [A/Y]
PHA
TYA
SEC
SBC PAGE0+LO
STA PMAX+LO
BEQ CKHIGH ; LESS OR =, CHECK HIGH BYTE
BCC CKHIGH
PLA
SBC PAGE0+HI
BCC NORAM ; IF HIGH BYTE IS LESS, NOT ENOUGH MEMORY
BCS SETNP ; A-OK
CKHIGH: PLA
SBC PAGE0+HI
BEQ NORAM ; LO BYTE NOT ENOUGH, IF NOTHING HERE...
BCS SETNP ; OK
; *** ERROR #0 -- INSUFFICIENT RAM ***
NORAM: LDA #0
JMP ZERROR
SETNP: STA PMAX+HI ; FINISH SETTING # SWAPPING PAGES
ASL PMAX+LO ; WORD ALIGN VALUE,
ROL PMAX+HI ; ALWAYS USED THAT WAY IN PAGING
LDA ZBEGIN+ZMODE
ORA #%00100000 ; ENABLE SPLIT-SCREEN
STA ZBEGIN+ZMODE
AND #%00000010 ; ISOLATE STATUS-FORMAT BIT
STA TIMEFL ; 0=SCORE, NZ=TIME
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+ZVOCAB ; NOW DO VOCABULARY TABLE
CLC
ADC ZCODE
STA VOCAB+HI
LDA ZBEGIN+ZVOCAB+1 ; LSB SAME
STA VOCAB+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
; FETCH THE REST OF THE PRELOAD
LDPRE: LDA DBLOCK+LO ; CHECK CURRENT BLOCK #
CMP ZPURE ; LOADED LAST PRELOAD PAGE YET?
BCS WARMEX ; YES, TIME TO PLAY!
JSR GETDSK ; ELSE GRAB NEXT Z-BLOCK
JMP LDPRE
WARMEX: LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE
STA ZPCM ; MSB
LDA ZBEGIN+ZGO+1 ; AND LSB
STA ZPCL ; HIGH BIT ALREADY ZEROED
LDA #1 ; EXCLUDE STATUS LINE FROM REGULAR DISPLAY
STA WTOP
STA LINCNT ; FIX FOR 1ST SCREEN
LDX WWIDTH ; SET XSIZE TO 1 LESS
DEX
STX XSIZE
LDA PSTAT ; CHECK IF RESTART & WAS PRINTING
BPL EX2 ; NOPE
LDA ZBEGIN+ZSCRIP+1 ; MAKE IT KEEP PRINTING
ORA #%00000001
STA ZBEGIN+ZSCRIP+1
LDA #2 ; RESET PSTAT FOR NEXT TIME
STA PSTAT
EX2: JSR CLS ; CLEAR SCREEN ...
; ... AND FALL INTO MAIN LOOP
END