Files
erkyrath.infocom-zcode-terps/msx/zorkmsx.prn
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

5013 lines
196 KiB
Plaintext
Raw Permalink 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.
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 1
; **********************************************************************
; * *
; * ZIP80 - MSX VERSION *
; * Z-CODE INTERPRETER PROGRAM *
; * FOR ZILOG Z80 MICROPROCESSOR *
; * COPYRIGHT 1984, INFOCOM, INC. *
; * COMPANY PRIVATE -- NOT FOR DISTRIBUTION *
; * *
; **********************************************************************
;
;
;
; **********************************************************************
; * *
; * REVISION HISTORY *
; * *
; * 7/27/84 RML *
; * 12/19/84 LS (First MSX version) *
; * 2/5/85 LS (Reset random flag) *
; * *
; **********************************************************************
;
;
; *************************************
; * EQUATES *
; *************************************
;
;--------------------------------------
; SOME COMMON DEFINITIONS
;--------------------------------------
;
0000 FALSE EQU 00H ;STANDARD FALSE VALUE
00FF TRUE EQU 0FFH ;STANDARD TRUE VALUE
;
;--------------------------------------
; CPM EQUATES
;--------------------------------------
;
0000 WARM EQU 0000H ;WARM START IN BIOS
0003 IOBYTE EQU 0003H ;I/O DEVICE BLOCK
0004 CDISK EQU 0004H ;CURRENT DISK DRIVE
0005 BDOS EQU 0005H ;CPM FUNCTION ENTRY POINT
0006 LSTADR EQU 0006H ;LAST ADDRESS
005C CPMFCB EQU 005CH ;DEFAULT FILE CONTROL BLOCK
0080 CPMBUF EQU 0080H ;DEFAULT FILE TRANSFER BUFFER
0100 TPA EQU 0100H ;TRANSIENT PROGRAM AREA
;
; FILE CONTROL BLOCK OFFSETS
;
005C CPMDRV EQU CPMFCB+0 ;DRIVE
005D CPMFNB EQU CPMFCB+1 ;NAME STORAGE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 2
0065 CPMFEX EQU CPMFCB+9 ;EXTENTION
007C CPMCR EQU CPMFCB+32 ;CURRENT RECORD
007D CPMREC EQU CPMFCB+33 ;RECORD NUMBER FOR RANDOM ACCESS
;
; CPM FUNCTION EQUATES
;
0000 CRESET EQU 0 ;SYSTEM RESET
0001 CCI EQU 1 ;CHARACTER INPUT
0002 CCO EQU 2 ;CHARACTER OUTPUT
0005 CLO EQU 5 ;LIST OUTPUT
0006 CDIO EQU 6 ;DIRECT I/O
0009 CPSTNG EQU 9 ;PRINT STRING
000A CRCBUF EQU 10 ;READ CONSOLE BUFFER
000B CGCONS EQU 11 ;GET CONSOLE STATUS
000D CPMRDS EQU 13 ;RESET DISK SYSTEM
000E CPMSEL EQU 14 ;SELECT DISK
000F OPEN EQU 15 ;ACTIVATES EXISTING FILE FOR R/W OPERATIONS
0010 CLOSE EQU 16 ;INACTIVATES OPEN FILE AND RECORDS NEW FCB IN DIRECTORY
0013 DELETE EQU 19 ;REMOVE EXISTING FILE FROM THE DIRECTORY
0019 RETCUR EQU 25 ;RETURN CURRENT DEFAULT DISK
;
;SEQUENTIAL OPERATIONS
0014 READS EQU 20 ;READ THE NEXT 128-BYTE RECORD FROM AN OPEN FILE
0015 WRITES EQU 21 ;WRITE A SEQUENTIAL 128-BYTE RECORD ONTO AN OPEN FILE
;
0016 MAKEF EQU 22 ;CREATE AND OPEN A NEW FILE
0019 CPMRCD EQU 25 ;RETURN CURRENT DISK
;
;RANDOM OPERATIONS
0021 READR EQU 33 ;READ A SPECIFIED 128-BYTE RECORD FROM AN OPEN FILE
0022 WRITER EQU 34 ;WRITE A 128-BYTE RECORD TO A SPECIFIED RECORD NUMBER
; IN AN OPEN FILE
;
;MISC. EQUATES
0085 CPLMAX EQU 133 ;MAXIMUM CHARACTERS PER LINE
;
;--------------------------------------
; APPLICATION EQUATES
;--------------------------------------
;
0040 MAXPGS EQU 64 ;MUST BE 64 FOR TRSN VERSIONS
0010 ROOMG EQU 16 ;ROOM # (USED TO DISPLAY SHORT DESCRIPTION)
0011 SCOREG EQU 17 ;SCORE
0012 MOVESG EQU 18 ;NUMBER OF MOVES
00E0 ZSTAKL EQU 224 ;LENGTH OF THE ZSTACK IN WORDS
;
;ZCODE HEADER OFFSETS INIT VALUES
0000 ZVERS EQU 0 ;VERSION BYTE
0001 ZSWAP EQU 1 ;BIT FLAGS - SEE BELOW
0002 ZID EQU 2 ;GAME ID WORD
0004 ZENDLD EQU 4 ;START OF NON-PRELOADED ZCODE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 3
0006 ZSTART EQU 6 ;ZCODE EXECUTION ADDRESS
0008 ZVOCAB EQU 8 ;START OF VOCABULARY TABLE
000A ZOBJEC EQU 10 ;START OF OBJECT TABLE
000C ZGLOBA EQU 12 ;START OF GLOBAL VARIABLE TABLE
000E ZPURBT EQU 14 ;START OF "PURE" ZCODE
0010 ZSCRIP EQU 16 ;WORD FLAG FOR CONTROLLING SCRIPT FEATURE
0012 ZSERNM EQU 18 ;18 THROUGH 23 ARE ASCII SERIAL NUMBER, UNIQUE TO EACH COPY
0018 ZFWORD EQU 24 ;TABLE OF COMMON WORDS
001A ZCKLEN EQU 26 ;LENGTH TO USE FOR CHECKSUM
001C ZCKSUM EQU 28 ;SUM OF ALL WORDS AFTER WORD 64
;
;BIT FLAGS IN ZSWAP
0001 ZSWAPF EQU 1 ;NOT USED
0002 ZTIMEF EQU 2 ;IF SET, DISPLAY TIME IN STATUS LINE
0004 ZSPLIT EQU 4 ;SET BY MAKDAT TO INDICATE SPLIT FILE
0008 ZTANDY EQU 8 ;SET BY INTERPRETER TO DESIGNATE TANDY MACHINE
0010 ZSTATB EQU 10H ;SET BY CPM CONSOLE PROGRAM, 1 IMPLIES NO STATUS LINE
;END OF COMMON EQUATES
;
0190 LPDL EQU 400 ;200 LEVELS OF PUSH AND POP
;
; *************************************
; * *
; * PROGRAM START *
; * *
; *************************************
;
0100 ORG 100H ;START OF THE TPA
0100 START:
0100 C30002 JP CPMSTR ;JUMP AROUND CONFIGURATION DATA
;
; *************************************
; * CONFIGURATION DATA *
; *************************************
;
0103 4F CPMCPL: DB 79 ;CHARACTERS PER LINE
0104 17 CPMLPP: DB 23 ;LINES PER PAGE EXCLUDING STATUS LINE
0105 53555350 CPMFN: DB 'SUSPECT ' ;FILE PREFIX NAME (GAME DEPENDENT)
; PADDED AT THE END WITH BLANKS (' ') SO AS
; TO TOTAL 8 CHARACTERS
;
010D 01 CPMCLF: DB 1 ;1 FOR LF AFTER CR ON CONSOLE
010E 00 CPMLLF: DB 0 ;1 FOR LF AFTER CR ON LIST
010F 80 CPMINV: DB 80H ;NUMBER ADDED TO CHARACTERS FOR INVERSE VIDEO
;THE FOLLOWING STRINGS HAVE A COUNT FIELD FOLLOWED BY UP TO 32 CHARACTERS
0110 ITRMST:
0110 06 DB 6 ;INIT TERMINAL, CLEAR SCREEN, LOWER LEFT,SCROLL MODE
0111 1E1A1B3D DB 1EH,1AH,1BH,'=',55,32
0117 DS 33-($-ITRMST)
0131 00 RTRMST: DB 0 ;RESET TERMINAL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 4
0132 DS 33-($-RTRMST)
0152 04 BSTLIN: DB 4 ;BEGIN STATUS LINE STRING
0153 1B3D2020 DB 1BH,'=',32,32
0157 DS 33-($-BSTLIN)
0173 04 ESTLIN: DB 4 ;END STATUS LINE STRING
0174 1B3D3720 DB 1BH,'=',55,32
0178 DS 33-($-ESTLIN)
0194 00 PSTUPS: DB 0 ;PRINTER SETUP STRING
0195 DS 33-($-PSTUPS)
01B5 00 TWODSK: DB 0 ;SET TO 1 IF TWO DISKS ARE AVAILABLE
;
01B6 DS 200H-$ ;TO FIX THE ENTRY POINT REGUARDLESS OF
; VARIABLE LENGTH CONFIGURATION DATA
;
; *************************************
; * CPM START *
; *************************************
;
0200 CPMSTR: ;LOCATION 200H
0200 31E90D LD SP,PDL+LPDL ;INIT MACHINE STACK
0203 C38810 JP BODY ;JUMP AROUND SUBROUTINE SECTION
;
; *************************************
; * SUBROUTINES *
; *************************************
;
0206 C35707 ZER: JP RESTAR
;
0209 2A0600 MEMTOP: LD HL,(LSTADR) ;HL <= BDOS ENTRY VECTOR
020C 7D LD A,L ;
020D FEFF CP 0FFH ;
; JP Z,MEMTP1 ;PREVIOUSLY COMMENTED OUT LINE (SCOTT)
020F 2EFF LD L,0FFH ;SUBTRACT 1 BYTE
0211 25 DEC H ;
0212 3ABC21 MEMTP1: LD A,(ZCODEP+1) ;GET MSB OF LOW MEM STARTING POINTER
0215 AC XOR H ;
0216 E601 AND 1 ;
0218 C0 RET NZ ;
0219 25 DEC H ;WASTE 256 MORE IF NECESSARY
021A C9 RET
;
;OPEN FILE
021B 32570C OPNDK1: LD (FILTYP),A ;SAVE FILETYPE
021E 215C00 LD HL,CPMFCB ;XFER DRIVE NUMBER AND FILE NAME TO FCB
0221 060C LD B,12
0223 CD4B03 CALL MOVIT
0226 AF XOR A
0227 327C00 LD (CPMCR),A ;SET CURRENT RECORD=0 (SEQUENTIAL FILE)
022A 210000 LD HL,0
022D 226800 LD (CPMFCB+12),HL ;SET EXTENT "EX" AND S1=0
0230 226A00 LD (CPMFCB+14),HL ;SET S2 AND RECORD COUNT FOR EXTENT "EX"=0
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 5
0233 115C00 LD DE,CPMFCB ;^FCB
0236 AF XOR A
0237 325C00 LD (CPMFCB),A ;SELECT DEFAULT DRIVE
023A 0E0F LD C,OPEN ;SELECT OPEN FUNCTION
023C CD0500 CALL BDOS ;DO IT
023F 3C INC A ;INCREMENT DIRECTORY CODE TO TEST FOR FILE NOT FOUND
; Z FLAG SET IF FILE NOT FOUND
0240 C0 RET NZ ;IF FILE EXISTS THEN RETURN WITH Z FLAG RESET A=0
; ELSE
;TEST FOR TWO DISKS
0241 3AB501 LD A,(TWODSK) ;MULTIPLE DISKS?
0244 B7 OR A
0245 C8 RET Z ;NO ONLY 1, ZFLAG SET AND RETURN
;
;TWO DISKS
0246 3E01 LD A,1 ;AUTO DISK SELECT DRIVE A
0248 325C00 LD (CPMFCB),A ;SET UP THE PARAMETERS
024B AF XOR A
024C 327C00 LD (CPMCR),A
024F 210000 LD HL,0
0252 226800 LD (CPMFCB+12),HL
0255 226A00 LD (CPMFCB+14),HL
0258 115C00 LD DE,CPMFCB
025B 0E0F LD C,OPEN ;TRY DRIVE 1
025D CD0500 CALL BDOS
0260 3C INC A
0261 C0 RET NZ ;RETURN IF FOUND WITH ZFLAG RESET
0262 3E02 LD A,2 ; ELSE AUTO DISK SELECT DRIVE B
0264 325C00 LD (CPMFCB),A ;SET UP THE PARAMETERS
0267 AF XOR A
0268 327C00 LD (CPMCR),A
026B 210000 LD HL,0
026E 226800 LD (CPMFCB+12),HL
0271 226A00 LD (CPMFCB+14),HL
0274 115C00 LD DE,CPMFCB
0277 0E0F LD C,OPEN ;TRY DRIVE 2
0279 CD0500 CALL BDOS
027C 3C INC A
027D C9 RET ;IF NOT FOUND, THEN Z WILL BE SET
027E 7E PCSTR: LD A,(HL) ;PRINT STRING, GET COUNT
027F 23 PCSTRL: INC HL ;POINT TO NEXT CHARACTER
0280 B7 OR A
0281 C8 RET Z ;DONE
0282 F5 PUSH AF
0283 C5 PUSH BC
0284 D5 PUSH DE
0285 E5 PUSH HL
0286 5E LD E,(HL)
0287 0E06 LD C,CDIO
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 6
0289 CD0500 CALL BDOS
028C E1 POP HL
028D D1 POP DE
028E C1 POP BC
028F F1 POP AF
0290 3D DEC A
0291 C37F02 JP PCSTRL
0294 7E PCPST: LD A,(HL) ;PRINT PRINTER SETUP STRING, GET COUNT
0295 23 PCPSTL: INC HL ;POINT TO NEXT CHARACTER
0296 B7 OR A
0297 C8 RET Z ;DONE
0298 F5 PUSH AF
0299 C5 PUSH BC
029A D5 PUSH DE
029B E5 PUSH HL
029C 5E LD E,(HL)
029D 0E05 LD C,CLO
029F CD0500 CALL BDOS
02A2 E1 POP HL
02A3 D1 POP DE
02A4 C1 POP BC
02A5 F1 POP AF
02A6 3D DEC A
02A7 C39502 JP PCPSTL
02AA 21C802 SETFIL: LD HL,FNDAT+1 ;APPEND TO THE FILE EXTENSION NAMES
02AD CDBF02 CALL SETFL1 ;THE GAME NAME SUFFIX
02B0 21E002 LD HL,FNPRE+1
02B3 CDBF02 CALL SETFL1
02B6 21D402 LD HL,FNPUR+1
02B9 CDBF02 CALL SETFL1
02BC 21EC02 LD HL,SRDFNM+1
02BF 110501 SETFL1: LD DE,CPMFN
02C2 0608 LD B,8
02C4 C34B03 JP MOVIT
02C7 002E2E2E FNDAT: DB 0,'........DAT'
02D3 002E2E2E FNPUR: DB 0,'........PUR'
02DF 002E2E2E FNPRE: DB 0,'........PRE'
02EB 002E2E2E SRDFNM: DB 0,'........SAV'
02F7 22CD0B GETDSK: LD (DBUFP),HL
02FA CD450B CALL LFILS ;OPEN ZORK/DAT FILE IF NOTHING OPEN
02FD 6F LD L,A
02FE 3A570C LD A,(FILTYP)
0301 FE03 CP 3 ;DATA TYPE OF FILE?
0303 7D LD A,L
0304 CA1803 JP Z,GETDK2
0307 219B21 LD HL,ZMEMT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 7
030A BE CP (HL)
030B DA1503 JP C,GETPRE ;MAKE SURE ZORK/PRE IS OPEN
030E 96 SUB (HL) ;REAL OFFSET
030F CD750B CALL LFILD ;MAKE SURE ZORK/DAT IS OPEN
0312 C31803 JP GETDK2
0315 CD950B GETPRE: CALL LFILP ;GET ZORK/PRE
0318 6F GETDK2: LD L,A
0319 2600 LD H,0
031B 29 ADD HL,HL
031C 29 ADD HL,HL ;*4 FOR 128 BYTE BLOCKS
031D CD2603 CALL GTDSK1
0320 CD2603 CALL GTDSK1
0323 CD2603 CALL GTDSK1
0326 E5 GTDSK1: PUSH HL
0327 227D00 LD (CPMREC),HL
032A AF XOR A
032B 327F00 LD (CPMREC+2),A
032E 115C00 LD DE,CPMFCB
0331 0E21 LD C,READR ;READ RANDOM RECORD
0333 CD0500 CALL BDOS
0336 B7 OR A
0337 C40602 CALL NZ,ZER
033A 118000 LD DE,CPMBUF
033D 2ACD0B LD HL,(DBUFP)
0340 0680 LD B,128
0342 CD4B03 CALL MOVIT
0345 22CD0B LD (DBUFP),HL
0348 E1 POP HL
0349 23 INC HL ;INCREMENT FOR NEXT TIME
034A C9 RET
034B 1A MOVIT: LD A,(DE) ;TRANSFER (D) TO (H) COUNT IN B
034C 77 LD (HL),A
034D 23 INC HL
034E 13 INC DE
034F 05 DEC B
0350 C24B03 JP NZ,MOVIT
0353 C9 RET
0354 3A0401 READBF: LD A,(CPMLPP)
0357 3D DEC A
0358 32580C LD (MORCNT),A
035B CDF704 CALL FLSLIN
035E 3E01 LD A,1
0360 329921 LD (NOLPT),A ;TURN OFF LPT DURING READ
0363 164D LD D,77 ;D CONTAINS MAX CHARS CAN READ
0365 1E00 LD E,0 ;E CONTAINS HOW MANY HAVE BEEN READ
0367 2A9D21 LD HL,(ARG1) ;READ A BUFFER
036A 23 INC HL
036B CD3804 READB1: CALL CIN
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 8
036E FE08 CP 08H
0370 CAA303 JP Z,RDBFRO
0373 FE7F CP 7FH
0375 CAA303 JP Z,RDBFRO
0378 FE0D CP 0DH
037A CAC003 JP Z,RDBFCR
037D FE12 CP 18
037F CAFE03 JP Z,RDBFRT
0382 FE20 CP 20H
0384 DA6B03 JP C,READB1
0387 4F LD C,A
0388 CDB604 CALL COUT
038B 79 LD A,C
038C FE41 CP 'A'
038E DA9803 JP C,READB2
0391 FE5B CP 'Z'+1
0393 D29803 JP NC,READB2
0396 C620 ADD A,'a'-'A' ;CONVERT TO LOWER CASE
0398 77 READB2: LD (HL),A
0399 23 INC HL
039A 1C INC E
039B 7A LD A,D
039C BB CP E
039D CA1A04 JP Z,RDBFFL
03A0 C36B03 JP READB1
03A3 7B RDBFRO: LD A,E ;CHECK IF 1ST CHAR
03A4 FE00 CP 0 ;IF SO DON'T DELETE
03A6 CA6B03 JP Z,READB1 ;GO GET ANOTHER CHAR
03A9 1D DEC E
03AA 2B DEC HL
03AB CDB103 CALL COUTBS
03AE C36B03 JP READB1
03B1 0E08 COUTBS: LD C,08H
03B3 CDB604 CALL COUT
03B6 0E20 LD C,20H
03B8 CDB604 CALL COUT
03BB 0E08 LD C,08H ;DEVINE RUBOUT
03BD C3B604 JP COUT
03C0 E5 RDBFCR: PUSH HL
03C1 D5 PUSH DE
03C2 AF XOR A
03C3 329921 LD (NOLPT),A
03C6 2ABB21 LD HL,(ZCODEP)
03C9 111100 LD DE,ZSCRIP+1
03CC 19 ADD HL,DE
03CD 7E LD A,(HL)
03CE E601 AND 1
03D0 CAEF03 JP Z,RDBFC2 ;NO LPT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 9
03D3 D1 POP DE
03D4 D5 PUSH DE
03D5 7B LD A,E
03D6 B7 OR A
03D7 CAEF03 JP Z,RDBFC2 ;NOTHING TYPED
03DA 2A9D21 LD HL,(ARG1)
03DD 23 INC HL
03DE 7E RDBFC3: LD A,(HL)
03DF FE61 CP 'a'
03E1 DAE603 JP C,RDBFC4 ;NOT LOWER CASE
03E4 D620 SUB 'a'-'A'
03E6 4F RDBFC4: LD C,A
03E7 23 INC HL
03E8 CD8605 CALL LPTO
03EB 1D DEC E
03EC C2DE03 JP NZ,RDBFC3
03EF D1 RDBFC2: POP DE
03F0 E1 POP HL
03F1 7A LD A,D
03F2 BB CP E
03F3 CAF903 JP Z,RDBFC1
03F6 1C INC E
03F7 360D LD (HL),0DH
03F9 CD7304 RDBFC1: CALL PCRLFD
03FC 7B LD A,E
03FD C9 RET
03FE D5 RDBFRT: PUSH DE
03FF E5 PUSH HL
0400 2A9D21 LD HL,(ARG1)
0403 23 INC HL
0404 CD7304 CALL PCRLFD
0407 7B RDBFR1: LD A,E
0408 B7 OR A
0409 CA1504 JP Z,RDBFR2
040C 4E LD C,(HL)
040D CDB604 CALL COUT
0410 1D DEC E
0411 23 INC HL
0412 C30704 JP RDBFR1
0415 E1 RDBFR2: POP HL
0416 D1 POP DE
0417 C36B03 JP READB1
041A CD3804 RDBFFL: CALL CIN
041D FE0D CP 0DH ;ACCEPT <RET>
041F CAC003 JP Z,RDBFCR
0422 FE08 CP 08
0424 CAA303 JP Z,RDBFRO
0427 FE7F CP 7FH
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 10
0429 CAA303 JP Z,RDBFRO
042C D5 PUSH DE
042D 1E07 LD E,7 ;OTHERWISE
042F 0E06 LD C,CDIO ;RING BELL
0431 CD0500 CALL BDOS
0434 D1 POP DE
0435 C31A04 JP RDBFFL ;AND LOOP TIL GET WHAT WE WANT
0438 C5 CIN: PUSH BC
0439 D5 PUSH DE
043A E5 PUSH HL
043B 1EFF CIN1: LD E,0FFH
043D 0E06 LD C,CDIO ;READ DIRECT
043F CD0500 CALL BDOS
0442 B7 OR A
0443 CA5104 JP Z,CIN2 ;NO CHARACTER YET
0446 21C80B LD HL,RDFLG
0449 36FF LD (HL),0FFH ;NOT FIRST READ ANY MORE
044B E1 POP HL
044C D1 POP DE
044D C1 POP BC
044E E67F AND 7FH
0450 C9 RET
0451 3AC80B CIN2: LD A,(RDFLG)
0454 B7 OR A
0455 C23B04 JP NZ,CIN1 ;NOT FIRST READ
0458 CDD01B CALL RND
045B C33B04 JP CIN1
045E 21C70B COUTD: LD HL,COUTDC ;INCREASE COUNT
0461 34 INC (HL)
0462 3A0F01 LD A,(CPMINV) ;INVERSE VIDEO ADDER
0465 21C60B LD HL,STAFLG
0468 A6 AND (HL) ;ADD ONLY IF IN STATUS MODE
0469 81 ADD A,C
046A 5F LD E,A
046B 0E06 LD C,CDIO
046D CD0500 CALL BDOS
0470 C39704 JP POPRET
0473 C5 PCRLFD: PUSH BC
0474 D5 PUSH DE
0475 E5 PUSH HL
0476 1E0D LD E,0DH
0478 0E06 LD C,CDIO
047A CD0500 CALL BDOS
047D 3A0D01 LD A,(CPMCLF)
0480 B7 OR A
0481 CA8B04 JP Z,PCRLD1 ;NO LINE FEED
0484 1E0A LD E,0AH
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 11
0486 0E06 LD C,CDIO
0488 CD0500 CALL BDOS
048B 0E0D PCRLD1: LD C,0DH
048D CD9B04 CALL LPCHK
0490 21580C LD HL,MORCNT
0493 35 DEC (HL)
0494 CC0107 CALL Z,MORE
0497 E1 POPRET: POP HL
0498 D1 POP DE
0499 C1 POP BC
049A C9 RET
049B C5 LPCHK: PUSH BC
049C D5 PUSH DE
049D E5 PUSH HL
049E 2ABB21 LD HL,(ZCODEP)
04A1 111100 LD DE,ZSCRIP+1
04A4 19 ADD HL,DE
04A5 7E LD A,(HL)
04A6 E601 AND 1
04A8 C48605 CALL NZ,LPTO
04AB C39704 JP POPRET
04AE CD7405 COUTCR: CALL LINOCR
04B1 C3F304 JP CORET
04B4 0E0D PCRLF: LD C,0DH
04B6 C5 COUT: PUSH BC
04B7 D5 PUSH DE
04B8 E5 PUSH HL
04B9 79 LD A,C
04BA FE08 CP 8
04BC CAD304 JP Z,COUT1
04BF FE1B CP 1BH
04C1 CA8505 JP Z,CLEARS
04C4 FE0C CP 12
04C6 CA8505 JP Z,CLEARS
04C9 FE0D CP 0DH
04CB CAAE04 JP Z,COUTCR
04CE FE20 COUT2: CP 20H
04D0 DAF304 JP C,CORET ;NON PRINTING
04D3 3A9921 COUT1: LD A,(NOLPT)
04D6 B7 OR A
04D7 C25E04 JP NZ,COUTD
04DA 3ACF0B LD A,(NCHARS)
04DD 210301 LD HL,CPMCPL
04E0 BE CP (HL)
04E1 D47405 CALL NC,LINOCR ;OUTPUT LINE IF FULL
04E4 3ACF0B LD A,(NCHARS)
04E7 3C INC A
04E8 32CF0B LD (NCHARS),A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 12
04EB 2A550C LD HL,(CHRPNT)
04EE 71 LD (HL),C
04EF 23 INC HL
04F0 22550C LD (CHRPNT),HL
04F3 E1 CORET: POP HL
04F4 D1 POP DE
04F5 C1 POP BC
04F6 C9 RET
04F7 C5 FLSLIN: PUSH BC
04F8 3ACF0B LD A,(NCHARS)
04FB B7 OR A
04FC CA7205 JP Z,LINOTR ;NO CHARS
04FF C32105 JP LINFUL ;PRINT ALL
0502 C5 LINOUT: PUSH BC
0503 3ACF0B LD A,(NCHARS)
0506 B7 OR A
0507 CA7205 JP Z,LINOTR ;NO CHARACTERS
050A 3D DEC A
050B 47 LD B,A
050C 79 LD A,C
050D FE0D CP 0DH
050F CA2105 JP Z,LINFUL
0512 2A550C LD HL,(CHRPNT) ;FIND LAST SPACE
0515 2B DEC HL
0516 7E LINOT1: LD A,(HL)
0517 FE20 CP 20H
0519 CA2805 JP Z,LINOT2 ;FOUND SPACE
051C 2B DEC HL
051D 05 DEC B
051E F21605 JP P,LINOT1
0521 2A550C LINFUL: LD HL,(CHRPNT) ;PRINT WHOLE LINE
0524 3ACF0B LD A,(NCHARS)
0527 47 LD B,A
0528 C5 LINOT2: PUSH BC
0529 E5 PUSH HL
052A 21D00B LD HL,CHARS
052D 78 LD A,B
052E B7 OR A
052F CA4905 JP Z,LINOT6
0532 C5 LINOT3: PUSH BC
0533 D5 PUSH DE
0534 E5 PUSH HL
0535 5E LD E,(HL)
0536 0E06 LD C,CDIO
0538 CD0500 CALL BDOS
053B E1 POP HL
053C E5 PUSH HL
053D 4E LD C,(HL)
053E CD9B04 CALL LPCHK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 13
0541 E1 POP HL
0542 D1 POP DE
0543 23 INC HL
0544 C1 POP BC
0545 05 DEC B
0546 C23205 JP NZ,LINOT3
0549 E1 LINOT6: POP HL
054A 23 INC HL
054B C1 POP BC
054C 3ACF0B LD A,(NCHARS)
054F 90 SUB B
0550 3D DEC A
0551 F25505 JP P,LINOT7
0554 AF XOR A
;
0555 32CF0B LINOT7: LD (NCHARS),A ;CHARACTERS NOT YET PRINTED
0558 CA6605 JP Z,LINOT5
055B 11D00B LD DE,CHARS
055E 7E LINOT4: LD A,(HL)
055F 12 LD (DE),A
0560 23 INC HL
0561 13 INC DE
0562 05 DEC B
0563 C25E05 JP NZ,LINOT4
0566 21D00B LINOT5: LD HL,CHARS
0569 3ACF0B LD A,(NCHARS)
056C CDEA1E CALL HLOFF
056F 22550C LD (CHRPNT),HL
0572 C1 LINOTR: POP BC
0573 C9 RET
0574 CD0205 LINOCR: CALL LINOUT
0577 C37304 JP PCRLFD
057A 2ABB21 TMCHK: LD HL,(ZCODEP) ;RETURNS NON ZERO IF IN TIME DISPLAY MODE
057D 110100 LD DE,ZSWAP
0580 19 ADD HL,DE
0581 7E LD A,(HL)
0582 E602 AND ZTIMEF
0584 C9 RET
0585 CLEARS:
0585 C9 RET ;NOT YET IMPLEMENTED
0586 3A9921 LPTO: LD A,(NOLPT)
0589 B7 OR A
058A C0 RET NZ ;SOME ITEMS DON'T GO TO LPT
058B 3AC90B LD A,(PRFLG)
058E B7 OR A
058F CCB405 CALL Z,LPINIT
0592 C5 PUSH BC
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 14
0593 D5 PUSH DE
0594 E5 PUSH HL
0595 59 LD E,C
0596 C5 PUSH BC
0597 0E05 LD C,CLO ;LIST OUT
0599 CD0500 CALL BDOS
059C C1 POP BC
059D 79 LD A,C
059E FE0D CP 0DH
05A0 C29704 JP NZ,POPRET ;NOT CR
05A3 3A0E01 LD A,(CPMLLF)
05A6 B7 OR A
05A7 CA9704 JP Z,POPRET
05AA 1E0A LD E,0AH
05AC 0E05 LD C,CLO ;OUTPUT LF IF NEEDED
05AE CD0500 CALL BDOS
05B1 C39704 JP POPRET
05B4 3C LPINIT: INC A
05B5 32C90B LD (PRFLG),A
05B8 E5 PUSH HL
05B9 219401 LD HL,PSTUPS
05BC CD9402 CALL PCPST ;PRINTER SETUP STRING
05BF E1 POP HL
05C0 C9 RET
05C1 215201 WHOLIN: LD HL,BSTLIN
05C4 7E LD A,(HL) ;DO WE HAVE A STATUS LINE?
05C5 B7 OR A
05C6 C8 RET Z ;NO, RETURN
05C7 3AC121 LD A,(CSPERM) ;SAVE DATA CLOBERED BY PRNTDC
05CA 67 LD H,A
05CB 3AC221 LD A,(STBYTF)
05CE 6F LD L,A
05CF E5 PUSH HL
05D0 2AC321 LD HL,(ZSTWRD)
05D3 E5 PUSH HL
05D4 2AB321 LD HL,(MPCL)
05D7 E5 PUSH HL
05D8 2AB221 LD HL,(MPCH)
05DB E5 PUSH HL
05DC 215201 LD HL,BSTLIN
05DF CD7E02 CALL PCSTR ;POSITON TO TOP OF SCREEN
05E2 AF XOR A
05E3 32C70B LD (COUTDC),A ;BEGINNING OF LINE
05E6 3E01 LD A,1
05E8 329921 LD (NOLPT),A
05EB 3EFF LD A,0FFH
05ED 32C60B LD (STAFLG),A ;STATUS LINE FLAG (ANDED WITH CPMINV ADDER)
05F0 CD7A05 CALL TMCHK
05F3 C25306 JP NZ,WHOLT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 15
05F6 CD4506 CALL WHOLN1 ;COMMON TIME/ROOM PRINTING
05F9 21D306 LD HL,WHOMSG ;PRINT 'SCORE'
05FC CDB206 CALL POSPST ;POSITION THEN PRINT
05FF 3E11 LD A,SCOREG
0601 CD3B13 CALL VARGET
0604 CD791B CALL PRNTNC
0607 0E2F LD C,'/'
0609 CDB604 CALL COUT
060C 3E12 LD A,MOVESG
060E CD3B13 CALL VARGET
0611 CD791B CALL PRNTNC
0614 3A0301 WHOLN2: LD A,(CPMCPL)
0617 47 LD B,A
0618 CDA306 CALL CHRPOS ;BLANK REST OF LINE
061B 217301 LD HL,ESTLIN
061E CD7E02 CALL PCSTR ;POSITION BACK TO LOWER LEFT
0621 AF XOR A
0622 329921 LD (NOLPT),A
0625 32C60B LD (STAFLG),A
0628 32B721 LD (MPCFLG),A ;RESTORE STRING VALUES
062B E1 POP HL
062C 7D LD A,L
062D 32B221 LD (MPCH),A
0630 E1 POP HL
0631 22B321 LD (MPCL),HL
0634 E1 POP HL
0635 22C321 LD (ZSTWRD),HL
0638 E1 POP HL
0639 7C LD A,H
063A 32C121 LD (CSPERM),A
063D 7D LD A,L
063E 32C221 LD (STBYTF),A
0641 CD2020 CALL GETMOD
0644 C9 RET
0645 0E20 WHOLN1: LD C,' ' ;PRINT A ' '
0647 CDB604 CALL COUT
064A 3E10 LD A,ROOMG ;GET THE CURRENT ROOM NO.
064C CD3B13 CALL VARGET
064F 7D LD A,L
0650 C30316 JP PRNTDC ;PRINT THE SHORT DESCRIPTION
;
; PRINT THE TIME (HOURS)
0653 CD4506 WHOLT: CALL WHOLN1
0656 21DB06 LD HL,WHOTMS ;PRINT '.......TIME' MESSAGE
0659 CDB206 CALL POSPST
065C 3E11 LD A,SCOREG ;GET HOURS IN MILITARY TIME (24 HR CLOCK)
065E CD3B13 CALL VARGET
0661 7D LD A,L ;A <= HOURS
0662 F5 PUSH AF ;SAVE HOURS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 16
0663 B7 OR A ;HOURS=0?
0664 C26C06 JP NZ,WHOLT0 ; NO.
0667 2E0C LD L,12 ; YES. 0 HRS IS REALLY 12 HOURS
0669 C37406 JP WHOLT1
;
066C FE0D WHOLT0: CP 13 ;COMPARE HOURS (24 HR CLOCK) WITH 13
066E DA7406 JP C,WHOLT1 ; IF < 13 THEN PRINT HOURS
0671 D60C SUB 12 ; ELSE A <= A-12
0673 6F LD L,A ; L <= ADJUSTED TIME (12 HR CLOCK)
0674 CD791B WHOLT1: CALL PRNTNC ;PRINT THE HOURS
0677 0E3A LD C,':' ;PRINT ':'
0679 CDB604 CALL COUT
;
; PRINT TIME (MINUTES)
067C 3E12 LD A,MOVESG ;GET THE MINUTES
067E CD3B13 CALL VARGET ;A <= MINUTES
0681 CD3B07 CALL PNTTIM ;PRINT THE MINUTES
0684 0E20 LD C,' ' ;PRINT A ' '
0686 CDB604 CALL COUT
;
; PRINT 'AM/PM'
0689 0E61 LD C,'a'
068B F1 POP AF ;RESTORE HOURS
068C FE18 CP 24 ;24 HOURS IS AM
068E CA9806 JP Z,WHOLT2
0691 FE0C CP 12 ;< 12 HOURS IS AM
0693 DA9806 JP C,WHOLT2
0696 0E70 LD C,'p' ;ELSE IT'S PM
0698 CDB604 WHOLT2: CALL COUT ;PRINT 'A/P'
069B 0E6D LD C,'m'
069D CDB604 CALL COUT ;PRINT 'M'
06A0 C31406 JP WHOLN2
;
06A3 3AC70B CHRPOS: LD A,(COUTDC) ;SPACE UNTILE COUTDC=(B)
06A6 B8 CP B
06A7 D0 RET NC
06A8 C5 PUSH BC
06A9 0E20 LD C,20H
06AB CDB604 CALL COUT
06AE C1 POP BC
06AF C3A306 JP CHRPOS
06B2 3A0301 POSPST: LD A,(CPMCPL)
06B5 FE27 CP 39 ;VERY SHORT
06B7 DACD06 JP C,POSPS1 ;DON'T PRINT WORDS
06BA D610 SUB 16
06BC E5 PUSH HL
06BD 47 LD B,A
06BE CDA306 CALL CHRPOS ;SPACE OVER
06C1 E1 POP HL
06C2 46 LD B,(HL)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 17
06C3 23 POSPS2: INC HL
06C4 4E LD C,(HL)
06C5 CDB604 CALL COUT
06C8 05 DEC B
06C9 C2C306 JP NZ,POSPS2
06CC C9 RET
06CD D608 POSPS1: SUB 8 ;MOVE OVER 8 FROM EDGE
06CF 47 LD B,A
06D0 C3A306 JP CHRPOS
06D3 0753636F WHOMSG: DB 7,'Score:',20H
06DB 0654696D WHOTMS: DB 6,'Time:',20H
06E2 2D2D2D2D MORMSG: DB '-------------More-------------',0
001F LMORE EQU $-MORMSG
0701 3A0401 MORE: LD A,(CPMLPP)
0704 B7 OR A
0705 C8 RET Z ;NO MORE LINE IF 0
0706 3D DEC A
0707 77 LD (HL),A
0708 CDC105 CALL WHOLIN ;SHOW STATUS
070B 3E01 LD A,1
070D 329921 LD (NOLPT),A ;DON'T SCRIPT MORE MESSAGE
0710 21E206 LD HL,MORMSG
0713 CD480A CALL MSGOUT
0716 CD3804 CALL CIN
0719 1E0D LD E,0DH
071B 0E06 LD C,CDIO ;CR WITHOUT LF
071D CD0500 CALL BDOS
0720 061F LD B,LMORE
0722 C5 MORE1: PUSH BC
0723 1E20 LD E,20H
0725 0E06 LD C,CDIO
0727 CD0500 CALL BDOS
072A C1 POP BC
072B 05 DEC B
072C C22207 JP NZ,MORE1
072F 1E0D LD E,0DH
0731 0E06 LD C,CDIO
0733 CD0500 CALL BDOS
0736 AF XOR A
0737 329921 LD (NOLPT),A
073A C9 RET ;NOW AT BEGINNING OF CLEAR LINE
073B 110A00 PNTTIM: LD DE,10
073E CD071D CALL HLGEDE
0741 0E30 LD C,'0'
0743 D4B604 CALL NC,COUT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 18
0746 C3791B JP PRNTNC
;ZZZZZZZZZZZZZZZZZZZZZZZZZZZ
0749 213101 QUIT: LD HL,RTRMST
074C CD7E02 CALL PCSTR
074F 0E00 LD C,CRESET
0751 CD0500 CALL BDOS
0754 C34907 JP QUIT
0757 RESTAR:
0757 115C00 LD DE,CPMFCB
075A 0E10 LD C,CLOSE
075C CD0500 CALL BDOS
075F 213101 LD HL,RTRMST
0762 CD7E02 CALL PCSTR
0765 C30001 JP START
0768 SAVE:
0768 AF XOR A
0769 32570C LD (FILTYP),A
076C 115C00 LD DE,CPMFCB
076F 0E10 LD C,CLOSE
0771 CD0500 CALL BDOS
0774 CD6008 CALL SRGFNM
0777 115C00 LD DE,CPMFCB
077A 0E13 LD C,DELETE
077C CD0500 CALL BDOS
077F 115C00 LD DE,CPMFCB
0782 0E16 LD C,MAKEF
0784 CD0500 CALL BDOS
0787 3C INC A
0788 CA2B08 JP Z,SFAIL ;DID NOT OPEN
078B 2ABB21 LD HL,(ZCODEP)
078E 010000 LD BC,ZVERS
0791 09 ADD HL,BC
0792 7E LD A,(HL) ;STORE VERSION NUMBER
0793 328000 LD (CPMBUF),A
0796 2AE90D LD HL,(ZSTAKP)
0799 228100 LD (CPMBUF+1),HL
079C 218300 LD HL,CPMBUF+3
079F 116921 LD DE,SRND
07A2 012900 LD BC,SRNDC ;TO MAKE EXTERNALS WORK
07A5 41 LD B,C
07A6 CD4B03 CALL MOVIT
07A9 115C00 LD DE,CPMFCB
07AC 0E15 LD C,WRITES
07AE CD0500 CALL BDOS
07B1 B7 OR A
07B2 C22B08 JP NZ,SFAIL ;WRITE OUT INITIAL STUFF
07B5 0E04 LD C,0+(((ZSTAKL*2)+127)/128)
07B7 11EB0D LD DE,ZSTACK ;NEXT WRITE OUT STACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 19
07BA 0680 SAVEA: LD B,128
07BC 218000 LD HL,CPMBUF
07BF CD4B03 CALL MOVIT
07C2 C5 PUSH BC
07C3 D5 PUSH DE
07C4 115C00 LD DE,CPMFCB
07C7 0E15 LD C,WRITES
07C9 CD0500 CALL BDOS
07CC B7 OR A
07CD C23E08 JP NZ,SRFAIL
07D0 D1 POP DE
07D1 C1 POP BC
07D2 0D DEC C
07D3 C2BA07 JP NZ,SAVEA
07D6 2ABB21 LD HL,(ZCODEP)
07D9 110E00 LD DE,ZPURBT
07DC 19 ADD HL,DE
07DD 4E LD C,(HL) ;COUNT OF PAGES
07DE 2ABB21 LD HL,(ZCODEP)
07E1 EB EX DE,HL ;WHERE TO START FROM
07E2 0602 LD B,2 ;128 BYTE RECORDS
07E4 C5 SAVE1: PUSH BC
07E5 218000 LD HL,CPMBUF
07E8 0680 LD B,128
07EA CD4B03 CALL MOVIT ;GET NEXT RECORD TO TRANSFER
07ED D5 PUSH DE
07EE 115C00 LD DE,CPMFCB
07F1 0E15 LD C,WRITES ;WRITE IT TO DISK
07F3 CD0500 CALL BDOS
07F6 D1 POP DE
07F7 C1 POP BC
07F8 B7 OR A
07F9 C22B08 JP NZ,SFAIL ;WRITE ERROR
07FC 05 DEC B
07FD C2E407 JP NZ,SAVE1 ;GO DO 2ND HALF OF PAGE
0800 0602 LD B,2 ;RESET FOR 2 RECORDS PER PAGE
0802 0D DEC C ;NEXT PAGE
0803 F2E407 JP P,SAVE1
0806 115C00 SRCLOS: LD DE,CPMFCB ;CLOSE FILE, DONE
0809 0E10 LD C,CLOSE
080B CD0500 CALL BDOS
080E 115C00 LD DE,CPMFCB ;OPEN FILE AGAIN TO FORCE
0811 0E0F LD C,OPEN ;WRITE TO DISK
0813 CD0500 CALL BDOS
0816 115C00 LD DE,CPMFCB ;AND CLOSE AGAIN TO BE SURE
0819 0E0F LD C,OPEN
081B CD0500 CALL BDOS
081E CD2109 CALL SRSWPD ;TELL PLAYER SWAP GAME DISK BACK IN
0821 CDB404 CALL PCRLF
0824 AF XOR A
0825 32B021 LD (ZPCFLG),A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 20
0828 C36213 JP PREDS
082B 115C00 SFAIL: LD DE,CPMFCB
082E 0E10 LD C,CLOSE
0830 CD0500 CALL BDOS
0833 115C00 LD DE,CPMFCB
0836 0E13 LD C,DELETE
0838 CD0500 CALL BDOS
083B C35608 JP SFAIL1
083E 115C00 SRFAIL: LD DE,CPMFCB
0841 0E10 LD C,CLOSE
0843 CD0500 CALL BDOS
0846 115C00 LD DE,CPMFCB ;REOPEN TO FORCE WRITE TO DISK
0849 0E0F LD C,OPEN
084B CD0500 CALL BDOS
084E 115C00 LD DE,CPMFCB ;CLOSE FOR SECURITY
0851 0E10 LD C,CLOSE
0853 CD0500 CALL BDOS
0856 CD2109 SFAIL1: CALL SRSWPD
0859 AF XOR A
085A 32B021 LD (ZPCFLG),A
085D C35313 JP PREDF
0860 21EA09 SRGFNM: LD HL,SRMSG1 ;/LOAD SAVE DISK/
0863 CD480A CALL MSGOUT
0866 0608 LD B,8
0868 21EC02 LD HL,SRDFNM+1 ;FILENAME
086B CDE208 CALL SRGFNA ;DISPLAY CHARS TILL HIT BLANKS
086E 21460A LD HL,SRMSG3
0871 CD480A CALL MSGOUT
0874 0603 LD B,3
0876 21F402 LD HL,SRDFNM+9
0879 CDE208 CALL SRGFNA
087C 21260A LD HL,SRMSG2
087F CD480A CALL MSGOUT
0882 210000 LD HL,0
0885 226800 LD (CPMFCB+12),HL ;CLEAR EX,S1
0888 226A00 LD (CPMFCB+14),HL ; S2,RC
088B AF XOR A
088C 327C00 LD (CPMCR),A ; CR
088F 118000 LD DE,CPMBUF
0892 3E0E LD A,14
0894 12 LD (DE),A
0895 0E0A LD C,CRCBUF ;READ CONSOLE BUFFER
0897 CD0500 CALL BDOS
089A CD7304 CALL PCRLFD
089D 3A8100 LD A,(CPMBUF+1)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 21
08A0 B7 OR A
08A1 CA1609 JP Z,SRGDFN ;USE DEFAULT, SKIP THIS NEXT PART
08A4 060B LD B,11
08A6 21EB02 LD HL,SRDFNM
08A9 23 INC HL ;SKIP OVER DRIVE, LEAVE AS WAS SO PLAYER
08AA ;NEED ONLY SPECIFY IT ONCE
08AA 3620 SRGFM1: LD (HL),20H
08AC 23 INC HL
08AD 05 DEC B
08AE C2AA08 JP NZ,SRGFM1 ;FILL WITH BLANK FILE NAME
08B1 47 LD B,A ;SAVE COUNT OF CHARACTERS
08B2 218200 LD HL,CPMBUF+2 ;BEG OF FILE NAME
08B5 11EC02 LD DE,SRDFNM+1 ;STORAGE FOR FILE NAME
08B8 FE03 CP 3
08BA DACF08 JP C,SRGFN2 ;NO DRIVE SPEC
08BD 3A8300 LD A,(CPMBUF+3)
08C0 FE3A CP ':' ;DRIVE SPEC?
08C2 C2CF08 JP NZ,SRGFN2 ;NONE THIS TIME
08C5 05 DEC B
08C6 05 DEC B
08C7 7E LD A,(HL)
08C8 E60F AND 0FH ;DRIVE NUMBER
08CA 32EB02 LD (SRDFNM),A
08CD 23 INC HL
08CE 23 INC HL ;POINTER PAST DRIVE SPEC
08CF 05 SRGFN2: DEC B
08D0 FA1609 JP M,SRGDFN ;FILE NAME NOW DEFAULT
08D3 7E LD A,(HL)
08D4 CD0309 CALL UPPER
08D7 23 INC HL
08D8 FE2E CP '.'
08DA CA0C09 JP Z,SRGFN3 ;EXTENTION
08DD 12 LD (DE),A
08DE 13 INC DE
08DF C3CF08 JP SRGFN2
08E2 7E SRGFNA: LD A,(HL)
08E3 FE20 CP ' '
08E5 CAFD08 JP Z,SRGFNB
08E8 4F LD C,A
08E9 C5 PUSH BC
08EA D5 PUSH DE
08EB E5 PUSH HL
08EC 5E LD E,(HL)
08ED 0E06 LD C,CDIO
08EF CD0500 CALL BDOS
08F2 E1 POP HL
08F3 E5 PUSH HL
08F4 CD640A CALL MSGCRC ;SEND LF IF NECESSARY
08F7 E1 POP HL
08F8 D1 POP DE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 22
08F9 C1 POP BC
08FA CD9B04 CALL LPCHK
08FD 23 SRGFNB: INC HL
08FE 05 DEC B
08FF C2E208 JP NZ,SRGFNA
0902 C9 RET
0903 FE61 UPPER: CP 'a'
0905 D8 RET C
0906 FE7B CP 'z'+1
0908 D0 RET NC
0909 D620 SUB 'a'-'A'
090B C9 RET
090C 11F402 SRGFN3: LD DE,SRDFNM+9
090F 78 LD A,B
0910 E603 AND 3 ;MAX OF 3 CHARACTERS
0912 47 LD B,A
0913 C3CF08 JP SRGFN2
0916 11EB02 SRGDFN: LD DE,SRDFNM ;DEFAULT FILE NAME
0919 215C00 LD HL,CPMFCB
091C 060C LD B,12
091E C34B03 JP MOVIT
0921 213209 SRSWPD: LD HL,LFILDG
0924 CD480A MSGRES: CALL MSGOUT ;MESSAGE THEN RESPONSE
0927 CD3804 CALL CIN ;WAIT FOR CHARACTER
092A 213009 LD HL,CRMSG
092D C3480A JP MSGOUT
0930 0D00 CRMSG: DB 0DH,0
0932 4C6F6164 LFILDG: DB 'Load Game Disk if it was removed.',0DH
0954 54797065 DB 'Type <ENTER> to continue >',0
096F 4C6F6164 LFILDM: DB 'Load Disk 2, type <ENTER> to continue >',0
0997 4C6F6164 LFILPM: DB 'Load Disk 1, type <ENTER> to continue >',0
09BF 4C6F6164 LFILGM: DB 'Load Game Disk, type <ENTER> to continue >',0
09EA 4C6F6164 SRMSG1: DB 'Load SAVE disk then enter file name.',0DH
0A0F 28646566 DB '(default file name is ',0
0A26 292E0D SRMSG2: DB ').',0DH
0A29 54797065 DB 'Type <ENTER> to continue > ',0
0A46 2E00 SRMSG3: DB '.',0
0A48 4E MSGOUT: LD C,(HL)
0A49 7E LD A,(HL)
0A4A B7 OR A
0A4B C8 RET Z
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 23
0A4C C5 PUSH BC
0A4D D5 PUSH DE
0A4E E5 PUSH HL
0A4F 5E LD E,(HL)
0A50 0E06 LD C,CDIO
0A52 CD0500 CALL BDOS
0A55 E1 POP HL
0A56 E5 PUSH HL
0A57 CD640A CALL MSGCRC
0A5A E1 POP HL
0A5B D1 POP DE
0A5C C1 POP BC
0A5D CD9B04 CALL LPCHK
0A60 23 INC HL
0A61 C3480A JP MSGOUT
0A64 3A0D01 MSGCRC: LD A,(CPMCLF)
0A67 B7 OR A
0A68 C8 RET Z ;NO LF AFTER CR
0A69 7E LD A,(HL)
0A6A FE0D CP 0DH
0A6C C0 RET NZ ;NOT CR
0A6D 1E0A LD E,0AH ;PRINT A LF
0A6F 0E06 LD C,CDIO
0A71 CD0500 CALL BDOS
0A74 C9 RET
0A75 AF RESTOR: XOR A
0A76 32570C LD (FILTYP),A
0A79 115C00 LD DE,CPMFCB
0A7C 0E10 LD C,CLOSE
0A7E CD0500 CALL BDOS
0A81 CD6008 CALL SRGFNM
0A84 115C00 LD DE,CPMFCB
0A87 0E0F LD C,OPEN
0A89 CD0500 CALL BDOS
0A8C 3C INC A
0A8D CA3E08 JP Z,SRFAIL
0A90 115C00 LD DE,CPMFCB
0A93 0E14 LD C,READS
0A95 CD0500 CALL BDOS
0A98 B7 OR A
0A99 C23E08 JP NZ,SRFAIL
0A9C 2ABB21 LD HL,(ZCODEP)
0A9F 110000 LD DE,ZVERS
0AA2 19 ADD HL,DE
0AA3 3A8000 LD A,(CPMBUF)
0AA6 BE CP (HL)
0AA7 C23E08 JP NZ,SRFAIL ;VERSIONS DIFFER
0AAA 2A8100 LD HL,(CPMBUF+1)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 24
0AAD 22E90D LD (ZSTAKP),HL ;STACK POINTER
0AB0 118300 LD DE,CPMBUF+3
0AB3 216921 LD HL,SRND
0AB6 012900 LD BC,SRNDC ;TO MAKE EXTERNALS WORK
0AB9 41 LD B,C
0ABA CD4B03 CALL MOVIT ;RESTORE RANDOM DATA
0ABD 0E03 LD C,0+(((ZSTAKL*2)-1)/128) ;ONE TOO FEW
0ABF 21EB0D LD HL,ZSTACK ;NEXT WRITE OUT STACK
0AC2 C5 RESTA: PUSH BC
0AC3 E5 PUSH HL
0AC4 115C00 LD DE,CPMFCB
0AC7 0E14 LD C,READS
0AC9 CD0500 CALL BDOS
0ACC E1 POP HL
0ACD C1 POP BC
0ACE B7 OR A
0ACF C23E08 JP NZ,SRFAIL
0AD2 118000 LD DE,CPMBUF
0AD5 0680 LD B,128
0AD7 CD4B03 CALL MOVIT
0ADA 0D DEC C
0ADB C2C20A JP NZ,RESTA
0ADE E5 PUSH HL ;READ LAST BLOCK
0ADF 115C00 LD DE,CPMFCB
0AE2 0E14 LD C,READS
0AE4 CD0500 CALL BDOS
0AE7 E1 POP HL
0AE8 B7 OR A
0AE9 C23E08 JP NZ,SRFAIL
0AEC 118000 LD DE,CPMBUF
0AEF 0640 LD B,0+((ZSTAKL*2)-((((ZSTAKL*2)-1)/128)*128))
0AF1 CD4B03 CALL MOVIT
0AF4 2ABB21 LD HL,(ZCODEP)
0AF7 111100 LD DE,ZSCRIP+1
0AFA 19 ADD HL,DE
0AFB 22CA0B LD (SCPLOC),HL ;LOCATION OF SCRIPT FLAG
0AFE 7E LD A,(HL)
0AFF E601 AND 1 ;ISOLATE SCRIPT BIT
0B01 32CC0B LD (SCPVAL),A ;AND SAVE
0B04 2ABB21 LD HL,(ZCODEP)
0B07 110E00 LD DE,ZPURBT
0B0A 19 ADD HL,DE
0B0B 4E LD C,(HL)
0B0C 2ABB21 LD HL,(ZCODEP) ;POINTER TO BEGINNING OF DATA
0B0F 0602 LD B,2 ;128 BYTE RECORDS
0B11 C5 REST1: PUSH BC
0B12 E5 PUSH HL
0B13 115C00 LD DE,CPMFCB
0B16 0E14 LD C,READS
0B18 CD0500 CALL BDOS
0B1B E1 POP HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 25
0B1C C1 POP BC
0B1D B7 OR A
0B1E C25707 JP NZ,RESTAR
0B21 118000 LD DE,CPMBUF
0B24 C5 PUSH BC
0B25 0680 LD B,128
0B27 CD4B03 CALL MOVIT
0B2A C1 POP BC
0B2B 05 DEC B
0B2C C2110B JP NZ,REST1
0B2F 0602 LD B,2
0B31 0D DEC C
0B32 F2110B JP P,REST1
0B35 2ACA0B LD HL,(SCPLOC)
0B38 7E LD A,(HL)
0B39 E6FE AND 0FEH ;CLEAR SCRIPT BIT
0B3B E5 PUSH HL
0B3C 21CC0B LD HL,SCPVAL
0B3F B6 OR (HL) ;OR IN VALUE FROM MEMORY
0B40 E1 POP HL
0B41 77 LD (HL),A
0B42 C30608 JP SRCLOS ;ALL DONE
0B45 F5 LFILS: PUSH AF
0B46 3A570C LD A,(FILTYP)
0B49 FE03 CP 3 ;.DAT FILE ALREADY OPEN?
0B4B CAB50B JP Z,LFILR ; YES. RETURN.
0B4E B7 OR A ; NO. SOME OTHER TYPE OPEN?
0B4F C2B50B JP NZ,LFILR ; YES. RETURN.
0B52 11C702 LFILS1: LD DE,FNDAT ; NO. ^ DATA FILE NAME
0B55 3E03 LD A,3 ;OPEN TYPE 3
0B57 CD1B02 CALL OPNDK1 ;TRY TO OPEN FILE
0B5A C2B50B JP NZ,LFILR ;OPEN .DAT FILE COMPLETE?
0B5D ;YES. RETURN.
0B5D 3AB501 LD A,(TWODSK) ;CHECK IF STORY ON 2 DISKS
0B60 FE01 CP 1
0B62 CA6E0B JP Z,LFILF ;IF 1, 2 DISKS
0B65 21BF09 LD HL,LFILGM ;ASK FOR DISK
0B68 CD2409 CALL MSGRES
0B6B C3520B JP LFILS1 ;TRY AGAIN
0B6E AF LFILF: XOR A ; NO. SET FILTYP=0
0B6F 32570C LD (FILTYP),A ;OPEN FAILED TRY OTHER TYPE
0B72 C3B50B JP LFILR
0B75 F5 LFILD: PUSH AF
0B76 3A570C LD A,(FILTYP)
0B79 FE02 CP 2 ;.PUR FILE ALREADY OPEN?
0B7B CAB50B JP Z,LFILR ; YES.ALREADY OPEN
0B7E CDB70B CALL LFILC ;CLOSE EXISTING FILE IF ANY
0B81 11D302 LFILD1: LD DE,FNPUR
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 26
0B84 3E02 LD A,2
0B86 CD1B02 CALL OPNDK1 ;TRY TO OPEN PURELOAD FILE
0B89 C2B50B JP NZ,LFILR ;OPEN OK
0B8C 216F09 LD HL,LFILDM
0B8F CD2409 CALL MSGRES ;ASK TO LOAD DISK
0B92 C3810B JP LFILD1 ;TRY AGAIN
0B95 F5 LFILP: PUSH AF
0B96 3A570C LD A,(FILTYP)
0B99 FE01 CP 1 ;PRELOAD TYPE?
0B9B CAB50B JP Z,LFILR ;OPEN
0B9E CDB70B CALL LFILC
0BA1 11DF02 LFILP1: LD DE,FNPRE
0BA4 3E01 LD A,1
0BA6 CD1B02 CALL OPNDK1
0BA9 C2B50B JP NZ,LFILR ;OPEN OK
0BAC 219709 LD HL,LFILPM
0BAF CD2409 CALL MSGRES ;LOAD PROPER DISK
0BB2 C3A10B JP LFILP1
0BB5 F1 LFILR: POP AF
0BB6 C9 RET
0BB7 B7 LFILC: OR A
0BB8 C8 RET Z ;NONE OPEN
0BB9 115C00 LD DE,CPMFCB
0BBC 0E10 LD C,CLOSE
0BBE CD0500 CALL BDOS
0BC1 AF XOR A
0BC2 32570C LD (FILTYP),A
0BC5 C9 RET
;DATA
0BC6 00 STAFLG: DB 0 ;0FFH WHEN IN STATUS LINE MODE
0BC7 00 COUTDC: DB 0 ;CHARACTER COUNT UNDER STATUS LINE
0BC8 00 RDFLG: DB 0 ;0 FOR FIRST READ
0BC9 00 PRFLG: DB 0 ;0 FOR FIRST PRINT
0BCA 0000 SCPLOC: DW 0 ;SCRIPT LOCATION
0BCC 00 SCPVAL: DB 0 ;SCRIPT VALUE
0BCD 0000 DBUFP: DW 0 ;DSK POINTER
0BCF 00 NCHARS: DB 0
0BD0 CHARS: DS CPLMAX
0C55 D00B CHRPNT: DW CHARS
0C57 00 FILTYP: DB 0 ;0 FOR NONE, 1 FOR PRE, 2 FOR PUR, 3 FOR DAT
0C58 17 MORCNT: DB 23
;(PUT IN CODE SEGMENT TO PRESERVE COMMON ZORKBODY)
0C59 PDL: DS LPDL ;CONTROL STACK
0DE9 AB0F ZSTAKP: DW ZSTACK+(2*ZSTAKL) ;POINTER TO CURRENT ZSTACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 27
0DEB ZSTACK: DS ZSTAKL*2 ;ZSTACK
0FAB PGTBL: DS MAXPGS ;PAGE NUMBER, 0 ALWAYS IN MEMORY, THUS 0=FREE
0FEB PGTBLF: DS MAXPGS ;NEXT LINK POINTER, 0FFH IMPLIES END POINT
102B PGTBLB: DS MAXPGS ;PREVIOUS LINK POINTER
0040 PGTFD EQU PGTBLF-PGTBL
0080 PGTBD EQU PGTBLB-PGTBL
106B 0D555044 VRS: DB 0DH,'UPDATED 2.5.85',0DH,0
107C 0D564552 VRLINE: DB 0DH,'VERSION C',0DH,0
;
; **********************************************************************
; * *
; * WARMSTART ENTRY *
; * *
; **********************************************************************
;
;
; MAIN BODY OF CODE STARTS HERE.
;
1088 AF BODY: XOR A
1089 32B021 LD (ZPCFLG),A ;DISABLE TIME IN STATUS LINE, NO SPLIT FILE, NOT TANDY
108C 32B721 LD (MPCFLG),A ;NO VALID MEMORY IN FROM DISK (MPCPNT NOT VALID)
108F 32BE21 LD (PGTOP),A ;SET TOP OF LIST PAGE
1092 0E19 LD C,RETCUR ;GET CURRENT DEFAULT DRIVE
1094 CD0500 CALL BDOS ;RETS IN A
1097 5F LD E,A ;SET DEFAULT DRIVE
1098 0E0E LD C,CPMSEL ;THIS SEEMS REDUNDENT BUT THE MACHINE IS NOT
109A CD0500 CALL BDOS ;RECOGNIZING RESETS FROM BOOT DRIVE DONE BEFORE
109D ;STARTING THE GAME
;
; INITIALIZE ZSTACK
;
109D 3E01 LD A,1
109F 328A21 LD (ZSTAKC),A ;INITIALIZE ZSTACK POSITION COUNTER
10A2 21AB0F LD HL,ZSTACK+(2*ZSTAKL)
10A5 22E90D LD (ZSTAKP),HL ;SAVE THE LOCATION OF THE BOTTOM OF ZSTACK IN
; ZSTACK POINTER
;
; INITIALIZE PAGE TABLES
;
10A8 11AB0F LD DE,PGTBL ;DE ^ TOP OF PAGE TABLE
10AB 010040 LD BC,0+(MAXPGS*256) ;FOR NUMBER OF PAGES (IN B)
;
10AE START1:
; INITIALIZE PGTBL
10AE AF XOR A
10AF 12 LD (DE),A ;(PGTBL+PAGE NUMBER) <= 0
; FREE THE PAGE (NO PAGE IN MEMORY)
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 28
10B0 214000 LD HL,PGTFD ;HL <= MAXIMUM NUMBER OF PAGES
; USED AS AN OFFSET INTO PGTBLF
;
; INITIALIZE FOWARD POINTER
10B3 19 ADD HL,DE ;HL ^ PAGE FORWARD POINTER TABLE SLOT
10B4 71 LD (HL),C ;SAVE CURRENT POINTER
10B5 34 INC (HL) ;ADD 1 TO MAKE IT A FORWARD POINTER
;
; INITIALIZE PREVIOUS POINTER
10B6 218000 LD HL,PGTBD ;HL ^ PAGE PREVIOUS POINTER TABLE BASE ADDRESS
10B9 19 ADD HL,DE ;ADD OFFSET
10BA 71 LD (HL),C ;SAVE CURRENT POINTER
10BB 35 DEC (HL) ;SUBTRACT 1 TO MAKE IT A PREVIOUS POINTER
;
; UPDATE
10BC 0C INC C ;NEXT PAGE
10BD 13 INC DE ;NEXT SLOT IN TABLES
;
; TEST LOOP FOR DONE
10BE 05 DEC B ;DECREMENT NUMBER OF SLOTS REMAINING
10BF C2AE10 JP NZ,START1 ;>0? YES. CONTINUE LOOPING.
;
; CORRECT FOR NO FORWARD POINTER FOR LAST PAGE
;
10C2 213F00 LD HL,PGTFD-1
10C5 19 ADD HL,DE
10C6 36FF LD (HL),0FFH
;
; SET BOTTOM PAGE NO.
;
10C8 3E3F LD A,MAXPGS-1
10CA 32BF21 LD (PGBOT),A
;
; COMPUTE ZCODE STARTING ADDRESSS
;
10CD 21CD21 LD HL,LMEMRY ;POINT HL PAST ZIP
10D0 11FF00 LD DE,0FFH ;ADJUST ADDRESS TO A PAGE BOUNDRY
10D3 19 ADD HL,DE
10D4 2E00 LD L,0
10D6 22BB21 LD (ZCODEP),HL ;SAVE ZCODE STARTING ADDRESS
;
; SET UP FILE NAMES FOR DAT, PRE, PUR AND SAV
;
10D9 CDAA02 CALL SETFIL ;APPEND GAME NAME PREFIX TO FILE NAME EXTENSIONS
;
; RESET FILE TYPE
;
10DC AF XOR A ;RESET FILTYP
10DD 32570C LD (FILTYP),A
;
; INITIALIZE TERMINAL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 29
;
10E0 211001 LD HL,ITRMST ;POINT TO TERMINAL INITIALIZATION STRING
10E3 CD7E02 CALL PCSTR ; FOR HOME, CLEAR SCREEN AND PRINT IT
;
; INITIALIZE TERMINAL RELATED COUNTERS
;
10E6 3A0401 LD A,(CPMLPP) ;INITIALIZE LINES/PAGE (EXCLUDING STATUS LINE)
10E9 3D DEC A ;COUNTER (MORCNT) =(CPMLPP)-1
10EA 32580C LD (MORCNT),A ; WHICH TELLS THE PROGRAM WHEN TO PRINT ....MORE....
10ED AF XOR A ;A<=0
10EE 32CF0B LD (NCHARS),A ;RESET (NCHARS)
10F1 21D00B LD HL,CHARS ;SET UP CHARACTERS/LINE
10F4 22550C LD (CHRPNT),HL
;
; GET THE FIRST SECTOR OF ZCODE
;
10F7 2ABB21 LD HL,(ZCODEP) ;^ TOP OF ZCODE BUFFER
10FA AF XOR A
10FB CDF702 CALL GETDSK ;READ IN FIRST SECTION
;
; EXTRACT GAME DATA FROM ZCODE HEADER
;
10FE 2ABB21 LD HL,(ZCODEP) ;HL ^ TOP OF ZCODE BUFFER
1101 110400 LD DE,ZENDLD ;DE <= OFFSET TO NON-PRELOADED ZCODE
1104 19 ADD HL,DE ;HL ^ START OF NON-PRELOADED ZCODE
1105 56 LD D,(HL) ;GET MSB OF ENDLOAD POINTER
1106 23 INC HL ; ADD 1
1107 5E LD E,(HL) ;GET LSB OF ENDLOAD POINTER
1108 210002 LD HL,200H ;HL <= 256
110B 19 ADD HL,DE ;HL <= ENDLOAD POINTER + 200H
110C 7C LD A,H ;A <= MSB
110D E6FE AND 0FEH ;
110F 67 LD H,A ;
1110 2E00 LD L,0 ;
1112 2B DEC HL ;ALL THIS TO GET TO BLOCK BOUNDRY
1113 EB EX DE,HL ;DE <= CORRECTED ENDLOAD POINTER
1114 010400 LD BC,ZENDLD ;BC <= OFFSET TO NON-PRELOADED ZCODE
1117 2ABB21 LD HL,(ZCODEP) ;HL ^ TOP OF ZCODE BUFFER
111A 09 ADD HL,BC ;HL ^ START OF NON-PRELOADED ZCODE
111B 72 LD (HL),D ;SAVE MSB OF CORRECTED ENDLOAD POINTER
111C 23 INC HL
111D 73 LD (HL),E ;SAVE LSB OF CORRECTED ENDLOAD POINTER
111E 2ABB21 LD HL,(ZCODEP) ;HL ^ TOP OF ZCODE BUFFER
1121 D5 PUSH DE ;SAVE CORRECTED ENDLOAD POINTER ON STACK
1122 19 ADD HL,DE ;HL ^ END OF PRELOAD
1123 EB EX DE,HL ;DE ^ END OF PRELOAD
1124 CD0902 CALL MEMTOP ;DETERMINE WHERE THE TOP OF MEMORY IS (IN HL)
1127 EB EX DE,HL ;DE <= TOP OF MEMORY, HL <= END OF THE PRELOAD
1128 CD071D CALL HLGEDE ;CARRY FLAG SET IF HL G.E. DE
112B D1 POP DE ;RESTORE CORRECTED ENDLOAD POINTER
112C DC0602 CALL C,ZER ;NO ROOM FOR ANY BUFFERS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 30
112F 7A LD A,D
1130 0F RRCA
1131 E67F AND 7FH
1133 57 LD D,A ;NUMBER OF PAGES IN REST OF THE PRELOAD
1134 3C INC A
1135 329B21 LD (ZMEMT),A ;PAGE NUMBER
1138 2ABB21 LD HL,(ZCODEP) ;^ START OF ZCODE BUFFER
113B 010002 LD BC,200H
113E 1E00 LD E,0
;
; LOAD PRELOAD
;
1140 7A START2: LD A,D ;A <= PAGES REMAINING TO BE LOADED
1141 B7 OR A ;DONE?
1142 CA5511 JP Z,START3 ; YES.
1145 15 DEC D
1146 09 ADD HL,BC
1147 1C INC E
1148 7B LD A,E
1149 C5 PUSH BC
114A D5 PUSH DE
114B E5 PUSH HL
114C CDF702 CALL GETDSK
114F E1 POP HL
1150 D1 POP DE
1151 C1 POP BC
1152 C34011 JP START2
1155 2ABB21 START3: LD HL,(ZCODEP)
1158 EB EX DE,HL
1159 210100 LD HL,ZSWAP
115C 19 ADD HL,DE
115D 7E LD A,(HL)
115E E601 AND 1
1160 C40602 CALL NZ,ZER ;SWAPPED
1163 210700 LD HL,ZSTART+1
1166 19 ADD HL,DE
1167 7E LD A,(HL)
1168 328821 LD (ZPCL),A
116B 2B DEC HL
116C 7E LD A,(HL)
116D E601 AND 1
116F 328921 LD (ZPCL+1),A
1172 7E LD A,(HL)
1173 0F RRCA
1174 E67F AND 7FH
1176 328721 LD (ZPCH),A
1179 210C00 LD HL,ZGLOBA
117C 19 ADD HL,DE ;GET RELATIVE ADDRESS OF GLOBAL TABLE
117D D5 PUSH DE
117E 56 LD D,(HL)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 31
117F 23 INC HL
1180 5E LD E,(HL)
1181 EB EX DE,HL
1182 D1 POP DE
1183 19 ADD HL,DE ;REAL ADDRESS OF GLOBAL TABLE
1184 22A721 LD (GLOBAL),HL ;STORE IT
1187 211800 LD HL,ZFWORD
118A 19 ADD HL,DE ;GET RELATIVE ADDRESS OF FWORDS TABLE
118B D5 PUSH DE
118C 56 LD D,(HL)
118D 23 INC HL
118E 5E LD E,(HL)
118F EB EX DE,HL
1190 D1 POP DE
1191 19 ADD HL,DE ;REAL ADDRESS OF FWORDS TABLE
1192 22AA21 LD (FWORDS),HL ;STORE IT
1195 210400 LD HL,ZENDLD ;CALCULATE ^ TO BEGINNING OF PAGE BUFFERS
1198 19 ADD HL,DE
1199 D5 PUSH DE
119A 56 LD D,(HL)
119B 23 INC HL
119C 5E LD E,(HL)
119D E1 POP HL
119E 19 ADD HL,DE
119F 23 INC HL
11A0 22B921 LD (PGBUFP),HL ;STORE IT
11A3 2B DEC HL ;CALCULATE NO. OF AVAILABLE PAGES
11A4 EB EX DE,HL ;TOP LOCATION
11A5 CD0902 CALL MEMTOP
11A8 7C LD A,H
11A9 92 SUB D
11AA 0F RRCA
11AB E67F AND 7FH ;SWAPPING SPACE
11AD FE40 CP MAXPGS
11AF DAB411 JP C,STAR3A
11B2 3E40 LD A,MAXPGS
11B4 32BD21 STAR3A: LD (NPGS),A ;SAVE NUMBER OF PAGES
11B7 3D DEC A
11B8 32BF21 LD (PGBOT),A
11BB 21EB0F LD HL,PGTBLF
11BE CDEA1E CALL HLOFF
11C1 36FF LD (HL),0FFH ;SET LAST PAGE
;
; INITIALIZE RANDOM NUMBER
;
11C3 0605 LD B,5
11C5 21FFFF LD HL,0FFFFH
11C8 228E21 LD (SHIFT),HL
11CB 229021 LD (SHIFT+2),HL
11CE 21C80B LD HL,RDFLG ;ET FLAG TO 1ST READ
11D1 3600 LD (HL),0
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 32
11D3 CDD01B START4: CALL RND
11D6 05 DEC B
11D7 C2D311 JP NZ,START4
;
;
;
11DA AF XOR A
11DB 329921 LD (NOLPT),A ;USE LPT
11DE 2ABB21 LD HL,(ZCODEP)
11E1 110100 LD DE,ZSWAP
11E4 19 ADD HL,DE
11E5 7E LD A,(HL)
11E6 47 LD B,A
11E7 3A5201 LD A,(BSTLIN) ;IS THERE A STATUS LINE?
11EA B7 OR A
11EB 78 LD A,B
11EC C2F111 JP NZ,START5
11EF F610 OR ZSTATB ;INDICATE NO STATUS LINE
11F1 77 START5: LD (HL),A
; JP MLOOP ;COMMENTED OUT FOR FALL THROUGH
;
; **********************************************************************
; * *
; * MAINLOOP *
; * *
; **********************************************************************
;
;
;MAIN LOOP, READ AN INSTRUCTION AND ITS ARGS, THEN DISPATCH
11F2 AF MLOOP: XOR A
11F3 32A521 LD (ARGCNT),A ;ZERO ARG COUNT
11F6 CD3C1D CALL NEXTPC ;GET NEXT OPCODE IN A
11F9 32A621 LD (OPCODE),A ;SAVE IT
11FC FE80 CP 128
11FE DA9812 JP C,OP2 ;2-OP
1201 FEB0 CP 176
1203 DA6F12 JP C,OP1 ;1-OP
1206 FEC0 CP 192
1208 DA6212 JP C,OP0 ;0-OP
;
; HANDLE AN X-OP
;
120B CD3C1D OPEXT: CALL NEXTPC ;GET VAR TYPES, THIS IS AN EXT OP
120E 119D21 LD DE,ARG1
1211 0604 LD B,4 ;MAX NUMBER OF ARGS
1213 4F LD C,A
1214 C5 OPEXTL: PUSH BC
1215 D5 PUSH DE
1216 79 LD A,C
1217 E6C0 AND 0C0H ;ISOLATE BIT7, BIT6 TO DETERMINE ARG TYPE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 33
1219 CCCF12 CALL Z,GETLNG ;00=LONG IMMEDIATE
121C FE80 CP 80H
121E CCDC12 CALL Z,GETVAR ;10=VARIABLE
1221 FE40 CP 40H
1223 CCC612 CALL Z,GETSHT ;01=SHORT IMMEDIATE
1226 D1 POP DE
1227 C1 POP BC
1228 FEC0 CP 0C0H ;11=NO MORE VARIABLES
122A CA3F12 JP Z,OPEXTF ;ALL DONE?
122D EB EX DE,HL ;NO. STORE VALUE
122E 73 LD (HL),E
122F 23 INC HL
1230 72 LD (HL),D
1231 23 INC HL
1232 EB EX DE,HL ;POINTER BACK IN DE
1233 21A521 LD HL,ARGCNT
1236 34 INC (HL) ;ONE MORE ARG
1237 79 LD A,C
1238 07 RLCA
1239 07 RLCA ;GET TO NEXT ARG TYPE
123A 4F LD C,A
123B 05 DEC B ;DECREMENT ARG COUNT
123C C21412 JP NZ,OPEXTL ;LOOP FOR MORE
;
; DISPATCH THE X-OP
;
123F 214414 OPEXTF: LD HL,OPEXTT ;COMPUTE DISPATCH POINTER
1242 3AA621 LD A,(OPCODE) ;RETRIEVE THE OPCODE
1245 FEE0 CP 224 ;IS IT AN EXTENDED 2-OP?
1247 DAB912 JP C,OP2EX ; YES.
124A D6E0 SUB 224 ; NO.
124C FE0A CP OPEXTM ;IS IT A LEGAL X-OP?
124E D2A115 JP NC,BADOP ; NO.
;
; GENERALIZED DISPATCH
;
1251 OPDSPH:
1251 87 ADD A,A ;FORM A WORD OFFSET (*2)
1252 4F LD C,A ;PUT OFFSET INTO BC
1253 0600 LD B,0
1255 09 ADD HL,BC ;ADD OFFSET TO DISPATCH POINTER
1256 5E LD E,(HL) ;ADDRESS LSB
1257 23 INC HL
1258 56 LD D,(HL) ;ADDRESS MSB
1259 2A9D21 LD HL,(ARG1) ;FIRST ARG
125C EB EX DE,HL ;HL ^ TABLE ADDRESS OF ROUTINE
; DE <= FIRST ARG
125D 3AA521 LD A,(ARGCNT) ;B <= ARG COUNT
1260 47 LD B,A
1261 E9 JP (HL) ;GO TO IT
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 34
; HANDLE A 0-OP
;
1262 D6B0 OP0: SUB 176 ;ADJUST VALUE
1264 FE0E CP OP0M ;IS IT A LEGAL 0-OP?
1266 D2A115 JP NC,BADOP ; NO.
1269 21D613 LD HL,OP0T ; YES. HL ^ 0-OP TABLE
126C C35112 JP OPDSPH ;DISPATCH IT
;
; HANDLE A 1-OP
;
126F E630 OP1: AND 30H ;1 OP, ISOLATE BITS 5,4
1271 CCCF12 CALL Z,GETLNG ;00=LONG IMMEDIATE
1274 FE10 CP 10H
1276 CCC612 CALL Z,GETSHT ;01=SHORT IMMEDIATE
1279 FE20 CP 20H
127B CCDC12 CALL Z,GETVAR ;10=VARIABLE
127E 3E01 LD A,1
1280 32A521 LD (ARGCNT),A ;1 ARG
1283 229D21 LD (ARG1),HL ;STORE IT
1286 3AA621 LD A,(OPCODE) ;RESTORE OPCODE
1289 E6CF AND 0CFH ;(NOT 30H) TURN OFF MODE BITS
128B D680 SUB 128 ;ADJUST VALUE
128D FE10 CP OP1M ;LEGAL 1-OP?
128F D2A115 JP NC,BADOP ; NO.
1292 21F213 LD HL,OP1T ; YES. HL ^ 1-OP TABLE
1295 C35112 JP OPDSPH ;DISPATCH IT
;
; HANDLE A 2-OP
;
1298 E640 OP2: AND 40H ;ISOLATE 1ST. ARG BIT
129A C4DC12 CALL NZ,GETVAR ;1=VARIABLE
129D CCC612 CALL Z,GETSHT ;0=SHORT IMMEDIATE
12A0 229D21 LD (ARG1),HL ;STORE ARG1
12A3 3AA621 LD A,(OPCODE) ;RESTORE OPCODE
12A6 E620 AND 20H ;ISOLATE 2ND. ARG BIT
12A8 C4DC12 CALL NZ,GETVAR ;1=VARIABLE
12AB CCC612 CALL Z,GETSHT ;2=SHORT IMMEDIATE
12AE 229F21 LD (ARG2),HL ;STORE ARG 2
12B1 3E02 LD A,2
12B3 32A521 LD (ARGCNT),A ;TWO ARGS
12B6 3AA621 LD A,(OPCODE) ;RESTORE OPCODE
12B9 E61F OP2EX: AND 1FH ;(NOT 0E0H) TURN OFF MODE BITS
12BB FE19 CP OP2M ;LEGAL 2-OP?
12BD D2A115 JP NC,BADOP ; NO.
12C0 211214 LD HL,OP2T ; YES. HL ^ 2-OP TABLE
12C3 C35112 JP OPDSPH ;DISPATCH IT
;
;*************************************
;* OPCODE ARGUMENT FETCH SUBROUTINES *
;*************************************
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 35
; -----------------------
; FETCH A SHORT IMMEDIATE
; -----------------------
12C6 F5 GETSHT: PUSH AF ;SAVE OPCODE
12C7 CD3C1D CALL NEXTPC ;GET NEXT ZBYTE
12CA 6F LD L,A ;MAKING IT THE LSB OF ARGUMENT
12CB 2600 LD H,0 ;MSB IS 0
12CD F1 POP AF ;RESTORE OPCODE
12CE C9 RET
; ----------------------
; FETCH A LONG IMMEDIATE
; ----------------------
12CF F5 GETLNG: PUSH AF ;SAVE OPCODE
12D0 CD3C1D CALL NEXTPC ;GET NEXT ZBYTE
12D3 67 LD H,A ;MAKING IT THE MSB OF ARGUMENT
12D4 E5 PUSH HL ;SAVE IT ON THE STACK
12D5 CD3C1D CALL NEXTPC ;GET NEXT ZBYTE
12D8 E1 POP HL ;RESTORE MSB OF ARGUMENT
12D9 6F LD L,A ;AND FILL IN LSB OF ARGUMENT
12DA F1 POP AF ;RESTORE OPCODE
12DB C9 RET
; ----------------
; FETCH A VARIABLE
; ----------------
12DC F5 GETVAR: PUSH AF ;GET VAR, FIRST FIND TYPE
12DD CD3C1D CALL NEXTPC
12E0 B7 OR A
12E1 CA0413 JP Z,GETVRS ;FROM STACK
12E4 FE10 GETVR1: CP 16
12E6 D2F812 JP NC,GETVRG ;GLOBAL
12E9 3D GETVRL: DEC A ;LOCAL
12EA 87 ADD A,A
12EB 5F LD E,A
12EC 1600 LD D,0
12EE 216921 LD HL,LOCALS
12F1 19 GETVL1: ADD HL,DE ;POINTER TO VARIABLE
12F2 56 LD D,(HL)
12F3 23 INC HL
12F4 5E LD E,(HL)
12F5 EB EX DE,HL ;RETURN VALUE IN HL
12F6 F1 POP AF
12F7 C9 RET
;
12F8 D610 GETVRG: SUB 16
12FA 5F LD E,A ;GET GLOBAL
12FB 1600 LD D,0
12FD 2AA721 LD HL,(GLOBAL)
1300 19 ADD HL,DE ;PRE ADD SO IT GETS DONE TWICE
1301 C3F112 JP GETVL1
;
1304 CD271D GETVRS: CALL POPSTK ;VAR FROM STACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 36
1307 F1 POP AF
1308 C9 RET
;
;*********************
;* MISC. SUBROUTINES *
;*********************
1309 AF RET0: XOR A ;RETURN 0
130A 6F PUTBYT: LD L,A
130B 2600 LD H,0
130D CD1313 PUTVAL: CALL PUTVLC ;STORE VALUE
1310 C3F211 JP MLOOP
;
1313 E5 PUTVLC: PUSH HL ;SAVE VALUE
1314 CD3C1D CALL NEXTPC ;GET TYPE
1317 E1 POP HL
1318 B7 PUTVR1: OR A
1319 CA0E1D JP Z,PSHSTK ;SAVE ON STACK AND RETURN
131C EB EX DE,HL ;VALUE IN DE
131D FE10 CP 16
131F D22F13 JP NC,PUTVLG ;GLOBAL
1322 3D PUTVLL: DEC A ;LOCAL
1323 87 ADD A,A
1324 4F LD C,A
1325 0600 LD B,0
1327 216921 LD HL,LOCALS
132A 09 PUTVL1: ADD HL,BC ;COMPUTE ADDRESS
132B 72 LD (HL),D
132C 23 INC HL
132D 73 LD (HL),E
132E C9 RET
;
132F D610 PUTVLG: SUB 16
1331 4F LD C,A ;STORE GLOBAL
1332 0600 LD B,0
1334 2AA721 LD HL,(GLOBAL) ;GLOBAL POINTER
1337 09 ADD HL,BC ;PRE ADD
1338 C32A13 JP PUTVL1
;
;*********************
;* DATA MANIPULATION *
;*********************
;
; -----------------
; RECALL A VARIABLE
; -----------------
133B F5 VARGET: PUSH AF ;SAVE OPCODE
133C B7 OR A ;IF NON-ZERO
133D C2E412 JP NZ,GETVR1 ; THEN GET A VARIABLE FROM LOCAL OR GLOBAL TABLE
; ELSE TAKE VAR OFF STACK
1340 F1 VARGTS: POP AF ;RESTORE OPCODE
1341 CD271D CALL POPSTK ;POP A WORD FROM ZSTACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 37
1344 C30E1D JP PSHSTK ;PUT IT BACK AND RETURN THE VALUE IN HL
; ----------------
; STORE A VARIABLE
; ----------------
1347 B7 VARPUT: OR A ;IF NON-ZERO
1348 C21813 JP NZ,PUTVR1 ; THEN PUT A VARIABLE IN LOCAL OR GLOBAL TABLE
; ELSE REPLACE A WORD ON Z-STACK
134B E5 VARPTS: PUSH HL ;SAVE NEW VALUE
134C CD271D CALL POPSTK ;POP OLD WORD OFF Z-STACK
134F E1 POP HL ;RESTORE NEW VALUE
1350 C30E1D JP PSHSTK ;AND PUSH IT ON TOP OF ZSTACK
;
;************************
;* PREDICATE PROCESSING *
;************************
;
; ---------------
; PREDICATE FAILS
; ---------------
1353 CD3C1D PREDF: CALL NEXTPC ;FETCH NEXT BYTE OF ZCODE
1356 B7 OR A
1357 F26913 JP P,PREDB ;BRANCH IF < 128
135A E640 PREDNB: AND 40H ;CHECK FOR MULTI BYTE HACK
135C CC3C1D CALL Z,NEXTPC ;GET NEXT BYTE IF SO
135F C3F211 JP MLOOP ;CONTINUE IN SEQUENCE
; ------------------
; PREDICATE SUCCEEDS
; ------------------
1362 CD3C1D PREDS: CALL NEXTPC ;FETCH NEXT BYTE OF ZCODE
1365 B7 OR A ;IF BIT 7 IS NOT SET
1366 F25A13 JP P,PREDNB ;BRANCH ON PREDICATE FAILURE
; ELSE FALL THROUGH TO PREDB
; ----------------
; PERFORM A BRANCH
; ----------------
1369 47 PREDB: LD B,A ;SAVE OPCODE
136A E640 AND 40H ;LONG BRANCH?
136C CA7813 JP Z,PREDLB ; YES. (BIT 6 WAS OFF)
; NO. SHORT BRANCH
136F 78 LD A,B ;RESTORE OPCODE
1370 E63F AND 3FH ;FORM SHORT OFFSET
1372 4F LD C,A ;USE AS LSB OF BRANCH OFFSET
1373 0600 LD B,0 ;ZERO MSB OF OFFSET
1375 C38C13 JP PREDB1 ;SIMULATE LONG BRANCH TO A CLOSE PLACE
;
; HANDLE A LONG BRANCH
1378 78 PREDLB: LD A,B ;RESTORE OPCODE
1379 E63F AND 3FH ;FORM MSB OF OFFSET
137B 47 LD B,A ;B <= MSB OF OFFSET
137C C5 PUSH BC
137D CD3C1D CALL NEXTPC ;GET SECOND BYTE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 38
1380 C1 POP BC
1381 4F LD C,A ;C <= LSB OF OFFSET
1382 78 LD A,B ;A <= MSB OF OFFSET
1383 E620 AND 20H ;CHECK SIGN OF 14 BIT VALUE
1385 CA8C13 JP Z,PREDB1 ;POSITIVE
1388 78 LD A,B ;ELSE EXTEND THE SIGN (A <= MSB)
1389 F6C0 OR 0C0H ;AND MAKE THE FULL WORD NEG
138B 47 LD B,A ;SAVE THE RESULT IN B
;
; BRANCH TO THE Z-ADDRESS AT $(ZPC) + OFFSET (IN BC)
; (ZPC RELATIVE ADDRESSING)
138C 78 PREDB1: LD A,B
138D B1 OR C ;IS OFFSET=0?
138E CA6114 JP Z,RFALSE ; YES. DO AN RFALSE
1391 0B DEC BC
1392 78 LD A,B
1393 B1 OR C ;WAS OFFSET=1
1394 CA5814 JP Z,RTRUE ; YES. DO AN RTRUE
1397 0B PREDB3: DEC BC ;2 NOW SUBTRACTED FROM JUMP ADDRESS
1398 60 LD H,B ;HL <= JUMP ADDRESS
1399 69 LD L,C
139A 22AC21 LD (ZPCOFF),HL ;ZPCOFF <= JUMP ADDRESS
139D 2A8821 LD HL,(ZPCL) ;HL <= LOW ORDER 9 BITS OF ZIP PROGRAM COUNTER
13A0 59 LD E,C ;E <= LSB OF JUMP ADDRESS
13A1 78 LD A,B ;A <= MSB OF JUMP ADDRESS
13A2 E601 AND 1
13A4 57 LD D,A ;ZPCL ADDER
13A5 78 LD A,B ;ARITHMETICALLY SHIFT B RIGHT 1
13A6 07 RLCA ;FIRST SET CARRY
13A7 78 LD A,B
13A8 1F RRA
13A9 47 LD B,A ;CUTE
13AA 19 ADD HL,DE
13AB 7C LD A,H
13AC E602 AND 2
13AE CAB413 JP Z,PREDB2 ;NO OVERFLOW
13B1 25 DEC H
13B2 25 DEC H ;OVERFLOW
13B3 04 INC B
13B4 228821 PREDB2: LD (ZPCL),HL ;STORE LOW BYTES
13B7 218721 LD HL,ZPCH ;MODIFY UPPER
13BA 78 LD A,B
13BB B7 OR A
13BC CAC813 JP Z,PREDB4 ;NO CHANGE IN PACE, DO FASTER JUMP
13BF 86 ADD A,(HL)
13C0 77 LD (HL),A
13C1 AF XOR A
13C2 32B021 LD (ZPCFLG),A ;CHANGED PAGES
13C5 C3F211 JP MLOOP ;FINISHED
;
13C8 2AAE21 PREDB4: LD HL,(ZPCPNT)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 39
13CB EB EX DE,HL
13CC 2AAC21 LD HL,(ZPCOFF)
13CF 19 ADD HL,DE ;CALCULATE NEW PC POINTER
13D0 22AE21 LD (ZPCPNT),HL
13D3 C3F211 JP MLOOP
;
; **********************************************************************
; * *
; * OPCODE PROCESSING SECTION *
; * *
; **********************************************************************
;
; ****************************
; * DISPATCH TABLES *
; ****************************
;
; -----
; 0-OPS
; -----
13D6 5814 OP0T: DW RTRUE ;0
13D8 6114 DW RFALSE ;1
13DA 6714 DW PRINTI ;2
13DC 9914 DW PRINTR ;3
13DE A214 DW ZNOP ;4
13E0 A514 DW ZSAVE ;5
13E2 A814 DW ZRSTOR ;6
13E4 AB14 DW ZRSTAR ;7
13E6 AE14 DW RSTACK ;8
13E8 B714 DW FSTACK ;9
13EA BD14 DW ZQUIT ;10
13EC C014 DW CRLF ;11
13EE C614 DW USL ;12
13F0 CC14 DW VERIFY ;13
000E OP0M EQU ($-OP0T)/2 ;NUMBER OF 0-OPS
;
; -----
; 1-OPS
; -----
13F2 2415 OP1T: DW ZEROQ ;0
13F4 2F15 DW NEXTQ ;1
13F6 3B15 DW FIRSTQ ;2
13F8 5515 DW LOC ;3
13FA 6515 DW PTSIZE ;4
13FC 7515 DW INC ;5
13FE 7B15 DW DEC ;6
1400 9815 DW PRINTB ;7
1402 A115 DW BADOP ;8 (UNDEFINED)
1404 A415 DW REMOVE ;9
1406 FA15 DW PRINTD ;10
1408 1516 DW RETURN ;11
140A 6016 DW JUMP ;12
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 40
140C 6916 DW PRINT ;13
140E 7516 DW VALUE ;14
1410 7E16 DW BCOM ;15
0010 OP1M EQU ($-OP1T)/2 ;NUMBER OF 1-OPS
;
; -----
; 2-OPS
; -----
1412 A115 OP2T: DW BADOP
1414 A418 DW EQUALQ
1416 8A16 DW LESSQ
1418 9716 DW GRTRQ
141A A316 DW DLESSQ
141C AE16 DW IGRTRQ
141E BE16 DW INQ
1420 D216 DW BTST
1422 E416 DW BOR
1424 F016 DW BAND
1426 FC16 DW FSETQ
1428 0B17 DW FSET
142A 1817 DW FCLEAR
142C 2717 DW ZSET
142E 3317 DW MOVE
1430 5F17 DW GET
1432 7117 DW GETB
1434 8517 DW GETP
1436 D117 DW GETPT
1438 F617 DW NEXTP
143A 2018 DW ZADD
143C 2718 DW ZSUB
143E 3318 DW MUL
1440 5F18 DW DIV
1442 9618 DW ZMOD
0019 OP2M EQU ($-OP2T)/2
;
; -----
; X-OPS
; -----
1444 D118 OPEXTT: DW ZCALL
1446 5D19 DW PUT
1448 7619 DW PUTB
144A 8A19 DW PUTP
144C BC19 DW ZREAD
144E 661B DW PRINTC
1450 701B DW PRINTN
1452 AF1B DW RANDOM
1454 BE1B DW ZPUSH
1456 C71B DW ZPOP
000A OPEXTM EQU ($-OPEXTT)/2
; **********************************************************************
; * *
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 41
; * ZCODE EXECUTION ROUTINES *
; * *
; **********************************************************************
;
; *******************
; * 0-OPS *
; *******************
;
;
; ----------
; RTRUE [0]
; ----------
; SIMULATE A RETURN 1
1458 210100 RTRUE: LD HL,1
145B 229D21 RTRUE1: LD (ARG1),HL
145E C31516 JP RETURN
;
; -----------
; RFALSE [1]
; -----------
; SIMULATE A RETURN 0
1461 210000 RFALSE: LD HL,0
1464 C35B14 JP RTRUE1
;
; -----------
; PRINTI [2]
; -----------
; PRINT THE Z-STRING IMMEDIATELY FOLLOWING THE OPCODE
1467 CD6D14 PRINTI: CALL PRNTI1
146A C3F211 JP MLOOP
;
146D 2A8821 PRNTI1: LD HL,(ZPCL)
1470 22B321 LD (MPCL),HL ;SET UP MPC TO EQUAL ZPC
1473 3A8721 LD A,(ZPCH)
1476 32B221 LD (MPCH),A
1479 AF XOR A
147A 32B721 LD (MPCFLG),A ;ZERO MPC FLAG
147D CD0B1F CALL PZSTR ;PRINT THE STRING
1480 2AB321 LD HL,(MPCL) ;NOW CHANGE BACK ZPC TO END OF STRING
1483 228821 LD (ZPCL),HL
1486 3AB221 LD A,(MPCH)
1489 328721 LD (ZPCH),A
148C 3AB721 LD A,(MPCFLG)
148F 32B021 LD (ZPCFLG),A ;UPDATE FLAG
1492 2AB521 LD HL,(MPCPNT)
1495 22AE21 LD (ZPCPNT),HL ;AND PAGE POINTER
1498 C9 RET
;
; -----------
; PRINTR [3]
; -----------
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 42
; EXECUTE A PRINTI, FOLLOWED BY A CRLF, AND A RTRUE
1499 CD6D14 PRINTR: CALL PRNTI1
149C CDB404 CALL PCRLF
149F C35814 JP RTRUE
;
; ---------
; ZNOP [4]
; ---------
; EXECUTE A NOP
14A2 C3F211 ZNOP: JP MLOOP
;
; ----------
; ZSAVE [5]
; ----------
; SAVE GAME
14A5 C36807 ZSAVE: JP SAVE ;MACHINE DEPENDENT
;
; -----------
; ZRSTOR [6]
; -----------
; RESTORE SAVED GAME
14A8 C3750A ZRSTOR: JP RESTOR ;MACHINE DEPENDENT
;
; -----------
; ZRSTAR [7]
; -----------
; RESTART GAME
14AB C35707 ZRSTAR: JP RESTAR ;MACHINE DEPENDENT
;
; -----------
; RSTACK [8]
; -----------
; EXECUTE A RETURN WITH CALL VALUE ON TOP OF THE STACK
14AE CD271D RSTACK: CALL POPSTK
14B1 229D21 LD (ARG1),HL
14B4 C31516 JP RETURN
;
; -----------
; FSTACK [9]
; -----------
14B7 CD271D FSTACK: CALL POPSTK
14BA C3F211 JP MLOOP
;
; -----------
; ZQUIT [10]
; -----------
14BD C34907 ZQUIT: JP QUIT ;MACHINE DEPENDENT
;
; ----------
; CRLF [11]
; ----------
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 43
; PRINT CARRIAGE RETURN/LINE FEED
14C0 CDB404 CRLF: CALL PCRLF
14C3 C3F211 JP MLOOP
;
; ---------
; USL [12]
; ---------
; UPDATE STATUS LINE
14C6 CDC105 USL: CALL WHOLIN
14C9 C3F211 JP MLOOP
;
; ------------
; VERIFY [13]
; ------------
; VERIFY THE GAME CODE
14CC 3E01 VERIFY: LD A,1 ;SELF CHECK
14CE 329A21 LD (VERF),A ;IN VERIFY MODE, ALWAYS GET NEW PAGE
14D1 216B10 LD HL,VRS
14D4 CD480A CALL MSGOUT ;OUTPUT LAST UPDATE
14D7 217C10 LD HL,VRLINE
14DA CD480A CALL MSGOUT ;OUTPUT VERSION
14DD 2ABB21 LD HL,(ZCODEP) ;^ TOP OF ZCODE
14E0 111A00 LD DE,ZCKLEN
14E3 19 ADD HL,DE
14E4 56 LD D,(HL)
14E5 23 INC HL
14E6 5E LD E,(HL)
14E7 21E0FF LD HL,-32
14EA 19 ADD HL,DE
14EB EB EX DE,HL ;DE HAVE COUNT
14EC 010000 LD BC,0 ;SUM IN BC
14EF 214000 LD HL,32*2
14F2 CDC61D CALL SETWRD
14F5 C5 VERIFL: PUSH BC
14F6 D5 PUSH DE
14F7 CD071E CALL GETWRD ;GUARENTEED TO GET FRESH WORD
14FA D1 POP DE
14FB C1 POP BC
14FC 7C LD A,H
14FD 2600 LD H,0
14FF 09 ADD HL,BC
1500 CDEA1E CALL HLOFF
1503 44 LD B,H
1504 4D LD C,L ;TOTAL IN BC
1505 1B DEC DE
1506 7A LD A,D
1507 B3 OR E
1508 C2F514 JP NZ,VERIFL ;SUM ALL BYTES
150B 111C00 LD DE,ZCKSUM
150E 2ABB21 LD HL,(ZCODEP)
1511 19 ADD HL,DE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 44
1512 56 LD D,(HL)
1513 23 INC HL
1514 5E LD E,(HL) ;GET CHECKSUM
1515 60 LD H,B
1516 69 LD L,C
1517 AF XOR A
1518 329A21 LD (VERF),A
151B CD071D CALL HLGEDE ;COMPARE CALCULATED WITH ACTUAL
151E CA6213 JP Z,PREDS
1521 C35313 JP PREDF ;FAIL IF DIFFERENT
;
; *******************
; * 1-OPS *
; *******************
;
; ----------
; ZERO? [0]
; ----------
; IS ARG1 EQUAL TO ZERO? [PRED]
1524 2A9D21 ZEROQ: LD HL,(ARG1)
1527 7C LD A,H
1528 B5 OR L
1529 CA6213 JP Z,PREDS
152C C35313 JP PREDF
;
; ----------
; NEXT? [1]
; ----------
; RETURN THE NEXT POINTER IN OBJRCT "ARG1"; FAIL IF
; NONE LEFT, AND RETURN ZERO [VALUE][PRED]
152F 3A9D21 NEXTQ: LD A,(ARG1)
1532 CDD61C CALL OBJLOC
1535 110500 LD DE,5
1538 C34415 JP FRSTQ1 ;SAME AS FIRST?
;
; -----------
; FIRST? [2]
; -----------
; RETURN THE FIRST POINTER IN OBJECT "ARG1"; FAIL IF
; NONE, AND RETURN ZERO [VALUE][PRED]
;
153B 3A9D21 FIRSTQ: LD A,(ARG1)
153E CDD61C CALL OBJLOC
1541 110600 LD DE,6
1544 19 FRSTQ1: ADD HL,DE
1545 7E LD A,(HL)
1546 F5 PUSH AF ;SAVE VALUE
1547 6F LD L,A
1548 2600 LD H,0
154A CD1313 CALL PUTVLC ;STORE VALUE
154D F1 POP AF
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 45
154E B7 OR A
154F C26213 JP NZ,PREDS ;FOUND FIRST
1552 C35313 JP PREDF ;FIRST NOT FOUND
;
; --------
; LOC [3]
; --------
; RETURN THE OBJECT CONTAINING OBJECT "ARG1"; ZERO IF NONE [VALUE]
1555 3A9D21 LOC: LD A,(ARG1)
1558 CDD61C CALL OBJLOC
155B 110400 LD DE,4
155E 19 ADD HL,DE
155F 6E LD L,(HL)
1560 2600 LD H,0
1562 C30D13 JP PUTVAL
;
; -----------
; PTSIZE [4]
; -----------
; RETURN LENGTH OF PROP TABLE "ARG1" IN BYTES [VALUE]
1565 2A9D21 PTSIZE: LD HL,(ARG1)
1568 EB EX DE,HL
1569 2ABB21 LD HL,(ZCODEP)
156C 19 ADD HL,DE ;POINTER TO PROP ENTRY
156D 2B DEC HL
156E CDC71C CALL PROPL
1571 3C INC A
1572 C30A13 JP PUTBYT
;
; --------
; INC [5]
; --------
; INCREMENT ARG1 [VALUE]
1575 CD8115 INC: CALL INC1
1578 C3F211 JP MLOOP
;
; --------
; DEC [6]
; --------
; DECREMENT ARG1 [VALUE]
157B CD8E15 DEC: CALL DEC1
157E C3F211 JP MLOOP
;
1581 3A9D21 INC1: LD A,(ARG1)
1584 CD3B13 CALL VARGET
1587 23 INC HL
1588 E5 INC2: PUSH HL
1589 CD4713 CALL VARPUT
158C E1 POP HL
158D C9 RET
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 46
158E 3A9D21 DEC1: LD A,(ARG1)
1591 CD3B13 CALL VARGET
1594 2B DEC HL
1595 C38815 JP INC2
;
; -----------
; PRINTB [7]
; -----------
; PRINT THE STRING POINTED TO BY BYTE POINTER ARG1
1598 2A9D21 PRINTB: LD HL,(ARG1)
159B CDC61D PRINT2: CALL SETWRD
159E C36F16 JP PRINT1
;
; ----------
; BADOP [8]
; ----------
15A1 C3F211 BADOP: JP MLOOP
;
; -----------
; REMOVE [9]
; -----------
; MOVE OBJECT [ARG1] TO PSEUDO-OBJECT #0
15A4 CDAA15 REMOVE: CALL REMOVC
15A7 C3F211 JP MLOOP
;
15AA 3A9D21 REMOVC: LD A,(ARG1)
15AD 47 LD B,A ;SAVE IT
15AE CDD61C CALL OBJLOC
15B1 EB EX DE,HL ;SAVE IN DE
15B2 210400 LD HL,4
15B5 19 ADD HL,DE
15B6 7E LD A,(HL)
15B7 B7 OR A
15B8 C8 RET Z ;NO OBJECT
15B9 D5 PUSH DE ;SAVE VALUE
15BA CDD61C CALL OBJLOC ;PARENT OBJECT
15BD 110600 LD DE,6
15C0 EB EX DE,HL ;LP IN D
15C1 19 ADD HL,DE
15C2 4E LD C,(HL) ;SIBL
15C3 78 LD A,B
15C4 B9 CP C
15C5 C2D715 JP NZ,REMVC1 ;NOT SAME
15C8 E1 POP HL
15C9 E5 PUSH HL ;L1
15CA 010500 LD BC,5
15CD 09 ADD HL,BC
15CE 7E LD A,(HL)
15CF 210600 LD HL,6 ;PARENT'S FIRST SLOT GETS LOC SLOT
15D2 19 ADD HL,DE
15D3 77 LD (HL),A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 47
15D4 C3EF15 JP REMVC2
15D7 79 REMVC1: LD A,C ;GET SIBL
15D8 CDD61C CALL OBJLOC
15DB 110500 LD DE,5
15DE 19 ADD HL,DE
15DF 54 LD D,H
15E0 5D LD E,L ;SAVE LS+5
15E1 4E LD C,(HL) ;NEW SIBL
15E2 78 LD A,B
15E3 B9 CP C
15E4 C2D715 JP NZ,REMVC1 ;NOT END OF CHAIN
15E7 010500 LD BC,5
15EA E1 POP HL
15EB E5 PUSH HL
15EC 09 ADD HL,BC ;OLD NEXT
15ED 7E LD A,(HL)
15EE 12 LD (DE),A
15EF E1 REMVC2: POP HL
15F0 110400 LD DE,4
15F3 19 ADD HL,DE
15F4 3600 LD (HL),0
15F6 23 INC HL
15F7 3600 LD (HL),0
15F9 C9 RET
; ------------
; PRINTD [10]
; ------------
; PRINT SHORT DESCRIPTION OF OBJECT [ARG1]
15FA 3A9D21 PRINTD: LD A,(ARG1)
15FD CD0316 CALL PRNTDC
1600 C3F211 JP MLOOP
;
1603 CDD61C PRNTDC: CALL OBJLOC
1606 110700 LD DE,7
1609 19 ADD HL,DE
160A 56 LD D,(HL)
160B 23 INC HL
160C 5E LD E,(HL)
160D EB EX DE,HL
160E 23 INC HL
160F CDC61D CALL SETWRD
1612 C30B1F JP PZSTR
;
; ------------
; RETURN [11]
; ------------
; RETURN FROM A CALL WITH VALUE ARG1
1615 2A8B21 RETURN: LD HL,(OZSTKP) ;RESET STACK FROM CALL
1618 22E90D LD (ZSTAKP),HL
161B 3A8D21 LD A,(OZSTKC)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 48
161E 328A21 LD (ZSTAKC),A
1621 CD271D CALL POPSTK ;RESET Z-STACK
1624 7D LD A,L
1625 328721 LD (ZPCH),A ;SAVE UPPER PC
1628 44 LD B,H ;H HAS NUMBER OF LOCALS
1629 7C LD A,H
162A 87 ADD A,A ;WORD
162B CA4316 JP Z,RET2 ;NO LOCALS
162E 216721 LD HL,LOCALS-2
1631 CDEA1E CALL HLOFF ;POSITION HL TO RESTORE LOCALS
1634 EB RET1: EX DE,HL
1635 CD271D CALL POPSTK ;GET THE LOCAL, REVERSE ORDER FIRST
1638 EB EX DE,HL
1639 72 LD (HL),D
163A 23 INC HL
163B 73 LD (HL),E
163C 2B DEC HL ;NOW BACK UP ONE ELEMENT
163D 2B DEC HL
163E 2B DEC HL
163F 05 DEC B
1640 C23416 JP NZ,RET1 ;LOOP
1643 CD271D RET2: CALL POPSTK
1646 228821 LD (ZPCL),HL ;REST OF PC
1649 CD271D CALL POPSTK
164C 228B21 LD (OZSTKP),HL
164F CD271D CALL POPSTK
1652 7D LD A,L
1653 328D21 LD (OZSTKC),A ;RESTORE OLD VALUES
1656 AF XOR A
1657 32B021 LD (ZPCFLG),A ;PC CHANGED
165A 2A9D21 LD HL,(ARG1) ;ARGUMENT TO BE RETURNED
165D C30D13 JP PUTVAL ;STORE AND RETURN
;
; ----------
; JUMP [12]
; ----------
; BRANCH TO Z-LOCATION POINTED TO BY 16-BIT 2'S COMPLIMENT ARG1
1660 2A9D21 JUMP: LD HL,(ARG1) ;RELATIVE JUMP
1663 44 LD B,H
1664 4D LD C,L
1665 0B DEC BC
1666 C39713 JP PREDB3 ;TREAT AS A SUCCESSFUL JUMP
;
; -----------
; PRINT [13]
; -----------
; PRINT THE Z-STRING POINTED TO BY THE WORD-POINTER ARG1
1669 2A9D21 PRINT: LD HL,(ARG1) ;TELL SETSTR WHERE THE STRING
166C CDD81D CALL SETSTR ;RESIDES AND
166F CD0B1F PRINT1: CALL PZSTR ;PRINT THE STRING
1672 C3F211 JP MLOOP
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 49
;
; -----------
; VALUE [14]
; -----------
; RETURN VALUE OF ARG1 [VALUE]
1675 3A9D21 VALUE: LD A,(ARG1)
1678 CD3B13 CALL VARGET
167B C30D13 JP PUTVAL
;
; ----------
; BCOM [15]
; ----------
; COMPLIMENT ARG1 [VALUE]
167E 2A9D21 BCOM: LD HL,(ARG1)
1681 7C LD A,H
1682 2F CPL
1683 67 LD H,A
1684 7D LD A,L
1685 2F CPL
1686 6F LD L,A
1687 C30D13 JP PUTVAL
;
; *******************
; * 2-OPS *
; *******************
;
; ----------
; LESS? [0]
; ----------
; IS ARG1 LESS THAN ARG2? [PRED]
168A CDF71C LESSQ: CALL GETARG
168D EB EX DE,HL
168E CDFF1C CALL SHLGED
1691 D26213 JP NC,PREDS
1694 C35313 JP PREDF
;
; ----------
; GRTR? [1]
; ----------
; IS ARG1 GREATER THAN ARG2? [PRED]
1697 CDF71C GRTRQ: CALL GETARG
169A CDFF1C CALL SHLGED
169D D26213 JP NC,PREDS
16A0 C35313 JP PREDF
;
; -----------
; DLESS? [2]
; -----------
; DECREMENT ARG1: SUCCEED IF ARG1 (-1) IS LESS THAN ARG2 [PRED]
16A3 CD8E15 DLESSQ: CALL DEC1
16A6 EB EX DE,HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 50
16A7 2A9F21 LD HL,(ARG2)
16AA EB EX DE,HL
16AB C3B516 JP IGRTQ1
;
; -----------
; IGRTR? [3]
; -----------
; INCREMENT ARG1: SUCCEED IF ARG1 (+1) IS GREATER THAN ARG2 [PRED]
16AE CD8115 IGRTRQ: CALL INC1
16B1 EB EX DE,HL
16B2 2A9F21 LD HL,(ARG2)
16B5 CDFF1C IGRTQ1: CALL SHLGED
16B8 D26213 JP NC,PREDS
16BB C35313 JP PREDF
;
; ----------
; IN? [4]
; ----------
; IS OBJECT [ARG1] CONTAINED IN OBJECT [ARG2] [PRED]
16BE 3A9D21 INQ: LD A,(ARG1)
16C1 CDD61C CALL OBJLOC
16C4 110400 LD DE,4
16C7 19 ADD HL,DE
16C8 3A9F21 LD A,(ARG2)
16CB BE CP (HL)
16CC CA6213 JP Z,PREDS ;SUCCESS IF OBJ 2 IN 1
16CF C35313 JP PREDF
;
; ---------
; BTST [5]
; ---------
; IS EVERY "ON" BIT IN ARG1 ALSO "ON" IN ARG2 [PRED]
16D2 CDF71C BTST: CALL GETARG
16D5 7C LD A,H
16D6 A2 AND D
16D7 57 LD D,A
16D8 7D LD A,L
16D9 A3 AND E
16DA 5F LD E,A
16DB CD071D CALL HLGEDE
16DE CA6213 JP Z,PREDS
16E1 C35313 JP PREDF
;
; --------
; BOR [6]
; --------
; RETURN BITWISE OR OF ARG1 AND ARG2 [VALUE]
16E4 CDF71C BOR: CALL GETARG
16E7 7A LD A,D
16E8 B4 OR H
16E9 67 LD H,A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 51
16EA 7B LD A,E
16EB B5 OR L
16EC 6F LD L,A
16ED C30D13 JP PUTVAL
;
; ---------
; BAND [7]
; ---------
; RETURN BITWISE AND OF ARG1 AND ARG2 [VALUE]
16F0 CDF71C BAND: CALL GETARG
16F3 7C LD A,H
16F4 A2 AND D
16F5 67 LD H,A
16F6 7D LD A,L
16F7 A3 AND E
16F8 6F LD L,A
16F9 C30D13 JP PUTVAL
;
; ----------
; FSET? [8]
; ----------
; IS FLAG "ARG2" SET IN OBJECT "ARG1"? [PRED]
16FC CD821C FSETQ: CALL FLAGSU ;GET BIT
16FF 7A LD A,D
1700 A0 AND B
1701 57 LD D,A
1702 7B LD A,E
1703 A1 AND C
1704 B2 OR D ;CHECK FOR ON
1705 C26213 JP NZ,PREDS ;BIT ON
1708 C35313 JP PREDF ;BIT OFF
;
; ---------
; FSET [9]
; ---------
; SET FLAG "ARG2" IN OBJECT "ARG1"
170B CD821C FSET: CALL FLAGSU
170E 7A LD A,D
170F B0 OR B
1710 77 LD (HL),A
1711 23 INC HL
1712 7B LD A,E
1713 B1 OR C
1714 77 LD (HL),A
1715 C3F211 JP MLOOP
;
; ------------
; FCLEAR [10]
; ------------
; CLEAR FLAG "ARG2" IN OBJECT "ARG1"
1718 CD821C FCLEAR: CALL FLAGSU
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 52
171B 78 LD A,B
171C 2F CPL
171D A2 AND D
171E 77 LD (HL),A
171F 23 INC HL
1720 79 LD A,C
1721 2F CPL
1722 A3 AND E
1723 77 LD (HL),A
1724 C3F211 JP MLOOP
;
; ---------
; SET [11]
; ---------
; SET VARIABLE "ARG1" EQUAL TO VALUE "ARG2"
1727 3A9D21 ZSET: LD A,(ARG1)
172A 2A9F21 LD HL,(ARG2)
172D CD4713 VARPTR: CALL VARPUT
1730 C3F211 JP MLOOP
;
; ----------
; MOVE [12]
; ----------
; PUT OBJECT "ARG1" INTO OBJECT "ARG2"
1733 CDAA15 MOVE: CALL REMOVC ;REMOVE OBJECT FIRST
1736 3A9D21 LD A,(ARG1)
1739 CDD61C CALL OBJLOC
173C E5 PUSH HL ;SAVE LOC OF FIRST ARG
173D 110400 LD DE,4
1740 19 ADD HL,DE ;LOC SLOT
1741 3A9F21 LD A,(ARG2)
1744 77 LD (HL),A
1745 CDD61C CALL OBJLOC
1748 110600 LD DE,6
174B 19 ADD HL,DE ;FIRST SLOT
174C 46 LD B,(HL)
174D 3A9D21 LD A,(ARG1)
1750 77 LD (HL),A
1751 E1 POP HL
1752 78 LD A,B
1753 B7 OR A
1754 CAF211 JP Z,MLOOP
1757 110500 LD DE,5
175A 19 ADD HL,DE
175B 77 LD (HL),A ;NEXT SLOT
175C C3F211 JP MLOOP
;
; ---------
; GET [13]
; ---------
; RETURN VALUE OF ITEM "ARG2" IN WORD-TABLE AT "ARG1"
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 53
175F 2A9F21 GET: LD HL,(ARG2)
1762 29 ADD HL,HL ;ITEM NUMBER*2
1763 EB EX DE,HL
1764 2A9D21 LD HL,(ARG1)
1767 19 ADD HL,DE ;POINTER TO ITEM
1768 CDC61D CALL SETWRD
176B CD071E CALL GETWRD ;GET VALUE
176E C30D13 JP PUTVAL
;
; ----------
; GETB [14]
; ----------
; RETURN VALUE OF ITEM "ARG2" IN BYTE-TABLE AT "ARG1" [VALUE]
1771 2A9F21 GETB: LD HL,(ARG2)
1774 EB EX DE,HL
1775 2A9D21 LD HL,(ARG1)
1778 19 ADD HL,DE
1779 CDC61D CALL SETWRD
177C CD121E CALL GETBYT
177F 6F LD L,A
1780 2600 LD H,0
1782 C30D13 JP PUTVAL
;
; ----------
; GETP [15]
; ----------
; RETURN PROP "ARG2" OF OBJECT "ARG1"; IF SPECIFIED PROP DOES
; NOT EXIST, RETUURN PROP'TH ELEMENT OF DEFAULT OBJECT [VALUE]
1785 CDAC1C GETP: CALL PROPB ;GET POINTER TO PROPS IN PROP TABLE
1788 CDC31C GETP1: CALL PROPN
178B 47 LD B,A
178C 3A9F21 LD A,(ARG2)
178F B8 CP B
1790 CAB917 JP Z,GETP2 ;FOUND PROP
1793 D29C17 JP NC,GETP3 ;GET PROP FROM DEFAULT TABLE
1796 CDCE1C CALL PROPNX ;TRY AGAIN WITH NEXT PROP
1799 C38817 JP GETP1
179C 2ABB21 GETP3: LD HL,(ZCODEP)
179F 110A00 LD DE,ZOBJEC
17A2 19 ADD HL,DE
17A3 56 LD D,(HL)
17A4 23 INC HL
17A5 5E LD E,(HL)
17A6 2ABB21 LD HL,(ZCODEP)
17A9 19 ADD HL,DE ;BEG OF OBJECT TABLE
17AA 3A9F21 LD A,(ARG2)
17AD 87 ADD A,A
17AE CDEA1E CALL HLOFF
17B1 2B DEC HL
17B2 5E LD E,(HL)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 54
17B3 2B DEC HL
17B4 56 LD D,(HL)
17B5 EB EX DE,HL
17B6 C30D13 JP PUTVAL ;RETURN DEFAULT VALUE
17B9 CDC71C GETP2: CALL PROPL ;GET LENGTH
17BC 23 INC HL
17BD 3D DEC A
17BE FACB17 JP M,GETP2A ;1 BYTE
17C1 C40602 CALL NZ,ZER ;BAD PROP LENGTH
17C4 56 LD D,(HL)
17C5 23 INC HL
17C6 5E LD E,(HL)
17C7 EB EX DE,HL
17C8 C30D13 JP PUTVAL ;RETURN TWO BYTE PROP
17CB 6E GETP2A: LD L,(HL)
17CC 2600 LD H,0
17CE C30D13 JP PUTVAL
17D1 CDAC1C GETPT: CALL PROPB
17D4 CDC31C GETPT1: CALL PROPN
17D7 47 LD B,A
17D8 3A9F21 LD A,(ARG2)
17DB B8 CP B
17DC CAE817 JP Z,GETPT2 ;FOUND PROP
17DF D20913 JP NC,RET0
17E2 CDCE1C CALL PROPNX
17E5 C3D417 JP GETPT1
17E8 23 GETPT2: INC HL
17E9 EB EX DE,HL
17EA 2ABB21 LD HL,(ZCODEP) ;SUBRACT OFF RELATIVE POINTER
17ED 7B LD A,E
17EE 95 SUB L
17EF 6F LD L,A
17F0 7A LD A,D
17F1 9C SBC A,H
17F2 67 LD H,A
17F3 C30D13 JP PUTVAL
17F6 CDAC1C NEXTP: CALL PROPB ;POINT TO PROP VALUE
17F9 3A9F21 LD A,(ARG2)
17FC B7 OR A
17FD CA1418 JP Z,NEXTP2 ;PROP0
1800 CDC31C NEXTP1: CALL PROPN
1803 47 LD B,A
1804 3A9F21 LD A,(ARG2)
1807 B8 CP B
1808 CA1A18 JP Z,NEXTP3 ;FOUND PROP
180B D20913 JP NC,RET0 ;RETURN 0
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 55
180E CDCE1C CALL PROPNX
1811 C30018 JP NEXTP1 ;LOOP
1814 CDC31C NEXTP2: CALL PROPN
1817 C30A13 JP PUTBYT
181A CDCE1C NEXTP3: CALL PROPNX
181D C31418 JP NEXTP2 ;PROPN OF NEXT
1820 CDF71C ZADD: CALL GETARG
1823 19 ADD HL,DE
1824 C30D13 JP PUTVAL
1827 CDF71C ZSUB: CALL GETARG
182A 7B LD A,E
182B 95 SUB L
182C 6F LD L,A
182D 7A LD A,D
182E 9C SBC A,H
182F 67 LD H,A
1830 C30D13 JP PUTVAL
1833 CDF71C MUL: CALL GETARG
1836 EB EX DE,HL
1837 CD5A1C CALL SIGNC ;CHECK SIGN
183A E5 PUSH HL
183B 210200 LD HL,2
183E CD071D CALL HLGEDE
1841 CA5A18 JP Z,MUL2
1844 210400 LD HL,4
1847 CD071D CALL HLGEDE
184A CA5718 JP Z,MUL4
184D E1 POP HL
184E CDFE1B CALL MULT ;DO THE MULTIPLY
1851 CD671C MUL1: CALL SIGNS ;SET THE SIGN
1854 C30D13 JP PUTVAL ;THEN STORE RESULT
1857 E1 MUL4: POP HL
1858 29 ADD HL,HL
1859 E5 PUSH HL
185A E1 MUL2: POP HL
185B 29 ADD HL,HL
185C C35118 JP MUL1
185F CDF71C DIV: CALL GETARG
1862 EB EX DE,HL
1863 CD5A1C CALL SIGNC ;CHECK SIGNS
1866 E5 PUSH HL
1867 210200 LD HL,2
186A CD071D CALL HLGEDE
186D CA8018 JP Z,DIV2 ;DIVIDE BY 2
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 56
1870 210400 LD HL,4
1873 CD071D CALL HLGEDE
1876 CA8718 JP Z,DIV4 ;DIVIDE BY 4
1879 E1 POP HL
187A CD271C CALL DIVIDE ;DO THE DIVIDE
187D C35118 JP MUL1 ;SET SIGN AND RETURN
1880 E1 DIV2: POP HL
1881 CD8E18 DIV2B: CALL DIV2A
1884 C35118 JP MUL1
1887 E1 DIV4: POP HL
1888 CD8E18 CALL DIV2A
188B C38118 JP DIV2B
188E B7 DIV2A: OR A ;CLEAR CARRY
188F 7C LD A,H
1890 1F RRA
1891 67 LD H,A
1892 7D LD A,L
1893 1F RRA
1894 6F LD L,A
1895 C9 RET
1896 CDF71C ZMOD: CALL GETARG
1899 EB EX DE,HL
189A CD5A1C CALL SIGNC ;MAKE THEM POSITIVE
189D CD271C CALL DIVIDE ;DO THE DIVIDE
18A0 EB EX DE,HL ;GET THE REMAINDER
18A1 C30D13 JP PUTVAL
;
; *******************
; * X-OPS *
; *******************
;
18A4 2A9D21 EQUALQ: LD HL,(ARG1)
18A7 EB EX DE,HL
18A8 3AA521 LD A,(ARGCNT)
18AB 47 LD B,A
18AC 05 DEC B
18AD CC0602 CALL Z,ZER
18B0 2A9F21 LD HL,(ARG2)
18B3 CDC518 CALL EQUAQ1
18B6 2AA121 LD HL,(ARG3)
18B9 CDC518 CALL EQUAQ1
18BC 2AA321 LD HL,(ARG4)
18BF CDC518 CALL EQUAQ1
18C2 CD0602 CALL ZER
18C5 CD071D EQUAQ1: CALL HLGEDE ;DO COMPARISON
18C8 E1 POP HL ;RESTORE RETURN ADDRESS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 57
18C9 CA6213 JP Z,PREDS ;DON'T BOTHER RETURNING
18CC 05 DEC B ;ARG COUNT
18CD CA5313 JP Z,PREDF ;OUT OF ARGS, FAIL
18D0 E9 JP (HL) ;ELSE RETURN
18D1 2A9D21 ZCALL: LD HL,(ARG1)
18D4 7C LD A,H
18D5 B5 OR L
18D6 CA0D13 JP Z,PUTVAL
18D9 2A8D21 LD HL,(OZSTKC)
18DC CD0E1D CALL PSHSTK
18DF 2A8B21 LD HL,(OZSTKP)
18E2 CD0E1D CALL PSHSTK
18E5 2A8821 LD HL,(ZPCL)
18E8 CD0E1D CALL PSHSTK ;SAVE OLD PC LOWER
18EB 2A8721 LD HL,(ZPCH) ;SAVE HIGH IN L
18EE E5 PUSH HL
18EF AF XOR A
18F0 32B021 LD (ZPCFLG),A ;PC HAS CHANGED
18F3 67 LD H,A
18F4 3A9D21 LD A,(ARG1)
18F7 6F LD L,A
18F8 29 ADD HL,HL ;NEW ZPCL
18F9 228821 LD (ZPCL),HL
18FC 3A9E21 LD A,(ARG1+1)
18FF 328721 LD (ZPCH),A ;NEW ZPCH
1902 CD3C1D CALL NEXTPC ;GET NUMBER OF LOCALS
1905 E1 POP HL
1906 47 LD B,A ;B HAS NUMBER OF LOCALS
1907 67 LD H,A
1908 E5 PUSH HL ;SAVE VALUE
1909 216921 LD HL,LOCALS ;STORE OLD LOCALS
190C B7 OR A
190D CA2E19 JP Z,ZCALL2 ;NO LOCALS
1910 C5 ZCALL1: PUSH BC
1911 56 LD D,(HL)
1912 23 INC HL
1913 5E LD E,(HL)
1914 EB EX DE,HL
1915 CD0E1D CALL PSHSTK
1918 1B DEC DE
1919 D5 PUSH DE
191A CD3C1D CALL NEXTPC ;GET NEW DEFAULT VALUE FOR LOCAL
191D 57 LD D,A
191E D5 PUSH DE
191F CD3C1D CALL NEXTPC ;WORD VALUE
1922 D1 POP DE
1923 5F LD E,A
1924 E1 POP HL ;POINTER TO STORE NEW LOCAL
1925 72 LD (HL),D
1926 23 INC HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 58
1927 73 LD (HL),E
1928 23 INC HL
1929 C1 POP BC
192A 05 DEC B
192B C21019 JP NZ,ZCALL1 ;LOOP THROUGH ALL LOCALS
192E 3AA521 ZCALL2: LD A,(ARGCNT) ;PASS ARGS
1931 47 LD B,A
1932 05 DEC B
1933 CA4A19 JP Z,ZCALL4 ;NO ARGS TO PASS
1936 219F21 LD HL,ARG2 ;POINTER TO FIRST ARG
1939 116921 LD DE,LOCALS
193C 7E ZCALL3: LD A,(HL)
193D 23 INC HL
193E 13 INC DE
193F 12 LD (DE),A
1940 1B DEC DE
1941 7E LD A,(HL)
1942 23 INC HL
1943 12 LD (DE),A
1944 13 INC DE
1945 13 INC DE
1946 05 DEC B
1947 C23C19 JP NZ,ZCALL3
194A E1 ZCALL4: POP HL ;GET BACK ZPCH AND NUMBER OF LOCALS
194B CD0E1D CALL PSHSTK
194E 3A8A21 LD A,(ZSTAKC)
1951 328D21 LD (OZSTKC),A
1954 2AE90D LD HL,(ZSTAKP)
1957 228B21 LD (OZSTKP),HL ;FOR KNOWING WHERE TO RETURN
195A C3F211 JP MLOOP
195D 2A9F21 PUT: LD HL,(ARG2)
1960 29 ADD HL,HL
1961 EB EX DE,HL
1962 2A9D21 LD HL,(ARG1)
1965 19 ADD HL,DE ;Z ADDRESS
1966 EB EX DE,HL
1967 2ABB21 LD HL,(ZCODEP)
196A 19 ADD HL,DE ;REAL POINTER
196B EB EX DE,HL
196C 2AA121 LD HL,(ARG3) ;VALUE TO STORE
196F EB EX DE,HL
1970 72 LD (HL),D
1971 23 INC HL
1972 73 LD (HL),E
1973 C3F211 JP MLOOP
1976 2A9F21 PUTB: LD HL,(ARG2)
1979 EB EX DE,HL
197A 2A9D21 LD HL,(ARG1)
197D 19 ADD HL,DE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 59
197E EB EX DE,HL
197F 2ABB21 LD HL,(ZCODEP)
1982 19 ADD HL,DE
1983 3AA121 LD A,(ARG3)
1986 77 LD (HL),A ;STORE ONE BYTE IN RANDOM TABLE
1987 C3F211 JP MLOOP
198A CDAC1C PUTP: CALL PROPB ;SET PROP
198D CDC31C PUTP1: CALL PROPN ;GET PROP NUMBER
1990 47 LD B,A
1991 3A9F21 LD A,(ARG2)
1994 B8 CP B
1995 CAA119 JP Z,PUTP2 ;FOUND PROPERTY
1998 D40602 CALL NC,ZER ;BAD PROP NUMBER
199B CDCE1C CALL PROPNX ;TRY NEXT
199E C38D19 JP PUTP1
19A1 CDC71C PUTP2: CALL PROPL ;GET LENGTH
19A4 23 INC HL
19A5 EB EX DE,HL
19A6 2AA121 LD HL,(ARG3)
19A9 3D DEC A
19AA FAB719 JP M,PUTP2A ;STORE 1 BYTE
19AD C40602 CALL NZ,ZER ;TOO LONG
19B0 EB EX DE,HL
19B1 72 LD (HL),D
19B2 23 INC HL
19B3 73 LD (HL),E
19B4 C3F211 JP MLOOP ;RETURN
19B7 EB PUTP2A: EX DE,HL
19B8 73 LD (HL),E
19B9 C3F211 JP MLOOP ;SET AND RETURN
19BC ZREAD:
19BC CDC105 CALL WHOLIN
19BF CDD01B CALL RND ;RANDOMIZE
19C2 2ABB21 LD HL,(ZCODEP) ;MAIN READ CODE
19C5 EB EX DE,HL ;GET REAL POINTERS TO TABLES
19C6 2A9D21 LD HL,(ARG1)
19C9 19 ADD HL,DE ;BUFFER TABLE
19CA 229D21 LD (ARG1),HL
19CD 2A9F21 LD HL,(ARG2)
19D0 19 ADD HL,DE ;RESULT TABLE
19D1 229F21 LD (ARG2),HL
19D4 CD5403 CALL READBF ;READ THE BUFFER
19D7 47 LD B,A ;CHARACTER COUNT IN B
19D8 0E00 LD C,0 ;C HAS CHARACTERS IN WORD
19DA 2A9F21 LD HL,(ARG2)
19DD 23 INC HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 60
19DE 3600 LD (HL),0 ;SET WORDS READ TO 0
19E0 23 INC HL
19E1 22CB21 LD (RTABP),HL ;INITIALIZE RESULT TABLE POINTER
19E4 2A9D21 LD HL,(ARG1)
19E7 23 INC HL ;HL HAS POINTER TO INPUT CHARACTERS
19E8 E5 READL: PUSH HL
19E9 2A9F21 LD HL,(ARG2)
19EC 7E LD A,(HL)
19ED 23 INC HL
19EE BE CP (HL)
19EF E1 POP HL
19F0 CAF211 JP Z,MLOOP ;TOO MANY WORDS
;ERROR HERE IF DESIRED INSTEAD OF JZ
19F3 78 LD A,B
19F4 B1 OR C
19F5 CAF211 JP Z,MLOOP ;OUT OF CHARACTERS AND WORDS
19F8 79 LD A,C
19F9 FE06 CP 6
19FB CC811A CALL Z,FLUSHW ;FLUSH CHARS IN A WORD OVER 6 CHARACTERS
19FE 79 LD A,C
19FF B7 OR A
1A00 C2331A JP NZ,READL2 ;NOT FIRST CHARACTER IN WORD
1A03 E5 PUSH HL
1A04 1606 LD D,6
1A06 219221 LD HL,ZSTBUI ;INITIALIZE WORD BUFFER
1A09 3600 RD0PL: LD (HL),0
1A0B 23 INC HL
1A0C 15 DEC D
1A0D C2091A JP NZ,RD0PL
1A10 E1 POP HL
1A11 3A9D21 LD A,(ARG1)
1A14 57 LD D,A
1A15 7D LD A,L
1A16 92 SUB D ;POSITION OF START OF WORD
1A17 E5 PUSH HL
1A18 2ACB21 LD HL,(RTABP)
1A1B 23 INC HL
1A1C 23 INC HL
1A1D 23 INC HL
1A1E 77 LD (HL),A ;STORE IN RESULT TABLE
1A1F E1 POP HL
1A20 7E LD A,(HL)
1A21 CDA81A CALL SIBRKQ ;SELF INSERTING BREAK?
1A24 DA501A JP C,RSIBRK
1A27 7E LD A,(HL)
1A28 CD8F1A CALL RBRKQ ;NORMAL BREAK?
1A2B D2331A JP NC,READL2 ;NO
1A2E 23 INC HL ;YES, FLUSH STRANDED BREAKS
1A2F 05 DEC B
1A30 C3E819 JP READL ;LOOP BACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 61
1A33 78 READL2: LD A,B
1A34 B7 OR A
1A35 CA561A JP Z,READL3 ;OUT OF CHARACTERS, SIMULATE WORD ENDING
1A38 7E LD A,(HL)
1A39 CD8F1A CALL RBRKQ ;WORD BREAK?
1A3C DA561A JP C,READL3 ;FOUND A BREAK
1A3F 56 LD D,(HL)
1A40 E5 PUSH HL
1A41 219221 LD HL,ZSTBUI
1A44 79 LD A,C
1A45 CDEA1E CALL HLOFF
1A48 72 LD (HL),D ;STORE CHARACTER IN BUFFER
1A49 E1 POP HL
1A4A 05 DEC B ;ONE LESS CHARACTER
1A4B 0C INC C ;ONE MORE CHARACTER IN WORD
1A4C 23 INC HL ;POINT TO NEXT CHARACTER
1A4D C3E819 JP READL
1A50 329221 RSIBRK: LD (ZSTBUI),A ;STORE SELF INSERTING BREAK
1A53 0C INC C ;1 CHAR
1A54 05 DEC B ;1 LESS CHAR
1A55 23 INC HL
1A56 79 READL3: LD A,C ;INSERT WORD IF ANY CHARACTERS IN WORD
1A57 B7 OR A
1A58 CAE819 JP Z,READL ;NO CHARACTERS IN WORD
1A5B E5 PUSH HL
1A5C C5 PUSH BC
1A5D 2ACB21 LD HL,(RTABP) ;STORE PARAMS IN TABLE
1A60 23 INC HL
1A61 23 INC HL
1A62 71 LD (HL),C ;REAL LENGTH OF WORD
1A63 CD7220 CALL CONZST ;CONVERT TO ZSTRING
1A66 CDCF1A CALL FINDW ;LOOK UP WORD IN VOCAB TABLE
1A69 2ACB21 LD HL,(RTABP) ;STORE RESULT
1A6C 72 LD (HL),D
1A6D 23 INC HL
1A6E 73 LD (HL),E
1A6F 23 INC HL
1A70 23 INC HL
1A71 23 INC HL
1A72 22CB21 LD (RTABP),HL ;POINTER TO NEXT WORD
1A75 2A9F21 LD HL,(ARG2)
1A78 23 INC HL
1A79 34 INC (HL) ;ONE MORE WORD
1A7A C1 POP BC
1A7B E1 POP HL
1A7C 0E00 LD C,0 ;ZERO CHARACTERS IN NEXT WORD
1A7E C3E819 JP READL
1A81 78 FLUSHW: LD A,B
1A82 B7 OR A ;FLUSH CHARACTERS TILL BREAD OR END OF BUFFER
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 62
1A83 C8 RET Z
1A84 7E LD A,(HL)
1A85 CD8F1A CALL RBRKQ
1A88 D8 RET C ;FOUND A BREAK
1A89 23 INC HL
1A8A 05 DEC B
1A8B 0C INC C
1A8C C3811A JP FLUSHW
1A8F CDA81A RBRKQ: CALL SIBRKQ ;FIRST CHECK SELF INSERTING BREAKS
1A92 D8 RET C ;YES
1A93 E5 PUSH HL
1A94 21C51A LD HL,BRKTBL
1A97 160A LD D,NBRKS
1A99 BE RBRK1: CP (HL)
1A9A CAA51A JP Z,FBRK ;MATCH
1A9D 23 INC HL
1A9E 15 DEC D
1A9F C2991A JP NZ,RBRK1
1AA2 E1 RBRK2: POP HL ;NOT FOUND
1AA3 B7 OR A ;CLEAR CARRY
1AA4 C9 RET
1AA5 E1 FBRK: POP HL
1AA6 37 SCF
1AA7 C9 RET ;FOUND A BREAK, SET CARRY AND RETURN
1AA8 E5 SIBRKQ: PUSH HL
1AA9 CDB61A CALL GETVOC
1AAC 56 LD D,(HL) ;NUMBER OF SELF INSERTING BREAKS
1AAD 15 DEC D
1AAE 14 INC D
1AAF CAA21A JP Z,RBRK2 ;FAIL
1AB2 23 INC HL
1AB3 C3991A JP RBRK1
1AB6 2ABB21 GETVOC: LD HL,(ZCODEP)
1AB9 110800 LD DE,ZVOCAB
1ABC 19 ADD HL,DE
1ABD 56 LD D,(HL)
1ABE 23 INC HL
1ABF 5E LD E,(HL)
1AC0 2ABB21 LD HL,(ZCODEP)
1AC3 19 ADD HL,DE
1AC4 C9 RET
1AC5 202E2C3F BRKTBL: DB ' .,?'
1AC9 0D0A090C DB 0DH,0AH,9H,0CH
1ACD 2222 DB 22H,22H
000A NBRKS EQU $-BRKTBL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 63
1ACF CDB61A FINDW: CALL GETVOC ;FIND WORD IN VOCAB TABLE, ASSUMES VOCAB IN MEMORY
1AD2 7E LD A,(HL)
1AD3 23 INC HL
1AD4 CDEA1E CALL HLOFF ;SKIP OVER SELF INSERTING BREAKS
1AD7 7E LD A,(HL)
1AD8 87 ADD A,A
1AD9 87 ADD A,A
1ADA 87 ADD A,A
1ADB 87 ADD A,A
1ADC 4F LD C,A ;C HAS 16 TIMES VOCAB ENTRY SIZE
1ADD 23 INC HL
1ADE 56 LD D,(HL)
1ADF 23 INC HL
1AE0 5E LD E,(HL)
1AE1 23 INC HL ;HL POINTS TO VOCAB TABLE
1AE2 3AC621 LD A,(ZSTBUO+1) ;GET FIRST CHARACTER
1AE5 47 LD B,A ;PUT IT IN B
1AE6 C3F21A JP FWL2 ;WE CAN'T START AT THE BEGINNING
1AE9 B2 FWL1A: OR D ;HERE ON 16 WORD BOUNDRY
1AEA CA071B JP Z,FWL3 ;END OF TABLE
1AED 7E FWL1: LD A,(HL)
1AEE B8 CP B ;CHECK ONLY FIRST BYTE
1AEF D2071B JP NC,FWL3 ;FOUND PROPER AREA FOR FINE SEARCH
1AF2 7D FWL2: LD A,L
1AF3 81 ADD A,C
1AF4 6F LD L,A
1AF5 7C LD A,H
1AF6 CE00 ADC A,0
1AF8 67 LD H,A ;POINTER TO NEXT BLOCK (HLOFF NOT USED FOR SPEED)
1AF9 7B LD A,E
1AFA D610 SUB 16 ;16 MORE WORDS
1AFC 5F LD E,A
1AFD CAE91A JP Z,FWL1A
1B00 D2ED1A JP NC,FWL1
1B03 15 DEC D
1B04 F2ED1A JP P,FWL1 ;NOT OUT OF WORDS
1B07 7D FWL3: LD A,L ;NOW DO FINE CHECK
1B08 91 SUB C ;BACKUP 16 WORDS
1B09 6F LD L,A
1B0A 7C LD A,H
1B0B DE00 SBC A,0
1B0D 67 LD H,A
1B0E 7B LD A,E
1B0F C610 ADD A,16
1B11 5F LD E,A
1B12 7A LD A,D
1B13 CE00 ADC A,0
1B15 57 LD D,A ;BACKUP COUNT
1B16 79 LD A,C
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 64
1B17 0F RRCA
1B18 0F RRCA
1B19 0F RRCA
1B1A 0F RRCA
1B1B 4F LD C,A ;REAL ENTRY SIZE
1B1C FWL4:
1B1C 3AC621 LD A,(ZSTBUO+1)
1B1F BE CP (HL)
1B20 DA541B JP C,FWFAIL
1B23 C24A1B JP NZ,FWL4A ;CHECK ALL 4 BYTES
1B26 23 INC HL
1B27 3AC521 LD A,(ZSTBUO)
1B2A BE CP (HL)
1B2B DA541B JP C,FWFAIL
1B2E C2491B JP NZ,FWL4B
1B31 23 INC HL
1B32 3AC821 LD A,(ZSTBUO+3)
1B35 BE CP (HL)
1B36 DA541B JP C,FWFAIL
1B39 C2481B JP NZ,FWL4C
1B3C 23 INC HL
1B3D 3AC721 LD A,(ZSTBUO+2)
1B40 BE CP (HL)
1B41 DA541B JP C,FWFAIL
1B44 CA581B JP Z,FWSUCC ;MATCH
1B47 2B DEC HL
1B48 2B FWL4C: DEC HL
1B49 2B FWL4B: DEC HL
1B4A 79 FWL4A: LD A,C
1B4B CDEA1E CALL HLOFF
1B4E 1B DEC DE
1B4F 7A LD A,D
1B50 B3 OR E
1B51 C21C1B JP NZ,FWL4 ;NOT OUT OF WORDS YET
1B54 110000 FWFAIL: LD DE,0
1B57 C9 RET
1B58 2B FWSUCC: DEC HL
1B59 2B DEC HL
1B5A 2B DEC HL
1B5B EB EX DE,HL
1B5C 2ABB21 LD HL,(ZCODEP)
1B5F 7B LD A,E
1B60 95 SUB L
1B61 5F LD E,A
1B62 7A LD A,D
1B63 9C SBC A,H
1B64 57 LD D,A
1B65 C9 RET
1B66 3A9D21 PRINTC: LD A,(ARG1)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 65
1B69 4F LD C,A
1B6A CDB604 CALL COUT
1B6D C3F211 JP MLOOP
1B70 2A9D21 PRINTN: LD HL,(ARG1)
1B73 CD791B CALL PRNTNC
1B76 C3F211 JP MLOOP
1B79 7C PRNTNC: LD A,H
1B7A B7 OR A
1B7B FCA71B CALL M,PRNTNG ;NEGATIVE NUMBER
1B7E 0600 LD B,0 ;DIGIT COUNT
1B80 7C PRNTN1: LD A,H
1B81 B5 OR L
1B82 CA901B JP Z,PRNTN3
1B85 110A00 LD DE,10
1B88 CD271C CALL DIVIDE
1B8B D5 PUSH DE
1B8C 04 INC B
1B8D C3801B JP PRNTN1
1B90 AF PRNTN3: XOR A
1B91 80 ADD A,B
1B92 CAA21B JP Z,PRNTN6 ;PRINT AT LEAST 0
1B95 D1 PRNTN4: POP DE
1B96 3E30 LD A,'0'
1B98 83 ADD A,E
1B99 4F LD C,A
1B9A CDB604 CALL COUT
1B9D 05 DEC B
1B9E C2951B JP NZ,PRNTN4
1BA1 C9 RET
1BA2 0E30 PRNTN6: LD C,'0'
1BA4 C3B604 JP COUT
1BA7 0E2D PRNTNG: LD C,'-' ;PRINT -
1BA9 CDB604 CALL COUT
1BAC C36D1C JP SIGNCN ;CHANGE SIGN
1BAF 2A9D21 RANDOM: LD HL,(ARG1) ;RANDOM GENERATOR
1BB2 EB EX DE,HL
1BB3 CDD01B CALL RND ;GET THE BASE NUMBER
1BB6 CD271C CALL DIVIDE
1BB9 EB EX DE,HL ;GET REMAINDER
1BBA 23 INC HL ;MAKE NOT EQUAL TO 0
1BBB C30D13 JP PUTVAL
1BBE 2A9D21 ZPUSH: LD HL,(ARG1)
1BC1 CD0E1D CALL PSHSTK
1BC4 C3F211 JP MLOOP
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 66
1BC7 CD271D ZPOP: CALL POPSTK
1BCA 3A9D21 LD A,(ARG1)
1BCD C32D17 JP VARPTR
;
; **********************************************************************
; * *
; * ZORK - RANDOM ROUTINES *
; * *
; **********************************************************************
;
1BD0 C5 RND: PUSH BC
1BD1 0E02 LD C,2 ;2 TIMES THROUGH LOOP
1BD3 0608 RND2: LD B,8
1BD5 218E21 LD HL,SHIFT
1BD8 7E LD A,(HL)
1BD9 07 RND1: RLCA
1BDA 07 RLCA
1BDB 07 RLCA
1BDC AE XOR (HL)
1BDD 17 RLA
1BDE 17 RLA
1BDF 218E21 LD HL,SHIFT
1BE2 7E LD A,(HL)
1BE3 17 RLA
1BE4 77 LD (HL),A
1BE5 23 INC HL
1BE6 7E LD A,(HL)
1BE7 17 RLA
1BE8 77 LD (HL),A
1BE9 23 INC HL
1BEA 7E LD A,(HL)
1BEB 17 RLA
1BEC 77 LD (HL),A
1BED 23 INC HL
1BEE 7E LD A,(HL)
1BEF 17 RLA
1BF0 77 LD (HL),A
1BF1 05 DEC B
1BF2 C2D91B JP NZ,RND1
1BF5 0D DEC C
1BF6 C2D31B JP NZ,RND2
1BF9 C1 POP BC
1BFA 2A9021 LD HL,(SHIFT+2) ;GET THE NUMBER
1BFD C9 RET
1BFE C5 MULT: PUSH BC ;DEHL <=DE*HL
1BFF 010000 LD BC,0
1C02 3E10 LD A,16 ;LOOP COUNTER
1C04 F5 MULT1: PUSH AF
1C05 7B LD A,E
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 67
1C06 E601 AND 1 ;CHECK BIT FOR ADD
1C08 CA101C JP Z,MULT2 ;SKIP ADD PART IF 0
1C0B E5 PUSH HL ;SAVE MULTIPLIER
1C0C 09 ADD HL,BC ;ADD PART
1C0D 44 LD B,H
1C0E 4D LD C,L
1C0F E1 POP HL ;RESTORE H
1C10 78 MULT2: LD A,B ;32 BIT SHIFT REMEMBERING CARRY
1C11 1F RRA
1C12 47 LD B,A
1C13 79 LD A,C
1C14 1F RRA
1C15 4F LD C,A
1C16 7A LD A,D
1C17 1F RRA
1C18 57 LD D,A
1C19 7B LD A,E
1C1A 1F RRA
1C1B 5F LD E,A
1C1C F1 POP AF ;GET BACK LOOP COUNT
1C1D 3D DEC A
1C1E C2041C JP NZ,MULT1
1C21 62 LD H,D ;PUT LOW ORDER ANSWER IN HL
1C22 6B LD L,E
1C23 50 LD D,B ;HIGH PART IN DE
1C24 59 LD E,C
1C25 C1 POP BC
1C26 C9 RET
1C27 C5 DIVIDE: PUSH BC ;HL<=HL/DE, REMAINDER IN DE
1C28 44 LD B,H
1C29 4D LD C,L
1C2A 7A LD A,D ;NEGATE DIVISOR
1C2B 2F CPL
1C2C 57 LD D,A
1C2D 7B LD A,E
1C2E 2F CPL
1C2F 5F LD E,A
1C30 13 INC DE ;FOR TWO'S COMPLEMENT
1C31 210000 LD HL,0 ;INITIAL VALUE FOR REMAINDER
1C34 3E11 LD A,17 ;INIT LOOP COUNTER
1C36 E5 DDIV0: PUSH HL ;SAVE REMAINDER
1C37 19 ADD HL,DE ;SUB DIVIS
1C38 D23C1C JP NC,DDIV1 ;UNDERFLOW, RESTORE HL
1C3B E3 EX (SP),HL
1C3C E1 DDIV1: POP HL
1C3D F5 PUSH AF ;SAVE LOOP COUNTER
1C3E 79 LD A,C ;4 REG SHIFT LEFT
1C3F 17 RLA ;WITH CARRY
1C40 4F LD C,A ;CY->C->B->L->H
1C41 78 LD A,B
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 68
1C42 17 RLA
1C43 47 LD B,A
1C44 7D LD A,L
1C45 17 RLA
1C46 6F LD L,A
1C47 7C LD A,H
1C48 17 RLA
1C49 67 LD H,A
1C4A F1 POP AF ;RESTORE LOOP COUNTER
1C4B 3D DEC A ;DECREMENT IT
1C4C C2361C JP NZ,DDIV0 ;KEEP LOOPING
;CLEANUP, SHIFT REMAINDER RIGHT AND RETURN IN DE
1C4F B7 OR A
1C50 7C LD A,H
1C51 1F RRA
1C52 57 LD D,A
1C53 7D LD A,L
1C54 1F RRA
1C55 5F LD E,A
1C56 60 LD H,B
1C57 69 LD L,C
1C58 C1 POP BC
1C59 C9 RET
1C5A AF SIGNC: XOR A
1C5B 329C21 LD (SIGNF),A ;SET SIGNF
1C5E CD751C CALL SIGNPC ;POS CHECK
1C61 EB EX DE,HL
1C62 CD751C CALL SIGNPC
1C65 EB EX DE,HL
1C66 C9 RET
1C67 3A9C21 SIGNS: LD A,(SIGNF) ;CHECK FOR SIGN
1C6A E601 AND 1 ;EVEN OR ODD
1C6C C8 RET Z ;EVEN NUMBER OF NEGATIVES, ANSWER OK
1C6D AF SIGNCN: XOR A ;CHANGE SIGN
1C6E 95 SUB L
1C6F 6F LD L,A
1C70 3E00 LD A,0
1C72 9C SBC A,H
1C73 67 LD H,A ;INVERTED HL
1C74 C9 RET
1C75 7C SIGNPC: LD A,H
1C76 B7 OR A
1C77 F0 RET P ;POSITIVE
1C78 3A9C21 LD A,(SIGNF)
1C7B 3C INC A
1C7C 329C21 LD (SIGNF),A
1C7F C36D1C JP SIGNCN ;CHANGE SIGN
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 69
1C82 3A9D21 FLAGSU: LD A,(ARG1) ;SETUP FOR FLAG ROUTINES
1C85 CDD61C CALL OBJLOC ;BC WILL HAVE BIT POSITION, DE FLAG VALUE
1C88 3A9F21 LD A,(ARG2) ;HL WILL GET OBJ POINTER
1C8B FE10 CP 16
1C8D DA941C JP C,FLGSU1 ;NEXT WORD
1C90 D610 SUB 16 ;SECOND SET OF FLAGS
1C92 23 INC HL
1C93 23 INC HL
1C94 E5 FLGSU1: PUSH HL
1C95 47 LD B,A
1C96 3E0F LD A,15
1C98 90 SUB B
1C99 210100 LD HL,1
1C9C CAA41C FLGSU2: JP Z,FLGSU3 ;BIT IN POSITION
1C9F 29 ADD HL,HL
1CA0 3D DEC A
1CA1 C39C1C JP FLGSU2
1CA4 44 FLGSU3: LD B,H
1CA5 4D LD C,L
1CA6 E1 POP HL
1CA7 56 LD D,(HL)
1CA8 23 INC HL
1CA9 5E LD E,(HL)
1CAA 2B DEC HL
1CAB C9 RET
1CAC 3A9D21 PROPB: LD A,(ARG1) ;BEG OF PROPERTY PART OF OBJECT
1CAF CDD61C CALL OBJLOC
1CB2 110700 LD DE,7
1CB5 19 ADD HL,DE
1CB6 56 LD D,(HL)
1CB7 23 INC HL
1CB8 5E LD E,(HL)
1CB9 2ABB21 LD HL,(ZCODEP)
1CBC 19 ADD HL,DE
1CBD 7E LD A,(HL) ;LENGTH OF DESCRIPTION
1CBE 87 ADD A,A ;*2
1CBF 3C INC A ;+1
1CC0 C3EA1E JP HLOFF ;INDEX AND RETURN
1CC3 7E PROPN: LD A,(HL) ;HL HAS REAL PROP POINTER
1CC4 E61F AND 1FH
1CC6 C9 RET
1CC7 7E PROPL: LD A,(HL) ;PROP LENGTH, HL HAS REAL PROP POINTER
1CC8 07 RLCA
1CC9 07 RLCA
1CCA 07 RLCA
1CCB E607 AND 7
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 70
1CCD C9 RET
1CCE CDC71C PROPNX: CALL PROPL
1CD1 C602 ADD A,2
1CD3 C3EA1E JP HLOFF ;NEXT PROP POINTER
1CD6 D5 OBJLOC: PUSH DE ;GET OBJECT LOCATION, A HAS OBJECT NUMBER
1CD7 6F LD L,A
1CD8 2600 LD H,0
1CDA 54 LD D,H
1CDB 5D LD E,L
1CDC 29 ADD HL,HL
1CDD 29 ADD HL,HL
1CDE 29 ADD HL,HL
1CDF 19 ADD HL,DE
1CE0 113500 LD DE,53
1CE3 19 ADD HL,DE ;9*NUMBER + 53
1CE4 E5 PUSH HL ;OBJECT OFFSET
1CE5 2ABB21 LD HL,(ZCODEP)
1CE8 110A00 LD DE,ZOBJEC
1CEB 19 ADD HL,DE
1CEC 56 LD D,(HL)
1CED 23 INC HL
1CEE 5E LD E,(HL)
1CEF 2ABB21 LD HL,(ZCODEP)
1CF2 19 ADD HL,DE
1CF3 D1 POP DE
1CF4 19 ADD HL,DE ;REAL ADDRESS
1CF5 D1 POP DE
1CF6 C9 RET
1CF7 2A9D21 GETARG: LD HL,(ARG1)
1CFA EB EX DE,HL
1CFB 2A9F21 LD HL,(ARG2) ;GET BOTH ARGS
1CFE C9 RET
1CFF 7A SHLGED: LD A,D
1D00 AC XOR H
1D01 F2071D JP P,HLGEDE ;BOTH OF SAME SIGN
1D04 7C LD A,H
1D05 BA CP D ;CARRY WILL BE SET IF D NEG AND THUS LESS THAN H
1D06 C9 RET
1D07 7A HLGEDE: LD A,D ;RETURN WITH CARRY SET IF HL>=DE
1D08 BC CP H
1D09 C0 RET NZ
1D0A 7D LD A,L
1D0B BB CP E
1D0C 3F CCF
1D0D C9 RET
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 71
1D0E D5 PSHSTK: PUSH DE
1D0F EB EX DE,HL ;PUSH STACK
1D10 2AE90D LD HL,(ZSTAKP) ;STACK POINTER
1D13 2B DEC HL
1D14 73 LD (HL),E
1D15 2B DEC HL
1D16 72 LD (HL),D
1D17 22E90D LD (ZSTAKP),HL ;SAVE POINTER
1D1A 218A21 LD HL,ZSTAKC ;COUNT
1D1D 34 INC (HL)
1D1E 7E LD A,(HL)
1D1F FEE0 CP ZSTAKL
1D21 CC0602 CALL Z,ZER
1D24 EB EX DE,HL
1D25 D1 POP DE
1D26 C9 RET
; ---------
; POP STACK
; ---------
; POP WORD OFF Z-STACK AND RETURN IT IN HL
1D27 D5 POPSTK: PUSH DE ;SAVE DE
1D28 2AE90D LD HL,(ZSTAKP) ;HL <= Z-STACK POINTER
1D2B 56 LD D,(HL) ;GET MSB OF WORD
1D2C 23 INC HL
1D2D 5E LD E,(HL) ;GET LSB OF WORD
1D2E 23 INC HL
1D2F 22E90D LD (ZSTAKP),HL ;SAVE NEW Z-STACK POINTER
1D32 218A21 LD HL,ZSTAKC ;CHECK COUNT
1D35 35 DEC (HL)
1D36 CC0602 CALL Z,ZER ;OVER POP ERROR
1D39 EB EX DE,HL ;VALUE IN HL
1D3A D1 POP DE ;RESTORE DE
1D3B C9 RET
;
; **********************************************************************
; * *
; * ZORK - PAGING ROUTINES *
; * *
; **********************************************************************
;
1D3C 3AB021 NEXTPC: LD A,(ZPCFLG) ;HAS PAGE MOVED?
1D3F B7 OR A
1D40 CA691D JP Z,NXTPC1 ;PAGE HAS MOVED
1D43 2AAE21 LD HL,(ZPCPNT)
1D46 46 LD B,(HL) ;GET VALUE IN B
1D47 23 INC HL
1D48 22AE21 LD (ZPCPNT),HL ;STORE BACK POINTER
1D4B 2A8821 LD HL,(ZPCL)
1D4E 2C INC L
1D4F 228821 LD (ZPCL),HL ;ASSUME OK AT FIRST
1D52 78 LD A,B
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 72
1D53 C0 RET NZ ;OK IF L NOT ZERO
1D54 7C LD A,H ;CROSSED 256 BYTE BOUNDRY
1D55 24 INC H
1D56 228821 LD (ZPCL),HL ;AGAIN ASSUME NOT PASSED 256 BOUNTRY
1D59 B7 OR A
1D5A 78 LD A,B
1D5B C8 RET Z ;DID NOT CROSS 512 BOUNDRY
1D5C AF XOR A
1D5D 328921 LD (ZPCL+1),A ;0 ZPCL
1D60 32B021 LD (ZPCFLG),A ;BAD DATA IN PCPNT, WILL HAVE TO FETCH NEW BLOCK
1D63 218721 LD HL,ZPCH ;INCREMENT ZPC HIGH
1D66 34 INC (HL)
1D67 78 LD A,B
1D68 C9 RET ;RETURN, TROUBLE NEXT TIME
1D69 3A8721 NXTPC1: LD A,(ZPCH) ;GET ZPAGE NUMBER
1D6C 219B21 LD HL,ZMEMT ;TOP OF LOW MEM
1D6F BE CP (HL)
1D70 2ABB21 LD HL,(ZCODEP) ;PRELOAD PORTION
1D73 DA881D JP C,NXTPCL
1D76 CDF11E CALL FNDPGE
1D79 32B121 LD (ZPCPG),A ;STORE PAGE
1D7C DA9B1D JP C,NXTPC2 ;COULD NOT FIND PAGE, SWAP IT IN (OH WHAT A SHAME)
1D7F CDAB1E NXTPC3: CALL SPLICE ;PUT AT TOP OF LIST
1D82 3AB121 LD A,(ZPCPG) ;SET UP POINTER TO PAGE
1D85 2AB921 LD HL,(PGBUFP) ;POINTER TO BEGINNING OF PAGE BUFFERS
1D88 NXTPCL:
1D88 87 ADD A,A
1D89 84 ADD A,H
1D8A 67 LD H,A
1D8B EB EX DE,HL ;DE NOW HAS POINTER TO BEG OF BUFFER
1D8C 2A8821 LD HL,(ZPCL)
1D8F 19 ADD HL,DE ;ADD IN OFFSET
1D90 22AE21 LD (ZPCPNT),HL ;ZPCPNT NOW VALID
1D93 3EFF LD A,0FFH
1D95 32B021 LD (ZPCFLG),A
1D98 C33C1D JP NEXTPC ;TRY AGAIN, THIS TIME IT WILL NOT FAIL
1D9B 21B821 NXTPC2: LD HL,MPCPG ;CHECK IF DISTROYING MPC
1D9E BE CP (HL)
1D9F C2A81D JP NZ,NXTPC4 ;NOT DISTROYING PAGE
1DA2 47 LD B,A
1DA3 AF XOR A
1DA4 32B721 LD (MPCFLG),A
1DA7 78 LD A,B
1DA8 2AB921 NXTPC4: LD HL,(PGBUFP)
1DAB 87 ADD A,A
1DAC 84 ADD A,H
1DAD 67 LD H,A ;POINTER TO BEGINNING OF BUFFER
1DAE 3A8721 LD A,(ZPCH)
1DB1 CDF702 CALL GETDSK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 73
1DB4 3AB121 LD A,(ZPCPG)
1DB7 47 LD B,A
1DB8 21AB0F LD HL,PGTBL
1DBB CDEA1E CALL HLOFF
1DBE 3A8721 LD A,(ZPCH)
1DC1 77 LD (HL),A ;SET PAGE TABLE ENTRY
1DC2 78 LD A,B
1DC3 C37F1D JP NXTPC3 ;PAGE NOW IN MEMORY
1DC6 7C SETWRD: LD A,H
1DC7 B7 OR A
1DC8 1F RRA
1DC9 32B221 LD (MPCH),A
1DCC 7C SETWR1: LD A,H
1DCD E601 AND 1
1DCF 67 LD H,A
1DD0 22B321 LD (MPCL),HL
1DD3 AF XOR A
1DD4 32B721 LD (MPCFLG),A
1DD7 C9 RET
1DD8 7C SETSTR: LD A,H
1DD9 32B221 LD (MPCH),A
1DDC 29 ADD HL,HL
1DDD C3CC1D JP SETWR1
1DE0 AF GETFRE: XOR A
1DE1 32B721 LD (MPCFLG),A ;NO MEM PAGE LEFT
1DE4 3ABF21 LD A,(PGBOT)
1DE7 32B821 LD (MPCPG),A
1DEA CD781E CALL CKZPCP
1DED CDAB1E CALL SPLICE
1DF0 3AB821 LD A,(MPCPG)
1DF3 47 LD B,A
1DF4 2AB921 LD HL,(PGBUFP)
1DF7 87 ADD A,A
1DF8 84 ADD A,H
1DF9 67 LD H,A
1DFA 22B521 LD (MPCPNT),HL
1DFD 78 LD A,B
1DFE 21AB0F LD HL,PGTBL
1E01 CDEA1E CALL HLOFF
1E04 3600 LD (HL),0
1E06 C9 RET
1E07 CD121E GETWRD: CALL GETBYT
1E0A F5 PUSH AF
1E0B CD121E CALL GETBYT ;GET A FULL WORD
1E0E 6F LD L,A
1E0F F1 POP AF
1E10 67 LD H,A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 74
1E11 C9 RET
1E12 3AB721 GETBYT: LD A,(MPCFLG) ;HAS PAGE MOVED?
1E15 B7 OR A
1E16 CA3F1E JP Z,GETBT1 ;PAGE HAS MOVED
1E19 2AB521 LD HL,(MPCPNT)
1E1C 46 LD B,(HL) ;GET VALUE IN B
1E1D 23 INC HL
1E1E 22B521 LD (MPCPNT),HL ;STORE BACK POINTER
1E21 2AB321 LD HL,(MPCL)
1E24 2C INC L
1E25 22B321 LD (MPCL),HL ;ASSUME OK AT FIRST
1E28 78 LD A,B
1E29 C0 RET NZ ;OK IF L NOT ZERO
1E2A 7C LD A,H ;CROSSED 256 BYTE BOUNDRY
1E2B 24 INC H
1E2C 22B321 LD (MPCL),HL ;AGAIN ASSUME NOT PASSED 256 BOUNTRY
1E2F B7 OR A
1E30 78 LD A,B
1E31 C8 RET Z ;DID NOT CROSS 512 BOUNDRY
1E32 AF XOR A
1E33 32B421 LD (MPCL+1),A ;0 MPCL
1E36 32B721 LD (MPCFLG),A ;BAD DATA IN PCPNT, WILL HAVE TO FETCH NEW BLOCK
1E39 21B221 LD HL,MPCH ;INCREMENT ZPC HIGH
1E3C 34 INC (HL)
1E3D 78 LD A,B
1E3E C9 RET ;RETURN, TROUBLE NEXT TIME
1E3F 3A9A21 GETBT1: LD A,(VERF)
1E42 B7 OR A
1E43 C2841E JP NZ,GETB1A ;IN VERIFY MODE
1E46 3AB221 LD A,(MPCH) ;GET MPAGE NUMBER
1E49 219B21 LD HL,ZMEMT ;TOP OF LOW MEM
1E4C BE CP (HL)
1E4D 2ABB21 LD HL,(ZCODEP) ;PRELOAD PORTION
1E50 DA651E JP C,GETBTL
1E53 CDF11E CALL FNDPGE
1E56 32B821 LD (MPCPG),A ;STORE PAGE
1E59 DA8A1E JP C,GETBT2 ;COULD NOT FIND PAGE, SWAP IT IN (OH WHAT A SHAME)
1E5C CDAB1E GETBT3: CALL SPLICE ;PUT AT TOP OF LIST
1E5F 3AB821 LD A,(MPCPG) ;SET UP POINTER TO PAGE
1E62 2AB921 LD HL,(PGBUFP) ;POINTER TO BEGINNING OF PAGE BUFFERS
1E65 GETBTL:
1E65 87 ADD A,A
1E66 84 ADD A,H
1E67 67 LD H,A
1E68 EB EX DE,HL
1E69 2AB321 LD HL,(MPCL)
1E6C 19 ADD HL,DE
1E6D 22B521 LD (MPCPNT),HL
1E70 3EFF LD A,0FFH
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 75
1E72 32B721 LD (MPCFLG),A
1E75 C3121E JP GETBYT ;TRY AGAIN, THIS TIME IT WILL NOT FAIL
1E78 21B121 CKZPCP: LD HL,ZPCPG ;CHECK IF DISTROYING ZPC
1E7B BE CP (HL)
1E7C C0 RET NZ ;NOT DISTROYING PAGE
1E7D 47 LD B,A
1E7E AF XOR A
1E7F 32B021 LD (ZPCFLG),A
1E82 78 LD A,B
1E83 C9 RET
1E84 3ABF21 GETB1A: LD A,(PGBOT)
1E87 32B821 LD (MPCPG),A ;NEW PAGE
1E8A CD781E GETBT2: CALL CKZPCP
1E8D 2AB921 LD HL,(PGBUFP)
1E90 87 ADD A,A
1E91 84 ADD A,H
1E92 67 LD H,A ;POINTER TO BEGINNING OF BUFFER
1E93 3AB221 LD A,(MPCH)
1E96 CDF702 CALL GETDSK
1E99 3AB821 LD A,(MPCPG)
1E9C 47 LD B,A
1E9D 21AB0F LD HL,PGTBL
1EA0 CDEA1E CALL HLOFF
1EA3 3AB221 LD A,(MPCH)
1EA6 77 LD (HL),A ;SET PAGE TABLE ENTRY
1EA7 78 LD A,B
1EA8 C35C1E JP GETBT3 ;PAGE NOW IN MEMORY
1EAB 4F SPLICE: LD C,A ;SPLICE PAGE IN A TO TOP OF LIST
1EAC 3ABE21 LD A,(PGTOP) ;GET OLD TOP
1EAF B9 CP C
1EB0 C8 RET Z ;SAME TOP AS LAST
1EB1 47 LD B,A
1EB2 79 LD A,C
1EB3 32BE21 LD (PGTOP),A ;NEW TOP
1EB6 21EB0F LD HL,PGTBLF
1EB9 CDEA1E CALL HLOFF
1EBC 5E LD E,(HL) ;E HAS OLD FORWARD POINTER
1EBD 70 LD (HL),B ;NEW FORWARD TO OLD TOP
1EBE 212B10 LD HL,PGTBLB
1EC1 79 LD A,C
1EC2 CDEA1E CALL HLOFF
1EC5 56 LD D,(HL) ;D GETS OLD BACK POINTER
1EC6 36FF LD (HL),0FFH ;TOP HAS NO BACK
1EC8 7A LD A,D
1EC9 21EB0F LD HL,PGTBLF
1ECC CDEA1E CALL HLOFF
1ECF 73 LD (HL),E ;PATCH FORWARD POINTER
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 76
1ED0 78 LD A,B
1ED1 212B10 LD HL,PGTBLB
1ED4 CDEA1E CALL HLOFF
1ED7 71 LD (HL),C
1ED8 7B LD A,E
1ED9 3C INC A
1EDA CAE51E JP Z,SPLIC1 ;WAS LAST BLOCK WITHOUT FORWARD POINTER
1EDD 212A10 LD HL,PGTBLB-1 ;OFFSET INC A
1EE0 CDEA1E CALL HLOFF
1EE3 72 LD (HL),D ;SPLICE BACK POINTER
1EE4 C9 RET
1EE5 7A SPLIC1: LD A,D
1EE6 32BF21 LD (PGBOT),A ;NEW BOTTOM OF LIST
1EE9 C9 RET
1EEA HLOFF:
1EEA 85 ADD A,L ;INDIRECT HL THROUGH A
1EEB 6F LD L,A
1EEC 3E00 LD A,0
1EEE 8C ADC A,H
1EEF 67 LD H,A
1EF0 C9 RET
1EF1 21BD21 FNDPGE: LD HL,NPGS ;FIND PAGE IN A, RETURN WITH CARRY
1EF4 ;SET IF NOT FOUND. A WILL HAVE FOUND PAGE OR
1EF4 ;BOTTOM OF PAGE LIST
1EF4 46 LD B,(HL)
1EF5 0E00 LD C,0
1EF7 21AB0F LD HL,PGTBL
1EFA BE FNDPGL: CP (HL)
1EFB CA091F JP Z,FNDPG1 ;SUCCESS
1EFE 0C INC C
1EFF 23 INC HL
1F00 05 DEC B
1F01 C2FA1E JP NZ,FNDPGL
1F04 3ABF21 LD A,(PGBOT) ;NOT FOUND
1F07 37 SCF ;SET CARRY AND RETURN BOTTOM
1F08 C9 RET
1F09 79 FNDPG1: LD A,C
1F0A C9 RET ;CARRY WILL BE CLEARED
;
; **********************************************************************
; * *
; * ZORK - STRING ROUTINES *
; * *
; **********************************************************************
;
; ---------------
; PRINT Z-STRING
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 77
; ---------------
1F0B AF PZSTR: XOR A ;PRINT ZSTRING POINTED TO BY MPC (NOT REENTRENT)
1F0C 32C121 LD (CSPERM),A ;PERMANENT CHARSET
1F0F 32C221 LD (STBYTF),A ;RESET STRING BYTE FLAG
1F12 3D DEC A
1F13 32C021 LD (CSTEMP),A ;NO TEMP CHARSET IN EFFECT
1F16 CD3120 PZSTRL: CALL GETZCH ;GET A Z-CHARACTER
1F19 D8 RET C ;END OF STRING IF CARRY SET
1F1A 47 LD B,A
1F1B B7 OR A
1F1C CAD11F JP Z,PZSTRS ;0=SPACE
1F1F FE04 CP 4 ;IS THIS AN F-WORD?
1F21 DA701F JP C,PZFWRD ; YES.
1F24 FE06 CP 6 ;IS IT A SHIFT CHAR?
1F26 DAE91F JP C,PZSTRP ; YES. CHANGE CHAR SET
1F29 CD2020 CALL GETMOD
1F2C B7 OR A ;IS IT CHARSET 0?
1F2D C23A1F JP NZ,PZSTR1 ; NOPE.
;PRINT LOWER CASE CHAR (CHARSET 0)
1F30 3E5B LD A,'a'-6 ;ASCII "a" MINUS Z-OFFSET
1F32 PZSTP0:
1F32 80 ADD A,B ;ADD CHARACTER
1F33 4F LD C,A
1F34 CDB604 PZSTP1: CALL COUT ;PRINT RESULT
1F37 C3161F JP PZSTRL ;AND FETCH ANOTHER Z-CHAR
;CHARSET 1 OR 2?
1F3A 3D PZSTR1: DEC A ;SET 1?
1F3B C2431F JP NZ,PZSTR2 ; NOPE, IT'S SET 2
;PRINT UPPER-CASE CHAR (CHARSET 1)
1F3E 3E3B LD A,'A'-6 ;ASCII "A" MINUS Z-OFFSET
1F40 C3321F JP PZSTP0 ;PROCESS IT
;DECODE/PRINT CHARSET 2
1F43 78 PZSTR2: LD A,B ;MODE 2
1F44 FE06 CP 6 ;DIRECT ASCII CHARACTER?
1F46 CA581F JP Z,PZSTRA ; YES.
1F49 FE07 CP 7 ;CARRIAGE RETURN?
1F4B CAD61F JP Z,PZSTRC ; YES.
1F4E 210020 LD HL,CHRTBL-8 ; NO. SUBTRACT OFFSET
1F51 CDEA1E CALL HLOFF
1F54 4E LD C,(HL) ;GET CHARACTER FROM TABLE
1F55 C3341F JP PZSTP1
1F58 CD3120 PZSTRA: CALL GETZCH ;FORM CHARACTER FROM TWO BYTES
1F5B 0F RRCA
1F5C 0F RRCA
1F5D 0F RRCA
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 78
1F5E 4F LD C,A
1F5F C5 PUSH BC
1F60 CD3120 CALL GETZCH
1F63 C1 POP BC
1F64 81 ADD A,C
1F65 4F LD C,A
1F66 FE09 CP 9 ;TAB?
1F68 C2341F JP NZ,PZSTP1
1F6B 0E20 LD C,20H
1F6D C3341F JP PZSTP1 ;PRINT IT
1F70 3D PZFWRD: DEC A
1F71 87 ADD A,A
1F72 87 ADD A,A
1F73 87 ADD A,A
1F74 87 ADD A,A
1F75 87 ADD A,A ;SET NUMBER -1 TIMES 32
1F76 32A921 LD (FWSET),A
1F79 CD3120 CALL GETZCH ;GET STRING NUMBER
1F7C D8 RET C ;BAD IF OUT OF CHARACTERS
1F7D 47 LD B,A
1F7E 3AC121 LD A,(CSPERM) ;PRINT ZSTRING POINTED TO BY MPC
1F81 67 LD H,A ;MAKE IT REENTERENT
1F82 3AC221 LD A,(STBYTF)
1F85 6F LD L,A
1F86 E5 PUSH HL
1F87 2AC321 LD HL,(ZSTWRD)
1F8A E5 PUSH HL
1F8B 2AB321 LD HL,(MPCL)
1F8E E5 PUSH HL
1F8F 2AB221 LD HL,(MPCH)
1F92 E5 PUSH HL
1F93 2AAA21 LD HL,(FWORDS)
1F96 3AA921 LD A,(FWSET)
1F99 80 ADD A,B ;ENTRY INTO 96 WORD TABLE
1F9A 87 ADD A,A
1F9B CDEA1E CALL HLOFF ;POINTER TO SPECIAL STRING
1F9E 7E LD A,(HL)
1F9F 32B221 LD (MPCH),A
1FA2 23 INC HL
1FA3 6E LD L,(HL)
1FA4 2600 LD H,0
1FA6 29 ADD HL,HL
1FA7 22B321 LD (MPCL),HL ;SET NEW MPC
1FAA AF XOR A
1FAB 32B721 LD (MPCFLG),A ;MPCPNT NOT VALID
1FAE CD0B1F CALL PZSTR ;PRINT SUB STRING (REENTRENT VERSION)
1FB1 AF XOR A ;RESTORE REENTRENT VALUES
1FB2 32B721 LD (MPCFLG),A
1FB5 E1 POP HL
1FB6 7D LD A,L
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 79
1FB7 32B221 LD (MPCH),A
1FBA E1 POP HL
1FBB 22B321 LD (MPCL),HL
1FBE E1 POP HL
1FBF 22C321 LD (ZSTWRD),HL
1FC2 E1 POP HL
1FC3 7C LD A,H
1FC4 32C121 LD (CSPERM),A
1FC7 7D LD A,L
1FC8 32C221 LD (STBYTF),A
1FCB CD2020 CALL GETMOD
1FCE C3161F JP PZSTRL
1FD1 0E20 PZSTRS: LD C,20H
1FD3 C3341F JP PZSTP1 ;PRINT SPACE
1FD6 0E0D PZSTRC: LD C,0DH ;CR-LF
1FD8 CDB604 CALL COUT
1FDB 0E0A LD C,0AH
1FDD C3341F JP PZSTP1
1FE0 78 PZSTRT: LD A,B ;SET TEMP MODE
1FE1 D603 SUB 3
1FE3 32C021 LD (CSTEMP),A
1FE6 C3161F JP PZSTRL
1FE9 CD2020 PZSTRP: CALL GETMOD ;SET CHAR MODE
1FEC B7 OR A ;MODE 0 IS TEMPORARY
1FED CAE01F JP Z,PZSTRT
1FF0 3D DEC A
1FF1 87 ADD A,A
1FF2 80 ADD A,B
1FF3 D604 SUB 4 ;INDEX INTO PERMTB
1FF5 E5 PUSH HL
1FF6 210420 LD HL,PERMTB
1FF9 CDEA1E CALL HLOFF
1FFC 7E LD A,(HL)
1FFD E1 POP HL
1FFE 32C121 LD (CSPERM),A
2001 C3161F JP PZSTRL
2004 01000002 PERMTB: DB 1,0,0,2
2008 30313233 CHRTBL: DB '0123456789.,!?_#'
2018 2722 DB $27,$22
201A 2F5C2D3A DB '/\-:()'
2020 3AC021 GETMOD: LD A,(CSTEMP)
2023 3C INC A
2024 3AC121 LD A,(CSPERM)
2027 C8 RET Z ;RETURN WITH PERM MODE IF NO TEMP MODE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 80
2028 E5 PUSH HL
2029 21C021 LD HL,CSTEMP
202C 7E LD A,(HL)
202D 36FF LD (HL),0FFH ;CLEAR MODE AFTER GETTING IT
202F E1 POP HL
2030 C9 RET
2031 3AC221 GETZCH: LD A,(STBYTF) ;FIND OUT WHICH BYTE
2034 B7 OR A
2035 37 SCF
2036 F8 RET M ;OUT OF CHARACTERS
2037 C24A20 JP NZ,GETZH1 ;NOT FIRST BYTE
203A 3C INC A
203B 32C221 LD (STBYTF),A
203E CD071E CALL GETWRD
2041 22C321 LD (ZSTWRD),HL ;SAVE WORD
2044 7C LD A,H
2045 0F RRCA
2046 0F RRCA
2047 E61F AND 1FH
2049 C9 RET
204A 3D GETZH1: DEC A
204B C25D20 JP NZ,GETZH2 ;LAST CHAR IN WORD
204E 3E02 LD A,2
2050 32C221 LD (STBYTF),A
2053 2AC321 LD HL,(ZSTWRD)
2056 29 ADD HL,HL
2057 29 ADD HL,HL
2058 29 ADD HL,HL
2059 7C LD A,H
205A E61F AND 1FH
205C C9 RET
205D AF GETZH2: XOR A
205E 32C221 LD (STBYTF),A
2061 2AC321 LD HL,(ZSTWRD)
2064 7C LD A,H
2065 B7 OR A
2066 F26E20 JP P,GETZH3 ;NOT LAST CHAR IN STRING
2069 3EFF LD A,0FFH
206B 32C221 LD (STBYTF),A ;INDICATE END OF STRING
206E 7D GETZH3: LD A,L
206F E61F AND 1FH
2071 C9 RET
2072 AF CONZST: XOR A ;CONVERT TO Z STRING
2073 32C121 LD (CSPERM),A
2076 21C521 LD HL,ZSTBUO ;POINTER TO OUTPUT BUFFER
2079 0606 LD B,6 ;OUTPUT 6 CHARACTERS TO CONVERT
207B 3605 CONZSL: LD (HL),5
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 81
207D 23 INC HL
207E 05 DEC B
207F C27B20 JP NZ,CONZSL ;FILL BUFFER WITH PAD CHARACTERS
2082 0606 LD B,6
2084 11C521 LD DE,ZSTBUO ;OUTPUT
2087 219221 LD HL,ZSTBUI ;INPUT
208A 4E CNZSL1: LD C,(HL)
208B 23 INC HL
208C 79 LD A,C
208D B7 OR A
208E 3E05 LD A,5
2090 CABF20 JP Z,CNZSLO ;BLANKS
2093 79 LD A,C
2094 FE20 CP ' '
2096 3E00 LD A,0
2098 CABF20 JP Z,CNZSLO ;SPACE
209B D5 CNZSL2: PUSH DE
209C 79 LD A,C
209D CD1D21 CALL ZCHRCS ;WHICH CHARACTER SET
20A0 5F LD E,A ;E HAS CHARACTER SET OF CURRENT CHAR
20A1 3AC121 LD A,(CSPERM)
20A4 BB CP E
20A5 CAB320 JP Z,CNZSLC ;CONVERT THEN OUTPUT
20A8 7B LD A,E
20A9 C603 ADD A,3
20AB D1 POP DE
20AC 12 LD (DE),A ;OUTPUT TEMP SHIFT
20AD 13 INC DE
20AE 05 DEC B
20AF CA3C21 JP Z,CNZSLE
20B2 D5 PUSH DE
20B3 79 CNZSLC: LD A,C
20B4 D1 POP DE
20B5 CD1D21 CALL ZCHRCS
20B8 3D DEC A
20B9 F2C820 JP P,CNZSC1 ;NOT LOWER CASE
20BC 79 LD A,C
20BD D65B SUB 'a'-6
20BF 12 CNZSLO: LD (DE),A
20C0 13 INC DE
20C1 05 DEC B
20C2 C28A20 JP NZ,CNZSL1 ;NEXT
20C5 C33C21 JP CNZSLE ;END
20C8 C2D120 CNZSC1: JP NZ,CNZSC3 ;NOT UPPER CASE
20CB 79 LD A,C
20CC D63B SUB 'A'-6
20CE C3BF20 JP CNZSLO
20D1 79 CNZSC3: LD A,C
20D2 FE0D CP 0DH
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 82
20D4 C2E320 JP NZ,CNZSC4
20D7 7E LD A,(HL)
20D8 FE0A CP 0AH
20DA C2E320 JP NZ,CNZSC4
20DD 23 INC HL
20DE 3E07 LD A,7
20E0 C3BF20 JP CNZSLO ;CR-LF
20E3 79 CNZSC4: LD A,C
20E4 CD0421 CALL CNZS2M
20E7 C2BF20 JP NZ,CNZSLO ;FOUND IN TABLE
20EA 3E06 LD A,6
20EC 12 LD (DE),A
20ED 13 INC DE
20EE 05 DEC B
20EF CA3C21 JP Z,CNZSLE ;STORE ASCII VERSION
20F2 79 LD A,C
20F3 07 RLCA
20F4 07 RLCA
20F5 07 RLCA
20F6 E603 AND 3
20F8 12 LD (DE),A
20F9 13 INC DE
20FA 05 DEC B
20FB CA3C21 JP Z,CNZSLE
20FE 79 LD A,C
20FF E61F AND 1FH
2101 C3BF20 JP CNZSLO
2104 C5 CNZS2M: PUSH BC
2105 E5 PUSH HL
2106 211F20 LD HL,CHRTBL+23 ;SEARCH TABLE
2109 0618 LD B,24
210B BE CNZS2L: CP (HL)
210C CA1721 JP Z,CNZS2P ;FOUND
210F 2B DEC HL
2110 05 DEC B
2111 C20B21 JP NZ,CNZS2L
2114 E1 POP HL ;NOT FOUND
2115 C1 POP BC
2116 C9 RET ;FAIL, ZERO SET
2117 78 CNZS2P: LD A,B
2118 C607 ADD A,7
211A E1 POP HL
211B C1 POP BC
211C C9 RET ;PASSED, ZERO CLEARED
211D FE61 ZCHRCS: CP 'a'
211F DA2921 JP C,ZCHRC1
2122 FE7B CP 'z'+1
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 83
2124 D22921 JP NC,ZCHRC1
2127 AF XOR A
2128 C9 RET ;SET 0
2129 FE41 ZCHRC1: CP 'A'
212B DA3621 JP C,ZCHRC2
212E FE5B CP 'Z'+1
2130 D23621 JP NC,ZCHRC2
2133 3E01 LD A,1
2135 C9 RET
2136 B7 ZCHRC2: OR A
2137 C8 RET Z
2138 F8 RET M ;END
2139 3E02 LD A,2
213B C9 RET ;ELSE SET 2
213C 01C521 CNZSLE: LD BC,ZSTBUO ;CONVERT OUTPUT STRING
213F 210000 LD HL,0
2142 54 LD D,H
2143 CD5F21 CALL CNZSE1
2146 CD5F21 CALL CNZSE1
2149 CD5F21 CALL CNZSE1
214C 22C521 LD (ZSTBUO),HL
214F 210100 LD HL,1
2152 CD5F21 CALL CNZSE1
2155 CD5F21 CALL CNZSE1
2158 CD5F21 CALL CNZSE1
215B 22C721 LD (ZSTBUO+2),HL
215E C9 RET
215F 0A CNZSE1: LD A,(BC)
2160 03 INC BC
2161 5F LD E,A
2162 29 ADD HL,HL
2163 29 ADD HL,HL
2164 29 ADD HL,HL
2165 29 ADD HL,HL
2166 29 ADD HL,HL
2167 19 ADD HL,DE
2168 C9 RET
;
; **********************************************************************
; * *
; * ZORK - DATA SECTION *
; * *
; **********************************************************************
;
2169 SRND: ;RANDOM INFO FOR SAVE, KEEP TOGETHER
2169 LOCALS: DS 15*2 ;STORAGE FOR LOCALS
2187 00 ZPCH: DB 0 ;HIGH ORDER 8 BITS OF ZPC
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 84
2188 0000 ZPCL: DW 0 ;LOW ORDER 9 BITS OF ZPC
218A 01 ZSTAKC: DB 1 ;STACK COUNT, 1=>0 IMPLIES OVERPOP, NEG=> OVER PUSH
218B 0000 OZSTKP: DW 0 ;OLD ZSTACK POINTER
218D 00 OZSTKC: DB 0 ;OLD ZSTACK COUNT
;
218E 6A573C99 SHIFT: DB 6AH,57H,3CH,99H
0029 SRNDC EQU $-SRND
2192 ZSTBUI: DS 6 ;ZSTR INPUT BUFFER
2198 FF DB 0FFH ;END MARKER
2199 01 NOLPT: DB 1 ;NON ZERO IMPLIES DO NOT USE LPT
219A 00 VERF: DB 0 ;1 IF IN VERIFY MODE.
219B 01 ZMEMT: DB 1 ;FIRST PAGE IN SWAPPING SPACE
219C PURSTP: ;END OF PURE
219C 00 SIGNF: DB 0 ;STORAGE FOR SIGN IN MULT AND DIVIDE
219D 0000 ARG1: DW 0 ;OPERRAND 1
219F 0000 ARG2: DW 0 ;" 2
21A1 0000 ARG3: DW 0 ;" 3
21A3 0000 ARG4: DW 0 ;" 4
21A5 00 ARGCNT: DB 0 ;ARG COUNT
21A6 00 OPCODE: DB 0 ;CURRENT OPCODE
21A7 0000 GLOBAL: DW 0 ;POINTER TO GLOBAL 0
21A9 00 FWSET: DB 0 ;TEMPORARY STORAGE FOR FWORDS CALCULATION
21AA 0000 FWORDS: DW 0 ;COMMON WORDS POINTER
21AC 0000 ZPCOFF: DW 0 ;OFFSET FOR FAST JUMPS
21AE 0000 ZPCPNT: DW 0 ;REAL POINTER TO PC
21B0 00 ZPCFLG: DB 0 ;0FFH IF VALID PC POINTER
21B1 00 ZPCPG: DB 0 ;PAGE OF ZPC
21B2 00 MPCH: DB 0 ;HIGH ORDER 8 BITS OF MEMORY POINTER
21B3 0000 MPCL: DW 0 ;LOW ORDER 9 BITS OF MEMPOINTER
21B5 0000 MPCPNT: DW 0 ;REAL POINTER TO MEMORY LOCATION
21B7 00 MPCFLG: DB 0 ;0FF IF VALID MPCPNT
21B8 00 MPCPG: DB 0 ;PAGE NUMBER OF PC PAGE
;
;PAGE TABLES
21B9 0000 PGBUFP: DW 0 ;BUFFER POINTER
21BB 0000 ZCODEP: DW 0 ;LOW MEM STARTING POINTER
;
21BD 00 NPGS: DB 0 ;NUMBER OF PAGES
21BE 00 PGTOP: DB 0 ;TOP OF LIST PAGE
21BF 3F PGBOT: DB MAXPGS-1 ;BOTTOM OF LIST
;
21C0 00 CSTEMP: DB 0 ;-1 IF NOT TEMP CHAR SET, ELSE SET
21C1 00 CSPERM: DB 0 ;PERM CHARACTER SET
21C2 00 STBYTF: DB 0 ;0 FOR FIRST BYTE, 1 FOR 2, 2 FOR 3, 0FFH FOR END
21C3 0000 ZSTWRD: DW 0 ;WORD STORRAGE
21C5 ZSTBUO: DS 6 ;OUTPUT BUFFER
21CB 0000 RTABP: DW 0 ;TEMP FOR ZREAD, RESULT TABLE POINTER
;
21CD 0000 LMEMRY: DW 0 ;LAST LOCATION IN MEMORY, FILLED IN BY LOADER
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 85
;
0100 END START
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 86
---- SYMBOL TABLE ----
ARG1 219D COUTDC 0BC7 FLGSU3 1CA4 GETVOC 1AB6 LOC 1555
ARG2 219F CPLMAX 0085 FLSLIN 04F7 GETVR1 12E4 LOCALS 2169
ARG3 21A1 CPMBUF 0080 FLUSHW 1A81 GETVRG 12F8 LPCHK 049B
ARG4 21A3 CPMCLF 010D FNDAT 02C7 GETVRL 12E9 LPDL 0190
ARGCNT 21A5 CPMCPL 0103 FNDPG1 1F09 GETVRS 1304 LPINIT 05B4
BADOP 15A1 CPMCR 007C FNDPGE 1EF1 GETWRD 1E07 LPTO 0586
BAND 16F0 CPMDRV 005C FNDPGL 1EFA GETZCH 2031 LSTADR 0006
BCOM 167E CPMFCB 005C FNPRE 02DF GETZH1 204A MAKEF 0016
BDOS 0005 CPMFEX 0065 FNPUR 02D3 GETZH2 205D MAXPGS 0040
BODY 1088 CPMFN 0105 FRSTQ1 1544 GETZH3 206E MEMTOP 0209
BOR 16E4 CPMFNB 005D FSET 170B GLOBAL 21A7 MEMTP1 0212
BRKTBL 1AC5 CPMINV 010F FSETQ 16FC GRTRQ 1697 MLOOP 11F2
BSTLIN 0152 CPMLLF 010E FSTACK 14B7 GTDSK1 0326 MORCNT 0C58
BTST 16D2 CPMLPP 0104 FWFAIL 1B54 HLGEDE 1D07 MORE 0701
CCI 0001 CPMRCD 0019 FWL1 1AED HLOFF 1EEA MORE1 0722
CCO 0002 CPMRDS 000D FWL1A 1AE9 IGRTQ1 16B5 MORMSG 06E2
CDIO 0006 CPMREC 007D FWL2 1AF2 IGRTRQ 16AE MOVE 1733
CDISK 0004 CPMSEL 000E FWL3 1B07 INC 1575 MOVESG 0012
CGCONS 000B CPMSTR 0200 FWL4 1B1C INC1 1581 MOVIT 034B
CHARS 0BD0 CPSTNG 0009 FWL4A 1B4A INC2 1588 MPCFLG 21B7
CHRPNT 0C55 CRCBUF 000A FWL4B 1B49 INQ 16BE MPCH 21B2
CHRPOS 06A3 CRESET 0000 FWL4C 1B48 IOBYTE 0003 MPCL 21B3
CHRTBL 2008 CRLF 14C0 FWORDS 21AA ITRMST 0110 MPCPG 21B8
CIN 0438 CRMSG 0930 FWSET 21A9 JUMP 1660 MPCPNT 21B5
CIN1 043B CSPERM 21C1 FWSUCC 1B58 LESSQ 168A MSGCRC 0A64
CIN2 0451 CSTEMP 21C0 GET 175F LFILC 0BB7 MSGOUT 0A48
CKZPCP 1E78 DBUFP 0BCD GETARG 1CF7 LFILD 0B75 MSGRES 0924
CLEARS 0585 DDIV0 1C36 GETB 1771 LFILD1 0B81 MUL 1833
CLO 0005 DDIV1 1C3C GETB1A 1E84 LFILDG 0932 MUL1 1851
CLOSE 0010 DEC 157B GETBT1 1E3F LFILDM 096F MUL2 185A
CNZS2L 210B DEC1 158E GETBT2 1E8A LFILF 0B6E MUL4 1857
CNZS2M 2104 DELETE 0013 GETBT3 1E5C LFILGM 09BF MULT 1BFE
CNZS2P 2117 DIV 185F GETBTL 1E65 LFILP 0B95 MULT1 1C04
CNZSC1 20C8 DIV2 1880 GETBYT 1E12 LFILP1 0BA1 MULT2 1C10
CNZSC3 20D1 DIV2A 188E GETDK2 0318 LFILPM 0997 NBRKS 000A
CNZSC4 20E3 DIV2B 1881 GETDSK 02F7 LFILR 0BB5 NCHARS 0BCF
CNZSE1 215F DIV4 1887 GETFRE 1DE0 LFILS 0B45 NEXTP 17F6
CNZSL1 208A DIVIDE 1C27 GETLNG 12CF LFILS1 0B52 NEXTP1 1800
CNZSL2 209B DLESSQ 16A3 GETMOD 2020 LINFUL 0521 NEXTP2 1814
CNZSLC 20B3 EQUALQ 18A4 GETP 1785 LINOCR 0574 NEXTP3 181A
CNZSLE 213C EQUAQ1 18C5 GETP1 1788 LINOT1 0516 NEXTPC 1D3C
CNZSLO 20BF ESTLIN 0173 GETP2 17B9 LINOT2 0528 NEXTQ 152F
CONZSL 207B FALSE 0000 GETP2A 17CB LINOT3 0532 NOLPT 2199
CONZST 2072 FBRK 1AA5 GETP3 179C LINOT4 055E NPGS 21BD
CORET 04F3 FCLEAR 1718 GETPRE 0315 LINOT5 0566 NXTPC1 1D69
COUT 04B6 FILTYP 0C57 GETPT 17D1 LINOT6 0549 NXTPC2 1D9B
COUT1 04D3 FINDW 1ACF GETPT1 17D4 LINOT7 0555 NXTPC3 1D7F
COUT2 04CE FIRSTQ 153B GETPT2 17E8 LINOTR 0572 NXTPC4 1DA8
COUTBS 03B1 FLAGSU 1C82 GETSHT 12C6 LINOUT 0502 NXTPCL 1D88
COUTCR 04AE FLGSU1 1C94 GETVAR 12DC LMEMRY 21CD OBJLOC 1CD6
COUTD 045E FLGSU2 1C9C GETVL1 12F1 LMORE 001F OP0 1262
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 87
---- SYMBOL TABLE ----
OP0M 000E PREDS 1362 PZSTRT 1FE0 SAVE1 07E4 UPPER 0903
OP0T 13D6 PRFLG 0BC9 QUIT 0749 SAVEA 07BA USL 14C6
OP1 126F PRINT 1669 RANDOM 1BAF SCOREG 0011 VALUE 1675
OP1M 0010 PRINT1 166F RBRK1 1A99 SCPLOC 0BCA VARGET 133B
OP1T 13F2 PRINT2 159B RBRK2 1AA2 SCPVAL 0BCC VARGTS 1340
OP2 1298 PRINTB 1598 RBRKQ 1A8F SETFIL 02AA VARPTR 172D
OP2EX 12B9 PRINTC 1B66 RD0PL 1A09 SETFL1 02BF VARPTS 134B
OP2M 0019 PRINTD 15FA RDBFC1 03F9 SETSTR 1DD8 VARPUT 1347
OP2T 1412 PRINTI 1467 RDBFC2 03EF SETWR1 1DCC VERF 219A
OPCODE 21A6 PRINTN 1B70 RDBFC3 03DE SETWRD 1DC6 VERIFL 14F5
OPDSPH 1251 PRINTR 1499 RDBFC4 03E6 SFAIL 082B VERIFY 14CC
OPEN 000F PRNTDC 1603 RDBFCR 03C0 SFAIL1 0856 VRLINE 107C
OPEXT 120B PRNTI1 146D RDBFFL 041A SHIFT 218E VRS 106B
OPEXTF 123F PRNTN1 1B80 RDBFR1 0407 SHLGED 1CFF WARM 0000
OPEXTL 1214 PRNTN3 1B90 RDBFR2 0415 SIBRKQ 1AA8 WHOLIN 05C1
OPEXTM 000A PRNTN4 1B95 RDBFRO 03A3 SIGNC 1C5A WHOLN1 0645
OPEXTT 1444 PRNTN6 1BA2 RDBFRT 03FE SIGNCN 1C6D WHOLN2 0614
OPNDK1 021B PRNTNC 1B79 RDFLG 0BC8 SIGNF 219C WHOLT 0653
OZSTKC 218D PRNTNG 1BA7 READB1 036B SIGNPC 1C75 WHOLT0 066C
OZSTKP 218B PROPB 1CAC READB2 0398 SIGNS 1C67 WHOLT1 0674
PCPST 0294 PROPL 1CC7 READBF 0354 SPLIC1 1EE5 WHOLT2 0698
PCPSTL 0295 PROPN 1CC3 READL 19E8 SPLICE 1EAB WHOMSG 06D3
PCRLD1 048B PROPNX 1CCE READL2 1A33 SRCLOS 0806 WHOTMS 06DB
PCRLF 04B4 PSHSTK 1D0E READL3 1A56 SRDFNM 02EB WRITER 0022
PCRLFD 0473 PSTUPS 0194 READR 0021 SRFAIL 083E WRITES 0015
PCSTR 027E PTSIZE 1565 READS 0014 SRGDFN 0916 ZADD 1820
PCSTRL 027F PURSTP 219C REMOVC 15AA SRGFM1 08AA ZCALL 18D1
PDL 0C59 PUT 195D REMOVE 15A4 SRGFN2 08CF ZCALL1 1910
PERMTB 2004 PUTB 1976 REMVC1 15D7 SRGFN3 090C ZCALL2 192E
PGBOT 21BF PUTBYT 130A REMVC2 15EF SRGFNA 08E2 ZCALL3 193C
PGBUFP 21B9 PUTP 198A REST1 0B11 SRGFNB 08FD ZCALL4 194A
PGTBD 0080 PUTP1 198D RESTA 0AC2 SRGFNM 0860 ZCHRC1 2129
PGTBL 0FAB PUTP2 19A1 RESTAR 0757 SRMSG1 09EA ZCHRC2 2136
PGTBLB 102B PUTP2A 19B7 RESTOR 0A75 SRMSG2 0A26 ZCHRCS 211D
PGTBLF 0FEB PUTVAL 130D RET0 1309 SRMSG3 0A46 ZCKLEN 001A
PGTFD 0040 PUTVL1 132A RET1 1634 SRND 2169 ZCKSUM 001C
PGTOP 21BE PUTVLC 1313 RET2 1643 SRNDC 0029 ZCODEP 21BB
PNTTIM 073B PUTVLG 132F RETCUR 0019 SRSWPD 0921 ZENDLD 0004
POPRET 0497 PUTVLL 1322 RETURN 1615 STAFLG 0BC6 ZER 0206
POPSTK 1D27 PUTVR1 1318 RFALSE 1461 STAR3A 11B4 ZEROQ 1524
POSPS1 06CD PZFWRD 1F70 RND 1BD0 START 0100 ZFWORD 0018
POSPS2 06C3 PZSTP0 1F32 RND1 1BD9 START1 10AE ZGLOBA 000C
POSPST 06B2 PZSTP1 1F34 RND2 1BD3 START2 1140 ZID 0002
PREDB 1369 PZSTR 1F0B ROOMG 0010 START3 1155 ZMEMT 219B
PREDB1 138C PZSTR1 1F3A RSIBRK 1A50 START4 11D3 ZMOD 1896
PREDB2 13B4 PZSTR2 1F43 RSTACK 14AE START5 11F1 ZNOP 14A2
PREDB3 1397 PZSTRA 1F58 RTABP 21CB STBYTF 21C2 ZOBJEC 000A
PREDB4 13C8 PZSTRC 1FD6 RTRMST 0131 TMCHK 057A ZPCFLG 21B0
PREDF 1353 PZSTRL 1F16 RTRUE 1458 TPA 0100 ZPCH 2187
PREDLB 1378 PZSTRP 1FE9 RTRUE1 145B TRUE 00FF ZPCL 2188
PREDNB 135A PZSTRS 1FD1 SAVE 0768 TWODSK 01B5 ZPCOFF 21AC
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKMSX.ASM PAGE 88
---- SYMBOL TABLE ----
ZPCPG 21B1 ZREAD 19BC ZSET 1727 ZSTART 0006 ZSWAP 0001
ZPCPNT 21AE ZRSTAR 14AB ZSPLIT 0004 ZSTATB 0010 ZSWAPF 0001
ZPOP 1BC7 ZRSTOR 14A8 ZSTACK 0DEB ZSTBUI 2192 ZTANDY 0008
ZPURBT 000E ZSAVE 14A5 ZSTAKC 218A ZSTBUO 21C5 ZTIMEF 0002
ZPUSH 1BBE ZSCRIP 0010 ZSTAKL 00E0 ZSTWRD 21C3 ZVERS 0000
ZQUIT 14BD ZSERNM 0012 ZSTAKP 0DE9 ZSUB 1827 ZVOCAB 0008
***** NO ERRORS DETECTED *****