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

5031 lines
197 KiB
Plaintext
Raw 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: ZORKCPM.ASM PAGE 1
; **********************************************************************
; * *
; * ZIP80 - CPM 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 *
; * 2/5/85 LS (CLEAR RND FLG) *
; * *
; **********************************************************************
;
;
; *************************************
; * 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: ZORKCPM.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: ZORKCPM.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: ZORKCPM.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 31070E LD SP,PDL+LPDL ;INIT MACHINE STACK
0203 C3A610 JP BODY ;JUMP AROUND SUBROUTINE SECTION
;
; *************************************
; * SUBROUTINES *
; *************************************
;
0206 C35F07 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 3ADA21 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 32750C 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: ZORKCPM.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: ZORKCPM.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 22EB0B GETDSK: LD (DBUFP),HL
02FA CD630B CALL LFILS ;OPEN ZORK/DAT FILE IF NOTHING OPEN
02FD 6F LD L,A
02FE 3A750C LD A,(FILTYP)
0301 FE03 CP 3 ;DATA TYPE OF FILE?
0303 7D LD A,L
0304 CA1803 JP Z,GETDK2
0307 21B921 LD HL,ZMEMT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.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 CD930B CALL LFILD ;MAKE SURE ZORK/DAT IS OPEN
0312 C31803 JP GETDK2
0315 CDB30B 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 2AEB0B LD HL,(DBUFP)
0340 0680 LD B,128
0342 CD4B03 CALL MOVIT
0345 22EB0B 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) ;LINES PER PAGE
0357 3D DEC A
0358 32760C LD (MORCNT),A
035B CDF704 CALL FLSLIN ;FLUSH LINE
035E 3E01 LD A,1
0360 32B721 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 CHAR COUNT
0367 2ABB21 LD HL,(ARG1) ;READ A BUFFER
036A 23 INC HL
036B CD3804 READB1: CALL CIN ;GET A CHAR
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.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 32B721 LD (NOLPT),A
03C6 2AD921 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: ZORKCPM.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 2ABB21 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 2ABB21 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 ;OR <DEL>
0424 CAA303 JP Z,RDBFRO
0427 FE7F CP 7FH
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 10
0429 CAA303 JP Z,RDBFRO
042C D5 PUSH DE
042D 1E07 LD E,7 ;RING BELL, READ BUFFER FULL
042F 0E06 LD C,CDIO
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 21E60B 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 3AE60B CIN2: LD A,(RDFLG)
0454 B7 OR A
0455 C23B04 JP NZ,CIN1 ;NOT FIRST READ
0458 CDEE1B CALL RND
045B C33B04 JP CIN1
045E 21E50B COUTD: LD HL,COUTDC ;INCREASE COUNT
0461 34 INC (HL)
0462 3A0F01 LD A,(CPMINV) ;INVERSE VIDEO ADDER
0465 21E40B 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
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 11
0484 1E0A LD E,0AH
0486 0E06 LD C,CDIO
0488 CD0500 CALL BDOS
048B 0E0D PCRLD1: LD C,0DH
048D CD9B04 CALL LPCHK
0490 21760C 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 2AD921 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 CP 20H
04D0 DAF304 JP C,CORET ;NON PRINTING
04D3 3AB721 COUT1: LD A,(NOLPT)
04D6 B7 OR A
04D7 C25E04 JP NZ,COUTD
04DA 3AED0B LD A,(NCHARS)
04DD 210301 LD HL,CPMCPL
04E0 BE CP (HL)
04E1 D47405 CALL NC,LINOCR ;OUTPUT LINE IF FULL
04E4 3AED0B LD A,(NCHARS)
04E7 3C INC A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 12
04E8 32ED0B LD (NCHARS),A
04EB 2A730C LD HL,(CHRPNT)
04EE 71 LD (HL),C
04EF 23 INC HL
04F0 22730C LD (CHRPNT),HL
04F3 E1 CORET: POP HL
04F4 D1 POP DE
04F5 C1 POP BC
04F6 C9 RET
04F7 C5 FLSLIN: PUSH BC ;FLUSH LINE
04F8 3AED0B 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 3AED0B 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 2A730C 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 2A730C LINFUL: LD HL,(CHRPNT) ;PRINT WHOLE LINE
0524 3AED0B LD A,(NCHARS)
0527 47 LD B,A
0528 C5 LINOT2: PUSH BC
0529 E5 PUSH HL
052A 21EE0B 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)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 13
053E CD9B04 CALL LPCHK
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 3AED0B LD A,(NCHARS)
054F 90 SUB B
0550 3D DEC A
0551 F25505 JP P,LINOT7
0554 AF XOR A
;
0555 32ED0B LINOT7: LD (NCHARS),A ;CHARACTERS NOT YET PRINTED
0558 CA6605 JP Z,LINOT5
055B 11EE0B 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 21EE0B LINOT5: LD HL,CHARS
0569 3AED0B LD A,(NCHARS)
056C CD081F CALL HLOFF
056F 22730C LD (CHRPNT),HL
0572 C1 LINOTR: POP BC
0573 C9 RET
0574 CD0205 LINOCR: CALL LINOUT
0577 C37304 JP PCRLFD
057A 2AD921 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 3AB721 LPTO: LD A,(NOLPT)
0589 B7 OR A
058A C0 RET NZ ;SOME ITEMS DON'T GO TO LPT
058B 3AE70B LD A,(PRFLG)
058E B7 OR A
058F CCB405 CALL Z,LPINIT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 14
0592 C5 PUSH BC
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 32E70B 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 3ADF21 LD A,(CSPERM) ;SAVE DATA CLOBERED BY PRNTDC
05CA 67 LD H,A
05CB 3AE021 LD A,(STBYTF)
05CE 6F LD L,A
05CF E5 PUSH HL
05D0 2AE121 LD HL,(ZSTWRD)
05D3 E5 PUSH HL
05D4 2AD121 LD HL,(MPCL)
05D7 E5 PUSH HL
05D8 2AD021 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 32E50B LD (COUTDC),A ;BEGINNING OF LINE
05E6 3E01 LD A,1
05E8 32B721 LD (NOLPT),A
05EB 3EFF LD A,0FFH
05ED 32E40B LD (STAFLG),A ;STATUS LINE FLAG (ANDED WITH CPMINV ADDER)
05F0 CD7A05 CALL TMCHK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 15
05F3 C25306 JP NZ,WHOLT
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 CD5913 CALL VARGET
0604 CD971B CALL PRNTNC
0607 0E2F LD C,'/'
0609 CDB604 CALL COUT
060C 3E12 LD A,MOVESG
060E CD5913 CALL VARGET
0611 CD971B 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 32B721 LD (NOLPT),A
0625 32E40B LD (STAFLG),A
0628 32D521 LD (MPCFLG),A ;RESTORE STRING VALUES
062B E1 POP HL
062C 7D LD A,L
062D 32D021 LD (MPCH),A
0630 E1 POP HL
0631 22D121 LD (MPCL),HL
0634 E1 POP HL
0635 22E121 LD (ZSTWRD),HL
0638 E1 POP HL
0639 7C LD A,H
063A 32DF21 LD (CSPERM),A
063D 7D LD A,L
063E 32E021 LD (STBYTF),A
0641 CD3E20 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 CD5913 CALL VARGET
064F 7D LD A,L
0650 C32116 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 CD5913 CALL VARGET
0661 7D LD A,L ;A <= HOURS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 16
0662 F5 PUSH AF ;SAVE HOURS
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 CD971B 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 CD5913 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 3AE50B 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
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 17
06C2 46 LD B,(HL)
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 32B721 LD (NOLPT),A ;DON'T SCRIPT MORE MESSAGE
0710 21E206 LD HL,MORMSG
0713 CD660A 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 32B721 LD (NOLPT),A
073A C9 RET ;NOW AT BEGINNING OF CLEAR LINE
073B 110A00 PNTTIM: LD DE,10
073E CD251D CALL HLGEDE
0741 0E30 LD C,'0'
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 18
0743 D4B604 CALL NC,COUT
0746 C3971B JP PRNTNC
;ZZZZZZZZZZZZZZZZZZZZZZZZZZZ
0749 115C00 QUIT: LD DE,CPMFCB
074C 0E10 LD C,CLOSE
074E CD0500 CALL BDOS
0751 213101 LD HL,RTRMST
0754 CD7E02 CALL PCSTR
0757 0E00 LD C,CRESET
0759 CD0500 CALL BDOS
075C C34907 JP QUIT
075F RESTAR:
075F 115C00 LD DE,CPMFCB
0762 0E10 LD C,CLOSE
0764 CD0500 CALL BDOS
0767 213101 LD HL,RTRMST
076A CD7E02 CALL PCSTR
076D C30001 JP START
0770 SAVE:
0770 AF XOR A
0771 32750C LD (FILTYP),A
0774 115C00 LD DE,CPMFCB ;CLOSE CURRENT FCB
0777 0E10 LD C,CLOSE ;SO FILE IS PROTECTED
0779 CD0500 CALL BDOS
077C CD6C08 CALL SRGFNM ;GET SAVE NAME (SWAP DISKS)
077F 115C00 LD DE,CPMFCB ;DELETE ANY PREVIOUS FILE
0782 0E13 LD C,DELETE ;BY THIS NAME
0784 CD0500 CALL BDOS
0787 115C00 LD DE,CPMFCB ;CREATE NEW SAVE FILE
078A 0E16 LD C,MAKEF
078C CD0500 CALL BDOS
078F 3C INC A
0790 CA3508 JP Z,SFAIL ;DID NOT OPEN
0793 2AD921 LD HL,(ZCODEP)
0796 010000 LD BC,ZVERS
0799 09 ADD HL,BC
079A 7E LD A,(HL) ;STORE VERSION NUMBER
079B 328000 LD (CPMBUF),A
079E 2A070E LD HL,(ZSTAKP)
07A1 228100 LD (CPMBUF+1),HL
07A4 218300 LD HL,CPMBUF+3
07A7 118721 LD DE,SRND
07AA 012900 LD BC,SRNDC ;TO MAKE EXTERNALS WORK
07AD 41 LD B,C
07AE CD4B03 CALL MOVIT
07B1 115C00 LD DE,CPMFCB
07B4 0E15 LD C,WRITES
07B6 CD0500 CALL BDOS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 19
07B9 B7 OR A
07BA C23508 JP NZ,SFAIL ;WRITE OUT INITIAL STUFF
07BD 0E04 LD C,0+(((ZSTAKL*2)+127)/128)
07BF 11090E LD DE,ZSTACK ;NEXT WRITE OUT STACK
07C2 0680 SAVEA: LD B,128
07C4 218000 LD HL,CPMBUF
07C7 CD4B03 CALL MOVIT
07CA C5 PUSH BC
07CB D5 PUSH DE
07CC 115C00 LD DE,CPMFCB
07CF 0E15 LD C,WRITES ;WRITE SEQ. RECORD
07D1 CD0500 CALL BDOS
07D4 B7 OR A
07D5 C24808 JP NZ,SRFAIL
07D8 D1 POP DE
07D9 C1 POP BC
07DA 0D DEC C
07DB C2C207 JP NZ,SAVEA ;ALL ZSTACK RECORDS DONE?
07DE 2AD921 LD HL,(ZCODEP)
07E1 110E00 LD DE,ZPURBT
07E4 19 ADD HL,DE
07E5 4E LD C,(HL) ;COUNT OF PAGES
07E6 2AD921 LD HL,(ZCODEP)
07E9 EB EX DE,HL ;WHERE TO START FROM
07EA 0602 LD B,2 ;128 BYTE RECORDS
07EC C5 SAVE1: PUSH BC
07ED 218000 LD HL,CPMBUF
07F0 0680 LD B,128
07F2 CD4B03 CALL MOVIT ;GET NEXT RECORD TO TRANSFER
07F5 D5 PUSH DE
07F6 115C00 LD DE,CPMFCB
07F9 0E15 LD C,WRITES ;WRITE IT SEQ. TO DISK
07FB CD0500 CALL BDOS
07FE D1 POP DE
07FF C1 POP BC
0800 B7 OR A
0801 C23508 JP NZ,SFAIL ;WRITE ERROR
0804 05 DEC B
0805 C2EC07 JP NZ,SAVE1 ;GO DO 2ND HALF OF PAGE
0808 0602 LD B,2 ;RESET FOR 2 RECORDS PER PAGE
080A 0D DEC C
080B F2EC07 JP P,SAVE1 ;NEXT PAGE
080E 115C00 SRCLOS: LD DE,CPMFCB
0811 0E10 LD C,CLOSE ;DONE, CLOSE SAVE FILE
0813 CD0500 CALL BDOS
0816 CD3F09 CALL SRSWPD ;TELL PLAYER SWAP GAME DISK BACK IN
0819 0E19 LD C,CPMRCD ;GET CURRENT DEFAULT DRIVE
081B CD0500 CALL BDOS
081E F5 PUSH AF ;HOLD IT A SEC
081F 0E0D LD C,CPMRDS ;RESET SYSTEM FOR NEW DISK
0821 CD0500 CALL BDOS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 20
0824 F1 POP AF ;RETRIEVE
0825 5F LD E,A ;AND RESET CORRECT DEFAULT
0826 0E0E LD C,CPMSEL ;(DESTROYED BY RESET SYSTEM)
0828 CD0500 CALL BDOS
082B CDB404 CALL PCRLF
082E AF XOR A
082F 32CE21 LD (ZPCFLG),A
0832 C38013 JP PREDS
0835 115C00 SFAIL: LD DE,CPMFCB
0838 0E10 LD C,CLOSE
083A CD0500 CALL BDOS
083D 115C00 LD DE,CPMFCB
0840 0E13 LD C,DELETE
0842 CD0500 CALL BDOS
0845 C35008 JP SFAIL1
0848 115C00 SRFAIL: LD DE,CPMFCB
084B 0E10 LD C,CLOSE
084D CD0500 CALL BDOS
0850 CD3F09 SFAIL1: CALL SRSWPD
0853 0E19 LD C,CPMRCD ;RETURN CURRENT DEFAULT DISK
0855 CD0500 CALL BDOS
0858 F5 PUSH AF
0859 0E0D LD C,CPMRDS
085B CD0500 CALL BDOS
085E F1 POP AF
085F 5F LD E,A
0860 0E0E LD C,CPMSEL ;RESELECT DEFAULT
0862 CD0500 CALL BDOS
0865 AF XOR A
0866 32CE21 LD (ZPCFLG),A
0869 C37113 JP PREDF
086C 21080A SRGFNM: LD HL,SRMSG1
086F CD660A CALL MSGOUT
0872 0608 LD B,8
0874 21EC02 LD HL,SRDFNM+1 ;FILENAME
0877 CD0009 CALL SRGFNA ;DISPLAY CHARS TILL HIT BLANKS
087A 21640A LD HL,SRMSG3
087D CD660A CALL MSGOUT
0880 0603 LD B,3
0882 21F402 LD HL,SRDFNM+9
0885 CD0009 CALL SRGFNA
0888 21440A LD HL,SRMSG2
088B CD660A CALL MSGOUT
088E 210000 LD HL,0
0891 226800 LD (CPMFCB+12),HL ;CLEAR EX,S1
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 21
0894 226A00 LD (CPMFCB+14),HL ; S2,RC
0897 AF XOR A
0898 327C00 LD (CPMCR),A ; CR
089B 118000 LD DE,CPMBUF
089E 3E0E LD A,14
08A0 12 LD (DE),A
08A1 0E0A LD C,CRCBUF ;READ CONSOLE BUFFER
08A3 CD0500 CALL BDOS
08A6 CD7304 CALL PCRLFD
08A9 0E19 LD C,CPMRCD ;RETURN CURRENT DISK
08AB CD0500 CALL BDOS
08AE F5 PUSH AF
08AF 0E0D LD C,CPMRDS ;RESET SYSTEM
08B1 CD0500 CALL BDOS
08B4 F1 POP AF
08B5 5F LD E,A
08B6 0E0E LD C,CPMSEL ;RESELECT DEFAULT
08B8 CD0500 CALL BDOS
08BB 3A8100 LD A,(CPMBUF+1)
08BE B7 OR A
08BF CA3409 JP Z,SRGDFN ;USE DEFAULT, SKIP THIS NEXT PART
08C2 060B LD B,11
08C4 21EB02 LD HL,SRDFNM
08C7 23 INC HL ;SKIP OVER DRIVE, LEAVE AS WAS SO PLAYER
08C8 ;NEED ONLY SPECIFY IT ONCE
08C8 3620 SRGFM1: LD (HL),20H
08CA 23 INC HL
08CB 05 DEC B
08CC C2C808 JP NZ,SRGFM1 ;FILL WITH BLANK FILE NAME
08CF 47 LD B,A ;SAVE COUNT OF CHARACTERS
08D0 218200 LD HL,CPMBUF+2 ;BEG OF FILE NAME
08D3 11EC02 LD DE,SRDFNM+1 ;STORAGE FOR FILE NAME
08D6 FE03 CP 3
08D8 DAED08 JP C,SRGFN2 ;NO DRIVE SPEC
08DB 3A8300 LD A,(CPMBUF+3)
08DE FE3A CP ':' ;DRIVE SPEC?
08E0 C2ED08 JP NZ,SRGFN2 ;NONE THIS TIME
08E3 05 DEC B
08E4 05 DEC B
08E5 7E LD A,(HL)
08E6 E60F AND 0FH ;DRIVE NUMBER
08E8 32EB02 LD (SRDFNM),A
08EB 23 INC HL
08EC 23 INC HL ;POINTER PAST DRIVE SPEC
08ED 05 SRGFN2: DEC B
08EE FA3409 JP M,SRGDFN ;FILE NAME NOW DEFAULT
08F1 7E LD A,(HL)
08F2 CD2109 CALL UPPER
08F5 23 INC HL
08F6 FE2E CP '.'
08F8 CA2A09 JP Z,SRGFN3 ;EXTENTION
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 22
08FB 12 LD (DE),A
08FC 13 INC DE
08FD C3ED08 JP SRGFN2
0900 7E SRGFNA: LD A,(HL)
0901 FE20 CP ' '
0903 CA1B09 JP Z,SRGFNB
0906 4F LD C,A
0907 C5 PUSH BC
0908 D5 PUSH DE
0909 E5 PUSH HL
090A 5E LD E,(HL)
090B 0E06 LD C,CDIO
090D CD0500 CALL BDOS
0910 E1 POP HL
0911 E5 PUSH HL
0912 CD820A CALL MSGCRC ;SEND LF IF NECESSARY
0915 E1 POP HL
0916 D1 POP DE
0917 C1 POP BC
0918 CD9B04 CALL LPCHK
091B 23 SRGFNB: INC HL
091C 05 DEC B
091D C20009 JP NZ,SRGFNA
0920 C9 RET
0921 FE61 UPPER: CP 'a'
0923 D8 RET C
0924 FE7B CP 'z'+1
0926 D0 RET NC
0927 D620 SUB 'a'-'A'
0929 C9 RET
092A 11F402 SRGFN3: LD DE,SRDFNM+9
092D 78 LD A,B
092E E603 AND 3 ;MAX OF 3 CHARACTERS
0930 47 LD B,A
0931 C3ED08 JP SRGFN2
0934 11EB02 SRGDFN: LD DE,SRDFNM ;DEFAULT FILE NAME
0937 215C00 LD HL,CPMFCB
093A 060C LD B,12
093C C34B03 JP MOVIT
093F 215009 SRSWPD: LD HL,LFILDG
0942 CD660A MSGRES: CALL MSGOUT ;MESSAGE THEN RESPONSE
0945 CD3804 CALL CIN ;WAIT FOR CHARACTER
0948 214E09 LD HL,CRMSG
094B C3660A JP MSGOUT
094E 0D00 CRMSG: DB 0DH,0
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 23
0950 4C6F6164 LFILDG: DB 'Load Game Disk if it was removed.',0DH
0972 54797065 DB 'Type <ENTER> to continue >',0
098D 4C6F6164 LFILDM: DB 'Load Disk 2, type <ENTER> to continue >',0
09B5 4C6F6164 LFILPM: DB 'Load Disk 1, type <ENTER> to continue >',0
09DD 4C6F6164 LFILGM: DB 'Load Game Disk, type <ENTER> to continue >',0
0A08 4C6F6164 SRMSG1: DB 'Load SAVE disk then enter file name.',0DH
0A2D 28646566 DB '(default file name is ',0
0A44 292E0D SRMSG2: DB ').',0DH
0A47 54797065 DB 'Type <ENTER> to continue > ',0
0A64 2E00 SRMSG3: DB '.',0
0A66 4E MSGOUT: LD C,(HL)
0A67 7E LD A,(HL)
0A68 B7 OR A
0A69 C8 RET Z
0A6A C5 PUSH BC
0A6B D5 PUSH DE
0A6C E5 PUSH HL
0A6D 5E LD E,(HL)
0A6E 0E06 LD C,CDIO
0A70 CD0500 CALL BDOS
0A73 E1 POP HL
0A74 E5 PUSH HL
0A75 CD820A CALL MSGCRC
0A78 E1 POP HL
0A79 D1 POP DE
0A7A C1 POP BC
0A7B CD9B04 CALL LPCHK
0A7E 23 INC HL
0A7F C3660A JP MSGOUT
0A82 3A0D01 MSGCRC: LD A,(CPMCLF)
0A85 B7 OR A
0A86 C8 RET Z ;NO LF AFTER CR
0A87 7E LD A,(HL)
0A88 FE0D CP 0DH
0A8A C0 RET NZ ;NOT CR
0A8B 1E0A LD E,0AH ;PRINT A LF
0A8D 0E06 LD C,CDIO
0A8F CD0500 CALL BDOS
0A92 C9 RET
0A93 AF RESTOR: XOR A
0A94 32750C LD (FILTYP),A
0A97 115C00 LD DE,CPMFCB
0A9A 0E10 LD C,CLOSE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 24
0A9C CD0500 CALL BDOS
0A9F CD6C08 CALL SRGFNM
0AA2 115C00 LD DE,CPMFCB
0AA5 0E0F LD C,OPEN
0AA7 CD0500 CALL BDOS
0AAA 3C INC A
0AAB CA4808 JP Z,SRFAIL
0AAE 115C00 LD DE,CPMFCB
0AB1 0E14 LD C,READS
0AB3 CD0500 CALL BDOS
0AB6 B7 OR A
0AB7 C24808 JP NZ,SRFAIL
0ABA 2AD921 LD HL,(ZCODEP)
0ABD 110000 LD DE,ZVERS
0AC0 19 ADD HL,DE
0AC1 3A8000 LD A,(CPMBUF)
0AC4 BE CP (HL)
0AC5 C24808 JP NZ,SRFAIL ;VERSIONS DIFFER
0AC8 2A8100 LD HL,(CPMBUF+1)
0ACB 22070E LD (ZSTAKP),HL ;STACK POINTER
0ACE 118300 LD DE,CPMBUF+3
0AD1 218721 LD HL,SRND
0AD4 012900 LD BC,SRNDC ;TO MAKE EXTERNALS WORK
0AD7 41 LD B,C
0AD8 CD4B03 CALL MOVIT ;RESTORE RANDOM DATA
0ADB 0E03 LD C,0+(((ZSTAKL*2)-1)/128) ;ONE TOO FEW
0ADD 21090E LD HL,ZSTACK ;NEXT WRITE OUT STACK
0AE0 C5 RESTA: PUSH BC
0AE1 E5 PUSH HL
0AE2 115C00 LD DE,CPMFCB
0AE5 0E14 LD C,READS
0AE7 CD0500 CALL BDOS
0AEA E1 POP HL
0AEB C1 POP BC
0AEC B7 OR A
0AED C24808 JP NZ,SRFAIL
0AF0 118000 LD DE,CPMBUF
0AF3 0680 LD B,128
0AF5 CD4B03 CALL MOVIT
0AF8 0D DEC C
0AF9 C2E00A JP NZ,RESTA
0AFC E5 PUSH HL ;READ LAST BLOCK
0AFD 115C00 LD DE,CPMFCB
0B00 0E14 LD C,READS
0B02 CD0500 CALL BDOS
0B05 E1 POP HL
0B06 B7 OR A
0B07 C24808 JP NZ,SRFAIL
0B0A 118000 LD DE,CPMBUF
0B0D 0640 LD B,0+((ZSTAKL*2)-((((ZSTAKL*2)-1)/128)*128))
0B0F CD4B03 CALL MOVIT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 25
0B12 2AD921 LD HL,(ZCODEP)
0B15 111100 LD DE,ZSCRIP+1
0B18 19 ADD HL,DE
0B19 22E80B LD (SCPLOC),HL ;LOCATION OF SCRIPT FLAG
0B1C 7E LD A,(HL)
0B1D E601 AND 1 ;ISOLATE SCRIPT BIT
0B1F 32EA0B LD (SCPVAL),A ;AND SAVE
0B22 2AD921 LD HL,(ZCODEP)
0B25 110E00 LD DE,ZPURBT
0B28 19 ADD HL,DE
0B29 4E LD C,(HL)
0B2A 2AD921 LD HL,(ZCODEP) ;POINTER TO BEGINNING OF DATA
0B2D 0602 LD B,2 ;128 BYTE RECORDS
0B2F C5 REST1: PUSH BC
0B30 E5 PUSH HL
0B31 115C00 LD DE,CPMFCB
0B34 0E14 LD C,READS
0B36 CD0500 CALL BDOS
0B39 E1 POP HL
0B3A C1 POP BC
0B3B B7 OR A
0B3C C25F07 JP NZ,RESTAR
0B3F 118000 LD DE,CPMBUF
0B42 C5 PUSH BC
0B43 0680 LD B,128
0B45 CD4B03 CALL MOVIT
0B48 C1 POP BC
0B49 05 DEC B
0B4A C22F0B JP NZ,REST1
0B4D 0602 LD B,2
0B4F 0D DEC C
0B50 F22F0B JP P,REST1
0B53 2AE80B LD HL,(SCPLOC)
0B56 7E LD A,(HL)
0B57 E6FE AND 0FEH ;CLEAR SCRIPT BIT
0B59 E5 PUSH HL
0B5A 21EA0B LD HL,SCPVAL
0B5D B6 OR (HL) ;OR IN VALUE FROM MEMORY
0B5E E1 POP HL
0B5F 77 LD (HL),A
0B60 C30E08 JP SRCLOS ;ALL DONE
0B63 F5 LFILS: PUSH AF
0B64 3A750C LD A,(FILTYP)
0B67 FE03 CP 3 ;.DAT FILE ALREADY OPEN?
0B69 CAD30B JP Z,LFILR ; YES. RETURN.
0B6C B7 OR A ; NO. SOME OTHER TYPE OPEN?
0B6D C2D30B JP NZ,LFILR ; YES. RETURN.
0B70 11C702 LFILS1: LD DE,FNDAT ; NO. ^ DATA FILE NAME
0B73 3E03 LD A,3 ;OPEN TYPE 3
0B75 CD1B02 CALL OPNDK1 ;TRY TO OPEN FILE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 26
0B78 C2D30B JP NZ,LFILR ;OPEN .DAT FILE COMPLETE?
0B7B ; YES. RETURN.
0B7B 3AB501 LD A,(TWODSK) ;CHECK IF 1 OR 2 DISKS FOR GAME
0B7E FE01 CP 1 ;IF = 1 THEN 2 DISKS
0B80 CA8C0B JP Z,LFILF ;SO GO TRY OTHER TYPE FILES
0B83 21DD09 LD HL,LFILGM ;ELSE ASK FOR CORRECT DISK
0B86 CD4209 CALL MSGRES
0B89 C3700B JP LFILS1 ;AND TRY AGAIN
0B8C AF LFILF: XOR A ; NO. SET FILTYP=0
0B8D 32750C LD (FILTYP),A ;OPEN FAILED TRY OTHER TYPE
0B90 C3D30B JP LFILR
0B93 F5 LFILD: PUSH AF
0B94 3A750C LD A,(FILTYP)
0B97 FE02 CP 2 ;.PUR FILE ALREADY OPEN?
0B99 CAD30B JP Z,LFILR ; YES.ALREADY OPEN
0B9C CDD50B CALL LFILC ;CLOSE EXISTING FILE IF ANY
0B9F 11D302 LFILD1: LD DE,FNPUR
0BA2 3E02 LD A,2
0BA4 CD1B02 CALL OPNDK1 ;TRY TO OPEN PURELOAD FILE
0BA7 C2D30B JP NZ,LFILR ;OPEN OK
0BAA 218D09 LD HL,LFILDM
0BAD CD4209 CALL MSGRES ;ASK TO LOAD DISK
0BB0 C39F0B JP LFILD1 ;TRY AGAIN
0BB3 F5 LFILP: PUSH AF
0BB4 3A750C LD A,(FILTYP)
0BB7 FE01 CP 1 ;PRELOAD TYPE?
0BB9 CAD30B JP Z,LFILR ;OPEN
0BBC CDD50B CALL LFILC
0BBF 11DF02 LFILP1: LD DE,FNPRE
0BC2 3E01 LD A,1
0BC4 CD1B02 CALL OPNDK1
0BC7 C2D30B JP NZ,LFILR ;OPEN OK
0BCA 21B509 LD HL,LFILPM
0BCD CD4209 CALL MSGRES ;LOAD PROPER DISK
0BD0 C3BF0B JP LFILP1
0BD3 F1 LFILR: POP AF
0BD4 C9 RET
0BD5 B7 LFILC: OR A
0BD6 C8 RET Z ;NONE OPEN
0BD7 115C00 LD DE,CPMFCB
0BDA 0E10 LD C,CLOSE
0BDC CD0500 CALL BDOS
0BDF AF XOR A
0BE0 32750C LD (FILTYP),A
0BE3 C9 RET
;DATA
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 27
0BE4 00 STAFLG: DB 0 ;0FFH WHEN IN STATUS LINE MODE
0BE5 00 COUTDC: DB 0 ;CHARACTER COUNT UNDER STATUS LINE
0BE6 00 RDFLG: DB 0 ;0 FOR FIRST READ
0BE7 00 PRFLG: DB 0 ;0 FOR FIRST PRINT
0BE8 0000 SCPLOC: DW 0 ;SCRIPT LOCATION
0BEA 00 SCPVAL: DB 0 ;SCRIPT VALUE
0BEB 0000 DBUFP: DW 0 ;DSK POINTER
0BED 00 NCHARS: DB 0
0BEE CHARS: DS CPLMAX
0C73 EE0B CHRPNT: DW CHARS
0C75 00 FILTYP: DB 0 ;0 FOR NONE, 1 FOR PRE, 2 FOR PUR, 3 FOR DAT
0C76 17 MORCNT: DB 23
;(PUT IN CODE SEGMENT TO PRESERVE COMMON ZORKBODY)
0C77 PDL: DS LPDL ;CONTROL STACK
0E07 C90F ZSTAKP: DW ZSTACK+(2*ZSTAKL) ;POINTER TO CURRENT ZSTACK
0E09 ZSTACK: DS ZSTAKL*2 ;ZSTACK
0FC9 PGTBL: DS MAXPGS ;PAGE NUMBER, 0 ALWAYS IN MEMORY, THUS 0=FREE
1009 PGTBLF: DS MAXPGS ;NEXT LINK POINTER, 0FFH IMPLIES END POINT
1049 PGTBLB: DS MAXPGS ;PREVIOUS LINK POINTER
0040 PGTFD EQU PGTBLF-PGTBL
0080 PGTBD EQU PGTBLB-PGTBL
1089 0D555044 VRS: DB 0DH,'UPDATED 2.5.85',0DH,0
109A 0D564552 VRLINE: DB 0DH,'VERSION C',0DH,0
;
; **********************************************************************
; * *
; * WARMSTART ENTRY *
; * *
; **********************************************************************
;
;
; MAIN BODY OF CODE STARTS HERE.
;
10A6 AF BODY: XOR A
10A7 32CE21 LD (ZPCFLG),A ;DISABLE TIME IN STATUS LINE, NO SPLIT FILE, NOT TANDY
10AA 32D521 LD (MPCFLG),A ;NO VALID MEMORY IN FROM DISK (MPCPNT NOT VALID)
10AD 32DC21 LD (PGTOP),A ;SET TOP OF LIST PAGE
10B0 0E19 LD C,RETCUR ;GET CURRENT DEFAULT DRIVE
10B2 CD0500 CALL BDOS ;RETS IN A
10B5 5F LD E,A ;SET DEFAULT DRIVE
10B6 0E0E LD C,CPMSEL ;THIS SEEMS REDUNDENT BUT THE MACHINE IS NOT
10B8 CD0500 CALL BDOS ;RECOGNIZING RESETS FROM BOOT DRIVE DONE BEFORE
10BB ;STARTING THE GAME
;
; INITIALIZE ZSTACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 28
;
10BB 3E01 LD A,1
10BD 32A821 LD (ZSTAKC),A ;INITIALIZE ZSTACK POSITION COUNTER
10C0 21C90F LD HL,ZSTACK+(2*ZSTAKL)
10C3 22070E LD (ZSTAKP),HL ;SAVE THE LOCATION OF THE BOTTOM OF ZSTACK IN
; ZSTACK POINTER
;
; INITIALIZE PAGE TABLES
;
10C6 11C90F LD DE,PGTBL ;DE ^ TOP OF PAGE TABLE
10C9 010040 LD BC,0+(MAXPGS*256) ;FOR NUMBER OF PAGES (IN B)
;
10CC START1:
; INITIALIZE PGTBL
10CC AF XOR A
10CD 12 LD (DE),A ;(PGTBL+PAGE NUMBER) <= 0
; FREE THE PAGE (NO PAGE IN MEMORY)
;
10CE 214000 LD HL,PGTFD ;HL <= MAXIMUM NUMBER OF PAGES
; USED AS AN OFFSET INTO PGTBLF
;
; INITIALIZE FOWARD POINTER
10D1 19 ADD HL,DE ;HL ^ PAGE FORWARD POINTER TABLE SLOT
10D2 71 LD (HL),C ;SAVE CURRENT POINTER
10D3 34 INC (HL) ;ADD 1 TO MAKE IT A FORWARD POINTER
;
; INITIALIZE PREVIOUS POINTER
10D4 218000 LD HL,PGTBD ;HL ^ PAGE PREVIOUS POINTER TABLE BASE ADDRESS
10D7 19 ADD HL,DE ;ADD OFFSET
10D8 71 LD (HL),C ;SAVE CURRENT POINTER
10D9 35 DEC (HL) ;SUBTRACT 1 TO MAKE IT A PREVIOUS POINTER
;
; UPDATE
10DA 0C INC C ;NEXT PAGE
10DB 13 INC DE ;NEXT SLOT IN TABLES
;
; TEST LOOP FOR DONE
10DC 05 DEC B ;DECREMENT NUMBER OF SLOTS REMAINING
10DD C2CC10 JP NZ,START1 ;>0? YES. CONTINUE LOOPING.
;
; CORRECT FOR NO FORWARD POINTER FOR LAST PAGE
;
10E0 213F00 LD HL,PGTFD-1
10E3 19 ADD HL,DE
10E4 36FF LD (HL),0FFH
;
; SET BOTTOM PAGE NO.
;
10E6 3E3F LD A,MAXPGS-1
10E8 32DD21 LD (PGBOT),A
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 29
; COMPUTE ZCODE STARTING ADDRESSS
;
10EB 21EB21 LD HL,LMEMRY ;POINT HL PAST ZIP
10EE 11FF00 LD DE,0FFH ;ADJUST ADDRESS TO A PAGE BOUNDRY
10F1 19 ADD HL,DE
10F2 2E00 LD L,0
10F4 22D921 LD (ZCODEP),HL ;SAVE ZCODE STARTING ADDRESS
;
; SET UP FILE NAMES FOR DAT, PRE, PUR AND SAV
;
10F7 CDAA02 CALL SETFIL ;APPEND GAME NAME PREFIX TO FILE NAME EXTENSIONS
;
; RESET FILE TYPE
;
10FA AF XOR A ;RESET FILTYP
10FB 32750C LD (FILTYP),A
;
; INITIALIZE TERMINAL
;
10FE 211001 LD HL,ITRMST ;POINT TO TERMINAL INITIALIZATION STRING
1101 CD7E02 CALL PCSTR ; FOR HOME, CLEAR SCREEN AND PRINT IT
;
; INITIALIZE TERMINAL RELATED COUNTERS
;
1104 3A0401 LD A,(CPMLPP) ;INITIALIZE LINES/PAGE (EXCLUDING STATUS LINE)
1107 3D DEC A ;COUNTER (MORCNT) =(CPMLPP)-1
1108 32760C LD (MORCNT),A ; WHICH TELLS THE PROGRAM WHEN TO PRINT ....MORE....
110B AF XOR A ;A<=0
110C 32ED0B LD (NCHARS),A ;RESET (NCHARS)
110F 21EE0B LD HL,CHARS ;SET UP CHARACTERS/LINE
1112 22730C LD (CHRPNT),HL
;
; GET THE FIRST SECTOR OF ZCODE
;
1115 2AD921 LD HL,(ZCODEP) ;^ TOP OF ZCODE BUFFER
1118 AF XOR A
1119 CDF702 CALL GETDSK ;READ IN FIRST SECTION
;
; EXTRACT GAME DATA FROM ZCODE HEADER
;
111C 2AD921 LD HL,(ZCODEP) ;HL ^ TOP OF ZCODE BUFFER
111F 110400 LD DE,ZENDLD ;DE <= OFFSET TO NON-PRELOADED ZCODE
1122 19 ADD HL,DE ;HL ^ START OF NON-PRELOADED ZCODE
1123 56 LD D,(HL) ;GET MSB OF ENDLOAD POINTER
1124 23 INC HL ; ADD 1
1125 5E LD E,(HL) ;GET LSB OF ENDLOAD POINTER
1126 210002 LD HL,200H ;HL <= 256
1129 19 ADD HL,DE ;HL <= ENDLOAD POINTER + 200H
112A 7C LD A,H ;A <= MSB
112B E6FE AND 0FEH ;
112D 67 LD H,A ;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 30
112E 2E00 LD L,0 ;
1130 2B DEC HL ;ALL THIS TO GET TO BLOCK BOUNDRY
1131 EB EX DE,HL ;DE <= CORRECTED ENDLOAD POINTER
1132 010400 LD BC,ZENDLD ;BC <= OFFSET TO NON-PRELOADED ZCODE
1135 2AD921 LD HL,(ZCODEP) ;HL ^ TOP OF ZCODE BUFFER
1138 09 ADD HL,BC ;HL ^ START OF NON-PRELOADED ZCODE
1139 72 LD (HL),D ;SAVE MSB OF CORRECTED ENDLOAD POINTER
113A 23 INC HL
113B 73 LD (HL),E ;SAVE LSB OF CORRECTED ENDLOAD POINTER
113C 2AD921 LD HL,(ZCODEP) ;HL ^ TOP OF ZCODE BUFFER
113F D5 PUSH DE ;SAVE CORRECTED ENDLOAD POINTER ON STACK
1140 19 ADD HL,DE ;HL ^ END OF PRELOAD
1141 EB EX DE,HL ;DE ^ END OF PRELOAD
1142 CD0902 CALL MEMTOP ;DETERMINE WHERE THE TOP OF MEMORY IS (IN HL)
1145 EB EX DE,HL ;DE <= TOP OF MEMORY, HL <= END OF THE PRELOAD
1146 CD251D CALL HLGEDE ;CARRY FLAG SET IF HL G.E. DE
1149 D1 POP DE ;RESTORE CORRECTED ENDLOAD POINTER
114A DC0602 CALL C,ZER ;NO ROOM FOR ANY BUFFERS
114D 7A LD A,D
114E 0F RRCA
114F E67F AND 7FH
1151 57 LD D,A ;NUMBER OF PAGES IN REST OF THE PRELOAD
1152 3C INC A
1153 32B921 LD (ZMEMT),A ;PAGE NUMBER
1156 2AD921 LD HL,(ZCODEP) ;^ START OF ZCODE BUFFER
1159 010002 LD BC,200H
115C 1E00 LD E,0
;
; LOAD PRELOAD
;
115E 7A START2: LD A,D ;A <= PAGES REMAINING TO BE LOADED
115F B7 OR A ;DONE?
1160 CA7311 JP Z,START3 ; YES.
1163 15 DEC D
1164 09 ADD HL,BC
1165 1C INC E
1166 7B LD A,E
1167 C5 PUSH BC
1168 D5 PUSH DE
1169 E5 PUSH HL
116A CDF702 CALL GETDSK
116D E1 POP HL
116E D1 POP DE
116F C1 POP BC
1170 C35E11 JP START2
1173 2AD921 START3: LD HL,(ZCODEP)
1176 EB EX DE,HL
1177 210100 LD HL,ZSWAP
117A 19 ADD HL,DE
117B 7E LD A,(HL)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 31
117C E601 AND 1
117E C40602 CALL NZ,ZER ;SWAPPED
1181 210700 LD HL,ZSTART+1
1184 19 ADD HL,DE
1185 7E LD A,(HL)
1186 32A621 LD (ZPCL),A
1189 2B DEC HL
118A 7E LD A,(HL)
118B E601 AND 1
118D 32A721 LD (ZPCL+1),A
1190 7E LD A,(HL)
1191 0F RRCA
1192 E67F AND 7FH
1194 32A521 LD (ZPCH),A
1197 210C00 LD HL,ZGLOBA
119A 19 ADD HL,DE ;GET RELATIVE ADDRESS OF GLOBAL TABLE
119B D5 PUSH DE
119C 56 LD D,(HL)
119D 23 INC HL
119E 5E LD E,(HL)
119F EB EX DE,HL
11A0 D1 POP DE
11A1 19 ADD HL,DE ;REAL ADDRESS OF GLOBAL TABLE
11A2 22C521 LD (GLOBAL),HL ;STORE IT
11A5 211800 LD HL,ZFWORD
11A8 19 ADD HL,DE ;GET RELATIVE ADDRESS OF FWORDS TABLE
11A9 D5 PUSH DE
11AA 56 LD D,(HL)
11AB 23 INC HL
11AC 5E LD E,(HL)
11AD EB EX DE,HL
11AE D1 POP DE
11AF 19 ADD HL,DE ;REAL ADDRESS OF FWORDS TABLE
11B0 22C821 LD (FWORDS),HL ;STORE IT
11B3 210400 LD HL,ZENDLD ;CALCULATE ^ TO BEGINNING OF PAGE BUFFERS
11B6 19 ADD HL,DE
11B7 D5 PUSH DE
11B8 56 LD D,(HL)
11B9 23 INC HL
11BA 5E LD E,(HL)
11BB E1 POP HL
11BC 19 ADD HL,DE
11BD 23 INC HL
11BE 22D721 LD (PGBUFP),HL ;STORE IT
11C1 2B DEC HL ;CALCULATE NO. OF AVAILABLE PAGES
11C2 EB EX DE,HL ;TOP LOCATION
11C3 CD0902 CALL MEMTOP
11C6 7C LD A,H
11C7 92 SUB D
11C8 0F RRCA
11C9 E67F AND 7FH ;SWAPPING SPACE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 32
11CB FE40 CP MAXPGS
11CD DAD211 JP C,STAR3A
11D0 3E40 LD A,MAXPGS
11D2 32DB21 STAR3A: LD (NPGS),A ;SAVE NUMBER OF PAGES
11D5 3D DEC A
11D6 32DD21 LD (PGBOT),A
11D9 210910 LD HL,PGTBLF
11DC CD081F CALL HLOFF
11DF 36FF LD (HL),0FFH ;SET LAST PAGE
;
; INITIALIZE RANDOM NUMBER
;
11E1 0605 LD B,5
11E3 21FFFF LD HL,0FFFFH
11E6 22AC21 LD (SHIFT),HL
11E9 22AE21 LD (SHIFT+2),HL
11EC 21E60B LD HL,RDFLG ;SET FLAG TO 1ST READ
11EF 3600 LD (HL),0
11F1 CDEE1B START4: CALL RND
11F4 05 DEC B
11F5 C2F111 JP NZ,START4
;
;
;
11F8 AF XOR A
11F9 32B721 LD (NOLPT),A ;USE LPT
11FC 2AD921 LD HL,(ZCODEP)
11FF 110100 LD DE,ZSWAP
1202 19 ADD HL,DE
1203 7E LD A,(HL)
1204 47 LD B,A
1205 3A5201 LD A,(BSTLIN) ;IS THERE A STATUS LINE?
1208 B7 OR A
1209 78 LD A,B
120A C20F12 JP NZ,START5
120D F610 OR ZSTATB ;INDICATE NO STATUS LINE
120F 77 START5: LD (HL),A
; JP MLOOP ;COMMENTED OUT FOR FALL THROUGH
;
; **********************************************************************
; * *
; * MAINLOOP *
; * *
; **********************************************************************
;
;
;MAIN LOOP, READ AN INSTRUCTION AND ITS ARGS, THEN DISPATCH
1210 AF MLOOP: XOR A
1211 32C321 LD (ARGCNT),A ;ZERO ARG COUNT
1214 CD5A1D CALL NEXTPC ;GET NEXT OPCODE IN A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 33
1217 32C421 LD (OPCODE),A ;SAVE IT
121A FE80 CP 128
121C DAB612 JP C,OP2 ;2-OP
121F FEB0 CP 176
1221 DA8D12 JP C,OP1 ;1-OP
1224 FEC0 CP 192
1226 DA8012 JP C,OP0 ;0-OP
;
; HANDLE AN X-OP
;
1229 CD5A1D OPEXT: CALL NEXTPC ;GET VAR TYPES, THIS IS AN EXT OP
122C 11BB21 LD DE,ARG1
122F 0604 LD B,4 ;MAX NUMBER OF ARGS
1231 4F LD C,A
1232 C5 OPEXTL: PUSH BC
1233 D5 PUSH DE
1234 79 LD A,C
1235 E6C0 AND 0C0H ;ISOLATE BIT7, BIT6 TO DETERMINE ARG TYPE
1237 CCED12 CALL Z,GETLNG ;00=LONG IMMEDIATE
123A FE80 CP 80H
123C CCFA12 CALL Z,GETVAR ;10=VARIABLE
123F FE40 CP 40H
1241 CCE412 CALL Z,GETSHT ;01=SHORT IMMEDIATE
1244 D1 POP DE
1245 C1 POP BC
1246 FEC0 CP 0C0H ;11=NO MORE VARIABLES
1248 CA5D12 JP Z,OPEXTF ;ALL DONE?
124B EB EX DE,HL ;NO. STORE VALUE
124C 73 LD (HL),E
124D 23 INC HL
124E 72 LD (HL),D
124F 23 INC HL
1250 EB EX DE,HL ;POINTER BACK IN DE
1251 21C321 LD HL,ARGCNT
1254 34 INC (HL) ;ONE MORE ARG
1255 79 LD A,C
1256 07 RLCA
1257 07 RLCA ;GET TO NEXT ARG TYPE
1258 4F LD C,A
1259 05 DEC B ;DECREMENT ARG COUNT
125A C23212 JP NZ,OPEXTL ;LOOP FOR MORE
;
; DISPATCH THE X-OP
;
125D 216214 OPEXTF: LD HL,OPEXTT ;COMPUTE DISPATCH POINTER
1260 3AC421 LD A,(OPCODE) ;RETRIEVE THE OPCODE
1263 FEE0 CP 224 ;IS IT AN EXTENDED 2-OP?
1265 DAD712 JP C,OP2EX ; YES.
1268 D6E0 SUB 224 ; NO.
126A FE0A CP OPEXTM ;IS IT A LEGAL X-OP?
126C D2BF15 JP NC,BADOP ; NO.
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 34
;
; GENERALIZED DISPATCH
;
126F OPDSPH:
126F 87 ADD A,A ;FORM A WORD OFFSET (*2)
1270 4F LD C,A ;PUT OFFSET INTO BC
1271 0600 LD B,0
1273 09 ADD HL,BC ;ADD OFFSET TO DISPATCH POINTER
1274 5E LD E,(HL) ;ADDRESS LSB
1275 23 INC HL
1276 56 LD D,(HL) ;ADDRESS MSB
1277 2ABB21 LD HL,(ARG1) ;FIRST ARG
127A EB EX DE,HL ;HL ^ TABLE ADDRESS OF ROUTINE
; DE <= FIRST ARG
127B 3AC321 LD A,(ARGCNT) ;B <= ARG COUNT
127E 47 LD B,A
127F E9 JP (HL) ;GO TO IT
;
; HANDLE A 0-OP
;
1280 D6B0 OP0: SUB 176 ;ADJUST VALUE
1282 FE0E CP OP0M ;IS IT A LEGAL 0-OP?
1284 D2BF15 JP NC,BADOP ; NO.
1287 21F413 LD HL,OP0T ; YES. HL ^ 0-OP TABLE
128A C36F12 JP OPDSPH ;DISPATCH IT
;
; HANDLE A 1-OP
;
128D E630 OP1: AND 30H ;1 OP, ISOLATE BITS 5,4
128F CCED12 CALL Z,GETLNG ;00=LONG IMMEDIATE
1292 FE10 CP 10H
1294 CCE412 CALL Z,GETSHT ;01=SHORT IMMEDIATE
1297 FE20 CP 20H
1299 CCFA12 CALL Z,GETVAR ;10=VARIABLE
129C 3E01 LD A,1
129E 32C321 LD (ARGCNT),A ;1 ARG
12A1 22BB21 LD (ARG1),HL ;STORE IT
12A4 3AC421 LD A,(OPCODE) ;RESTORE OPCODE
12A7 E6CF AND 0CFH ;(NOT 30H) TURN OFF MODE BITS
12A9 D680 SUB 128 ;ADJUST VALUE
12AB FE10 CP OP1M ;LEGAL 1-OP?
12AD D2BF15 JP NC,BADOP ; NO.
12B0 211014 LD HL,OP1T ; YES. HL ^ 1-OP TABLE
12B3 C36F12 JP OPDSPH ;DISPATCH IT
;
; HANDLE A 2-OP
;
12B6 E640 OP2: AND 40H ;ISOLATE 1ST. ARG BIT
12B8 C4FA12 CALL NZ,GETVAR ;1=VARIABLE
12BB CCE412 CALL Z,GETSHT ;0=SHORT IMMEDIATE
12BE 22BB21 LD (ARG1),HL ;STORE ARG1
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 35
12C1 3AC421 LD A,(OPCODE) ;RESTORE OPCODE
12C4 E620 AND 20H ;ISOLATE 2ND. ARG BIT
12C6 C4FA12 CALL NZ,GETVAR ;1=VARIABLE
12C9 CCE412 CALL Z,GETSHT ;2=SHORT IMMEDIATE
12CC 22BD21 LD (ARG2),HL ;STORE ARG 2
12CF 3E02 LD A,2
12D1 32C321 LD (ARGCNT),A ;TWO ARGS
12D4 3AC421 LD A,(OPCODE) ;RESTORE OPCODE
12D7 E61F OP2EX: AND 1FH ;(NOT 0E0H) TURN OFF MODE BITS
12D9 FE19 CP OP2M ;LEGAL 2-OP?
12DB D2BF15 JP NC,BADOP ; NO.
12DE 213014 LD HL,OP2T ; YES. HL ^ 2-OP TABLE
12E1 C36F12 JP OPDSPH ;DISPATCH IT
;
;*************************************
;* OPCODE ARGUMENT FETCH SUBROUTINES *
;*************************************
;
; -----------------------
; FETCH A SHORT IMMEDIATE
; -----------------------
12E4 F5 GETSHT: PUSH AF ;SAVE OPCODE
12E5 CD5A1D CALL NEXTPC ;GET NEXT ZBYTE
12E8 6F LD L,A ;MAKING IT THE LSB OF ARGUMENT
12E9 2600 LD H,0 ;MSB IS 0
12EB F1 POP AF ;RESTORE OPCODE
12EC C9 RET
; ----------------------
; FETCH A LONG IMMEDIATE
; ----------------------
12ED F5 GETLNG: PUSH AF ;SAVE OPCODE
12EE CD5A1D CALL NEXTPC ;GET NEXT ZBYTE
12F1 67 LD H,A ;MAKING IT THE MSB OF ARGUMENT
12F2 E5 PUSH HL ;SAVE IT ON THE STACK
12F3 CD5A1D CALL NEXTPC ;GET NEXT ZBYTE
12F6 E1 POP HL ;RESTORE MSB OF ARGUMENT
12F7 6F LD L,A ;AND FILL IN LSB OF ARGUMENT
12F8 F1 POP AF ;RESTORE OPCODE
12F9 C9 RET
; ----------------
; FETCH A VARIABLE
; ----------------
12FA F5 GETVAR: PUSH AF ;GET VAR, FIRST FIND TYPE
12FB CD5A1D CALL NEXTPC
12FE B7 OR A
12FF CA2213 JP Z,GETVRS ;FROM STACK
1302 FE10 GETVR1: CP 16
1304 D21613 JP NC,GETVRG ;GLOBAL
1307 3D GETVRL: DEC A ;LOCAL
1308 87 ADD A,A
1309 5F LD E,A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 36
130A 1600 LD D,0
130C 218721 LD HL,LOCALS
130F 19 GETVL1: ADD HL,DE ;POINTER TO VARIABLE
1310 56 LD D,(HL)
1311 23 INC HL
1312 5E LD E,(HL)
1313 EB EX DE,HL ;RETURN VALUE IN HL
1314 F1 POP AF
1315 C9 RET
;
1316 D610 GETVRG: SUB 16
1318 5F LD E,A ;GET GLOBAL
1319 1600 LD D,0
131B 2AC521 LD HL,(GLOBAL)
131E 19 ADD HL,DE ;PRE ADD SO IT GETS DONE TWICE
131F C30F13 JP GETVL1
;
1322 CD451D GETVRS: CALL POPSTK ;VAR FROM STACK
1325 F1 POP AF
1326 C9 RET
;
;*********************
;* MISC. SUBROUTINES *
;*********************
1327 AF RET0: XOR A ;RETURN 0
1328 6F PUTBYT: LD L,A
1329 2600 LD H,0
132B CD3113 PUTVAL: CALL PUTVLC ;STORE VALUE
132E C31012 JP MLOOP
;
1331 E5 PUTVLC: PUSH HL ;SAVE VALUE
1332 CD5A1D CALL NEXTPC ;GET TYPE
1335 E1 POP HL
1336 B7 PUTVR1: OR A
1337 CA2C1D JP Z,PSHSTK ;SAVE ON STACK AND RETURN
133A EB EX DE,HL ;VALUE IN DE
133B FE10 CP 16
133D D24D13 JP NC,PUTVLG ;GLOBAL
1340 3D PUTVLL: DEC A ;LOCAL
1341 87 ADD A,A
1342 4F LD C,A
1343 0600 LD B,0
1345 218721 LD HL,LOCALS
1348 09 PUTVL1: ADD HL,BC ;COMPUTE ADDRESS
1349 72 LD (HL),D
134A 23 INC HL
134B 73 LD (HL),E
134C C9 RET
;
134D D610 PUTVLG: SUB 16
134F 4F LD C,A ;STORE GLOBAL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 37
1350 0600 LD B,0
1352 2AC521 LD HL,(GLOBAL) ;GLOBAL POINTER
1355 09 ADD HL,BC ;PRE ADD
1356 C34813 JP PUTVL1
;
;*********************
;* DATA MANIPULATION *
;*********************
;
; -----------------
; RECALL A VARIABLE
; -----------------
1359 F5 VARGET: PUSH AF ;SAVE OPCODE
135A B7 OR A ;IF NON-ZERO
135B C20213 JP NZ,GETVR1 ; THEN GET A VARIABLE FROM LOCAL OR GLOBAL TABLE
; ELSE TAKE VAR OFF STACK
135E F1 VARGTS: POP AF ;RESTORE OPCODE
135F CD451D CALL POPSTK ;POP A WORD FROM ZSTACK
1362 C32C1D JP PSHSTK ;PUT IT BACK AND RETURN THE VALUE IN HL
; ----------------
; STORE A VARIABLE
; ----------------
1365 B7 VARPUT: OR A ;IF NON-ZERO
1366 C23613 JP NZ,PUTVR1 ; THEN PUT A VARIABLE IN LOCAL OR GLOBAL TABLE
; ELSE REPLACE A WORD ON Z-STACK
1369 E5 VARPTS: PUSH HL ;SAVE NEW VALUE
136A CD451D CALL POPSTK ;POP OLD WORD OFF Z-STACK
136D E1 POP HL ;RESTORE NEW VALUE
136E C32C1D JP PSHSTK ;AND PUSH IT ON TOP OF ZSTACK
;
;************************
;* PREDICATE PROCESSING *
;************************
;
; ---------------
; PREDICATE FAILS
; ---------------
1371 CD5A1D PREDF: CALL NEXTPC ;FETCH NEXT BYTE OF ZCODE
1374 B7 OR A
1375 F28713 JP P,PREDB ;BRANCH IF < 128
1378 E640 PREDNB: AND 40H ;CHECK FOR MULTI BYTE HACK
137A CC5A1D CALL Z,NEXTPC ;GET NEXT BYTE IF SO
137D C31012 JP MLOOP ;CONTINUE IN SEQUENCE
; ------------------
; PREDICATE SUCCEEDS
; ------------------
1380 CD5A1D PREDS: CALL NEXTPC ;FETCH NEXT BYTE OF ZCODE
1383 B7 OR A ;IF BIT 7 IS NOT SET
1384 F27813 JP P,PREDNB ;BRANCH ON PREDICATE FAILURE
; ELSE FALL THROUGH TO PREDB
; ----------------
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 38
; PERFORM A BRANCH
; ----------------
1387 47 PREDB: LD B,A ;SAVE OPCODE
1388 E640 AND 40H ;LONG BRANCH?
138A CA9613 JP Z,PREDLB ; YES. (BIT 6 WAS OFF)
; NO. SHORT BRANCH
138D 78 LD A,B ;RESTORE OPCODE
138E E63F AND 3FH ;FORM SHORT OFFSET
1390 4F LD C,A ;USE AS LSB OF BRANCH OFFSET
1391 0600 LD B,0 ;ZERO MSB OF OFFSET
1393 C3AA13 JP PREDB1 ;SIMULATE LONG BRANCH TO A CLOSE PLACE
;
; HANDLE A LONG BRANCH
1396 78 PREDLB: LD A,B ;RESTORE OPCODE
1397 E63F AND 3FH ;FORM MSB OF OFFSET
1399 47 LD B,A ;B <= MSB OF OFFSET
139A C5 PUSH BC
139B CD5A1D CALL NEXTPC ;GET SECOND BYTE
139E C1 POP BC
139F 4F LD C,A ;C <= LSB OF OFFSET
13A0 78 LD A,B ;A <= MSB OF OFFSET
13A1 E620 AND 20H ;CHECK SIGN OF 14 BIT VALUE
13A3 CAAA13 JP Z,PREDB1 ;POSITIVE
13A6 78 LD A,B ;ELSE EXTEND THE SIGN (A <= MSB)
13A7 F6C0 OR 0C0H ;AND MAKE THE FULL WORD NEG
13A9 47 LD B,A ;SAVE THE RESULT IN B
;
; BRANCH TO THE Z-ADDRESS AT $(ZPC) + OFFSET (IN BC)
; (ZPC RELATIVE ADDRESSING)
13AA 78 PREDB1: LD A,B
13AB B1 OR C ;IS OFFSET=0?
13AC CA7F14 JP Z,RFALSE ; YES. DO AN RFALSE
13AF 0B DEC BC
13B0 78 LD A,B
13B1 B1 OR C ;WAS OFFSET=1
13B2 CA7614 JP Z,RTRUE ; YES. DO AN RTRUE
13B5 0B PREDB3: DEC BC ;2 NOW SUBTRACTED FROM JUMP ADDRESS
13B6 60 LD H,B ;HL <= JUMP ADDRESS
13B7 69 LD L,C
13B8 22CA21 LD (ZPCOFF),HL ;ZPCOFF <= JUMP ADDRESS
13BB 2AA621 LD HL,(ZPCL) ;HL <= LOW ORDER 9 BITS OF ZIP PROGRAM COUNTER
13BE 59 LD E,C ;E <= LSB OF JUMP ADDRESS
13BF 78 LD A,B ;A <= MSB OF JUMP ADDRESS
13C0 E601 AND 1
13C2 57 LD D,A ;ZPCL ADDER
13C3 78 LD A,B ;ARITHMETICALLY SHIFT B RIGHT 1
13C4 07 RLCA ;FIRST SET CARRY
13C5 78 LD A,B
13C6 1F RRA
13C7 47 LD B,A ;CUTE
13C8 19 ADD HL,DE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 39
13C9 7C LD A,H
13CA E602 AND 2
13CC CAD213 JP Z,PREDB2 ;NO OVERFLOW
13CF 25 DEC H
13D0 25 DEC H ;OVERFLOW
13D1 04 INC B
13D2 22A621 PREDB2: LD (ZPCL),HL ;STORE LOW BYTES
13D5 21A521 LD HL,ZPCH ;MODIFY UPPER
13D8 78 LD A,B
13D9 B7 OR A
13DA CAE613 JP Z,PREDB4 ;NO CHANGE IN PACE, DO FASTER JUMP
13DD 86 ADD A,(HL)
13DE 77 LD (HL),A
13DF AF XOR A
13E0 32CE21 LD (ZPCFLG),A ;CHANGED PAGES
13E3 C31012 JP MLOOP ;FINISHED
;
13E6 2ACC21 PREDB4: LD HL,(ZPCPNT)
13E9 EB EX DE,HL
13EA 2ACA21 LD HL,(ZPCOFF)
13ED 19 ADD HL,DE ;CALCULATE NEW PC POINTER
13EE 22CC21 LD (ZPCPNT),HL
13F1 C31012 JP MLOOP
;
; **********************************************************************
; * *
; * OPCODE PROCESSING SECTION *
; * *
; **********************************************************************
;
; ****************************
; * DISPATCH TABLES *
; ****************************
;
; -----
; 0-OPS
; -----
13F4 7614 OP0T: DW RTRUE ;0
13F6 7F14 DW RFALSE ;1
13F8 8514 DW PRINTI ;2
13FA B714 DW PRINTR ;3
13FC C014 DW ZNOP ;4
13FE C314 DW ZSAVE ;5
1400 C614 DW ZRSTOR ;6
1402 C914 DW ZRSTAR ;7
1404 CC14 DW RSTACK ;8
1406 D514 DW FSTACK ;9
1408 DB14 DW ZQUIT ;10
140A DE14 DW CRLF ;11
140C E414 DW USL ;12
140E EA14 DW VERIFY ;13
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 40
000E OP0M EQU ($-OP0T)/2 ;NUMBER OF 0-OPS
;
; -----
; 1-OPS
; -----
1410 4215 OP1T: DW ZEROQ ;0
1412 4D15 DW NEXTQ ;1
1414 5915 DW FIRSTQ ;2
1416 7315 DW LOC ;3
1418 8315 DW PTSIZE ;4
141A 9315 DW INC ;5
141C 9915 DW DEC ;6
141E B615 DW PRINTB ;7
1420 BF15 DW BADOP ;8 (UNDEFINED)
1422 C215 DW REMOVE ;9
1424 1816 DW PRINTD ;10
1426 3316 DW RETURN ;11
1428 7E16 DW JUMP ;12
142A 8716 DW PRINT ;13
142C 9316 DW VALUE ;14
142E 9C16 DW BCOM ;15
0010 OP1M EQU ($-OP1T)/2 ;NUMBER OF 1-OPS
;
; -----
; 2-OPS
; -----
1430 BF15 OP2T: DW BADOP
1432 C218 DW EQUALQ
1434 A816 DW LESSQ
1436 B516 DW GRTRQ
1438 C116 DW DLESSQ
143A CC16 DW IGRTRQ
143C DC16 DW INQ
143E F016 DW BTST
1440 0217 DW BOR
1442 0E17 DW BAND
1444 1A17 DW FSETQ
1446 2917 DW FSET
1448 3617 DW FCLEAR
144A 4517 DW ZSET
144C 5117 DW MOVE
144E 7D17 DW GET
1450 8F17 DW GETB
1452 A317 DW GETP
1454 EF17 DW GETPT
1456 1418 DW NEXTP
1458 3E18 DW ZADD
145A 4518 DW ZSUB
145C 5118 DW MUL
145E 7D18 DW DIV
1460 B418 DW ZMOD
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 41
0019 OP2M EQU ($-OP2T)/2
;
; -----
; X-OPS
; -----
1462 EF18 OPEXTT: DW ZCALL
1464 7B19 DW PUT
1466 9419 DW PUTB
1468 A819 DW PUTP
146A DA19 DW ZREAD
146C 841B DW PRINTC
146E 8E1B DW PRINTN
1470 CD1B DW RANDOM
1472 DC1B DW ZPUSH
1474 E51B DW ZPOP
000A OPEXTM EQU ($-OPEXTT)/2
; **********************************************************************
; * *
; * ZCODE EXECUTION ROUTINES *
; * *
; **********************************************************************
;
; *******************
; * 0-OPS *
; *******************
;
;
; ----------
; RTRUE [0]
; ----------
; SIMULATE A RETURN 1
1476 210100 RTRUE: LD HL,1
1479 22BB21 RTRUE1: LD (ARG1),HL
147C C33316 JP RETURN
;
; -----------
; RFALSE [1]
; -----------
; SIMULATE A RETURN 0
147F 210000 RFALSE: LD HL,0
1482 C37914 JP RTRUE1
;
; -----------
; PRINTI [2]
; -----------
; PRINT THE Z-STRING IMMEDIATELY FOLLOWING THE OPCODE
1485 CD8B14 PRINTI: CALL PRNTI1
1488 C31012 JP MLOOP
;
148B 2AA621 PRNTI1: LD HL,(ZPCL)
148E 22D121 LD (MPCL),HL ;SET UP MPC TO EQUAL ZPC
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 42
1491 3AA521 LD A,(ZPCH)
1494 32D021 LD (MPCH),A
1497 AF XOR A
1498 32D521 LD (MPCFLG),A ;ZERO MPC FLAG
149B CD291F CALL PZSTR ;PRINT THE STRING
149E 2AD121 LD HL,(MPCL) ;NOW CHANGE BACK ZPC TO END OF STRING
14A1 22A621 LD (ZPCL),HL
14A4 3AD021 LD A,(MPCH)
14A7 32A521 LD (ZPCH),A
14AA 3AD521 LD A,(MPCFLG)
14AD 32CE21 LD (ZPCFLG),A ;UPDATE FLAG
14B0 2AD321 LD HL,(MPCPNT)
14B3 22CC21 LD (ZPCPNT),HL ;AND PAGE POINTER
14B6 C9 RET
;
; -----------
; PRINTR [3]
; -----------
; EXECUTE A PRINTI, FOLLOWED BY A CRLF, AND A RTRUE
14B7 CD8B14 PRINTR: CALL PRNTI1
14BA CDB404 CALL PCRLF
14BD C37614 JP RTRUE
;
; ---------
; ZNOP [4]
; ---------
; EXECUTE A NOP
14C0 C31012 ZNOP: JP MLOOP
;
; ----------
; ZSAVE [5]
; ----------
; SAVE GAME
14C3 C37007 ZSAVE: JP SAVE ;MACHINE DEPENDENT
;
; -----------
; ZRSTOR [6]
; -----------
; RESTORE SAVED GAME
14C6 C3930A ZRSTOR: JP RESTOR ;MACHINE DEPENDENT
;
; -----------
; ZRSTAR [7]
; -----------
; RESTART GAME
14C9 C35F07 ZRSTAR: JP RESTAR ;MACHINE DEPENDENT
;
; -----------
; RSTACK [8]
; -----------
; EXECUTE A RETURN WITH CALL VALUE ON TOP OF THE STACK
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 43
14CC CD451D RSTACK: CALL POPSTK
14CF 22BB21 LD (ARG1),HL
14D2 C33316 JP RETURN
;
; -----------
; FSTACK [9]
; -----------
14D5 CD451D FSTACK: CALL POPSTK
14D8 C31012 JP MLOOP
;
; -----------
; ZQUIT [10]
; -----------
14DB C34907 ZQUIT: JP QUIT ;MACHINE DEPENDENT
;
; ----------
; CRLF [11]
; ----------
; PRINT CARRIAGE RETURN/LINE FEED
14DE CDB404 CRLF: CALL PCRLF
14E1 C31012 JP MLOOP
;
; ---------
; USL [12]
; ---------
; UPDATE STATUS LINE
14E4 CDC105 USL: CALL WHOLIN
14E7 C31012 JP MLOOP
;
; ------------
; VERIFY [13]
; ------------
; VERIFY THE GAME CODE
14EA 3E01 VERIFY: LD A,1 ;SELF CHECK
14EC 32B821 LD (VERF),A ;IN VERIFY MODE, ALWAYS GET NEW PAGE
14EF 218910 LD HL,VRS
14F2 CD660A CALL MSGOUT ;OUTPUT LAST UPDATE
14F5 219A10 LD HL,VRLINE
14F8 CD660A CALL MSGOUT ;OUTPUT VERSION
14FB 2AD921 LD HL,(ZCODEP) ;^ TOP OF ZCODE
14FE 111A00 LD DE,ZCKLEN
1501 19 ADD HL,DE
1502 56 LD D,(HL)
1503 23 INC HL
1504 5E LD E,(HL)
1505 21E0FF LD HL,-32
1508 19 ADD HL,DE
1509 EB EX DE,HL ;DE HAVE COUNT
150A 010000 LD BC,0 ;SUM IN BC
150D 214000 LD HL,32*2
1510 CDE41D CALL SETWRD
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 44
1513 C5 VERIFL: PUSH BC
1514 D5 PUSH DE
1515 CD251E CALL GETWRD ;GUARENTEED TO GET FRESH WORD
1518 D1 POP DE
1519 C1 POP BC
151A 7C LD A,H
151B 2600 LD H,0
151D 09 ADD HL,BC
151E CD081F CALL HLOFF
1521 44 LD B,H
1522 4D LD C,L ;TOTAL IN BC
1523 1B DEC DE
1524 7A LD A,D
1525 B3 OR E
1526 C21315 JP NZ,VERIFL ;SUM ALL BYTES
1529 111C00 LD DE,ZCKSUM
152C 2AD921 LD HL,(ZCODEP)
152F 19 ADD HL,DE
1530 56 LD D,(HL)
1531 23 INC HL
1532 5E LD E,(HL) ;GET CHECKSUM
1533 60 LD H,B
1534 69 LD L,C
1535 AF XOR A
1536 32B821 LD (VERF),A
1539 CD251D CALL HLGEDE ;COMPARE CALCULATED WITH ACTUAL
153C CA8013 JP Z,PREDS
153F C37113 JP PREDF ;FAIL IF DIFFERENT
;
; *******************
; * 1-OPS *
; *******************
;
; ----------
; ZERO? [0]
; ----------
; IS ARG1 EQUAL TO ZERO? [PRED]
1542 2ABB21 ZEROQ: LD HL,(ARG1)
1545 7C LD A,H
1546 B5 OR L
1547 CA8013 JP Z,PREDS
154A C37113 JP PREDF
;
; ----------
; NEXT? [1]
; ----------
; RETURN THE NEXT POINTER IN OBJRCT "ARG1"; FAIL IF
; NONE LEFT, AND RETURN ZERO [VALUE][PRED]
154D 3ABB21 NEXTQ: LD A,(ARG1)
1550 CDF41C CALL OBJLOC
1553 110500 LD DE,5
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 45
1556 C36215 JP FRSTQ1 ;SAME AS FIRST?
;
; -----------
; FIRST? [2]
; -----------
; RETURN THE FIRST POINTER IN OBJECT "ARG1"; FAIL IF
; NONE, AND RETURN ZERO [VALUE][PRED]
;
1559 3ABB21 FIRSTQ: LD A,(ARG1)
155C CDF41C CALL OBJLOC
155F 110600 LD DE,6
1562 19 FRSTQ1: ADD HL,DE
1563 7E LD A,(HL)
1564 F5 PUSH AF ;SAVE VALUE
1565 6F LD L,A
1566 2600 LD H,0
1568 CD3113 CALL PUTVLC ;STORE VALUE
156B F1 POP AF
156C B7 OR A
156D C28013 JP NZ,PREDS ;FOUND FIRST
1570 C37113 JP PREDF ;FIRST NOT FOUND
;
; --------
; LOC [3]
; --------
; RETURN THE OBJECT CONTAINING OBJECT "ARG1"; ZERO IF NONE [VALUE]
1573 3ABB21 LOC: LD A,(ARG1)
1576 CDF41C CALL OBJLOC
1579 110400 LD DE,4
157C 19 ADD HL,DE
157D 6E LD L,(HL)
157E 2600 LD H,0
1580 C32B13 JP PUTVAL
;
; -----------
; PTSIZE [4]
; -----------
; RETURN LENGTH OF PROP TABLE "ARG1" IN BYTES [VALUE]
1583 2ABB21 PTSIZE: LD HL,(ARG1)
1586 EB EX DE,HL
1587 2AD921 LD HL,(ZCODEP)
158A 19 ADD HL,DE ;POINTER TO PROP ENTRY
158B 2B DEC HL
158C CDE51C CALL PROPL
158F 3C INC A
1590 C32813 JP PUTBYT
;
; --------
; INC [5]
; --------
; INCREMENT ARG1 [VALUE]
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 46
1593 CD9F15 INC: CALL INC1
1596 C31012 JP MLOOP
;
; --------
; DEC [6]
; --------
; DECREMENT ARG1 [VALUE]
1599 CDAC15 DEC: CALL DEC1
159C C31012 JP MLOOP
;
159F 3ABB21 INC1: LD A,(ARG1)
15A2 CD5913 CALL VARGET
15A5 23 INC HL
15A6 E5 INC2: PUSH HL
15A7 CD6513 CALL VARPUT
15AA E1 POP HL
15AB C9 RET
;
15AC 3ABB21 DEC1: LD A,(ARG1)
15AF CD5913 CALL VARGET
15B2 2B DEC HL
15B3 C3A615 JP INC2
;
; -----------
; PRINTB [7]
; -----------
; PRINT THE STRING POINTED TO BY BYTE POINTER ARG1
15B6 2ABB21 PRINTB: LD HL,(ARG1)
15B9 CDE41D PRINT2: CALL SETWRD
15BC C38D16 JP PRINT1
;
; ----------
; BADOP [8]
; ----------
15BF C31012 BADOP: JP MLOOP
;
; -----------
; REMOVE [9]
; -----------
; MOVE OBJECT [ARG1] TO PSEUDO-OBJECT #0
15C2 CDC815 REMOVE: CALL REMOVC
15C5 C31012 JP MLOOP
;
15C8 3ABB21 REMOVC: LD A,(ARG1)
15CB 47 LD B,A ;SAVE IT
15CC CDF41C CALL OBJLOC
15CF EB EX DE,HL ;SAVE IN DE
15D0 210400 LD HL,4
15D3 19 ADD HL,DE
15D4 7E LD A,(HL)
15D5 B7 OR A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 47
15D6 C8 RET Z ;NO OBJECT
15D7 D5 PUSH DE ;SAVE VALUE
15D8 CDF41C CALL OBJLOC ;PARENT OBJECT
15DB 110600 LD DE,6
15DE EB EX DE,HL ;LP IN D
15DF 19 ADD HL,DE
15E0 4E LD C,(HL) ;SIBL
15E1 78 LD A,B
15E2 B9 CP C
15E3 C2F515 JP NZ,REMVC1 ;NOT SAME
15E6 E1 POP HL
15E7 E5 PUSH HL ;L1
15E8 010500 LD BC,5
15EB 09 ADD HL,BC
15EC 7E LD A,(HL)
15ED 210600 LD HL,6 ;PARENT'S FIRST SLOT GETS LOC SLOT
15F0 19 ADD HL,DE
15F1 77 LD (HL),A
15F2 C30D16 JP REMVC2
15F5 79 REMVC1: LD A,C ;GET SIBL
15F6 CDF41C CALL OBJLOC
15F9 110500 LD DE,5
15FC 19 ADD HL,DE
15FD 54 LD D,H
15FE 5D LD E,L ;SAVE LS+5
15FF 4E LD C,(HL) ;NEW SIBL
1600 78 LD A,B
1601 B9 CP C
1602 C2F515 JP NZ,REMVC1 ;NOT END OF CHAIN
1605 010500 LD BC,5
1608 E1 POP HL
1609 E5 PUSH HL
160A 09 ADD HL,BC ;OLD NEXT
160B 7E LD A,(HL)
160C 12 LD (DE),A
160D E1 REMVC2: POP HL
160E 110400 LD DE,4
1611 19 ADD HL,DE
1612 3600 LD (HL),0
1614 23 INC HL
1615 3600 LD (HL),0
1617 C9 RET
; ------------
; PRINTD [10]
; ------------
; PRINT SHORT DESCRIPTION OF OBJECT [ARG1]
1618 3ABB21 PRINTD: LD A,(ARG1)
161B CD2116 CALL PRNTDC
161E C31012 JP MLOOP
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 48
1621 CDF41C PRNTDC: CALL OBJLOC
1624 110700 LD DE,7
1627 19 ADD HL,DE
1628 56 LD D,(HL)
1629 23 INC HL
162A 5E LD E,(HL)
162B EB EX DE,HL
162C 23 INC HL
162D CDE41D CALL SETWRD
1630 C3291F JP PZSTR
;
; ------------
; RETURN [11]
; ------------
; RETURN FROM A CALL WITH VALUE ARG1
1633 2AA921 RETURN: LD HL,(OZSTKP) ;RESET STACK FROM CALL
1636 22070E LD (ZSTAKP),HL
1639 3AAB21 LD A,(OZSTKC)
163C 32A821 LD (ZSTAKC),A
163F CD451D CALL POPSTK ;RESET Z-STACK
1642 7D LD A,L
1643 32A521 LD (ZPCH),A ;SAVE UPPER PC
1646 44 LD B,H ;H HAS NUMBER OF LOCALS
1647 7C LD A,H
1648 87 ADD A,A ;WORD
1649 CA6116 JP Z,RET2 ;NO LOCALS
164C 218521 LD HL,LOCALS-2
164F CD081F CALL HLOFF ;POSITION HL TO RESTORE LOCALS
1652 EB RET1: EX DE,HL
1653 CD451D CALL POPSTK ;GET THE LOCAL, REVERSE ORDER FIRST
1656 EB EX DE,HL
1657 72 LD (HL),D
1658 23 INC HL
1659 73 LD (HL),E
165A 2B DEC HL ;NOW BACK UP ONE ELEMENT
165B 2B DEC HL
165C 2B DEC HL
165D 05 DEC B
165E C25216 JP NZ,RET1 ;LOOP
1661 CD451D RET2: CALL POPSTK
1664 22A621 LD (ZPCL),HL ;REST OF PC
1667 CD451D CALL POPSTK
166A 22A921 LD (OZSTKP),HL
166D CD451D CALL POPSTK
1670 7D LD A,L
1671 32AB21 LD (OZSTKC),A ;RESTORE OLD VALUES
1674 AF XOR A
1675 32CE21 LD (ZPCFLG),A ;PC CHANGED
1678 2ABB21 LD HL,(ARG1) ;ARGUMENT TO BE RETURNED
167B C32B13 JP PUTVAL ;STORE AND RETURN
;
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 49
; ----------
; JUMP [12]
; ----------
; BRANCH TO Z-LOCATION POINTED TO BY 16-BIT 2'S COMPLIMENT ARG1
167E 2ABB21 JUMP: LD HL,(ARG1) ;RELATIVE JUMP
1681 44 LD B,H
1682 4D LD C,L
1683 0B DEC BC
1684 C3B513 JP PREDB3 ;TREAT AS A SUCCESSFUL JUMP
;
; -----------
; PRINT [13]
; -----------
; PRINT THE Z-STRING POINTED TO BY THE WORD-POINTER ARG1
1687 2ABB21 PRINT: LD HL,(ARG1) ;TELL SETSTR WHERE THE STRING
168A CDF61D CALL SETSTR ;RESIDES AND
168D CD291F PRINT1: CALL PZSTR ;PRINT THE STRING
1690 C31012 JP MLOOP
;
; -----------
; VALUE [14]
; -----------
; RETURN VALUE OF ARG1 [VALUE]
1693 3ABB21 VALUE: LD A,(ARG1)
1696 CD5913 CALL VARGET
1699 C32B13 JP PUTVAL
;
; ----------
; BCOM [15]
; ----------
; COMPLIMENT ARG1 [VALUE]
169C 2ABB21 BCOM: LD HL,(ARG1)
169F 7C LD A,H
16A0 2F CPL
16A1 67 LD H,A
16A2 7D LD A,L
16A3 2F CPL
16A4 6F LD L,A
16A5 C32B13 JP PUTVAL
;
; *******************
; * 2-OPS *
; *******************
;
; ----------
; LESS? [0]
; ----------
; IS ARG1 LESS THAN ARG2? [PRED]
16A8 CD151D LESSQ: CALL GETARG
16AB EB EX DE,HL
16AC CD1D1D CALL SHLGED
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 50
16AF D28013 JP NC,PREDS
16B2 C37113 JP PREDF
;
; ----------
; GRTR? [1]
; ----------
; IS ARG1 GREATER THAN ARG2? [PRED]
16B5 CD151D GRTRQ: CALL GETARG
16B8 CD1D1D CALL SHLGED
16BB D28013 JP NC,PREDS
16BE C37113 JP PREDF
;
; -----------
; DLESS? [2]
; -----------
; DECREMENT ARG1: SUCCEED IF ARG1 (-1) IS LESS THAN ARG2 [PRED]
16C1 CDAC15 DLESSQ: CALL DEC1
16C4 EB EX DE,HL
16C5 2ABD21 LD HL,(ARG2)
16C8 EB EX DE,HL
16C9 C3D316 JP IGRTQ1
;
; -----------
; IGRTR? [3]
; -----------
; INCREMENT ARG1: SUCCEED IF ARG1 (+1) IS GREATER THAN ARG2 [PRED]
16CC CD9F15 IGRTRQ: CALL INC1
16CF EB EX DE,HL
16D0 2ABD21 LD HL,(ARG2)
16D3 CD1D1D IGRTQ1: CALL SHLGED
16D6 D28013 JP NC,PREDS
16D9 C37113 JP PREDF
;
; ----------
; IN? [4]
; ----------
; IS OBJECT [ARG1] CONTAINED IN OBJECT [ARG2] [PRED]
16DC 3ABB21 INQ: LD A,(ARG1)
16DF CDF41C CALL OBJLOC
16E2 110400 LD DE,4
16E5 19 ADD HL,DE
16E6 3ABD21 LD A,(ARG2)
16E9 BE CP (HL)
16EA CA8013 JP Z,PREDS ;SUCCESS IF OBJ 2 IN 1
16ED C37113 JP PREDF
;
; ---------
; BTST [5]
; ---------
; IS EVERY "ON" BIT IN ARG1 ALSO "ON" IN ARG2 [PRED]
16F0 CD151D BTST: CALL GETARG
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 51
16F3 7C LD A,H
16F4 A2 AND D
16F5 57 LD D,A
16F6 7D LD A,L
16F7 A3 AND E
16F8 5F LD E,A
16F9 CD251D CALL HLGEDE
16FC CA8013 JP Z,PREDS
16FF C37113 JP PREDF
;
; --------
; BOR [6]
; --------
; RETURN BITWISE OR OF ARG1 AND ARG2 [VALUE]
1702 CD151D BOR: CALL GETARG
1705 7A LD A,D
1706 B4 OR H
1707 67 LD H,A
1708 7B LD A,E
1709 B5 OR L
170A 6F LD L,A
170B C32B13 JP PUTVAL
;
; ---------
; BAND [7]
; ---------
; RETURN BITWISE AND OF ARG1 AND ARG2 [VALUE]
170E CD151D BAND: CALL GETARG
1711 7C LD A,H
1712 A2 AND D
1713 67 LD H,A
1714 7D LD A,L
1715 A3 AND E
1716 6F LD L,A
1717 C32B13 JP PUTVAL
;
; ----------
; FSET? [8]
; ----------
; IS FLAG "ARG2" SET IN OBJECT "ARG1"? [PRED]
171A CDA01C FSETQ: CALL FLAGSU ;GET BIT
171D 7A LD A,D
171E A0 AND B
171F 57 LD D,A
1720 7B LD A,E
1721 A1 AND C
1722 B2 OR D ;CHECK FOR ON
1723 C28013 JP NZ,PREDS ;BIT ON
1726 C37113 JP PREDF ;BIT OFF
;
; ---------
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 52
; FSET [9]
; ---------
; SET FLAG "ARG2" IN OBJECT "ARG1"
1729 CDA01C FSET: CALL FLAGSU
172C 7A LD A,D
172D B0 OR B
172E 77 LD (HL),A
172F 23 INC HL
1730 7B LD A,E
1731 B1 OR C
1732 77 LD (HL),A
1733 C31012 JP MLOOP
;
; ------------
; FCLEAR [10]
; ------------
; CLEAR FLAG "ARG2" IN OBJECT "ARG1"
1736 CDA01C FCLEAR: CALL FLAGSU
1739 78 LD A,B
173A 2F CPL
173B A2 AND D
173C 77 LD (HL),A
173D 23 INC HL
173E 79 LD A,C
173F 2F CPL
1740 A3 AND E
1741 77 LD (HL),A
1742 C31012 JP MLOOP
;
; ---------
; SET [11]
; ---------
; SET VARIABLE "ARG1" EQUAL TO VALUE "ARG2"
1745 3ABB21 ZSET: LD A,(ARG1)
1748 2ABD21 LD HL,(ARG2)
174B CD6513 VARPTR: CALL VARPUT
174E C31012 JP MLOOP
;
; ----------
; MOVE [12]
; ----------
; PUT OBJECT "ARG1" INTO OBJECT "ARG2"
1751 CDC815 MOVE: CALL REMOVC ;REMOVE OBJECT FIRST
1754 3ABB21 LD A,(ARG1)
1757 CDF41C CALL OBJLOC
175A E5 PUSH HL ;SAVE LOC OF FIRST ARG
175B 110400 LD DE,4
175E 19 ADD HL,DE ;LOC SLOT
175F 3ABD21 LD A,(ARG2)
1762 77 LD (HL),A
1763 CDF41C CALL OBJLOC
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 53
1766 110600 LD DE,6
1769 19 ADD HL,DE ;FIRST SLOT
176A 46 LD B,(HL)
176B 3ABB21 LD A,(ARG1)
176E 77 LD (HL),A
176F E1 POP HL
1770 78 LD A,B
1771 B7 OR A
1772 CA1012 JP Z,MLOOP
1775 110500 LD DE,5
1778 19 ADD HL,DE
1779 77 LD (HL),A ;NEXT SLOT
177A C31012 JP MLOOP
;
; ---------
; GET [13]
; ---------
; RETURN VALUE OF ITEM "ARG2" IN WORD-TABLE AT "ARG1"
177D 2ABD21 GET: LD HL,(ARG2)
1780 29 ADD HL,HL ;ITEM NUMBER*2
1781 EB EX DE,HL
1782 2ABB21 LD HL,(ARG1)
1785 19 ADD HL,DE ;POINTER TO ITEM
1786 CDE41D CALL SETWRD
1789 CD251E CALL GETWRD ;GET VALUE
178C C32B13 JP PUTVAL
;
; ----------
; GETB [14]
; ----------
; RETURN VALUE OF ITEM "ARG2" IN BYTE-TABLE AT "ARG1" [VALUE]
178F 2ABD21 GETB: LD HL,(ARG2)
1792 EB EX DE,HL
1793 2ABB21 LD HL,(ARG1)
1796 19 ADD HL,DE
1797 CDE41D CALL SETWRD
179A CD301E CALL GETBYT
179D 6F LD L,A
179E 2600 LD H,0
17A0 C32B13 JP PUTVAL
;
; ----------
; GETP [15]
; ----------
; RETURN PROP "ARG2" OF OBJECT "ARG1"; IF SPECIFIED PROP DOES
; NOT EXIST, RETUURN PROP'TH ELEMENT OF DEFAULT OBJECT [VALUE]
17A3 CDCA1C GETP: CALL PROPB ;GET POINTER TO PROPS IN PROP TABLE
17A6 CDE11C GETP1: CALL PROPN
17A9 47 LD B,A
17AA 3ABD21 LD A,(ARG2)
17AD B8 CP B
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 54
17AE CAD717 JP Z,GETP2 ;FOUND PROP
17B1 D2BA17 JP NC,GETP3 ;GET PROP FROM DEFAULT TABLE
17B4 CDEC1C CALL PROPNX ;TRY AGAIN WITH NEXT PROP
17B7 C3A617 JP GETP1
17BA 2AD921 GETP3: LD HL,(ZCODEP)
17BD 110A00 LD DE,ZOBJEC
17C0 19 ADD HL,DE
17C1 56 LD D,(HL)
17C2 23 INC HL
17C3 5E LD E,(HL)
17C4 2AD921 LD HL,(ZCODEP)
17C7 19 ADD HL,DE ;BEG OF OBJECT TABLE
17C8 3ABD21 LD A,(ARG2)
17CB 87 ADD A,A
17CC CD081F CALL HLOFF
17CF 2B DEC HL
17D0 5E LD E,(HL)
17D1 2B DEC HL
17D2 56 LD D,(HL)
17D3 EB EX DE,HL
17D4 C32B13 JP PUTVAL ;RETURN DEFAULT VALUE
17D7 CDE51C GETP2: CALL PROPL ;GET LENGTH
17DA 23 INC HL
17DB 3D DEC A
17DC FAE917 JP M,GETP2A ;1 BYTE
17DF C40602 CALL NZ,ZER ;BAD PROP LENGTH
17E2 56 LD D,(HL)
17E3 23 INC HL
17E4 5E LD E,(HL)
17E5 EB EX DE,HL
17E6 C32B13 JP PUTVAL ;RETURN TWO BYTE PROP
17E9 6E GETP2A: LD L,(HL)
17EA 2600 LD H,0
17EC C32B13 JP PUTVAL
17EF CDCA1C GETPT: CALL PROPB
17F2 CDE11C GETPT1: CALL PROPN
17F5 47 LD B,A
17F6 3ABD21 LD A,(ARG2)
17F9 B8 CP B
17FA CA0618 JP Z,GETPT2 ;FOUND PROP
17FD D22713 JP NC,RET0
1800 CDEC1C CALL PROPNX
1803 C3F217 JP GETPT1
1806 23 GETPT2: INC HL
1807 EB EX DE,HL
1808 2AD921 LD HL,(ZCODEP) ;SUBRACT OFF RELATIVE POINTER
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 55
180B 7B LD A,E
180C 95 SUB L
180D 6F LD L,A
180E 7A LD A,D
180F 9C SBC A,H
1810 67 LD H,A
1811 C32B13 JP PUTVAL
1814 CDCA1C NEXTP: CALL PROPB ;POINT TO PROP VALUE
1817 3ABD21 LD A,(ARG2)
181A B7 OR A
181B CA3218 JP Z,NEXTP2 ;PROP0
181E CDE11C NEXTP1: CALL PROPN
1821 47 LD B,A
1822 3ABD21 LD A,(ARG2)
1825 B8 CP B
1826 CA3818 JP Z,NEXTP3 ;FOUND PROP
1829 D22713 JP NC,RET0 ;RETURN 0
182C CDEC1C CALL PROPNX
182F C31E18 JP NEXTP1 ;LOOP
1832 CDE11C NEXTP2: CALL PROPN
1835 C32813 JP PUTBYT
1838 CDEC1C NEXTP3: CALL PROPNX
183B C33218 JP NEXTP2 ;PROPN OF NEXT
183E CD151D ZADD: CALL GETARG
1841 19 ADD HL,DE
1842 C32B13 JP PUTVAL
1845 CD151D ZSUB: CALL GETARG
1848 7B LD A,E
1849 95 SUB L
184A 6F LD L,A
184B 7A LD A,D
184C 9C SBC A,H
184D 67 LD H,A
184E C32B13 JP PUTVAL
1851 CD151D MUL: CALL GETARG
1854 EB EX DE,HL
1855 CD781C CALL SIGNC ;CHECK SIGN
1858 E5 PUSH HL
1859 210200 LD HL,2
185C CD251D CALL HLGEDE
185F CA7818 JP Z,MUL2
1862 210400 LD HL,4
1865 CD251D CALL HLGEDE
1868 CA7518 JP Z,MUL4
186B E1 POP HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 56
186C CD1C1C CALL MULT ;DO THE MULTIPLY
186F CD851C MUL1: CALL SIGNS ;SET THE SIGN
1872 C32B13 JP PUTVAL ;THEN STORE RESULT
1875 E1 MUL4: POP HL
1876 29 ADD HL,HL
1877 E5 PUSH HL
1878 E1 MUL2: POP HL
1879 29 ADD HL,HL
187A C36F18 JP MUL1
187D CD151D DIV: CALL GETARG
1880 EB EX DE,HL
1881 CD781C CALL SIGNC ;CHECK SIGNS
1884 E5 PUSH HL
1885 210200 LD HL,2
1888 CD251D CALL HLGEDE
188B CA9E18 JP Z,DIV2 ;DIVIDE BY 2
188E 210400 LD HL,4
1891 CD251D CALL HLGEDE
1894 CAA518 JP Z,DIV4 ;DIVIDE BY 4
1897 E1 POP HL
1898 CD451C CALL DIVIDE ;DO THE DIVIDE
189B C36F18 JP MUL1 ;SET SIGN AND RETURN
189E E1 DIV2: POP HL
189F CDAC18 DIV2B: CALL DIV2A
18A2 C36F18 JP MUL1
18A5 E1 DIV4: POP HL
18A6 CDAC18 CALL DIV2A
18A9 C39F18 JP DIV2B
18AC B7 DIV2A: OR A ;CLEAR CARRY
18AD 7C LD A,H
18AE 1F RRA
18AF 67 LD H,A
18B0 7D LD A,L
18B1 1F RRA
18B2 6F LD L,A
18B3 C9 RET
18B4 CD151D ZMOD: CALL GETARG
18B7 EB EX DE,HL
18B8 CD781C CALL SIGNC ;MAKE THEM POSITIVE
18BB CD451C CALL DIVIDE ;DO THE DIVIDE
18BE EB EX DE,HL ;GET THE REMAINDER
18BF C32B13 JP PUTVAL
;
; *******************
; * X-OPS *
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 57
; *******************
;
18C2 2ABB21 EQUALQ: LD HL,(ARG1)
18C5 EB EX DE,HL
18C6 3AC321 LD A,(ARGCNT)
18C9 47 LD B,A
18CA 05 DEC B
18CB CC0602 CALL Z,ZER
18CE 2ABD21 LD HL,(ARG2)
18D1 CDE318 CALL EQUAQ1
18D4 2ABF21 LD HL,(ARG3)
18D7 CDE318 CALL EQUAQ1
18DA 2AC121 LD HL,(ARG4)
18DD CDE318 CALL EQUAQ1
18E0 CD0602 CALL ZER
18E3 CD251D EQUAQ1: CALL HLGEDE ;DO COMPARISON
18E6 E1 POP HL ;RESTORE RETURN ADDRESS
18E7 CA8013 JP Z,PREDS ;DON'T BOTHER RETURNING
18EA 05 DEC B ;ARG COUNT
18EB CA7113 JP Z,PREDF ;OUT OF ARGS, FAIL
18EE E9 JP (HL) ;ELSE RETURN
18EF 2ABB21 ZCALL: LD HL,(ARG1)
18F2 7C LD A,H
18F3 B5 OR L
18F4 CA2B13 JP Z,PUTVAL
18F7 2AAB21 LD HL,(OZSTKC)
18FA CD2C1D CALL PSHSTK
18FD 2AA921 LD HL,(OZSTKP)
1900 CD2C1D CALL PSHSTK
1903 2AA621 LD HL,(ZPCL)
1906 CD2C1D CALL PSHSTK ;SAVE OLD PC LOWER
1909 2AA521 LD HL,(ZPCH) ;SAVE HIGH IN L
190C E5 PUSH HL
190D AF XOR A
190E 32CE21 LD (ZPCFLG),A ;PC HAS CHANGED
1911 67 LD H,A
1912 3ABB21 LD A,(ARG1)
1915 6F LD L,A
1916 29 ADD HL,HL ;NEW ZPCL
1917 22A621 LD (ZPCL),HL
191A 3ABC21 LD A,(ARG1+1)
191D 32A521 LD (ZPCH),A ;NEW ZPCH
1920 CD5A1D CALL NEXTPC ;GET NUMBER OF LOCALS
1923 E1 POP HL
1924 47 LD B,A ;B HAS NUMBER OF LOCALS
1925 67 LD H,A
1926 E5 PUSH HL ;SAVE VALUE
1927 218721 LD HL,LOCALS ;STORE OLD LOCALS
192A B7 OR A
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 58
192B CA4C19 JP Z,ZCALL2 ;NO LOCALS
192E C5 ZCALL1: PUSH BC
192F 56 LD D,(HL)
1930 23 INC HL
1931 5E LD E,(HL)
1932 EB EX DE,HL
1933 CD2C1D CALL PSHSTK
1936 1B DEC DE
1937 D5 PUSH DE
1938 CD5A1D CALL NEXTPC ;GET NEW DEFAULT VALUE FOR LOCAL
193B 57 LD D,A
193C D5 PUSH DE
193D CD5A1D CALL NEXTPC ;WORD VALUE
1940 D1 POP DE
1941 5F LD E,A
1942 E1 POP HL ;POINTER TO STORE NEW LOCAL
1943 72 LD (HL),D
1944 23 INC HL
1945 73 LD (HL),E
1946 23 INC HL
1947 C1 POP BC
1948 05 DEC B
1949 C22E19 JP NZ,ZCALL1 ;LOOP THROUGH ALL LOCALS
194C 3AC321 ZCALL2: LD A,(ARGCNT) ;PASS ARGS
194F 47 LD B,A
1950 05 DEC B
1951 CA6819 JP Z,ZCALL4 ;NO ARGS TO PASS
1954 21BD21 LD HL,ARG2 ;POINTER TO FIRST ARG
1957 118721 LD DE,LOCALS
195A 7E ZCALL3: LD A,(HL)
195B 23 INC HL
195C 13 INC DE
195D 12 LD (DE),A
195E 1B DEC DE
195F 7E LD A,(HL)
1960 23 INC HL
1961 12 LD (DE),A
1962 13 INC DE
1963 13 INC DE
1964 05 DEC B
1965 C25A19 JP NZ,ZCALL3
1968 E1 ZCALL4: POP HL ;GET BACK ZPCH AND NUMBER OF LOCALS
1969 CD2C1D CALL PSHSTK
196C 3AA821 LD A,(ZSTAKC)
196F 32AB21 LD (OZSTKC),A
1972 2A070E LD HL,(ZSTAKP)
1975 22A921 LD (OZSTKP),HL ;FOR KNOWING WHERE TO RETURN
1978 C31012 JP MLOOP
197B 2ABD21 PUT: LD HL,(ARG2)
197E 29 ADD HL,HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 59
197F EB EX DE,HL
1980 2ABB21 LD HL,(ARG1)
1983 19 ADD HL,DE ;Z ADDRESS
1984 EB EX DE,HL
1985 2AD921 LD HL,(ZCODEP)
1988 19 ADD HL,DE ;REAL POINTER
1989 EB EX DE,HL
198A 2ABF21 LD HL,(ARG3) ;VALUE TO STORE
198D EB EX DE,HL
198E 72 LD (HL),D
198F 23 INC HL
1990 73 LD (HL),E
1991 C31012 JP MLOOP
1994 2ABD21 PUTB: LD HL,(ARG2)
1997 EB EX DE,HL
1998 2ABB21 LD HL,(ARG1)
199B 19 ADD HL,DE
199C EB EX DE,HL
199D 2AD921 LD HL,(ZCODEP)
19A0 19 ADD HL,DE
19A1 3ABF21 LD A,(ARG3)
19A4 77 LD (HL),A ;STORE ONE BYTE IN RANDOM TABLE
19A5 C31012 JP MLOOP
19A8 CDCA1C PUTP: CALL PROPB ;SET PROP
19AB CDE11C PUTP1: CALL PROPN ;GET PROP NUMBER
19AE 47 LD B,A
19AF 3ABD21 LD A,(ARG2)
19B2 B8 CP B
19B3 CABF19 JP Z,PUTP2 ;FOUND PROPERTY
19B6 D40602 CALL NC,ZER ;BAD PROP NUMBER
19B9 CDEC1C CALL PROPNX ;TRY NEXT
19BC C3AB19 JP PUTP1
19BF CDE51C PUTP2: CALL PROPL ;GET LENGTH
19C2 23 INC HL
19C3 EB EX DE,HL
19C4 2ABF21 LD HL,(ARG3)
19C7 3D DEC A
19C8 FAD519 JP M,PUTP2A ;STORE 1 BYTE
19CB C40602 CALL NZ,ZER ;TOO LONG
19CE EB EX DE,HL
19CF 72 LD (HL),D
19D0 23 INC HL
19D1 73 LD (HL),E
19D2 C31012 JP MLOOP ;RETURN
19D5 EB PUTP2A: EX DE,HL
19D6 73 LD (HL),E
19D7 C31012 JP MLOOP ;SET AND RETURN
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 60
19DA ZREAD:
19DA CDC105 CALL WHOLIN
19DD CDEE1B CALL RND ;RANDOMIZE
19E0 2AD921 LD HL,(ZCODEP) ;MAIN READ CODE
19E3 EB EX DE,HL ;GET REAL POINTERS TO TABLES
19E4 2ABB21 LD HL,(ARG1)
19E7 19 ADD HL,DE ;BUFFER TABLE
19E8 22BB21 LD (ARG1),HL
19EB 2ABD21 LD HL,(ARG2)
19EE 19 ADD HL,DE ;RESULT TABLE
19EF 22BD21 LD (ARG2),HL
19F2 CD5403 CALL READBF ;READ THE BUFFER
19F5 47 LD B,A ;CHARACTER COUNT IN B
19F6 0E00 LD C,0 ;C HAS CHARACTERS IN WORD
19F8 2ABD21 LD HL,(ARG2)
19FB 23 INC HL
19FC 3600 LD (HL),0 ;SET WORDS READ TO 0
19FE 23 INC HL
19FF 22E921 LD (RTABP),HL ;INITIALIZE RESULT TABLE POINTER
1A02 2ABB21 LD HL,(ARG1)
1A05 23 INC HL ;HL HAS POINTER TO INPUT CHARACTERS
1A06 E5 READL: PUSH HL
1A07 2ABD21 LD HL,(ARG2)
1A0A 7E LD A,(HL)
1A0B 23 INC HL
1A0C BE CP (HL)
1A0D E1 POP HL
1A0E CA1012 JP Z,MLOOP ;TOO MANY WORDS
;ERROR HERE IF DESIRED INSTEAD OF JZ
1A11 78 LD A,B
1A12 B1 OR C
1A13 CA1012 JP Z,MLOOP ;OUT OF CHARACTERS AND WORDS
1A16 79 LD A,C
1A17 FE06 CP 6
1A19 CC9F1A CALL Z,FLUSHW ;FLUSH CHARS IN A WORD OVER 6 CHARACTERS
1A1C 79 LD A,C
1A1D B7 OR A
1A1E C2511A JP NZ,READL2 ;NOT FIRST CHARACTER IN WORD
1A21 E5 PUSH HL
1A22 1606 LD D,6
1A24 21B021 LD HL,ZSTBUI ;INITIALIZE WORD BUFFER
1A27 3600 RD0PL: LD (HL),0
1A29 23 INC HL
1A2A 15 DEC D
1A2B C2271A JP NZ,RD0PL
1A2E E1 POP HL
1A2F 3ABB21 LD A,(ARG1)
1A32 57 LD D,A
1A33 7D LD A,L
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 61
1A34 92 SUB D ;POSITION OF START OF WORD
1A35 E5 PUSH HL
1A36 2AE921 LD HL,(RTABP)
1A39 23 INC HL
1A3A 23 INC HL
1A3B 23 INC HL
1A3C 77 LD (HL),A ;STORE IN RESULT TABLE
1A3D E1 POP HL
1A3E 7E LD A,(HL)
1A3F CDC61A CALL SIBRKQ ;SELF INSERTING BREAK?
1A42 DA6E1A JP C,RSIBRK
1A45 7E LD A,(HL)
1A46 CDAD1A CALL RBRKQ ;NORMAL BREAK?
1A49 D2511A JP NC,READL2 ;NO
1A4C 23 INC HL ;YES, FLUSH STRANDED BREAKS
1A4D 05 DEC B
1A4E C3061A JP READL ;LOOP BACK
1A51 78 READL2: LD A,B
1A52 B7 OR A
1A53 CA741A JP Z,READL3 ;OUT OF CHARACTERS, SIMULATE WORD ENDING
1A56 7E LD A,(HL)
1A57 CDAD1A CALL RBRKQ ;WORD BREAK?
1A5A DA741A JP C,READL3 ;FOUND A BREAK
1A5D 56 LD D,(HL)
1A5E E5 PUSH HL
1A5F 21B021 LD HL,ZSTBUI
1A62 79 LD A,C
1A63 CD081F CALL HLOFF
1A66 72 LD (HL),D ;STORE CHARACTER IN BUFFER
1A67 E1 POP HL
1A68 05 DEC B ;ONE LESS CHARACTER
1A69 0C INC C ;ONE MORE CHARACTER IN WORD
1A6A 23 INC HL ;POINT TO NEXT CHARACTER
1A6B C3061A JP READL
1A6E 32B021 RSIBRK: LD (ZSTBUI),A ;STORE SELF INSERTING BREAK
1A71 0C INC C ;1 CHAR
1A72 05 DEC B ;1 LESS CHAR
1A73 23 INC HL
1A74 79 READL3: LD A,C ;INSERT WORD IF ANY CHARACTERS IN WORD
1A75 B7 OR A
1A76 CA061A JP Z,READL ;NO CHARACTERS IN WORD
1A79 E5 PUSH HL
1A7A C5 PUSH BC
1A7B 2AE921 LD HL,(RTABP) ;STORE PARAMS IN TABLE
1A7E 23 INC HL
1A7F 23 INC HL
1A80 71 LD (HL),C ;REAL LENGTH OF WORD
1A81 CD9020 CALL CONZST ;CONVERT TO ZSTRING
1A84 CDED1A CALL FINDW ;LOOK UP WORD IN VOCAB TABLE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 62
1A87 2AE921 LD HL,(RTABP) ;STORE RESULT
1A8A 72 LD (HL),D
1A8B 23 INC HL
1A8C 73 LD (HL),E
1A8D 23 INC HL
1A8E 23 INC HL
1A8F 23 INC HL
1A90 22E921 LD (RTABP),HL ;POINTER TO NEXT WORD
1A93 2ABD21 LD HL,(ARG2)
1A96 23 INC HL
1A97 34 INC (HL) ;ONE MORE WORD
1A98 C1 POP BC
1A99 E1 POP HL
1A9A 0E00 LD C,0 ;ZERO CHARACTERS IN NEXT WORD
1A9C C3061A JP READL
1A9F 78 FLUSHW: LD A,B
1AA0 B7 OR A ;FLUSH CHARACTERS TILL BREAD OR END OF BUFFER
1AA1 C8 RET Z
1AA2 7E LD A,(HL)
1AA3 CDAD1A CALL RBRKQ
1AA6 D8 RET C ;FOUND A BREAK
1AA7 23 INC HL
1AA8 05 DEC B
1AA9 0C INC C
1AAA C39F1A JP FLUSHW
1AAD CDC61A RBRKQ: CALL SIBRKQ ;FIRST CHECK SELF INSERTING BREAKS
1AB0 D8 RET C ;YES
1AB1 E5 PUSH HL
1AB2 21E31A LD HL,BRKTBL
1AB5 160A LD D,NBRKS
1AB7 BE RBRK1: CP (HL)
1AB8 CAC31A JP Z,FBRK ;MATCH
1ABB 23 INC HL
1ABC 15 DEC D
1ABD C2B71A JP NZ,RBRK1
1AC0 E1 RBRK2: POP HL ;NOT FOUND
1AC1 B7 OR A ;CLEAR CARRY
1AC2 C9 RET
1AC3 E1 FBRK: POP HL
1AC4 37 SCF
1AC5 C9 RET ;FOUND A BREAK, SET CARRY AND RETURN
1AC6 E5 SIBRKQ: PUSH HL
1AC7 CDD41A CALL GETVOC
1ACA 56 LD D,(HL) ;NUMBER OF SELF INSERTING BREAKS
1ACB 15 DEC D
1ACC 14 INC D
1ACD CAC01A JP Z,RBRK2 ;FAIL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 63
1AD0 23 INC HL
1AD1 C3B71A JP RBRK1
1AD4 2AD921 GETVOC: LD HL,(ZCODEP)
1AD7 110800 LD DE,ZVOCAB
1ADA 19 ADD HL,DE
1ADB 56 LD D,(HL)
1ADC 23 INC HL
1ADD 5E LD E,(HL)
1ADE 2AD921 LD HL,(ZCODEP)
1AE1 19 ADD HL,DE
1AE2 C9 RET
1AE3 202E2C3F BRKTBL: DB ' .,?'
1AE7 0D0A090C DB 0DH,0AH,9H,0CH
1AEB 2222 DB 22H,22H
000A NBRKS EQU $-BRKTBL
1AED CDD41A FINDW: CALL GETVOC ;FIND WORD IN VOCAB TABLE, ASSUMES VOCAB IN MEMORY
1AF0 7E LD A,(HL)
1AF1 23 INC HL
1AF2 CD081F CALL HLOFF ;SKIP OVER SELF INSERTING BREAKS
1AF5 7E LD A,(HL)
1AF6 87 ADD A,A
1AF7 87 ADD A,A
1AF8 87 ADD A,A
1AF9 87 ADD A,A
1AFA 4F LD C,A ;C HAS 16 TIMES VOCAB ENTRY SIZE
1AFB 23 INC HL
1AFC 56 LD D,(HL)
1AFD 23 INC HL
1AFE 5E LD E,(HL)
1AFF 23 INC HL ;HL POINTS TO VOCAB TABLE
1B00 3AE421 LD A,(ZSTBUO+1) ;GET FIRST CHARACTER
1B03 47 LD B,A ;PUT IT IN B
1B04 C3101B JP FWL2 ;WE CAN'T START AT THE BEGINNING
1B07 B2 FWL1A: OR D ;HERE ON 16 WORD BOUNDRY
1B08 CA251B JP Z,FWL3 ;END OF TABLE
1B0B 7E FWL1: LD A,(HL)
1B0C B8 CP B ;CHECK ONLY FIRST BYTE
1B0D D2251B JP NC,FWL3 ;FOUND PROPER AREA FOR FINE SEARCH
1B10 7D FWL2: LD A,L
1B11 81 ADD A,C
1B12 6F LD L,A
1B13 7C LD A,H
1B14 CE00 ADC A,0
1B16 67 LD H,A ;POINTER TO NEXT BLOCK (HLOFF NOT USED FOR SPEED)
1B17 7B LD A,E
1B18 D610 SUB 16 ;16 MORE WORDS
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 64
1B1A 5F LD E,A
1B1B CA071B JP Z,FWL1A
1B1E D20B1B JP NC,FWL1
1B21 15 DEC D
1B22 F20B1B JP P,FWL1 ;NOT OUT OF WORDS
1B25 7D FWL3: LD A,L ;NOW DO FINE CHECK
1B26 91 SUB C ;BACKUP 16 WORDS
1B27 6F LD L,A
1B28 7C LD A,H
1B29 DE00 SBC A,0
1B2B 67 LD H,A
1B2C 7B LD A,E
1B2D C610 ADD A,16
1B2F 5F LD E,A
1B30 7A LD A,D
1B31 CE00 ADC A,0
1B33 57 LD D,A ;BACKUP COUNT
1B34 79 LD A,C
1B35 0F RRCA
1B36 0F RRCA
1B37 0F RRCA
1B38 0F RRCA
1B39 4F LD C,A ;REAL ENTRY SIZE
1B3A FWL4:
1B3A 3AE421 LD A,(ZSTBUO+1)
1B3D BE CP (HL)
1B3E DA721B JP C,FWFAIL
1B41 C2681B JP NZ,FWL4A ;CHECK ALL 4 BYTES
1B44 23 INC HL
1B45 3AE321 LD A,(ZSTBUO)
1B48 BE CP (HL)
1B49 DA721B JP C,FWFAIL
1B4C C2671B JP NZ,FWL4B
1B4F 23 INC HL
1B50 3AE621 LD A,(ZSTBUO+3)
1B53 BE CP (HL)
1B54 DA721B JP C,FWFAIL
1B57 C2661B JP NZ,FWL4C
1B5A 23 INC HL
1B5B 3AE521 LD A,(ZSTBUO+2)
1B5E BE CP (HL)
1B5F DA721B JP C,FWFAIL
1B62 CA761B JP Z,FWSUCC ;MATCH
1B65 2B DEC HL
1B66 2B FWL4C: DEC HL
1B67 2B FWL4B: DEC HL
1B68 79 FWL4A: LD A,C
1B69 CD081F CALL HLOFF
1B6C 1B DEC DE
1B6D 7A LD A,D
1B6E B3 OR E
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 65
1B6F C23A1B JP NZ,FWL4 ;NOT OUT OF WORDS YET
1B72 110000 FWFAIL: LD DE,0
1B75 C9 RET
1B76 2B FWSUCC: DEC HL
1B77 2B DEC HL
1B78 2B DEC HL
1B79 EB EX DE,HL
1B7A 2AD921 LD HL,(ZCODEP)
1B7D 7B LD A,E
1B7E 95 SUB L
1B7F 5F LD E,A
1B80 7A LD A,D
1B81 9C SBC A,H
1B82 57 LD D,A
1B83 C9 RET
1B84 3ABB21 PRINTC: LD A,(ARG1)
1B87 4F LD C,A
1B88 CDB604 CALL COUT
1B8B C31012 JP MLOOP
1B8E 2ABB21 PRINTN: LD HL,(ARG1)
1B91 CD971B CALL PRNTNC
1B94 C31012 JP MLOOP
1B97 7C PRNTNC: LD A,H
1B98 B7 OR A
1B99 FCC51B CALL M,PRNTNG ;NEGATIVE NUMBER
1B9C 0600 LD B,0 ;DIGIT COUNT
1B9E 7C PRNTN1: LD A,H
1B9F B5 OR L
1BA0 CAAE1B JP Z,PRNTN3
1BA3 110A00 LD DE,10
1BA6 CD451C CALL DIVIDE
1BA9 D5 PUSH DE
1BAA 04 INC B
1BAB C39E1B JP PRNTN1
1BAE AF PRNTN3: XOR A
1BAF 80 ADD A,B
1BB0 CAC01B JP Z,PRNTN6 ;PRINT AT LEAST 0
1BB3 D1 PRNTN4: POP DE
1BB4 3E30 LD A,'0'
1BB6 83 ADD A,E
1BB7 4F LD C,A
1BB8 CDB604 CALL COUT
1BBB 05 DEC B
1BBC C2B31B JP NZ,PRNTN4
1BBF C9 RET
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 66
1BC0 0E30 PRNTN6: LD C,'0'
1BC2 C3B604 JP COUT
1BC5 0E2D PRNTNG: LD C,'-' ;PRINT -
1BC7 CDB604 CALL COUT
1BCA C38B1C JP SIGNCN ;CHANGE SIGN
1BCD 2ABB21 RANDOM: LD HL,(ARG1) ;RANDOM GENERATOR
1BD0 EB EX DE,HL
1BD1 CDEE1B CALL RND ;GET THE BASE NUMBER
1BD4 CD451C CALL DIVIDE
1BD7 EB EX DE,HL ;GET REMAINDER
1BD8 23 INC HL ;MAKE NOT EQUAL TO 0
1BD9 C32B13 JP PUTVAL
1BDC 2ABB21 ZPUSH: LD HL,(ARG1)
1BDF CD2C1D CALL PSHSTK
1BE2 C31012 JP MLOOP
1BE5 CD451D ZPOP: CALL POPSTK
1BE8 3ABB21 LD A,(ARG1)
1BEB C34B17 JP VARPTR
;
; **********************************************************************
; * *
; * ZORK - RANDOM ROUTINES *
; * *
; **********************************************************************
;
1BEE C5 RND: PUSH BC
1BEF 0E02 LD C,2 ;2 TIMES THROUGH LOOP
1BF1 0608 RND2: LD B,8
1BF3 21AC21 LD HL,SHIFT
1BF6 7E LD A,(HL)
1BF7 07 RND1: RLCA
1BF8 07 RLCA
1BF9 07 RLCA
1BFA AE XOR (HL)
1BFB 17 RLA
1BFC 17 RLA
1BFD 21AC21 LD HL,SHIFT
1C00 7E LD A,(HL)
1C01 17 RLA
1C02 77 LD (HL),A
1C03 23 INC HL
1C04 7E LD A,(HL)
1C05 17 RLA
1C06 77 LD (HL),A
1C07 23 INC HL
1C08 7E LD A,(HL)
1C09 17 RLA
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 67
1C0A 77 LD (HL),A
1C0B 23 INC HL
1C0C 7E LD A,(HL)
1C0D 17 RLA
1C0E 77 LD (HL),A
1C0F 05 DEC B
1C10 C2F71B JP NZ,RND1
1C13 0D DEC C
1C14 C2F11B JP NZ,RND2
1C17 C1 POP BC
1C18 2AAE21 LD HL,(SHIFT+2) ;GET THE NUMBER
1C1B C9 RET
1C1C C5 MULT: PUSH BC ;DEHL <=DE*HL
1C1D 010000 LD BC,0
1C20 3E10 LD A,16 ;LOOP COUNTER
1C22 F5 MULT1: PUSH AF
1C23 7B LD A,E
1C24 E601 AND 1 ;CHECK BIT FOR ADD
1C26 CA2E1C JP Z,MULT2 ;SKIP ADD PART IF 0
1C29 E5 PUSH HL ;SAVE MULTIPLIER
1C2A 09 ADD HL,BC ;ADD PART
1C2B 44 LD B,H
1C2C 4D LD C,L
1C2D E1 POP HL ;RESTORE H
1C2E 78 MULT2: LD A,B ;32 BIT SHIFT REMEMBERING CARRY
1C2F 1F RRA
1C30 47 LD B,A
1C31 79 LD A,C
1C32 1F RRA
1C33 4F LD C,A
1C34 7A LD A,D
1C35 1F RRA
1C36 57 LD D,A
1C37 7B LD A,E
1C38 1F RRA
1C39 5F LD E,A
1C3A F1 POP AF ;GET BACK LOOP COUNT
1C3B 3D DEC A
1C3C C2221C JP NZ,MULT1
1C3F 62 LD H,D ;PUT LOW ORDER ANSWER IN HL
1C40 6B LD L,E
1C41 50 LD D,B ;HIGH PART IN DE
1C42 59 LD E,C
1C43 C1 POP BC
1C44 C9 RET
1C45 C5 DIVIDE: PUSH BC ;HL<=HL/DE, REMAINDER IN DE
1C46 44 LD B,H
1C47 4D LD C,L
1C48 7A LD A,D ;NEGATE DIVISOR
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 68
1C49 2F CPL
1C4A 57 LD D,A
1C4B 7B LD A,E
1C4C 2F CPL
1C4D 5F LD E,A
1C4E 13 INC DE ;FOR TWO'S COMPLEMENT
1C4F 210000 LD HL,0 ;INITIAL VALUE FOR REMAINDER
1C52 3E11 LD A,17 ;INIT LOOP COUNTER
1C54 E5 DDIV0: PUSH HL ;SAVE REMAINDER
1C55 19 ADD HL,DE ;SUB DIVIS
1C56 D25A1C JP NC,DDIV1 ;UNDERFLOW, RESTORE HL
1C59 E3 EX (SP),HL
1C5A E1 DDIV1: POP HL
1C5B F5 PUSH AF ;SAVE LOOP COUNTER
1C5C 79 LD A,C ;4 REG SHIFT LEFT
1C5D 17 RLA ;WITH CARRY
1C5E 4F LD C,A ;CY->C->B->L->H
1C5F 78 LD A,B
1C60 17 RLA
1C61 47 LD B,A
1C62 7D LD A,L
1C63 17 RLA
1C64 6F LD L,A
1C65 7C LD A,H
1C66 17 RLA
1C67 67 LD H,A
1C68 F1 POP AF ;RESTORE LOOP COUNTER
1C69 3D DEC A ;DECREMENT IT
1C6A C2541C JP NZ,DDIV0 ;KEEP LOOPING
;CLEANUP, SHIFT REMAINDER RIGHT AND RETURN IN DE
1C6D B7 OR A
1C6E 7C LD A,H
1C6F 1F RRA
1C70 57 LD D,A
1C71 7D LD A,L
1C72 1F RRA
1C73 5F LD E,A
1C74 60 LD H,B
1C75 69 LD L,C
1C76 C1 POP BC
1C77 C9 RET
1C78 AF SIGNC: XOR A
1C79 32BA21 LD (SIGNF),A ;SET SIGNF
1C7C CD931C CALL SIGNPC ;POS CHECK
1C7F EB EX DE,HL
1C80 CD931C CALL SIGNPC
1C83 EB EX DE,HL
1C84 C9 RET
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 69
1C85 3ABA21 SIGNS: LD A,(SIGNF) ;CHECK FOR SIGN
1C88 E601 AND 1 ;EVEN OR ODD
1C8A C8 RET Z ;EVEN NUMBER OF NEGATIVES, ANSWER OK
1C8B AF SIGNCN: XOR A ;CHANGE SIGN
1C8C 95 SUB L
1C8D 6F LD L,A
1C8E 3E00 LD A,0
1C90 9C SBC A,H
1C91 67 LD H,A ;INVERTED HL
1C92 C9 RET
1C93 7C SIGNPC: LD A,H
1C94 B7 OR A
1C95 F0 RET P ;POSITIVE
1C96 3ABA21 LD A,(SIGNF)
1C99 3C INC A
1C9A 32BA21 LD (SIGNF),A
1C9D C38B1C JP SIGNCN ;CHANGE SIGN
1CA0 3ABB21 FLAGSU: LD A,(ARG1) ;SETUP FOR FLAG ROUTINES
1CA3 CDF41C CALL OBJLOC ;BC WILL HAVE BIT POSITION, DE FLAG VALUE
1CA6 3ABD21 LD A,(ARG2) ;HL WILL GET OBJ POINTER
1CA9 FE10 CP 16
1CAB DAB21C JP C,FLGSU1 ;NEXT WORD
1CAE D610 SUB 16 ;SECOND SET OF FLAGS
1CB0 23 INC HL
1CB1 23 INC HL
1CB2 E5 FLGSU1: PUSH HL
1CB3 47 LD B,A
1CB4 3E0F LD A,15
1CB6 90 SUB B
1CB7 210100 LD HL,1
1CBA CAC21C FLGSU2: JP Z,FLGSU3 ;BIT IN POSITION
1CBD 29 ADD HL,HL
1CBE 3D DEC A
1CBF C3BA1C JP FLGSU2
1CC2 44 FLGSU3: LD B,H
1CC3 4D LD C,L
1CC4 E1 POP HL
1CC5 56 LD D,(HL)
1CC6 23 INC HL
1CC7 5E LD E,(HL)
1CC8 2B DEC HL
1CC9 C9 RET
1CCA 3ABB21 PROPB: LD A,(ARG1) ;BEG OF PROPERTY PART OF OBJECT
1CCD CDF41C CALL OBJLOC
1CD0 110700 LD DE,7
1CD3 19 ADD HL,DE
1CD4 56 LD D,(HL)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 70
1CD5 23 INC HL
1CD6 5E LD E,(HL)
1CD7 2AD921 LD HL,(ZCODEP)
1CDA 19 ADD HL,DE
1CDB 7E LD A,(HL) ;LENGTH OF DESCRIPTION
1CDC 87 ADD A,A ;*2
1CDD 3C INC A ;+1
1CDE C3081F JP HLOFF ;INDEX AND RETURN
1CE1 7E PROPN: LD A,(HL) ;HL HAS REAL PROP POINTER
1CE2 E61F AND 1FH
1CE4 C9 RET
1CE5 7E PROPL: LD A,(HL) ;PROP LENGTH, HL HAS REAL PROP POINTER
1CE6 07 RLCA
1CE7 07 RLCA
1CE8 07 RLCA
1CE9 E607 AND 7
1CEB C9 RET
1CEC CDE51C PROPNX: CALL PROPL
1CEF C602 ADD A,2
1CF1 C3081F JP HLOFF ;NEXT PROP POINTER
1CF4 D5 OBJLOC: PUSH DE ;GET OBJECT LOCATION, A HAS OBJECT NUMBER
1CF5 6F LD L,A
1CF6 2600 LD H,0
1CF8 54 LD D,H
1CF9 5D LD E,L
1CFA 29 ADD HL,HL
1CFB 29 ADD HL,HL
1CFC 29 ADD HL,HL
1CFD 19 ADD HL,DE
1CFE 113500 LD DE,53
1D01 19 ADD HL,DE ;9*NUMBER + 53
1D02 E5 PUSH HL ;OBJECT OFFSET
1D03 2AD921 LD HL,(ZCODEP)
1D06 110A00 LD DE,ZOBJEC
1D09 19 ADD HL,DE
1D0A 56 LD D,(HL)
1D0B 23 INC HL
1D0C 5E LD E,(HL)
1D0D 2AD921 LD HL,(ZCODEP)
1D10 19 ADD HL,DE
1D11 D1 POP DE
1D12 19 ADD HL,DE ;REAL ADDRESS
1D13 D1 POP DE
1D14 C9 RET
1D15 2ABB21 GETARG: LD HL,(ARG1)
1D18 EB EX DE,HL
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 71
1D19 2ABD21 LD HL,(ARG2) ;GET BOTH ARGS
1D1C C9 RET
1D1D 7A SHLGED: LD A,D
1D1E AC XOR H
1D1F F2251D JP P,HLGEDE ;BOTH OF SAME SIGN
1D22 7C LD A,H
1D23 BA CP D ;CARRY WILL BE SET IF D NEG AND THUS LESS THAN H
1D24 C9 RET
1D25 7A HLGEDE: LD A,D ;RETURN WITH CARRY SET IF HL>=DE
1D26 BC CP H
1D27 C0 RET NZ
1D28 7D LD A,L
1D29 BB CP E
1D2A 3F CCF
1D2B C9 RET
1D2C D5 PSHSTK: PUSH DE
1D2D EB EX DE,HL ;PUSH STACK
1D2E 2A070E LD HL,(ZSTAKP) ;STACK POINTER
1D31 2B DEC HL
1D32 73 LD (HL),E
1D33 2B DEC HL
1D34 72 LD (HL),D
1D35 22070E LD (ZSTAKP),HL ;SAVE POINTER
1D38 21A821 LD HL,ZSTAKC ;COUNT
1D3B 34 INC (HL)
1D3C 7E LD A,(HL)
1D3D FEE0 CP ZSTAKL
1D3F CC0602 CALL Z,ZER
1D42 EB EX DE,HL
1D43 D1 POP DE
1D44 C9 RET
; ---------
; POP STACK
; ---------
; POP WORD OFF Z-STACK AND RETURN IT IN HL
1D45 D5 POPSTK: PUSH DE ;SAVE DE
1D46 2A070E LD HL,(ZSTAKP) ;HL <= Z-STACK POINTER
1D49 56 LD D,(HL) ;GET MSB OF WORD
1D4A 23 INC HL
1D4B 5E LD E,(HL) ;GET LSB OF WORD
1D4C 23 INC HL
1D4D 22070E LD (ZSTAKP),HL ;SAVE NEW Z-STACK POINTER
1D50 21A821 LD HL,ZSTAKC ;CHECK COUNT
1D53 35 DEC (HL)
1D54 CC0602 CALL Z,ZER ;OVER POP ERROR
1D57 EB EX DE,HL ;VALUE IN HL
1D58 D1 POP DE ;RESTORE DE
1D59 C9 RET
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 72
;
; **********************************************************************
; * *
; * ZORK - PAGING ROUTINES *
; * *
; **********************************************************************
;
1D5A 3ACE21 NEXTPC: LD A,(ZPCFLG) ;HAS PAGE MOVED?
1D5D B7 OR A
1D5E CA871D JP Z,NXTPC1 ;PAGE HAS MOVED
1D61 2ACC21 LD HL,(ZPCPNT)
1D64 46 LD B,(HL) ;GET VALUE IN B
1D65 23 INC HL
1D66 22CC21 LD (ZPCPNT),HL ;STORE BACK POINTER
1D69 2AA621 LD HL,(ZPCL)
1D6C 2C INC L
1D6D 22A621 LD (ZPCL),HL ;ASSUME OK AT FIRST
1D70 78 LD A,B
1D71 C0 RET NZ ;OK IF L NOT ZERO
1D72 7C LD A,H ;CROSSED 256 BYTE BOUNDRY
1D73 24 INC H
1D74 22A621 LD (ZPCL),HL ;AGAIN ASSUME NOT PASSED 256 BOUNTRY
1D77 B7 OR A
1D78 78 LD A,B
1D79 C8 RET Z ;DID NOT CROSS 512 BOUNDRY
1D7A AF XOR A
1D7B 32A721 LD (ZPCL+1),A ;0 ZPCL
1D7E 32CE21 LD (ZPCFLG),A ;BAD DATA IN PCPNT, WILL HAVE TO FETCH NEW BLOCK
1D81 21A521 LD HL,ZPCH ;INCREMENT ZPC HIGH
1D84 34 INC (HL)
1D85 78 LD A,B
1D86 C9 RET ;RETURN, TROUBLE NEXT TIME
1D87 3AA521 NXTPC1: LD A,(ZPCH) ;GET ZPAGE NUMBER
1D8A 21B921 LD HL,ZMEMT ;TOP OF LOW MEM
1D8D BE CP (HL)
1D8E 2AD921 LD HL,(ZCODEP) ;PRELOAD PORTION
1D91 DAA61D JP C,NXTPCL
1D94 CD0F1F CALL FNDPGE
1D97 32CF21 LD (ZPCPG),A ;STORE PAGE
1D9A DAB91D JP C,NXTPC2 ;COULD NOT FIND PAGE, SWAP IT IN (OH WHAT A SHAME)
1D9D CDC91E NXTPC3: CALL SPLICE ;PUT AT TOP OF LIST
1DA0 3ACF21 LD A,(ZPCPG) ;SET UP POINTER TO PAGE
1DA3 2AD721 LD HL,(PGBUFP) ;POINTER TO BEGINNING OF PAGE BUFFERS
1DA6 NXTPCL:
1DA6 87 ADD A,A
1DA7 84 ADD A,H
1DA8 67 LD H,A
1DA9 EB EX DE,HL ;DE NOW HAS POINTER TO BEG OF BUFFER
1DAA 2AA621 LD HL,(ZPCL)
1DAD 19 ADD HL,DE ;ADD IN OFFSET
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 73
1DAE 22CC21 LD (ZPCPNT),HL ;ZPCPNT NOW VALID
1DB1 3EFF LD A,0FFH
1DB3 32CE21 LD (ZPCFLG),A
1DB6 C35A1D JP NEXTPC ;TRY AGAIN, THIS TIME IT WILL NOT FAIL
1DB9 21D621 NXTPC2: LD HL,MPCPG ;CHECK IF DISTROYING MPC
1DBC BE CP (HL)
1DBD C2C61D JP NZ,NXTPC4 ;NOT DISTROYING PAGE
1DC0 47 LD B,A
1DC1 AF XOR A
1DC2 32D521 LD (MPCFLG),A
1DC5 78 LD A,B
1DC6 2AD721 NXTPC4: LD HL,(PGBUFP)
1DC9 87 ADD A,A
1DCA 84 ADD A,H
1DCB 67 LD H,A ;POINTER TO BEGINNING OF BUFFER
1DCC 3AA521 LD A,(ZPCH)
1DCF CDF702 CALL GETDSK
1DD2 3ACF21 LD A,(ZPCPG)
1DD5 47 LD B,A
1DD6 21C90F LD HL,PGTBL
1DD9 CD081F CALL HLOFF
1DDC 3AA521 LD A,(ZPCH)
1DDF 77 LD (HL),A ;SET PAGE TABLE ENTRY
1DE0 78 LD A,B
1DE1 C39D1D JP NXTPC3 ;PAGE NOW IN MEMORY
1DE4 7C SETWRD: LD A,H
1DE5 B7 OR A
1DE6 1F RRA
1DE7 32D021 LD (MPCH),A
1DEA 7C SETWR1: LD A,H
1DEB E601 AND 1
1DED 67 LD H,A
1DEE 22D121 LD (MPCL),HL
1DF1 AF XOR A
1DF2 32D521 LD (MPCFLG),A
1DF5 C9 RET
1DF6 7C SETSTR: LD A,H
1DF7 32D021 LD (MPCH),A
1DFA 29 ADD HL,HL
1DFB C3EA1D JP SETWR1
1DFE AF GETFRE: XOR A
1DFF 32D521 LD (MPCFLG),A ;NO MEM PAGE LEFT
1E02 3ADD21 LD A,(PGBOT)
1E05 32D621 LD (MPCPG),A
1E08 CD961E CALL CKZPCP
1E0B CDC91E CALL SPLICE
1E0E 3AD621 LD A,(MPCPG)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 74
1E11 47 LD B,A
1E12 2AD721 LD HL,(PGBUFP)
1E15 87 ADD A,A
1E16 84 ADD A,H
1E17 67 LD H,A
1E18 22D321 LD (MPCPNT),HL
1E1B 78 LD A,B
1E1C 21C90F LD HL,PGTBL
1E1F CD081F CALL HLOFF
1E22 3600 LD (HL),0
1E24 C9 RET
1E25 CD301E GETWRD: CALL GETBYT
1E28 F5 PUSH AF
1E29 CD301E CALL GETBYT ;GET A FULL WORD
1E2C 6F LD L,A
1E2D F1 POP AF
1E2E 67 LD H,A
1E2F C9 RET
1E30 3AD521 GETBYT: LD A,(MPCFLG) ;HAS PAGE MOVED?
1E33 B7 OR A
1E34 CA5D1E JP Z,GETBT1 ;PAGE HAS MOVED
1E37 2AD321 LD HL,(MPCPNT)
1E3A 46 LD B,(HL) ;GET VALUE IN B
1E3B 23 INC HL
1E3C 22D321 LD (MPCPNT),HL ;STORE BACK POINTER
1E3F 2AD121 LD HL,(MPCL)
1E42 2C INC L
1E43 22D121 LD (MPCL),HL ;ASSUME OK AT FIRST
1E46 78 LD A,B
1E47 C0 RET NZ ;OK IF L NOT ZERO
1E48 7C LD A,H ;CROSSED 256 BYTE BOUNDRY
1E49 24 INC H
1E4A 22D121 LD (MPCL),HL ;AGAIN ASSUME NOT PASSED 256 BOUNTRY
1E4D B7 OR A
1E4E 78 LD A,B
1E4F C8 RET Z ;DID NOT CROSS 512 BOUNDRY
1E50 AF XOR A
1E51 32D221 LD (MPCL+1),A ;0 MPCL
1E54 32D521 LD (MPCFLG),A ;BAD DATA IN PCPNT, WILL HAVE TO FETCH NEW BLOCK
1E57 21D021 LD HL,MPCH ;INCREMENT ZPC HIGH
1E5A 34 INC (HL)
1E5B 78 LD A,B
1E5C C9 RET ;RETURN, TROUBLE NEXT TIME
1E5D 3AB821 GETBT1: LD A,(VERF)
1E60 B7 OR A
1E61 C2A21E JP NZ,GETB1A ;IN VERIFY MODE
1E64 3AD021 LD A,(MPCH) ;GET MPAGE NUMBER
1E67 21B921 LD HL,ZMEMT ;TOP OF LOW MEM
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 75
1E6A BE CP (HL)
1E6B 2AD921 LD HL,(ZCODEP) ;PRELOAD PORTION
1E6E DA831E JP C,GETBTL
1E71 CD0F1F CALL FNDPGE
1E74 32D621 LD (MPCPG),A ;STORE PAGE
1E77 DAA81E JP C,GETBT2 ;COULD NOT FIND PAGE, SWAP IT IN (OH WHAT A SHAME)
1E7A CDC91E GETBT3: CALL SPLICE ;PUT AT TOP OF LIST
1E7D 3AD621 LD A,(MPCPG) ;SET UP POINTER TO PAGE
1E80 2AD721 LD HL,(PGBUFP) ;POINTER TO BEGINNING OF PAGE BUFFERS
1E83 GETBTL:
1E83 87 ADD A,A
1E84 84 ADD A,H
1E85 67 LD H,A
1E86 EB EX DE,HL
1E87 2AD121 LD HL,(MPCL)
1E8A 19 ADD HL,DE
1E8B 22D321 LD (MPCPNT),HL
1E8E 3EFF LD A,0FFH
1E90 32D521 LD (MPCFLG),A
1E93 C3301E JP GETBYT ;TRY AGAIN, THIS TIME IT WILL NOT FAIL
1E96 21CF21 CKZPCP: LD HL,ZPCPG ;CHECK IF DISTROYING ZPC
1E99 BE CP (HL)
1E9A C0 RET NZ ;NOT DISTROYING PAGE
1E9B 47 LD B,A
1E9C AF XOR A
1E9D 32CE21 LD (ZPCFLG),A
1EA0 78 LD A,B
1EA1 C9 RET
1EA2 3ADD21 GETB1A: LD A,(PGBOT)
1EA5 32D621 LD (MPCPG),A ;NEW PAGE
1EA8 CD961E GETBT2: CALL CKZPCP
1EAB 2AD721 LD HL,(PGBUFP)
1EAE 87 ADD A,A
1EAF 84 ADD A,H
1EB0 67 LD H,A ;POINTER TO BEGINNING OF BUFFER
1EB1 3AD021 LD A,(MPCH)
1EB4 CDF702 CALL GETDSK
1EB7 3AD621 LD A,(MPCPG)
1EBA 47 LD B,A
1EBB 21C90F LD HL,PGTBL
1EBE CD081F CALL HLOFF
1EC1 3AD021 LD A,(MPCH)
1EC4 77 LD (HL),A ;SET PAGE TABLE ENTRY
1EC5 78 LD A,B
1EC6 C37A1E JP GETBT3 ;PAGE NOW IN MEMORY
1EC9 4F SPLICE: LD C,A ;SPLICE PAGE IN A TO TOP OF LIST
1ECA 3ADC21 LD A,(PGTOP) ;GET OLD TOP
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 76
1ECD B9 CP C
1ECE C8 RET Z ;SAME TOP AS LAST
1ECF 47 LD B,A
1ED0 79 LD A,C
1ED1 32DC21 LD (PGTOP),A ;NEW TOP
1ED4 210910 LD HL,PGTBLF
1ED7 CD081F CALL HLOFF
1EDA 5E LD E,(HL) ;E HAS OLD FORWARD POINTER
1EDB 70 LD (HL),B ;NEW FORWARD TO OLD TOP
1EDC 214910 LD HL,PGTBLB
1EDF 79 LD A,C
1EE0 CD081F CALL HLOFF
1EE3 56 LD D,(HL) ;D GETS OLD BACK POINTER
1EE4 36FF LD (HL),0FFH ;TOP HAS NO BACK
1EE6 7A LD A,D
1EE7 210910 LD HL,PGTBLF
1EEA CD081F CALL HLOFF
1EED 73 LD (HL),E ;PATCH FORWARD POINTER
1EEE 78 LD A,B
1EEF 214910 LD HL,PGTBLB
1EF2 CD081F CALL HLOFF
1EF5 71 LD (HL),C
1EF6 7B LD A,E
1EF7 3C INC A
1EF8 CA031F JP Z,SPLIC1 ;WAS LAST BLOCK WITHOUT FORWARD POINTER
1EFB 214810 LD HL,PGTBLB-1 ;OFFSET INC A
1EFE CD081F CALL HLOFF
1F01 72 LD (HL),D ;SPLICE BACK POINTER
1F02 C9 RET
1F03 7A SPLIC1: LD A,D
1F04 32DD21 LD (PGBOT),A ;NEW BOTTOM OF LIST
1F07 C9 RET
1F08 HLOFF:
1F08 85 ADD A,L ;INDIRECT HL THROUGH A
1F09 6F LD L,A
1F0A 3E00 LD A,0
1F0C 8C ADC A,H
1F0D 67 LD H,A
1F0E C9 RET
1F0F 21DB21 FNDPGE: LD HL,NPGS ;FIND PAGE IN A, RETURN WITH CARRY
1F12 ;SET IF NOT FOUND. A WILL HAVE FOUND PAGE OR
1F12 ;BOTTOM OF PAGE LIST
1F12 46 LD B,(HL)
1F13 0E00 LD C,0
1F15 21C90F LD HL,PGTBL
1F18 BE FNDPGL: CP (HL)
1F19 CA271F JP Z,FNDPG1 ;SUCCESS
1F1C 0C INC C
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 77
1F1D 23 INC HL
1F1E 05 DEC B
1F1F C2181F JP NZ,FNDPGL
1F22 3ADD21 LD A,(PGBOT) ;NOT FOUND
1F25 37 SCF ;SET CARRY AND RETURN BOTTOM
1F26 C9 RET
1F27 79 FNDPG1: LD A,C
1F28 C9 RET ;CARRY WILL BE CLEARED
;
; **********************************************************************
; * *
; * ZORK - STRING ROUTINES *
; * *
; **********************************************************************
;
; ---------------
; PRINT Z-STRING
; ---------------
1F29 AF PZSTR: XOR A ;PRINT ZSTRING POINTED TO BY MPC (NOT REENTRENT)
1F2A 32DF21 LD (CSPERM),A ;PERMANENT CHARSET
1F2D 32E021 LD (STBYTF),A ;RESET STRING BYTE FLAG
1F30 3D DEC A
1F31 32DE21 LD (CSTEMP),A ;NO TEMP CHARSET IN EFFECT
1F34 CD4F20 PZSTRL: CALL GETZCH ;GET A Z-CHARACTER
1F37 D8 RET C ;END OF STRING IF CARRY SET
1F38 47 LD B,A
1F39 B7 OR A
1F3A CAEF1F JP Z,PZSTRS ;0=SPACE
1F3D FE04 CP 4 ;IS THIS AN F-WORD?
1F3F DA8E1F JP C,PZFWRD ; YES.
1F42 FE06 CP 6 ;IS IT A SHIFT CHAR?
1F44 DA0720 JP C,PZSTRP ; YES. CHANGE CHAR SET
1F47 CD3E20 CALL GETMOD
1F4A B7 OR A ;IS IT CHARSET 0?
1F4B C2581F JP NZ,PZSTR1 ; NOPE.
;PRINT LOWER CASE CHAR (CHARSET 0)
1F4E 3E5B LD A,'a'-6 ;ASCII "a" MINUS Z-OFFSET
1F50 PZSTP0:
1F50 80 ADD A,B ;ADD CHARACTER
1F51 4F LD C,A
1F52 CDB604 PZSTP1: CALL COUT ;PRINT RESULT
1F55 C3341F JP PZSTRL ;AND FETCH ANOTHER Z-CHAR
;CHARSET 1 OR 2?
1F58 3D PZSTR1: DEC A ;SET 1?
1F59 C2611F JP NZ,PZSTR2 ; NOPE, IT'S SET 2
;PRINT UPPER-CASE CHAR (CHARSET 1)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 78
1F5C 3E3B LD A,'A'-6 ;ASCII "A" MINUS Z-OFFSET
1F5E C3501F JP PZSTP0 ;PROCESS IT
;DECODE/PRINT CHARSET 2
1F61 78 PZSTR2: LD A,B ;MODE 2
1F62 FE06 CP 6 ;DIRECT ASCII CHARACTER?
1F64 CA761F JP Z,PZSTRA ; YES.
1F67 FE07 CP 7 ;CARRIAGE RETURN?
1F69 CAF41F JP Z,PZSTRC ; YES.
1F6C 211E20 LD HL,CHRTBL-8 ; NO. SUBTRACT OFFSET
1F6F CD081F CALL HLOFF
1F72 4E LD C,(HL) ;GET CHARACTER FROM TABLE
1F73 C3521F JP PZSTP1
1F76 CD4F20 PZSTRA: CALL GETZCH ;FORM CHARACTER FROM TWO BYTES
1F79 0F RRCA
1F7A 0F RRCA
1F7B 0F RRCA
1F7C 4F LD C,A
1F7D C5 PUSH BC
1F7E CD4F20 CALL GETZCH
1F81 C1 POP BC
1F82 81 ADD A,C
1F83 4F LD C,A
1F84 FE09 CP 9 ;TAB?
1F86 C2521F JP NZ,PZSTP1
1F89 0E20 LD C,20H
1F8B C3521F JP PZSTP1 ;PRINT IT
1F8E 3D PZFWRD: DEC A
1F8F 87 ADD A,A
1F90 87 ADD A,A
1F91 87 ADD A,A
1F92 87 ADD A,A
1F93 87 ADD A,A ;SET NUMBER -1 TIMES 32
1F94 32C721 LD (FWSET),A
1F97 CD4F20 CALL GETZCH ;GET STRING NUMBER
1F9A D8 RET C ;BAD IF OUT OF CHARACTERS
1F9B 47 LD B,A
1F9C 3ADF21 LD A,(CSPERM) ;PRINT ZSTRING POINTED TO BY MPC
1F9F 67 LD H,A ;MAKE IT REENTERENT
1FA0 3AE021 LD A,(STBYTF)
1FA3 6F LD L,A
1FA4 E5 PUSH HL
1FA5 2AE121 LD HL,(ZSTWRD)
1FA8 E5 PUSH HL
1FA9 2AD121 LD HL,(MPCL)
1FAC E5 PUSH HL
1FAD 2AD021 LD HL,(MPCH)
1FB0 E5 PUSH HL
1FB1 2AC821 LD HL,(FWORDS)
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 79
1FB4 3AC721 LD A,(FWSET)
1FB7 80 ADD A,B ;ENTRY INTO 96 WORD TABLE
1FB8 87 ADD A,A
1FB9 CD081F CALL HLOFF ;POINTER TO SPECIAL STRING
1FBC 7E LD A,(HL)
1FBD 32D021 LD (MPCH),A
1FC0 23 INC HL
1FC1 6E LD L,(HL)
1FC2 2600 LD H,0
1FC4 29 ADD HL,HL
1FC5 22D121 LD (MPCL),HL ;SET NEW MPC
1FC8 AF XOR A
1FC9 32D521 LD (MPCFLG),A ;MPCPNT NOT VALID
1FCC CD291F CALL PZSTR ;PRINT SUB STRING (REENTRENT VERSION)
1FCF AF XOR A ;RESTORE REENTRENT VALUES
1FD0 32D521 LD (MPCFLG),A
1FD3 E1 POP HL
1FD4 7D LD A,L
1FD5 32D021 LD (MPCH),A
1FD8 E1 POP HL
1FD9 22D121 LD (MPCL),HL
1FDC E1 POP HL
1FDD 22E121 LD (ZSTWRD),HL
1FE0 E1 POP HL
1FE1 7C LD A,H
1FE2 32DF21 LD (CSPERM),A
1FE5 7D LD A,L
1FE6 32E021 LD (STBYTF),A
1FE9 CD3E20 CALL GETMOD
1FEC C3341F JP PZSTRL
1FEF 0E20 PZSTRS: LD C,20H
1FF1 C3521F JP PZSTP1 ;PRINT SPACE
1FF4 0E0D PZSTRC: LD C,0DH ;CR-LF
1FF6 CDB604 CALL COUT
1FF9 0E0A LD C,0AH
1FFB C3521F JP PZSTP1
1FFE 78 PZSTRT: LD A,B ;SET TEMP MODE
1FFF D603 SUB 3
2001 32DE21 LD (CSTEMP),A
2004 C3341F JP PZSTRL
2007 CD3E20 PZSTRP: CALL GETMOD ;SET CHAR MODE
200A B7 OR A ;MODE 0 IS TEMPORARY
200B CAFE1F JP Z,PZSTRT
200E 3D DEC A
200F 87 ADD A,A
2010 80 ADD A,B
2011 D604 SUB 4 ;INDEX INTO PERMTB
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 80
2013 E5 PUSH HL
2014 212220 LD HL,PERMTB
2017 CD081F CALL HLOFF
201A 7E LD A,(HL)
201B E1 POP HL
201C 32DF21 LD (CSPERM),A
201F C3341F JP PZSTRL
2022 01000002 PERMTB: DB 1,0,0,2
2026 30313233 CHRTBL: DB '0123456789.,!?_#'
2036 2722 DB $27,$22
2038 2F5C2D3A DB '/\-:()'
203E 3ADE21 GETMOD: LD A,(CSTEMP)
2041 3C INC A
2042 3ADF21 LD A,(CSPERM)
2045 C8 RET Z ;RETURN WITH PERM MODE IF NO TEMP MODE
2046 E5 PUSH HL
2047 21DE21 LD HL,CSTEMP
204A 7E LD A,(HL)
204B 36FF LD (HL),0FFH ;CLEAR MODE AFTER GETTING IT
204D E1 POP HL
204E C9 RET
204F 3AE021 GETZCH: LD A,(STBYTF) ;FIND OUT WHICH BYTE
2052 B7 OR A
2053 37 SCF
2054 F8 RET M ;OUT OF CHARACTERS
2055 C26820 JP NZ,GETZH1 ;NOT FIRST BYTE
2058 3C INC A
2059 32E021 LD (STBYTF),A
205C CD251E CALL GETWRD
205F 22E121 LD (ZSTWRD),HL ;SAVE WORD
2062 7C LD A,H
2063 0F RRCA
2064 0F RRCA
2065 E61F AND 1FH
2067 C9 RET
2068 3D GETZH1: DEC A
2069 C27B20 JP NZ,GETZH2 ;LAST CHAR IN WORD
206C 3E02 LD A,2
206E 32E021 LD (STBYTF),A
2071 2AE121 LD HL,(ZSTWRD)
2074 29 ADD HL,HL
2075 29 ADD HL,HL
2076 29 ADD HL,HL
2077 7C LD A,H
2078 E61F AND 1FH
207A C9 RET
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 81
207B AF GETZH2: XOR A
207C 32E021 LD (STBYTF),A
207F 2AE121 LD HL,(ZSTWRD)
2082 7C LD A,H
2083 B7 OR A
2084 F28C20 JP P,GETZH3 ;NOT LAST CHAR IN STRING
2087 3EFF LD A,0FFH
2089 32E021 LD (STBYTF),A ;INDICATE END OF STRING
208C 7D GETZH3: LD A,L
208D E61F AND 1FH
208F C9 RET
2090 AF CONZST: XOR A ;CONVERT TO Z STRING
2091 32DF21 LD (CSPERM),A
2094 21E321 LD HL,ZSTBUO ;POINTER TO OUTPUT BUFFER
2097 0606 LD B,6 ;OUTPUT 6 CHARACTERS TO CONVERT
2099 3605 CONZSL: LD (HL),5
209B 23 INC HL
209C 05 DEC B
209D C29920 JP NZ,CONZSL ;FILL BUFFER WITH PAD CHARACTERS
20A0 0606 LD B,6
20A2 11E321 LD DE,ZSTBUO ;OUTPUT
20A5 21B021 LD HL,ZSTBUI ;INPUT
20A8 4E CNZSL1: LD C,(HL)
20A9 23 INC HL
20AA 79 LD A,C
20AB B7 OR A
20AC 3E05 LD A,5
20AE CADD20 JP Z,CNZSLO ;BLANKS
20B1 79 LD A,C
20B2 FE20 CP ' '
20B4 3E00 LD A,0
20B6 CADD20 JP Z,CNZSLO ;SPACE
20B9 D5 CNZSL2: PUSH DE
20BA 79 LD A,C
20BB CD3B21 CALL ZCHRCS ;WHICH CHARACTER SET
20BE 5F LD E,A ;E HAS CHARACTER SET OF CURRENT CHAR
20BF 3ADF21 LD A,(CSPERM)
20C2 BB CP E
20C3 CAD120 JP Z,CNZSLC ;CONVERT THEN OUTPUT
20C6 7B LD A,E
20C7 C603 ADD A,3
20C9 D1 POP DE
20CA 12 LD (DE),A ;OUTPUT TEMP SHIFT
20CB 13 INC DE
20CC 05 DEC B
20CD CA5A21 JP Z,CNZSLE
20D0 D5 PUSH DE
20D1 79 CNZSLC: LD A,C
20D2 D1 POP DE
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 82
20D3 CD3B21 CALL ZCHRCS
20D6 3D DEC A
20D7 F2E620 JP P,CNZSC1 ;NOT LOWER CASE
20DA 79 LD A,C
20DB D65B SUB 'a'-6
20DD 12 CNZSLO: LD (DE),A
20DE 13 INC DE
20DF 05 DEC B
20E0 C2A820 JP NZ,CNZSL1 ;NEXT
20E3 C35A21 JP CNZSLE ;END
20E6 C2EF20 CNZSC1: JP NZ,CNZSC3 ;NOT UPPER CASE
20E9 79 LD A,C
20EA D63B SUB 'A'-6
20EC C3DD20 JP CNZSLO
20EF 79 CNZSC3: LD A,C
20F0 FE0D CP 0DH
20F2 C20121 JP NZ,CNZSC4
20F5 7E LD A,(HL)
20F6 FE0A CP 0AH
20F8 C20121 JP NZ,CNZSC4
20FB 23 INC HL
20FC 3E07 LD A,7
20FE C3DD20 JP CNZSLO ;CR-LF
2101 79 CNZSC4: LD A,C
2102 CD2221 CALL CNZS2M
2105 C2DD20 JP NZ,CNZSLO ;FOUND IN TABLE
2108 3E06 LD A,6
210A 12 LD (DE),A
210B 13 INC DE
210C 05 DEC B
210D CA5A21 JP Z,CNZSLE ;STORE ASCII VERSION
2110 79 LD A,C
2111 07 RLCA
2112 07 RLCA
2113 07 RLCA
2114 E603 AND 3
2116 12 LD (DE),A
2117 13 INC DE
2118 05 DEC B
2119 CA5A21 JP Z,CNZSLE
211C 79 LD A,C
211D E61F AND 1FH
211F C3DD20 JP CNZSLO
2122 C5 CNZS2M: PUSH BC
2123 E5 PUSH HL
2124 213D20 LD HL,CHRTBL+23 ;SEARCH TABLE
2127 0618 LD B,24
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 83
2129 BE CNZS2L: CP (HL)
212A CA3521 JP Z,CNZS2P ;FOUND
212D 2B DEC HL
212E 05 DEC B
212F C22921 JP NZ,CNZS2L
2132 E1 POP HL ;NOT FOUND
2133 C1 POP BC
2134 C9 RET ;FAIL, ZERO SET
2135 78 CNZS2P: LD A,B
2136 C607 ADD A,7
2138 E1 POP HL
2139 C1 POP BC
213A C9 RET ;PASSED, ZERO CLEARED
213B FE61 ZCHRCS: CP 'a'
213D DA4721 JP C,ZCHRC1
2140 FE7B CP 'z'+1
2142 D24721 JP NC,ZCHRC1
2145 AF XOR A
2146 C9 RET ;SET 0
2147 FE41 ZCHRC1: CP 'A'
2149 DA5421 JP C,ZCHRC2
214C FE5B CP 'Z'+1
214E D25421 JP NC,ZCHRC2
2151 3E01 LD A,1
2153 C9 RET
2154 B7 ZCHRC2: OR A
2155 C8 RET Z
2156 F8 RET M ;END
2157 3E02 LD A,2
2159 C9 RET ;ELSE SET 2
215A 01E321 CNZSLE: LD BC,ZSTBUO ;CONVERT OUTPUT STRING
215D 210000 LD HL,0
2160 54 LD D,H
2161 CD7D21 CALL CNZSE1
2164 CD7D21 CALL CNZSE1
2167 CD7D21 CALL CNZSE1
216A 22E321 LD (ZSTBUO),HL
216D 210100 LD HL,1
2170 CD7D21 CALL CNZSE1
2173 CD7D21 CALL CNZSE1
2176 CD7D21 CALL CNZSE1
2179 22E521 LD (ZSTBUO+2),HL
217C C9 RET
217D 0A CNZSE1: LD A,(BC)
217E 03 INC BC
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 84
217F 5F LD E,A
2180 29 ADD HL,HL
2181 29 ADD HL,HL
2182 29 ADD HL,HL
2183 29 ADD HL,HL
2184 29 ADD HL,HL
2185 19 ADD HL,DE
2186 C9 RET
;
; **********************************************************************
; * *
; * ZORK - DATA SECTION *
; * *
; **********************************************************************
;
2187 SRND: ;RANDOM INFO FOR SAVE, KEEP TOGETHER
2187 LOCALS: DS 15*2 ;STORAGE FOR LOCALS
21A5 00 ZPCH: DB 0 ;HIGH ORDER 8 BITS OF ZPC
21A6 0000 ZPCL: DW 0 ;LOW ORDER 9 BITS OF ZPC
21A8 01 ZSTAKC: DB 1 ;STACK COUNT, 1=>0 IMPLIES OVERPOP, NEG=> OVER PUSH
21A9 0000 OZSTKP: DW 0 ;OLD ZSTACK POINTER
21AB 00 OZSTKC: DB 0 ;OLD ZSTACK COUNT
;
21AC 6A573C99 SHIFT: DB 6AH,57H,3CH,99H
0029 SRNDC EQU $-SRND
21B0 ZSTBUI: DS 6 ;ZSTR INPUT BUFFER
21B6 FF DB 0FFH ;END MARKER
21B7 01 NOLPT: DB 1 ;NON ZERO IMPLIES DO NOT USE LPT
21B8 00 VERF: DB 0 ;1 IF IN VERIFY MODE.
21B9 01 ZMEMT: DB 1 ;FIRST PAGE IN SWAPPING SPACE
21BA PURSTP: ;END OF PURE
21BA 00 SIGNF: DB 0 ;STORAGE FOR SIGN IN MULT AND DIVIDE
21BB 0000 ARG1: DW 0 ;OPERRAND 1
21BD 0000 ARG2: DW 0 ;" 2
21BF 0000 ARG3: DW 0 ;" 3
21C1 0000 ARG4: DW 0 ;" 4
21C3 00 ARGCNT: DB 0 ;ARG COUNT
21C4 00 OPCODE: DB 0 ;CURRENT OPCODE
21C5 0000 GLOBAL: DW 0 ;POINTER TO GLOBAL 0
21C7 00 FWSET: DB 0 ;TEMPORARY STORAGE FOR FWORDS CALCULATION
21C8 0000 FWORDS: DW 0 ;COMMON WORDS POINTER
21CA 0000 ZPCOFF: DW 0 ;OFFSET FOR FAST JUMPS
21CC 0000 ZPCPNT: DW 0 ;REAL POINTER TO PC
21CE 00 ZPCFLG: DB 0 ;0FFH IF VALID PC POINTER
21CF 00 ZPCPG: DB 0 ;PAGE OF ZPC
21D0 00 MPCH: DB 0 ;HIGH ORDER 8 BITS OF MEMORY POINTER
21D1 0000 MPCL: DW 0 ;LOW ORDER 9 BITS OF MEMPOINTER
21D3 0000 MPCPNT: DW 0 ;REAL POINTER TO MEMORY LOCATION
21D5 00 MPCFLG: DB 0 ;0FF IF VALID MPCPNT
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 85
21D6 00 MPCPG: DB 0 ;PAGE NUMBER OF PC PAGE
;
;PAGE TABLES
21D7 0000 PGBUFP: DW 0 ;BUFFER POINTER
21D9 0000 ZCODEP: DW 0 ;LOW MEM STARTING POINTER
;
21DB 00 NPGS: DB 0 ;NUMBER OF PAGES
21DC 00 PGTOP: DB 0 ;TOP OF LIST PAGE
21DD 3F PGBOT: DB MAXPGS-1 ;BOTTOM OF LIST
;
21DE 00 CSTEMP: DB 0 ;-1 IF NOT TEMP CHAR SET, ELSE SET
21DF 00 CSPERM: DB 0 ;PERM CHARACTER SET
21E0 00 STBYTF: DB 0 ;0 FOR FIRST BYTE, 1 FOR 2, 2 FOR 3, 0FFH FOR END
21E1 0000 ZSTWRD: DW 0 ;WORD STORRAGE
21E3 ZSTBUO: DS 6 ;OUTPUT BUFFER
21E9 0000 RTABP: DW 0 ;TEMP FOR ZREAD, RESULT TABLE POINTER
;
21EB 0000 LMEMRY: DW 0 ;LAST LOCATION IN MEMORY, FILLED IN BY LOADER
;
0100 END START
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 86
---- SYMBOL TABLE ----
ARG1 21BB CPLMAX 0085 FLSLIN 04F7 GETVR1 1302 LOCALS 2187
ARG2 21BD CPMBUF 0080 FLUSHW 1A9F GETVRG 1316 LPCHK 049B
ARG3 21BF CPMCLF 010D FNDAT 02C7 GETVRL 1307 LPDL 0190
ARG4 21C1 CPMCPL 0103 FNDPG1 1F27 GETVRS 1322 LPINIT 05B4
ARGCNT 21C3 CPMCR 007C FNDPGE 1F0F GETWRD 1E25 LPTO 0586
BADOP 15BF CPMDRV 005C FNDPGL 1F18 GETZCH 204F LSTADR 0006
BAND 170E CPMFCB 005C FNPRE 02DF GETZH1 2068 MAKEF 0016
BCOM 169C CPMFEX 0065 FNPUR 02D3 GETZH2 207B MAXPGS 0040
BDOS 0005 CPMFN 0105 FRSTQ1 1562 GETZH3 208C MEMTOP 0209
BODY 10A6 CPMFNB 005D FSET 1729 GLOBAL 21C5 MEMTP1 0212
BOR 1702 CPMINV 010F FSETQ 171A GRTRQ 16B5 MLOOP 1210
BRKTBL 1AE3 CPMLLF 010E FSTACK 14D5 GTDSK1 0326 MORCNT 0C76
BSTLIN 0152 CPMLPP 0104 FWFAIL 1B72 HLGEDE 1D25 MORE 0701
BTST 16F0 CPMRCD 0019 FWL1 1B0B HLOFF 1F08 MORE1 0722
CCI 0001 CPMRDS 000D FWL1A 1B07 IGRTQ1 16D3 MORMSG 06E2
CCO 0002 CPMREC 007D FWL2 1B10 IGRTRQ 16CC MOVE 1751
CDIO 0006 CPMSEL 000E FWL3 1B25 INC 1593 MOVESG 0012
CDISK 0004 CPMSTR 0200 FWL4 1B3A INC1 159F MOVIT 034B
CGCONS 000B CPSTNG 0009 FWL4A 1B68 INC2 15A6 MPCFLG 21D5
CHARS 0BEE CRCBUF 000A FWL4B 1B67 INQ 16DC MPCH 21D0
CHRPNT 0C73 CRESET 0000 FWL4C 1B66 IOBYTE 0003 MPCL 21D1
CHRPOS 06A3 CRLF 14DE FWORDS 21C8 ITRMST 0110 MPCPG 21D6
CHRTBL 2026 CRMSG 094E FWSET 21C7 JUMP 167E MPCPNT 21D3
CIN 0438 CSPERM 21DF FWSUCC 1B76 LESSQ 16A8 MSGCRC 0A82
CIN1 043B CSTEMP 21DE GET 177D LFILC 0BD5 MSGOUT 0A66
CIN2 0451 DBUFP 0BEB GETARG 1D15 LFILD 0B93 MSGRES 0942
CKZPCP 1E96 DDIV0 1C54 GETB 178F LFILD1 0B9F MUL 1851
CLEARS 0585 DDIV1 1C5A GETB1A 1EA2 LFILDG 0950 MUL1 186F
CLO 0005 DEC 1599 GETBT1 1E5D LFILDM 098D MUL2 1878
CLOSE 0010 DEC1 15AC GETBT2 1EA8 LFILF 0B8C MUL4 1875
CNZS2L 2129 DELETE 0013 GETBT3 1E7A LFILGM 09DD MULT 1C1C
CNZS2M 2122 DIV 187D GETBTL 1E83 LFILP 0BB3 MULT1 1C22
CNZS2P 2135 DIV2 189E GETBYT 1E30 LFILP1 0BBF MULT2 1C2E
CNZSC1 20E6 DIV2A 18AC GETDK2 0318 LFILPM 09B5 NBRKS 000A
CNZSC3 20EF DIV2B 189F GETDSK 02F7 LFILR 0BD3 NCHARS 0BED
CNZSC4 2101 DIV4 18A5 GETFRE 1DFE LFILS 0B63 NEXTP 1814
CNZSE1 217D DIVIDE 1C45 GETLNG 12ED LFILS1 0B70 NEXTP1 181E
CNZSL1 20A8 DLESSQ 16C1 GETMOD 203E LINFUL 0521 NEXTP2 1832
CNZSL2 20B9 EQUALQ 18C2 GETP 17A3 LINOCR 0574 NEXTP3 1838
CNZSLC 20D1 EQUAQ1 18E3 GETP1 17A6 LINOT1 0516 NEXTPC 1D5A
CNZSLE 215A ESTLIN 0173 GETP2 17D7 LINOT2 0528 NEXTQ 154D
CNZSLO 20DD FALSE 0000 GETP2A 17E9 LINOT3 0532 NOLPT 21B7
CONZSL 2099 FBRK 1AC3 GETP3 17BA LINOT4 055E NPGS 21DB
CONZST 2090 FCLEAR 1736 GETPRE 0315 LINOT5 0566 NXTPC1 1D87
CORET 04F3 FILTYP 0C75 GETPT 17EF LINOT6 0549 NXTPC2 1DB9
COUT 04B6 FINDW 1AED GETPT1 17F2 LINOT7 0555 NXTPC3 1D9D
COUT1 04D3 FIRSTQ 1559 GETPT2 1806 LINOTR 0572 NXTPC4 1DC6
COUTBS 03B1 FLAGSU 1CA0 GETSHT 12E4 LINOUT 0502 NXTPCL 1DA6
COUTCR 04AE FLGSU1 1CB2 GETVAR 12FA LMEMRY 21EB OBJLOC 1CF4
COUTD 045E FLGSU2 1CBA GETVL1 130F LMORE 001F OP0 1280
COUTDC 0BE5 FLGSU3 1CC2 GETVOC 1AD4 LOC 1573 OP0M 000E
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 87
---- SYMBOL TABLE ----
OP0T 13F4 PRFLG 0BE7 QUIT 0749 SAVEA 07C2 USL 14E4
OP1 128D PRINT 1687 RANDOM 1BCD SCOREG 0011 VALUE 1693
OP1M 0010 PRINT1 168D RBRK1 1AB7 SCPLOC 0BE8 VARGET 1359
OP1T 1410 PRINT2 15B9 RBRK2 1AC0 SCPVAL 0BEA VARGTS 135E
OP2 12B6 PRINTB 15B6 RBRKQ 1AAD SETFIL 02AA VARPTR 174B
OP2EX 12D7 PRINTC 1B84 RD0PL 1A27 SETFL1 02BF VARPTS 1369
OP2M 0019 PRINTD 1618 RDBFC1 03F9 SETSTR 1DF6 VARPUT 1365
OP2T 1430 PRINTI 1485 RDBFC2 03EF SETWR1 1DEA VERF 21B8
OPCODE 21C4 PRINTN 1B8E RDBFC3 03DE SETWRD 1DE4 VERIFL 1513
OPDSPH 126F PRINTR 14B7 RDBFC4 03E6 SFAIL 0835 VERIFY 14EA
OPEN 000F PRNTDC 1621 RDBFCR 03C0 SFAIL1 0850 VRLINE 109A
OPEXT 1229 PRNTI1 148B RDBFFL 041A SHIFT 21AC VRS 1089
OPEXTF 125D PRNTN1 1B9E RDBFR1 0407 SHLGED 1D1D WARM 0000
OPEXTL 1232 PRNTN3 1BAE RDBFR2 0415 SIBRKQ 1AC6 WHOLIN 05C1
OPEXTM 000A PRNTN4 1BB3 RDBFRO 03A3 SIGNC 1C78 WHOLN1 0645
OPEXTT 1462 PRNTN6 1BC0 RDBFRT 03FE SIGNCN 1C8B WHOLN2 0614
OPNDK1 021B PRNTNC 1B97 RDFLG 0BE6 SIGNF 21BA WHOLT 0653
OZSTKC 21AB PRNTNG 1BC5 READB1 036B SIGNPC 1C93 WHOLT0 066C
OZSTKP 21A9 PROPB 1CCA READB2 0398 SIGNS 1C85 WHOLT1 0674
PCPST 0294 PROPL 1CE5 READBF 0354 SPLIC1 1F03 WHOLT2 0698
PCPSTL 0295 PROPN 1CE1 READL 1A06 SPLICE 1EC9 WHOMSG 06D3
PCRLD1 048B PROPNX 1CEC READL2 1A51 SRCLOS 080E WHOTMS 06DB
PCRLF 04B4 PSHSTK 1D2C READL3 1A74 SRDFNM 02EB WRITER 0022
PCRLFD 0473 PSTUPS 0194 READR 0021 SRFAIL 0848 WRITES 0015
PCSTR 027E PTSIZE 1583 READS 0014 SRGDFN 0934 ZADD 183E
PCSTRL 027F PURSTP 21BA REMOVC 15C8 SRGFM1 08C8 ZCALL 18EF
PDL 0C77 PUT 197B REMOVE 15C2 SRGFN2 08ED ZCALL1 192E
PERMTB 2022 PUTB 1994 REMVC1 15F5 SRGFN3 092A ZCALL2 194C
PGBOT 21DD PUTBYT 1328 REMVC2 160D SRGFNA 0900 ZCALL3 195A
PGBUFP 21D7 PUTP 19A8 REST1 0B2F SRGFNB 091B ZCALL4 1968
PGTBD 0080 PUTP1 19AB RESTA 0AE0 SRGFNM 086C ZCHRC1 2147
PGTBL 0FC9 PUTP2 19BF RESTAR 075F SRMSG1 0A08 ZCHRC2 2154
PGTBLB 1049 PUTP2A 19D5 RESTOR 0A93 SRMSG2 0A44 ZCHRCS 213B
PGTBLF 1009 PUTVAL 132B RET0 1327 SRMSG3 0A64 ZCKLEN 001A
PGTFD 0040 PUTVL1 1348 RET1 1652 SRND 2187 ZCKSUM 001C
PGTOP 21DC PUTVLC 1331 RET2 1661 SRNDC 0029 ZCODEP 21D9
PNTTIM 073B PUTVLG 134D RETCUR 0019 SRSWPD 093F ZENDLD 0004
POPRET 0497 PUTVLL 1340 RETURN 1633 STAFLG 0BE4 ZER 0206
POPSTK 1D45 PUTVR1 1336 RFALSE 147F STAR3A 11D2 ZEROQ 1542
POSPS1 06CD PZFWRD 1F8E RND 1BEE START 0100 ZFWORD 0018
POSPS2 06C3 PZSTP0 1F50 RND1 1BF7 START1 10CC ZGLOBA 000C
POSPST 06B2 PZSTP1 1F52 RND2 1BF1 START2 115E ZID 0002
PREDB 1387 PZSTR 1F29 ROOMG 0010 START3 1173 ZMEMT 21B9
PREDB1 13AA PZSTR1 1F58 RSIBRK 1A6E START4 11F1 ZMOD 18B4
PREDB2 13D2 PZSTR2 1F61 RSTACK 14CC START5 120F ZNOP 14C0
PREDB3 13B5 PZSTRA 1F76 RTABP 21E9 STBYTF 21E0 ZOBJEC 000A
PREDB4 13E6 PZSTRC 1FF4 RTRMST 0131 TMCHK 057A ZPCFLG 21CE
PREDF 1371 PZSTRL 1F34 RTRUE 1476 TPA 0100 ZPCH 21A5
PREDLB 1396 PZSTRP 2007 RTRUE1 1479 TRUE 00FF ZPCL 21A6
PREDNB 1378 PZSTRS 1FEF SAVE 0770 TWODSK 01B5 ZPCOFF 21CA
PREDS 1380 PZSTRT 1FFE SAVE1 07EC UPPER 0921 ZPCPG 21CF
AVOCET SYSTEMS Z80 ASSEMBLER - VERSION 1.03C SERIAL #00112
SOURCE FILE NAME: ZORKCPM.ASM PAGE 88
---- SYMBOL TABLE ----
ZPCPNT 21CC ZRSTAR 14C9 ZSPLIT 0004 ZSTATB 0010 ZSWAPF 0001
ZPOP 1BE5 ZRSTOR 14C6 ZSTACK 0E09 ZSTBUI 21B0 ZTANDY 0008
ZPURBT 000E ZSAVE 14C3 ZSTAKC 21A8 ZSTBUO 21E3 ZTIMEF 0002
ZPUSH 1BDC ZSCRIP 0010 ZSTAKL 00E0 ZSTWRD 21E1 ZVERS 0000
ZQUIT 14DB ZSERNM 0012 ZSTAKP 0E07 ZSUB 1845 ZVOCAB 0008
ZREAD 19DA ZSET 1745 ZSTART 0006 ZSWAP 0001
***** NO ERRORS DETECTED *****