mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-11 23:43:24 +00:00
345 lines
6.6 KiB
Plaintext
345 lines
6.6 KiB
Plaintext
PAGE
|
|
SBTTL "--- WARMSTART ROUTINE ---"
|
|
|
|
; ---------
|
|
; WARMSTART
|
|
; ---------
|
|
|
|
WARM: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
|
|
LDX #ZSTART
|
|
CLRZ: STA 0,X
|
|
INX
|
|
; CPX #ZEND ; NOT NEEDED FOR ATARI
|
|
BNE CLRZ
|
|
|
|
; CLEAR THE MEMORY, LRU & SWAPPING MAPS
|
|
|
|
TAX ; = 0
|
|
CLRT: STA MEMMAP,X
|
|
STA PAGMAP,X
|
|
INX
|
|
BNE CLRT
|
|
|
|
INC GSP ; INIT G-STACK POINTERS
|
|
INC OLDGSP ; TO 1
|
|
INC STAMP ; 1ST TIMESTAMP IS 1
|
|
|
|
LDA #40 ; SET DEFAULT CLIPPING PARAMETERS
|
|
STA WINDX2
|
|
STA WINDW ; DEFAULT WINDOW WIDTH
|
|
LDA #24
|
|
STA WINDY2
|
|
STA WINDH ; DEFAULT WINDOW HEIGHT
|
|
|
|
; FETCH 1ST BLOCK OF G-PRELOAD
|
|
|
|
LDA #HIGH GBEGIN
|
|
STA GCODE ; 1ST PAGE OF G-PRELOAD
|
|
STA DBUFF+HI ; LSB OF [DBUFF] IS ALWAYS ZERO
|
|
DEC ISTART ; (= $FF) FORCE LOAD FROM G-FILE
|
|
JSR GETDSK ; GRAB G-BLOCK #0 (G-PRELOAD HEADER)
|
|
|
|
; EXTRACT DATA FROM G-PRELOAD HEADER
|
|
|
|
LDX GBEGIN+GEND ; END OF PRELOAD (MSB)
|
|
INX ; MAKE IT AT LEAST 1
|
|
STX GPURE ; 1ST VIRTUAL PAGE OF "PURE" G-CODE
|
|
|
|
TXA
|
|
|
|
;***
|
|
ASL A ; * 2 FOR 512 BYTE PAGES
|
|
BCS NOGRAM ; IT WOULD BE BAD IF CARRY WERE SET
|
|
;***
|
|
|
|
; CLC
|
|
|
|
ADC GCODE ; ABSOLUTE END OF G-PRELOAD
|
|
STA ICODE+HI ; IS ABSOLUTE START OF I-PRELOAD
|
|
|
|
LDA #INTRP ; SET INTERPRETER VERSION
|
|
STA GBEGIN+IVERS ; FOR GAME
|
|
|
|
JSR MEMTOP ; GET TOP FREE PAGE INTO [A]
|
|
CMP ICODE+HI ; ENOUGH ROOM FOR G-PRELOAD?
|
|
BEQ NOGRAM
|
|
BCS GETLEN ; ONLY IF [MEMTOP] >= [ICODE]
|
|
|
|
; *** ERROR #0: GAME PRELOAD TOO BIG ***
|
|
|
|
NOGRAM: LDA #0
|
|
JMP GERROR
|
|
|
|
; CALC VIRTUAL ADDRESS OF I-FILE
|
|
|
|
GETLEN: LDX GBEGIN+GLEN ; MSB OF G-CODE LENGTH
|
|
INX
|
|
STX ISTART ; 1ST VIRTUAL PAGE OF I-FILE
|
|
|
|
; FETCH THE REST OF THE G-PRELOAD
|
|
|
|
GPGET: LDA DBLOCK
|
|
CMP GPURE
|
|
BCS IHEAD
|
|
JSR GETDSK
|
|
JMP GPGET
|
|
|
|
; NOW GET THE I-FILE HEADER
|
|
|
|
IHEAD: LDA ISTART ; POINT TO 1ST BLOCK
|
|
STA DBLOCK ; OF IMAGE FILE
|
|
LDA ICODE+HI ; TELL GROS
|
|
STA DBUFF+HI ; WHERE TO PUT IT
|
|
JSR GETDSK ; AND GET IT!
|
|
|
|
; EXTRACT DATA FROM I-FILE HEADER
|
|
|
|
LDY #IEND ; "END OF I-PRELOAD" POINTER (MSB)
|
|
LDA (ICODE),Y
|
|
TAX ; COPY IT HERE
|
|
INX ; POINT TO NEXT PAGE
|
|
|
|
TXA
|
|
CLC
|
|
ADC ISTART ; ADD 1ST V-PAGE OF I-FILE
|
|
STA IPURE ; TO GET V-PAGE OF "PURE" I-CODE
|
|
|
|
TXA
|
|
|
|
;***
|
|
ASL A ; * 2 FOR 512 BYTE PAGES
|
|
BCS ITOBIG ; AGAIN IT WOULD BE BAD IF CARRY WERE SET
|
|
;***
|
|
|
|
; CLC
|
|
|
|
ADC ICODE+HI ; ADD BASE ADDR OF I-PRELOAD
|
|
STA PAGE0 ; TO GET BASE PAGE OF SWAPPING SPACE
|
|
|
|
JSR MEMTOP ; GET TOP FREE PAGE INTO [A] AGAIN
|
|
SEC
|
|
SBC PAGE0 ; CALC # PAGES IN SWAPPING SPACE
|
|
CMP #16 ; MUST HAVE AT LEAST 2K
|
|
BCS ENOUGH ; OF SWAPPING SPACE
|
|
|
|
; *** ERROR #1: IMAGE PRELOAD TOO BIG ***
|
|
|
|
ITOBIG: LDA #1
|
|
JMP GERROR
|
|
|
|
ENOUGH: TAX ; CHECK SIZE OF PAGING SPACE
|
|
BPL NOUGH ; MUST BE NO LARGER
|
|
LDA #$7E ; THAN 32K!
|
|
|
|
;***
|
|
NOUGH: LSR A ; DIVIDE !RAM! PAGES/2 TO GET #/BUFFERS
|
|
|
|
****
|
|
|
|
STA PMAX ; ESTABLISH # SWAPPING PAGES
|
|
|
|
; GRAB THE REST OF THE I-PRELOAD
|
|
|
|
GETIP: LDA DBLOCK
|
|
CMP IPURE
|
|
BCS GCALC
|
|
JSR GETDSK
|
|
JMP GETIP
|
|
|
|
; CALC ADDRESS OF GLOBAL VARIABLE TABLE
|
|
|
|
;GCALC: LDA GBEGIN+GGLOB ; MSB OF GLOBAL VARS
|
|
; CLC
|
|
; ADC GCODE ; MAKE IT ABSOLUTE
|
|
; STA GLOBAL+HI
|
|
; LDA GBEGIN+GGLOB+1 ; LSB NEEDN'T CHANGE
|
|
; STA GLOBAL+LO
|
|
|
|
;***
|
|
|
|
;-----------------------------------------------------------
|
|
; [GGLOB] IS A VIRTUAL WORD POINTER TO THE GLOBAL TABLE
|
|
; MAKE [GLOBAL] A !RAM! ABSOLUTE POINTER TO THE GLOBAL TABLE
|
|
;
|
|
; WE MULTIPLY [GGLOB]*2 TO MAKE IT A BYTE POINTER AND ADD
|
|
; TO THE BEGINING ADDRESS OF PRELOAD.
|
|
;------------------------------------------------------------
|
|
GCALC: LDA GBEGIN+GGLOB+1 ; MAKE IT A BYTE POINTER WITH A * 2
|
|
ASL A
|
|
STA GLOBAL+LO
|
|
LDA GBEGIN+GGLOB
|
|
ROL A
|
|
CLC ; I THINK THE CARRY WOULD BE CLEAR ANYWAY
|
|
ADC GCODE
|
|
STA GLOBAL+HI
|
|
;***
|
|
|
|
|
|
; G-VAR #16 = # BLOCKSETS IN I-FILE
|
|
|
|
LDY #IBLKS ; GET # BLOCKSETS IN I-FILE
|
|
LDA (ICODE),Y
|
|
STA NBLOKS ; SAVE HERE
|
|
|
|
STA VALUE+LO ; MSB IS ALREADY CLEARED
|
|
LDA #16
|
|
JSR PUTVLG
|
|
|
|
; G-VAR #18 = # ICONS IN I-FILE
|
|
|
|
LDY #IICONS ; GET # ICONS IN I-FILE
|
|
LDA (ICODE),Y ; FROM THE I-FILE HEADER
|
|
STA NICONS ; SAVE HERE
|
|
|
|
STA VALUE+LO ; MSB ALREADY CLEARED
|
|
LDA #18
|
|
JSR PUTVLG
|
|
|
|
; [BTAB] = ABSOLUTE BLOCKSET TABLE ADDR
|
|
|
|
LDA ICODE+HI ; BLOCKSET TABLE BEGINS
|
|
STA BTAB+HI ; 8 BYTES AFTER THE START
|
|
LDA #8 ; OF THE I-FILE
|
|
STA BTAB+LO
|
|
|
|
; G-VAR #17 = V-WORD OF BLOCKSET TABLE
|
|
;***
|
|
LSR A ; /2 FOR 4-WORD OFFSET
|
|
;***
|
|
|
|
STA VALUE+LO ; SAME 8-BYTE OFFSET AS [BTAB]
|
|
LDA ISTART ; 1ST VIRTUAL PAGE # OF I-FILE
|
|
STA VALUE+HI
|
|
LDA #17
|
|
JSR PUTVLG
|
|
|
|
; G-VAR #19 = VIRTUAL WORD ADDRESS OF ICON TABLE
|
|
|
|
LDA NBLOKS ; GET # BLOCKS IN I-FILE
|
|
|
|
; ASL A ; WORD-ALIGN IT
|
|
; ROL MTEMP+HI ; TO GET SIZE OF BLOCKSET TABLE
|
|
; STA MTEMP+LO ; SAVE LSB OF SIZE
|
|
|
|
CLC ; ADD THE V-WORD ADDR OF THE B-TABLE
|
|
ADC VALUE+LO ; TO GET V-WORD ADDR OF I-TABLE
|
|
STA VALUE+LO ; INTO [VALUE]
|
|
|
|
; LDA MTEMP+HI
|
|
;***
|
|
LDA #00
|
|
;***
|
|
|
|
ADC VALUE+HI
|
|
STA VALUE+HI
|
|
|
|
LDA #19
|
|
JSR PUTVLG
|
|
|
|
; PREPARE FOR TABLE PATCHING
|
|
|
|
;***
|
|
LDA NBLOKS ; * 2 FOR LENGTH IN BYTES INSTED OF WORDS
|
|
ASL A
|
|
STA MTEMP+LO
|
|
ROL MTEMP+HI
|
|
;***
|
|
|
|
|
|
LDA BTAB+LO ; MAKE [I] POINT TO
|
|
STA I+LO ; START OF B-TABLE
|
|
CLC ; WHILE WE'RE AT IT,
|
|
ADC MTEMP+LO ; ADD SIZE OF B-TABLE
|
|
STA ITAB+LO ; TO GET ABS START ADDR OF I-TABLE
|
|
STA J+LO ; INTO [ITAB] AND [J]
|
|
|
|
LDA BTAB+HI ; DON'T FORGET MSBS!
|
|
STA I+HI
|
|
ADC MTEMP+HI
|
|
STA ITAB+HI
|
|
STA J+HI
|
|
|
|
; PATCH THE BLOCKSET TABLE
|
|
;***
|
|
;SHOULD WORK AS IS
|
|
;***
|
|
|
|
LDA NBLOKS ; GET # BLOCKSETS
|
|
STA QSIGN ; SAVE HERE FOR INDEXING
|
|
LDY #0 ; [I] HAS START OF B-TABLE
|
|
PATB: LDA (I),Y ; GET MSB OF A B-POINTER
|
|
CLC
|
|
ADC ISTART ; ADD ITS VIRTUAL OFFSET
|
|
STA (I),Y
|
|
|
|
INY ; NO NEED TO TOUCH LSB
|
|
INY ; SO SKIP OVER IT
|
|
BNE PATB1 ; CONTINUE UNTIL PAGE BOUNDARY HIT
|
|
INC I+HI ; IF HIT, POINT TO NEXT PAGE
|
|
|
|
PATB1: DEC QSIGN ; DECREMENT # BLOCKSETS
|
|
BNE PATB ; KEEP PATCHING TILL NONE LEFT
|
|
|
|
; PATCH THE ICON TABLE
|
|
|
|
LDA NICONS ; GET # ICONS
|
|
STA QSIGN ; FOR INDEXING
|
|
LDY #0 ; [J] HAS START OF I-TABLE
|
|
PATI: LDA (J),Y ; GET MSB OF I-POINTER
|
|
CLC
|
|
ADC ISTART ; ADD ITS VIRTUAL OFFSET
|
|
STA (J),Y
|
|
|
|
INY ; SKIP OVER LSB
|
|
INY
|
|
BNE PATI1
|
|
INC J+HI
|
|
|
|
PATI1: DEC QSIGN ; DECREMENT # ICONS
|
|
BNE PATI ; KEEP PATCHING TILL NONE LEFT
|
|
|
|
; INIT THE VIRTUAL MEMORY MAP
|
|
|
|
LDX #0 ; 1ST VIRTUAL PAGE
|
|
LDY GCODE ; 1ST ABSOLUTE PAGE OF G-PRELOAD
|
|
MINIT0: TYA
|
|
STA MEMMAP,X
|
|
INY ; NEXT ABSOLUTE PAGE
|
|
;***
|
|
INY ; SKIP 2 RAM PAGES FOR EVERY VIRTUAL PAGE
|
|
;***
|
|
INX ; NEXT VIRTUAL PAGE
|
|
CPX GPURE ; END OF PRELOAD?
|
|
BCC MINIT0 ; NO, KEEP FILLING
|
|
|
|
LDX ISTART ; 1ST VIRTUAL PAGE OF I-CODE
|
|
LDY ICODE+HI ; 1ST ABSOLUTE PAGE OF I-PRELOAD
|
|
MINIT1: TYA
|
|
STA MEMMAP,X
|
|
INY ; NEXT ABSOLUTE PAGE
|
|
;***
|
|
INY ; SKIP 2 RAM FOR EVERY 1 VIRTUAL
|
|
;***
|
|
INX ; NEXT VIRTUAL PAGE
|
|
CPX IPURE ; END OF I-PRELOAD?
|
|
BCC MINIT1
|
|
|
|
; ESTABLISH START ADDRESS OF G-PROGRAM
|
|
|
|
LDA GBEGIN+GSTART ; MSB
|
|
STA GPCH
|
|
LDA GBEGIN+GSTART+1 ; LSB
|
|
STA GPCL
|
|
|
|
;***
|
|
LDA #$01 ; START OF GAME IS ALWAYS ON THE ODD BYTE
|
|
STA GPC0 ; OF THE [GSTART] WORD
|
|
LDA #$00
|
|
STA GPCFLG
|
|
;***
|
|
|
|
; FALL THROUGH TO MAIN LOOP ...
|
|
|
|
END
|
|
|