mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-10 02:00:22 +00:00
203 lines
4.3 KiB
NASM
203 lines
4.3 KiB
NASM
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
|
||
|