Files
erkyrath.infocom-zcode-terps/64/zip/c64zip-d.src
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

7196 lines
313 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 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 1
0000 ; --------------------------
0000 ; ZIP/6502 2.0 VERSION C
0000 ; Z-CODE INTERPRETER PROGRAM
0000 ; FOR COMMODORE 64
0000 ; --------------------------
0000 ; INFOCOM, INC.
0000 ; 55 WHEELER STREET
0000 ; CAMBRIDGE, MA 02136
0000 ; COMPANY PRIVATE -- NOT FOR DISTRIBUTION
0800 MSTART EQU $0800 ; START OF FREE PROGRAM RAM
0003 ZEROPG EQU $03 ; START OF FREE Z-PAGE RAM
008F ZPGTOP EQU $8F ; END OF FREE Z-PAGE RAM
0000 DEBUG EQU 0 ; ASSEMBLY FLAG FOR DEBUGGER
0000 ; -----------
0000 ; ERROR CODES
0000 ; -----------
0000 ; 00 -- INSUFFICIENT RAM
0000 ; 01 -- ILLEGAL X-OP
0000 ; 02 -- ILLEGAL 0-OP
0000 ; 03 -- ILLEGAL 1-OP
0000 ; 04 -- ILLEGAL 2-OP
0000 ; 05 -- Z-STACK UNDERFLOW
0000 ; 06 -- Z-STACK OVERFLOW
0000 ; 07 -- ILLEGAL PROPERTY LENGTH (GETP)
0000 ; 08 -- DIVISION BY ZERO
0000 ; 09 -- ILLEGAL ARGUMENT COUNT (EQUAL?)
0000 ; 10 -- ILLEGAL PROPERTY ID (PUTP)
0000 ; 11 -- ILLEGAL PROPERTY LENGTH (PUTP)
0000 ; 12 -- DISK ADDRESS OUT OF RANGE
0000 ; 13 -- PARSER OVERFLOW
0000 ; 14 -- DRIVE ACCESS
0000 ; 15 -- Z-STACK DESTROYED
INCLUD SHAKE.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 2
--- CBM64 FAST DISK HANDSHAKE ROUTINES ---
0000 ; ------------------
0000 ; 1541 DRIVE EQUATES
0000 ; ------------------
1800 PB EQU $1800
0000 JOBS EQU $00
0006 HDRS EQU $06
000A DATA EQU $0A
000B INDEX EQU $0B
0001 DATIN EQU $01
0002 DATOUT EQU $02
0004 CLKIN EQU $04
0008 CLKOUT EQU $08
0080 ATNIN EQU $80
0080 READ EQU $80
0090 WRITE EQU $90
00A0 VERIFY EQU $A0
00B0 SEEK EQU $B0
00B8 SECSEK EQU SEEK+8
00C0 BUMP EQU $C0
00D0 JUMPC EQU $D0
00E0 EXEC EQU $E0
0300 BUF1 EQU $0300
0400 BUF2 EQU $0400
0500 BUF3 EQU $0500
0600 BUF4 EQU $0600
0700 BUF5 EQU $0700
1C00 DSKCNT EQU $1C00 ; DISK CONTROLLER PORT ADDRESS
0500 ORG BUF3
0500 AD0018 INIT0: LDA PB
0503 29F5 AND #$FF-DATOUT-CLKOUT
0505 8D0018 STA PB
0508 203C05 JSR CLK0
050B AD001C CMDWT: LDA DSKCNT ; READ CONTROLLER
050E 29F7 AND #%11110111 ; CLEAR BIT 3
0510 8D001C STA DSKCNT ; TO SHUT OFF THE DAMNED LITTLE RED LIGHT
0513 204405 JSR BYTGET ; GET TRACK ID (1-35)
0516 AA TAX ; SAVE HERE
0517 F019 BEQ CMDEND ; IF ZERO
0519 C9FF CMP #$FF ; OR $FF,
051B F015 BEQ CMDEND ; DISENGAGE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 3
--- CBM64 FAST DISK HANDSHAKE ROUTINES ---
051D 8506 STA HDRS ; ELSE SET TRACK #
051F 204405 JSR BYTGET ; GET SECTOR #
0522 8507 STA HDRS+1 ; AND SET IT
0524 AD001C LDA DSKCNT ; TURN BACK ON
0527 0908 ORA #%00001000 ; THE STUPID LITTLE
0529 8D001C STA DSKCNT ; RED LIGHT
052C 20BD05 JSR RDFILE ; GET THE DATA
052F 4C0B05 JMP CMDWT ; WAIT FOR NEXT TRACK/SECTOR
0532 60 CMDEND: RTS ; EXIT HARD LOOP
0533 AD0018 DEBNC: LDA PB ; WAIT FOR SERIAL LINE
0536 CD0018 CMP PB ; TO SETTLE DOWN
0539 D0F8 BNE DEBNC
053B 60 RTS
053C 203305 CLK0: JSR DEBNC
053F 2904 AND #CLKIN
0541 D0F9 BNE CLK0
0543 60 RTS
0544 A980 BYTGET: LDA #$80
0546 850A STA DATA
0548 203305 GTBIT: JSR DEBNC
054B A8 TAY
054C 2904 AND #CLKIN
054E F0F8 BEQ GTBIT
0550 78 SEI
0551 98 TYA
0552 0902 ORA #DATOUT
0554 8D0018 STA PB
0557 203C05 JSR CLK0
055A AD0018 LDA PB
055D 29FD AND #$FF-DATOUT
055F 8D0018 STA PB
0562 203305 GTBO0: JSR DEBNC
0565 A8 TAY
0566 2904 AND #CLKIN
0568 F0F8 BEQ GTBO0
056A 203C05 JSR CLK0
056D 58 CLI
056E 98 TYA
056F 4A LSR A
0570 660A ROR DATA
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 4
--- CBM64 FAST DISK HANDSHAKE ROUTINES ---
0572 90D4 BCC GTBIT
0574 A50A LDA DATA
0576 60 RTS
0577 A208 BYTSND: LDX #8
0579 850A STA DATA
057B AD0018 BITSND: LDA PB
057E A8 TAY
057F 2904 AND #CLKIN
0581 F0F8 BEQ BITSND
0583 98 TYA
0584 0902 ORA #DATOUT
0586 8D0018 STA PB
0589 78 SEI
058A AD0018 BSND0: LDA PB
058D A8 TAY
058E 2904 AND #CLKIN
0590 D0F8 BNE BSND0
0592 98 BSND1: TYA
0593 29FD AND #$FF-DATOUT
0595 8D0018 STA PB
0598 AD0018 SPEED: LDA PB
059B A8 TAY
059C 2904 AND #CLKIN
059E F0F8 BEQ SPEED
05A0 98 TYA
05A1 460A LSR DATA
05A3 9002 BCC BSND2
05A5 0902 ORA #DATOUT
05A7 8D0018 BSND2: STA PB
05AA AD0018 BSND3: LDA PB
05AD A8 TAY
05AE 2904 AND #CLKIN
05B0 D0F8 BNE BSND3
05B2 98 TYA
05B3 29FD AND #$FF-DATOUT
05B5 8D0018 STA PB
05B8 CA DEX
05B9 D0DD BNE SPEED
05BB 58 CLI
05BC 60 RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 5
--- CBM64 FAST DISK HANDSHAKE ROUTINES ---
05BD A980 RDFILE: LDA #READ
05BF 8500 STA JOBS
05C1 A500 TSTDO3: LDA JOBS
05C3 30FC BMI TSTDO3
05C5 A900 TSTDO5: LDA #0
05C7 850B STA INDEX
05C9 A40B TSTDO4: LDY INDEX
05CB B90003 LDA BUF1,Y
05CE 207705 JSR BYTSND
05D1 E60B INC INDEX
05D3 D0F4 BNE TSTDO4
05D5 60 RTS
05D6 ; FILL REMAINDER OF SECTOR
05D6 ; WITH JUNK
05D6 00000000 DB 0,0,0,0,0,0,0,0
05DE 00000000 DB 0,0,0,0,0,0,0,0
05E6 00000000 DB 0,0,0,0,0,0,0,0
05EE 00000000 DB 0,0,0,0,0,0,0,0
05F6 00000000 DB 0,0,0,0,0,0,0,0
05FE 0000 DB 0,0
END
INCLUD EQ.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 6
--- MEMORY ORGANIZATION ---
00FF TRUE EQU $FF
0000 FALSE EQU 0
0000 LO EQU 0
0001 HI EQU 1
0800 IOBUFF EQU MSTART ; 256-BYTE DISK BUFFER
0900 ZSTAKL EQU MSTART+$100 ; Z-STACK LSBS
0A00 ZSTAKH EQU MSTART+$200 ; Z-STACK MSBS
0B00 PTABL EQU MSTART+$300 ; PAGING TABLE LSBS ($A0 BYTES)
0BA0 PTABH EQU MSTART+$3A0 ; PAGING TABLE MSBS ($A0 BYTES)
0C50 LRUMAP EQU MSTART+$450 ; TIMESTAMP MAP ($A0 BYTES) (BM 11/24/84)
0D00 LOCALS EQU MSTART+$500 ; LOCAL VARIABLE STORAGE (32 BYTES)
0D20 BUFSAV EQU MSTART+$520 ; I/O AUX BUFFER (80 BYTES)
0E00 ZIP EQU MSTART+$600 ; START OF EXECUTABLE CODE
2A00 ZBEGIN EQU ZIP+$1C00 ; START OF Z-CODE (ASSUME 7K ZIP)
0600 ; ---------------------
0600 ; Z-CODE HEADER OFFSETS
0600 ; ---------------------
0000 ZVERS EQU 0 ; VERSION BYTE
0001 ZMODE EQU 1 ; MODE SELECT BYTE
0002 ZID EQU 2 ; GAME ID WORD
0004 ZENDLD EQU 4 ; START OF NON-PRELOADED Z-CODE
0006 ZGO EQU 6 ; 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" Z-CODE
0010 ZSCRIP EQU 16 ; FLAG WORD
0012 ZSERIA EQU 18 ; 3-WORD ASCII SERIAL NUMBER
0018 ZFWORD EQU 24 ; START OF FWORDS TABLE
001A ZLENTH EQU 26 ; LENGTH OF Z-PROGRAM IN WORDS
001C ZCHKSM EQU 28 ; Z-CODE CHECKSUM WORD
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 7
--- ZIP Z-PAGE VARIABLES ---
0003 OPCODE EQU ZEROPG ; (BYTE) CURRENT OPCODE
0004 NARGS EQU OPCODE+1 ; (BYTE) # ARGUMENTS
0005 ARG1 EQU OPCODE+2 ; (WORD) ARGUMENT #1
0007 ARG2 EQU OPCODE+4 ; (WORD) ARGUMENT #2
0009 ARG3 EQU OPCODE+6 ; (WORD) ARGUMENT #3
000B ARG4 EQU OPCODE+8 ; (WORD) ARGUMENT #4
000D ABYTE EQU OPCODE+10 ; (BYTE) X-OP ARGUMENT BYTE
000E ADEX EQU OPCODE+11 ; (BYTE) X-OP ARGUMENT INDEX
000F VALUE EQU OPCODE+12 ; (WORD) VALUE RETURN REGISTER
0011 I EQU VALUE+2 ; (WORD) GEN-PURPOSE REGISTER #1
0013 J EQU VALUE+4 ; (WORD) GEN-PURPOSE REGISTER #2
0015 K EQU VALUE+6 ; (WORD) GEN-PURPOSE REGISTER #3
0017 ZSP EQU VALUE+8 ; (BYTE) Z-STACK POINTER
0018 OLDZSP EQU ZSP+1 ; (BYTE) OLD Z-STACK POINTER
0019 ZPC EQU ZSP+2 ; (3 BYTES) ZIP PROGRAM COUNTER
0019 ZPCL EQU ZPC ; (BYTE) LOW 8 BITS OF [ZPC]
001A ZPCM EQU ZPC+1 ; (BYTE) MIDDLE 8 BITS OF [ZPC]
001B ZPCH EQU ZPC+2 ; (BYTE) HIGH BIT OF [ZPC]
001C ZPCFLG EQU ZPC+3 ; (BYTE) FLAG: "TRUE" IF [ZPCPNT] VALID
001D ZPCPNT EQU ZPC+4 ; (WORD) ABS POINTER TO CURRENT Z-PAGE
001F MPC EQU ZPC+6 ; (3 BYTES) MEMORY PROGRAM COUNTER
001F MPCL EQU MPC ; (BYTE) LOW 8 BITS OF [MPC]
0020 MPCM EQU MPC+1 ; (BYTE) MIDDLE 8 BITS OF [MPC]
0021 MPCH EQU MPC+2 ; (BYTE) HIGH BIT OF [MPC]
0022 MPCFLG EQU MPC+3 ; (BYTE) FLAG: "TRUE" IF [MPCPNT] VALID
0023 MPCPNT EQU MPC+4 ; (WORD) ABS POINTER TO CURRENT M-PAGE
0025 LRU EQU MPC+6 ; (BYTE) PAGING INDEX
0026 ZCODE EQU LRU+1 ; (BYTE) 1ST ABSOLUTE PAGE OF PRELOAD
0027 ZPURE EQU LRU+2 ; (BYTE) 1ST VIRTUAL PAGE OF "PURE" Z-CODE
0028 PAGE0 EQU LRU+3 ; (BYTE) 1ST PAGE OF ACTUAL SWAPPING SPACE
0029 PMAX EQU LRU+4 ; (BYTE) MAXIMUM # OF SWAPPING PAGES
002A ZPAGE EQU LRU+5 ; (BYTE) CURRENT SWAPPING PAGE
002B TARGET EQU LRU+6 ; (WORD) TARGET PAGE FOR SWAPPING
002D STAMP EQU LRU+8 ; (BYTE) CURRENT TIMESTAMP (BM 11/24/84)
002E SWAP EQU LRU+9 ; (BYTE) EARLIEST PAGE (BM 11/24/84)
002F GLOBAL EQU LRU+10 ; (WORD) GLOBAL VARIABLE POINTER
0031 VOCAB EQU GLOBAL+2 ; (WORD) VOCAB TABLE POINTER
0033 FWORDS EQU GLOBAL+4 ; (WORD) F-WORDS TABLE POINTER
0035 OBJTAB EQU GLOBAL+6 ; (WORD) OBJECT TABLE POINTER
0600 ; Z-STRING MANIPULATION VARIABLES
0037 IN EQU GLOBAL+8 ; (6 BYTES) INPUT BUFFER
003D OUT EQU IN+6 ; (6 BYTES) OUTPUT BUFFER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 8
--- ZIP Z-PAGE VARIABLES ---
0043 SOURCE EQU OUT+6 ; (BYTE) SOURCE BUFFER POINTER
0044 RESULT EQU SOURCE+1 ; (BYTE) RESULT TABLE POINTER
0045 LINLEN EQU SOURCE+2 ; (BYTE) LENGTH OF CURRENT LINE
0046 WRDLEN EQU SOURCE+3 ; (BYTE) LENGTH OF CURRENT WORD
0047 ENTRY EQU SOURCE+4 ; (WORD) ADDR OF CURRENT RESULT ENTRY
0049 NENTS EQU SOURCE+6 ; (WORD) # ENTRIES IN VOCAB TABLE
004B ESIZE EQU SOURCE+8 ; (BYTE) SIZE OF VOCAB TABLE ENTRIES
004C PSET EQU SOURCE+9 ; (BYTE) PERMANENT CHARSET
004D TSET EQU SOURCE+10 ; (BYTE) TEMPORARY CHARSET
004E ZCHAR EQU SOURCE+11 ; (BYTE) CURRENT Z-CHAR
004F OFFSET EQU SOURCE+12 ; (BYTE) F-WORD TABLE OFFSET
0050 ZFLAG EQU SOURCE+13 ; (BYTE) Z-WORD ACCESS FLAG
0051 ZWORD EQU SOURCE+14 ; (WORD) CURRENT Z-WORD
0053 CONCNT EQU SOURCE+16 ; (BYTE) Z-STRING SOURCE COUNTER
0054 CONIN EQU SOURCE+17 ; (BYTE) CONVERSION SOURCE INDEX
0055 CONOUT EQU SOURCE+18 ; (BYTE) CONVERSION DEST INDEX
0056 QUOT EQU SOURCE+19 ; (WORD) QUOTIENT FOR DIVISION
0058 REMAIN EQU QUOT+2 ; (WORD) REMAINDER FOR DIVISION
005A MTEMP EQU QUOT+4 ; (WORD) MATH TEMPORARY REGISTER
005C QSIGN EQU QUOT+6 ; (BYTE) SIGN OF QUOTIENT
005D RSIGN EQU QUOT+7 ; (BYTE) SIGN OF REMAINDER
005E DIGITS EQU QUOT+8 ; (BYTE) DIGIT COUNT FOR "PRINTN"
005F TIMEFL EQU QUOT+9 ; (BYTE) "TRUE" IF TIME MODE
0060 LENGTH EQU TIMEFL+1 ; (BYTE) LENGTH OF LINE IN [LINBUF]
0061 OLDLEN EQU TIMEFL+2 ; (BYTE) OLD LINE LENGTH
0062 SCRIPT EQU TIMEFL+3 ; (BYTE) SCRIPT ENABLE FLAG
0063 OLDX EQU TIMEFL+4 ; (BYTE) OLD CURSOR X
0064 OLDY EQU TIMEFL+5 ; (BYTE) OLD CURSOR Y
0065 LINCNT EQU TIMEFL+6 ; (BYTE) LINE COUNTER
0066 LMAX EQU TIMEFL+7 ; (BYTE) MAX # LINES/SCREEN
0067 IOCHAR EQU TIMEFL+8 ; (BYTE) CHARACTER BUFFER
0068 SLINE EQU IOCHAR+1 ; (BYTE) BORDERLINE FOR SPLIT
0069 SPSTAT EQU IOCHAR+2 ; (BYTE) SPLIT SCREEN STATUS FLAG
006A LFROM EQU IOCHAR+3 ; (WORD) "FROM" LINE ADDRESS
006C LTO EQU IOCHAR+5 ; (WORD) "TO" LINE ADDRESS
006E PSTAT EQU IOCHAR+7 ; (BYTE) PRINTER STATUS FLAG
006F PRLEN EQU IOCHAR+8 ; (BYTE) SCRIPT LINE LENGTH
0070 DBLOCK EQU IOCHAR+9 ; (WORD) Z-BLOCK TO READ
0072 DBUFF EQU DBLOCK+2 ; (WORD) RAM PAGE TO ACCESS (LSB = 0)
0074 TRACK EQU DBLOCK+4 ; (BYTE) TARGET TRACK
0075 SECTOR EQU DBLOCK+5 ; (BYTE) TARGET SECTOR
0076 GPOSIT EQU DBLOCK+6 ; (BYTE) DEFAULT SAVE POSITION
0077 GDRIVE EQU DBLOCK+7 ; (BYTE) DEFAULT SAVE DRIVE
0078 TPOSIT EQU DBLOCK+8 ; (BYTE) TEMP SAVE POSITION
0079 TDRIVE EQU DBLOCK+9 ; (BYTE) TEMP SAVE DRIVE
007A DRIVE EQU DBLOCK+10 ; (BYTE) CURRENT DRIVE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- EQUATES PAGE 9
--- ZIP Z-PAGE VARIABLES ---
007B BLINK EQU DBLOCK+11 ; (WORD) CURSOR BLINK TIMER
007D DVD EQU DBLOCK+13 ; (WORD) DISK DIVIDEND
007F DSOR EQU DBLOCK+15 ; (WORD) DISK DIVISOR
0081 DTEMP EQU DBLOCK+17 ; (WORD) DISK TEMP VARIABLE
END
INCLUD HARDEQ.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 10
--- HARDWARE EQUATES: CBM64 ---
0600 ; ---------
0600 ; CONSTANTS
0600 ; ---------
0027 XSIZE EQU 39 ; X-SIZE OF SCREEN
0018 YSIZE EQU 24 ; Y-SIZE OF SCREEN
000D EOL EQU $0D ; EOL CHAR
0020 SPACE EQU $20 ; SPACE CHAR
0014 BACKSP EQU $14 ; BACKSPACE
0600 ; ---------
0600 ; ZERO-PAGE
0600 ; ---------
0000 D6510 EQU $00 ; 6510 DATA DIRECTION REGISTER
0001 R6510 EQU $01 ; 6510 I/O PORT
0002 FAST EQU $02 ; FAST-READ AVAILABLE FLAG
0091 STKEY EQU $91 ; STOP KEY FLAG
009D MSGFLG EQU $9D ; KERNAL MESSAGE CONTROL FLAG
00A2 TIME EQU $A2 ; SYSTEM JIFFY TIMER
00C5 LSTX EQU $C5 ; LAST KEY PRESSED
00C6 NDX EQU $C6 ; # CHARS IN KEYBOARD BUFFER
00C7 RVS EQU $C7 ; REVERSE CHARACTER FLAG
00CB SFDX EQU $CB ; CURRENT KEYPRESS
00CC BLNSW EQU $CC ; CURSOR BLINK SWITCH
00D3 PNTR EQU $D3 ; CURSOR COLUMN IN LOGICAL LINE
00D6 TBLX EQU $D6 ; CURRENT CURSOR ROW
00D9 LDTB1 EQU $D9 ; 25-BYTE LINE LINK TABLE
00F5 KEYTAB EQU $F5 ; KEYBOARD DECODE TABLE VECTOR
00FB FDATA EQU $FB ; FAST-READ DATA BUFFER
00FC FINDEX EQU $FC ; FAST-READ BUFFER INDEX
00FD FASTEN EQU $FD ; FAST-READ ENABLED FLAG
0600 ; -----------
0600 ; PAGES 2 & 3
0600 ; -----------
0200 LBUFF EQU $0200 ; 89-BYTE LINE BUFFER
0277 KEYD EQU $0277 ; KEYBOARD QUEUE
0286 COLOR EQU $0286 ; FOREGROUND COLOR FOR TEXT
0288 HIBASE EQU $0288 ; TOP PAGE OF SCREEN RAM
0289 XMAX EQU $0289 ; MAXIMUM KEYBOARD QUEUE SIZE
028A RPTFLG EQU $028A ; KEY REPEAT FLAG
028D SHFLAG EQU $028D ; SHIFT KEY FLAG
028F KEYLOG EQU $028F ; VECTOR TO KEY-TABLE SETUP ROUTINE
0291 MODE EQU $0291 ; CHARSET MODE SWITCH
0314 CINV EQU $0314 ; SYSTEM 60HZ IRQ VECTOR
0316 CBINV EQU $0316 ; BRK INSTRUCTION VECTOR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 11
--- HARDWARE EQUATES: CBM64 ---
0318 NMINV EQU $0318 ; NMI INTERRUPT VECTOR
0340 SPRT13 EQU $0340 ; SPRITE #13 DATA
0380 SPRT14 EQU $0380 ; SPRITE #14 DATA
03C0 SPRT15 EQU $03C0 ; SPRITE #15 DATA
0340 CURSOR EQU SPRT13 ; CURSOR RAM
0400 SCREEN EQU $0400 ; SCREEN RAM
D800 COLRAM EQU $D800 ; COLOR RAM
07F8 SPT0 EQU $07F8 ; SPRITE #0 PNTR
07F9 SPT1 EQU $07F9 ; SPRITE #1 PNTR
07FA SPT2 EQU $07FA ; SPRITE #2 PNTR
07FB SPT3 EQU $07FB ; SPRITE #3 PNTR
07FC SPT4 EQU $07FC ; SPRITE #4 PNTR
07FD SPT5 EQU $07FD ; SPRITE #5 PNTR
07FE SPT6 EQU $07FE ; SPRITE #6 PNTR
07FF SPT7 EQU $07FF ; SPRITE #7 PNTR
0600 ; ------
0600 ; VIC-II
0600 ; ------
0600 ; SPRITE POSITION REGISTERS
D000 SP0X EQU $D000 ; SPRITE #0 X-POS
D001 SP0Y EQU $D001 ; SPRITE #0 Y-POS
D002 SP1X EQU $D002 ; SPRITE #1 X-POS
D003 SP1Y EQU $D003 ; SPRITE #1 Y-POS
D004 SP2X EQU $D004 ; SPRITE #2 X-POS
D005 SP2Y EQU $D005 ; SPRITE #2 Y-POS
D006 SP3X EQU $D006 ; SPRITE #3 X-POS
D007 SP3Y EQU $D007 ; SPRITE #3 Y-POS
D008 SP4X EQU $D008 ; SPRITE #4 X-POS
D009 SP4Y EQU $D009 ; SPRITE #4 Y-POS
D00A SP5X EQU $D00A ; SPRITE #5 X-POS
D00B SP5Y EQU $D00B ; SPRITE #5 Y-POS
D00C SP6X EQU $D00C ; SPRITE #6 X-POS
D00D SP6Y EQU $D00D ; SPRITE #6 Y-POS
D00E SP7X EQU $D00E ; SPRITE #7 X-POS
D00F SP7Y EQU $D00F ; SPRITE #7 Y-POS
D010 MSIGX EQU $D010 ; HIGH BITS OF SPRITE X-POSITIONS
0600 ; VARIOUS CONTROL REGISTERS
D011 SCROLY EQU $D011 ; Y-SCROLL & VIDEO CONTROL
D012 RASTER EQU $D012 ; RASTER COMPARE
D015 SPENA EQU $D015 ; SPRITE ENABLE
D016 SCROLX EQU $D016 ; X-SCROLL & VIDEO CONTROL
D017 YXPAND EQU $D017 ; SPRITE Y-EXPANSION
D018 VMCSB EQU $D018 ; MEMORY CONTROL
D019 VICIRQ EQU $D019 ; CHIP INTERRUPT FLAGS
D01A IRQMSK EQU $D01A ; IRQ MASKS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 12
--- HARDWARE EQUATES: CBM64 ---
D01B SPBGPR EQU $D01B ; SPRITE/FOREGROUND PRIORITY
D01C SPMC EQU $D01C ; MULTICOLOR SPRITE CONTROL
D01D XXPAND EQU $D01D ; SPRITE X-EXPANSION
0600 ; COLOR REGISTERS
D020 EXTCOL EQU $D020 ; BORDER COLOR
D021 BGCOLO EQU $D021 ; BACKGROUND COLOR
D027 SP0COL EQU $D027 ; SPRITE #0 COLOR
D028 SP1COL EQU $D028 ; SPRITE #1 COLOR
D029 SP2COL EQU $D029 ; SPRITE #2 COLOR
D02A SP3COL EQU $D02A ; SPRITE #3 COLOR
D02B SP4COL EQU $D02B ; SPRITE #4 COLOR
D02C SP5COL EQU $D02C ; SPRITE #5 COLOR
D02D SP6COL EQU $D02D ; SPRITE #6 COLOR
D02E SP7COL EQU $D02E ; SPRITE #7 COLOR
0600 ; ---
0600 ; SID
0600 ; ---
0600 ; VOICE #1 REGISTERS
D400 FRELO1 EQU $D400 ; FREQ
D401 FREHI1 EQU $D401 ; FREQ HIGH BIT
D402 PWLO1 EQU $D402 ; PULSE WIDTH
D403 PWHI1 EQU $D403 ; PULSE WIDTH HIGH NIBBLE
D404 VCREG1 EQU $D404 ; CONTROL
D405 ATDCY1 EQU $D405 ; ATTACK/DECAY
D406 SUREL1 EQU $D406 ; SUSTAIN/RELEASE
0600 ; VOICE #2 REGISTERS
D407 FRELO2 EQU $D407 ; FREQ
D408 FREHI2 EQU $D408 ; FREQ HIGH BIT
D409 PWLO2 EQU $D409 ; PULSE WIDTH
D40A PWHI2 EQU $D40A ; PULSE WIDTH HIGH NIBBLE
D40B VCREG2 EQU $D40B ; CONTROL
D40C ATDCY2 EQU $D40C ; ATTACK/DECAY
D40D SUREL2 EQU $D40D ; SUSTAIN/RELEASE
0600 ; VOICE #3 REGISTERS
D40E FRELO3 EQU $D40E ; FREQ
D40F FREHI3 EQU $D40F ; FREQ HIGH BIT
D410 PWLO3 EQU $D410 ; PULSE WIDTH
D411 PWHI3 EQU $D411 ; PULSE WIDTH HIGH NIBBLE
D412 VCREG3 EQU $D412 ; VOICE CONTROL
D413 ATDCY3 EQU $D413 ; ATTACK/DECAY
D414 SUREL3 EQU $D414 ; SUSTAIN/RELEASE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 13
--- HARDWARE EQUATES: CBM64 ---
0600 ; MISCELLANEOUS REGISTERS
D415 CUTLO EQU $D415 ; FILTER CUTOFF, LOW BITS
D416 CUTHI EQU $D416 ; FILTER CUTOFF, HIGH BYTE
D417 RESON EQU $D417 ; RESONANCE CONTROL
D418 SIGVOL EQU $D418 ; VOLUME/FILTER CONTROL
D41B RAND EQU $D41B ; RANDOM NUMBER
DD00 CI2PRA EQU $DD00 ; DATA PORT A
0600 ; -------------------
0600 ; KERNAL JUMP VECTORS
0600 ; -------------------
FFC6 CHKIN EQU $FFC6 ; OPEN CHANNEL FOR INPUT
FFC9 CHKOUT EQU $FFC9 ; OPEN CHANNEL FOR OUTPUT
FFCF CHRIN EQU $FFCF ; INPUT CHARACTER FROM CHANNEL
FFD2 CHROUT EQU $FFD2 ; OUTPUT CHARACTER TO CHANNEL
FF81 CINT EQU $FF81 ; INIT SCREEN EDITOR
FFE7 CLALL EQU $FFE7 ; CLOSE ALL CHANNELS & FILES
FFC3 CLOSE EQU $FFC3 ; CLOSE A FILE
FFCC CLRCHN EQU $FFCC ; CLEAR CHANNEL
FFE4 GETIN EQU $FFE4 ; GET CHAR FROM KEYBOARD QUEUE
FF84 IOINIT EQU $FF84 ; INIT I/O
FFC0 OPEN EQU $FFC0 ; OPEN A FILE
FFF0 PLOT EQU $FFF0 ; READ/SET CURSOR POSITION
FF87 RAMTAS EQU $FF87 ; INIT RAM
FFB7 READST EQU $FFB7 ; READ I/O STATUS
FF9F SCNKEY EQU $FF9F ; SCAN KEYBOARD
FFBA SETLFS EQU $FFBA ; SET FILE ATTRIBUTES
FF90 SETMSG EQU $FF90 ; SET KERNAL MESSAGES
FFBD SETNAM EQU $FFBD ; SET FILENAME
END
INCLUD COLD.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 14
--- MACHINE COLDSTART: CBM64 ---
0E00 ORG ZIP
0E00 ; ---------
0E00 ; COLDSTART
0E00 ; ---------
0E00 A501 COLD: LDA R6510
0E02 29FE AND #%11111110 ; SWITCH OUT BASIC ROM
0E04 8501 STA R6510 ; KERNAL ROM & I/O ENABLED
0E06 A901 LDA #1 ; WHITE
0E08 8D8602 STA COLOR ; TEXT
0E0B A90C LDA #12 ; GRAY
0E0D 8D20D0 STA EXTCOL ; BORDER
0E10 8D21D0 STA BGCOLO ; AND BACKGROUND
0E13 A90E LDA #$0E
0E15 20D2FF JSR CHROUT ; USE UPPER/LOWER CHARS
0E18 A980 LDA #$80 ; PROHIBIT FURTHER
0E1A 8D9102 STA MODE ; CHARSET CHANGES
0E1D A900 LDA #0
0E1F 859D STA MSGFLG ; DISABLE KERNAL MESSAGES
0E21 8D0322 STA SFLAG ; NO PREVIOUS SCRIPTING (BM 5/14/85)
0E24 ; INITIALIZE THE SOUND SYSTEM
0E24 A21C LDX #$1C ; CLEAR
0E26 A900 LDA #0 ; ALL
0E28 9D00D4 CLD0: STA FRELO1,X ; SID REGISTERS
0E2B CA DEX
0E2C 10FA BPL CLD0
0E2E A902 LDA #2 ; SET VOICE #1
0E30 8D02D4 STA PWLO1 ; PULSE WIDTH
0E33 A908 LDA #8 ; FOR A
0E35 8D03D4 STA PWHI1 ; 50% DUTY CYCLE
0E38 A980 LDA #%10000000 ; DISABLE OUTPUT
0E3A 8D18D4 STA SIGVOL ; FROM VOICE #3
0E3D A9EE LDA #$EE
0E3F 8D0ED4 STA FRELO3 ; SET VOICE #3 TO
0E42 8D0FD4 STA FREHI3 ; AN AMUSING FREQUENCY
0E45 A980 LDA #%10000000 ; SPECIFY NOISY WAVEFORM
0E47 8D12D4 STA VCREG3 ; FOR RANDOMNESS
0E4A ; INITIALIZE THE SPRITE CURSOR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 15
--- MACHINE COLDSTART: CBM64 ---
0E4A A23F LDX #63 ; CLEAR SPRITE #13 RAM
0E4C A900 LDA #0
0E4E 9D4003 CN0: STA CURSOR,X
0E51 CA DEX
0E52 10FA BPL CN0
0E54 8D1DD0 STA XXPAND ; NORMAL HORIZONTAL
0E57 8D17D0 STA YXPAND ; AND VERTICAL SPRITE SIZE
0E5A 8D1BD0 STA SPBGPR ; MAXIMUM SPRITE PRIORITY
0E5D 8D1CD0 STA SPMC ; HI-RES SPRITES
0E60 8D27D0 STA SP0COL ; BLACK CURSOR
0E63 4C7F0E JMP WARM1
0E66 ; ---------------
0E66 ; WARMSTART ENTRY
0E66 ; ---------------
0E66 54686520 SLOAD: DB "The story is loading ..."
0E7E 0D DB EOL
0019 SLOADL EQU $-SLOAD
0E7F D8 WARM1: CLD
0E80 A2FF LDX #$FF
0E82 9A TXS ; RESET MACHINE STACK
0E83 20E7FF JSR CLALL ; CLOSE EVERYTHING
0E86 200E23 JSR CLS ; CLEAR SCREEN, ETC.
0E89 A008 LDY #8 ; POSITION "STORY LOADING" MESSAGE
0E8B A20B LDX #11 ; AT (8,11)
0E8D 18 CLC
0E8E 20F0FF JSR PLOT
0E91 A266 LDX #LOW SLOAD
0E93 A90E LDA #HIGH SLOAD
0E95 A019 LDY #SLOADL
0E97 20F021 JSR DLINE ; "THE STORY IS LOADING ..."
0E9A A908 LDA #8 ; MAKE BOOT DRIVE
0E9C 209D27 JSR DOPEN ; AND OPEN IT
0E9F A502 LDA FAST ; FAST DISK?
0EA1 F003 BEQ WARM2 ; NO, CONTINUE
0EA3 20C128 JSR FINIT ; ELSE INIT FAST DISK
0EA6 ; FALL THROUGH TO ZIP WARMSTART AT "WARM2"
END
INCLUD WARM.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 16
--- WARMSTART ROUTINE ---
0EA6 ; -------------
0EA6 ; ZIP WARMSTART
0EA6 ; -------------
0EA6 A900 WARM2: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
0EA8 A203 LDX #ZEROPG
0EAA 9500 ST0: STA 0,X
0EAC E8 INX
0EAD E08F CPX #ZPGTOP
0EAF 90F9 BCC ST0
0EB1 ; INIT THE PAGING TABLES
0EB1 AA TAX ; = 0
0EB2 A9FF LDA #$FF
0EB4 9D000B ST1A: STA PTABL,X
0EB7 9DA00B STA PTABH,X
0EBA E8 INX
0EBB E0A0 CPX #$A0
0EBD 90F5 BCC ST1A
0EBF ; INIT THE TIMESTAMP MAP (BM 11/24/84)\
0EBF A900 LDA #0
0EC1 AA TAX
0EC2 9D500C ST1B: STA LRUMAP,X
0EC5 E8 INX
0EC6 E0A0 CPX #$A0
0EC8 90F8 BCC ST1B
0ECA E617 INC ZSP ; INIT Z-STACK POINTERS
0ECC E618 INC OLDZSP ; TO "1"
0ECE E62D INC STAMP ; INIT TIMESTAMP (BM 11/24/84)
0ED0 ; GRAB THE FIRST BLOCK OF PRELOAD
0ED0 A92A LDA #HIGH ZBEGIN ; MSB OF PRELOAD START ADDRESS
0ED2 8526 STA ZCODE ; FREEZE IT HERE
0ED4 8573 STA DBUFF+HI ; LSB IS ALWAYS ZERO
0ED6 208A23 JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0
0ED9 ; EXTRACT GAME DATA FROM Z-CODE HEADER
0ED9 AE042A LDX ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER
0EDC E8 INX ; ADD 1 TO GET
0EDD 8627 STX ZPURE ; 1ST "PURE" PAGE OF Z-CODE
0EDF 8A TXA ; ADD START PAGE OF PRELOAD
0EE0 18 CLC ; TO CALC ABSOLUTE START ADDRESS
0EE1 6526 ADC ZCODE ; OF PAGING SPACE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 17
--- WARMSTART ROUTINE ---
0EE3 8528 STA PAGE0
0EE5 203B1E JSR MEMTOP ; RETURNS TOP RAM PAGE IN [A]
0EE8 38 SEC
0EE9 E528 SBC PAGE0 ; SUBTRACT ADDRESS OF PAGING SPACE
0EEB F002 BEQ NORAM
0EED B005 BCS SETNP ; ERROR IF NOT ENOUGH RAM
0EEF ; *** ERROR #0 -- INSUFFICIENT RAM ***
0EEF A900 NORAM: LDA #0
0EF1 4CC41D JMP ZERROR
0EF4 C9A0 SETNP: CMP #$A0 ; DON'T ALLOW MORE THAN $A0 PAGES
0EF6 9002 BCC SETA0
0EF8 A9A0 LDA #$A0
0EFA 8529 SETA0: STA PMAX ; SET # SWAPPING PAGES
0EFC AD012A LDA ZBEGIN+ZMODE
0EFF 0920 ORA #%00100000 ; ENABLE SPLIT-SCREEN
0F01 8D012A STA ZBEGIN+ZMODE
0F04 2902 AND #%00000010 ; ISOLATE STATUS-FORMAT BIT
0F06 855F STA TIMEFL ; 0=SCORE, NZ=TIME
0F08 AD0C2A LDA ZBEGIN+ZGLOBA ; GET MSB OF GLOBAL TABLE ADDR
0F0B 18 CLC ; CONVERT TO
0F0C 6526 ADC ZCODE ; ABSOLUTE ADDRESS
0F0E 8530 STA GLOBAL+HI
0F10 AD0D2A LDA ZBEGIN+ZGLOBA+1 ; LSB NEEDN'T CHANGE
0F13 852F STA GLOBAL+LO
0F15 AD182A LDA ZBEGIN+ZFWORD ; DO SAME FOR FWORDS TABLE
0F18 18 CLC
0F19 6526 ADC ZCODE
0F1B 8534 STA FWORDS+HI
0F1D AD192A LDA ZBEGIN+ZFWORD+1 ; NO CHANGE FOR LSB
0F20 8533 STA FWORDS+LO
0F22 AD082A LDA ZBEGIN+ZVOCAB ; NOW DO VOCABULARY TABLE
0F25 18 CLC
0F26 6526 ADC ZCODE
0F28 8532 STA VOCAB+HI
0F2A AD092A LDA ZBEGIN+ZVOCAB+1 ; LSB SAME
0F2D 8531 STA VOCAB+LO
0F2F AD0A2A LDA ZBEGIN+ZOBJEC ; NOT TO MENTION
0F32 18 CLC ; THE OBJECT TABLE
0F33 6526 ADC ZCODE
0F35 8536 STA OBJTAB+HI
0F37 AD0B2A LDA ZBEGIN+ZOBJEC+1 ; LSB SAME
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 18
--- WARMSTART ROUTINE ---
0F3A 8535 STA OBJTAB+LO
0F3C ; FETCH THE REST OF THE PRELOAD
0F3C A570 LDPRE: LDA DBLOCK+LO ; CHECK CURRENT BLOCK #
0F3E C527 CMP ZPURE ; LOADED LAST PRELOAD PAGE YET?
0F40 B006 BCS WARMEX ; YES, TIME TO PLAY!
0F42 208A23 JSR GETDSK ; ELSE GRAB NEXT Z-BLOCK
0F45 4C3C0F JMP LDPRE
0F48 AD062A WARMEX: LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE
0F4B 851A STA ZPCM ; MSB
0F4D AD072A LDA ZBEGIN+ZGO+1 ; AND LSB
0F50 8519 STA ZPCL ; HIGH BIT ALREADY ZEROED
0F52 E662 INC SCRIPT ; ENABLE SCRIPTING
0F54 AD112A LDA ZBEGIN+ZSCRIP+1 ; STUFF IN THE
0F57 0D0322 ORA SFLAG ; PREVIOUS SCRIPT MODE
0F5A 8D112A STA ZBEGIN+ZSCRIP+1 ; (BM 5/14/85)
0F5D 200E23 JSR CLS ; CLEAR SCREEN, DISABLE SPLIT
0F60 ; ... AND FALL INTO MAIN LOOP
END
INCLUD MAIN.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 19
--- MAIN LOOP ---
0F60 A900 MLOOP: LDA #0
0F62 8504 STA NARGS ; RESET # ARGUMENTS
0F64 20E419 JSR NEXTPC ; GET NEXT INSTRUCTION INTO [A]
0F67 8503 STA OPCODE ; SAVE IT HERE
0F69 IF DEBUG
0F69 STA MBYTE
0F69 LDA #0 ; BREAKPOINT #0
0F69 JSR DOBUG
0F69 LDA MBYTE
0F69 ENDIF
0F69 ; DECODE AN OPCODE
0F69 AA TAX ; SET FLAGS
0F6A 3003 BMI DC0 ; IF POSITIVE,
0F6C 4C2A10 JMP OP2 ; IT'S A 2-OP
0F6F C9B0 DC0: CMP #$B0
0F71 B003 BCS DC1
0F73 4CFB0F JMP OP1 ; OR MAYBE A 1-OP
0F76 C9C0 DC1: CMP #$C0
0F78 B003 BCS OPEXT
0F7A 4CEC0F JMP OP0 ; PERHAPS A 0-OP
0F7D ; --------------
0F7D ; HANDLE AN X-OP
0F7D ; --------------
0F7D 20E419 OPEXT: JSR NEXTPC ; GRAB THE ARGUMENT ID BYTE
0F80 850D STA ABYTE ; HOLD IT HERE
0F82 A200 LDX #0
0F84 860E STX ADEX ; INIT ARGUMENT INDEX
0F86 F006 BEQ OPX1 ; JUMP TO TOP OF LOOP
0F88 A50D OPX0: LDA ABYTE ; GET ARG BYTE
0F8A 0A ASL A ; SHIFT NEXT 2 ARG BITS
0F8B 0A ASL A ; INTO BITS 7 & 6
0F8C 850D STA ABYTE ; HOLD FOR LATER
0F8E 29C0 OPX1: AND #%11000000 ; MASK OUT GARBAGE BITS
0F90 D006 BNE OPX2
0F92 207610 JSR GETLNG ; 00 = LONG IMMEDIATE
0F95 4CA90F JMP OPXNXT
0F98 C940 OPX2: CMP #%01000000 ; IS IT A SHORT IMMEDIATE?
0F9A D006 BNE OPX3 ; NO, KEEP GUESSING
0F9C 207210 JSR GETSHT ; 01 = SHORT IMMEDIATE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 20
--- MAIN LOOP ---
0F9F 4CA90F JMP OPXNXT
0FA2 C980 OPX3: CMP #%10000000 ; LAST TEST
0FA4 D017 BNE OPX4 ; 11 = NO MORE ARGUMENTS
0FA6 208A10 JSR GETVAR ; 10 = VARIABLE
0FA9 A60E OPXNXT: LDX ADEX ; RETRIEVE ARGUMENT INDEX
0FAB A50F LDA VALUE+LO ; GRAB LSB OF VALUE
0FAD 9505 STA ARG1+LO,X ; STORE IN ARGUMENT TABLE
0FAF A510 LDA VALUE+HI ; GRAB MSB OF VALUE
0FB1 9506 STA ARG1+HI,X ; STORE THAT, TOO
0FB3 E604 INC NARGS ; UPDATE ARGUMENT COUNTER
0FB5 E8 INX
0FB6 E8 INX
0FB7 860E STX ADEX ; UPDATE INDEX
0FB9 E008 CPX #8 ; DONE 4 ARGUMENTS YET?
0FBB 90CB BCC OPX0 ; NO, GET SOME MORE
0FBD ; ALL X-OP ARGUMENTS READY
0FBD A503 OPX4: LDA OPCODE ; IS THIS
0FBF C9E0 CMP #$E0 ; AN EXTENDED 2-OP?
0FC1 B003 BCS DOXOP ; NO, IT'S A REAL X-OP
0FC3 4C5310 JMP OP2EX ; ELSE TREAT IT LIKE A 2-OP
0FC6 A234 DOXOP: LDX #LOW OPTX ; GET ADDR OF X-OP TABLE
0FC8 A012 LDY #HIGH OPTX ; INTO [X/Y]
0FCA 291F AND #%00011111 ; ISOLATE OP ID BITS
0FCC C90C CMP #NOPSX ; IS IT A LEGAL X-OP?
0FCE 9005 BCC DODIS ; YUP; TIME TO DISPATCH IT
0FD0 ; *** ERROR #1 -- ILLEGAL X-OP ***
0FD0 A901 LDA #1
0FD2 4CC41D JMP ZERROR
0FD5 ; ---------------
0FD5 ; OPCODE DISPATCH
0FD5 ; ---------------
0FD5 ; ENTRY: MASKED OPCODE INDEX IN [A]
0FD5 ; OP-TABLE ADDR IN X/Y (LSB/MSB)
0FD5 8611 DODIS: STX I+LO ; SAVE TABLE ADDRESS
0FD7 8412 STY I+HI ; IN A POINTER
0FD9 0A ASL A ; WORD-ALIGN THE OP INDEX
0FDA A8 TAY
0FDB B111 LDA (I),Y ; GET LSB OF DISPATCH ADDRESS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 21
--- MAIN LOOP ---
0FDD 8DE70F STA GO+LO ; INSTALL AS JSR OPERAND
0FE0 C8 INY
0FE1 B111 LDA (I),Y ; SAME WITH MSB
0FE3 8DE80F STA GO+HI
0FE6 20 DB $20 ; 6502 "JSR" OPCODE
0FE7 0000 GO: DW $0000 ; DUMMY OPERAND BYTES
0FE9 4C600F JMP MLOOP ; GO BACK FOR ANOTHER OPCODE
0FEC ; -------------
0FEC ; HANDLE A 0-OP
0FEC ; -------------
0FEC A2C6 OP0: LDX #LOW OPT0 ; GET 0-OP TABLE ADDR
0FEE A011 LDY #HIGH OPT0 ; INTO [X/Y]
0FF0 290F AND #%00001111 ; ISOLATE 0-OP ID BITS
0FF2 C90E CMP #NOPS0 ; OUT OF RANGE?
0FF4 90DF BCC DODIS ; NO, DISPATCH IT
0FF6 ; *** ERROR #2 -- ILLEGAL 0-OP ***
0FF6 A902 LDA #2
0FF8 4CC41D JMP ZERROR
0FFB ; -------------
0FFB ; HANDLE A 1-OP
0FFB ; -------------
0FFB 2930 OP1: AND #%00110000 ; ISOLATE ARGUMENT BITS
0FFD D006 BNE OP1A
0FFF 207610 JSR GETLNG ; 00 = LONG IMMEDIATE
1002 4C1610 JMP OP1EX
1005 C910 OP1A: CMP #%00010000 ; TEST AGAIN
1007 D006 BNE OP1B
1009 207210 JSR GETSHT ; 01 = SHORT IMMEDIATE
100C 4C1610 JMP OP1EX
100F C920 OP1B: CMP #%00100000 ; ONE MORE TEST
1011 D012 BNE BADOP1 ; UNDEFINED STATE!
1013 208A10 JSR GETVAR ; 10 = VARIABLE
1016 206710 OP1EX: JSR V2A1 ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS]
1019 A2E2 LDX #LOW OPT1 ; GET ADDR OF 1-OP TABLE
101B A011 LDY #HIGH OPT1 ; INTO [X/Y]
101D A503 LDA OPCODE ; RESTORE OPCODE
101F 290F AND #%00001111 ; ISOLATE OP ID BITS
1021 C910 CMP #NOPS1 ; IF WITHIN RANGE,
1023 90B0 BCC DODIS ; EXECUTE THE 1-OP
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 22
--- MAIN LOOP ---
1025 ; *** ERROR #3 -- ILLEGAL 1-OP ***
1025 A903 BADOP1: LDA #3
1027 4CC41D JMP ZERROR
102A ; -------------
102A ; HANDLE A 2-OP
102A ; -------------
102A 2940 OP2: AND #%01000000 ; ISOLATE 1ST ARG BIT
102C D006 BNE OP2A
102E 207210 JSR GETSHT ; 0 = SHORT IMMEDIATE
1031 4C3710 JMP OP2B
1034 208A10 OP2A: JSR GETVAR ; 1 = VARIABLE
1037 206710 OP2B: JSR V2A1 ; [VALUE] TO [ARG1], UPDATE [NARGS]
103A A503 LDA OPCODE ; RESTORE OPCODE BYTE
103C 2920 AND #%00100000 ; ISOLATE 2ND ARG BIT
103E D006 BNE OP2C
1040 207210 JSR GETSHT ; 0 = SHORT IMMEDIATE
1043 4C4910 JMP OP2D
1046 208A10 OP2C: JSR GETVAR ; 1 = VARIABLE
1049 A50F OP2D: LDA VALUE+LO ; MOVE 2ND [VALUE]
104B 8507 STA ARG2+LO ; INTO [ARG2]
104D A510 LDA VALUE+HI
104F 8508 STA ARG2+HI
1051 E604 INC NARGS ; UPDATE ARGUMENT COUNT
1053 ; EXECUTE A 2-OP OR EXTENDED 2-OP
1053 A202 OP2EX: LDX #LOW OPT2 ; LSB OF DISPATCH TABLE
1055 A012 LDY #HIGH OPT2 ; MSB
1057 A503 LDA OPCODE ; RESTORE OPCODE BYTE
1059 291F AND #%00011111 ; ISOLATE OP ID BITS
105B C919 CMP #NOPS2
105D B003 BCS BADOP2 ; ERROR IF OUT OF RANGE
105F 4CD50F JMP DODIS ; ELSE DISPATCH
1062 ; *** ERROR #4 -- ILLEGAL 2-OP ****
1062 A904 BADOP2: LDA #4
1064 4CC41D JMP ZERROR
1067 ; --------------------------------------
1067 ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS]
1067 ; --------------------------------------
1067 A50F V2A1: LDA VALUE+LO
1069 8505 STA ARG1+LO
106B A510 LDA VALUE+HI
106D 8506 STA ARG1+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 23
--- MAIN LOOP ---
106F E604 INC NARGS
1071 60 RTS
END
INCLUD SUBS.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 24
--- OPCODE SUPPORT SUBROUTINES ---
1072 ; -----------------------
1072 ; FETCH A SHORT IMMEDIATE
1072 ; -----------------------
1072 A900 GETSHT: LDA #0 ; MSB IS ZERO
1074 F003 BEQ GETV ; FETCH LSB FROM Z-CODE
1076 ; ----------------------
1076 ; FETCH A LONG IMMEDIATE
1076 ; ----------------------
1076 20E419 GETLNG: JSR NEXTPC ; GRAB MSB
1079 8510 GETV: STA VALUE+HI
107B 20E419 JSR NEXTPC ; GRAB LSB
107E 850F STA VALUE+LO
1080 60 RTS
1081 ; ----------------
1081 ; FETCH A VARIABLE
1081 ; ----------------
1081 ; FROM INSIDE AN OPCODE (VARIABLE ID IN [A])
1081 AA VARGET: TAX ; IF NON-ZERO,
1082 D00B BNE GETVR1 ; ACCESS A VARIABLE
1084 20B010 JSR POPVAL ; ELSE PULL VAR OFF Z-STACK
1087 4CC610 JMP PSHVAL ; WITHOUT ALTERING STACK
108A ; FROM THE MAIN LOOP (VARIABLE ID IN Z-CODE)
108A 20E419 GETVAR: JSR NEXTPC ; GRAB VAR-TYPE BYTE
108D F021 BEQ POPVAL ; VALUE IS ON Z-STACK
108F ; IS VARIABLE LOCAL OR GLOBAL?
108F C910 GETVR1: CMP #$10 ; IF >= 16,
1091 B010 BCS GETVRG ; IT'S GLOBAL
1093 ; HANDLE A LOCAL VARIABLE
1093 38 GETVRL: SEC
1094 E901 SBC #1 ; FORM A ZERO-ALIGNED
1096 0A ASL A ; WORD INDEX
1097 AA TAX ; INTO THE [LOCALS] TABLE
1098 BD000D LDA LOCALS+LO,X ; GRAB LSB
109B 850F STA VALUE+LO
109D BD010D LDA LOCALS+HI,X ; AND MSB
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 25
--- OPCODE SUPPORT SUBROUTINES ---
10A0 8510 STA VALUE+HI
10A2 60 RTS
10A3 ; HANDLE A GLOBAL VARIABLE
10A3 201411 GETVRG: JSR GVCALC ; GET ADDRESS OF GLOBAL INTO [I]
10A6 B111 LDA (I),Y ; MSB OF GLOBAL ([Y] = 0)
10A8 8510 STA VALUE+HI
10AA C8 INY ; = 1
10AB B111 LDA (I),Y ; LSB OF GLOBAL
10AD 850F STA VALUE+LO ; SAVE IT
10AF 60 RTS ; AND WE'RE DONE
10B0 ; ----------------------------------
10B0 ; POP Z-STACK INTO [VALUE] AND [X/A]
10B0 ; ----------------------------------
10B0 C617 POPVAL: DEC ZSP
10B2 F00D BEQ UNDER ; UNDERFLOW IF ZERO!
10B4 A417 LDY ZSP ; READ STACK POINTER
10B6 BE0009 LDX ZSTAKL,Y ; GRAB LSB OF STACK VALUE
10B9 860F STX VALUE+LO ; GIVE TO [VALUE]
10BB B9000A LDA ZSTAKH,Y ; ALSO GRAB MSB
10BE 8510 STA VALUE+HI ; A SIMILAR FATE
10C0 60 RTS
10C1 ; *** ERROR #5 -- Z-STACK UNDERFLOW ***
10C1 A905 UNDER: LDA #5
10C3 4CC41D JMP ZERROR
10C6 ; -----------------------
10C6 ; PUSH [VALUE] TO Z-STACK
10C6 ; -----------------------
10C6 A60F PSHVAL: LDX VALUE+LO
10C8 A510 LDA VALUE+HI
10CA ; ---------------------
10CA ; PUSH [X/A] TO Z-STACK
10CA ; ---------------------
10CA A417 PUSHXA: LDY ZSP ; READ STACK POINTER
10CC 99000A STA ZSTAKH,Y ; PUSH MSB IN [A]
10CF 8A TXA
10D0 990009 STA ZSTAKL,Y ; AND LSB IN [X]
10D3 E617 INC ZSP ; UPDATE Z-STACK POINTER
10D5 F001 BEQ OVER ; OVERFLOW IF ZEROED!
10D7 60 RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 26
--- OPCODE SUPPORT SUBROUTINES ---
10D8 ; *** ERROR #6 -- Z-STACK OVERFLOW ***
10D8 A906 OVER: LDA #6
10DA 4CC41D JMP ZERROR
10DD ; --------------
10DD ; RETURN A VALUE
10DD ; --------------
10DD ; FROM WITHIN AN OPCODE (VARIABLE ID IN [A])
10DD AA VARPUT: TAX ; IF ZERO,
10DE D013 BNE PUTVR1
10E0 C617 DEC ZSP ; FLUSH TOP WORD OFF STACK
10E2 D0E2 BNE PSHVAL ; AND REPLACE WITH [VALUE]
10E4 F0DB BEQ UNDER ; ERROR IF [ZSP] BECAME ZERO!
10E6 ; RETURN A ZERO
10E6 A900 RET0: LDA #0
10E8 ; RETURN BYTE IN [A]
10E8 850F PUTBYT: STA VALUE+LO
10EA A900 LDA #0
10EC 8510 STA VALUE+HI ; CLEAR MSB
10EE ; RETURN [VALUE]
10EE 20E419 PUTVAL: JSR NEXTPC ; GET VARIABLE ID BYTE
10F1 F0D3 BEQ PSHVAL ; [VALUE] GOES TO Z-STACK
10F3 ; LOCAL OR GLOBAL VARIABLE?
10F3 C910 PUTVR1: CMP #$10 ; IF >= 16,
10F5 B010 BCS PUTVLG ; IT'S GLOBAL
10F7 ; PUT A LOCAL VARIABLE
10F7 38 PUTVLL: SEC
10F8 E901 SBC #1 ; FORM A ZERO-ALIGNED
10FA 0A ASL A ; WORD INDEX
10FB AA TAX ; INTO THE [LOCALS] TABLE
10FC A50F LDA VALUE+LO ; GRAB LSB
10FE 9D000D STA LOCALS+LO,X ; SAVE IN LOCAL TABLE
1101 A510 LDA VALUE+HI ; DO SAME TO
1103 9D010D STA LOCALS+HI,X ; MSB
1106 60 RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 27
--- OPCODE SUPPORT SUBROUTINES ---
1107 ; RETURN A GLOBAL VARIABLE
1107 201411 PUTVLG: JSR GVCALC
110A A510 LDA VALUE+HI ; GET MSB
110C 9111 STA (I),Y ; STORE AS 1ST BYTE ([Y] = 0)
110E C8 INY ; = 1
110F A50F LDA VALUE+LO ; NOW GET LSB
1111 9111 STA (I),Y ; STORE AS 2ND BYTE
1113 60 RTS
1114 ; -----------------------
1114 ; CALC GLOBAL WORD OFFSET
1114 ; -----------------------
1114 ; ENTRY: VAR-ID BYTE (16-255) IN [A]
1114 ; EXIT: ABSOLUTE ADDRESS OF GLOBAL VAR IN [I]
1114 ; [Y] = 0 FOR INDEXING
1114 38 GVCALC: SEC
1115 E910 SBC #$10 ; FORM A ZERO-ALIGNED INDEX
1117 A000 LDY #0 ; MAKE SURE MSB OF OFFSET AND [Y]
1119 8412 STY I+HI ; ARE CLEARED
111B 0A ASL A ; MULTIPLY OFFSET BY 2
111C 2612 ROL I+HI ; TO WORD-ALIGN IT
111E 18 CLC ; ADD OFFSET TO ADDR OF GLOBAL TABLE
111F 652F ADC GLOBAL+LO ; TO FORM THE ABSOLUTE
1121 8511 STA I+LO ; ADDRESS OF THE
1123 A512 LDA I+HI ; DESIRED GLOBAL VARIABLE
1125 6530 ADC GLOBAL+HI ; STORE ADDRESS BACK IN [VAL]
1127 8512 STA I+HI ; AS A POINTER
1129 60 WCEX: RTS
112A ; ---------------
112A ; PREDICATE FAILS
112A ; ---------------
112A 20E419 PREDF: JSR NEXTPC ; GET 1ST BRANCH BYTE
112D 100C BPL PREDB ; DO BRANCH IF BIT 7 OFF
112F ; -----------------------
112F ; IGNORE PREDICATE BRANCH
112F ; -----------------------
112F ; ENTRY: 1ST BRANCH BYTE IN [A]
112F 2940 PREDNB: AND #%01000000 ; TEST BIT 6
1131 D0F6 BNE WCEX ; SHORT BRANCH IF SET
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 28
--- OPCODE SUPPORT SUBROUTINES ---
1133 4CE419 JMP NEXTPC ; ELSE SKIP OVER 2ND BRANCH BYTE
1136 ; ------------------
1136 ; PREDICATE SUCCEEDS
1136 ; ------------------
1136 20E419 PREDS: JSR NEXTPC ; GET 1ST BRANCH BYTE
1139 10F4 BPL PREDNB ; DON'T BRANCH IF BIT 7 CLEAR
113B ; --------------------------
113B ; PERFORM A PREDICATE BRANCH
113B ; --------------------------
113B ; ENTRY: 1ST PRED BYTE IN [A]
113B AA PREDB: TAX ; SAVE HERE
113C 2940 AND #%01000000 ; LONG OR SHORT BRANCH?
113E F00B BEQ PREDLB ; LONG IF BIT 6 IS CLEAR
1140 ; HANDLE A SHORT BRANCH
1140 8A TXA ; RESTORE PRED BYTE
1141 293F AND #%00111111 ; FORM SHORT OFFSET
1143 850F STA VALUE+LO ; USE AS LSB OF BRANCH OFFSET
1145 A900 LDA #0
1147 8510 STA VALUE+HI ; MSB OF OFFSET IS ZERO
1149 F013 BEQ PREDB1 ; DO THE BRANCH
114B ; HANDLE A LONG BRANCH
114B 8A PREDLB: TXA ; RESTORE 1ST PRED BYTE
114C 293F AND #%00111111 ; FORM MSB OF OFFSET
114E AA TAX ; SAVE HERE FOR REFERENCE
114F 2920 AND #%00100000 ; CHECK SIGN OF 14-BIT VALUE
1151 F004 BEQ DOB2 ; POSITIVE IF ZERO, SO USE [X]
1153 8A TXA ; ELSE RESTORE BYTE
1154 09E0 ORA #%11100000 ; EXTEND THE SIGN BIT
1156 AA TAX ; BACK HERE FOR STORAGE
1157 8610 DOB2: STX VALUE+HI
1159 20E419 JSR NEXTPC ; FETCH LSB OF 14-BIT OFFSET
115C 850F STA VALUE+LO
115E ; BRANCH TO Z-ADDRESS IN [VALUE]
115E A510 PREDB1: LDA VALUE+HI ; CHECK MSB OF OFFSET
1160 D00E BNE PREDB3 ; DO BRANCH IF NZ
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 29
--- OPCODE SUPPORT SUBROUTINES ---
1162 A50F LDA VALUE+LO ; IF LSB IS NON-ZERO,
1164 D003 BNE PREDB2 ; MAKE SURE IT ISN'T 1
1166 4C5712 JMP ZRFALS ; ELSE DO AN "RFALSE"
1169 C901 PREDB2: CMP #1 ; IF OFFSET = 1
116B D003 BNE PREDB3
116D 4C4C12 JMP ZRTRUE ; DO AN "RTRUE"
1170 ; ENTRY POINT FOR "JUMP"
1170 20AA11 PREDB3: JSR DECVAL ; SUBTRACT 2 FROM THE OFFSET
1173 20AA11 JSR DECVAL ; IN [VALUE]
1176 A900 LDA #0 ; CLEAR THE MSB
1178 8512 STA I+HI ; OF [I]
117A A510 LDA VALUE+HI ; MAKE MSB OF OFFSET
117C 8511 STA I+LO ; THE LSB OF [I]
117E 0A ASL A ; EXTEND THE SIGN OF OFFSET
117F 2612 ROL I+HI ; INTO MSB OF [I]
1181 A50F LDA VALUE+LO ; GET LSB OF OFFSET
1183 18 CLC
1184 6519 ADC ZPCL ; ADD LOW 8 BITS OF ZPC
1186 9006 BCC PREDB5 ; IF OVERFLOWED,
1188 E611 INC I+LO ; UPDATE UPPER 9 BITS
118A D002 BNE PREDB5
118C E612 INC I+HI
118E 8519 PREDB5: STA ZPCL ; UPDATE ZPC
1190 A511 LDA I+LO ; IF UPPER 9 BITS ARE ZERO,
1192 0512 ORA I+HI ; NO NEED TO CHANGE PAGES
1194 F013 BEQ ZNOOP
1196 A511 LDA I+LO ; ELSE CALC NEW UPPER BITS
1198 18 CLC
1199 651A ADC ZPCM
119B 851A STA ZPCM
119D A512 LDA I+HI
119F 651B ADC ZPCH
11A1 2901 AND #%00000001 ; USE ONLY BIT 0
11A3 851B STA ZPCH
11A5 A900 LDA #0
11A7 851C STA ZPCFLG ; [ZPC] NO LONGER VALID
11A9 ; FALL THROUGH ...
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 30
--- OPCODE SUPPORT SUBROUTINES ---
11A9 ; ----
11A9 ; NOOP
11A9 ; ----
11A9 60 ZNOOP: RTS
11AA ; -----------------
11AA ; DECREMENT [VALUE]
11AA ; -----------------
11AA A50F DECVAL: LDA VALUE+LO
11AC 38 SEC
11AD E901 SBC #1
11AF 850F STA VALUE+LO
11B1 B002 BCS DVX
11B3 C610 DEC VALUE+HI
11B5 60 DVX: RTS
11B6 ; -----------------
11B6 ; INCREMENT [VALUE]
11B6 ; -----------------
11B6 E60F INCVAL: INC VALUE+LO
11B8 D002 BNE IVX
11BA E610 INC VALUE+HI
11BC 60 IVX: RTS
11BD ; ----------------------
11BD ; MOVE [ARG1] TO [VALUE]
11BD ; ----------------------
11BD A505 A12VAL: LDA ARG1+LO
11BF 850F STA VALUE+LO
11C1 A506 LDA ARG1+HI
11C3 8510 STA VALUE+HI
11C5 60 RTS
END
INCLUD DISPATCH.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 31
--- OPCODE DISPATCH TABLES ---
11C6 ; 0-OPS
11C6 4C12 OPT0: DW ZRTRUE ; 0
11C8 5712 DW ZRFALS ; 1
11CA 5B12 DW ZPRI ; 2
11CC 7812 DW ZPRR ; 3
11CE A911 DW ZNOOP ; 4
11D0 6426 DW ZSAVE ; 5
11D2 FF26 DW ZREST ; 6
11D4 091E DW ZSTART ; 7
11D6 8112 DW ZRSTAK ; 8
11D8 B010 DW POPVAL ; 9
11DA E51D DW ZQUIT ; 10
11DC 831E DW ZCRLF ; 11
11DE 081F DW ZUSL ; 12
11E0 8712 DW ZVER ; 13
000E NOPS0 EQU 14 ; NUMBER OF 0-OPS
11E2 ; 1-OPS
11E2 E512 OPT1: DW ZZERO ; 0
11E4 EE12 DW ZNEXT ; 1
11E6 F712 DW ZFIRST ; 2
11E8 0A13 DW ZLOC ; 3
11EA 1613 DW ZPTSIZ ; 4
11EC 3313 DW ZINC ; 5
11EE 3E13 DW ZDEC ; 6
11F0 4B13 DW ZPRB ; 7
11F2 2510 DW BADOP1 ; 8 (UNDEFINED)
11F4 5913 DW ZREMOV ; 9
11F6 9B13 DW ZPRD ; 10
11F8 B813 DW ZRET ; 11
11FA 0014 DW ZJUMP ; 12
11FC 0614 DW ZPRINT ; 13
11FE 1414 DW ZVALUE ; 14
1200 1C14 DW ZBCOM ; 15
0010 NOPS1 EQU 16 ; NUMBER OF 1-OPS
1202 ; 2-OPS
1202 6210 OPT2: DW BADOP2 ; 0 (UNDEFINED)
1204 CA16 DW ZEQUAL ; 1
1206 2C14 DW ZLESS ; 2
1208 4014 DW ZGRTR ; 3
120A 3214 DW ZDLESS ; 4
120C 4B14 DW ZIGRTR ; 5
120E 7B14 DW ZIN ; 6
1210 8B14 DW ZBTST ; 7
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- INIT & MAINLINE PAGE 32
--- OPCODE DISPATCH TABLES ---
1212 9E14 DW ZBOR ; 8
1214 AA14 DW ZBAND ; 9
1216 B614 DW ZFSETP ; 10
1218 CA14 DW ZFSET ; 11
121A DD14 DW ZFCLR ; 12
121C F414 DW ZSET ; 13
121E 0115 DW ZMOVE ; 14
1220 2B15 DW ZGET ; 15
1222 3B15 DW ZGETB ; 16
1224 5815 DW ZGETP ; 17
1226 A015 DW ZGETPT ; 18
1228 CD15 DW ZNEXTP ; 19
122A EC15 DW ZADD ; 20
122C F915 DW ZSUB ; 21
122E 0616 DW ZMUL ; 22
1230 2A16 DW ZDIV ; 23
1232 3416 DW ZMOD ; 24
0019 NOPS2 EQU 25 ; NUMBER OF 2-OPS
1234 ; X-OPS
1234 FD16 OPTX: DW ZCALL ; 0
1236 9217 DW ZPUT ; 1
1238 A017 DW ZPUTB ; 2
123A BB17 DW ZPUTP ; 3
123C 6718 DW ZREAD ; 4
123E EC17 DW ZPRC ; 5
1240 F117 DW ZPRN ; 6
1242 3618 DW ZRAND ; 7
1244 5818 DW ZPUSH ; 8
1246 5F18 DW ZPOP ; 9
1248 7A22 DW ZSPLIT ; 10
124A BE22 DW ZSCRN ; 11
000C NOPSX EQU 12 ; NUMBER OF X-OPS
END
INCLUD OPS0.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 33
--- 0-OPS ---
124C ; -----
124C ; RTRUE
124C ; -----
124C ; SIMULATE A "RETURN 1"
124C A201 ZRTRUE: LDX #1
124E A900 ZRT0: LDA #0
1250 8605 ZRT1: STX ARG1+LO ; GIVE TO
1252 8506 STA ARG1+HI ; [ARG1]
1254 4CB813 JMP ZRET ; AND DO THE RETURN
1257 ; ------
1257 ; RFALSE
1257 ; ------
1257 ; SIMULATE A "RETURN 0"
1257 A200 ZRFALS: LDX #0
1259 F0F3 BEQ ZRT0
125B ; ------
125B ; PRINTI
125B ; ------
125B ; PRINT Z-STRING FOLLOWING THE OPCODE
125B A51B ZPRI: LDA ZPCH ; MOVE [ZPC] INTO [MPC]
125D 8521 STA MPCH
125F A51A LDA ZPCM
1261 8520 STA MPCM
1263 A519 LDA ZPCL
1265 851F STA MPCL
1267 A900 LDA #0
1269 8522 STA MPCFLG ; [MPC] NO LONGER VALID
126B 200D1B JSR PZSTR ; PRINT THE Z-STRING AT [MPC]
126E A205 LDX #5 ; COPY STATE OF [MPC]
1270 B51F PRIL: LDA MPC,X ; INTO [ZPC]
1272 9519 STA ZPC,X
1274 CA DEX
1275 10F9 BPL PRIL
1277 60 RTS
1278 ; ------
1278 ; PRINTR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 34
--- 0-OPS ---
1278 ; ------
1278 ; DO A "PRINTI," FOLLOWED BY "CRLF" AND "RTRUE"
1278 205B12 ZPRR: JSR ZPRI
127B 20831E JSR ZCRLF
127E 4C4C12 JMP ZRTRUE
1281 ; ------
1281 ; RSTACK
1281 ; ------
1281 ; "RETURN" WITH VALUE ON STACK
1281 20B010 ZRSTAK: JSR POPVAL ; GET VALUE INTO [X/A]
1284 4C5012 JMP ZRT1 ; AND GIVE IT TO "RETURN"
1287 ; ------
1287 ; VERIFY
1287 ; ------
1287 ; VERIFY GAME CODE ON DISK
1287 202F1E ZVER: JSR VERNUM ; DISPLAY ZIP VERSION NUMBER
128A A203 LDX #3
128C A900 LDA #0
128E 9513 ZVR: STA J+LO,X ; CLEAR [J], [K]
1290 951F STA MPC,X ; [MPC] AND [MPCFLG]
1292 CA DEX
1293 10F9 BPL ZVR
1295 A940 LDA #64 ; POINT [MPC] TO Z-ADDRESS $00040
1297 851F STA MPCL ; 1ST 64 BYTES AREN'T CHECKED
1299 AD1A2A LDA ZBEGIN+ZLENTH ; GET LENGTH OF Z-CODE
129C 8512 STA I+HI ; IN WORDS
129E AD1B2A LDA ZBEGIN+ZLENTH+1 ; FIRST MSB
12A1 8511 STA I+LO ; THEN LSB
12A3 0611 ASL I+LO ; CONVERT Z-CODE LENGTH
12A5 2612 ROL I+HI ; TO # BYTES
12A7 2615 ROL K+LO ; TOP BIT IN [K+LO]
12A9 A916 LDA #K+HI ; PATCH THE "GETBYT" ROUTINE
12AB 8D251A STA PATCH ; TO USE [K+HI]=0 INSTEAD OF [ZPURE]
12AE 201A1A VSUM: JSR GETBYT ; GET A Z-BYTE INTO [A]
12B1 18 CLC
12B2 6513 ADC J+LO ; ADD IT TO SUM
12B4 8513 STA J+LO ; IN [J]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 35
--- 0-OPS ---
12B6 9002 BCC VSUM0
12B8 E614 INC J+HI
12BA A51F VSUM0: LDA MPCL ; END OF Z-CODE YET?
12BC C511 CMP I+LO ; CHECK LSB
12BE D0EE BNE VSUM
12C0 A520 LDA MPCM ; MIDDLE BYTE
12C2 C512 CMP I+HI
12C4 D0E8 BNE VSUM
12C6 A521 LDA MPCH ; AND HIGH BIT
12C8 C515 CMP K+LO
12CA D0E2 BNE VSUM
12CC A927 LDA #ZPURE ; UNPATCH "GETBYT"
12CE 8D251A STA PATCH
12D1 AD1D2A LDA ZBEGIN+ZCHKSM+1 ; GET LSB OF CHECKSUM
12D4 C513 CMP J+LO ; DOES IT MATCH?
12D6 D00A BNE BADVER ; NO, PREDICATE FAILS
12D8 AD1C2A LDA ZBEGIN+ZCHKSM ; ELSE CHECK MSB
12DB C514 CMP J+HI ; LOOK GOOD?
12DD D003 BNE BADVER ; IF MATCHED,
12DF 4C3611 JMP PREDS ; GAME IS OKAY
12E2 4C2A11 BADVER: JMP PREDF
END
INCLUD OPS1.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 36
--- 1-OPS ---
12E5 ; -----
12E5 ; ZERO?
12E5 ; -----
12E5 ; [ARG1] = 0?
12E5 A505 ZZERO: LDA ARG1+LO
12E7 0506 ORA ARG1+HI
12E9 F01C BEQ PFINE
12EB 4C2A11 PYUCK: JMP PREDF
12EE ; -----
12EE ; NEXT?
12EE ; -----
12EE ; RETURN "NEXT" POINTER IN OBJECT [ARG1];
12EE ; FAIL IF LAST AND RETURN ZERO
12EE A505 ZNEXT: LDA ARG1+LO
12F0 20181D JSR OBJLOC ; GET OBJECT ADDR INTO [I]
12F3 A005 LDY #5 ; POINT TO "NEXT" SLOT
12F5 D007 BNE FIRST1
12F7 ; ------
12F7 ; FIRST?
12F7 ; ------
12F7 ; RETURN "FIRST" POINTER IN OBJECT [ARG1];
12F7 ; FAIL IF LAST AND RETURN ZERO
12F7 A505 ZFIRST: LDA ARG1+LO
12F9 20181D JSR OBJLOC ; GET OBJECT ADDR INTO [I]
12FC A006 LDY #6 ; POINT TO "FIRST" SLOT
12FE B111 FIRST1: LDA (I),Y ; GET CONTENTS OF SLOT
1300 20E810 JSR PUTBYT ; PASS IT TO VARIABLE
1303 A50F LDA VALUE+LO ; EXAMINE THE VALUE JUST "PUT"
1305 F0E4 BEQ PYUCK ; FAIL IF IT WAS ZERO
1307 4C3611 PFINE: JMP PREDS ; ELSE REJOICE
130A ; ---
130A ; LOC
130A ; ---
130A ; RETURN THE OBJECT CONTAINING OBJECT [ARG1];
130A ; RETURN ZERO IF NONE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 37
--- 1-OPS ---
130A A505 ZLOC: LDA ARG1+LO
130C 20181D JSR OBJLOC ; GET ADDR OF OBJECT INTO [I]
130F A004 LDY #4 ; POINT TO "LOC" SLOT
1311 B111 LDA (I),Y ; GET THE BYTE
1313 4CE810 JMP PUTBYT ; AND SHIP IT OUT
1316 ; ------
1316 ; PTSIZE
1316 ; ------
1316 ; RETURN LENGTH OF PROP TABLE [ARG1] IN BYTES
1316 A506 ZPTSIZ: LDA ARG1+HI ; MOVE ABS ADDR OF
1318 18 CLC ; THE PROP TABLE
1319 6526 ADC ZCODE ; INTO [I]
131B 8512 STA I+HI
131D A505 LDA ARG1+LO ; DECREMENT THE
131F 38 SEC ; ADDRESS
1320 E901 SBC #1 ; WHILE MOVING LSB
1322 8511 STA I+LO
1324 B002 BCS PTZ0
1326 C612 DEC I+HI
1328 A000 PTZ0: LDY #0 ; GET THE LENGTH
132A 20621D JSR PROPL ; OF PROPERTY AT [I] INTO [A]
132D 18 CLC
132E 6901 ADC #1 ; INCREMENT RESULT
1330 4CE810 JMP PUTBYT ; AND RETURN IT
1333 ; ---
1333 ; INC
1333 ; ---
1333 ; INCREMENT VARIABLE [ARG1]
1333 A505 ZINC: LDA ARG1+LO
1335 208110 JSR VARGET ; FETCH VARIABLE INTO [VALUE]
1338 20B611 JSR INCVAL ; INCREMENT IT
133B 4C4613 JMP ZD0
133E ; ---
133E ; DEC
133E ; ---
133E ; DECREMENT VARIABLE [ARG1]
133E A505 ZDEC: LDA ARG1+LO
1340 208110 JSR VARGET ; FETCH VAR INTO [VALUE]
1343 20AA11 JSR DECVAL ; DECREMENT IT
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 38
--- 1-OPS ---
1346 A505 ZD0: LDA ARG1+LO ; PUT RESULT BACK
1348 4CDD10 JMP VARPUT ; INTO THE SAME VARIABLE
134B ; ------
134B ; PRINTB
134B ; ------
134B ; PRINT Z-STRING AT [ARG1]
134B A505 ZPRB: LDA ARG1+LO
134D 8511 STA I+LO
134F A506 LDA ARG1+HI
1351 8512 STA I+HI
1353 20E11A JSR SETWRD ; MOVE Z-ADDR TO [MPC]
1356 4C0D1B JMP PZSTR ; AND PRINT
1359 ; ------
1359 ; REMOVE
1359 ; ------
1359 ; MOVE OBJECT [ARG1] INTO PSEUDO-OBJECT #0
1359 A505 ZREMOV: LDA ARG1+LO ; GET SOURCE OBJECT ADDR
135B 20181D JSR OBJLOC ; INTO [I]
135E A511 LDA I+LO ; COPY THE SOURCE ADDR
1360 8513 STA J+LO ; INTO [J]
1362 A512 LDA I+HI ; FOR LATER REFERENCE
1364 8514 STA J+HI
1366 A004 LDY #4 ; POINT TO "LOC" SLOT
1368 B111 LDA (I),Y ; GET THE DATA
136A F02E BEQ REMVEX ; SCRAM IF NO OBJECT
136C 20181D JSR OBJLOC ; ELSE GET ADDR OF OBJECT [A] INTO [I]
136F A006 LDY #6 ; POINT TO "FIRST" SLOT
1371 B111 LDA (I),Y ; GRAB DATA
1373 C505 CMP ARG1+LO ; IS THIS THE FIRST?
1375 D009 BNE REMVC1 ; NO, KEEP SEARCHING
1377 A005 LDY #5 ; ELSE COPY SOURCE'S "NEXT" SLOT
1379 B113 LDA (J),Y
137B C8 INY ; INTO DEST'S "FIRST" SLOT ([Y] = 6)
137C 9111 STA (I),Y
137E D011 BNE REMVC2 ; BRANCH ALWAYS
1380 20181D REMVC1: JSR OBJLOC
1383 A005 LDY #5 ; GET "NEXT"
1385 B111 LDA (I),Y
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 39
--- 1-OPS ---
1387 C505 CMP ARG1+LO ; FOUND IT?
1389 D0F5 BNE REMVC1 ; NO, KEEP TRYING
138B A005 LDY #5 ; WHEN FOUND
138D B113 LDA (J),Y ; MOVE "NEXT" SLOT OF SOURCE
138F 9111 STA (I),Y ; TO "NEXT" SLOT OF DEST
1391 A900 REMVC2: LDA #0
1393 A004 LDY #4 ; CLEAR "LOC"
1395 9113 STA (J),Y
1397 C8 INY ; AND "NEXT" SLOTS ([Y] = 5)
1398 9113 STA (J),Y ; OF SOURCE OBJECT
139A 60 REMVEX: RTS
139B ; ------
139B ; PRINTD
139B ; ------
139B ; PRINT SHORT DESCRIPTION OF OBJECT [ARG1]
139B A505 ZPRD: LDA ARG1+LO
139D ; ENTRY POINT FOR "USL"
139D 20181D PRNTDC: JSR OBJLOC ; GET ADDR OF OBJECT INTO [I]
13A0 A007 LDY #7 ; GET PROP TABLE POINTER
13A2 B111 LDA (I),Y ; FETCH MSB
13A4 AA TAX ; SAVE IT HERE
13A5 C8 INY
13A6 B111 LDA (I),Y ; FETCH LSB
13A8 8511 STA I+LO ; STORE LSB
13AA 8612 STX I+HI ; AND MSB
13AC E611 INC I+LO ; POINT PAST THE
13AE D002 BNE PDC0 ; LENGTH BYTE
13B0 E612 INC I+HI
13B2 20E11A PDC0: JSR SETWRD ; CALC Z-STRING ADDR
13B5 4C0D1B JMP PZSTR ; AND PRINT IT
13B8 ; ------
13B8 ; RETURN
13B8 ; ------
13B8 ; RETURN FROM "CALL" WITH VALUE [ARG1]
13B8 A518 ZRET: LDA OLDZSP ; RE-SYNC THE
13BA 8517 STA ZSP ; Z-STACK POINTER
13BC 20B010 JSR POPVAL ; POP # LOCALS INTO [X/A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 40
--- 1-OPS ---
13BF 8612 STX I+HI ; SAVE HERE
13C1 ; MAKE SURE [X] WAS COMPLEMENT OF [A] (BM 11/24/84)
13C1 49FF EOR #$FF ; COMPLEMENT [A]
13C3 C512 CMP I+HI ; MATCHED?
13C5 D034 BNE STKERR ; ERROR IF NOT
13C7 8A TXA ; SET FLAGS; ANY LOCALS?
13C8 F019 BEQ RET2 ; SKIP IF NOT
13CA ; RESTORE PUSHED LOCALS
13CA CA DEX ; ZERO-ALIGN
13CB 8A TXA ; AND
13CC 0A ASL A ; WORD-ALIGN # LOCALS
13CD 8511 STA I+LO ; FOR USE AS A STORAGE INDEX
13CF 20B010 RET1: JSR POPVAL ; POP A LOCAL INTO [X/A]
13D2 A411 LDY I+LO ; RETRIEVE STORAGE INDEX
13D4 99010D STA LOCALS+HI,Y ; STORE MSB OF LOCAL
13D7 8A TXA ; MOVE LSB
13D8 99000D STA LOCALS+LO,Y ; AND STORE THAT TOO
13DB C611 DEC I+LO
13DD C611 DEC I+LO ; UPDATE STORAGE INDEX
13DF C612 DEC I+HI ; AND LOCALS COUNT
13E1 D0EC BNE RET1 ; POP TILL NO MORE LOCALS
13E3 ; RESTORE OTHER VARIABLES
13E3 20B010 RET2: JSR POPVAL ; POP [ZPCH] AND [ZPCM]
13E6 861A STX ZPCM
13E8 851B STA ZPCH
13EA 20B010 JSR POPVAL ; POP AND RESTORE
13ED 8618 STX OLDZSP
13EF 8519 STA ZPCL
13F1 A900 LDA #0
13F3 851C STA ZPCFLG ; ZPC CHANGED!
13F5 20BD11 JSR A12VAL ; MOVE [ARG1] TO [VALUE]
13F8 4CEE10 JMP PUTVAL ; AND RETURN IT
13FB ; *** ERROR #15: Z-STACK DESTROYED ***
13FB A90F STKERR: LDA #15 ; (BM 11/24/84)
13FD 4CC41D JMP ZERROR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 41
--- 1-OPS ---
1400 ; ----
1400 ; JUMP
1400 ; ----
1400 ; JUMP TO Z-LOCATION IN [ARG1]
1400 20BD11 ZJUMP: JSR A12VAL ; MOVE [ARG1] TO [VALUE]
1403 4C7011 JMP PREDB3 ; A BRANCH THAT ALWAYS SUCCEEDS
1406 ; -----
1406 ; PRINT
1406 ; -----
1406 ; PRINT Z-STRING AT WORD POINTER [ARG1]
1406 A505 ZPRINT: LDA ARG1+LO
1408 8511 STA I+LO
140A A506 LDA ARG1+HI
140C 8512 STA I+HI
140E 20FB1A JSR SETSTR ; CALC STRING ADDRESS
1411 4C0D1B JMP PZSTR ; AND PRINT IT
1414 ; -----
1414 ; VALUE
1414 ; -----
1414 ; RETURN VALUE OF VARIABLE [ARG1]
1414 A505 ZVALUE: LDA ARG1+LO
1416 208110 JSR VARGET ; GET THE VALUE
1419 4CEE10 JMP PUTVAL ; EASY ENOUGH
141C ; ----
141C ; BCOM
141C ; ----
141C ; COMPLEMENT [ARG1]
141C A505 ZBCOM: LDA ARG1+LO
141E 49FF EOR #$FF
1420 AA TAX
1421 A506 LDA ARG1+HI
1423 49FF EOR #$FF
1425 ; FALL THROUGH ...
1425 ; ---------------------
1425 ; RETURN VALUE IN [X/A]
1425 ; ---------------------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 42
--- 1-OPS ---
1425 860F VEXIT: STX VALUE+LO
1427 8510 STA VALUE+HI
1429 4CEE10 JMP PUTVAL
END
INCLUD OPS2.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 43
--- 2-OPS ---
142C ; -----
142C ; LESS?
142C ; -----
142C ; [ARG1] < [ARG2]?
142C 20BD11 ZLESS: JSR A12VAL ; MOVE [ARG1] TO [VALUE]
142F 4C3514 JMP DLS0 ; MOVE [ARG2] TO [I] & COMPARE
1432 ; ------
1432 ; DLESS?
1432 ; ------
1432 ; DECREMENT [ARG1]; SUCCEED IF < [ARG2]
1432 203E13 ZDLESS: JSR ZDEC ; MOVES ([ARG1]-1) TO [VALUE]
1435 A507 DLS0: LDA ARG2+LO ; MOVE [ARG2] TO [I]
1437 8511 STA I+LO
1439 A508 LDA ARG2+HI
143B 8512 STA I+HI
143D 4C5E14 JMP COMPAR ; COMPARE & RETURN
1440 ; -----
1440 ; GRTR?
1440 ; -----
1440 ; [ARG1] > [ARG2]?
1440 A505 ZGRTR: LDA ARG1+LO ; MOVE [ARG1] TO [I]
1442 8511 STA I+LO
1444 A506 LDA ARG1+HI
1446 8512 STA I+HI
1448 4C5614 JMP A2VAL ; MOVE [ARG2] TO [VALUE] & COMPARE
144B ; ------
144B ; IGRTR?
144B ; ------
144B ; INCREMENT [ARG1]; SUCCEED IF GREATER THAN [ARG2]
144B 203313 ZIGRTR: JSR ZINC ; GET ([ARG1]+1) INTO [VALUE]
144E A50F LDA VALUE+LO ; MOVE [VALUE] TO [I]
1450 8511 STA I+LO
1452 A510 LDA VALUE+HI
1454 8512 STA I+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 44
--- 2-OPS ---
1456 A507 A2VAL: LDA ARG2+LO ; MOVE [ARG2] TO [VALUE]
1458 850F STA VALUE+LO
145A A508 LDA ARG2+HI
145C 8510 STA VALUE+HI
145E 206514 COMPAR: JSR SCOMP ; COMPARE [VALUE] AND [I]
1461 9038 BCC PGOOD
1463 B023 BCS PBAD
1465 ; -----------------
1465 ; SIGNED COMPARISON
1465 ; -----------------
1465 ; ENTRY: VALUES IN [VALUE] AND [I]
1465 A512 SCOMP: LDA I+HI
1467 4510 EOR VALUE+HI
1469 1005 BPL SCMP
146B A512 LDA I+HI
146D C510 CMP VALUE+HI
146F 60 RTS
1470 A510 SCMP: LDA VALUE+HI
1472 C512 CMP I+HI
1474 D004 BNE SCEX
1476 A50F LDA VALUE+LO
1478 C511 CMP I+LO
147A 60 SCEX: RTS
147B ; ---
147B ; IN?
147B ; ---
147B ; IS OBJECT [ARG1] CONTAINED IN OBJECT [ARG2]?
147B A505 ZIN: LDA ARG1+LO
147D 20181D JSR OBJLOC ; GET ADDR OF TARGET OBJECT INTO [I]
1480 A004 LDY #4 ; POINT TO "LOC" SLOT
1482 B111 LDA (I),Y ; GET DATA
1484 C507 CMP ARG2+LO ; IS IT THERE?
1486 F013 BEQ PGOOD ; YES, SUCCEED
1488 4C2A11 PBAD: JMP PREDF ; TOO BAD, CHUM ...
148B ; ----
148B ; BTST
148B ; ----
148B ; IS EVERY "ON" BIT IN [ARG1]
148B ; ALSO "ON" IN [ARG2]?
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 45
--- 2-OPS ---
148B A507 ZBTST: LDA ARG2+LO ; FIRST CHECK LSBS
148D 2505 AND ARG1+LO
148F C507 CMP ARG2+LO ; LSBS MATCH?
1491 D0F5 BNE PBAD ; NO, EXIT NOW
1493 A508 LDA ARG2+HI ; ELSE CHECK MSBS
1495 2506 AND ARG1+HI
1497 C508 CMP ARG2+HI ; MATCHED?
1499 D0ED BNE PBAD ; SORRY ...
149B 4C3611 PGOOD: JMP PREDS
149E ; ---
149E ; BOR
149E ; ---
149E ; RETURN [ARG1] "OR" [ARG2]
149E A505 ZBOR: LDA ARG1+LO
14A0 0507 ORA ARG2+LO
14A2 AA TAX
14A3 A506 LDA ARG1+HI
14A5 0508 ORA ARG2+HI
14A7 4C2514 JMP VEXIT
14AA ; ----
14AA ; BAND
14AA ; ----
14AA ; RETURN [ARG1] "AND" [ARG2]
14AA A505 ZBAND: LDA ARG1+LO
14AC 2507 AND ARG2+LO
14AE AA TAX
14AF A506 LDA ARG1+HI
14B1 2508 AND ARG2+HI
14B3 4C2514 JMP VEXIT
14B6 ; -----
14B6 ; FSET?
14B6 ; -----
14B6 ; IS FLAG [ARG1] SET IN OBJECT [ARG2]?
14B6 20741D ZFSETP: JSR FLAGSU ; GET BITS INTO [K] AND [J]
14B9 A516 LDA K+HI ; DO MSBS
14BB 2514 AND J+HI
14BD 8516 STA K+HI
14BF A515 LDA K+LO ; DO LSBS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 46
--- 2-OPS ---
14C1 2513 AND J+LO
14C3 0516 ORA K+HI ; ANY BITS ON?
14C5 D0D4 BNE PGOOD ; TARGET BIT MUST BE ON
14C7 4C2A11 JMP PREDF
14CA ; ----
14CA ; FSET
14CA ; ----
14CA ; SET FLAG [ARG2] IN OBJECT [ARG1]
14CA 20741D ZFSET: JSR FLAGSU ; GET BITS INTO [K] & [J], ADDR IN [I]
14CD A000 LDY #0
14CF A516 LDA K+HI ; FIRST DO MSBS
14D1 0514 ORA J+HI
14D3 9111 STA (I),Y
14D5 C8 INY
14D6 A515 LDA K+LO ; THEN LSBS
14D8 0513 ORA J+LO
14DA 9111 STA (I),Y
14DC 60 RTS
14DD ; ------
14DD ; FCLEAR
14DD ; ------
14DD ; CLEAR FLAG [ARG2] IN OBJECT [ARG1]
14DD 20741D ZFCLR: JSR FLAGSU ; GETS BITS INTO [J] & [K], ADDR IN [I]
14E0 A000 LDY #0
14E2 A514 LDA J+HI ; FETCH MSB
14E4 49FF EOR #$FF ; COMPLEMENT IT
14E6 2516 AND K+HI ; RUB OUT FLAG
14E8 9111 STA (I),Y
14EA C8 INY
14EB A513 LDA J+LO ; SAME FOR LSB
14ED 49FF EOR #$FF
14EF 2515 AND K+LO
14F1 9111 STA (I),Y
14F3 60 RTS
14F4 ; ---
14F4 ; SET
14F4 ; ---
14F4 ; SET VARIABLE [ARG1] EQUAL TO [ARG2]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 47
--- 2-OPS ---
14F4 A507 ZSET: LDA ARG2+LO ; MOVE THE VALUE
14F6 850F STA VALUE+LO ; INTO [VALUE]
14F8 A508 LDA ARG2+HI
14FA 8510 STA VALUE+HI
14FC A505 LDA ARG1+LO ; GET VARIABLE ID
14FE 4CDD10 JMP VARPUT ; AND CHANGE THE VARIABLE
1501 ; ----
1501 ; MOVE
1501 ; ----
1501 ; MOVE OBJECT [ARG1] INTO OBJECT [ARG2]
1501 205913 ZMOVE: JSR ZREMOV ; REMOVE FIRST
1504 A505 LDA ARG1+LO
1506 20181D JSR OBJLOC ; GET SOURCE OBJECT ADDR INTO [I]
1509 A511 LDA I+LO ; COPY SOURCE ADDRESS
150B 8513 STA J+LO ; INTO [J]
150D A512 LDA I+HI
150F 8514 STA J+HI
1511 A507 LDA ARG2+LO ; GET DEST OBJECT ID
1513 A004 LDY #4 ; POINT TO "LOC" SLOT OF SOURCE
1515 9111 STA (I),Y ; AND MOVE IT IN
1517 20181D JSR OBJLOC ; GET ADDR OF DEST OBJECT INTO [I]
151A A006 LDY #6 ; POINT TO "FIRST" SLOT
151C B111 LDA (I),Y ; GET "FIRST" OF DEST
151E AA TAX ; SAVE HERE FOR A MOMENT
151F A505 LDA ARG1+LO ; GET SOURCE OBJECT ID
1521 9111 STA (I),Y ; MAKE IT "FIRST" OF DEST
1523 8A TXA ; RESTORE "FIRST" OF DEST
1524 F004 BEQ ZMVEX ; SCRAM IF ZERO
1526 A005 LDY #5 ; MAKE "FIRST" OF DEST
1528 9113 STA (J),Y ; THE "NEXT" OF SOURCE
152A 60 ZMVEX: RTS
152B ; ---
152B ; GET
152B ; ---
152B ; RETURN ITEM [ARG2] IN WORD-TABLE [ARG1]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 48
--- 2-OPS ---
152B 204015 ZGET: JSR WCALC ; CALC ADDRESS
152E 201A1A JSR GETBYT ; GET 1ST BYTE (MSB)
1531 8510 DOGET: STA VALUE+HI ; SAVE MSB
1533 201A1A JSR GETBYT ; GET LSB
1536 850F STA VALUE+LO ; SAVE AND
1538 4CEE10 JMP PUTVAL ; HAND IT OVER
153B ; ----
153B ; GETB
153B ; ----
153B ; RETURN ITEM [ARG2] IN BYTE-TABLE AT [ARG1]
153B 204415 ZGETB: JSR BCALC
153E F0F1 BEQ DOGET ; [A] = 0, SO CLEAR MSB OF [VALUE]
1540 ; --------------------
1540 ; CALC TABLE ADDRESSES
1540 ; --------------------
1540 ; WORD-ALIGNED ENTRY
1540 0607 WCALC: ASL ARG2+LO ; WORD-ALIGN FOR
1542 2608 ROL ARG2+HI ; WORD ACCESS
1544 ; BYTE-ALIGNED ENTRY
1544 A507 BCALC: LDA ARG2+LO ; ADD BASE ADDR OF TABLE
1546 18 CLC ; TO ITEM
1547 6505 ADC ARG1+LO ; INDEX
1549 851F STA MPCL
154B A508 LDA ARG2+HI ; SAME FOR MSBS
154D 6506 ADC ARG1+HI
154F 8520 STA MPCM
1551 A900 LDA #0
1553 8521 STA MPCH ; CLEAR TOP BIT
1555 8522 STA MPCFLG ; & INVALIDATE [MPC]
1557 60 RTS
1558 ; ----
1558 ; GETP
1558 ; ----
1558 ; RETURN PROPERTY [ARG2] OF OBJECT [ARG1];
1558 ; IF NO PROP [ARG2], RETURN [ARG2]'TH ELEMENT OF OBJECT #0
1558 20411D ZGETP: JSR PROPB
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 49
--- 2-OPS ---
155B 205D1D GETP1: JSR PROPN
155E C507 CMP ARG2+LO
1560 F01B BEQ GETP3
1562 9006 BCC GETP2
1564 206A1D JSR PROPNX
1567 4C5B15 JMP GETP1 ; TRY AGAIN WITH NEXT PROP
156A A507 GETP2: LDA ARG2+LO ; GET PROPERTY #
156C 38 SEC ; ZERO-ALIGN IT
156D E901 SBC #1
156F 0A ASL A ; WORD-ALIGN IT
1570 A8 TAY ; USE AS AN INDEX
1571 B135 LDA (OBJTAB),Y ; GET MSB OF PROPERTY
1573 8510 STA VALUE+HI
1575 C8 INY
1576 B135 LDA (OBJTAB),Y ; DO SAME WITH LSB
1578 850F STA VALUE+LO
157A 4CEE10 JMP PUTVAL ; RETURN DEFAULT IN [VALUE]
157D 20621D GETP3: JSR PROPL
1580 C8 INY ; MAKE [Y] POINT TO 1ST BYTE OF PROP
1581 AA TAX ; (SET FLAGS) IF LENGTH IN [A] = 0
1582 F009 BEQ GETPB ; GET A BYTE PROPERTY
1584 C901 CMP #1 ; IF LENGTH = 1
1586 F00B BEQ GETPW ; GET A WORD PROPERTY
1588 ; *** ERROR #7: PROPERTY LENGTH ***
1588 A907 LDA #7
158A 4CC41D JMP ZERROR
158D ; GET A 1-BYTE PROPERTY
158D B111 GETPB: LDA (I),Y ; GET LSB INTO [A]
158F A200 LDX #0 ; CLEAR MSB IN [X]
1591 F006 BEQ ETPEX
1593 ; GET A 2-BYTE PROPERTY
1593 B111 GETPW: LDA (I),Y ; GET MSB
1595 AA TAX ; INTO [X]
1596 C8 INY ; POINT TO LSB
1597 B111 LDA (I),Y ; GET IT INTO [A]
1599 850F ETPEX: STA VALUE+LO ; STORE LSB
159B 8610 STX VALUE+HI ; AND MSB
159D 4CEE10 JMP PUTVAL
15A0 ; -----
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 50
--- 2-OPS ---
15A0 ; GETPT
15A0 ; -----
15A0 ; RETURN POINTER TO PROP TABLE [ARG2]
15A0 ; IN OBJECT [ARG1]
15A0 20411D ZGETPT: JSR PROPB
15A3 205D1D GETPT1: JSR PROPN ; RETURNS OFFSET IN [Y]
15A6 C507 CMP ARG2+LO
15A8 F008 BEQ GETPT2
15AA 901E BCC DORET
15AC 206A1D JSR PROPNX ; TRY NEXT PROPERTY
15AF 4CA315 JMP GETPT1
15B2 E611 GETPT2: INC I+LO
15B4 D002 BNE GETPT3
15B6 E612 INC I+HI
15B8 98 GETPT3: TYA ; FETCH OFFSET
15B9 18 CLC
15BA 6511 ADC I+LO ; ADD LSB OF TABLE ADDRESS
15BC 850F STA VALUE+LO
15BE A512 LDA I+HI ; AND MSB
15C0 6900 ADC #0
15C2 38 SEC ; STRIP OFF
15C3 E526 SBC ZCODE ; RELATIVE POINTER
15C5 8510 STA VALUE+HI
15C7 4CEE10 JMP PUTVAL ; AND RETURN
15CA 4CE610 DORET: JMP RET0 ; ELSE RETURN A ZERO
15CD ; -----
15CD ; NEXTP
15CD ; -----
15CD ; RETURN INDEX # OF PROP FOLLOWING PROP [ARG2] IN OBJECT [ARG1];
15CD ; RETURN ZERO IF LAST; RETURN FIRST IF [ARG2]=0; ERROR IF NONE
15CD 20411D ZNEXTP: JSR PROPB
15D0 A507 LDA ARG2+LO ; IF [ARG2]=0
15D2 F012 BEQ NXTP3 ; RETURN "FIRST" SLOT
15D4 205D1D NXTP1: JSR PROPN ; FETCH PROPERTY #
15D7 C507 CMP ARG2+LO ; COMPARE TO TARGET #
15D9 F008 BEQ NXTP2 ; FOUND IT!
15DB 90ED BCC DORET ; LAST PROP, SO RETURN ZERO
15DD 206A1D JSR PROPNX ; ELSE TRY NEXT PROPERTY
15E0 4CD415 JMP NXTP1
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 51
--- 2-OPS ---
15E3 206A1D NXTP2: JSR PROPNX ; POINT TO FOLLOWING PROPERTY
15E6 205D1D NXTP3: JSR PROPN ; GET THE PROPERTY #
15E9 4CE810 JMP PUTBYT ; AND RETURN IT
15EC ; ---
15EC ; ADD
15EC ; ---
15EC ; RETURN [ARG1] + [ARG2]
15EC A505 ZADD: LDA ARG1+LO ; ADD LSBS
15EE 18 CLC
15EF 6507 ADC ARG2+LO
15F1 AA TAX ; SAVE LSB HERE
15F2 A506 LDA ARG1+HI ; ADD MSBS
15F4 6508 ADC ARG2+HI
15F6 4C2514 JMP VEXIT
15F9 ; ---
15F9 ; SUB
15F9 ; ---
15F9 ; RETURN [ARG1] - [ARG2]
15F9 A505 ZSUB: LDA ARG1+LO ; SUBTRACT LSBS
15FB 38 SEC
15FC E507 SBC ARG2+LO
15FE AA TAX ; SAVE LSB HERE
15FF A506 LDA ARG1+HI ; SUBTRACT MSBS
1601 E508 SBC ARG2+HI
1603 4C2514 JMP VEXIT ; EXIT WITH [X]=LSB, [A]=MSB
1606 ; ---
1606 ; MUL
1606 ; ---
1606 ; RETURN [ARG1] * [ARG2]
1606 20C016 ZMUL: JSR MINIT ; INIT THINGS
1609 665B ZMLOOP: ROR MTEMP+HI
160B 665A ROR MTEMP+LO
160D 6608 ROR ARG2+HI
160F 6607 ROR ARG2+LO
1611 900D BCC ZMNEXT
1613 A505 LDA ARG1+LO
1615 18 CLC
1616 655A ADC MTEMP+LO
1618 855A STA MTEMP+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 52
--- 2-OPS ---
161A A506 LDA ARG1+HI
161C 655B ADC MTEMP+HI
161E 855B STA MTEMP+HI
1620 CA ZMNEXT: DEX
1621 10E6 BPL ZMLOOP
1623 A607 LDX ARG2+LO ; PUT LSB OF PRODUCT
1625 A508 LDA ARG2+HI ; AND MSB
1627 4C2514 JMP VEXIT ; WHERE "VEXIT" EXPECTS THEM
162A ; ---
162A ; DIV
162A ; ---
162A ; RETURN QUOTIENT OF [ARG1] / [ARG2]
162A 203E16 ZDIV: JSR DIVIDE
162D A656 LDX QUOT+LO
162F A557 LDA QUOT+HI
1631 4C2514 JMP VEXIT
1634 ; ---
1634 ; MOD
1634 ; ---
1634 ; RETURN REMAINDER OF [ARG1] / [ARG2]
1634 203E16 ZMOD: JSR DIVIDE
1637 A658 LDX REMAIN+LO ; FETCH THE REMAINDER
1639 A559 LDA REMAIN+HI ; IN [REMAIN]
163B 4C2514 JMP VEXIT ; AND RETURN IT
163E ; ---------------
163E ; SIGNED DIVISION
163E ; ---------------
163E ; ENTRY: DIVIDEND IN [ARG1], DIVISOR IN [ARG2]
163E ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN]
163E A506 DIVIDE: LDA ARG1+HI ; SIGN OF REMAINDER
1640 855D STA RSIGN ; IS THE SIGN OF THE DIVIDEND
1642 4508 EOR ARG2+HI ; SIGN OF QUOTIENT IS POSITIVE
1644 855C STA QSIGN ; IF SIGNS OF TERMS ARE THE SAME
1646 A505 LDA ARG1+LO ; MOVE [ARG1] TO [QUOT]
1648 8556 STA QUOT+LO
164A A506 LDA ARG1+HI
164C 8557 STA QUOT+HI ; IF DIVIDEND IS POSITIVE
164E 1003 BPL ABSDIV ; MOVE DIVISOR
1650 207C16 JSR ABQUOT ; ELSE CALC ABS(DIVIDEND) FIRST
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 53
--- 2-OPS ---
1653 A507 ABSDIV: LDA ARG2+LO
1655 8558 STA REMAIN+LO
1657 A508 LDA ARG2+HI
1659 8559 STA REMAIN+HI ; IF REMAINDER IS POSITIVE
165B 1003 BPL GODIV ; WE'RE READY TO DIVIDE
165D 206E16 JSR ABREM ; ELSE CALC ABS(DIVISOR)
1660 208A16 GODIV: JSR UDIV ; DO UNSIGNED DIVIDE
1663 A55C LDA QSIGN ; SHOULD QUOTIENT BE FLIPPED?
1665 1003 BPL RFLIP ; NO, TEST REMAINDER
1667 207C16 JSR ABQUOT ; ELSE GET ABSOLUTE VALUE
166A A55D RFLIP: LDA RSIGN ; SHOULD EMAINDER BE FLIPPED?
166C 100D BPL DIVEX ; NO, WE'RE DONE
166E ; ELSE FALL THROUGH ...
166E ; ----------------
166E ; CALC ABS(REMAIN)
166E ; ----------------
166E A900 ABREM: LDA #0
1670 38 SEC
1671 E558 SBC REMAIN+LO
1673 8558 STA REMAIN+LO
1675 A900 LDA #0
1677 E559 SBC REMAIN+HI
1679 8559 STA REMAIN+HI
167B 60 DIVEX: RTS
167C ; --------------
167C ; CALC ABS(QUOT)
167C ; --------------
167C A900 ABQUOT: LDA #0
167E 38 SEC
167F E556 SBC QUOT+LO
1681 8556 STA QUOT+LO
1683 A900 LDA #0
1685 E557 SBC QUOT+HI
1687 8557 STA QUOT+HI
1689 60 RTS
168A ; -----------------
168A ; UNSIGNED DIVISION
168A ; -----------------
168A ; ENTRY: DIVIDEND IN [QUOT], DIVISOR IN [REMAIN]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 54
--- 2-OPS ---
168A ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN]
168A A558 UDIV: LDA REMAIN+LO ; CHECK [REMAIN]
168C 0559 ORA REMAIN+HI ; BEFORE PROCEEDING
168E F02B BEQ DIVERR ; CAN'T DIVIDE BY ZERO!
1690 20C016 JSR MINIT ; SET IT ALL UP
1693 2656 UDLOOP: ROL QUOT+LO
1695 2657 ROL QUOT+HI
1697 265A ROL MTEMP+LO
1699 265B ROL MTEMP+HI
169B A55A LDA MTEMP+LO
169D 38 SEC
169E E558 SBC REMAIN+LO
16A0 A8 TAY ; SAVE HERE
16A1 A55B LDA MTEMP+HI
16A3 E559 SBC REMAIN+HI
16A5 9004 BCC UDNEXT
16A7 845A STY MTEMP+LO
16A9 855B STA MTEMP+HI
16AB CA UDNEXT: DEX
16AC D0E5 BNE UDLOOP
16AE 2656 ROL QUOT+LO ; SHIFT LAST CARRY FOR QUOTIENT
16B0 2657 ROL QUOT+HI
16B2 A55A LDA MTEMP+LO ; MOVE REMAINDER
16B4 8558 STA REMAIN+LO ; INTO [REMAIN]
16B6 A55B LDA MTEMP+HI
16B8 8559 STA REMAIN+HI
16BA 60 RTS
16BB ; *** ERROR #8: DIVISION BY ZERO ***
16BB A908 DIVERR: LDA #8
16BD 4CC41D JMP ZERROR
16C0 ; ---------
16C0 ; MATH INIT
16C0 ; ---------
16C0 A210 MINIT: LDX #16 ; INIT LOOPING INDEX
16C2 A900 LDA #0
16C4 855A STA MTEMP+LO ; CLEAR TEMP
16C6 855B STA MTEMP+HI ; REGISTER
16C8 18 CLC ; AND CARRY
16C9 60 RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 55
--- 2-OPS ---
END
INCLUD OPSX.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 56
--- X-OPS ---
16CA ; ------
16CA ; EQUAL?
16CA ; ------
16CA ; IS [ARG1] = [ARG2] (OR [ARG3] OR [ARG4])?
16CA C604 ZEQUAL: DEC NARGS ; DOUBLE-CHECK # ARGS
16CC D005 BNE DOEQ ; MUST BE AT LEAST TWO, OR ...
16CE ; *** ERROR #9: NOT ENOUGH "EQUAL?" ARGS ***
16CE A909 LDA #9
16D0 4CC41D JMP ZERROR
16D3 A505 DOEQ: LDA ARG1+LO ; FETCH LSB
16D5 A606 LDX ARG1+HI ; AND MSB OF [ARG1]
16D7 C507 CMP ARG2+LO ; TEST LSB OF [ARG2]
16D9 D004 BNE TRY2 ; NO GOOD, LOOK FOR ANOTHER ARG
16DB E408 CPX ARG2+HI ; ELSE TRY MSB OF [ARG2]
16DD F018 BEQ EQOK ; MATCHED!
16DF C604 TRY2: DEC NARGS ; OUT OF ARGS YET?
16E1 F017 BEQ EQBAD ; YES, WE FAILED
16E3 C509 CMP ARG3+LO ; TRY LSB OF [ARG3]
16E5 D004 BNE TRY3 ; NO GOOD, LOOK FOR ANOTHER ARG
16E7 E40A CPX ARG3+HI ; HOW ABOUT MSB OF [ARG3]?
16E9 F00C BEQ EQOK ; YAY!
16EB C604 TRY3: DEC NARGS ; OUT OF ARGS YET?
16ED F00B BEQ EQBAD ; IF NOT ...
16EF C50B CMP ARG4+LO ; TRY [ARG4]
16F1 D007 BNE EQBAD ; SORRY, CHUM
16F3 E40C CPX ARG4+HI ; MSB MATCHED?
16F5 D003 BNE EQBAD ; TOO BAD
16F7 4C3611 EQOK: JMP PREDS ; FINALLY MATCHED!
16FA 4C2A11 EQBAD: JMP PREDF ; FAILURE (SNIFF!)
16FD ; ----
16FD ; CALL
16FD ; ----
16FD ; BRANCH TO FUNCTION AT ([ARG1]*2), PASSING
16FD ; OPTIONAL PARAMETERS IN [ARG2]-[ARG4]
16FD A505 ZCALL: LDA ARG1+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 57
--- X-OPS ---
16FF 0506 ORA ARG1+HI ; IS CALL ADDRESS ZERO?
1701 D003 BNE DOCALL ; NO, CONTINUE
1703 4CE810 JMP PUTBYT ; ELSE RETURN THE ZERO IN [A]
1706 A618 DOCALL: LDX OLDZSP ; SAVE OLD STACK POINTER
1708 A519 LDA ZPCL ; AND LSB OF [ZPC]
170A 20CA10 JSR PUSHXA ; ON THE Z-STACK
170D A61A LDX ZPCM ; SAVE MIDDLE 8 BITS
170F A51B LDA ZPCH ; AND TOP BIT OF [ZPC]
1711 20CA10 JSR PUSHXA ; AS WELL
1714 ; FORM 16-BIT ADDRESS FROM [ARG1]
1714 A900 LDA #0 ; CLEAR HIGH BIT FOR ROTATE
1716 851C STA ZPCFLG ; AND INVALIDATE [ZPC]
1718 0605 ASL ARG1+LO ; MULTIPLY [ARG1]
171A 2606 ROL ARG1+HI ; BY TWO
171C 2A ROL A ; HIGH BIT INTO [A]
171D 851B STA ZPCH ; NEW HIGH BIT OF [ZPC]
171F A506 LDA ARG1+HI ; GET NEW LOW BYTES
1721 851A STA ZPCM
1723 A505 LDA ARG1+LO
1725 8519 STA ZPCL
1727 20E419 JSR NEXTPC ; FETCH # LOCALS TO PASS
172A 8513 STA J+LO ; SAVE HERE FOR COUNTING
172C 8514 STA J+HI ; AND HERE FOR LATER REFERENCE
172E F02B BEQ ZCALL2 ; SKIP IF NO LOCALS
1730 A900 LDA #0
1732 8511 STA I+LO ; ELSE INIT STORAGE INDEX
1734 A411 ZCALL1: LDY I+LO
1736 BE000D LDX LOCALS+LO,Y ; GET LSB OF LOCAL INTO [X]
1739 B9010D LDA LOCALS+HI,Y ; AND MSB INTO [A]
173C 8411 STY I+LO ; SAVE THE INDEX
173E 20CA10 JSR PUSHXA ; PUSH LOCAL IN [X/A] ONTO Z-STACK
1741 20E419 JSR NEXTPC ; GET MSB OF NEW LOCAL
1744 8512 STA I+HI ; SAVE IT HERE
1746 20E419 JSR NEXTPC ; NOW GET LSB
1749 A411 LDY I+LO ; RESTORE INDEX
174B 99000D STA LOCALS+LO,Y ; STORE LSB INTO [LOCALS]
174E A512 LDA I+HI ; RETRIEVE MSB
1750 99010D STA LOCALS+HI,Y ; STORE IT INTO [LOCALS]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 58
--- X-OPS ---
1753 C8 INY
1754 C8 INY ; UPDATE
1755 8411 STY I+LO ; THE STORAGE INDEX
1757 C613 DEC J+LO ; ANY MORE LOCALS?
1759 D0D9 BNE ZCALL1 ; YES, KEEP LOOPING
175B ; MOVE UP TO 3 ARGUMENTS TO [LOCALS]
175B C604 ZCALL2: DEC NARGS ; EXTRA ARGS IN THIS CALL?
175D F026 BEQ ZCALL3 ; NO, CONTINUE
175F A507 LDA ARG2+LO ; MOVE [ARG2] TO LOCAL #1
1761 8D000D STA LOCALS+LO
1764 A508 LDA ARG2+HI
1766 8D010D STA LOCALS+HI
1769 C604 DEC NARGS ; ANY LEFT?
176B F018 BEQ ZCALL3 ; NO, SCRAM
176D A509 LDA ARG3+LO ; MOVE [ARG3] TO LOCAL #2
176F 8D020D STA LOCALS+LO+2
1772 A50A LDA ARG3+HI
1774 8D030D STA LOCALS+HI+2
1777 C604 DEC NARGS ; ANY LEFT?
1779 F00A BEQ ZCALL3 ; NO, EXUENT
177B A50B LDA ARG4+LO ; MOVE [ARG4] TO LOCAL #3
177D 8D040D STA LOCALS+LO+4
1780 A50C LDA ARG4+HI
1782 8D050D STA LOCALS+HI+4
1785 A614 ZCALL3: LDX J+HI ; RETRIEVE # LOCALS
1787 8A TXA ; DUPE INTO [A]
1788 49FF EOR #$FF ; COMPLEMENT FOR ERROR CHECK (BM 11/24/84)
178A 20CA10 JSR PUSHXA ; PUSH # LOCALS ONTO Z-STACK
178D A517 LDA ZSP ; REMEMBER WHERE
178F 8518 STA OLDZSP ; WE CAME FROM
1791 60 RTS ; WHEW!
1792 ; ---
1792 ; PUT
1792 ; ---
1792 ; SET ITEM [ARG2] IN WORD-TABLE [ARG1] EQUAL TO [ARG3]
1792 0607 ZPUT: ASL ARG2+LO ; WORD-ALIGN [ARG2]
1794 2608 ROL ARG2+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 59
--- X-OPS ---
1796 20A817 JSR PCALC ; GET ITEM ADDR INTO [I]
1799 A50A LDA ARG3+HI ; STORE MSB OF [ARG3]
179B 9111 STA (I),Y ; INTO MSB OF TABLE POSITION
179D C8 INY ; POINT TO LSB
179E D003 BNE PUTLSB ; BRANCH ALWAYS
17A0 ; ----
17A0 ; PUTB
17A0 ; ----
17A0 ; SET ITEM [ARG2] IN BYTE-TABLE [ARG1] EQUAL TO [ARG3]
17A0 20A817 ZPUTB: JSR PCALC
17A3 ; ENTRY FOR "PUT"
17A3 A509 PUTLSB: LDA ARG3+LO ; GET LSB OF [ARG3]
17A5 9111 STA (I),Y ; STORE IN TABLE AT [Y]
17A7 60 RTS
17A8 ; ---------------------------
17A8 ; CALC ITEM ADDRESS FOR "PUT"
17A8 ; ---------------------------
17A8 A507 PCALC: LDA ARG2+LO ; ADD ITEM OFFSET IN [ARG2]
17AA 18 CLC ; TO TABLE ADDR IN [ARG1]
17AB 6505 ADC ARG1+LO ; TO FORM A POINTER
17AD 8511 STA I+LO ; IN [I]
17AF A508 LDA ARG2+HI ; SAME FOR MSB
17B1 6506 ADC ARG1+HI
17B3 18 CLC
17B4 6526 ADC ZCODE ; MAKE IT ABSOLUTE
17B6 8512 STA I+HI
17B8 A000 LDY #0 ; ZERO FOR INDEXING
17BA 60 RTS
17BB ; ----
17BB ; PUTP
17BB ; ----
17BB ; SET PROPERTY [ARG2] IN OBJECT [ARG1] EQUAL TO [ARG3]
17BB 20411D ZPUTP: JSR PROPB
17BE 205D1D PUTP1: JSR PROPN
17C1 C507 CMP ARG2+LO
17C3 F008 BEQ PUTP2
17C5 901B BCC PNERR ; ERROR IF LOWER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 60
--- X-OPS ---
17C7 206A1D JSR PROPNX ; TRY NEXT PROPERTY
17CA 4CBE17 JMP PUTP1
17CD 20621D PUTP2: JSR PROPL
17D0 C8 INY ; MAKE [Y] POINT TO 1ST PROPERTY BYTE
17D1 AA TAX ; (SET FLAGS) IF LENGTH IN [A] = 0
17D2 F009 BEQ PUTP3 ; PUT A BYTE
17D4 C901 CMP #1 ; PUT A WORD IF [A] = 1
17D6 D00F BNE PLERR ; ELSE LENGTH IS BAD
17D8 A50A LDA ARG3+HI ; GET MSB OF PROPERTY
17DA 9111 STA (I),Y ; AND STORE IN OBJECT
17DC C8 INY ; POINT TO LSB SLOT
17DD A509 PUTP3: LDA ARG3+LO ; FETCH LSB
17DF 9111 STA (I),Y ; AND STORE IN OBJECT
17E1 60 RTS
17E2 ; *** ERROR #10: BAD PROPERTY NUMBER ***
17E2 A90A PNERR: LDA #10
17E4 4CC41D JMP ZERROR
17E7 ; *** ERROR #11: PUTP PROPERTY LENGTH ***
17E7 A90B PLERR: LDA #11
17E9 4CC41D JMP ZERROR
17EC ; ------
17EC ; PRINTC
17EC ; ------
17EC ; PRINT CHAR WITH ASCII VALUE IN [ARG1]
17EC A505 ZPRC: LDA ARG1+LO ; GRAB THE CHAR
17EE 4C451E JMP COUT ; AND SHIP IT OUT
17F1 ; ------
17F1 ; PRINTN
17F1 ; ------
17F1 ; PRINT VALUE OF [ARG1] AS A SIGNED INTEGER
17F1 A505 ZPRN: LDA ARG1+LO ; MOVE [ARG1] TO [QUOT]
17F3 8556 STA QUOT+LO
17F5 A506 LDA ARG1+HI
17F7 8557 STA QUOT+HI
17F9 ; PRINT [QUOT]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 61
--- X-OPS ---
17F9 A557 NUMBER: LDA QUOT+HI ; IF VALUE IS POSITIVE
17FB 1008 BPL DIGCNT ; CONTINUE
17FD A92D LDA #$2D ; ELSE START WITH A MINUS SIGN
17FF 20451E JSR COUT
1802 207C16 JSR ABQUOT ; AND CALC ABS([QUOT])
1805 ; COUNT # OF DECIMAL DIGITS
1805 A900 DIGCNT: LDA #0 ; RESET
1807 855E STA DIGITS ; DIGIT INDEX
1809 A556 DGC: LDA QUOT+LO ; IS QUOTIENT
180B 0557 ORA QUOT+HI ; ZERO YET?
180D F012 BEQ PRNTN3 ; YES, READY TO PRINT
180F A90A LDA #10 ; ELSE DIVIDE [QUOT]
1811 8558 STA REMAIN+LO ; BY 10 (LSB)
1813 A900 LDA #0
1815 8559 STA REMAIN+HI ; 10 (MSB)
1817 208A16 JSR UDIV ; UNSIGNED DIVIDE
181A A558 LDA REMAIN+LO ; FETCH LSB OF REMAINDER (THE DIGIT)
181C 48 PHA ; SAVE IT ON STACK
181D E65E INC DIGITS ; UPDATE DIGIT COUNT
181F D0E8 BNE DGC ; LOOP TILL QUOTIENT=0
1821 A55E PRNTN3: LDA DIGITS ; IF DIGIT COUNT IS NZ
1823 D005 BNE PRNTN4 ; CONTINUE
1825 A930 LDA #'0' ; ELSE PRINT "0"
1827 4C451E JMP COUT ; AND RETURN
182A 68 PRNTN4: PLA ; PULL A DIGIT OFF THE STACK
182B 18 CLC
182C 6930 ADC #'0' ; CONVERT TO ASCII
182E 20451E JSR COUT ; AND PRINT IT
1831 C65E DEC DIGITS ; OUT OF DIGITS YET?
1833 D0F5 BNE PRNTN4 ; NO, KEEP LOOPING
1835 60 RTS
1836 ; ------
1836 ; RANDOM
1836 ; ------
1836 ; RETURN A RANDOM VALUE BETWEEN 0 AND [ARG1]
1836 A505 ZRAND: LDA ARG1+LO ; MAKE [ARG1] THE DIVISOR
1838 8507 STA ARG2+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 62
--- X-OPS ---
183A A506 LDA ARG1+HI
183C 8508 STA ARG2+HI
183E 203E1E JSR RANDOM ; GET RANDOM BYTES INTO [A] AND [X]
1841 8605 STX ARG1+LO ; MAKE THEM THE DIVIDEND
1843 297F AND #$7F ; MAKE SURE MSB IS POSITIVE
1845 8506 STA ARG1+HI
1847 203E16 JSR DIVIDE ; SIGNED DIVIDE, [ARG1] / [ARG2]
184A A558 LDA REMAIN+LO ; MOVE REMAINDER
184C 850F STA VALUE+LO ; INTO [VALUE]
184E A559 LDA REMAIN+HI
1850 8510 STA VALUE+HI
1852 20B611 JSR INCVAL ; INCREMENT [VALUE]
1855 4CEE10 JMP PUTVAL ; AND RETURN RESULT
1858 ; ----
1858 ; PUSH
1858 ; ----
1858 ; PUSH [ARG1] ONTO THE Z-STACK
1858 A605 ZPUSH: LDX ARG1+LO
185A A506 LDA ARG1+HI
185C 4CCA10 JMP PUSHXA
185F ; ---
185F ; POP
185F ; ---
185F ; POP WORD OFF Z-STACK, STORE IN VARIABLE [ARG1]
185F 20B010 ZPOP: JSR POPVAL ; VALUE INTO [VALUE]
1862 A505 LDA ARG1+LO ; GET VARIABLE ID
1864 4CDD10 JMP VARPUT ; AND CHANGE THE VARIABLE
END
INCLUD READ.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 63
--- READ HANDLER ---
1867 ; ----
1867 ; READ
1867 ; ----
1867 ; READ LINE INTO TABLE [ARG1]; PARSE INTO TABLE [ARG2]
1867 20081F ZREAD: JSR ZUSL ; UPDATE THE STATUS LINE
186A A506 LDA ARG1+HI ; MAKE THE TABLE ADDRESSES
186C 18 CLC ; ABSOLUTE
186D 6526 ADC ZCODE ; LSBS NEED NOT CHANGE
186F 8506 STA ARG1+HI
1871 A508 LDA ARG2+HI
1873 18 CLC
1874 6526 ADC ZCODE
1876 8508 STA ARG2+HI
1878 208D21 JSR INPUT ; READ LINE; RETURN LENGTH IN [A]
187B 8545 STA LINLEN ; SAVE # CHARS IN LINE
187D A900 LDA #0
187F 8546 STA WRDLEN ; INIT # CHARS IN WORD COUNTER
1881 A001 LDY #1 ; POINT TO "# WORDS READ" SLOT
1883 9107 STA (ARG2),Y ; AND CLEAR IT ([A] = 0)
1885 8443 STY SOURCE ; INIT SOURCE TABLE PNTR ([Y] = 1)
1887 C8 INY ; = 2
1888 8444 STY RESULT ; AND RESULT TABLE POINTER
188A ; MAIN LOOP STARTS HERE
188A A000 READL: LDY #0 ; POINT TO "MAX WORDS" SLOT
188C B107 LDA (ARG2),Y ; AND READ IT
188E F004 BEQ RLERR ; PATCH IF ZERO
1890 C93C CMP #60 ; OKAY IF < 60
1892 9004 BCC RL0
1894 A93B RLERR: LDA #59 ; MAXIMUM VALUE IS 59 (BM 5/14/85)
1896 9107 STA (ARG2),Y
1898 C8 RL0: INY ; POINT TO "# WORDS READ" SLOT
1899 D107 CMP (ARG2),Y ; TOO MANY WORDS?
189B 9006 BCC RLEX ; EXIT IF SO (BM 5/1/85)
189D A545 RL1: LDA LINLEN
189F 0546 ORA WRDLEN ; OUT OF CHARS AND WORDS?
18A1 D001 BNE RL2 ; NOT YET
18A3 60 RLEX: RTS ; ELSE EXIT
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 64
--- READ HANDLER ---
18A4 A546 RL2: LDA WRDLEN ; GET WORD LENGTH
18A6 C906 CMP #6 ; 6 CHARS DONE?
18A8 9003 BCC RL3 ; NO, KEEP GOING
18AA 203B19 JSR FLUSHW ; ELSE FLUSH REMAINDER OF WORD
18AD A546 RL3: LDA WRDLEN ; GET WORD LENGTH AGAIN
18AF D024 BNE READL2 ; CONTINUE IF NOT FIRST CHAR
18B1 ; START A NEW WORD
18B1 A205 LDX #5 ; CLEAR Z-WORD INPUT BUFFER
18B3 9537 RLL: STA IN,X ; [A] = 0
18B5 CA DEX
18B6 10FB BPL RLL
18B8 202D19 JSR EFIND ; GET BASE ADDRESS INTO [ENTRY]
18BB A543 LDA SOURCE ; STORE THE START POS OF THE WORD
18BD A003 LDY #3 ; INTO THE "WORD START" SLOT
18BF 9147 STA (ENTRY),Y ; OF THE RESULT TABLE
18C1 A8 TAY
18C2 B105 LDA (ARG1),Y ; GET A CHAR FROM SOURCE BUFFER
18C4 206819 JSR SIB ; IS IT A SELF-INSERTING BREAK?
18C7 B026 BCS DOSIB ; YES IF CARRY WAS SET
18C9 205619 JSR NORM ; IS IT A "NORMAL" BREAK?
18CC 9007 BCC READL2 ; NO, CONTINUE
18CE E643 INC SOURCE ; ELSE FLUSH THE STRANDED BREAK
18D0 C645 DEC LINLEN ; UPDATE # CHARS LEFT IN LINE
18D2 4C8A18 JMP READL ; AND LOOP
18D5 A545 READL2: LDA LINLEN ; OUT OF CHARS YET?
18D7 F01E BEQ READL3 ; LOOKS THAT WAY
18D9 A443 LDY SOURCE
18DB B105 LDA (ARG1),Y ; ELSE GRAB NEXT CHAR
18DD 205119 JSR BREAK ; IS IT A BREAK?
18E0 B015 BCS READL3 ; YES IF CARRY WAS SET
18E2 A646 LDX WRDLEN ; ELSE STORE THE CHAR
18E4 9537 STA IN,X ; INTO THE INPUT BUFFER
18E6 C645 DEC LINLEN ; ONE LESS CHAR IN LINE
18E8 E646 INC WRDLEN ; ONE MORE IN WORD
18EA E643 INC SOURCE ; POINT TO NEXT CHAR IN SOURCE
18EC 4C8A18 JMP READL ; AND LOOP BACK
18EF 8537 DOSIB: STA IN ; PUT THE BREAK INTO 1ST WORD SLOT
18F1 C645 DEC LINLEN ; ONE LESS CHAR IN LINE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 65
--- READ HANDLER ---
18F3 E646 INC WRDLEN ; ONE MORE IN WORD BUFFER
18F5 E643 INC SOURCE ; POINT TO NEXT SOURCE CHAR
18F7 A546 READL3: LDA WRDLEN ; ANY CHARS IN WORD YET?
18F9 F08F BEQ READL ; APPARENTLY NOT, SO LOOP BACK
18FB 202D19 JSR EFIND ; GET ENTRY ADDR INTO [ENTRY]
18FE A546 LDA WRDLEN ; GET ACTUAL LNGTH OF WORD
1900 A002 LDY #2 ; STORE IT IN "WORD LENGTH" SLOT
1902 9147 STA (ENTRY),Y ; OF THE CURRENT ENTRY
1904 20291C JSR CONZST ; CONVERT ASCII IN [IN] TO Z-STRING
1907 207A19 JSR FINDW ; AND LOOK IT UP IN VOCABULARY
190A A001 LDY #1
190C B107 LDA (ARG2),Y ; FETCH THE # WORDS READ
190E 18 CLC
190F 6901 ADC #1 ; INCREMENT IT
1911 9107 STA (ARG2),Y ; AND UPDATE
1913 202D19 JSR EFIND ; MAKE [ENTRY] POINT TO ENTRY
1916 A000 LDY #0
1918 8446 STY WRDLEN ; CLEAR # CHARS IN WORD
191A A510 LDA VALUE+HI ; GET MSB OF VOCAB ENTRY ADDRESS
191C 9147 STA (ENTRY),Y ; AND STORE IN 1ST SLOT OF ENTRY
191E C8 INY
191F A50F LDA VALUE+LO ; ALSO STORE LSB IN 2ND SLOT
1921 9147 STA (ENTRY),Y
1923 A544 LDA RESULT ; UPDATE THE
1925 18 CLC ; RESULT TABLE POINTER
1926 6904 ADC #4 ; SO IT POINTS TO THE
1928 8544 STA RESULT ; NEXT ENTRY
192A 4C8A18 JMP READL ; AND LOOP BACK
192D ; -----------------------------------
192D ; FIND BASE ADDR OF RESULT ENTRY SLOT
192D ; -----------------------------------
192D A507 EFIND: LDA ARG2+LO ; LSB OF RESULT TABLE BASE
192F 18 CLC
1930 6544 ADC RESULT ; AND CURRENT POINTER
1932 8547 STA ENTRY+LO ; SAVE IN [ENTRY]
1934 A508 LDA ARG2+HI ; ALSO ADD MSB
1936 6900 ADC #0
1938 8548 STA ENTRY+HI
193A 60 RTS
193B ; ----------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 66
--- READ HANDLER ---
193B ; FLUSH WORD
193B ; ----------
193B A545 FLUSHW: LDA LINLEN ; ANY CHARS LEFT IN LINE?
193D F011 BEQ FLEX ; NO, SCRAM
193F A443 LDY SOURCE ; GET CURRENT CHAR POINTER
1941 B105 LDA (ARG1),Y ; AND GRAB A CHAR
1943 205119 JSR BREAK ; IS IT A BREAK?
1946 B008 BCS FLEX ; EXIT IF SO
1948 C645 DEC LINLEN ; ELSE UPDATE CHAR COUNT
194A E646 INC WRDLEN ; AND WORD-CHAR COUNT
194C E643 INC SOURCE ; AND CHAR POINTER
194E D0EB BNE FLUSHW ; AND LOOP BACK (ALWAYS)
1950 60 FLEX: RTS
1951 ; ---------------------------------
1951 ; IS CHAR IN [A] ANY TYPE OF BREAK?
1951 ; ---------------------------------
1951 206819 BREAK: JSR SIB ; CHECK FOR A SIB FIRST
1954 B022 BCS FBRK ; EXIT NOW IF MATCHED
1956 ; ELSE FALL THROUGH ...
1956 ; --------------------------------
1956 ; IS CHAR IN [A] A "NORMAL" BREAK?
1956 ; --------------------------------
1956 A205 NORM: LDX #NBRKS-1 ; NUMBER OF "NORMAL" BREAKS
1958 DD6219 NBL: CMP BRKTBL,X ; MATCHED?
195B F01B BEQ FBRK ; YES, EXIT
195D CA DEX
195E 10F8 BPL NBL ; NO, KEEP LOOKING
1960 18 CLC ; NO MATCH, CLEAR CARRY
1961 60 RTS ; AND RETURN
1962 ; ------------------
1962 ; NORMAL BREAK CHARS
1962 ; ------------------
1962 213F2C2E BRKTBL: DB "!?,." ; IN ORDER OF
1966 0D DB EOL ; ASCENDING FREQUENCY
1967 20 DB SPACE ; SPACE CHAR IS TESTED FIRST FOR SPEED
0006 NBRKS EQU $-BRKTBL ; # NORMAL BREAKS
1968 ; ---------------------
1968 ; IS CHAR IN [A] A SIB?
1968 ; ---------------------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 67
--- READ HANDLER ---
1968 AA SIB: TAX ; SAVE TEST CHAR
1969 A000 LDY #0 ; 1ST BYTE IN VOCAB TABLE
196B B131 LDA (VOCAB),Y ; HAS # SIBS
196D A8 TAY ; USE AS AN INDEX
196E 8A TXA ; RESTORE TEST CHAR
196F D131 SBL: CMP (VOCAB),Y ; MATCHED?
1971 F005 BEQ FBRK ; YES, REPORT IT
1973 88 DEY
1974 D0F9 BNE SBL ; ELSE KEEP LOOPING
1976 18 CLC ; NO MATCH, SO
1977 60 RTS ; EXIT WITH CARRY CLEAR
1978 38 FBRK: SEC ; EXIT WITH CARRY SET
1979 60 RTS ; IF MATCHED WITH A BREAK CHAR
197A ; -----------------
197A ; VOCABULARY SEARCH
197A ; -----------------
197A ; ENTRY: 4-BYTE TARGET Z-WORD IN [OUT]
197A ; EXIT: ABS ENTRY ADDRESS IN [VALUE] IF FOUND;
197A ; OTHERWISE [VALUE] = 0
197A A000 FINDW: LDY #0 ; GET # SIBS
197C B131 LDA (VOCAB),Y ; IN VOCAB TABLE
197E 18 CLC ; INCREMENT IT
197F 6901 ADC #1 ; FOR PROPER ALIGNMENT
1981 6531 ADC VOCAB+LO ; NOW ADD THE BASE ADDR OF THE TABLE
1983 850F STA VALUE+LO ; TO GET THE ACTUAL BASE ADDR
1985 A532 LDA VOCAB+HI ; OF THE VOCAB ENTRIES
1987 6900 ADC #0 ; WHICH IS SAVED
1989 8510 STA VALUE+HI ; IN [VALUE]
198B B10F LDA (VALUE),Y ; GET # BYTES PER ENTRY ([Y] = 0)
198D 854B STA ESIZE ; SAVE IT HERE
198F 20B611 JSR INCVAL ; POINT TO NEXT BYTE
1992 B10F LDA (VALUE),Y ; GET # ENTRIES IN TABLE (MSB)
1994 854A STA NENTS+HI ; AND STUFF IT IN [NENTS]
1996 20B611 JSR INCVAL ; NEXT BYTE
1999 B10F LDA (VALUE),Y ; DON'T FORGET THE LSB!
199B 8549 STA NENTS+LO
199D 20B611 JSR INCVAL ; [VALUE] NOW POINTS TO 1ST ENTRY
19A0 ; BEGIN THE SEARCH!
19A0 A000 FWL1: LDY #0
19A2 B10F LDA (VALUE),Y ; GET 1ST BYTE OF ENTRY
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OPCODE EXECUTORS PAGE 68
--- READ HANDLER ---
19A4 C53D CMP OUT ; MATCHED 1ST BYTE OF TARGET?
19A6 D015 BNE WNEXT ; NO, SKIP TO NEXT WORD
19A8 C8 INY
19A9 B10F LDA (VALUE),Y
19AB C53E CMP OUT+1 ; 2ND BYTE MATCHED?
19AD D00E BNE WNEXT ; NOPE
19AF C8 INY
19B0 B10F LDA (VALUE),Y
19B2 C53F CMP OUT+2 ; 3RD BYTE?
19B4 D007 BNE WNEXT ; SORRY ...
19B6 C8 INY
19B7 B10F LDA (VALUE),Y
19B9 C540 CMP OUT+3 ; LAST BYTE
19BB F01F BEQ FWSUCC ; FOUND IT!
19BD A54B WNEXT: LDA ESIZE ; GET ENTRY SIZE
19BF 18 CLC ; AND ADD IT TO ENTRY ADDRESS
19C0 650F ADC VALUE+LO ; TO MAKE [VALUE]
19C2 850F STA VALUE+LO ; POINT TO THE NEXT ENTRY
19C4 9002 BCC WNX
19C6 E610 INC VALUE+HI
19C8 A549 WNX: LDA NENTS+LO ; DECREMENT THE
19CA 38 SEC ; ENTRY COUNTER
19CB E901 SBC #1
19CD 8549 STA NENTS+LO
19CF B002 BCS WNX1
19D1 C64A DEC NENTS+HI
19D3 054A WNX1: ORA NENTS+HI ; KEEP SEARCHING
19D5 D0C9 BNE FWL1 ; UNTIL COUNT IS ZERO
19D7 850F STA VALUE+LO
19D9 8510 STA VALUE+HI
19DB 60 RTS ; THEN RETURN WITH [VALUE] = 0
19DC ; ENTRY MATCHED!
19DC A510 FWSUCC: LDA VALUE+HI ; CONVERT ABSOLUTE ENTRY ADDRESS
19DE 38 SEC ; IN [VALUE]
19DF E526 SBC ZCODE ; TO RELATIVE Z-ADDRESS
19E1 8510 STA VALUE+HI ; LSB NEEDN'T CHANGE
19E3 60 RTS
END
INCLUD PAGING.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 69
--- TIME-STAMP PAGING ROUTINE (BM 11/24/84) ---
19E4 ; -------------------------
19E4 ; FETCH NEXT BYTE OF Z-CODE
19E4 ; -------------------------
19E4 ; EXIT: BYTE AT [ZPC] IN [A] & [Y]; FLAGS SET
19E4 A51C NEXTPC: LDA ZPCFLG ; IS [ZPCPNT] VALID?
19E6 D01E BNE NPC2 ; YES, GET THE BYTE
19E8 ; Z-PAGE HAS CHANGED!
19E8 A51A LDA ZPCM ; GET TOP
19EA A41B LDY ZPCH ; 9 BITS OF [ZPC]
19EC D008 BNE NPC0 ; SWAP PAGE IF TOP BIT IS SET
19EE C527 CMP ZPURE ; IS THIS PAGE PRELOADED?
19F0 B004 BCS NPC0 ; NO, SWAP IT IN
19F2 6526 ADC ZCODE ; ELSE MAKE IT ABSOLUTE
19F4 D007 BNE NPC1 ; AND GIVE IT TO [ZPCPNT]
19F6 A200 NPC0: LDX #0
19F8 8622 STX MPCFLG ; INVALIDATE [MPC]
19FA 20501A JSR PAGE ; AND GET ABS PAGE ADDR INTO [A]
19FD 851E NPC1: STA ZPCPNT+HI ; SET ABS PAGE ADDRESS
19FF A2FF LDX #$FF
1A01 861C STX ZPCFLG ; VALIDATE [ZPCPNT]
1A03 E8 INX ; = 0
1A04 861D STX ZPCPNT+LO ; CLEAR LSB OF POINTER
1A06 A419 NPC2: LDY ZPCL ; FETCH PAGE INDEX
1A08 B11D LDA (ZPCPNT),Y ; GET Z-BYTE
1A0A E619 INC ZPCL ; END OF PAGE YET?
1A0C D00A BNE NPC3 ; NO, EXIT
1A0E A000 LDY #0
1A10 841C STY ZPCFLG ; ELSE INVALIDATE [ZPCPNT]
1A12 E61A INC ZPCM ; POINT [ZPC] TO
1A14 D002 BNE NPC3 ; THE NEXT
1A16 E61B INC ZPCH ; Z-PAGE
1A18 A8 NPC3: TAY ; SET FLAGS
1A19 60 RTS ; AND RETURN
1A1A ; -------------------------------
1A1A ; GET NEXT BYTE OF VIRTUAL MEMORY
1A1A ; -------------------------------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 70
--- TIME-STAMP PAGING ROUTINE (BM 11/24/84) ---
1A1A ; EXIT: BYTE AT [MPC] IN [A] & [Y]; FLAGS SET
1A1A A522 GETBYT: LDA MPCFLG ; IS [MPCPNT] VALID?
1A1C D01E BNE GTBT2 ; YES, GET THE BYTE
1A1E ; Z-PAGE HAS CHANGED!
1A1E A520 LDA MPCM ; GET TOP
1A20 A421 LDY MPCH ; 9 BITS OF [MPC]
1A22 D008 BNE GTBT0 ; SWAP PAGE IF TOP BIT IS SET
1A25 PATCH EQU $+1 ; PATCH POINT FOR "VERIFY"
1A24 C527 CMP ZPURE ; IS THIS PAGE PRELOADED?
1A26 B004 BCS GTBT0 ; NO, SWAP IT IN
1A28 6526 ADC ZCODE ; ELSE MAKE IT ABSOLUTE
1A2A D007 BNE GTBT1 ; AND GIVE IT TO [MPCPNT]
1A2C A200 GTBT0: LDX #0
1A2E 861C STX ZPCFLG ; INVALIDATE [ZPC]
1A30 20501A JSR PAGE ; AND GET ABS PAGE ADDR INTO [A]
1A33 8524 GTBT1: STA MPCPNT+HI ; SET ABS PAGE ADDRESS
1A35 A2FF LDX #$FF
1A37 8622 STX MPCFLG ; VALIDATE [MPCPNT]
1A39 E8 INX ; = 0
1A3A 8623 STX MPCPNT+LO ; CLEAR LSB OF POINTER
1A3C A41F GTBT2: LDY MPCL ; FETCH PAGE INDEX
1A3E B123 LDA (MPCPNT),Y ; GET Z-BYTE
1A40 E61F INC MPCL ; END OF PAGE YET?
1A42 D00A BNE GTBT3 ; NO, EXIT
1A44 A000 LDY #0
1A46 8422 STY MPCFLG ; ELSE INVALIDATE [MPCPNT]
1A48 E620 INC MPCM ; POINT [MPC] TO
1A4A D002 BNE GTBT3 ; THE NEXT
1A4C E621 INC MPCH ; Z-PAGE
1A4E A8 GTBT3: TAY ; SET FLAGS
1A4F 60 RTS ; AND RETURN
1A50 ; ------------------------
1A50 ; LOCATE A SWAPABLE Z-PAGE
1A50 ; ------------------------
1A50 ; ENTRY: TARGET Z-PAGE IN [A/Y] (9 BITS)
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 71
--- TIME-STAMP PAGING ROUTINE (BM 11/24/84) ---
1A50 ; EXIT: ABSOLUTE PAGE IN [A]
1A50 852B PAGE: STA TARGET+LO ; SAVE THE
1A52 842C STY TARGET+HI ; TARGET Z-PAGE HERE
1A54 ; IS THIS Z-PAGE ALREADY PAGED IN?
1A54 A200 LDX #0
1A56 862A STX ZPAGE ; START AT BUFFER #0
1A58 DD000B PG1: CMP PTABL,X ; LSB MATCHED?
1A5B D008 BNE PG2 ; NO, TRY NEXT BUFFER
1A5D 98 TYA ; ELSE CHECK
1A5E DDA00B CMP PTABH,X ; TOP BIT
1A61 F02B BEQ PG4 ; MATCHED! BUFFER IN [ZPAGE]
1A63 A52B LDA TARGET+LO ; ELSE RESTORE LSB
1A65 E62A PG2: INC ZPAGE ; UPDATE TALLY
1A67 E8 INX
1A68 E429 CPX PMAX ; OUT OF BUFFERS YET?
1A6A 90EC BCC PG1 ; NO, KEEP SEARCHING
1A6C ; SWAP IN THE TARGET PAGE
1A6C 20C71A PG3: JSR EARLY ; GET EARLIEST PAGE
1A6F A62E LDX SWAP ; INTO [SWAP] & [X]
1A71 862A STX ZPAGE ; SAVE FOR LATER
1A73 A52B LDA TARGET+LO ; ASSIGN THE TARGET PAGE
1A75 9D000B STA PTABL,X ; TO THE EARLIEST BUFFER
1A78 8570 STA DBLOCK+LO ; ALSO GIVE IT TO ZDOS
1A7A A52C LDA TARGET+HI ; SAME FOR TOP BIT
1A7C 2901 AND #%00000001 ; USE ONLY BIT 0
1A7E 9DA00B STA PTABH,X
1A81 8571 STA DBLOCK+HI
1A83 8A TXA
1A84 18 CLC
1A85 6528 ADC PAGE0 ; CALC ABS ADDR OF BUFFER
1A87 8573 STA DBUFF+HI ; GIVE IT TO ZDOS
1A89 208A23 JSR GETDSK ; SWAP IN THE NEW PAGE
1A8C B034 BCS DISKE ; ERROR IF CARRY SET
1A8E ; UPDATE THE TIMESTAMP
1A8E A42A PG4: LDY ZPAGE ; GET THE BUFFER INDEX
1A90 B9500C LDA LRUMAP,Y ; GET THIS BUFFER'S STAMP
1A93 C52D CMP STAMP ; SAME AS CURRENT STAMP?
1A95 F025 BEQ PG8 ; YES, EXIT
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 72
--- TIME-STAMP PAGING ROUTINE (BM 11/24/84) ---
1A97 E62D INC STAMP ; UPDATE STAMP
1A99 D01C BNE PG7 ; CONTINUE IF NO OVERFLOW
1A9B ; HANDLE STAMP OVERFLOW
1A9B 20C71A JSR EARLY ; GET EARLIEST STAMP INTO [LRU]
1A9E A200 LDX #0 ; INIT INDEX
1AA0 BD500C PG5: LDA LRUMAP,X ; GET A STAMP READING
1AA3 F006 BEQ PG6 ; EXIT IF ALREADY ZERO
1AA5 38 SEC ; ELSE SUBTRACT OFF
1AA6 E525 SBC LRU ; THE EARLIEST TIMESTAMP
1AA8 9D500C STA LRUMAP,X ; AND REPLACE THE STAMP
1AAB E8 PG6: INX
1AAC E429 CPX PMAX ; END OF SWAPPING SPACE?
1AAE 90F0 BCC PG5 ; LOOP TILL ALL STAMPS FIXED
1AB0 A900 LDA #0 ; TURN BACK THE CLOCK
1AB2 38 SEC ; TO REFLECT NEW
1AB3 E525 SBC LRU ; STAMP READING
1AB5 852D STA STAMP
1AB7 A52D PG7: LDA STAMP ; FETCH STAMP
1AB9 99500C STA LRUMAP,Y ; STAMP TARGET PAGE WITH IT
1ABC A52A PG8: LDA ZPAGE ; GET BUFFER INDEX
1ABE 18 CLC ; MAKE IT
1ABF 6528 ADC PAGE0 ; ABSOLUTE
1AC1 60 RTS ; AND RETURN IT IN [A]
1AC2 ; *** ERROR #14: DRIVE ACCESS ***
1AC2 A90E DISKE: LDA #14
1AC4 4CC41D JMP ZERROR
1AC7 ; -------------------------
1AC7 ; LOCATE EARLIEST TIMESTAMP
1AC7 ; -------------------------
1AC7 ; EXIT: [LRU] - EARLIEST TIMESTAMP
1AC7 ; [SWAP] = INDEX TO EARLIEST BUFFER
1AC7 A200 EARLY: LDX #0 ; INIT INDEX
1AC9 862E STX SWAP ; AND [SWAP]
1ACB AD500C LDA LRUMAP ; GET STAMP OF BUFFER #0
1ACE E8 INX ; START COMPARE WITH BUFFER #1
1ACF DD500C EAR0: CMP LRUMAP,X ; IS THIS STAMP EARLIER THAN [A]?
1AD2 9005 BCC EAR1 ; NO, TRY NEXT STAMP
1AD4 BD500C LDA LRUMAP,X ; ELSE FETCH EARLIER ENTRY
1AD7 862E STX SWAP ; AND REMEMBER WHERE WE FOUND IT
1AD9 E8 EAR1: INX ; POINT TO NEXT STAMP
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 73
--- TIME-STAMP PAGING ROUTINE (BM 11/24/84) ---
1ADA E429 CPX PMAX ; OUT OF STAMPS YET?
1ADC 90F1 BCC EAR0 ; LOOP TILL EMPTY
1ADE 8525 STA LRU ; SAVE EARLIEST STAMP HERE
1AE0 60 RTS
1AE1 ; -------------------------
1AE1 ; POINT [MPC] TO V-ADDR [I]
1AE1 ; -------------------------
1AE1 A511 SETWRD: LDA I+LO
1AE3 851F STA MPCL
1AE5 A512 LDA I+HI
1AE7 8520 STA MPCM
1AE9 A900 LDA #0
1AEB 8521 STA MPCH ; ZERO TOP BIT
1AED 8522 STA MPCFLG ; INVALIDATE [MPC]
1AEF 60 RTS
1AF0 ; ----------------------------
1AF0 ; GET Z-WORD AT [MPC] INTO [I]
1AF0 ; ----------------------------
1AF0 201A1A GETWRD: JSR GETBYT
1AF3 8512 STA I+HI
1AF5 201A1A JSR GETBYT
1AF8 8511 STA I+LO
1AFA 60 RTS
END
INCLUD ZSTRING.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 74
--- Z-STRING HANDLERS ---
1AFB ; -----------------------
1AFB ; POINT TO ZSTRING IN [I]
1AFB ; -----------------------
1AFB A511 SETSTR: LDA I+LO ; WORD-ALIGN THE ADDRESS
1AFD 0A ASL A
1AFE 851F STA MPCL
1B00 A512 LDA I+HI
1B02 2A ROL A
1B03 8520 STA MPCM
1B05 A900 LDA #0
1B07 8522 STA MPCFLG ; [MPC] IS CHANGING!
1B09 2A ROL A
1B0A 8521 STA MPCH
1B0C 60 ZSTEX: RTS
1B0D ; -----------------------
1B0D ; PRINT Z-STRING AT [MPC]
1B0D ; -----------------------
1B0D A200 PZSTR: LDX #0
1B0F 864C STX PSET ; ASSUME PERMANENT CHARSET
1B11 8650 STX ZFLAG ; CLEAR BYTE FLAG
1B13 CA DEX ; = $FF
1B14 864D STX TSET ; NO TEMPSET ACTIVE
1B16 20E11B PZTOP: JSR GETZCH ; GET A Z-CHAR
1B19 B0F1 BCS ZSTEX ; END OF STRING IF CARRY IS SET
1B1B 854E STA ZCHAR ; ELSE SAVE CHAR HERE
1B1D AA TAX ; SET FLAGS
1B1E F041 BEQ BLANK ; PRINT SPACE IF CHAR = 0
1B20 C904 CMP #4 ; IS THIS AN F-WORD?
1B22 905B BCC DOFREQ ; APPARENTLY SO
1B24 C906 CMP #6 ; PERHAPS A SHIFT CODE?
1B26 903D BCC NEWSET ; YES, CHANGE CHARSETS
1B28 20D51B JSR GETSET ; ELSE GET CHARSET
1B2B AA TAX ; SET FLAGS
1B2C D00B BNE SET1 ; SKIP IF NOT CHARSET #0
1B2E ; PRINT A LOWER-CASE CHAR (CHARSET #0)
1B2E A95B LDA #$61-6 ; ASCII "a" MINUS Z-OFFSET
1B30 18 TOASC: CLC
1B31 654E ADC ZCHAR ; ADD Z-CHAR INDEX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 75
--- Z-STRING HANDLERS ---
1B33 20451E SHOVE: JSR COUT ; SHOW THE CHAR
1B36 4C161B JMP PZTOP ; AND GRAB NEXT CHAR
1B39 ; PRINT AN UPPER-CASE CHAR (CHARSET #1)
1B39 C901 SET1: CMP #1 ; MAKE SURE IT'S SET #1
1B3B D004 BNE SET2 ; ELSE MUST BE SET #2
1B3D A93B LDA #$41-6 ; ASCII "A" MINUS Z-OFFSET
1B3F D0EF BNE TOASC ; SAME AS SET #0
1B41 ; PRINT FROM CHARSET #2
1B41 A54E SET2: LDA ZCHAR ; RETRIEVE THE Z-CHAR
1B43 38 SEC
1B44 E906 SBC #6 ; ZERO-ALIGN IT
1B46 F007 BEQ DIRECT ; IF ZERO, IT'S A "DIRECT" ASCII
1B48 AA TAX ; OTHERWISE USE CODE AS AN INDEX
1B49 BDFE1C LDA CHRTBL,X ; INTO THE CHARSET TABLE
1B4C 4C331B JMP SHOVE ; AND PRINT THE CHAR
1B4F ; DECODE A "DIRECT" ASCII CHAR
1B4F 20E11B DIRECT: JSR GETZCH ; FETCH NEXT Z-CHAR
1B52 0A ASL A
1B53 0A ASL A
1B54 0A ASL A
1B55 0A ASL A
1B56 0A ASL A ; SHIFT INTO POSITION
1B57 854E STA ZCHAR ; AND SAVE HERE
1B59 20E11B JSR GETZCH ; GRAB YET ANOTHER Z-CHAR
1B5C 054E ORA ZCHAR ; SUPERIMPOSE THE 2ND BYTE
1B5E 4C331B JMP SHOVE ; AND PRINT THE RESULT
1B61 ; PRINT A SPACE
1B61 A920 BLANK: LDA #SPACE ; ASCII SPACE CHAR
1B63 D0CE BNE SHOVE
1B65 ; CHANGE CHARSET
1B65 38 NEWSET: SEC ; CONVERT THE SHIFT CODE
1B66 E903 SBC #3 ; TO 1 OR 2
1B68 A8 TAY
1B69 20D51B JSR GETSET ; IS MODE TEMPORARY?
1B6C D005 BNE TOPERM ; YES, DO A PERMSHIFT
1B6E 844D STY TSET ; ELSE JUST A TEMPSHIFT
1B70 4C161B JMP PZTOP ; AND CONTINUE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 76
--- Z-STRING HANDLERS ---
1B73 844C TOPERM: STY PSET ; SET PERM CHARSET
1B75 C54C CMP PSET ; SAME AS BEFORE?
1B77 F09D BEQ PZTOP ; YES, CONTINUE
1B79 A900 LDA #0
1B7B 854C STA PSET ; ELSE RESET CHARSET
1B7D F097 BEQ PZTOP ; BEFORE LOOPING BACK
1B7F ; PRINT AN F-WORD
1B7F 38 DOFREQ: SEC
1B80 E901 SBC #1 ; ZERO-ALIGN THE CODE
1B82 0A ASL A ; AND MULTIPLY TIMES 64
1B83 0A ASL A ; TO OBTAIN THE SEGMENT OFFSET
1B84 0A ASL A ; INTO THE F-WORDS TABLE
1B85 0A ASL A
1B86 0A ASL A
1B87 0A ASL A
1B88 854F STA OFFSET ; SAVE OFFSET FOR LATER
1B8A 20E11B JSR GETZCH ; NOW GET THE F-WORD POINTER
1B8D 0A ASL A ; WORD-ALIGN IT
1B8E 18 CLC ; AND
1B8F 654F ADC OFFSET ; ADD THE SEGMENT OFFSET
1B91 A8 TAY ; TO GET THE OFFSET OF THE F-WORD
1B92 B133 LDA (FWORDS),Y ; FROM THE START OF THE F-WORDS TABLE
1B94 8512 STA I+HI ; SAVE MSB OF F-WORD ADDRESS
1B96 C8 INY
1B97 B133 LDA (FWORDS),Y ; ALSO SAVE LSB
1B99 8511 STA I+LO ; Z-ADDRESS OF F-WORD IS IN [I]
1B9B ; SAVE THE STATE OF CURRENT Z-STRING
1B9B A521 LDA MPCH
1B9D 48 PHA
1B9E A520 LDA MPCM
1BA0 48 PHA
1BA1 A51F LDA MPCL
1BA3 48 PHA
1BA4 A54C LDA PSET
1BA6 48 PHA
1BA7 A550 LDA ZFLAG
1BA9 48 PHA
1BAA A552 LDA ZWORD+HI
1BAC 48 PHA
1BAD A551 LDA ZWORD+LO
1BAF 48 PHA
1BB0 20FB1A JSR SETSTR ; PRINT THE Z-STRING
1BB3 200D1B JSR PZSTR ; IN [I]
1BB6 ; RESTORE OLD Z-STRING
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 77
--- Z-STRING HANDLERS ---
1BB6 68 PLA
1BB7 8551 STA ZWORD+LO
1BB9 68 PLA
1BBA 8552 STA ZWORD+HI
1BBC 68 PLA
1BBD 8550 STA ZFLAG
1BBF 68 PLA
1BC0 854C STA PSET
1BC2 68 PLA
1BC3 851F STA MPCL
1BC5 68 PLA
1BC6 8520 STA MPCM
1BC8 68 PLA
1BC9 8521 STA MPCH
1BCB A2FF LDX #$FF
1BCD 864D STX TSET ; DISABLE TEMP CHARSET
1BCF E8 INX ; = 0
1BD0 8622 STX MPCFLG ; [MPC] HAS CHANGED
1BD2 4C161B JMP PZTOP ; CONTINUE INNOCENTLY
1BD5 ; ----------------------
1BD5 ; RETURN CURRENT CHARSET
1BD5 ; ----------------------
1BD5 A54D GETSET: LDA TSET
1BD7 1003 BPL GS
1BD9 A54C LDA PSET
1BDB 60 RTS
1BDC A0FF GS: LDY #$FF
1BDE 844D STY TSET
1BE0 60 RTS
1BE1 ; -----------------
1BE1 ; FETCH NEXT Z-CHAR
1BE1 ; -----------------
1BE1 A550 GETZCH: LDA ZFLAG ; WHICH BYTE IS THIS?
1BE3 1002 BPL GTZ0 ; $FF = LAST
1BE5 38 SEC ; SET CARRY TO INDICATE
1BE6 60 RTS ; NO MORE CHARS
1BE7 D013 GTZ0: BNE GETZ1 ; NOT FIRST CHAR, EITHER
1BE9 ; GET A Z-WORD INTO [ZWORD], RETURN 1ST CHAR IN TRIPLET
1BE9 E650 INC ZFLAG ; UPDATE CHAR COUNT
1BEB 201A1A JSR GETBYT ; GET TRIPLET AT [MPC]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 78
--- Z-STRING HANDLERS ---
1BEE 8552 STA ZWORD+HI ; INTO [ZWORD]
1BF0 201A1A JSR GETBYT
1BF3 8551 STA ZWORD+LO
1BF5 A552 LDA ZWORD+HI
1BF7 4A LSR A
1BF8 4A LSR A ; SHIFT 1ST CHAR INTO PLACE
1BF9 4C251C JMP GTEXIT ; AND RETURN IT
1BFC 38 GETZ1: SEC
1BFD E901 SBC #1
1BFF D016 BNE GETZ2 ; LAST CHAR IN TRIPLET IF ZERO
1C01 A902 LDA #2 ; ELSE
1C03 8550 STA ZFLAG ; RESET CHAR INDEX
1C05 A551 LDA ZWORD+LO ; GET BOTTOM HALF OF TRIPLET
1C07 8511 STA I+LO ; MOVE HERE FOR SHIFTING
1C09 A552 LDA ZWORD+HI ; GET TOP HALF
1C0B 0611 ASL I+LO ; SHIFT THE TOP 3 BITS OF LOWER HALF
1C0D 2A ROL A ; INTO THE BOTTOM OF THE TOP HALF
1C0E 0611 ASL I+LO
1C10 2A ROL A
1C11 0611 ASL I+LO
1C13 2A ROL A
1C14 4C251C JMP GTEXIT
1C17 A900 GETZ2: LDA #0 ; SET FLAG TO INDICATE
1C19 8550 STA ZFLAG ; END OF TRIPLET
1C1B A552 LDA ZWORD+HI ; TEST TOP HALF OF TRIPLET
1C1D 1004 BPL GETZ3 ; CONTINUE IF NOT END OF STRING
1C1F A9FF LDA #$FF ; ELSE
1C21 8550 STA ZFLAG ; INDICATE LAST TRIPLET IN STRING
1C23 A551 GETZ3: LDA ZWORD+LO ; GET BOTTOM HALF OF TRIPLET
1C25 291F GTEXIT: AND #%00011111 ; MASK OUT GARBAGE BITS
1C27 18 CLC
1C28 60 RTS
1C29 ; ---------------------------------
1C29 ; CONVERT [IN] TO Z-STRING IN [OUT]
1C29 ; ---------------------------------
1C29 A905 CONZST: LDA #$05 ; FILL OUTPUT BUFFER
1C2B AA TAX ; WITH PAD CHARS ($05)
1C2C 953D CZSL: STA OUT,X
1C2E CA DEX
1C2F 10FB BPL CZSL
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 79
--- Z-STRING HANDLERS ---
1C31 A906 LDA #6 ; INIT
1C33 8553 STA CONCNT ; CHAR COUNT
1C35 A900 LDA #0 ; CLEAR
1C37 8554 STA CONIN ; SOURCE AND
1C39 8555 STA CONOUT ; OUTPUT INDEXES
1C3B A654 CONTOP: LDX CONIN ; FETCH SOURCE INDEX
1C3D E654 INC CONIN ; AND UPDATE
1C3F B537 LDA IN,X ; GRAB AN ASCII CHAR
1C41 854E STA ZCHAR ; SAVE IT HERE
1C43 D004 BNE NEXTZ ; CONTINUE IF CHAR WAS NZ
1C45 A905 LDA #5 ; ELSE SHIP OUT
1C47 D02C BNE CSHIP ; A PAD CHAR
1C49 A54E NEXTZ: LDA ZCHAR
1C4B 20BF1C JSR SAYSET ; WHICH CHARSET TO USE?
1C4E F020 BEQ CSET0 ; LOWER-CASE IF ZERO
1C50 18 CLC ; ELSE DO A TEMP-SHIFT
1C51 6903 ADC #3 ; 4 = CHARSET 1, 5 = CHARSET 2
1C53 A655 LDX CONOUT ; FETCH OUTPUT INDEX
1C55 953D STA OUT,X ; SEND THE SHIFT CHAR
1C57 E655 INC CONOUT ; UPDATE INDEX
1C59 C653 DEC CONCNT ; AND CHAR COUNT
1C5B D003 BNE CTEST ; IF OUT OF CHARS
1C5D 4CD81C JMP ZCRUSH ; CRUSH 'EM!
1C60 A54E CTEST: LDA ZCHAR ; TEST CHAR AGAIN
1C62 20BF1C JSR SAYSET
1C65 C902 CMP #2
1C67 F019 BEQ CSET2 ; CHARSET #2
1C69 ; HANDLE CHARSET #1 (UPPER CASE ALPHA)
1C69 A54E LDA ZCHAR
1C6B 38 SEC
1C6C E93B SBC #$41-6 ; CONVERT TO Z-CHAR
1C6E 1005 BPL CSHIP ; AND SEND TO OUTPUT
1C70 ; HANDLE CHARSET #0 (LOWER CASE ALPHA)
1C70 A54E CSET0: LDA ZCHAR
1C72 38 SEC
1C73 E95B SBC #$61-6 ; CONVERT TO Z-CHAR
1C75 ; SHIP Z-CHAR TO OUTPUT BUFFER
1C75 A655 CSHIP: LDX CONOUT ; FETCH OUTPUT INDEX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 80
--- Z-STRING HANDLERS ---
1C77 953D STA OUT,X
1C79 E655 INC CONOUT ; UPDATE INDEX
1C7B C653 DEC CONCNT ; DONE 6 CHARS YET?
1C7D D0BC BNE CONTOP ; NO, LOOP BACK
1C7F 4CD81C JMP ZCRUSH ; ELSE CRUSH
1C82 ; HANDLE CHARSET #2 (MISCELLANEOUS)
1C82 A54E CSET2: LDA ZCHAR ; GRAB CHAR
1C84 20AF1C JSR CTABLE ; IS IT IN CHARSET #3 TABLE?
1C87 D0EC BNE CSHIP ; YES, SEND IT TO OUTPUT
1C89 ; SEND A "DIRECT" ASCII CHAR
1C89 A906 LDA #6 ; ASCII ALERT!
1C8B A655 LDX CONOUT
1C8D 953D STA OUT,X
1C8F E655 INC CONOUT ; UPDATE INDEX
1C91 C653 DEC CONCNT ; AND CHAR COUNT
1C93 F043 BEQ ZCRUSH ; BUFFER FULL!
1C95 ; SEND 1ST HALF OF "DIRECT"
1C95 A54E LDA ZCHAR
1C97 4A LSR A
1C98 4A LSR A
1C99 4A LSR A
1C9A 4A LSR A
1C9B 4A LSR A
1C9C 2903 AND #%00000011 ; MASK GARBAGE
1C9E A655 LDX CONOUT
1CA0 953D STA OUT,X
1CA2 E655 INC CONOUT
1CA4 C653 DEC CONCNT
1CA6 F030 BEQ ZCRUSH ; BUFFER FULL!
1CA8 ; SEND 2ND HALF OF "DIRECT"
1CA8 A54E LDA ZCHAR ; GET CHAR YET AGAIN
1CAA 291F AND #%00011111 ; MASK JUNK
1CAC 4C751C JMP CSHIP ; AND SHIP IT OUT
1CAF ; ---------------------
1CAF ; IS [A] IN CHARSET #3?
1CAF ; ---------------------
1CAF ; EXIT: [A] = CHAR CODE IF FOUND, Z-FLAG CLEARED
1CAF ; Z-FLAG SET IF NOT FOUND
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 81
--- Z-STRING HANDLERS ---
1CAF A219 CTABLE: LDX #25
1CB1 DDFE1C CNL: CMP CHRTBL,X
1CB4 F004 BEQ CNOK
1CB6 CA DEX
1CB7 D0F8 BNE CNL
1CB9 60 RTS ; Z-FLAG SET IF NO MATCH
1CBA 8A CNOK: TXA ; CHAR CODE IS INDEX
1CBB 18 CLC
1CBC 6906 ADC #6 ; PLUS 6
1CBE 60 RTS
1CBF ; -----------------------------
1CBF ; RETURN CHARSET OF CHAR IN [A]
1CBF ; -----------------------------
1CBF C961 SAYSET: CMP #'a'
1CC1 9007 BCC SAY1
1CC3 C97B CMP #'z'+1
1CC5 B003 BCS SAY1
1CC7 A900 LDA #0 ; IT'S CHARSET #0
1CC9 60 RTS
1CCA C941 SAY1: CMP #'A'
1CCC 9007 BCC SAY2
1CCE C95B CMP #'Z'+1
1CD0 B003 BCS SAY2
1CD2 A901 LDA #1 ; IT'S CHARSET #1
1CD4 60 RTS
1CD5 A902 SAY2: LDA #2 ; IT'S CHARSET #2
1CD7 60 RTS
1CD8 ; ----------------------
1CD8 ; CRUSH Z-CHARS IN [OUT]
1CD8 ; ----------------------
1CD8 A53E ZCRUSH: LDA OUT+1 ; GET 2ND Z-CHAR
1CDA 0A ASL A ; SHIFT BITS INTO POSITION
1CDB 0A ASL A
1CDC 0A ASL A
1CDD 0A ASL A
1CDE 263D ROL OUT ; ALONG WITH 1ST Z-CHAR
1CE0 0A ASL A
1CE1 263D ROL OUT
1CE3 053F ORA OUT+2 ; SUPERIMPOSE 3RD Z-CHAR
1CE5 853E STA OUT+1
1CE7 A541 LDA OUT+4 ; GET 5TH Z-CHAR
1CE9 0A ASL A ; SHIFT BITS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 82
--- Z-STRING HANDLERS ---
1CEA 0A ASL A
1CEB 0A ASL A
1CEC 0A ASL A
1CED 2640 ROL OUT+3 ; ALONG WITH 4TH Z-CHAR
1CEF 0A ASL A
1CF0 2640 ROL OUT+3
1CF2 0542 ORA OUT+5 ; SUPERIMPOSE 6TH Z-CHAR
1CF4 AA TAX ; SAVE HERE
1CF5 A540 LDA OUT+3 ; GRAB 4TH Z-CHAR
1CF7 0980 ORA #%10000000 ; SET HIGH BIT
1CF9 853F STA OUT+2 ; MOVE CRUSHED Z-WORD
1CFB 8640 STX OUT+3 ; INTO PLACE
1CFD 60 RTS
1CFE ; -----------------------
1CFE ; CHARSET #2 DECODE TABLE
1CFE ; -----------------------
1CFE 00 CHRTBL: DB 0 ; DUMMY BYTE FOR "DIRECT"
1CFF 0D DB $0D ; EOL
1D00 30313233 DB "0123456789.,!?_#"
1D10 27 DB $27 ; SINGLE QUOTE
1D11 22 DB $22 ; DOUBLE QUOTE
1D12 2F5C2D3A DB "/\-:()"
END
INCLUD OBJECTS.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 83
--- OBJECT & PROPERTY HANDLERS ---
1D18 ; ----------------------------------
1D18 ; GET ABSOLUTE ADDRESS OF OBJECT [A]
1D18 ; ----------------------------------
1D18 ; EXIT: ADDRESS IN [I]
1D18 8511 OBJLOC: STA I+LO ; SAVE LSB FOR ADDING
1D1A A200 LDX #0 ; CLEAR MSB
1D1C 8612 STX I+HI ; FOR SHIFTING
1D1E 0A ASL A ; MULTIPLY BY 8
1D1F 2612 ROL I+HI
1D21 0A ASL A
1D22 2612 ROL I+HI
1D24 0A ASL A
1D25 2612 ROL I+HI
1D27 18 CLC ; ADD TO ITSELF
1D28 6511 ADC I+LO ; TO GET TIMES 9
1D2A 9002 BCC OBJ1
1D2C E612 INC I+HI
1D2E 18 OBJ1: CLC
1D2F 6935 ADC #53 ; NOW ADD 53
1D31 9002 BCC OBJ2 ; (THE OBJECT TABLE OFFSET)
1D33 E612 INC I+HI
1D35 18 OBJ2: CLC ; NEXT ADD THE ABS ADDR
1D36 6535 ADC OBJTAB+LO ; OF THE OBJECT TABLE
1D38 8511 STA I+LO
1D3A A512 LDA I+HI
1D3C 6536 ADC OBJTAB+HI
1D3E 8512 STA I+HI
1D40 60 RTS
1D41 ; -----------------------------
1D41 ; GET ADDRESS OF PROPERTY TABLE
1D41 ; -----------------------------
1D41 ; EXIT: [I] HAS ABSOLUTE ADDR OF PROPERTY TABLE
1D41 ; [Y] HAS OFFSET TO START OF PROP IDS
1D41 A505 PROPB: LDA ARG1+LO
1D43 20181D JSR OBJLOC
1D46 A007 LDY #7
1D48 B111 LDA (I),Y ; GET MSB OF P-TABLE ADDRESS
1D4A 18 CLC
1D4B 6526 ADC ZCODE ; MAKE IT ABSOLUTE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 84
--- OBJECT & PROPERTY HANDLERS ---
1D4D AA TAX ; AND SAVE HERE
1D4E C8 INY
1D4F B111 LDA (I),Y ; NOW GET LSB
1D51 8511 STA I+LO
1D53 8612 STX I+HI ; [I] NOW POINTS TO PROP TABLE
1D55 A000 LDY #0
1D57 B111 LDA (I),Y ; GET LENGTH OF SHORT DESC
1D59 0A ASL A ; WORD-ALIGN IT
1D5A A8 TAY ; EXPECTED HERE
1D5B C8 INY ; POINT JUST PAST THE DESCRIPTION
1D5C 60 RTS
1D5D ; -------------------
1D5D ; FETCH A PROPERTY ID
1D5D ; -------------------
1D5D ; ENTRY: LIKE "PROPB" EXIT
1D5D B111 PROPN: LDA (I),Y
1D5F 291F AND #%00011111 ; MASK OUT LENGTH BITS
1D61 60 RTS
1D62 ; -------------------------------
1D62 ; FETCH # BYTES IN PROPERTY VALUE
1D62 ; -------------------------------
1D62 ; ENTRY: LIKE "PROPB" EXIT
1D62 B111 PROPL: LDA (I),Y
1D64 4A LSR A ; LENGTH IS IN
1D65 4A LSR A ; BITS 7-5
1D66 4A LSR A ; SO SHIFT INTO PLACE
1D67 4A LSR A
1D68 4A LSR A
1D69 60 RTS
1D6A ; ----------------------
1D6A ; POINT TO NEXT PROPERTY
1D6A ; ----------------------
1D6A ; ENTRY: LIKE "PROPB" EXIT
1D6A 20621D PROPNX: JSR PROPL ; GET LENGTH OF CURRENT PROP
1D6D AA TAX ; SAVE HERE
1D6E C8 PPX: INY ; LOOP UNTIL
1D6F CA DEX ; [Y] POINTS TO
1D70 10FC BPL PPX ; START OF NEXT PROP
1D72 C8 INY ; CORRECT ALIGNMENT
1D73 60 RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 85
--- OBJECT & PROPERTY HANDLERS ---
1D74 ; ----------------
1D74 ; GET OBJECT FLAGS
1D74 ; ----------------
1D74 ; ENTRY: OBJECT # IN [ARG1], FLAG # IN [ARG2]
1D74 ; EXIT: FLAG WORD IN [K], BIT ID IN [J],
1D74 ; FLAG WORD ADDRESS IN [I]
1D74 A505 FLAGSU: LDA ARG1+LO
1D76 20181D JSR OBJLOC ; GET OBJECT ADDR IN [I]
1D79 A507 LDA ARG2+LO ; LOOK AT FLAG ID
1D7B C910 CMP #$10 ; FIRST SET OF FLAGS?
1D7D 900F BCC FLS1 ; YES, ADDR IN [I] IS CORRECT
1D7F E910 SBC #16 ; ELSE ZERO-ALIGN FLAG INDEX
1D81 AA TAX ; SAVE IT HERE
1D82 A511 LDA I+LO ; ADD 2 TO ADDRESS IN [I]
1D84 18 CLC ; TO POINT TO ADDRESS OF
1D85 6902 ADC #2 ; 2ND FLAG WORD
1D87 8511 STA I+LO
1D89 9002 BCC FLS0
1D8B E612 INC I+HI
1D8D 8A FLS0: TXA ; RESTORE INDEX
1D8E 8515 FLS1: STA K+LO ; SAVE FLAG ID HERE
1D90 A201 LDX #1 ; INIT THE
1D92 8613 STX J+LO ; FLAG WORD TO
1D94 CA DEX ; $0001
1D95 8614 STX J+HI
1D97 A90F LDA #15 ; SUBTRACT THE BIT POSITION
1D99 38 SEC ; FROM 15
1D9A E515 SBC K+LO ; TO GET THE SHIFT LOOP
1D9C AA TAX ; INDEX
1D9D F007 BEQ FLS2 ; EXIT NOW IF NO SHIFT NEEDED
1D9F 0613 FLSL: ASL J+LO ; SHIFT THE BIT
1DA1 2614 ROL J+HI ; INTO POSITION
1DA3 CA DEX
1DA4 D0F9 BNE FLSL
1DA6 A000 FLS2: LDY #0 ; MOVE THE FLAG WORD
1DA8 B111 LDA (I),Y ; INTO [J]
1DAA 8516 STA K+HI ; FIRST THE MSB
1DAC C8 INY
1DAD B111 LDA (I),Y
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 86
--- OBJECT & PROPERTY HANDLERS ---
1DAF 8515 STA K+LO ; THEN THE LSB
1DB1 60 RTS
END
INCLUD IO.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 87
--- GAME I/O: CBM64 ---
1DB2 ; --------------
1DB2 ; INTERNAL ERROR
1DB2 ; --------------
1DB2 ; ENTRY: ERROR CODE IN [A]
1DB2 496E7465 ERRM: DB "Internal error "
1DC1 30302E ENUMB: DB "00."
0012 ERRML EQU $-ERRM
1DC4 A001 ZERROR: LDY #1 ; CONVERT ERROR BYTE IN [A]
1DC6 20DD27 ECON: JSR DIV10 ; TO ASCII DECIMAL IN [ENUMB]
1DC9 0930 ORA #'0'
1DCB 99C11D STA ENUMB,Y
1DCE 8A TXA
1DCF 88 DEY
1DD0 10F4 BPL ECON
1DD2 20CCFF JSR CLRCHN
1DD5 20831E JSR ZCRLF ; CLEAR BUFFER
1DD8 A900 LDA #0
1DDA 8562 STA SCRIPT ; DISABLE SCRIPTING
1DDC A2B2 LDX #LOW ERRM
1DDE A91D LDA #HIGH ERRM
1DE0 A012 LDY #ERRML
1DE2 20F021 JSR DLINE
1DE5 ; FALL THROUGH ...
1DE5 ; ----
1DE5 ; QUIT
1DE5 ; ----
1DE5 20831E ZQUIT: JSR ZCRLF ; FLUSH BUFFER
1DE8 A2FB LDX #LOW TOQ
1DEA A91D LDA #HIGH TOQ
1DEC A00E LDY #TOQL
1DEE 20F021 JSR DLINE ; "END OF STORY"
1DF1 A502 LDA FAST ; FAST-READ ENGAGED?
1DF3 F003 BEQ FREEZE
1DF5 202629 JSR FOFF ; DISENGAGE IF SO
1DF8 4CF81D FREEZE: JMP FREEZE ; AND STOP
1DFB 456E6420 TOQ: DB "End of story."
1E08 0D DB EOL
000E TOQL EQU $-TOQ
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 88
--- GAME I/O: CBM64 ---
1E09 ; -------
1E09 ; RESTART
1E09 ; -------
1E09 20831E ZSTART: JSR ZCRLF
1E0C A502 LDA FAST ; FAST-READ?
1E0E F003 BEQ DOSTRT ; NO, GO
1E10 202629 JSR FOFF ; ELSE DISENGAGE
1E13 AD112A DOSTRT: LDA ZBEGIN+ZSCRIP+1 ; SAVE SCRIPT STATE
1E16 2901 AND #%00000001 ; FOR LATER
1E18 8D0322 STA SFLAG ; (BM 5/14/85)
1E1B 4C7F0E JMP WARM1 ; AND DO A WARMSTART
1E1E ; --------------------
1E1E ; PRINT VERSION NUMBER
1E1E ; --------------------
1E1E 43424D20 VERS: DB "CBM 64 Version D"
1E2E 0D DB EOL
0011 VERSL EQU $-VERS
1E2F 20831E VERNUM: JSR ZCRLF
1E32 A21E LDX #LOW VERS
1E34 A91E LDA #HIGH VERS
1E36 A011 LDY #VERSL
1E38 4CF021 JMP DLINE
1E3B ; --------------------------
1E3B ; RETURN TOP RAM PAGE IN [A]
1E3B ; --------------------------
1E3B A9CF MEMTOP: LDA #$CF ; IT'S A GIVEN
1E3D 60 RTS
1E3E ; --------------------------------
1E3E ; RETURN RANDOM BYTES IN [A] & [X]
1E3E ; --------------------------------
1E3E AD1BD4 RANDOM: LDA RAND ; SOMETHING FROM HERE
1E41 AE12D0 LDX RASTER ; AND HERE
1E44 60 RTS
1E45 ; -------------------
1E45 ; Z-PRINT A CHARACTER
1E45 ; -------------------
1E45 ; ENTRY: ASCII CHAR IN [A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 89
--- GAME I/O: CBM64 ---
1E45 C90D COUT: CMP #EOL ; IF EOL,
1E47 F03A BEQ ZCRLF ; DO IT!
1E49 C920 CMP #SPACE ; IGNORE ALL OTHER
1E4B 900B BCC CEX ; CONTROLS
1E4D A660 LDX LENGTH ; ELSE GET LINE POINTER
1E4F 9D0002 STA LBUFF,X ; ADD CHAR TO BUFFER
1E52 E027 CPX #XSIZE ; END OF LINE?
1E54 B003 BCS FLUSH ; YES, FLUSH THE LINE
1E56 E660 INC LENGTH ; ELSE UPDATE POINTER
1E58 60 CEX: RTS
1E59 ; -------------------
1E59 ; FLUSH OUTPUT BUFFER
1E59 ; -------------------
1E59 ; ENTRY: LENGTH OF BUFFER IN [X]
1E59 A920 FLUSH: LDA #SPACE
1E5B DD0002 FL0: CMP LBUFF,X ; FIND LAST SPACE CHAR
1E5E F005 BEQ FL1 ; IN THE LINE
1E60 CA DEX
1E61 D0F8 BNE FL0 ; IF NONE FOUND,
1E63 A227 LDX #XSIZE ; FLUSH ENTIRE LINE
1E65 8661 FL1: STX OLDLEN ; SAVE OLD LINE POS HERE
1E67 8660 STX LENGTH ; MAKE IT THE NEW LINE LENGTH
1E69 20831E JSR ZCRLF ; PRINT LINE UP TO LAST SPACE
1E6C ; START NEW LINE WITH REMAINDER OF OLD
1E6C A661 LDX OLDLEN ; GET OLD LINE POS
1E6E A000 LDY #0 ; START NEW LINE AT BEGINNING
1E70 E8 FL2: INX
1E71 E027 CPX #XSIZE ; CONTINUE IF
1E73 9005 BCC FL3 ; INSIDE OR
1E75 F003 BEQ FL3 ; AT END OF LINE
1E77 8460 STY LENGTH ; ELSE SET NEW LINE LENGTH
1E79 60 RTS
1E7A BD0002 FL3: LDA LBUFF,X ; GET CHAR FROM OLD LINE
1E7D 990002 STA LBUFF,Y ; MOVE TO START OF NEW LINE
1E80 C8 INY ; UPDATE LENGTH OF NEW LINE
1E81 D0ED BNE FL2
1E83 ; ---------------
1E83 ; CARRIAGE RETURN
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 90
--- GAME I/O: CBM64 ---
1E83 ; ---------------
1E83 E665 ZCRLF: INC LINCNT ; NEW LINE GOING OUT
1E85 A565 LDA LINCNT ; IS IT TIME TO
1E87 C566 CMP LMAX ; PRINT "MORE" YET?
1E89 9041 BCC CR1 ; NO, CONTINUE
1E8B ; SCREEN FULL; PRINT "MORE"
1E8B 20081F JSR ZUSL ; UPDATE STATUS LINE
1E8E A900 LDA #0
1E90 8565 STA LINCNT ; RESET LINE COUNTER
1E92 8D8602 STA COLOR ; PRINT "MORE" IN BLACK
1E95 85C6 STA NDX ; CLEAR QUEUE
1E97 38 SEC
1E98 20F0FF JSR PLOT ; GET CURSOR POSITION
1E9B 8463 STY OLDX
1E9D 8664 STX OLDY
1E9F A2EF LDX #LOW MORE
1EA1 A91E LDA #HIGH MORE
1EA3 A006 LDY #MOREL
1EA5 20F021 JSR DLINE ; PRINT "MORE" DIRECTLY
1EA8 20E4FF ZCR0: JSR GETIN ; GET ANY KEYPRESS
1EAB AA TAX
1EAC F0FA BEQ ZCR0
1EAE A463 LDY OLDX
1EB0 A664 LDX OLDY
1EB2 18 CLC
1EB3 20F0FF JSR PLOT ; RESTORE CURSOR
1EB6 A901 LDA #1
1EB8 8D8602 STA COLOR ; SWITCH BACK TO WHITE
1EBB A2F5 LDX #LOW MCLR
1EBD A91E LDA #HIGH MCLR
1EBF A006 LDY #MOREL
1EC1 20F021 JSR DLINE ; RUB OUT "MORE"
1EC4 A463 LDY OLDX
1EC6 A664 LDX OLDY
1EC8 18 CLC
1EC9 20F0FF JSR PLOT ; RESTORE CURSOR AGAIN
1ECC A660 CR1: LDX LENGTH
1ECE A90D LDA #EOL ; INSTALL EOL AT
1ED0 9D0002 STA LBUFF,X ; END OF CURRENT LINE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 91
--- GAME I/O: CBM64 ---
1ED3 E660 INC LENGTH ; UPDATE LINE LENGTH
1ED5 A460 LINOUT: LDY LENGTH ; IF BUFFER EMPTY,
1ED7 F011 BEQ LINEX ; DON'T PRINT ANYTHING
1ED9 846F STY PRLEN ; SAVE LENGTH HERE FOR "PPRINT"
1EDB A200 LDX #0 ; SEND CONTENTS OF [LBUFF]
1EDD BD0002 LOUT: LDA LBUFF,X ; TO SCREEN
1EE0 202821 JSR CHAR
1EE3 E8 INX
1EE4 88 DEY
1EE5 D0F6 BNE LOUT
1EE7 200422 JSR PPRINT ; PRINT [LBUFF] IF ENABLED
1EEA A900 LINEX: LDA #0 ; RESET LINE LENGTH
1EEC 8560 STA LENGTH ; TO ZERO
1EEE 60 RTS ; AND RETURN
1EEF 5B4D4F52 MORE: DB "[MORE]"
0006 MOREL EQU $-MORE
1EF5 20202020 MCLR: DB " "
1EFB ; ----------------------
1EFB ; UPDATE THE STATUS LINE
1EFB ; ----------------------
1EFB 53636F72 SCORE: DB "Score: "
0007 SCOREL EQU $-SCORE
1F02 54696D65 CLOCK: DB "Time: "
0006 CLOCKL EQU $-CLOCK
1F08 38 ZUSL: SEC ; SAVE THE CURRENT
1F09 20F0FF JSR PLOT ; CURSOR POSITION
1F0C 8463 STY OLDX
1F0E 8664 STX OLDY
1F10 A560 LDA LENGTH ; SAVE ALL
1F12 48 PHA ; STRING-PRINTING
1F13 A521 LDA MPCH ; VARIABLES
1F15 48 PHA
1F16 A520 LDA MPCM
1F18 48 PHA
1F19 A51F LDA MPCL
1F1B 48 PHA
1F1C A54D LDA TSET
1F1E 48 PHA
1F1F A54C LDA PSET
1F21 48 PHA
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 92
--- GAME I/O: CBM64 ---
1F22 A552 LDA ZWORD+HI
1F24 48 PHA
1F25 A551 LDA ZWORD+LO
1F27 48 PHA
1F28 A550 LDA ZFLAG
1F2A 48 PHA
1F2B A55E LDA DIGITS
1F2D 48 PHA
1F2E A227 LDX #XSIZE
1F30 BD0002 USL0: LDA LBUFF,X ; MOVE CONTENTS OF [LBUFF]
1F33 9D200D STA BUFSAV,X ; TO [BUFSAV]
1F36 A920 LDA #SPACE ; CLEAR
1F38 9D0002 STA LBUFF,X ; [LBUFF] WITH SPACES
1F3B CA DEX
1F3C 10F2 BPL USL0
1F3E A900 LDA #0
1F40 8560 STA LENGTH ; RESET LINE LENGTH
1F42 8562 STA SCRIPT ; DISABLE SCRIPTING
1F44 8D8602 STA COLOR ; PRINT STATUS LINE IN BLACK
1F47 A913 LDA #$13 ; HOME THE
1F49 20D2FF JSR CHROUT ; CURSOR
1F4C A912 LDA #$12 ; PRINT IN
1F4E 20D2FF JSR CHROUT ; INVERSE VIDEO
1F51 ; PRINT ROOM DESCRIPTION
1F51 A910 LDA #16 ; GLOBAL VAR #16 (ROOM ID)
1F53 20A310 JSR GETVRG ; GET IT INTO [VALUE]
1F56 A50F LDA VALUE+LO
1F58 209D13 JSR PRNTDC ; PRINT SHORT ROOM DESCRIPTION
1F5B A918 LDA #24 ; MOVE LINE INDEX UP
1F5D 8560 STA LENGTH ; TO TIME/SCORE POSITION
1F5F A911 LDA #17 ; GLOBAL VAR #17 (SCORE/HOURS)
1F61 20A310 JSR GETVRG ; GET IT INTO [VALUE]
1F64 A55F LDA TIMEFL ; GET MODE FLAG
1F66 D032 BNE DOTIME ; USE TIME MODE IF NON-ZERO
1F68 ; PRINT "SCORE"
1F68 A953 LDA #'S'
1F6A 20451E JSR COUT
1F6D A963 LDA #'c'
1F6F 20451E JSR COUT
1F72 A96F LDA #'o'
1F74 20451E JSR COUT
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 93
--- GAME I/O: CBM64 ---
1F77 A972 LDA #'r'
1F79 20451E JSR COUT
1F7C A965 LDA #'e'
1F7E 20451E JSR COUT
1F81 A93A LDA #':'
1F83 20451E JSR COUT
1F86 A920 LDA #SPACE
1F88 20451E JSR COUT
1F8B A50F LDA VALUE+LO ; MOVE SCORE VALUE
1F8D 8556 STA QUOT+LO ; INTO [QUOT]
1F8F A510 LDA VALUE+HI ; FOR PRINTING
1F91 8557 STA QUOT+HI
1F93 20F917 JSR NUMBER ; PRINT SCORE VALUE IN DECIMAL
1F96 A92F LDA #'/' ; PRINT A SLASH
1F98 D035 BNE MOVMIN ; BRANCH ALWAYS
1F9A ; PRINT "TIME"
1F9A A954 DOTIME: LDA #'T'
1F9C 20451E JSR COUT
1F9F A969 LDA #'i'
1FA1 20451E JSR COUT
1FA4 A96D LDA #'m'
1FA6 20451E JSR COUT
1FA9 A965 LDA #'e'
1FAB 20451E JSR COUT
1FAE A93A LDA #':'
1FB0 20451E JSR COUT
1FB3 A920 LDA #SPACE
1FB5 20451E JSR COUT
1FB8 A50F LDA VALUE+LO ; 00 IS REALLY 24
1FBA D002 BNE DT0
1FBC A918 LDA #24
1FBE C90D DT0: CMP #13 ; IS HOURS > 12,
1FC0 9002 BCC DT1
1FC2 E90C SBC #12 ; CONVERT TO 1-12
1FC4 8556 DT1: STA QUOT+LO ; MOVE FOR PRINTING
1FC6 A900 LDA #0
1FC8 8557 STA QUOT+HI ; CLEAR MSB
1FCA 20F917 JSR NUMBER
1FCD A93A LDA #':' ; COLON
1FCF 20451E MOVMIN: JSR COUT ; PRINT SLASH OR COLON
1FD2 A912 LDA #18 ; GLOBAL VAR #18 (MOVES/MINUTES)
1FD4 20A310 JSR GETVRG ; GET IT INTO [VALUE]
1FD7 A50F LDA VALUE+LO ; MOVE TO [QUOT]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 94
--- GAME I/O: CBM64 ---
1FD9 8556 STA QUOT+LO ; FOR EVENTUAL PRINTING
1FDB A510 LDA VALUE+HI
1FDD 8557 STA QUOT+HI
1FDF A55F LDA TIMEFL ; WHICH MODE?
1FE1 D006 BNE DOMINS ; TIME IF NZ
1FE3 ; PRINT NUMBER OF MOVES
1FE3 20F917 JSR NUMBER ; SHOW # MOVES
1FE6 4C1520 JMP STATEX ; ALL DONE
1FE9 ; PRINT MINUTES
1FE9 A50F DOMINS: LDA VALUE+LO ; CHECK MINUTES
1FEB C90A CMP #10 ; IF MORE THAN TEN
1FED B005 BCS DOM0 ; CONTINUE
1FEF A930 LDA #'0' ; ELSE PRINT A
1FF1 20451E JSR COUT ; PADDING "0" FIRST
1FF4 20F917 DOM0: JSR NUMBER ; SHOW MINUTES
1FF7 A920 LDA #SPACE
1FF9 20451E JSR COUT ; SEPARATE THINGS
1FFC A911 LDA #17 ; CHECK "HOURS" AGAIN
1FFE 20A310 JSR GETVRG
2001 A50F LDA VALUE+LO
2003 C90C CMP #12 ; PAST NOON?
2005 B004 BCS DOPM ; YES, PRINT "PM"
2007 A941 LDA #'A' ; ELSE PRINT "AM"
2009 D002 BNE DOXM ; BRANCH ALWAYS
200B A950 DOPM: LDA #'P'
200D 20451E DOXM: JSR COUT
2010 A94D LDA #'M'
2012 20451E JSR COUT
2015 ; STATUS LINE READY
2015 A928 STATEX: LDA #40 ; PRINT THE ENTIRE
2017 8560 STA LENGTH ; STATUS LINE
2019 20CC1E JSR CR1
201C A227 LDX #XSIZE ; RESTORE OLD [LBUFF]
201E BD200D USLX: LDA BUFSAV,X
2021 9D0002 STA LBUFF,X
2024 CA DEX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 95
--- GAME I/O: CBM64 ---
2025 10F7 BPL USLX
2027 68 PLA ; RESTORE ALL
2028 855E STA DIGITS ; SAVED VARIABLES
202A 68 PLA
202B 8550 STA ZFLAG
202D 68 PLA
202E 8551 STA ZWORD+LO
2030 68 PLA
2031 8552 STA ZWORD+HI
2033 68 PLA
2034 854C STA PSET
2036 68 PLA
2037 854D STA TSET
2039 68 PLA
203A 851F STA MPCL
203C 68 PLA
203D 8520 STA MPCM
203F 68 PLA
2040 8521 STA MPCH
2042 68 PLA
2043 8560 STA LENGTH
2045 A664 LDX OLDY ; RESTORE CURSOR
2047 A463 LDY OLDX
2049 18 CLC
204A 20F0FF JSR PLOT
204D A2FF LDX #$FF
204F 8662 STX SCRIPT ; RE-ENABLE SCRIPTING
2051 E8 INX ; = 0
2052 8622 STX MPCFLG ; INVALIDATE [MPC]
2054 E8 INX ; = 1
2055 8E8602 STX COLOR ; PRINT IN WHITE AGAIN
2058 60 RTS
END
INCLUD MACHINE.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 96
--- MACHINE-DEPENDENT I/O: CBM64 ---
2059 ; ----------------------------
2059 ; FETCH ASCII KEYCODE INTO [A]
2059 ; ----------------------------
2059 ; EXIT: ASCII IN [A] & [IOCHAR]
00E0 CYCLE EQU $E0 ; SHORT BLINK CYCLE
2059 8A GETKEY: TXA ; SAVE [X] & [Y]
205A 48 PHA
205B 98 TYA
205C 48 PHA
205D A2FF GKEY0: LDX #$FF
205F 8E4003 STX CURSOR ; FORCE THE CURSOR "ON"
2062 E8 INX ; = 0
2063 867B STX BLINK+LO ; RESET THE BLINK COUNTER
2065 867C STX BLINK+HI ; FOR A LONG DELAY
2067 38 SEC ; GET CURSOR POSITION
2068 20F0FF JSR PLOT ; [Y]=XPOS, [X]=YPOS
206B 8A TXA ; CALC SPRITE Y-POS
206C 0A ASL A
206D 0A ASL A
206E 0A ASL A
206F 18 CLC
2070 6939 ADC #57
2072 8D01D0 STA SP0Y
2075 98 TYA ; GET X-POS INTO [A]
2076 C928 CMP #40 ; STRIP OFF
2078 9002 BCC NOLOG ; LOGICAL LINE OFFSET
207A E928 SBC #40
207C A200 NOLOG: LDX #0
207E C91D CMP #29 ; IF X-POS < 29
2080 9001 BCC CURX ; MSB OF SPRITE POS IS ZERO
2082 E8 INX ; ELSE SET BIT 0
2083 8E10D0 CURX: STX MSIGX ; OF X-POS MSB
2086 0A ASL A ; CALC LSB OF SPRITE X-POS
2087 0A ASL A
2088 0A ASL A
2089 18 CLC
208A 6918 ADC #24
208C 8D00D0 STA SP0X
208F 20E4FF GKEY1: JSR GETIN ; GET A KEY
2092 AA TAX ; SAVE HERE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 97
--- MACHINE-DEPENDENT I/O: CBM64 ---
2093 E67B INC BLINK+LO ; TIME TO BLINK YET?
2095 D010 BNE NOBLIN ; NOT TILL BOTH BLINK TIMERS
2097 E67C INC BLINK+HI ; ARE ZERO
2099 D00C BNE NOBLIN
209B A9E0 LDA #CYCLE ; RESET MSB OF BLINK COUNTER
209D 857C STA BLINK+HI ; FOR SHORT BLINK INTERVAL
209F AD4003 LDA CURSOR ; FLIP THE CURSOR
20A2 49FF EOR #$FF ; SHAPE
20A4 8D4003 STA CURSOR ; AND UPDATE IT
20A7 8A NOBLIN: TXA ; KEY BEING PRESSED?
20A8 F0E5 BEQ GKEY1 ; NOT IF CODE WAS ZERO
20AA ; CONVERT & MASK KEYCODE IN [A]
20AA C941 CMP #'A' ; CONVERT UNSHIFTED ALPHA
20AC 9006 BCC MASK ; TO ASCII LOWER CASE
20AE C95B CMP #'Z'+1
20B0 B002 BCS MASK
20B2 6920 ADC #$20
20B4 297F MASK: AND #%01111111 ; SCREEN OUT SHIFTS
20B6 C90D CMP #EOL ; EOL?
20B8 F02A BEQ TICK
20BA C914 CMP #BACKSP ; BACKSPACE?
20BC F026 BEQ TICK
20BE C920 CMP #SPACE ; ANYTHING ELSE < "SPACE"
20C0 901C BCC BADKEY ; IS BAD
20C2 C93C CMP #'<' ; CHANGE "<"
20C4 D004 BNE MASK0 ; TO ","
20C6 A92C LDA #','
20C8 D01A BNE TICK
20CA C93E MASK0: CMP #'>' ; CHANGE ">"
20CC D004 BNE MASK1 ; TO "."
20CE A92E LDA #'.'
20D0 D012 BNE TICK
20D2 C97B MASK1: CMP #'z'+1 ; PASS L-C ALPHA
20D4 B008 BCS BADKEY
20D6 C961 CMP #'a'
20D8 B00A BCS TICK
20DA C95B CMP #'Z'+1 ; PASS U-C ALPHA
20DC 9006 BCC TICK ; AND OTHER ASCII CHARS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 98
--- MACHINE-DEPENDENT I/O: CBM64 ---
20DE 20E422 BADKEY: JSR BOOP ; REJECT BAD KEYPRESS
20E1 4C5D20 JMP GKEY0 ; AND TRY AGAIN
20E4 ; "CLICK" THE KEY
20E4 8567 TICK: STA IOCHAR ; SAVE KEYCODE HERE
20E6 A91E LDA #30
20E8 8D00D4 STA FRELO1 ; FREQ LSB
20EB A986 LDA #134
20ED 8D01D4 STA FREHI1 ; FREQ MSB
20F0 A900 LDA #0
20F2 A8 TAY ; SET UP CLICK DELAY
20F3 8D06D4 STA SUREL1 ; ZERO SUSTAIN
20F6 A98F LDA #%10001111
20F8 8D18D4 STA SIGVOL ; FULL VOLUME, VOICE #3 OFF
20FB A911 LDA #%00010001
20FD 8D04D4 STA VCREG1 ; ACTIVATE TRIANGLE WAVE
2100 88 CLICK: DEY ; [Y] = 0 ON ENTRY
2101 D0FD BNE CLICK
2103 8C04D4 STY VCREG1 ; STOP THE SOUND
2106 A980 LDA #%10000000 ; ZERO VOLUME
2108 8D18D4 STA SIGVOL ; WITH VOICE #3 OFF
210B 68 PLA ; RESTORE [X] & [Y]
210C A8 TAY
210D 68 PLA
210E AA TAX
210F A567 LDA IOCHAR ; RESTORE CODE INTO [A]
2111 60 RTS
2112 ; -------------------------
2112 ; OUTPUT AN ASCII CHARACTER
2112 ; -------------------------
2112 C961 LETTER: CMP #'a' ; LOWER-CASE?
2114 9005 BCC LET0 ; NO, CONTINUE
2116 295F AND #%01011111 ; ELSE MASK FOR LOWER-CASE
2118 4CD2FF JMP CHROUT
211B C941 LET0: CMP #'A' ; UPPER-CASE?
211D 9006 BCC LETEX
211F C95B CMP #'Z'+1
2121 B002 BCS LETEX
2123 0920 ORA #%00100000 ; MAKE UPPER
2125 4CD2FF LETEX: JMP CHROUT
2128 ; -----------------
2128 ; PRINT CHAR IN [A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 99
--- MACHINE-DEPENDENT I/O: CBM64 ---
2128 ; -----------------
2128 8567 CHAR: STA IOCHAR ; SAVE HERE
212A 8A TXA ; SAVE [X] AND [Y]
212B 48 PHA
212C 98 TYA
212D 48 PHA
212E 38 SEC ; GET CURSOR X- AND Y-POS
212F 20F0FF JSR PLOT ; INTO [Y] AND [X], RESPECTIVELY
2132 98 TYA
2133 C928 CMP #40 ; STRIP OFF THE
2135 9003 BCC CHKEOL ; LOGICAL LINE OFFSET
2137 E928 SBC #40 ; UPDATE [Y] IF NECESSARY
2139 A8 TAY
213A A567 CHKEOL: LDA IOCHAR ; RESTORE CHAR
213C C90D CMP #EOL ; IS IT EOL?
213E F047 BEQ OUTEOL ; YES, SPECIAL HANDLING
2140 ; HANDLE A NON-EOL CHAR
2140 E017 CPX #YSIZE-1 ; ON LAST SCREEN LINE?
2142 9039 BCC NOSCRL ; NO, NO SCROLL NEEDED
2144 C027 CPY #XSIZE ; LAST CHAR ON LINE?
2146 9035 BCC NOSCRL ; NO, DON'T SCROLL
2148 ; SCROLL THE SCREEN
2148 CA DOSCRL: DEX ; PUSH CURSOR UP ONE LINE
2149 18 CLC
214A 20F0FF JSR PLOT ; RESET THE CURSOR
214D A668 LDX SLINE ; GET CURRENT SCROLL LINE
214F E018 SRL0: CPX #YSIZE
2151 F020 BEQ SRL2 ; SCROLL DONE
2153 BD5823 LDA LOLINE,X ; GET ADDR OF DEST LINE
2156 856C STA LTO+LO ; INTO [LTO]
2158 BD7123 LDA HILINE,X
215B 856D STA LTO+HI
215D E8 INX
215E BD5823 LDA LOLINE,X ; GET ADDR OF SOURCE LINE
2161 856A STA LFROM+LO ; INTO [LFROM]
2163 BD7123 LDA HILINE,X
2166 856B STA LFROM+HI
2168 A027 LDY #XSIZE
216A B16A SRL1: LDA (LFROM),Y ; MOVE SOURCE LINE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 100
--- MACHINE-DEPENDENT I/O: CBM64 ---
216C 916C STA (LTO),Y ; TO DEST LINE
216E 88 DEY
216F 10F9 BPL SRL1
2171 30DC BMI SRL0 ; LOOP TILL [X] = YSIZE
2173 A227 SRL2: LDX #XSIZE
2175 A920 LDA #SPACE
2177 9DC007 SRL3: STA SCREEN+960,X ; CLEAR LAST LINE
217A CA DEX ; OF SCREEN RAM
217B 10FA BPL SRL3
217D A567 NOSCRL: LDA IOCHAR ; RESTORE CHAR
217F 201221 JSR LETTER ; OFF TO THE SCREEN!
2182 68 PLA ; RESTORE [X] AND [Y]
2183 A8 TAY
2184 68 PLA
2185 AA TAX
2186 60 RTS
2187 ; HANDLE EOL
2187 E017 OUTEOL: CPX #YSIZE-1 ; LAST SCREEN LINE?
2189 90F2 BCC NOSCRL ; NO, DON'T SCROLL
218B B0BB BCS DOSCRL ; ELSE SCROLL
218D ; ---------------------
218D ; FETCH A LINE OF INPUT
218D ; ---------------------
218D ; ENTRY: ABS ADDR OF READ BUFFER IN [ARG1]
218D ; EXIT: # CHARS READ IN [A]
218D 20D51E INPUT: JSR LINOUT ; FLUSH [LBUFF]
2190 205524 JSR CURSON ; ACTIVATE CURSOR, CLEAR KEY QUEUE
2193 A000 LDY #0
2195 8465 STY LINCNT ; RESET LINE COUNT
2197 205920 INLOOP: JSR GETKEY ; GET ASCII INTO [A] AND [IOCHAR]
219A C90D CMP #EOL ; EOL?
219C F02A BEQ ENDLIN ; LINE DONE IF SO
219E C914 CMP #BACKSP ; BACKSPACE?
21A0 F01C BEQ BACKUP ; SPECIAL HANDLING
21A2 990002 STA LBUFF,Y ; ELSE ADD CHAR TO INPUT BUFFER
21A5 C8 INY ; NEXT POSITION IN LINE
21A6 202821 SHOWIT: JSR CHAR ; SEND TO SCREEN
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 101
--- MACHINE-DEPENDENT I/O: CBM64 ---
21A9 C04D CPY #77 ; 2 SCREEN LINES FULL?
21AB 90EA BCC INLOOP ; NO, GET ANOTHER CHAR
21AD ; HANDLE LINE OVERFLOW
21AD 205920 NOMORE: JSR GETKEY
21B0 C90D CMP #EOL ; IF EOL,
21B2 F014 BEQ ENDLIN ; WRAP UP THE LINE
21B4 C914 CMP #BACKSP ; BACKSPACE
21B6 F006 BEQ BACKUP ; IS OKAY TOO
21B8 20E422 JSR BOOP ; ELSE COMPLAIN
21BB 4CAD21 JMP NOMORE ; AND INSIST
21BE ; HANDLE BACKSPACE
21BE 88 BACKUP: DEY ; BACK UP THE POINTER
21BF 10E5 BPL SHOWIT ; SEND BS IF NOT START OF LINE
21C1 20E422 JSR BOOP ; ELSE SCREAM WITH PAIN
21C4 A000 LDY #0 ; RESET POINTER
21C6 F0CF BEQ INLOOP ; AND WAIT FOR SOMETHING BETTER
21C8 ; HANDLE END OF LINE
21C8 990002 ENDLIN: STA LBUFF,Y ; SHIP EOL TO BUFFER
21CB C8 INY ; UPDATE INDEX
21CC 8445 STY LINLEN ; SAVE HERE FOR "READ"
21CE 846F STY PRLEN ; AND HERE FOR "PPRINT"
21D0 A200 LDX #0
21D2 8E15D0 STX SPENA ; DISABLE CURSOR DMA
21D5 202821 JSR CHAR ; AND SEND EOL TO SCREEN
21D8 ; MOVE [LBUFF] TO [ARG1] W/LC CONVERSION
21D8 B9FF01 LEX1: LDA LBUFF-1,Y ; GET A CHAR FROM [LBUFF]
21DB C941 CMP #'A' ; IF CHAR IS ALPHA,
21DD 9006 BCC LEX2 ; CONVERT TO LOWER CASE
21DF C95B CMP #'Z'+1
21E1 B002 BCS LEX2
21E3 6920 ADC #$20
21E5 9105 LEX2: STA (ARG1),Y ; MOVE CHAR TO INPUT BUFFER AT [ARG1]
21E7 88 DEY ; LOOP TILL
21E8 10EE BPL LEX1 ; ALL CHARS MOVED
21EA 200422 JSR PPRINT ; SCRIPT [LBUFF] IF ENABLED
21ED A545 LDA LINLEN ; RESTORE # CHARS
21EF 60 RTS ; INTO [A]
21F0 ; -----------------------
21F0 ; DIRECT PRINT LINE [X/A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 102
--- MACHINE-DEPENDENT I/O: CBM64 ---
21F0 ; -----------------------
21F0 ; ENTRY: STRING ADDRESS IN [X/A] (LSB/MSB)
21F0 ; STRING LENGTH IN [Y]
21F0 8EF921 DLINE: STX STRING+LO ; DROP STRING ADDRESS
21F3 8DFA21 STA STRING+HI ; INTO DUMMY BYTES
21F6 A200 LDX #0 ; INIT CHAR-FETCH INDEX
21F8 BD DOUT: DB $BD ; 6502 "LDA nnnn,X" OPCODE
21F9 0000 STRING: DW $0000 ; DUMMY OPERAND BYTES
21FB 202821 JSR CHAR
21FE E8 INX
21FF 88 DEY ; LOOP TILL
2200 D0F6 BNE DOUT ; OUT OF CHARS
2202 60 RTS
2203 ; -----------------------
2203 ; SEND [LBUFF] TO PRINTER
2203 ; -----------------------
2203 ; ENTRY: LENTH OF LINE IN [PRLEN]
2203 ; NOW WITH IMPROVED ERROR PROTECTION! (BM 11/24/84)
2203 00 SFLAG: DB 0 ; PREVIOUS SCRIPT MODE (BM 5/14/85)
2204 A562 PPRINT: LDA SCRIPT ; SCRIPTING INTERNALLY ENABLED?
2206 F06F BEQ PEX ; NO, SCRAM IMMEDIATELY
2208 AD112A LDA ZBEGIN+ZSCRIP+1 ; CHECK SCRIPT FLAG
220B 2901 AND #%00000001 ; SCRIPTING ON?
220D F04D BEQ PP3 ; NO, CHECK FOR "UNSCRIPT"
220F A56E LDA PSTAT ; CHECK PRINTER STATUS
2211 3064 BMI PEX ; CAN'T OPEN IF NEGATIVE
2213 D02F BNE PP1 ; ALREADY OPEN, SCRIPT THE LINE
2215 ; OPEN THE PRINTER FOR OUTPUT
2215 A502 LDA FAST ; FAST-READ ENGAGED?
2217 F008 BEQ PP0 ; NO, IGNORE
2219 202629 JSR FOFF ; ELSE DISENGAGE
221C A908 LDA #8
221E 209D27 JSR DOPEN ; AND RESET THE DRIVE
2221 A200 PP0: LDX #0
2223 8602 STX FAST ; BYE, FAST DRIVE!
2225 E8 INX ; = 1
2226 866E STX PSTAT ; SET STATUS TO "PRINTER OPENED" (1)
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 103
--- MACHINE-DEPENDENT I/O: CBM64 ---
2228 A904 LDA #4 ; LOGICAL FILE #4
222A AA TAX ; DEVICE #4
222B A007 LDY #7 ; ALLOW UPPER/LOWER CASE
222D 20BAFF JSR SETLFS ; SET UP LOGICAL FILE
2230 B00C BCS PPERR ; ERROR IF CARRY SET
2232 A900 LDA #0
2234 20BDFF JSR SETNAM ; NO FILENAME REQUIRED
2237 B005 BCS PPERR ; ERROR IF CARRY SET
2239 20C0FF JSR OPEN ; OPEN THE CHANNEL
223C 9006 BCC PP1 ; OPEN OKAY IF CARRY CLEAR
223E A9FF PPERR: LDA #$FF ; ELSE SET PRINTER STATUS
2240 856E STA PSTAT ; TO "CAN'T OPEN"
2242 D022 BNE PP5 ; AND SIMULATE AN "UNSCRIPT"
2244 A204 PP1: LDX #4 ; SET PRINTER CHANNEL
2246 20C9FF JSR CHKOUT ; TO "OUTPUT"
2249 B0F3 BCS PPERR ; ERROR IF CARRY SET
224B A000 LDY #0 ; INIT INDEX
224D B90002 PP2: LDA LBUFF,Y
2250 201221 JSR LETTER
2253 B0E9 BCS PPERR ; ERROR IF CARRY SET
2255 C8 INY
2256 C66F DEC PRLEN
2258 D0F3 BNE PP2
225A F01B BEQ PEX ; RESET & RETURN
225C ; CHECK FOR "UNSCRIPT"
225C A56E PP3: LDA PSTAT ; CHECK PRINTER STATUS
225E F017 BEQ PEX ; EXIT IF PRINTER WAS OFF
2260 3015 BMI PEX ; OR UNOPENABLE
2262 A900 PCLOSE: LDA #0 ; RESET PRINTER STATUS FLAG
2264 856E STA PSTAT ; TO "CLOSED"
2266 ; ENTRY FOR PRINTER ERROR
2266 A904 PP5: LDA #4
2268 20C3FF JSR CLOSE ; CLOSE THE PRINTER CHANNEL
226B A502 LDA FAST ; FAST-READ AVAILABLE?
226D F008 BEQ PEX ; NO, EXIT
226F A908 LDA #8 ; ELSE
2271 209D27 JSR DOPEN ; RESET BOOT DRIVE
2274 4CC128 JMP FINIT ; RE-ENGAGE FAST-READ & RETURN
2277 4CCCFF PEX: JMP CLRCHN
227A ; ------------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 104
--- MACHINE-DEPENDENT I/O: CBM64 ---
227A ; SPLIT SCREEN
227A ; ------------
227A ; SPLIT SCREEN AT LINE [ARG1]
227A ; DISABLE SPLIT IF [ARG1] = 0
227A ; IGNORE IF SPLIT ALREADY ENABLED OR [ARG1] >= 20
227A A605 ZSPLIT: LDX ARG1+LO ; IF [ARG1] = 0,
227C F02F BEQ OFFSPL ; TURN OFF SPLIT SCREEN
227E A569 LDA SPSTAT ; SPLIT ALREADY ENABLED?
2280 D02A BNE SPLEX ; IGNORE REQUEST IF SO
2282 E014 CPX #20 ; IF [ARG1] >= 20,
2284 B026 BCS SPLEX ; IGNORE
2286 E8 INX
2287 8668 STX SLINE ; ELSE SET NEW SPLIT LINE
2289 8669 STX SPSTAT ; SET "SPLIT ENABLED" FLAG
228B BD5823 SPL0: LDA LOLINE,X ; MAKE [LFROM] POINT TO
228E 856A STA LFROM+LO ; LINE [X] IN WINDOW
2290 BD7123 LDA HILINE,X
2293 856B STA LFROM+HI
2295 A027 LDY #XSIZE ; CLEAR LINE [X]
2297 A920 LDA #SPACE
2299 916A SPL1: STA (LFROM),Y
229B 88 DEY
229C 10FB BPL SPL1
229E CA DEX ; DONE ALL LINES?
229F D0EA BNE SPL0 ; LOOP TILL WINDOW CLEARED
22A1 8665 STX LINCNT ; RESET LINE COUNT TO ZERO
22A3 A917 SPCALC: LDA #YSIZE-1 ; CALCULATE # LINES TO SCROLL
22A5 38 SEC ; BEFORE "MORE" APPEARS:
22A6 E568 SBC SLINE ; LMAX = YSIZE-SLINE-1
22A8 8566 STA LMAX
22AA C666 DEC LMAX
22AC 60 SPLEX: RTS
22AD ; --------------------
22AD ; DISABLE SPLIT SCREEN
22AD ; --------------------
22AD 20D422 OFFSPL: JSR TOBOT
22B0 A201 SPLOFF: LDX #1
22B2 8668 STX SLINE ; SPLIT AT LINE 1
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 105
--- MACHINE-DEPENDENT I/O: CBM64 ---
22B4 CA DEX ; = 0
22B5 8669 STX SPSTAT ; TURN OFF STATUS FLAG
22B7 8665 STX LINCNT ; RESET LINE COUNT
22B9 A915 LDA #21
22BB 8566 STA LMAX ; SET MAXIMUM LINE SCROLL
22BD 60 RTS
22BE ; ------
22BE ; SCREEN
22BE ; ------
22BE ; GO TO TOP WINDOW IF [A] = 0
22BE ; GO TO BOTTOM IF [A] = 1
22BE ; IGNORE IF SPLIT NOT ENABLED OR [A] <> 0 OR 1
22BE A569 ZSCRN: LDA SPSTAT ; IF SPLIT NOT ENABLED,
22C0 F0EA BEQ SPLEX ; IGNORE REQUEST
22C2 A505 LDA ARG1+LO ; IF [ARG1] = 0,
22C4 0506 ORA ARG1+HI
22C6 F00C BEQ TOBOT ; GO TO BOTTOM WINDOW
22C8 C901 CMP #1 ; IF [ARG1] <> 1,
22CA D0E0 BNE SPLEX ; IGNORE THE REQUEST
22CC ; SET TO TOP WINDOW
22CC A215 TOTOP: LDX #21 ; TEMPORARILY RESET
22CE 8666 STX LMAX ; [LMAX] TO KILL "MORE"
22D0 A201 LDX #1 ; Y-POS = 1
22D2 D005 BNE DOSCRN
22D4 ; SET TO BOTTOM WINDOW
22D4 20A322 TOBOT: JSR SPCALC ; RE-CALC [LMAX]
22D7 A217 LDX #23 ; Y-POS = 23
22D9 A000 DOSCRN: LDY #0 ; X-POS = 0
22DB 8465 STY LINCNT ; RESET LINE COUNT
22DD 18 CLC
22DE 20F0FF JSR PLOT ; SET CURSOR TO X=[Y], Y=[X]
22E1 4C4A23 JMP NEWLOG ; RESET LINE TABLE & RETURN
22E4 ; ---------
22E4 ; RAZZ USER
22E4 ; ---------
22E4 A900 BOOP: LDA #$00
22E6 8D00D4 STA FRELO1 ; FREQ LSB
22E9 A905 LDA #$05
22EB 8D01D4 STA FREHI1 ; FREQ MSB
22EE A9F0 LDA #%11110000
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 106
--- MACHINE-DEPENDENT I/O: CBM64 ---
22F0 8D06D4 STA SUREL1 ; FULL SUSTAIN
22F3 A98F LDA #%10001111
22F5 8D18D4 STA SIGVOL ; FULL VOLUME
22F8 A941 LDA #%01000001
22FA 8D04D4 STA VCREG1 ; START PULSE
22FD A9FC LDA #252 ; WAIT 4 JIFFIES
22FF 85A2 STA TIME
2301 A5A2 RAZZ: LDA TIME
2303 D0FC BNE RAZZ
2305 8D04D4 STA VCREG1 ; STOP PULSE
2308 A980 LDA #%10000000
230A 8D18D4 STA SIGVOL ; VOLUME OFF
230D 60 RTS
230E ; ------------------------
230E ; CLEAR SCREEN & COLOR RAM
230E ; ------------------------
230E A904 CLS: LDA #HIGH SCREEN ; POINT [I] TO
2310 8512 STA I+HI ; SCREEN RAM
2312 A9D8 LDA #HIGH COLRAM ; POINT [J] TO
2314 8514 STA J+HI ; COLOR RAM
2316 A000 LDY #0 ; RESET PAGE INDEX
2318 8411 STY I+LO ; BOTH RAMS START
231A 8413 STY J+LO ; ON PAGE BOUNDARIES
231C 8C15D0 STY SPENA ; MAKE SURE CURSOR IS DEAD!
231F A204 LDX #4 ; CLEAR 4 PAGES
2321 A920 CLS0: LDA #SPACE ; SPACE CHAR
2323 9111 STA (I),Y ; FOR SCREEN
2325 A901 LDA #1 ; "WHITE" CODE
2327 9113 STA (J),Y ; FOR COLOR RAM
2329 C8 INY
232A D0F5 BNE CLS0
232C E612 INC I+HI ; POINT TO
232E E614 INC J+HI ; NEXT PAGE
2330 CA DEX ; 4 PAGES DONE?
2331 D0EE BNE CLS0 ; LOOP TILL EMPTY
2333 A90D LDA #13 ; RESET THE
2335 8DF807 STA SPT0 ; SPRITE RAM POINTER
2338 20CC22 JSR TOTOP ; SET CURSOR TO (0,1)
233B 20B022 JSR SPLOFF ; DISABLE SPLIT SCREEN
233E 78 SEI
233F A957 LDA #LOW DORTI ; POINT THE SYSTEM NMI VECTOR
2341 8D1803 STA NMINV+LO ; TO A SIMPLE "RTI" INSTRUCTION
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 107
--- MACHINE-DEPENDENT I/O: CBM64 ---
2344 A923 LDA #HIGH DORTI ; TO DISABLE THE STOP/RESTORE EXIT
2346 8D1903 STA NMINV+HI
2349 58 CLI
234A ; FALL THROUGH ...
234A ; ----------------------------
234A ; RESET THE LOGICAL LINE TABLE
234A ; ----------------------------
234A A218 NEWLOG: LDX #24
234C BD7123 NLG0: LDA HILINE,X ; GET MSB OF LINE ADDRESS
234F 0980 ORA #%10000000 ; SET THE HIGH BIT
2351 95D9 STA LDTB1,X ; STORE IN THE LINE TABLE
2353 CA DEX
2354 10F6 BPL NLG0
2356 60 RTS
2357 40 DORTI: RTI ; RTI INSTRUCTION FOR NMI
2358 ; -------------------
2358 ; LINE ADDRESS TABLES
2358 ; -------------------
2358 00285078 LOLINE: DB $00,$28,$50,$78,$A0,$C8,$F0,$18
2360 406890B8 DB $40,$68,$90,$B8,$E0,$08,$30,$58
2368 80A8D0F8 DB $80,$A8,$D0,$F8,$20,$48,$70,$98
2370 C0 DB $C0
2371 04040404 HILINE: DB $04,$04,$04,$04,$04,$04,$04,$05
2379 05050505 DB $05,$05,$05,$05,$05,$06,$06,$06
2381 06060606 DB $06,$06,$06,$06,$07,$07,$07,$07
2389 07 DB $07
END
INCLUD ZDOS.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 108
--- Z-DOS: CBM64 ---
238A ; ---------------------
238A ; GET Z-BLOCK FROM DISK
238A ; ---------------------
238A ; ENTRY: Z-BLOCK # IN [BLOCK]
238A ; TARGET PAGE IN [DBUFF+HI]
238A D8 GETDSK: CLD
238B A908 LDA #8
238D 857A STA DRIVE ; GAME ALWAYS PLAYS FROM DRIVE #8
238F A570 LDA DBLOCK+LO ; Z-BLOCK ID IS DIVIDEND
2391 857D STA DVD+LO
2393 A571 LDA DBLOCK+HI
2395 2901 AND #%00000001 ; MASK ALL BUT BIT 0
2397 857E STA DVD+HI ; FOR 128K VIRTUAL LIMIT
2399 A900 LDA #0
239B 8580 STA DSOR+HI ; CLEAR MSB DIVISOR
239D 8581 STA DTEMP+LO ; AND TEMP VARIABLE
239F 8582 STA DTEMP+HI
23A1 A211 LDX #17 ; USE 17 SECTORS/TRACK
23A3 867F STX DSOR+LO ; LSB OF DIVISOR
23A5 CA DEX ; (= 16) INIT DIVIDE INDEX
23A6 18 CLC
23A7 267D DVLP: ROL DVD+LO
23A9 267E ROL DVD+HI
23AB 2681 ROL DTEMP+LO
23AD 2682 ROL DTEMP+HI
23AF A581 LDA DTEMP+LO
23B1 38 SEC
23B2 E57F SBC DSOR+LO
23B4 A8 TAY
23B5 A582 LDA DTEMP+HI
23B7 E580 SBC DSOR+HI
23B9 9004 BCC DVLP1
23BB 8481 STY DTEMP+LO
23BD 8582 STA DTEMP+HI
23BF CA DVLP1: DEX
23C0 D0E5 BNE DVLP
23C2 267D ROL DVD+LO ; SHIFT LAST CARRY
23C4 267E ROL DVD+HI ; INTO QUOTIENT
23C6 A581 LDA DTEMP+LO ; REMAINDER IN [DTEMP]
23C8 8575 STA SECTOR ; IS SECTOR ID (0-16)
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 109
--- Z-DOS: CBM64 ---
23CA A57D LDA DVD+LO ; QUOTIENT IN [DVD] IS TRACK ID
23CC 18 CLC
23CD 6905 ADC #5 ; Z-CODE STARTS ON TRACK 5
23CF C911 CMP #17 ; BELOW TRACK 17?
23D1 900F BCC DVLP2 ; YES, WE'RE DONE
23D3 18 CLC ; ELSE SKIP OVER
23D4 6901 ADC #1 ; TRACK 17
23D6 C924 CMP #36 ; OUT OF RANGE?
23D8 B042 BCS TRKERR ; IF > 35, TRACK ERROR
23DA C912 CMP #18 ; IS THIS TRACK 18?
23DC D004 BNE DVLP2 ; NO, EXIT
23DE E675 INC SECTOR ; ELSE SKIP OVER
23E0 E675 INC SECTOR ; 1ST 2 SECTORS
23E2 8574 DVLP2: STA TRACK
; LDA DBLOCK+LO ; GET LSB OF BLOCK ID
; AND #%00001111 ; MASK TO GET
; STA SECTOR ; SECTOR # (0-15)
; LDA DBLOCK+HI ; GET MSB OF BLOCK ID
; AND #%00001111 ; MASK OUT GARBAGE IN BITS 7-4
; ASL A ; SHIFT THE LOW NIBBLE
; ASL A ; INTO THE HIGH NIBBLE
; ASL A
; ASL A
; STA TRACK ; AND SAVE IT HERE FOR A MOMENT
; LDA DBLOCK+LO ; GET LSB OF BLOCK ID AGAIN
; AND #%11110000 ; MASK OUT SECTOR #
; LSR A ; SHIFT THE HIGH NIBBLE
; LSR A ; INTO THE LOW NIBBLE
; LSR A
; LSR A
; ORA TRACK ; SUPERIMPOSE NEW HIGH NIBBLE
; CLC
; ADC #5 ; Z-CODE STARTS ON TRACK 5
; CMP #17 ; BELOW TRACK 17?
; BCC TKOK ; USE AS-IS IF SO
; CLC ; ELSE SKIP OVER
; ADC #1 ; TRACK 17
; CMP #36 ; ANYTHING HIGHER THAN TRACK 35
; BCS TRKERR ; IS AN ERROR
; CMP #18 ; IS THIS TRACK 18?
; BNE TKOK ; NO, WE'RE DONE
; INC SECTOR ; ELSE ADD 2 TO
; INC SECTOR ; [SECTOR] TO AVOID DIRECTORY
;TKOK: STA TRACK
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 110
--- Z-DOS: CBM64 ---
23E4 ; ENTRY FOR "RESTORE" ([TRACK], [SECTOR] & [DRIVE] PRE-ASSIGNED)
23E4 18 GETRES: CLC ; CARRY CLEAR = "READ BLOCK"
23E5 205528 JSR DISK ; GO DO IT!
23E8 B037 BCS DSKERR ; ERROR IF CARRY SET
23EA A000 LDY #0 ; MOVE CONTENTS OF [IOBUFF]
23EC B90008 GDKL: LDA IOBUFF,Y ; TO THE
23EF 9172 STA (DBUFF),Y ; TARGET PAGE IN [DBUFF]
23F1 C8 INY
23F2 D0F8 BNE GDKL
23F4 E670 INC DBLOCK+LO ; POINT TO NEXT
23F6 D002 BNE GDEX ; Z-BLOCK
23F8 E671 INC DBLOCK+HI
23FA 4C0D24 GDEX: JMP NXTSEC ; POINT TO NEXT SECTOR & PAGE
23FD ; --------------------
23FD ; PUT [DBLOCK] TO DISK
23FD ; --------------------
23FD ; ENTRY: [TRACK], [SECTOR] & [DRIVE] ASSIGNED
23FD ; PAGE TO WRITE IN [DBUFF]
23FD A000 PUTDSK: LDY #0 ; MOVE PAGE AT [DBUFF]
23FF B172 PTKL: LDA (DBUFF),Y ; INTO
2401 990008 STA IOBUFF,Y ; [IOBUFF] FOR I/O
2404 C8 INY
2405 D0F8 BNE PTKL
2407 38 SEC ; CARRY SET = "WRITE BLOCK"
2408 205528 JSR DISK
240B B00E BCS WRTERR ; CARRY SET IF ERROR
240D E675 NXTSEC: INC SECTOR ; POINT TO NEXT SECTOR
240F A575 LDA SECTOR
2411 290F AND #%00001111 ; OVEFLOWED?
2413 D002 BNE SECTOK ; CONTINUE IF NOT
2415 E674 INC TRACK ; ELSE UPDATE TRACK #
2417 8575 SECTOK: STA SECTOR ; AND SECTOR #
2419 E673 INC DBUFF+HI ; POINT TO NEXT RAM PAGE
241B 60 WRTERR: RTS
241C ; *** ERROR #12: DISK ADDRESS OUT OF RANGE ***
241C A90C TRKERR: LDA #12
241E 4CC41D JMP ZERROR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 111
--- Z-DOS: CBM64 ---
2421 ; *** ERROR #14: DRIVE ACCESS ***
2421 A90E DSKERR: LDA #14
2423 4CC41D JMP ZERROR
2426 ; -----------------------------
2426 ; SET UP SAVE & RESTORE SCREENS
2426 ; -----------------------------
2426 20831E SAVRES: JSR ZCRLF ; CLEAR THE BUFFER
2429 200E23 JSR CLS
242C A200 LDX #0
242E 8662 STX SCRIPT ; DISABLE SCRIPTING
2430 A000 LDY #0
2432 18 CLC
2433 4CF0FF JMP PLOT ; HOME CURSOR & RETURN
2436 ; -----------------
2436 ; DISPLAY A DEFAULT
2436 ; -----------------
2436 ; ENTRY: DEFAULT (0-8) IN [A]
2436 20284465 DEFAL: DB " (Default is "
2443 2A293A DEFNUM: DB "*):"
0010 DEFALL EQU $-DEFAL
2446 18 DODEF: CLC
2447 6931 ADC #'1' ; CONVERT TO ASCII 1-9
2449 8D4324 STA DEFNUM ; INSERT IN STRING
244C A236 LDX #LOW DEFAL
244E A924 LDA #HIGH DEFAL
2450 A010 LDY #DEFALL
2452 20F021 JSR DLINE ; PRINT THE STRING
2455 ; FALL THROUGH ...
2455 ; --------------------------------
2455 ; ACTIVATE CURSOR, CLEAR KEY QUEUE
2455 ; --------------------------------
2455 A200 CURSON: LDX #0
2457 86C6 STX NDX ; CLEAR KEY QUEUE
2459 E8 INX
245A 8E15D0 STX SPENA ; ENABLE CURSOR
245D 60 RTS
245E ; -----------------------------
245E ; GET SAVE & RESTORE PARAMETERS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 112
--- Z-DOS: CBM64 ---
245E ; -----------------------------
245E 0D POSIT: DB EOL
245F 506F7369 DB "Position 1-5"
000D POSITL EQU $-POSIT
246B 0D WDRIV: DB EOL
246C 44726976 DB "Drive 8 or 9"
000D WDRIVL EQU $-WDRIV
2478 0D MIND: DB EOL
2479 0D DB EOL
247A 506F7369 DB "Position "
2483 2A3B2044 MPOS: DB "*; Drive #"
248D 2A2E MDRI: DB "*."
248F 0D DB EOL
2490 41726520 DB "Are you sure? (Y or N):"
002F MINDL EQU $-MIND
24A7 0D INSM: DB EOL
24A8 496E7365 DB "Insert SAVE disk into Drive #"
24C5 2A2E SAVDRI: DB "*."
0020 INSML EQU $-INSM
24C7 594553 YES: DB 'YES'
24CA 0D DB EOL
0004 YESL EQU $-YES
24CB 4E4F NO: DB 'NO'
24CD 0D DB EOL
0003 NOL EQU $-NO
24CE A25E PARAMS: LDX #LOW POSIT
24D0 A924 LDA #HIGH POSIT
24D2 A00D LDY #POSITL
24D4 20F021 JSR DLINE ; "POSITION (1-5)"
24D7 ; GET GAME POSITION
24D7 A576 CHANGE: LDA GPOSIT ; SHOW THE CURRENT
24D9 204624 JSR DODEF ; DEFAULT POSITION
24DC 205920 GETPOS: JSR GETKEY ; WAIT FOR A KEY
24DF C90D CMP #EOL ; IF [RETURN],
24E1 F00D BEQ POSSET ; USE DEFAULT
24E3 38 SEC
24E4 E931 SBC #'1' ; ELSE CONVERT ASCII TO BINARY
24E6 C905 CMP #5 ; IF BELOW "6"
24E8 9008 BCC SETPOS ; MAKE IT THE NEW DEFAULT
24EA 20E422 JSR BOOP ; ELSE RAZZ
24ED 4CDC24 JMP GETPOS ; AND TRY AGAIN
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 113
--- Z-DOS: CBM64 ---
24F0 A576 POSSET: LDA GPOSIT ; USE DEFAULT
24F2 8578 SETPOS: STA TPOSIT ; USE KEYPRESS
24F4 18 CLC
24F5 6931 ADC #'1' ; CONVERT TO ASCII "1"-"5"
24F7 8D8324 STA MPOS ; STORE IN TEMP STRING
24FA 8D5E26 STA SVPOS
24FD 8DF926 STA RSPOS
2500 201221 JSR LETTER ; AND DISPLAY IT
2503 ; GET DRIVE ID
2503 A26B LDX #LOW WDRIV
2505 A924 LDA #HIGH WDRIV
2507 A00D LDY #WDRIVL
2509 20F021 JSR DLINE ; "DRIVE 8 OR 9"
250C A577 LDA GDRIVE ; SHOW DEFAULT
250E 18 CLC ; CONVERT 0 OR 1
250F 6907 ADC #7 ; TO 7 OR 8
2511 204624 JSR DODEF ; SO DEFAULT WILL BE CORRECT
2514 205920 GETDRV: JSR GETKEY ; GET A KEYPRESS
2517 C90D CMP #EOL ; IF [RETURN],
2519 F00D BEQ DRVSET ; USE DEFAULT
251B 38 SEC
251C E938 SBC #'8' ; CONVERT TO BINARY 0 OR 1
251E C902 CMP #2 ; IF WITHIN RANGE,
2520 9008 BCC SETDRV ; SET NEW DEFAULT
2522 20E422 JSR BOOP
2525 4C1425 JMP GETDRV ; ELSE TRY AGAIN
2528 A577 DRVSET: LDA GDRIVE ; USE DEFAULT
252A 8579 SETDRV: STA TDRIVE ; USE [A]
252C 18 CLC
252D 6938 ADC #'8' ; CONVERT TO ASCII 8 OR 9
252F 8DC524 STA SAVDRI ; STORE IN DRIVE STRING
2532 8D8D24 STA MDRI ; AND IN TEMP STRING
2535 201221 JSR LETTER ; AND SHOW NEW SETTING
2538 A278 LDX #LOW MIND ; SHOW TEMPORARY SETTINGS
253A A924 LDA #HIGH MIND
253C A02F LDY #MINDL
253E 20F021 JSR DLINE
2541 205524 JSR CURSON
2544 205920 GETYES: JSR GETKEY
2547 C959 CMP #'Y' ; IF REPLY IS "Y"
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 114
--- Z-DOS: CBM64 ---
2549 F01E BEQ ALLSET ; ACCEPT RESPONSES
254B C979 CMP #'y'
254D F01A BEQ ALLSET
254F C94E CMP #'N' ; IF REPLY IS N,
2551 F00A BEQ RETRY ; DO A RETRY
2553 C96E CMP #'n'
2555 F006 BEQ RETRY
2557 20E422 JSR BOOP ; INSIST ON Y/RETURN
255A 4C4425 JMP GETYES ; OR N
255D A2CB RETRY: LDX #LOW NO ; ELSE PRINT "NO"
255F A924 LDA #HIGH NO
2561 A003 LDY #NOL
2563 20F021 JSR DLINE
2566 4CCE24 JMP PARAMS ; AND TRY AGAIN
2569 A900 ALLSET: LDA #0
256B 8D15D0 STA SPENA ; CURSOR OFF
256E A2C7 LDX #LOW YES ; PRINT "YES"
2570 A924 LDA #HIGH YES
2572 A004 LDY #YESL
2574 20F021 JSR DLINE
2577 A579 LDA TDRIVE ; MAKE THE TEMPORARY DRIVE
2579 8577 STA GDRIVE ; THE DEFAULT DRIVE
257B A578 LDA TPOSIT ; AND THE TEMP POSITION
257D 8576 STA GPOSIT ; THE DEFAULT POSITION
257F ; CALC TRACK & SECTOR OF GAME POSITION
257F 0A ASL A ; * 2
2580 8574 STA TRACK ; SAVE HERE FOR A MOMENT
2582 0A ASL A ; * 4
2583 18 CLC
2584 6574 ADC TRACK ; * 6 (6 TRACKS PER POSITION)
2586 8574 STA TRACK
2588 E674 INC TRACK ; 1ST TRACK IS 1!
258A A900 LDA #0
258C 8575 STA SECTOR ; ALWAYS START ON SECTOR #0
258E A502 LDA FAST ; FAST-READ ENABLED?
2590 F003 BEQ PRY1 ; NO, CONTINUE
2592 202629 JSR FOFF ; ELSE DISENGAGE FAST-READ
2595 A577 PRY1: LDA GDRIVE ; TRY TO OPEN SPECIFIED DRIVE
2597 18 CLC
2598 6908 ADC #8
259A 209D27 JSR DOPEN ; THE DEFAULT DRIVE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 115
--- Z-DOS: CBM64 ---
259D B00D BCS PARERR ; CARRY SET IF ERROR
259F A2A7 SREADY: LDX #LOW INSM
25A1 A924 LDA #HIGH INSM
25A3 A020 LDY #INSML
25A5 20F021 JSR DLINE ; "INSERT SAVE DISK IN DRIVE X."
25A8 20AD25 JSR RETURN ; "PRESS [RETURN] TO CONTINUE."
25AB 18 CLC ; FOR SUCCESS
25AC 60 PARERR: RTS
25AD ; ---------------------
25AD ; "PRESS RETURN" PROMPT
25AD ; ---------------------
25AD A2CC RETURN: LDX #LOW RTN
25AF A925 LDA #HIGH RTN
25B1 A01D LDY #RTNL
25B3 20F021 JSR DLINE ; SHOW PROMPT
25B6 ; ENTRY FOR QUIT/RESTART
25B6 205524 GETRET: JSR CURSON ; ENABLE CURSOR
25B9 205920 GTRT: JSR GETKEY ; WAIT FOR [RETURN]
25BC C90D CMP #EOL
25BE F006 BEQ RETEX
25C0 20E422 JSR BOOP ; ACCEPT NO
25C3 4CB925 JMP GTRT ; SUBSTITUTES!
25C6 A900 RETEX: LDA #0
25C8 8D15D0 STA SPENA ; KILL CURSOR
25CB 60 RTS
25CC 0D RTN: DB EOL
25CD 50726573 DB "Press [RETURN] to continue."
25E8 0D DB EOL
001D RTNL EQU $-RTN
25E9 ; --------------------
25E9 ; PROMPT FOR GAME DISK
25E9 ; --------------------
25E9 0D GAME: DB EOL
25EA 496E7365 DB "Insert STORY disk into drive #8."
0021 GAMEL EQU $-GAME
260A A908 TOBOOT: LDA #8
260C 209D27 JSR DOPEN ; CLOSE OLD, OPEN BOOT DRIVE
260F A2E9 LDX #LOW GAME
2611 A925 LDA #HIGH GAME
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 116
--- Z-DOS: CBM64 ---
2613 A021 LDY #GAMEL
2615 20F021 JSR DLINE ; "INSERT STORY DISK IN DRIVE #8."
2618 20AD25 JSR RETURN ; "PRESS [RETURN] TO CONTINUE:"
261B A502 LDA FAST ; FAST-READ ENABLED?
261D F003 BEQ TBT0 ; NO, SCRAM
261F 20C128 JSR FINIT ; ELSE RE-INIT FAST CODE
2622 A9FF TBT0: LDA #$FF ; RE-ENABLE
2624 8562 STA SCRIPT ; SCRIPTING
2626 4C0E23 JMP CLS ; CLEAR SCREEN & RETURN
2629 ; -------------------------
2629 ; SET UP PHONEY STATUS LINE
2629 ; -------------------------
2629 ; ENTRY: TEXT SET UP FOR "DLINE"
2629 20F021 SROOM: JSR DLINE
262C A227 LDX #39 ; INVERT & BLACKEN TOP LINE
262E BD0004 SRLP: LDA SCREEN,X
2631 0980 ORA #%10000000
2633 9D0004 STA SCREEN,X
2636 A900 LDA #0
2638 9D00D8 STA COLRAM,X
263B CA DEX
263C 10F0 BPL SRLP
263E 60 RTS
263F ; ---------
263F ; SAVE GAME
263F ; ---------
263F 53617665 SAV: DB "Save Position"
264C 0D DB EOL
000E SAVL EQU $-SAV
264D 0D SVING: DB EOL
264E 53617669 DB "Saving position "
265E 2A202E2E SVPOS: DB "* ..."
2663 0D DB EOL
0017 SVINGL EQU $-SVING
2664 202624 ZSAVE: JSR SAVRES ; SET UP SCREEN
2667 A23F LDX #LOW SAV
2669 A926 LDA #HIGH SAV
266B A00E LDY #SAVL
266D 202926 JSR SROOM ; "SAVE POSITION"
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 117
--- Z-DOS: CBM64 ---
2670 20CE24 JSR PARAMS ; GET PARAMETERS
2673 9006 BCC DOSAVE ; ERROR IF CARRY SET
2675 200A26 BADSAV: JSR TOBOOT ; GET BOOT DISK
2678 4C2A11 JMP PREDF ; PREDICATE FAILS
267B A24D DOSAVE: LDX #LOW SVING
267D A926 LDA #HIGH SVING
267F A017 LDY #SVINGL
2681 20F021 JSR DLINE ; "SAVING POSITION X ..."
2684 ; SAVE GAME PARAMETERS IN [BUFSAV]
2684 AD022A LDA ZBEGIN+ZID ; MOVE GAME ID
2687 8D200D STA BUFSAV+0 ; INTO 1ST 2 BYTES
268A AD032A LDA ZBEGIN+ZID+1 ; OF THE AUX LINE BUFFER
268D 8D210D STA BUFSAV+1
2690 A517 LDA ZSP ; MOVE [ZSP]
2692 8D220D STA BUFSAV+2 ; TO 3RD BYTE
2695 A518 LDA OLDZSP ; MOVE [OLDZSP]
2697 8D230D STA BUFSAV+3 ; TO 4TH
269A A202 LDX #2 ; MOVE CONTENTS OF [ZPC]
269C B519 ZPCSAV: LDA ZPC,X ; TO BYTES 5-7
269E 9D240D STA BUFSAV+4,X ; OF [BUFSAV]
26A1 CA DEX
26A2 10F8 BPL ZPCSAV
26A4 ; WRITE [LOCALS]/[BUFSAV] PAGE TO DISK
26A4 A90D LDA #HIGH LOCALS
26A6 8573 STA DBUFF+HI ; POINT TO THE PAGE
26A8 20FD23 JSR PUTDSK ; AND WRITE IT OUT
26AB B0C8 BCS BADSAV ; CATCH WRITE ERROR HERE
26AD ; WRITE CONTENTS OF Z-STACK TO DISK
26AD A909 LDA #HIGH ZSTAKL ; POINT TO 1ST PAGE
26AF 8573 STA DBUFF+HI
26B1 20FD23 JSR PUTDSK ; WRITE 1ST AND
26B4 B0BF BCS BADSAV
26B6 20FD23 JSR PUTDSK ; 2ND PAGE OF Z-STACK
26B9 B0BA BCS BADSAV
26BB ; WRITE ENTIRE GAME PRELOAD TO DISK
26BB A526 LDA ZCODE ; POINT TO 1ST PAGE
26BD 8573 STA DBUFF+HI ; OF PRELOAD
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 118
--- Z-DOS: CBM64 ---
26BF AE0E2A LDX ZBEGIN+ZPURBT ; GET # IMPURE PAGES
26C2 E8 INX ; USE FOR INDEXING
26C3 8611 STX I+LO
26C5 20FD23 LSAVE: JSR PUTDSK
26C8 B0AB BCS BADSAV
26CA C611 DEC I+LO
26CC D0F7 BNE LSAVE
26CE 200A26 JSR TOBOOT ; PROMPT FOR GAME DISK
26D1 4C3611 JMP PREDS ; ELSE PREDICATE SUCCEEDS
26D4 ; ------------
26D4 ; RESTORE GAME
26D4 ; ------------
26D4 52657374 RES: DB "Restore Position"
26E4 0D DB EOL
0011 RESL EQU $-RES
26E5 0D RSING: DB EOL
26E6 52657374 DB "Restoring position "
26F9 2A202E2E RSPOS: DB "* ..."
26FE 0D DB EOL
001A RSINGL EQU $-RSING
26FF 202624 ZREST: JSR SAVRES
2702 A2D4 LDX #LOW RES
2704 A926 LDA #HIGH RES
2706 A011 LDY #RESL
2708 202926 JSR SROOM ; "RESTORE POSITION"
270B 20CE24 JSR PARAMS ; GET PARAMETERS
270E B036 BCS BADRES ; ERROR IF CARRY SET
2710 A2E5 LDX #LOW RSING
2712 A926 LDA #HIGH RSING
2714 A01A LDY #RSINGL
2716 20F021 JSR DLINE ; "RESTORING POSITION X ..."
2719 ; SAVE LOCALS IN CASE OF ERROR
2719 A21F LDX #31
271B BD000D LOCSAV: LDA LOCALS,X ; COPY ALL LOCALS
271E 9D0001 STA $0100,X ; TO BOTTOM OF MACHINE STACK
2721 CA DEX
2722 10F7 BPL LOCSAV
2724 A90D LDA #HIGH LOCALS
2726 8573 STA DBUFF+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 119
--- Z-DOS: CBM64 ---
2728 20E423 JSR GETRES ; RETRIEVE 1ST BLOCK OF PRELOAD
272B AD200D LDA BUFSAV+0 ; DOES 1ST BYTE OF SAVED GAME ID
272E CD022A CMP ZBEGIN+ZID ; MATCH THE CURRENT ID?
2731 D008 BNE WRONG ; WRONG DISK IF NOT
2733 AD210D LDA BUFSAV+1 ; WHAT ABOUT THE 2ND BYTE?
2736 CD032A CMP ZBEGIN+ZID+1
2739 F011 BEQ RIGHT ; CONTINUE IF BOTH BYTES MATCH
273B ; HANDLE INCORRECT SAVE DISK
273B A21F WRONG: LDX #31 ; RESTORE ALL SAVED LOCALS
273D BD0001 WR0: LDA $0100,X
2740 9D000D STA LOCALS,X
2743 CA DEX
2744 10F7 BPL WR0
2746 200A26 BADRES: JSR TOBOOT ; PROMPT FOR GAME DISK
2749 4C2A11 JMP PREDF ; PREDICATE FAILS
274C ; CONTINUE RESTORE
274C AD102A RIGHT: LDA ZBEGIN+ZSCRIP ; SAVE BOTH FLAG BYTES
274F 8511 STA I+LO
2751 AD112A LDA ZBEGIN+ZSCRIP+1
2754 8512 STA I+HI
2756 A909 LDA #HIGH ZSTAKL ; RETRIEVE OLD CONTENTS OF
2758 8573 STA DBUFF+HI ; Z-STACK
275A 20E423 JSR GETRES ; GET 1ST BLOCK OF Z-STACK
275D 20E423 JSR GETRES ; AND 2ND BLOCK
2760 A526 LDA ZCODE
2762 8573 STA DBUFF+HI
2764 20E423 JSR GETRES ; GET 1ST BLOCK OF PRELOAD
2767 A511 LDA I+LO ; RESTORE THE STATE
2769 8D102A STA ZBEGIN+ZSCRIP ; OF THE FLAG WORD
276C A512 LDA I+HI
276E 8D112A STA ZBEGIN+ZSCRIP+1
2771 AD0E2A LDA ZBEGIN+ZPURBT ; GET # PAGES TO LOAD
2774 8511 STA I+LO
2776 20E423 LREST: JSR GETRES ; FETCH THE REMAINDER
2779 C611 DEC I+LO ; OF THE PRELOAD
277B D0F9 BNE LREST
277D ; RESTORE THE STATE OF THE SAVED GAME
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 120
--- Z-DOS: CBM64 ---
277D AD220D LDA BUFSAV+2 ; RESTORE THE [ZSP]
2780 8517 STA ZSP
2782 AD230D LDA BUFSAV+3 ; AND THE [OLDZSP]
2785 8518 STA OLDZSP
2787 A202 LDX #2 ; RESTORE THE [ZPC]
2789 BD240D RESZPC: LDA BUFSAV+4,X
278C 9519 STA ZPC,X
278E CA DEX
278F 10F8 BPL RESZPC
2791 A900 LDA #FALSE
2793 851C STA ZPCFLG ; INVALIDATE [ZPC]
2795 200A26 JSR TOBOOT ; PROMPT FOR GAME DISK
2798 4C3611 JMP PREDS ; PREDICATE SUCCEEDS
END
INCLUD DISK.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 121
--- DISK ACCESS: CBM64 ---
279B ; --------------
279B ; OPEN DRIVE [A]
279B ; --------------
279B ; ENTRY: DISK ID (8 OR 9 BINARY) IN [A]
279B 4930 I0: DB "I0"
0002 I0L EQU $-I0
279D 857A DOPEN: STA DRIVE ; SAVE DRIVE ID HERE
279F 20D327 JSR DCLOSE ; CLOSE COMMAND & DATA CHANNELS
27A2 A90F LDA #15 ; LOGICAL FILE #
27A4 A8 TAY ; SECONDARY ADDRESS
27A5 A67A LDX DRIVE ; DEVICE # (8 OR 9)
27A7 20BAFF JSR SETLFS ; SET UP LOGICAL FILE
27AA A29B LDX #LOW I0 ; POINT TO FILENAME
27AC A027 LDY #HIGH I0 ; "I0:"
27AE A902 LDA #I0L ; LENGTH OF FILENAME
27B0 20BDFF JSR SETNAM
27B3 4CC0FF JMP OPEN ; OPEN THE DISK (CARRY CLEAR IF OK)
27B6 ; --------------------------
27B6 ; OPEN DIRECT ACCESS CHANNEL
27B6 ; --------------------------
27B6 23 POUND: DB "#"
0001 POUNDL EQU $-POUND
27B7 A900 AOPEN: LDA #0
27B9 8D15D0 STA SPENA ; SHUT OFF CURSOR DMA
27BC 20D827 JSR ACLOSE ; CLOSE FIRST
27BF A902 LDA #2 ; D/A CHANNEL ID
27C1 A8 TAY ; SECONDARY ID
27C2 A67A LDX DRIVE
27C4 20BAFF JSR SETLFS
27C7 A2B6 LDX #LOW POUND ; POINT TO FILENAME
27C9 A027 LDY #HIGH POUND ; "#"
27CB A901 LDA #POUNDL
27CD 20BDFF JSR SETNAM
27D0 4CC0FF JMP OPEN ; OPEN CHANNEL (CARRY CLEAR IF OK)
27D3 ; -------------------
27D3 ; CLOSE CURRENT DRIVE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 122
--- DISK ACCESS: CBM64 ---
27D3 ; -------------------
27D3 A90F DCLOSE: LDA #15 ; CLOSE COMMAND CHANNEL
27D5 20C3FF JSR CLOSE
27D8 ; FALL THROUGH ...
27D8 ; ---------------------
27D8 ; CLOSE THE D/A CHANNEL
27D8 ; ---------------------
27D8 A902 ACLOSE: LDA #2 ; AND THE
27DA 4CC3FF JMP CLOSE ; DATA CHANNEL
27DD ; ----------------
27DD ; DIVIDE [A] BY 10
27DD ; ----------------
27DD ; EXIT: QUOTIENT IN [X], REMAINDER IN [A]
27DD A200 DIV10: LDX #0 ; START WITH ZERO QUOTIENT
27DF C90A D10L: CMP #10 ; IF DIVISOR < 10,
27E1 9005 BCC D10EX ; WE'RE DONE
27E3 E90A SBC #10 ; ELSE SUBTRACT ANOTHER 10
27E5 E8 INX ; UPDATE QUOTIENT
27E6 D0F7 BNE D10L ; BRANCH ALWAYS
27E8 60 D10EX: RTS
27E9 ; ---------------
27E9 ; SEND Ux COMMAND
27E9 ; ---------------
27E9 ; ENTRY: ASCII "1" OR "2" IN [A]
27E9 55 COMLIN: DB "U"
27EA 2A DCOMM: DB "*"
27EB 3A322C30 DB ":2,0,"
27F0 2A2A2A2C DTRAK: DB "***,"
27F4 2A2A2A DSECT: DB "***"
27F7 0D DB EOL
000F CMLL EQU $-COMLIN
27F8 8DEA27 SENDU: STA DCOMM ; INSERT COMMAND ("1" OR "2") IN STRING
27FB ; CONVERT [TRACK] AND [SECTOR] TO ASCII IN [COMLIN]
27FB A574 LDA TRACK
27FD A002 LDY #2
27FF 20DD27 TCON: JSR DIV10 ; DIVIDE BY 10
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 123
--- DISK ACCESS: CBM64 ---
2802 0930 ORA #'0' ; CONVERT TO ASCII
2804 99F027 STA DTRAK,Y ; STORE INTO STRING
2807 8A TXA ; GET QUOTIENT INTO [A]
2808 88 DEY ; ZERO-FILL USUSED BYTES
2809 10F4 BPL TCON
280B A575 LDA SECTOR ; SAME FOR SECTOR ID
280D A002 LDY #2
280F 20DD27 SCON: JSR DIV10
2812 0930 ORA #'0'
2814 99F427 STA DSECT,Y
2817 8A TXA
2818 88 DEY
2819 10F4 BPL SCON
281B ; SEND COMMAND
281B 20CCFF JSR CLRCHN
281E A20F LDX #15 ; OUTPUT TO THE
2820 20C9FF JSR CHKOUT ; COMMAND CHANNEL
2823 B00E BCS UEX ; EXIT W/CARRY SET IF ERROR
2825 A000 LDY #0
2827 B9E927 SCM0: LDA COMLIN,Y ; SEND THE COMMAND LINE
282A 20D2FF JSR CHROUT ; TO THE DRIVE CHANNEL
282D C8 INY ; A BYTE AT A TIME
282E C00F CPY #CMLL
2830 90F5 BCC SCM0
2832 18 CLC ; SUCCESS!
2833 60 UEX: RTS
2834 ; ----------------------
2834 ; SET THE BUFFER POINTER
2834 ; ----------------------
2834 422D503A BPLINE: DB "B-P:2,0"
283B 0D DB EOL
0008 BPLL EQU $-BPLINE
283C 20CCFF SETBP: JSR CLRCHN
283F A20F LDX #15 ; OUTPUT TO
2841 20C9FF JSR CHKOUT ; COMMAND CHANNEL
2844 B00E BCS BEX ; CARRY SET IF ERROR
2846 A000 LDY #0
2848 B93428 SBPL: LDA BPLINE,Y
284B 20D2FF JSR CHROUT
284E C8 INY
284F C008 CPY #BPLL
2851 90F5 BCC SBPL
2853 18 CLC
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 124
--- DISK ACCESS: CBM64 ---
2854 60 BEX: RTS
2855 ; ------------------------------
2855 ; READ/WRITE A BLOCK TO [IOBUFF]
2855 ; ------------------------------
2855 ; ENTRY: [TRACK] = TRACK # (1-35)
2855 ; [SECTOR] = SECTOR # (0-15)
2855 ; [DRIVE] = DRIVE ID (8 OR 9)
2855 ; CARRY CLEAR TO READ, CARRY SET TO WRITE
2855 B033 DISK: BCS DWRITE ; WRITE IF CARRY SET
2857 ; READ A DISK BLOCK
2857 A5FD LDA FASTEN ; FAST-READ AVAILABLE?
2859 F007 BEQ SLOW ; USE SLOW CODE IF NOT
285B A502 LDA FAST ; FAST-READ ENGAGED?
285D F003 BEQ SLOW ; NO, USE SLOW
285F 4C0A29 JMP DOFAST ; ELSE USE FAST-READ ROUTINES
2862 20B727 SLOW: JSR AOPEN ; OPEN THE ACCESS CHANNEL
2865 B055 BCS BADISK
2867 A931 LDA #'1' ; SEND A "U1" COMMAND
2869 20F827 JSR SENDU
286C B04E BCS BADISK ; CARRY SET IF ERROR
286E 203C28 JSR SETBP ; SET THE BUFFER POINTER
2871 B049 BCS BADISK ; CARRY SET IF ERROR
2873 20CCFF JSR CLRCHN
2876 A202 LDX #2 ; INPUT FROM
2878 20C6FF JSR CHKIN ; DATA CHANNEL
287B B03F BCS BADISK
287D A000 LDY #0
287F 20CFFF READ1: JSR CHRIN ; GET A BYTE
2882 990008 STA IOBUFF,Y ; MOVE TO I/O BUFFER
2885 C8 INY
2886 D0F7 BNE READ1 ; DO 256 BYTES
2888 F026 BEQ SHUTD ; THEN EXIT
288A ; WRITE A BLOCK
288A 20B727 DWRITE: JSR AOPEN ; OPEN THE ACCESS CHANNEL
288D B02D BCS BADISK
288F 203C28 JSR SETBP ; SET THE BUFFER POINTER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 125
--- DISK ACCESS: CBM64 ---
2892 B028 BCS BADISK ; CARRY SET IF ERROR
2894 20CCFF JSR CLRCHN
2897 A202 LDX #2 ; OUTPUT TO
2899 20C9FF JSR CHKOUT ; DATA CHANNEL
289C B01E BCS BADISK ; CARRY SET IF ERROR
289E A000 LDY #0
28A0 B90008 WRITE1: LDA IOBUFF,Y ; SEND CONTENTS OF [IOBUFF]
28A3 20D2FF JSR CHROUT ; TO THE DRIVE
28A6 C8 INY
28A7 D0F7 BNE WRITE1 ; WRITE 256 BYTES
28A9 A932 LDA #'2' ; ISSUE A "U2" COMMAND
28AB 20F827 JSR SENDU
28AE B00C BCS BADISK ; CARRY SET IF ERROR
28B0 20B7FF SHUTD: JSR READST
28B3 2983 AND #%10000011
28B5 D005 BNE BADISK
28B7 20CCFF JSR CLRCHN
28BA 18 CLC ; CARRY CLEAR FOR SUCCESS
28BB 60 RTS
28BC 20CCFF BADISK: JSR CLRCHN
28BF 38 SEC
28C0 60 RTS ; OR SET IF ERROR
END
INCLUD FAST.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 126
--- FAST DISK READ: CBM64 ---
28C1 ; --------------
28C1 ; INIT FAST READ
28C1 ; --------------
28C1 A902 FINIT: LDA #2
28C3 A8 TAY
28C4 A208 LDX #8
28C6 20BAFF JSR SETLFS
28C9 A902 LDA #2
28CB A2FE LDX #LOW DNAME
28CD A028 LDY #HIGH DNAME
28CF 20BDFF JSR SETNAM
28D2 20C0FF JSR OPEN
28D5 A20F LDX #15
28D7 20C9FF JSR CHKOUT
28DA A009 LDY #9 ; SEND "U1:2,0,1,1"
28DC B90029 FNT0: LDA DCMND,Y
28DF 20D2FF JSR CHROUT
28E2 88 DEY
28E3 10F7 BPL FNT0
28E5 20CCFF JSR CLRCHN ; RESET CHANNEL
28E8 A20F LDX #15
28EA 20C9FF JSR CHKOUT
28ED A955 LDA #'U' ; SEND "U3" COMMAND
28EF 20D2FF JSR CHROUT
28F2 A933 LDA #'3'
28F4 20D2FF JSR CHROUT
28F7 A9FF LDA #$FF
28F9 85FD STA FASTEN ; SET "FAST-READ ENABLED" FLAG
28FB 4CCCFF JMP CLRCHN ; CLEAR & RETURN
28FE 2332 DNAME: DB "#2"
2900 312C312C DCMND: DB "1,1,0,2:1U"
290A ; ----------------------
290A ; FAST-READ A DISK BLOCK
290A ; ----------------------
290A ; ENTRY: TARGET TRACK IN [TRACK]
290A ; TARGET SECTOR IN [SECTOR]
290A ; EXIT: DATA IN [IOBUFF]
290A A574 DOFAST: LDA TRACK ; SPECIFY
290C 208829 JSR SNDBYT ; TRACK &
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 127
--- FAST DISK READ: CBM64 ---
290F A575 LDA SECTOR ; SECTOR TO READ
2911 208829 JSR SNDBYT
2914 A900 LDA #0
2916 85FC STA FINDEX ; INIT LOOP INDEX
2918 204729 DFST1: JSR ZOOM ; GET A BYTE FROM DISK
291B A4FC LDY FINDEX
291D 990008 STA IOBUFF,Y ; MOVE TO [IOBUFF]
2920 E6FC INC FINDEX
2922 D0F4 BNE DFST1 ; FILL THE BUFFER
2924 18 CLC
2925 60 RTS
2926 ; -------------------
2926 ; DISENGAGE FAST-READ
2926 ; -------------------
2926 A900 FOFF: LDA #0
2928 85FD STA FASTEN ; CLEAR "FAST-READ ENABLED" FLAG
292A 208829 JSR SNDBYT ; SEND "TRACK 0"
292D A908 LDA #8
292F 209D27 JSR DOPEN ; CLOSE & OPEN BOOT DRIVE
2932 20B727 JSR AOPEN ; OPEN DATA CHANNEL
2935 A20F LDX #15
2937 20C9FF JSR CHKOUT ; OUTPUT TO COMMAND CHANNEL
293A A955 LDA #'U' ; SEND "UI" TO RE-INIT DRIVE
293C 20D2FF JSR CHROUT
293F A949 LDA #'I'
2941 20D2FF JSR CHROUT
2944 4CCCFF JMP CLRCHN ; CLEAR & RETURN
2947 ; -----------------------
2947 ; GET FAST BYTE FROM DISK
2947 ; -----------------------
2947 A980 ZOOM: LDA #$80
2949 85FB STA FDATA
294B AD00DD GETBIT: LDA CI2PRA
294E 0910 ORA #$10
2950 8D00DD STA CI2PRA
2953 AD00DD GETBO0: LDA CI2PRA
2956 A8 TAY
2957 2980 AND #$80
2959 D0F8 BNE GETBO0
295B 98 TYA
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 128
--- FAST DISK READ: CBM64 ---
295C 29EF AND #$EF
295E 8D00DD STA CI2PRA
2961 AD00DD GETBO1: LDA CI2PRA
2964 A8 TAY
2965 2980 AND #$80
2967 F0F8 BEQ GETBO1
2969 98 GETBO2: TYA
296A 0910 ORA #$10
296C 8D00DD STA CI2PRA
296F A207 LDX #7
2971 CA GETBO3: DEX
2972 D0FD BNE GETBO3
2974 AD00DD LDA CI2PRA
2977 A8 TAY
2978 29EF AND #$EF
297A 8D00DD STA CI2PRA
297D 98 TYA
297E 0A ASL A
297F 66FB ROR FDATA
2981 90E6 BCC GETBO2
2983 A5FB LDA FDATA
2985 49FF EOR #$FF
2987 60 RTS
2988 ; -----------------
2988 ; SEND BYTE TO DISK
2988 ; -----------------
2988 85FB SNDBYT: STA FDATA
298A A208 LDX #8
298C 20C229 BIT: JSR SCLK1
298F 20B929 WAITD: JSR SETTLE
2992 2980 AND #$80
2994 D0F9 BNE WAITD
2996 20CB29 JSR SCLK0
2999 20B929 SNDBO1: JSR SETTLE
299C A8 TAY
299D 2980 AND #$80
299F F0F8 BEQ SNDBO1
29A1 98 TYA
29A2 0910 ORA #$10
29A4 46FB LSR FDATA
29A6 9002 BCC SNDBO2
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 129
--- FAST DISK READ: CBM64 ---
29A8 0920 ORA #$20
29AA 8D00DD SNDBO2: STA CI2PRA
29AD A007 LDY #7
29AF 88 SNDBO3: DEY
29B0 D0FD BNE SNDBO3
29B2 20CB29 JSR SCLK0
29B5 CA DEX
29B6 D0D4 BNE BIT
29B8 60 RTS
29B9 ; ---------------------------
29B9 ; WAIT FOR I/O PORT TO SETTLE
29B9 ; ---------------------------
29B9 AD00DD SETTLE: LDA CI2PRA
29BC CD00DD CMP CI2PRA
29BF D0F8 BNE SETTLE
29C1 60 RTS
29C2 ; ---------------
29C2 ; SET CLKOUT TO 1
29C2 ; ---------------
29C2 AD00DD SCLK1: LDA CI2PRA
29C5 0910 ORA #$10
29C7 29DF AND #$DF
29C9 D005 BNE PUTPRT
29CB ; ---------------
29CB ; SET CLKOUT TO 0
29CB ; ---------------
29CB AD00DD SCLK0: LDA CI2PRA
29CE 29CF AND #$CF
29D0 8D00DD PUTPRT: STA CI2PRA
29D3 EA NOP
29D4 EA NOP
29D5 60 RTS
END
29D6 IF DEBUG
29D6 INCLUD BUGGER.ASM
29D6 ENDIF
0000 END
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. PAGE 130
---- SYMBOL TABLE ----
A12VAL 11BD BYTGET 0544 CURSOR 0340 DORET 15CA FINIT 28C1
A2VAL 1456 BYTSND 0577 CURX 2083 DORTI 2357 FIRST1 12FE
ABQUOT 167C CBINV 0316 CUTHI D416 DOSAVE 267B FL0 1E5B
ABREM 166E CEX 1E58 CUTLO D415 DOSCRL 2148 FL1 1E65
ABSDIV 1653 CHANGE 24D7 CYCLE 00E0 DOSCRN 22D9 FL2 1E70
ABYTE 000D CHAR 2128 CZSL 1C2C DOSIB 18EF FL3 1E7A
ACLOSE 27D8 CHKEOL 213A D10EX 27E8 DOSTRT 1E13 FLAGSU 1D74
ADEX 000E CHKIN FFC6 D10L 27DF DOTIME 1F9A FLEX 1950
ALLSET 2569 CHKOUT FFC9 D6510 0000 DOUT 21F8 FLS0 1D8D
AOPEN 27B7 CHRIN FFCF DATA 000A DOXM 200D FLS1 1D8E
ARG1 0005 CHROUT FFD2 DATIN 0001 DOXOP 0FC6 FLS2 1DA6
ARG2 0007 CHRTBL 1CFE DATOUT 0002 DRIVE 007A FLSL 1D9F
ARG3 0009 CI2PRA DD00 DBLOCK 0070 DRVSET 2528 FLUSH 1E59
ARG4 000B CINT FF81 DBUFF 0072 DSECT 27F4 FLUSHW 193B
ATDCY1 D405 CINV 0314 DC0 0F6F DSKCNT 1C00 FNT0 28DC
ATDCY2 D40C CLALL FFE7 DC1 0F76 DSKERR 2421 FOFF 2926
ATDCY3 D413 CLD0 0E28 DCLOSE 27D3 DSOR 007F FREEZE 1DF8
ATNIN 0080 CLICK 2100 DCMND 2900 DT0 1FBE FREHI1 D401
BACKSP 0014 CLK0 053C DCOMM 27EA DT1 1FC4 FREHI2 D408
BACKUP 21BE CLKIN 0004 DEBNC 0533 DTEMP 0081 FREHI3 D40F
BADISK 28BC CLKOUT 0008 DEBUG 0000 DTRAK 27F0 FRELO1 D400
BADKEY 20DE CLOCK 1F02 DECVAL 11AA DVD 007D FRELO2 D407
BADOP1 1025 CLOCKL 0006 DEFAL 2436 DVLP 23A7 FRELO3 D40E
BADOP2 1062 CLOSE FFC3 DEFALL 0010 DVLP1 23BF FWL1 19A0
BADRES 2746 CLRCHN FFCC DEFNUM 2443 DVLP2 23E2 FWORDS 0033
BADSAV 2675 CLS 230E DFST1 2918 DVX 11B5 FWSUCC 19DC
BADVER 12E2 CLS0 2321 DGC 1809 DWRITE 288A GAME 25E9
BCALC 1544 CMDEND 0532 DIGCNT 1805 EAR0 1ACF GAMEL 0021
BEX 2854 CMDWT 050B DIGITS 005E EAR1 1AD9 GDEX 23FA
BGCOLO D021 CMLL 000F DIRECT 1B4F EARLY 1AC7 GDKL 23EC
BIT 298C CN0 0E4E DISK 2855 ECON 1DC6 GDRIVE 0077
BITSND 057B CNL 1CB1 DISKE 1AC2 EFIND 192D GETBIT 294B
BLANK 1B61 CNOK 1CBA DIV10 27DD ENDLIN 21C8 GETBO0 2953
BLINK 007B COLD 0E00 DIVERR 16BB ENTRY 0047 GETBO1 2961
BLNSW 00CC COLOR 0286 DIVEX 167B ENUMB 1DC1 GETBO2 2969
BOOP 22E4 COLRAM D800 DIVIDE 163E EOL 000D GETBO3 2971
BPLINE 2834 COMLIN 27E9 DLINE 21F0 EQBAD 16FA GETBYT 1A1A
BPLL 0008 COMPAR 145E DLS0 1435 EQOK 16F7 GETDRV 2514
BREAK 1951 CONCNT 0053 DNAME 28FE ERRM 1DB2 GETDSK 238A
BRKTBL 1962 CONIN 0054 DOB2 1157 ERRML 0012 GETIN FFE4
BSND0 058A CONOUT 0055 DOCALL 1706 ESIZE 004B GETKEY 2059
BSND1 0592 CONTOP 1C3B DODEF 2446 ETPEX 1599 GETLNG 1076
BSND2 05A7 CONZST 1C29 DODIS 0FD5 EXEC 00E0 GETP1 155B
BSND3 05AA COUT 1E45 DOEQ 16D3 EXTCOL D020 GETP2 156A
BUF1 0300 CR1 1ECC DOFAST 290A FALSE 0000 GETP3 157D
BUF2 0400 CSET0 1C70 DOFREQ 1B7F FAST 0002 GETPB 158D
BUF3 0500 CSET2 1C82 DOGET 1531 FASTEN 00FD GETPOS 24DC
BUF4 0600 CSHIP 1C75 DOM0 1FF4 FBRK 1978 GETPT1 15A3
BUF5 0700 CTABLE 1CAF DOMINS 1FE9 FDATA 00FB GETPT2 15B2
BUFSAV 0D20 CTEST 1C60 DOPEN 279D FINDEX 00FC GETPT3 15B8
BUMP 00C0 CURSON 2455 DOPM 200B FINDW 197A GETPW 1593
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. PAGE 131
---- SYMBOL TABLE ----
GETRES 23E4 IVX 11BC MPCL 001F OP1 0FFB PNTR 00D3
GETRET 25B6 J 0013 MPCM 0020 OP1A 1005 POPVAL 10B0
GETSET 1BD5 JOBS 0000 MPCPNT 0023 OP1B 100F POSIT 245E
GETSHT 1072 JUMPC 00D0 MPOS 2483 OP1EX 1016 POSITL 000D
GETV 1079 K 0015 MSGFLG 009D OP2 102A POSSET 24F0
GETVAR 108A KEYD 0277 MSIGX D010 OP2A 1034 POUND 27B6
GETVR1 108F KEYLOG 028F MSTART 0800 OP2B 1037 POUNDL 0001
GETVRG 10A3 KEYTAB 00F5 MTEMP 005A OP2C 1046 PP0 2221
GETVRL 1093 LBUFF 0200 NARGS 0004 OP2D 1049 PP1 2244
GETWRD 1AF0 LDPRE 0F3C NBL 1958 OP2EX 1053 PP2 224D
GETYES 2544 LDTB1 00D9 NBRKS 0006 OPCODE 0003 PP3 225C
GETZ1 1BFC LENGTH 0060 NDX 00C6 OPEN FFC0 PP5 2266
GETZ2 1C17 LET0 211B NENTS 0049 OPEXT 0F7D PPERR 223E
GETZ3 1C23 LETEX 2125 NEWLOG 234A OPT0 11C6 PPRINT 2204
GETZCH 1BE1 LETTER 2112 NEWSET 1B65 OPT1 11E2 PPX 1D6E
GKEY0 205D LEX1 21D8 NEXTPC 19E4 OPT2 1202 PREDB 113B
GKEY1 208F LEX2 21E5 NEXTZ 1C49 OPTX 1234 PREDB1 115E
GLOBAL 002F LFROM 006A NLG0 234C OPX0 0F88 PREDB2 1169
GO 0FE7 LINCNT 0065 NMINV 0318 OPX1 0F8E PREDB3 1170
GODIV 1660 LINEX 1EEA NO 24CB OPX2 0F98 PREDB5 118E
GPOSIT 0076 LINLEN 0045 NOBLIN 20A7 OPX3 0FA2 PREDF 112A
GS 1BDC LINOUT 1ED5 NOL 0003 OPX4 0FBD PREDLB 114B
GTBIT 0548 LMAX 0066 NOLOG 207C OPXNXT 0FA9 PREDNB 112F
GTBO0 0562 LO 0000 NOMORE 21AD OUT 003D PREDS 1136
GTBT0 1A2C LOCALS 0D00 NOPS0 000E OUTEOL 2187 PRIL 1270
GTBT1 1A33 LOCSAV 271B NOPS1 0010 OVER 10D8 PRLEN 006F
GTBT2 1A3C LOLINE 2358 NOPS2 0019 PAGE 1A50 PRNTDC 139D
GTBT3 1A4E LOUT 1EDD NOPSX 000C PAGE0 0028 PRNTN3 1821
GTEXIT 1C25 LREST 2776 NORAM 0EEF PARAMS 24CE PRNTN4 182A
GTRT 25B9 LRU 0025 NORM 1956 PARERR 25AC PROPB 1D41
GTZ0 1BE7 LRUMAP 0C50 NOSCRL 217D PATCH 1A25 PROPL 1D62
GVCALC 1114 LSAVE 26C5 NPC0 19F6 PB 1800 PROPN 1D5D
HDRS 0006 LSTX 00C5 NPC1 19FD PBAD 1488 PROPNX 1D6A
HI 0001 LTO 006C NPC2 1A06 PCALC 17A8 PRY1 2595
HIBASE 0288 MASK 20B4 NPC3 1A18 PCLOSE 2262 PSET 004C
HILINE 2371 MASK0 20CA NUMBER 17F9 PDC0 13B2 PSHVAL 10C6
I 0011 MASK1 20D2 NXTP1 15D4 PEX 2277 PSTAT 006E
I0 279B MCLR 1EF5 NXTP2 15E3 PFINE 1307 PTABH 0BA0
I0L 0002 MDRI 248D NXTP3 15E6 PG1 1A58 PTABL 0B00
IN 0037 MEMTOP 1E3B NXTSEC 240D PG2 1A65 PTKL 23FF
INCVAL 11B6 MIND 2478 OBJ1 1D2E PG3 1A6C PTZ0 1328
INDEX 000B MINDL 002F OBJ2 1D35 PG4 1A8E PUSHXA 10CA
INIT0 0500 MINIT 16C0 OBJLOC 1D18 PG5 1AA0 PUTBYT 10E8
INLOOP 2197 MLOOP 0F60 OBJTAB 0035 PG6 1AAB PUTDSK 23FD
INPUT 218D MODE 0291 OFFSET 004F PG7 1AB7 PUTLSB 17A3
INSM 24A7 MORE 1EEF OFFSPL 22AD PG8 1ABC PUTP1 17BE
INSML 0020 MOREL 0006 OLDLEN 0061 PGOOD 149B PUTP2 17CD
IOBUFF 0800 MOVMIN 1FCF OLDX 0063 PLERR 17E7 PUTP3 17DD
IOCHAR 0067 MPC 001F OLDY 0064 PLOT FFF0 PUTPRT 29D0
IOINIT FF84 MPCFLG 0022 OLDZSP 0018 PMAX 0029 PUTVAL 10EE
IRQMSK D01A MPCH 0021 OP0 0FEC PNERR 17E2 PUTVLG 1107
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. PAGE 132
---- SYMBOL TABLE ----
PUTVLL 10F7 RSIGN 005D SHOVE 1B33 SPSTAT 0069 TRY3 16EB
PUTVR1 10F3 RSING 26E5 SHOWIT 21A6 SPT0 07F8 TSET 004D
PWHI1 D403 RSINGL 001A SHUTD 28B0 SPT1 07F9 TSTDO3 05C1
PWHI2 D40A RSPOS 26F9 SIB 1968 SPT2 07FA TSTDO4 05C9
PWHI3 D411 RTN 25CC SIGVOL D418 SPT3 07FB TSTDO5 05C5
PWLO1 D402 RTNL 001D SLINE 0068 SPT4 07FC UDIV 168A
PWLO2 D409 RVS 00C7 SLOAD 0E66 SPT5 07FD UDLOOP 1693
PWLO3 D410 SAV 263F SLOADL 0019 SPT6 07FE UDNEXT 16AB
PYUCK 12EB SAVDRI 24C5 SLOW 2862 SPT7 07FF UEX 2833
PZSTR 1B0D SAVL 000E SNDBO1 2999 SREADY 259F UNDER 10C1
PZTOP 1B16 SAVRES 2426 SNDBO2 29AA SRL0 214F USL0 1F30
QSIGN 005C SAY1 1CCA SNDBO3 29AF SRL1 216A USLX 201E
QUOT 0056 SAY2 1CD5 SNDBYT 2988 SRL2 2173 V2A1 1067
R6510 0001 SAYSET 1CBF SOURCE 0043 SRL3 2177 VALUE 000F
RAMTAS FF87 SBL 196F SP0COL D027 SRLP 262E VARGET 1081
RAND D41B SBPL 2848 SP0X D000 SROOM 2629 VARPUT 10DD
RANDOM 1E3E SCEX 147A SP0Y D001 ST0 0EAA VCREG1 D404
RASTER D012 SCLK0 29CB SP1COL D028 ST1A 0EB4 VCREG2 D40B
RAZZ 2301 SCLK1 29C2 SP1X D002 ST1B 0EC2 VCREG3 D412
RDFILE 05BD SCM0 2827 SP1Y D003 STAMP 002D VERIFY 00A0
READ 0080 SCMP 1470 SP2COL D029 STATEX 2015 VERNUM 1E2F
READ1 287F SCNKEY FF9F SP2X D004 STKERR 13FB VERS 1E1E
READL 188A SCOMP 1465 SP2Y D005 STKEY 0091 VERSL 0011
READL2 18D5 SCON 280F SP3COL D02A STRING 21F9 VEXIT 1425
READL3 18F7 SCORE 1EFB SP3X D006 SUREL1 D406 VICIRQ D019
READST FFB7 SCOREL 0007 SP3Y D007 SUREL2 D40D VMCSB D018
REMAIN 0058 SCREEN 0400 SP4COL D02B SUREL3 D414 VOCAB 0031
REMVC1 1380 SCRIPT 0062 SP4X D008 SVING 264D VSUM 12AE
REMVC2 1391 SCROLX D016 SP4Y D009 SVINGL 0017 VSUM0 12BA
REMVEX 139A SCROLY D011 SP5COL D02C SVPOS 265E WAITD 298F
RES 26D4 SECSEK 00B8 SP5X D00A SWAP 002E WARM1 0E7F
RESL 0011 SECTOK 2417 SP5Y D00B TARGET 002B WARM2 0EA6
RESON D417 SECTOR 0075 SP6COL D02D TBLX 00D6 WARMEX 0F48
RESULT 0044 SEEK 00B0 SP6X D00C TBT0 2622 WCALC 1540
RESZPC 2789 SENDU 27F8 SP6Y D00D TCON 27FF WCEX 1129
RET0 10E6 SET1 1B39 SP7COL D02E TDRIVE 0079 WDRIV 246B
RET1 13CF SET2 1B41 SP7X D00E TICK 20E4 WDRIVL 000D
RET2 13E3 SETA0 0EFA SP7Y D00F TIME 00A2 WNEXT 19BD
RETEX 25C6 SETBP 283C SPACE 0020 TIMEFL 005F WNX 19C8
RETRY 255D SETDRV 252A SPBGPR D01B TOASC 1B30 WNX1 19D3
RETURN 25AD SETLFS FFBA SPCALC 22A3 TOBOOT 260A WR0 273D
RFLIP 166A SETMSG FF90 SPEED 0598 TOBOT 22D4 WRDLEN 0046
RIGHT 274C SETNAM FFBD SPENA D015 TOPERM 1B73 WRITE 0090
RL0 1898 SETNP 0EF4 SPL0 228B TOQ 1DFB WRITE1 28A0
RL1 189D SETPOS 24F2 SPL1 2299 TOQL 000E WRONG 273B
RL2 18A4 SETSTR 1AFB SPLEX 22AC TOTOP 22CC WRTERR 241B
RL3 18AD SETTLE 29B9 SPLOFF 22B0 TPOSIT 0078 XMAX 0289
RLERR 1894 SETWRD 1AE1 SPMC D01C TRACK 0074 XSIZE 0027
RLEX 18A3 SFDX 00CB SPRT13 0340 TRKERR 241C XXPAND D01D
RLL 18B3 SFLAG 2203 SPRT14 0380 TRUE 00FF YES 24C7
RPTFLG 028A SHFLAG 028D SPRT15 03C0 TRY2 16DF YESL 0004
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
ZIP/6502-C INFOCOM, INC. PAGE 133
---- SYMBOL TABLE ----
YSIZE 0018 ZEQUAL 16CA ZLESS 142C ZPOP 185F ZRT0 124E
YXPAND D017 ZEROPG 0003 ZLOC 130A ZPRB 134B ZRT1 1250
ZADD 15EC ZERROR 1DC4 ZMLOOP 1609 ZPRC 17EC ZRTRUE 124C
ZBAND 14AA ZFCLR 14DD ZMNEXT 1620 ZPRD 139B ZSAVE 2664
ZBCOM 141C ZFIRST 12F7 ZMOD 1634 ZPRI 125B ZSCRIP 0010
ZBEGIN 2A00 ZFLAG 0050 ZMODE 0001 ZPRINT 1406 ZSCRN 22BE
ZBOR 149E ZFSET 14CA ZMOVE 1501 ZPRN 17F1 ZSERIA 0012
ZBTST 148B ZFSETP 14B6 ZMUL 1606 ZPRR 1278 ZSET 14F4
ZCALL 16FD ZFWORD 0018 ZMVEX 152A ZPTSIZ 1316 ZSP 0017
ZCALL1 1734 ZGET 152B ZNEXT 12EE ZPURBT 000E ZSPLIT 227A
ZCALL2 175B ZGETB 153B ZNEXTP 15CD ZPURE 0027 ZSTAKH 0A00
ZCALL3 1785 ZGETP 1558 ZNOOP 11A9 ZPUSH 1858 ZSTAKL 0900
ZCHAR 004E ZGETPT 15A0 ZOBJEC 000A ZPUT 1792 ZSTART 1E09
ZCHKSM 001C ZGLOBA 000C ZOOM 2947 ZPUTB 17A0 ZSTEX 1B0C
ZCODE 0026 ZGO 0006 ZPAGE 002A ZPUTP 17BB ZSUB 15F9
ZCR0 1EA8 ZGRTR 1440 ZPC 0019 ZQUIT 1DE5 ZUSL 1F08
ZCRLF 1E83 ZID 0002 ZPCFLG 001C ZRAND 1836 ZVALUE 1414
ZCRUSH 1CD8 ZIGRTR 144B ZPCH 001B ZREAD 1867 ZVER 1287
ZD0 1346 ZIN 147B ZPCL 0019 ZREMOV 1359 ZVERS 0000
ZDEC 133E ZINC 1333 ZPCM 001A ZREST 26FF ZVOCAB 0008
ZDIV 162A ZIP 0E00 ZPCPNT 001D ZRET 13B8 ZVR 128E
ZDLESS 1432 ZJUMP 1400 ZPCSAV 269C ZRFALS 1257 ZWORD 0051
ZENDLD 0004 ZLENTH 001A ZPGTOP 008F ZRSTAK 1281 ZZERO 12E5
***** NO ERRORS DETECTED *****