Files
erkyrath.infocom-zcode-terps/apple/xzip/warm.asm
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

203 lines
4.3 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
PAGE
STTL "--- WARMSTART ROUTINE ---"
; ---------------
; WARMSTART ENTRY
; ---------------
WARM: LDA DCBPSL ;SAVE STORY DRIVE AND SLOT
LDX DCBPDR ;IN CASE CHANGED BY "SAVE"
STA STRYSL
STX STRYDR
JSR CLS
; -------------
; ZIP WARMSTART
; -------------
WARM1: LDA #10 ;CENTER DISPLAY
STA CVT
LDA #27
STA CHZ
STA EHZ
JSR BASCAL
LDA #>STRYM ;DISP. "THE STORY IS LOADING..."
LDX #<STRYM
LDY #STRYML
JSR DLINE
LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
LDX #ZEROPG
WL0: STA 0,X
INX
BNE WL0
INC ZSP+LO ; INIT Z-STACK POINTERS
INC OLDZSP+LO ; TO "1"
INC SCRIPT ; ENABLE SCRIPTING
INC SCREENF ; TURN DISPLAY ON
INC SIDEFLG ;SET SIDE 1
; GRAB THE FIRST BLOCK OF PRELOAD
LDA #>ZBEGIN ; MSB OF PRELOAD START ADDRESS
STA ZCODE ; FREEZE IT HERE
STA DBUFF+HI ; LSB IS ALWAYS ZERO
LDA #MAIN
STA DSKBNK ;SET TO MAIN BANK
LDA #1 ; Set ZPURE to 100 to fake
STA ZPURE+HI ; GETDSK out this first time through
JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0
; EXTRACT GAME DATA FROM Z-CODE HEADER
LDA ZBEGIN+ZVERS ; (EZIP) IS GAME AN EZIP?
CMP #5 ; (X)
BEQ YESEZ ; YES, CONTINUE
; *** ERROR #15 -- NOT AN EZIP GAME ***
LDA #15
JMP ZERROR
; *** ERROR #0 -- INSUFFICIENT RAM ***
NORAM: LDA #5
STA CVT
JSR BASCAL
LDA #0
JMP ZERROR
YESEZ: LDA ZBEGIN+ZPURBT ; CHECK PURBOT POINTER
CMP #$AD ; MAXIMUM IMPURE IS $AD00 (43K)
BCC YZ3 ; OKAY, CONTINUE
LDA #13
JMP ZERROR ; ELSE ERROR #13 (IMPURE TOO BIG)
YZ3:
LDA #3 ; ELSE USE ONLY 3
STA NUMSAV ; REMEMBER MAXIMUM # SAVES PER DISK
CLC
ADC #'0' ; CONVERT TO ASCII
STA SAVASC ; SAVE IN STRING
LDA ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER
STA ZPURE+HI ; GOT TO FIGURE OUT FIRST PAGE
LDA ZBEGIN+ZENDLD+1 ; of data on side 2
STA ZPURE+LO ; ok?
LSR ZPURE+HI ; SO WE NEED TO /64 TO GET IT
ROR ZPURE+LO ; SO DO 6 SHITS
LSR ZPURE+HI
ROR ZPURE+LO
LSR ZPURE+HI
ROR ZPURE+LO
LSR ZPURE+HI
ROR ZPURE+LO
LSR ZPURE+HI
ROR ZPURE+LO
LSR ZPURE+HI ; NOW IT CONTAINS FIRST PAGE ON
ROR ZPURE+LO ; SIDE 2 OF THE DISK
LDA ZBEGIN+ZMODE ; ENABLE SOUND & MONOSPACING (X)
ORA #%00110000 ; (X)
STA ZBEGIN+ZMODE
LDA #XZIPID ; SET INTERPRETER ID
LDX SIG ; SET WHETHER IIe OR IIc
BNE SETID
LDA #IIcID
SETID:
STA ZBEGIN+ZINTWD
LDA #VERSID
STA ZBEGIN+ZINTWD+1
LDA #0 ; CLEAR HIGH BYTE
STA ZBEGIN+ZHWRD
STA ZBEGIN+ZVWRD
LDA #80 ; SET SCREEN PARAMETERS
STA ZBEGIN+ZHWRD+1
LDA #$18
STA ZBEGIN+ZVWRD+1
LDA #1 ; EACH "PIXEL" IS 1X1
STA ZBEGIN+ZFWRD
STA ZBEGIN+ZFWRD+1
LDA #$18 ; AND SCREEN PARAMETERS
STA ZBEGIN+ZSCRWD
LDA #80
STA ZBEGIN+ZSCRWD+1
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+ZOBJEC ; NOT TO MENTION
CLC ; THE OBJECT TABLE
ADC ZCODE
STA OBJTAB+HI
LDA ZBEGIN+ZOBJEC+1 ; LSB SAME
STA OBJTAB+LO
LDA ZBEGIN+ZTCHAR ; DO SAME FOR TCHARS TABLE
ORA ZBEGIN+ZTCHAR+1 ; is it zero though?
BEQ INICLL
LDA ZBEGIN+ZTCHAR ; DO SAME FOR TCHARS TABLE
CLC
ADC ZCODE
STA TCHARS+HI
LDA ZBEGIN+ZTCHAR+1 ; NO CHANGE FOR LSB
STA TCHARS+LO
INICLL:
JSR INITPAG
;
; after loading everything check tchars table!
;
LDA TCHARS+HI
ORA TCHARS+LO
BEQ TCHj ; don't check of tchars==0
LDY #$FF ; CHECK IF $FF IS IN TCHARS TBL
TCHLP: INY
LDA (TCHARS),Y
BEQ TCHj ; NULL TERMINATED STRING
CMP #$FF
BNE TCHLP
LDA #1
STA ALLFLG ; YES, SET ALL FCN KEYS (>127) TO TERMINATORS
TCHj:
JSR CLS ; GET RID OF "LOADING" MSG
LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE
STA ZPCM ; MSB
LDA ZBEGIN+ZGO+1 ; AND LSB
STA ZPCL ; >BIT ALREADY ZEROED
JSR VLDZPC ; MACKE ZPC VALID
LDX #80 ; SET XSIZE TO 1 LESS
DEX
STX XSIZE
STX OLDWD ; JIC
LDA PSTAT ; CHECK IF RESTART & WERE PRINTING
BPL EX2 ; NO
LDA #1 ; YES
STA PSTAT ; RESET PSTAT FOR NEXT TIME
STA SCRIPTF ; TURN SCRIPT FLAG ON
ORA ZBEGIN+ZSCRIP+1 ; SET GAME FLAG ALSO
STA ZBEGIN+ZSCRIP+1
EX2: JSR CLS ; CLEAR SCREEN ...
; ... AND FALL INTO MAIN LOOP
END