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

146 lines
2.9 KiB
Plaintext

PAGE
SBTTL "--- WARMSTART ROUTINE ---"
SETDP 0
ORG ZIP ; START OF EXECUTABLE CODE
CLRA ; USE PAGE ZERO
TFR A,DP ; AS THE DIRECT PAGE
IRQVEC EQU $10C
LDX #DIRQSV ;SET VECTOR
STX IRQVEC+1
LDA #$7E ;JMP OP
STA IRQVEC
; ORCC #%01010000 ; DISABLE INTERRUPTS
; LDA INT60 ; DISABLE
; ANDA #%11111110 ; THE 60HZ
STA INT60 ; INTERRUPT
STA ROMOFF ; AND THE ROMS
LDS #MSTACK ; GIVE THE STACK A NEW HOME
JMP COLD ; PERFORM ONE-TIME INITIALIZATION
; WARMSTART ENTRY
START: LDS #MSTACK ; RESET MACHINE STACK
; TEST TO SEE IF ZIP IS ALL LOADED
LDX #3
TSTEND: LDA ENDTST-1,X
CMPA ENDCMP-1,X
BNE ENDERR
LEAX -1,X
BNE TSTEND
BRA ENDOK
ENDERR: LDA #16
JMP ZERROR;
ENDCMP: DB "END"
; CLEAR ALL DIRECT-PAGE VARIABLES
ENDOK: LDX #DSTART
ST0: CLR ,X+
CMPX #ZPGTOP
BLO ST0
INC STAMP ; INIT TIMESTAMP TO 1 (BM 11/24/84)
; RESET THE PAGING TABLE
LDX #PTABLE
LDA #$FF
ST1A: STA ,X+
CMPX #PTABLE+$140
BLO ST1A
; CLEAR THE TIMESTAMP MAP (BM 11/24/84)
LDX #LRUMAP
ST1B: CLR ,X+
CMPX #LRUMAP+$A0
BLO ST1B
; GET THE FIRST SECTOR OF Z-CODE
LDD #ZCODE ; POINT TO 1ST
STD DBUFF ; Z-CODE LOCATION
JSR GETDSK ; FETCH BLOCK #0 FROM DRIVE 0
; EXTRACT GAME DATA FROM Z-CODE HEADER
LDA ZCODE+ZENDLD ; GET MSB OF ENDLOAD POINTER
INCA ; ADD ONE TO GET
STA ZPURE ; 1ST PAGE IN "PURE" CODE
ADDA #HIGH ZCODE ; ADD BASE ADDRESS TO GET
STA PAGE0 ; 1ST PAGE OF SWAPPING SPACE
LDB #MEMTOP ; TOP PAGE OF MEMORY
SUBB PAGE0 ; SUBTRACT ADDRESS OF PAGING BUFFER
BLS NORAM
CMPB #8
BHS SETNP ; MUST HAVE AT LEAST 8 SWAPPING PAGES
; *** ERROR #0 -- INSUFFICIENT RAM ***
NORAM: CLRA
JSR ZERROR
; [B] HAS # FREE SWAPPING PAGES
SETNP: CMPB #$A0 ; MAKE SURE # PAGES
BLO SETA0 ; DOESN'T EXCEED
LDB #$A0 ; $A0 (BM 11/24/84)
SETA0: STB PMAX ; SET MAXIMUM # FREE PAGES
LDX #PTABLE ; ADD BASE ADDR OF P-TABLE
ABX ; TO PAGING LIMIT
ABX ; TWICE (FOR WORD-ALIGNMENT)
STX TABTOP ; TO GET ADDR OF HIGHEST TABLE ENTRY
LDA ZCODE+ZMODE ; GET MODE BYTE
ORA #%00001000 ; SET THE "TANDY" ID BIT
STA ZCODE+ZMODE ; (WE DON'T WANT ANY DIRTY WORDS)
ANDA #%00000010 ; ISOLATE STAT-LINE FORMAT BIT
STA TIMEFL ; 0=SCORE/MOVES, NZ=HOURS/MINUTES
LDD ZCODE+ZBEGIN ; GET START ADDRESS OF Z-CODE
STD ZPCM ; HIGH BITS AT ZPCH ALREADY CLEARED
LDD ZCODE+ZGLOBA ; GET RELATIVE ADDR OF GLOBAL TABLE
ADDD #ZCODE ; CONVERT TO ABSOLUTE ADDRESS
STD GLOBAL
LDD ZCODE+ZFWORD ; DO SAME FOR FWORDS TABLE
ADDD #ZCODE
STD FWORDS
LDD ZCODE+ZVOCAB ; AND VOCABULARY TABLE
ADDD #ZCODE
STD VOCAB
; GRAB THE REST OF THE PRELOAD
LDA ZPURE ; GET # PAGES IN PRELOAD + 1
STA TEMP ; USE AS AN INDEX
LDPRE: JSR GETDSK ; GRAB THE BLOCK
DEC TEMP
BNE LDPRE ; KEEP READING TILL DONE
LDU #TOPSTA ; INIT THE ZSP
STU OZSTAK ; REMEMBER ITS POSITION
JSR CLS ; CLEAR THE SCREEN
COM SCRIPT ; ENABLE SCRIPTING
LDA SFLAG ; SCRIPTING FLAG
STA ZCODE+ZSCRIP+1
; FALL INTO MAIN LOOP
END