mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-09 09:41:46 +00:00
203 lines
3.6 KiB
Plaintext
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
|
|
|