mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-10 02:00:22 +00:00
195 lines
7.3 KiB
NASM
195 lines
7.3 KiB
NASM
PAGE
|
|
SBTTL "--- MEMORY ORGANIZATION ---"
|
|
|
|
|
|
TRUE EQU $FF
|
|
FALSE EQU 0
|
|
LO EQU 0
|
|
HI EQU 1
|
|
|
|
; ALL THE VARIOUS BUFFERS NEEDED
|
|
|
|
IOBUFF EQU MSTART ; PAGENG BUFFER
|
|
|
|
ZSTKBL EQU MSTART+$100 ; Z-STACK BOTTOM,LO (1K STACK FOR EZIP)
|
|
ZSTKTL EQU ZSTKBL+$100 ; TOP, LO
|
|
ZSTKBH EQU ZSTKBL+$200 ; BOTTOM, HI
|
|
ZSTKTH EQU ZSTKBL+$300 ; TOP, HI
|
|
|
|
NEXTPNT EQU MSTART+$500 ; PAGING TABLES
|
|
PREVPNT EQU NEXTPNT+$80
|
|
VPAGEH EQU PREVPNT+$80
|
|
VPAGEL EQU VPAGEH+$80
|
|
|
|
LOCALS EQU MSTART+$700 ; LOCAL VARIABLE STORAGE (30 BYTES)
|
|
BUFSAV EQU LOCALS+$20 ; AUXILIARY INPUT BUFFER (80 BYTES)
|
|
|
|
EZIP EQU MSTART+$800
|
|
ZBEGIN EQU EZIP+$2A00 ; START OF PRELOAD
|
|
|
|
|
|
; ---------------------
|
|
; Z-CODE HEADER OFFSETS
|
|
; ---------------------
|
|
|
|
ZVERS EQU 0 ; VERSION BYTE
|
|
ZMODE EQU 1 ; MODE SELECT BYTE
|
|
ZID EQU 2 ; GAME ID WORD
|
|
ZENDLD EQU 4 ; START OF NON-PRELOADED Z-CODE
|
|
ZGO EQU 6 ; EXECUTION ADDRESS
|
|
ZVOCAB EQU 8 ; START OF VOCABULARY TABLE
|
|
ZOBJEC EQU 10 ; START OF OBJECT TABLE
|
|
ZGLOBA EQU 12 ; START OF GLOBAL VARIABLE TABLE
|
|
ZPURBT EQU 14 ; START OF "PURE" Z-CODE
|
|
ZSCRIP EQU 16 ; FLAG WORD
|
|
ZSERIA EQU 18 ; 3-WORD DB II SERIAL NUMBER
|
|
ZFWORD EQU 24 ; START OF FWORDS TABLE
|
|
ZLENTH EQU 26 ; LENGTH OF Z-PROGRAM IN WORDS
|
|
ZCHKSM EQU 28 ; Z-CODE CHECKSUM WORD
|
|
ZINTWD EQU 30 ; INTERPRETER ID WORD (SUPPLIED BY EZIP)
|
|
ZSCRWD EQU 32 ; SCREEN PARAMETER WORD ( " " " )
|
|
|
|
|
|
; THESE ARE THE FLAGS & REGISTERS USED TO ACCESS THE 256K
|
|
; EXPANSION RAM FOR THE C64 IF IT IS ATTACHED
|
|
|
|
XFLAGS EQU $DF00 ; THE PAGE THE FLAGS ARE ON
|
|
XFER EQU 1 ; (BYTE) WRITE TO THIS TO DO TRANSFER
|
|
XBUFF EQU 2 ; (WORD) ADDR OF TRANSFER BUFFER IN MAIN MEMORY
|
|
XRAM EQU 4 ; (WORD) ADDR OF BUFFER IN XPANSION RAM (XRAM)
|
|
XBANK EQU 6 ; (BYTE) WHICH BANK OF XPANSION RAM
|
|
XSIZ EQU 7 ; (WORD) SIZE OF TRANSFER IN BYTES
|
|
XINT EQU 9 ; (BYTE) SET FOR NO INTERRUPTS DURING TRANSFERS
|
|
XINCR EQU 10 ; (BYTE) SET FOR POINTERS TO INCREMENT
|
|
|
|
|
|
SBTTL "--- ZIP Z-PAGE VARIABLES ---"
|
|
|
|
|
|
OPCODE EQU ZEROPG ; (BYTE) CURRENT OPCODE
|
|
VALUE EQU OPCODE+1 ; OPCODE+21 ; (WORD) VALUE RETURN REGISTER
|
|
I EQU VALUE+2 ; (WORD) GEN-PURPOSE REGISTER #1
|
|
J EQU VALUE+4 ; (WORD) GEN-PURPOSE REGISTER #2
|
|
K EQU VALUE+6 ; (WORD) GEN-PURPOSE REGISTER #3
|
|
L EQU VALUE+8 ; (WORD) GEN-PURPOSE REGISTER #4
|
|
ZPC EQU VALUE+10 ;ZSP+4 ; (3 BYTES) ZIP PROGRAM COUNTER
|
|
ZPCL EQU ZPC ; (BYTE) LOW 8 BITS OF [ZPC]
|
|
ZPCM EQU ZPC+1 ; (BYTE) MIDDLE 8 BITS OF [ZPC]
|
|
ZPCH EQU ZPC+2 ; (BYTE) HIGH BIT OF [ZPC]
|
|
ZPCPNT EQU ZPC+3 ; (3 BYTES) ABS POINTER TO CURRENT Z-PAGE
|
|
ZPNTL EQU ZPCPNT ; FIRST 2 BYTES = SAME AS FOR ZIP (EZIP)
|
|
ZPNTH EQU ZPCPNT+1 ; (BYTE)
|
|
ZPCBNK EQU ZPCPNT+2 ; (BYTE) INDICATES AUXILIARY MEMORY
|
|
MPC EQU ZPCPNT+3 ; (3 BYTES) MEMORY PROGRAM COUNTER
|
|
MPCL EQU MPC ; (BYTE) LOW 8 BITS OF [MPC]
|
|
MPCM EQU MPC+1 ; (BYTE) MIDDLE 8 BITS OF [MPC]
|
|
MPCH EQU MPC+2 ; (BYTE) HIGH BIT OF [MPC]
|
|
MPCPNT EQU MPC+3 ; (3 BYTES) ABS POINTER TO CURRENT M-PAGE
|
|
MPNTL EQU MPCPNT ; FIRST 2 BYTES = SAME AS FOR ZIP (EZIP)
|
|
MPNTH EQU MPCPNT+1 ; (BYTE)
|
|
MPCBNK EQU MPCPNT+2 ; (BYTE) INDICATES AUXILIARY MEMORY
|
|
ZCODE EQU MPCPNT+3 ; (BYTE) 1ST ABSOLUTE PAGE OF PRELOAD
|
|
ZPURE EQU ZCODE+1 ; (BYTE) 1ST VIRTUAL PAGE OF "PURE" Z-CODE
|
|
GLOBAL EQU ZCODE+2 ; (WORD) GLOBAL VARIABLE POINTER
|
|
VOCAB EQU GLOBAL+2 ; (WORD) VOCAB TABLE POINTER
|
|
FWORDS EQU GLOBAL+4 ; (WORD) F-WORDS TABLE POINTER
|
|
OBJTAB EQU GLOBAL+6 ; (WORD) OBJECT TABLE POINTER
|
|
|
|
; Z-STRING MANIPULATION VARIABLES
|
|
|
|
;IN EQU GLOBAL+8 ; (9 BYTES) INPUT BUFFER
|
|
;OUT EQU IN+9 ; (9 BYTES) OUTPUT BUFFER
|
|
SOURCE EQU GLOBAL+8 ; OUT+9 ; (BYTE) SOURCE BUFFER POINTER
|
|
RESULT EQU SOURCE+1 ; (BYTE) RESULT TABLE POINTER
|
|
LINLEN EQU SOURCE+2 ; (BYTE) LENGTH OF CURRENT LINE
|
|
WRDLEN EQU SOURCE+3 ; (BYTE) LENGTH OF CURRENT WORD
|
|
ENTRY EQU SOURCE+4 ; (WORD) ADDR OF CURRENT RESULT ENTRY
|
|
NENTS EQU SOURCE+6 ; (WORD) # ENTRIES IN VOCAB TABLE
|
|
ESIZE EQU SOURCE+8 ; (BYTE) SIZE OF VOCAB TABLE ENTRIES
|
|
PSET EQU SOURCE+9 ; (BYTE) PERMANENT CHARSET
|
|
TSET EQU SOURCE+10 ; (BYTE) TEMPORARY CHARSET
|
|
ZCHAR EQU SOURCE+11 ; (BYTE) CURRENT Z-CHAR
|
|
OFFSET EQU SOURCE+12 ; (BYTE) F-WORD TABLE OFFSET
|
|
ZFLAG EQU SOURCE+13 ; (BYTE) Z-WORD ACCESS FLAG
|
|
ZWORD EQU SOURCE+14 ; (WORD) CURRENT Z-WORD
|
|
CONCNT EQU SOURCE+16 ; (BYTE) Z-STRING SOURCE COUNTER
|
|
CONIN EQU SOURCE+17 ; (BYTE) CONVERSION SOURCE INDEX
|
|
CONOUT EQU SOURCE+18 ; (BYTE) CONVERSION DEST INDEX
|
|
DBLOCK EQU SOURCE+19 ; (WORD) Z-BLOCK TO READ
|
|
DBUFF EQU DBLOCK+2 ; (WORD) RAM PG TO ACCESS (LSB = 0)
|
|
;PAGEOT EQU DBLOCK+4 ; (WORD) ZPCH,M OF 1ST VIRTUAL PAGE
|
|
|
|
DIRFLG EQU DBUFF+2 ; (BYTE) OUTPUT TO SCREEN (0) TABLE (1) FLAG
|
|
DIRTBL EQU DBUFF+3 ; (WORD) CONTAINS TBLE TO STORE CHARS TO
|
|
DIRITM EQU DBUFF+5 ; (WORD) OFFSET IN OUTPUT TBL (DIRTBL)
|
|
DIRCNT EQU DBUFF+7 ; (WORD) COUNT OF CHARS IN TBL (DIRTBL)
|
|
BUFFLG EQU DBUFF+9 ; (BYTE) DISPLAY BUFFERED (0) UNBUFFERED (1)
|
|
CHRMAX EQU DBUFF+10 ; (BYTE) # CHARS CAN INPUT FROM KEYBOARD
|
|
;XSIZE EQU DBUFF+11 ; (BYTE) SCREEN WIDTH FOR TESTS (LC-A)
|
|
|
|
RAND1 EQU CHRMAX+1 ; (BYTE) RANDOM #
|
|
SPLITF EQU CHRMAX+2 ; (BYTE) WHICH WINDOW TO WRITE IN
|
|
RDTBL1 EQU CHRMAX+3 ; (WORD) READ TABLE 1 (ABSOLUTE- EZIP)
|
|
RDTBL2 EQU RDTBL1+2 ; (WORD) READ TABLE 2
|
|
LENGTH EQU RDTBL1+4 ; (BYTE) CHAR POSITION ON THE SCREEN
|
|
CHRCNT EQU LENGTH+1 ; (BYTE) CHAR POSITION IN [LBUFF]
|
|
OLDLEN EQU CHRCNT+1 ; (BYTE) OLD LINE LENGTH
|
|
OLDEND EQU OLDLEN+1 ; (BYTE) OLD LAST CHAR IN [LBUFF]
|
|
SCRIPT EQU OLDEND+1 ; (BYTE) SCRIPT ENABLE FLAG
|
|
LINCNT EQU SCRIPT+1 ; (BYTE) LINE COUNTER
|
|
LMAX EQU LINCNT+1 ; (BYTE) MAX # LINES/SCREEN
|
|
IOCHAR EQU LINCNT+2 ; (BYTE) CHARACTER BUFFER
|
|
SLINE EQU IOCHAR+1 ; (BYTE) BORDERLINE FOR SPLIT
|
|
SPSTAT EQU IOCHAR+2 ; (BYTE) SPLIT SCREEN STATUS FLAG
|
|
LFROM EQU SPSTAT+1 ; (WORD) "FROM" LINE ADDRESS
|
|
LTO EQU LFROM+2 ; (WORD) "TO" LINE ADDRESS
|
|
PRLEN EQU LTO+2 ; (BYTE) SCRIPT LINE LENGTH
|
|
SECTOR EQU PRLEN+1 ; (BYTE) TARGET SECTOR
|
|
TRACK EQU SECTOR+1 ; (BYTE) TARGET TRACK
|
|
GPOSIT EQU SECTOR+2 ; (BYTE) DEFAULT SAVE POSITION
|
|
GDRIVE EQU GPOSIT+1 ; (BYTE) DEFAULT SAVE DRIVE
|
|
TPOSIT EQU GDRIVE+1 ; (BYTE) TEMP SAVE POSITION
|
|
TDRIVE EQU TPOSIT+1 ; (BYTE) TEMP SAVE DRIVE
|
|
DRIVE EQU TDRIVE+1 ; (BYTE) CURRENT DRIVE
|
|
SIDEFLG EQU DRIVE+1 ; (BYTE) =1 IF WE ARE ON SIDE 1 2 IF SIDE 2
|
|
SRHOLD EQU SIDEFLG+1 ; (BYTE)
|
|
TIMER EQU SRHOLD+1 ; (WORD) TIMED INPUT COUNTER
|
|
ZSP EQU TIMER+2 ; (WORD)
|
|
OLDZSP EQU ZSP+2 ; (WORD)
|
|
SCREENF EQU OLDZSP+2 ; (BYTE) DIROUT FLAG FOR SCREEN OUTPUT
|
|
SCRIPTF EQU SCREENF+1 ; (BYTE) DIROUT FLAG FOR PRINTER OUTPUT
|
|
TABLEF EQU SCRIPTF+1 ; (BYTE) DIROUT FLAG FOR TABLE OUTPUT
|
|
VOCEND EQU TABLEF+1 ; (3 BYTES) HOLDS MPC IN VOCAB SEARCH
|
|
PSTAT EQU TABLEF+4 ; (BYTE) PRINTER STATUS
|
|
|
|
DVD EQU TABLEF+5 ; (WORD) DISK DIVIDEND
|
|
DSOR EQU TABLEF+7 ; (WORD) DISK DIVISOR
|
|
DTEMP EQU TABLEF+9 ; (WORD) DISK TEMP VARIABLE
|
|
|
|
SAVSIZ EQU TABLEF+11 ; (BYTE) # OF SECTORS PER SAVE
|
|
NUMSAV EQU SAVSIZ+1 ; (BYTE) # SAVES OF THIS GAME POSSIBLE
|
|
OLDX EQU SAVSIZ+2 ; (BYTE)
|
|
OLDY EQU SAVSIZ+3 ; (BYTE) SCREEN COORDS.
|
|
;TOP EQU SAVSIZ+4 ; (BYTE) HOLDS WTOP (LC-A)
|
|
|
|
NARGS EQU SAVSIZ+4 ; (BYTE) # ARGUMENTS
|
|
ARG1 EQU NARGS+2 ; (WORD) ARGUMENT #1
|
|
ARG2 EQU NARGS+4 ; (WORD) ARGUMENT #2
|
|
ARG3 EQU NARGS+6 ; (WORD) ARGUMENT #3
|
|
ARG4 EQU NARGS+8 ; (WORD) ARGUMENT #4
|
|
ARG5 EQU NARGS+10 ; (WORD)
|
|
ARG6 EQU NARGS+12 ; (WORD)
|
|
ARG7 EQU NARGS+14 ; (WORD)
|
|
ARG8 EQU NARGS+16 ; (WORD)
|
|
ABYTE EQU NARGS+18 ; (BYTE) X-OP ARGUMENT BYTE
|
|
BBYTE EQU NARGS+19 ; (BYTE) XCALL ARG BYTE (EZIP)
|
|
ADEX EQU NARGS+20 ; (BYTE) X-OP ARGUMENT INDEX
|
|
RNUM1 EQU NARGS+21 ; (BYTE) FOR RANDOM - DON'T USE
|
|
RNUM2 EQU NARGS+22 ; (BYTE) FOR RANDOM - DON'T USE
|
|
|
|
; THE REST OF THE VARIABLES (THAT WOULDN'T FIT) ARE AT THE END OF IO.ASM
|
|
|
|
LASTZP EQU RNUM2+1 ; CHECK FOR OVER ZERO PAGE
|
|
|
|
END
|