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