2023-11-16 18:19:54 -05:00

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