mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-08 17:21:26 +00:00
212 lines
6.6 KiB
Plaintext
212 lines
6.6 KiB
Plaintext
SUBTTL ZIPBEGIN
|
|
PAGE
|
|
|
|
PUBLIC ZIPBGN,STR5$,STR8$,STR11$,STR11,STR11A,NOITAL
|
|
PUBLIC STR12$,STR12A
|
|
PUBLIC STR12B,STR13$,STR14$,STR15$,STR17$
|
|
ZIPBGN PROC
|
|
CALL SYSINI ;DO ANY SYSTEM INITIALIZATION
|
|
STR5$: SUB AX,AX ;BLOCK 0
|
|
SUB BX,BX ;PUT AT BEGINNING OF GAME SEGMENT
|
|
CALL GETBLK ;GET THE BLOCK
|
|
MOV GAMEIN,1 ; (7q) INDICATE RELIABILITY OF SCRIPT BIT
|
|
CMP BYTE PTR ES:[PVERS1],ZMVERS ;PROPER Z-MACHINE VERSION?
|
|
JNE STR8$ ;NO
|
|
TEST BYTE PTR ES:[PVERS2],1 ;YES,PROPER MODE BITS?
|
|
JE STR11$ ;YES
|
|
STR8$: FATAL FTL4 ;SOMETHING WRONG, DIE
|
|
|
|
; IF THE SCREEN OPS OF THE MODE BYTE ([PVERS2]) ARE ENABLED,
|
|
; SCROLL = 0.
|
|
STR11$:
|
|
TEST SCROLL,1 ; (7) CAN WE SPLIT THE SCREEN
|
|
JNZ STR11A ; (7) GUESS NOT...
|
|
|
|
MOV AL,BYTE PTR ES:[PVERS2]
|
|
OR AL,3FH ; (A0) TURN ON ALL OPTIONS
|
|
CMP COLFLG,1 ; (A6) TURN OFF ITALIC IF COLOR
|
|
JE NOITAL ; (A9) .....IT'S COLOR
|
|
|
|
; IT'S NOT COLOR
|
|
; IF THIS IS NOT AN IBM, ELIMINATE ITALICS
|
|
CMP IBMPC,1 ; (A9) IS THIS AN IBM PC?
|
|
JE STR11 ; (A9) ....YES
|
|
NOITAL: AND AL,37H ;(A6)TURN OFF THE ITALIC BIT IN THE MODE BYTE
|
|
STR11: MOV BYTE PTR ES:[PVERS2],AL ;(7) SAVE IT
|
|
STR11A: MOV BYTE PTR ES:[PINTVR],IBM_ID ; (A0) OTHER THAN THE 20
|
|
MOV BYTE PTR ES:[PINTID],ZVERSN ; (A0) SET VERSION LET
|
|
MOV AL,SLPP
|
|
MOV BYTE PTR ES:[PSCLIN],AL
|
|
MOV AL,SCPL
|
|
MOV BYTE PTR ES:[PSCCOL],AL
|
|
GTAWRD A,[PZRKID] ;UNIQUE GAME & VERSION INDENTIFIER
|
|
MOV ZORKID,AX
|
|
GTAWRD A,[PENDLD] ;GET ENDLOD POINTER
|
|
TEST AX,1FFH ;ROUND UP TO NEXT BLOCK
|
|
JE STR12$
|
|
AND AX,0FE00H
|
|
ADD AX,200H
|
|
STR12$: MOV CX,AX
|
|
MOV BP,CX ;EXTRACT ENDLOD BLOCK
|
|
MOV CL,9
|
|
SHR BP,CL
|
|
MOV CX,BP
|
|
MOV ENDLOD,CX ;SAVE ENDLOD BLOCK NUMBER
|
|
MOV AX,128 ;(6) FIGURE BOUNDRY FOR SEG1
|
|
SUB AX,CX ;(6) SUBTRACT AMOUNT IN PRELOD
|
|
PUSH CX
|
|
MOV CX,TBLSHF ; (A0) MULTIPLY END OF SEG BY TABLE WIDTH
|
|
SHL AX,CL ; (A0) DO IT
|
|
POP CX ; (A0) RESTORE THIS VALUE
|
|
MOV SEGEND,AX ;(6) USED TO COMPARE TO PAGTAB TO LOCATE
|
|
;(6) SEGMENT IN WHICH GAMEBLOCK RESIDES
|
|
DEC CX ;NUMBER OF BLOCKS LEFT TO LOAD
|
|
CMP FITS,1 ;(6) READ THE WHOLE GAME IN
|
|
JNE STR12A ;(6) NO, DON'T READ IT ALL IN
|
|
|
|
MOV AX,1 ; (A0) START WITH BLOCK 1
|
|
MOV LPTAB,1 ; (A0) BUFFER 1
|
|
MOV CX,63 ; (A0) LESS FIRST BLOCK
|
|
CALL GTBLKS ; (A0) GET THIS SECTION
|
|
JNE DONERD ; (A0) THIS WILL HAPPEN ON ZIPTEST
|
|
MOV AX,64 ; (A0) WE HAVE READ 0 TO 63
|
|
MOV LPTAB,64 ; (A0) UPDATE THIS TOO
|
|
|
|
READLP: MOV CX,64 ; (A0) READ IN 32K READS
|
|
READLP1:PUSH AX ; (A0) SAVE BLOCK NUMBER
|
|
CALL GTBLKS ; (A0) READ IT IN
|
|
POP AX ; (A0) AND RESTORE BLOCK NUMBER
|
|
JNE DONERD ; (A0) READ UNTIL READ FAILS
|
|
ADD LPTAB,64 ; (A0) BUMP BUFFER VAR
|
|
ADD AX,64 ; (A0) INC THIS
|
|
JMP READLP
|
|
DONERD: MOV LPTAB,0
|
|
JMP STR12B
|
|
STR12A: MOV AX,1 ;STARTING WITH BLOCK 1
|
|
MOV BX,OFFSET PAGTAB ; (6) GET A BUFFER ADDRESS
|
|
ADD BX,TABWID ; (A0) MOVE TO SECOND ENTRY
|
|
MOV LPTAB,BX ; (6) SAVE THIS CALCULATED ADDR
|
|
CALL GTBLKS ;GET THE BLOCKS
|
|
STR12B: GTAWRD A,[PVOCTB] ;VOCAB LOCATION
|
|
MOV VOCTAB,AX ;SAVE VOCABULARY TABLE POINTER
|
|
GTAWRD A,[POBJTB] ;GET OBJECT TABLE POINTER
|
|
MOV OBJTAB,AX
|
|
GTAWRD A,[PGLOTB] ;GET GLOBAL TABLE POINTER
|
|
MOV GLOTAB,AX
|
|
GTAWRD A,[PWRDTB] ;GET WORD TABLE POINTER
|
|
MOV WRDTAB,AX
|
|
GTAWRD A,[PPURBT] ;GET PURE CODE POINTER
|
|
TEST AX,1FFH ;ROUND UP TO NEXT BLOCK
|
|
JE STR13$
|
|
ADD AX,200H
|
|
STR13$: MOV CL,9 ;EXTRACT BLOCK NUMBER
|
|
SAR AX,CL
|
|
AND AX,7FH ;CLEAR UNWANTED BITS
|
|
MOV PURBOT,AX ;SAVE IT
|
|
MOV BX,OFFSET RBRKS ;START OF READ BREAK CHARACTER TABLE
|
|
MOV SI,VOCTAB ;VOCAB TABLE POINTER
|
|
MOV CL,BYTE PTR ES:[SI] ;1ST BYTE IN VOCTAB IS # OF SIBREAKS
|
|
SUB CH,CH ;CLEAR HIGH BYTE
|
|
INC SI
|
|
STR14$: MOVM [BX],ES:[SI],AL ;TRANSFER THEM
|
|
INC BX
|
|
INC SI
|
|
LOOP STR14$
|
|
MOV ESIBKS,BX ;REMEMBER END OF SI BREAKS
|
|
MOV BP,OFFSET IRBRKS;ALWAYS END WITH INITIAL BREAK CHARACTERS
|
|
STR15$: MOVM [BX],[BP],AL ;(6)TRANSFER THEM
|
|
INC BX
|
|
INC BP
|
|
CMP AL,0
|
|
JNE STR15$
|
|
MOV AL,ES:[SI] ;GET VOCABULARY ENTRY LENGTH
|
|
SUB AH,AH
|
|
MOV VWLEN,AX ;AND STORE IT AWAY
|
|
INC SI
|
|
GTAWRD A,[SI] ;GET NEXT WORD IN TABLE
|
|
MOV VWORDS,AX ;NUMBER OF WORD ENTRIES IN VOCABULARY
|
|
ADD SI,2 ;MOVE TO NEXT WORD
|
|
MOV VOCBEG,SI ;BEGINNING OF ACTUAL VOCABULARY
|
|
|
|
MOV SI,ENDLOD ;GET # PAGES IN ENDLOD
|
|
MOV CL,9
|
|
SHL SI,CL ;THIS IS FIRST LOCATION (ES:) OF PAGING
|
|
MOV PAGES,SI ;SAVE THIS TO USE AS AN OFFSET
|
|
|
|
STR17$: JMP START1
|
|
ZIPBGN ENDP
|
|
|
|
;RESTART EXECUTION HERE
|
|
PUBLIC RESTRT,RESTRT1,START1
|
|
PUBLIC RESTR1,RESTR2,RESTR3
|
|
RESTRT PROC
|
|
CALL GAMOPEN ; (7q) OPEN THE GAME FILE
|
|
MOV MORLIN,0 ; (7s) RESET MORE COUNT
|
|
SUB AX,AX ;REREAD ALL OF THE IMPURE STUFF
|
|
MOV CURSEG,0 ; (K5) SET SEG FLAGS BACK TO SEG0
|
|
MOV ZPCSEG,0
|
|
MOV LPTAB,0 ; (6) FILL THE FIRST BIT OF STUFF
|
|
PUSH PAGES ; (6) SAVE THIS VARIABLE
|
|
MOV PAGES,0 ; (6) RESET IT FOR SMALL MEMORY READ
|
|
MOV CX,PURBOT
|
|
CALL GTBLKS
|
|
POP PAGES ; RESET IT AGAIN
|
|
|
|
MOV AH,SCRFLG ; (7o) WERE WE SCRIPTING?
|
|
XOR AL,AL ; (7o) ZERO THIS
|
|
MOV WORD PTR ES:[PFLAGS],AX ; (7o) RESTORE SCRIPTING STATE
|
|
|
|
MOV AL,BYTE PTR ES:[PVERS2]
|
|
OR AL,3FH ; (A0) TURN ON ALL OPTIONS
|
|
|
|
; IF THE SCREEN OPS OF THE MODE BYTE ([PVERS2]) ARE ENABLED,
|
|
; SCROLL = 0.
|
|
RESTR1: TEST SCROLL,1 ; (7) CAN WE SPLIT THE SCREEN
|
|
JNZ RESTR2 ; (7) GUESS NOT...
|
|
|
|
MOV AL,BYTE PTR ES:[PVERS2]
|
|
OR AL,3FH ; (A9) TURN ON ALL OPTIONS
|
|
CMP COLFLG,1 ; (A9) TURN OFF ITALIC IF COLOR
|
|
JZ RESTR2 ; (A9) .....IT'S COLOR
|
|
|
|
; IT'S NOT COLOR
|
|
; IF THIS IS NOT AN IBM, ELIMINATE ITALICS
|
|
CMP IBMPC,1 ; (A9) IS THIS AN IBM PC?
|
|
JE RESTR3 ; (A9) ....YES
|
|
RESTR2: AND AL,37H ; (A9) TURN OFF ITALIC BIT IN THE MODE BYTE
|
|
RESTR3: MOV BYTE PTR ES:[PVERS2],AL ;(7) SAVE IT
|
|
MOV BYTE PTR ES:[PINTVR],IBM_ID ; (A0) OTHER THAN THE 20
|
|
MOV BYTE PTR ES:[PINTID],ZVERSN ; (A0) SET VERSION LET
|
|
MOV AL,SLPP
|
|
MOV BYTE PTR ES:[PSCLIN],AL
|
|
MOV AL,SCPL
|
|
MOV BYTE PTR ES:[PSCCOL],AL
|
|
OR BYTE PTR ES:[PVERS2],SCRBIT ; (7) TURN ON SPLIT
|
|
MOV TOPLIN,0 ; (7) FIX SCREEN VARIABLES ON RESTART
|
|
MOV SCRNFLG,0 ; (7) WHOLE SCREEN, ONLY 1
|
|
MOV SPLTFLG,0 ; (7) NO SPLIT SCREEN
|
|
JMP RESTRT1 ; PATCH TO FIX STATUS LINE BUG (5)/PHG
|
|
START1:
|
|
|
|
; MOV AL,BYTE PTR ES:[PVERS2]
|
|
; ADD AL,8 ;TANDY BIT
|
|
; MOV BYTE PTR ES:[PVERS2],AL
|
|
|
|
CALL TSETUP ;SETUP TERMINAL/STATUS LINE
|
|
RESTRT1:MOV CHRCNT,79 ;(A13) INIT OUTPUT BUFFER COUNTER
|
|
CALL MTIME ;(A0) INITIALIZE RANDOM SEEDS
|
|
; (LD1) MOV RNDFLG,0 ;(A0) SELECT NORMAL RANDOM NUMBER GENERATION
|
|
CALL CLRSCR ;CLEAR THE REMAINDER OF SCREEN
|
|
MOV SP,OFFSET STK_TOP ;INITIALIZE OUR STACK POINTER
|
|
MOV DI,OFFSET ZSTK_TP ;INITIALIZE USER STACK POINTER
|
|
MOV CHRPTR,OFFSET OUTBUF ;INITIALIZE OUTPUT CHARACTER POINTER
|
|
MOV ZLOCS,DI ;LOCALS WOULD START AT FIRST SLOT,
|
|
SUB ZLOCS,2 ;IF THERE WERE ANY
|
|
GTAWRD A,[PSTART] ;GET STARTING LOCATION
|
|
CALL BSPLTB ;SPLIT BLOCK & BYTE POINTERS
|
|
MOV ZPC1,AX ;INITIALIZE ZPC BLOCK-POINTER
|
|
MOV ZPC2,BX ;INITIALIZE ZPC BYTE-POINTER
|
|
CALL NEWZPC ;GET PAGE TO EXECUTE
|
|
JMP NXTINS
|
|
RESTRT ENDP
|