Files
erkyrath.infocom-zcode-terps/ibm/zipbegin.ezp
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

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