mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-27 20:27:54 +00:00
Initial commit.
This commit is contained in:
131
atari/warm.src
Normal file
131
atari/warm.src
Normal file
@@ -0,0 +1,131 @@
|
||||
PAGE
|
||||
SBTTL "--- WARMSTART ROUTINE ---"
|
||||
|
||||
; -------------
|
||||
; ZIP WARMSTART
|
||||
; -------------
|
||||
|
||||
WARM1: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
|
||||
LDX #ZEROPG
|
||||
ST0: STA 0,X
|
||||
INX
|
||||
; CPX #ZPGTOP ; NOT NEEDED FOR ATARI
|
||||
BNE ST0
|
||||
|
||||
; INIT THE PAGING TABLE
|
||||
|
||||
TAX ; = 0
|
||||
LDA #$FF
|
||||
ST1: STA PTABL,X
|
||||
STA PTABH,X
|
||||
INX
|
||||
BNE ST1
|
||||
|
||||
; CLEAR THE TIMESTAMP MAP
|
||||
|
||||
TXA ; = 0
|
||||
ST2: STA LRUMAP,X
|
||||
INX
|
||||
BNE ST2
|
||||
|
||||
INC ZSP ; INIT Z-STACK POINTERS
|
||||
INC OLDZSP ; TO "1"
|
||||
INC STAMP ; 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
|
||||
DEC ZPURE ; (ATARI ONLY) FORCE FETCH FROM PRELOAD
|
||||
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 ; 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
|
||||
|
||||
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
|
||||
|
||||
SETNP: STA PMAX ; SET # SWAPPING PAGES
|
||||
|
||||
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 #21
|
||||
STA LMAX ; PREVENT WEIRDNESS
|
||||
|
||||
JSR SIDE2 ; REQUEST SIDE 2 OF DISK
|
||||
JSR CLS ; CLEAR SCREEN
|
||||
|
||||
LDA #$FF
|
||||
STA SCRIPT ; ENABLE SCRIPTING
|
||||
|
||||
LDA ZBEGIN+ZSCRIP+1 ; SET SCRIPT FLAG
|
||||
ORA SFLAG ; TO PREVIOUS SETTING
|
||||
STA ZBEGIN+ZSCRIP+1 ; (BM 5/14/85)
|
||||
|
||||
; ... AND FALL INTO MAIN LOOP
|
||||
|
||||
END
|
||||
|
||||
Reference in New Issue
Block a user