mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-08 01:01:24 +00:00
6360 lines
276 KiB
NASM
6360 lines
276 KiB
NASM
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 1
|
||
|
||
|
||
|
||
0000 ; --------------------------
|
||
0000 ; ZIP/6502 2.0
|
||
0000 ; Z-CODE INTERPRETER PROGRAM
|
||
0000 ; FOR ATARI 400/800/1200/XL
|
||
0000 ; --------------------------
|
||
|
||
0000 ; INFOCOM, INC.
|
||
0000 ; 55 WHEELER STREET
|
||
0000 ; CAMBRIDGE, MA 02136
|
||
|
||
0000 ; COMPANY PRIVATE -- NOT FOR DISTRIBUTION
|
||
|
||
0080 ZEROPG EQU $80 ; 1ST FREE Z-PAGE LOCATION
|
||
|
||
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
|
||
|
||
INCLUD EQ.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 2
|
||
--- MEMORY ORGANIZATION ---
|
||
|
||
|
||
00FF TRUE EQU $FF
|
||
0000 FALSE EQU 0
|
||
0000 LO EQU 0
|
||
0001 HI EQU 1
|
||
|
||
0000 ; SEE "HARDEQ.ASM" FOR ATARI MEMORY MAP
|
||
|
||
0000 ; ---------------------
|
||
0000 ; Z-CODE HEADER OFFSETS
|
||
0000 ; ---------------------
|
||
|
||
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 INFOCOM, INC. --- EQUATES PAGE 3
|
||
--- ZIP Z-PAGE VARIABLES ---
|
||
|
||
|
||
0080 OPCODE EQU ZEROPG ; (BYTE) CURRENT OPCODE
|
||
0081 NARGS EQU OPCODE+1 ; (BYTE) # ARGUMENTS
|
||
0082 ARG1 EQU OPCODE+2 ; (WORD) ARGUMENT #1
|
||
0084 ARG2 EQU OPCODE+4 ; (WORD) ARGUMENT #2
|
||
0086 ARG3 EQU OPCODE+6 ; (WORD) ARGUMENT #3
|
||
0088 ARG4 EQU OPCODE+8 ; (WORD) ARGUMENT #4
|
||
008A ABYTE EQU OPCODE+10 ; (BYTE) X-OP ARGUMENT BYTE
|
||
008B ADEX EQU OPCODE+11 ; (BYTE) X-OP ARGUMENT INDEX
|
||
|
||
008C VALUE EQU OPCODE+12 ; (WORD) VALUE RETURN REGISTER
|
||
008E I EQU VALUE+2 ; (WORD) GEN-PURPOSE REGISTER #1
|
||
0090 J EQU VALUE+4 ; (WORD) GEN-PURPOSE REGISTER #2
|
||
0092 K EQU VALUE+6 ; (WORD) GEN-PURPOSE REGISTER #3
|
||
|
||
0094 ZSP EQU VALUE+8 ; (BYTE) Z-STACK POINTER
|
||
0095 OLDZSP EQU ZSP+1 ; (BYTE) OLD Z-STACK POINTER
|
||
|
||
0096 ZPC EQU ZSP+2 ; (3 BYTES) ZIP PROGRAM COUNTER
|
||
0096 ZPCL EQU ZPC ; (BYTE) LOW 8 BITS OF [ZPC]
|
||
0097 ZPCM EQU ZPC+1 ; (BYTE) MIDDLE 8 BITS OF [ZPC]
|
||
0098 ZPCH EQU ZPC+2 ; (BYTE) HIGH BIT OF [ZPC]
|
||
0099 ZPCFLG EQU ZPC+3 ; (BYTE) FLAG: "TRUE" IF [ZPCPNT] VALID
|
||
009A ZPCPNT EQU ZPC+4 ; (WORD) ABS POINTER TO CURRENT Z-PAGE
|
||
|
||
009C MPC EQU ZPC+6 ; (3 BYTES) MEMORY PROGRAM COUNTER
|
||
009C MPCL EQU MPC ; (BYTE) LOW 8 BITS OF [MPC]
|
||
009D MPCM EQU MPC+1 ; (BYTE) MIDDLE 8 BITS OF [MPC]
|
||
009E MPCH EQU MPC+2 ; (BYTE) HIGH BIT OF [MPC]
|
||
009F MPCFLG EQU MPC+3 ; (BYTE) FLAG: "TRUE" IF [MPCPNT] VALID
|
||
00A0 MPCPNT EQU MPC+4 ; (WORD) ABS POINTER TO CURRENT M-PAGE
|
||
|
||
00A2 LRU EQU MPC+6 ; (BYTE) EARLIEST TIMESTAMP
|
||
00A3 ZCODE EQU LRU+1 ; (BYTE) 1ST ABSOLUTE PAGE OF PRELOAD
|
||
00A4 ZPURE EQU LRU+2 ; (BYTE) 1ST VIRTUAL PAGE OF "PURE" Z-CODE
|
||
00A5 PAGE0 EQU LRU+3 ; (BYTE) 1ST PAGE OF ACTUAL SWAPPING SPACE
|
||
00A6 PMAX EQU LRU+4 ; (BYTE) MAXIMUM # OF SWAPPING PAGES
|
||
00A7 ZPAGE EQU LRU+5 ; (BYTE) CURRENT SWAPPING PAGE
|
||
00A8 TARGET EQU LRU+6 ; (WORD) TARGET PAGE FOR SWAPPING
|
||
00AA STAMP EQU LRU+8 ; (BYTE) CURRENT TIMESTAMP
|
||
00AB SWAP EQU LRU+9 ; (BYTE) EARLIEST BUFFER
|
||
|
||
00AC GLOBAL EQU LRU+10 ; (WORD) GLOBAL VARIABLE POINTER
|
||
00AE VOCAB EQU GLOBAL+2 ; (WORD) VOCAB TABLE POINTER
|
||
00B0 FWORDS EQU GLOBAL+4 ; (WORD) F-WORDS TABLE POINTER
|
||
00B2 OBJTAB EQU GLOBAL+6 ; (WORD) OBJECT TABLE POINTER
|
||
|
||
0000 ; Z-STRING MANIPULATION VARIABLES
|
||
|
||
00B4 IN EQU GLOBAL+8 ; (6 BYTES) INPUT BUFFER
|
||
00BA OUT EQU IN+6 ; (6 BYTES) OUTPUT BUFFER
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 4
|
||
--- ZIP Z-PAGE VARIABLES ---
|
||
|
||
|
||
00C0 SOURCE EQU OUT+6 ; (BYTE) SOURCE BUFFER POINTER
|
||
00C1 RESULT EQU SOURCE+1 ; (BYTE) RESULT TABLE POINTER
|
||
00C2 LINLEN EQU SOURCE+2 ; (BYTE) LENGTH OF CURRENT LINE
|
||
00C3 WRDLEN EQU SOURCE+3 ; (BYTE) LENGTH OF CURRENT WORD
|
||
00C4 ENTRY EQU SOURCE+4 ; (WORD) ADDR OF CURRENT RESULT ENTRY
|
||
00C6 NENTS EQU SOURCE+6 ; (WORD) # ENTRIES IN VOCAB TABLE
|
||
00C8 ESIZE EQU SOURCE+8 ; (BYTE) SIZE OF VOCAB TABLE ENTRIES
|
||
00C9 PSET EQU SOURCE+9 ; (BYTE) PERMANENT CHARSET
|
||
00CA TSET EQU SOURCE+10 ; (BYTE) TEMPORARY CHARSET
|
||
00CB ZCHAR EQU SOURCE+11 ; (BYTE) CURRENT Z-CHAR
|
||
00CC OFFSET EQU SOURCE+12 ; (BYTE) F-WORD TABLE OFFSET
|
||
00CD ZFLAG EQU SOURCE+13 ; (BYTE) Z-WORD ACCESS FLAG
|
||
00CE ZWORD EQU SOURCE+14 ; (WORD) CURRENT Z-WORD
|
||
00D0 CONCNT EQU SOURCE+16 ; (BYTE) Z-STRING SOURCE COUNTER
|
||
00D1 CONIN EQU SOURCE+17 ; (BYTE) CONVERSION SOURCE INDEX
|
||
00D2 CONOUT EQU SOURCE+18 ; (BYTE) CONVERSION DEST INDEX
|
||
|
||
00D3 QUOT EQU SOURCE+19 ; (WORD) QUOTIENT FOR DIVISION
|
||
00D5 REMAIN EQU QUOT+2 ; (WORD) REMAINDER FOR DIVISION
|
||
00D7 MTEMP EQU QUOT+4 ; (WORD) MATH TEMPORARY REGISTER
|
||
00D9 QSIGN EQU QUOT+6 ; (BYTE) SIGN OF QUOTIENT
|
||
00DA RSIGN EQU QUOT+7 ; (BYTE) SIGN OF REMAINDER
|
||
00DB DIGITS EQU QUOT+8 ; (BYTE) DIGIT COUNT FOR "PRINTN"
|
||
|
||
00DC TIMEFL EQU QUOT+9 ; (BYTE) "TRUE" IF TIME MODE
|
||
00DD LENGTH EQU TIMEFL+1 ; (BYTE) LENGTH OF LINE IN [LINBUF]
|
||
00DE OLDLEN EQU TIMEFL+2 ; (BYTE) OLD LINE LENGTH
|
||
00DF SCRIPT EQU TIMEFL+3 ; (BYTE) SCRIPT ENABLE FLAG
|
||
00E0 LINCNT EQU TIMEFL+4 ; (BYTE) LINE COUNTER
|
||
00E1 LMAX EQU TIMEFL+5 ; (BYTE) MAX # LINES/SCREEN
|
||
|
||
00E2 IOCHAR EQU TIMEFL+6 ; (BYTE) CHARACTER BUFFER
|
||
00E3 SLINE EQU IOCHAR+1 ; (BYTE) BORDERLINE FOR SPLIT
|
||
00E4 SPSTAT EQU IOCHAR+2 ; (BYTE) SPLIT SCREEN STATUS FLAG
|
||
00E5 LFROM EQU IOCHAR+3 ; (WORD) "FROM" LINE ADDRESS
|
||
00E7 LTO EQU IOCHAR+5 ; (WORD) "TO" LINE ADDRESS
|
||
00E9 PSTAT EQU IOCHAR+7 ; (BYTE) PRINTER STATUS FLAG
|
||
00EA PRLEN EQU IOCHAR+8 ; (BYTE) SCRIPT LINE LENGTH
|
||
|
||
00EB DBLOCK EQU IOCHAR+9 ; (WORD) Z-BLOCK TO READ
|
||
00ED DBUFF EQU DBLOCK+2 ; (WORD) RAM PAGE TO ACCESS (LSB = 0)
|
||
00EF SECTOR EQU DBLOCK+4 ; (WORD) TARGET SECTOR
|
||
00F1 GPOSIT EQU DBLOCK+6 ; (BYTE) DEFAULT SAVE POSITION
|
||
00F2 GDRIVE EQU DBLOCK+7 ; (BYTE) DEFAULT SAVE DRIVE
|
||
00F3 TPOSIT EQU DBLOCK+8 ; (BYTE) TEMP SAVE POSITION
|
||
00F4 TDRIVE EQU DBLOCK+9 ; (BYTE) TEMP SAVE DRIVE
|
||
00F5 DRIVE EQU DBLOCK+10 ; (BYTE) CURRENT DRIVE
|
||
|
||
00F6 BLINK EQU DBLOCK+11 ; (WORD) CURSOR BLINK TIMER
|
||
00F8 CSHAPE EQU BLINK+2 ; (BYTE) CURRENT CURSOR SHAPE
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 5
|
||
--- ZIP Z-PAGE VARIABLES ---
|
||
|
||
|
||
END
|
||
|
||
INCLUD HARDEQ.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 6
|
||
--- HARDWARE EQUATES: ATARI ---
|
||
|
||
|
||
0000 ; ----------------
|
||
0000 ; ATARI MEMORY MAP
|
||
0000 ; ----------------
|
||
|
||
0400 IOBUFF EQU $0400 ; DISK I/O BUFFER
|
||
0480 BUFTOP EQU $0480 ; TOP HALF OF I/O BUFFER
|
||
0500 ZSTAKL EQU $0500 ; Z-STACK LSBS
|
||
0600 ZSTAKH EQU $0600 ; Z-STACK MSBS
|
||
0700 PTABL EQU $0700 ; PAGING TABLE LSBS
|
||
0800 PTABH EQU $0800 ; PAGING TABLE MSBS
|
||
0900 LRUMAP EQU $0900 ; TIMESTAMP MAP
|
||
0A00 LOCALS EQU $0A00 ; LOCAL VARIABLE STORAGE (30 BYTES)
|
||
0A20 BUFSAV EQU $0A20 ; AUXILIARY INPUT BUFFER (80 BYTES)
|
||
0A80 LBUFF EQU $0A80 ; MAIN INPUT BUFFER (80 BYTES)
|
||
|
||
0800 PLMRAM EQU $0800 ; START OF PLAYER/MISSILE RAM
|
||
0B00 MISSL EQU $0B00 ; START OF MISSILE RAM (CURSOR)
|
||
|
||
0C00 ZIP EQU $0C00 ; START OF ZIP CODE
|
||
2600 ZBEGIN EQU $2600 ; START OF Z-CODE (ASSUME 6.5K ZIP)
|
||
|
||
BC20 OLDLST EQU $BC20 ; CIO DEFAULT DL ADDR
|
||
BC40 SCREEN EQU $BC40 ; START OF SCREEN RAM
|
||
|
||
0000 ; ---------
|
||
0000 ; CONSTANTS
|
||
0000 ; ---------
|
||
|
||
0027 XSIZE EQU 39 ; WIDTH OF SCREEN IN CHARACTERS (-1)
|
||
0017 YSIZE EQU 23 ; HEIGHT OF SCREEN IN LINES (-1)
|
||
|
||
009B EOL EQU $9B ; EOL CHAR
|
||
0020 SPACE EQU $20 ; SPACE CHAR
|
||
007E BACKSP EQU 126 ; BACKSPACE
|
||
|
||
0000 ; ---------
|
||
0000 ; ZER0-PAGE
|
||
0000 ; ---------
|
||
|
||
0009 BOOT EQU $09 ; BOOT FLAG
|
||
000A DOSVEC EQU $0A ; DOS START VECTOR
|
||
0010 POKMSK EQU $10 ; FOR BREAK KEY DISABLE
|
||
0014 RTCLOK EQU $14 ; JIFFY CLOCK
|
||
0052 LMARGN EQU $52 ; LEFT MARGIN
|
||
0054 ROWCRS EQU $54 ; OS CURSOR ROW
|
||
0055 COLCRS EQU $55 ; OS CURSOR COLUMN
|
||
|
||
0000 ; ---------
|
||
0000 ; PAGES 2-3
|
||
0000 ; ---------
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 7
|
||
--- HARDWARE EQUATES: ATARI ---
|
||
|
||
|
||
022F SDMCTL EQU $022F ; DMA CONTROL
|
||
0230 SDLSTL EQU $0230 ; DISPLAY LIST ADDRESS
|
||
0244 COLDST EQU $0244 ; COLDSTART FLAG
|
||
026F GPRIOR EQU $026F ; GRAPHICS PRIORITY
|
||
02B2 LOGMAP EQU $02B2 ; LOGICAL LINE MAP (3 BYTES)
|
||
02B6 INVFLG EQU $02B6 ; INVERSE TEXT FLAG
|
||
02C5 COLOR1 EQU $02C5 ; TEXT COLOR
|
||
02C8 COLOR4 EQU $02C8 ; BORDER COLOR
|
||
02F0 CRSINH EQU $02F0 ; OS CURSOR INHIBIT
|
||
02FC CH EQU $02FC ; KEYBOARD READ FLAG
|
||
0301 DUNIT EQU $0301 ; DRIVE #
|
||
0302 DCOMND EQU $0302 ; DISK COMMAND
|
||
0303 DSTATS EQU $0303 ; DISK I/O STATUS
|
||
0304 DBUFLO EQU $0304 ; DISK BUFFER ADDR (LSB)
|
||
0305 DBUFHI EQU $0305 ; DISK BUFFER ADDR (MSB)
|
||
030A DAUX1 EQU $030A ; SECTOR ADDR (LSB)
|
||
030B DAUX2 EQU $030B ; SECTOR ADDR (MSB)
|
||
0342 ICCOM EQU $0342 ; IOCB #0 COMMAND
|
||
0344 ICBADR EQU $0344 ; IOCB #0 BUFFER ADDR
|
||
0348 ICBLEN EQU $0348 ; IOCB #0 LENGTH
|
||
034A ICAUX1 EQU $034A ; IOCB #0 AUX BYTE #1
|
||
034B ICAUX2 EQU $034B ; IOCB #0 AUX BYTE #2
|
||
|
||
0000 ; ------------------
|
||
0000 ; GTIA, POKEY, ANTIC
|
||
0000 ; ------------------
|
||
|
||
D000 HPOSP0 EQU $D000 ; PLAYER #0 H-POS
|
||
D004 HPOSM0 EQU $D004 ; MISSILE #0 H-POS
|
||
D00C SIZEM EQU $D00C ; MISSILE SIZES
|
||
D01D GRACTL EQU $D01D ; P/M GRAPHICS CONTROL
|
||
D01F CONSOL EQU $D01F ; CONSOLE KEY REGISTER
|
||
D200 AUDF1 EQU $D200 ; AUDIO CH1 FREQ
|
||
D201 AUDC1 EQU $D201 ; AUDIO CH1 CTRL
|
||
D208 AUDCTL EQU $D208 ; AUDIO CONTROL
|
||
D20A MRAND EQU $D20A ; RANDOM BYTE
|
||
D20E IRQEN EQU $D20E ; IRQ ENABLE
|
||
D20F SKCTL EQU $D20F ; SERIAL PORT CONTROL
|
||
D301 PORTB EQU $D301 ; PORT B (XL ROM SWITCH)
|
||
D400 DMACTL EQU $D400 ; DMA CONTROL
|
||
D407 PMBASE EQU $D407 ; PMG RAM BASE ADDR
|
||
|
||
0000 ; ------
|
||
0000 ; OS ROM
|
||
0000 ; ------
|
||
|
||
E453 DSKINV EQU $E453 ; SIO DISK ACCESS
|
||
E456 CIOV EQU $E456 ; CIO VECTOR
|
||
|
||
END
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 8
|
||
--- HARDWARE EQUATES: ATARI ---
|
||
|
||
INCLUD COLD.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 9
|
||
--- MACHINE COLDSTART: ATARI ---
|
||
|
||
|
||
0C00 ORG ZIP
|
||
|
||
0C00 ; -----------------
|
||
0C00 ; ATARI BOOT HEADER
|
||
0C00 ; -----------------
|
||
|
||
0C00 00 DB 0 ; FLAG BYTE (IGNORED)
|
||
0C01 38 DB 56 ; LOAD 7K OF CODE
|
||
0C02 000C DW ZIP ; WHERE TO LOAD THE SECTORS
|
||
0C04 0E0C DW DUMMY ; POINT TO INIT SUBROUTINE
|
||
|
||
0C06 ; --------------
|
||
0C06 ; BOOT COLDSTART
|
||
0C06 ; --------------
|
||
|
||
0C06 A94F LDA #LOW COLD ; POINT [DOSVEC] TO
|
||
0C08 850A STA DOSVEC+LO ; THE COLDSTART ROUTINE
|
||
0C0A A90C LDA #HIGH COLD
|
||
0C0C 850B STA DOSVEC+HI
|
||
|
||
0C0E A9FF DUMMY: LDA #$FF ; DISABLE BASIC ROM
|
||
0C10 8D01D3 STA PORTB ; IN XL-SERIES MACHINES
|
||
0C13 18 CLC ; SUCCESS FLAG
|
||
0C14 60 RTS
|
||
|
||
0C15 ; -------------------
|
||
0C15 ; CUSTOM DISPLAY LIST
|
||
0C15 ; -------------------
|
||
|
||
0C15 707050 DLIST: DB $70,$70,$50 ; 22 BLANK LINES
|
||
0C18 42 DB $42 ; 1 TEXT LINE W/LMS
|
||
0C19 40BC DW SCREEN ; ADDR OF SCREEN RAM
|
||
0C1B 10 DB $10 ; 2 BLANK LINES
|
||
0C1C 02020202 DB $02,$02,$02,$02,$02,$02,$02 ; 7 TEXT LINES
|
||
0C23 02020202 DB $02,$02,$02,$02,$02,$02,$02,$02 ; 8 TEXT LINES
|
||
0C2B 02020202 DB $02,$02,$02,$02,$02,$02,$02,$02 ; 8 TEXT LINES
|
||
0C33 41 DB $41 ; JVB
|
||
0C34 150C DW DLIST ; ADDR OF D-LIST
|
||
|
||
0C36 54686520 SLD: DB "The story is loading ..."
|
||
0C4E 9B DB EOL
|
||
0019 SLDL EQU $-SLD
|
||
|
||
0C4F ; ---------
|
||
0C4F ; COLDSTART
|
||
0C4F ; ---------
|
||
|
||
0C4F D8 COLD: CLD
|
||
0C50 A2FF LDX #$FF ; RESET THE
|
||
0C52 9A TXS ; HARDWARE STACK
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 10
|
||
--- MACHINE COLDSTART: ATARI ---
|
||
|
||
0C53 8EFC02 STX CH ; AND KEYBOARD REGISTER
|
||
0C56 8E01D3 STX PORTB ; REMOVE BASIC ROM IN XL MACHINES
|
||
0C59 E8 INX ; = 0
|
||
0C5A 8E4402 STX COLDST ; COLDSTART OKAY
|
||
0C5D 8E08D2 STX AUDCTL ; CLEAR SOUND
|
||
0C60 8652 STX LMARGN ; NO LEFT MARGIN
|
||
0C62 86DF STX SCRIPT ; DISABLE SCRIPTING
|
||
0C64 8ED81F STX SFLAG ; DISABLE PREVIOS SCRIPT (BM 5/14/85)
|
||
0C67 E8 INX ; = 1
|
||
0C68 8609 STX BOOT ; BOOT SUCCESSFUL
|
||
0C6A 8E6F02 STX GPRIOR ; MAXIMUM PMG PRIORITY
|
||
0C6D 8EF002 STX CRSINH ; INHIBIT OS CURSOR
|
||
|
||
0C70 A903 LDA #3
|
||
0C72 8D0FD2 STA SKCTL ; RESET SOUND
|
||
0C75 8D1DD0 STA GRACTL ; ENABLE PLAYERS & MISSILES
|
||
|
||
0C78 A970 LDA #$70
|
||
0C7A 8510 STA POKMSK ; DISABLE
|
||
0C7C 8D0ED2 STA IRQEN ; THE BREAK KEY
|
||
|
||
0C7F A90C LDA #12 ; WHITE
|
||
0C81 8DC502 STA COLOR1 ; TEXT
|
||
0C84 A994 LDA #148
|
||
0C86 8DC802 STA COLOR4 ; BLUE BORDER
|
||
|
||
0C89 A211 LDX #$11 ; CLEAR ALL PMG REGISTERS
|
||
0C8B A900 LDA #0
|
||
0C8D 9D00D0 PMG0: STA HPOSP0,X
|
||
0C90 CA DEX
|
||
0C91 10FA BPL PMG0
|
||
|
||
0C93 AA TAX ; [X] & [A] = 0
|
||
0C94 9D000B PMG1: STA MISSL,X ; CLEAR CURSOR RAM
|
||
0C97 E8 INX
|
||
0C98 D0FA BNE PMG1
|
||
|
||
0C9A A901 LDA #1 ; DOUBLE-WIDTH FOR
|
||
0C9C 8D0CD0 STA SIZEM ; MISSILE #0
|
||
0C9F A908 LDA #HIGH PLMRAM ; POINT TO LOCATION
|
||
0CA1 8D07D4 STA PMBASE ; OF PMG RAM
|
||
|
||
0CA4 A915 LDA #LOW DLIST ; ENABLE
|
||
0CA6 8D3002 STA SDLSTL+LO ; CUSTOM
|
||
0CA9 A90C LDA #HIGH DLIST ; DISPLAY
|
||
0CAB 8D3102 STA SDLSTL+HI ; LIST
|
||
|
||
0CAE ; FALL THROUGH ...
|
||
|
||
0CAE ; ---------------
|
||
0CAE ; WARMSTART ENTRY
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 11
|
||
--- MACHINE COLDSTART: ATARI ---
|
||
|
||
0CAE ; ---------------
|
||
|
||
0CAE 20D320 WARM: JSR CLS ; CLEAR SCREEN
|
||
|
||
0CB1 A908 LDA #8 ; POSITION CURSOR
|
||
0CB3 8555 STA COLCRS+LO ; AT (8,0)
|
||
0CB5 A900 LDA #0
|
||
0CB7 8554 STA ROWCRS
|
||
|
||
0CB9 A236 LDX #LOW SLD
|
||
0CBB A90C LDA #HIGH SLD
|
||
0CBD A019 LDY #SLDL
|
||
0CBF 20A823 JSR SROOM ; "THE STORY IS LOADING ..."
|
||
|
||
0CC2 A93E LDA #%00111110 ; ENABLE 1-LINE PMG, STANDARD FIELD
|
||
0CC4 8D2F02 STA SDMCTL ; RESTORE ANTIC
|
||
|
||
0CC7 ; FALL THROUGH TO ZIP WARMSTART ...
|
||
|
||
END
|
||
|
||
INCLUD WARM.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 12
|
||
--- WARMSTART ROUTINE ---
|
||
|
||
|
||
0CC7 ; -------------
|
||
0CC7 ; ZIP WARMSTART
|
||
0CC7 ; -------------
|
||
|
||
0CC7 A900 WARM1: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
|
||
0CC9 A280 LDX #ZEROPG
|
||
0CCB 9500 ST0: STA 0,X
|
||
0CCD E8 INX
|
||
; CPX #ZPGTOP ; NOT NEEDED FOR ATARI
|
||
0CCE D0FB BNE ST0
|
||
|
||
0CD0 ; INIT THE PAGING TABLE
|
||
|
||
0CD0 AA TAX ; = 0
|
||
0CD1 A9FF LDA #$FF
|
||
0CD3 9D0007 ST1: STA PTABL,X
|
||
0CD6 9D0008 STA PTABH,X
|
||
0CD9 E8 INX
|
||
0CDA D0F7 BNE ST1
|
||
|
||
0CDC ; CLEAR THE TIMESTAMP MAP
|
||
|
||
0CDC 8A TXA ; = 0
|
||
0CDD 9D0009 ST2: STA LRUMAP,X
|
||
0CE0 E8 INX
|
||
0CE1 D0FA BNE ST2
|
||
|
||
0CE3 E694 INC ZSP ; INIT Z-STACK POINTERS
|
||
0CE5 E695 INC OLDZSP ; TO "1"
|
||
0CE7 E6AA INC STAMP ; INIT TIMESTAMP
|
||
|
||
0CE9 ; GRAB THE FIRST BLOCK OF PRELOAD
|
||
|
||
0CE9 A926 LDA #HIGH ZBEGIN ; MSB OF PRELOAD START ADDRESS
|
||
0CEB 85A3 STA ZCODE ; FREEZE IT HERE
|
||
0CED 85EE STA DBUFF+HI ; LSB IS ALWAYS ZERO
|
||
0CEF C6A4 DEC ZPURE ; (ATARI ONLY) FORCE FETCH FROM PRELOAD
|
||
0CF1 203325 JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0
|
||
|
||
0CF4 ; EXTRACT GAME DATA FROM Z-CODE HEADER
|
||
|
||
0CF4 AE0426 LDX ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER
|
||
0CF7 E8 INX ; ADD 1 TO GET
|
||
0CF8 86A4 STX ZPURE ; 1ST "PURE" PAGE OF Z-CODE
|
||
|
||
0CFA 8A TXA ; ADD START PAGE OF PRELOAD
|
||
0CFB 18 CLC ; TO CALC ABSOLUTE START ADDRESS
|
||
0CFC 65A3 ADC ZCODE ; OF PAGING SPACE
|
||
0CFE 85A5 STA PAGE0
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 13
|
||
--- WARMSTART ROUTINE ---
|
||
|
||
0D00 206A1C JSR MEMTOP ; RETURNS TOP RAM PAGE IN [A]
|
||
0D03 38 SEC
|
||
0D04 E5A5 SBC PAGE0 ; SUBTRACT ADDRESS OF PAGING SPACE
|
||
0D06 F002 BEQ NORAM
|
||
0D08 B005 BCS SETNP ; ERROR IF NOT ENOUGH RAM
|
||
|
||
0D0A ; *** ERROR #0 -- INSUFFICIENT RAM ***
|
||
|
||
0D0A A900 NORAM: LDA #0
|
||
0D0C 4CF91B JMP ZERROR
|
||
|
||
0D0F 85A6 SETNP: STA PMAX ; SET # SWAPPING PAGES
|
||
|
||
0D11 AD0126 LDA ZBEGIN+ZMODE
|
||
0D14 0920 ORA #%00100000 ; ENABLE SPLIT-SCREEN
|
||
0D16 8D0126 STA ZBEGIN+ZMODE
|
||
|
||
0D19 2902 AND #%00000010 ; ISOLATE STATUS-FORMAT BIT
|
||
0D1B 85DC STA TIMEFL ; 0=SCORE, NZ=TIME
|
||
|
||
0D1D AD0C26 LDA ZBEGIN+ZGLOBA ; GET MSB OF GLOBAL TABLE ADDR
|
||
0D20 18 CLC ; CONVERT TO
|
||
0D21 65A3 ADC ZCODE ; ABSOLUTE ADDRESS
|
||
0D23 85AD STA GLOBAL+HI
|
||
0D25 AD0D26 LDA ZBEGIN+ZGLOBA+1 ; LSB NEEDN'T CHANGE
|
||
0D28 85AC STA GLOBAL+LO
|
||
|
||
0D2A AD1826 LDA ZBEGIN+ZFWORD ; DO SAME FOR FWORDS TABLE
|
||
0D2D 18 CLC
|
||
0D2E 65A3 ADC ZCODE
|
||
0D30 85B1 STA FWORDS+HI
|
||
0D32 AD1926 LDA ZBEGIN+ZFWORD+1 ; NO CHANGE FOR LSB
|
||
0D35 85B0 STA FWORDS+LO
|
||
|
||
0D37 AD0826 LDA ZBEGIN+ZVOCAB ; NOW DO VOCABULARY TABLE
|
||
0D3A 18 CLC
|
||
0D3B 65A3 ADC ZCODE
|
||
0D3D 85AF STA VOCAB+HI
|
||
0D3F AD0926 LDA ZBEGIN+ZVOCAB+1 ; LSB SAME
|
||
0D42 85AE STA VOCAB+LO
|
||
|
||
0D44 AD0A26 LDA ZBEGIN+ZOBJEC ; NOT TO MENTION
|
||
0D47 18 CLC ; THE OBJECT TABLE
|
||
0D48 65A3 ADC ZCODE
|
||
0D4A 85B3 STA OBJTAB+HI
|
||
0D4C AD0B26 LDA ZBEGIN+ZOBJEC+1 ; LSB SAME
|
||
0D4F 85B2 STA OBJTAB+LO
|
||
|
||
0D51 ; FETCH THE REST OF THE PRELOAD
|
||
|
||
0D51 A5EB LDPRE: LDA DBLOCK+LO ; CHECK CURRENT BLOCK #
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 14
|
||
--- WARMSTART ROUTINE ---
|
||
|
||
0D53 C5A4 CMP ZPURE ; LOADED LAST PRELOAD PAGE YET?
|
||
0D55 B006 BCS WARMEX ; YES, TIME TO PLAY!
|
||
0D57 203325 JSR GETDSK ; ELSE GRAB NEXT Z-BLOCK
|
||
0D5A 4C510D JMP LDPRE
|
||
|
||
0D5D AD0626 WARMEX: LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE
|
||
0D60 8597 STA ZPCM ; MSB
|
||
0D62 AD0726 LDA ZBEGIN+ZGO+1 ; AND LSB
|
||
0D65 8596 STA ZPCL ; HIGH BIT ALREADY ZEROED
|
||
|
||
0D67 A915 LDA #21
|
||
0D69 85E1 STA LMAX ; PREVENT WEIRDNESS
|
||
|
||
0D6B 207F23 JSR SIDE2 ; REQUEST SIDE 2 OF DISK
|
||
0D6E 20D320 JSR CLS ; CLEAR SCREEN
|
||
|
||
0D71 A9FF LDA #$FF
|
||
0D73 85DF STA SCRIPT ; ENABLE SCRIPTING
|
||
|
||
0D75 AD1126 LDA ZBEGIN+ZSCRIP+1 ; SET SCRIPT FLAG
|
||
0D78 0DD81F ORA SFLAG ; TO PREVIOUS SETTING
|
||
0D7B 8D1126 STA ZBEGIN+ZSCRIP+1 ; (BM 5/14/85)
|
||
|
||
0D7E ; ... AND FALL INTO MAIN LOOP
|
||
|
||
END
|
||
INCLUD MAIN.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 15
|
||
--- MAIN LOOP ---
|
||
|
||
|
||
0D7E A900 MLOOP: LDA #0
|
||
0D80 8581 STA NARGS ; RESET # ARGUMENTS
|
||
0D82 201918 JSR NEXTPC ; GET NEXT INSTRUCTION INTO [A]
|
||
0D85 8580 STA OPCODE ; SAVE IT HERE
|
||
|
||
0D87 IF DEBUG
|
||
0D87 LDA SECTOR+LO
|
||
0D87 STA MBYTE
|
||
0D87 LDA #0 ; BREAKPOINT #0
|
||
0D87 JSR DOBUG
|
||
0D87 LDA OPCODE
|
||
0D87 ENDIF
|
||
|
||
0D87 ; DECODE AN OPCODE
|
||
|
||
0D87 AA TAX ; SET FLAGS
|
||
0D88 3003 BMI DC0 ; IF POSITIVE,
|
||
0D8A 4C480E JMP OP2 ; IT'S A 2-OP
|
||
|
||
0D8D C9B0 DC0: CMP #$B0
|
||
0D8F B003 BCS DC1
|
||
0D91 4C190E JMP OP1 ; OR MAYBE A 1-OP
|
||
|
||
0D94 C9C0 DC1: CMP #$C0
|
||
0D96 B003 BCS OPEXT
|
||
0D98 4C0A0E JMP OP0 ; PERHAPS A 0-OP
|
||
|
||
0D9B ; --------------
|
||
0D9B ; HANDLE AN X-OP
|
||
0D9B ; --------------
|
||
|
||
0D9B 201918 OPEXT: JSR NEXTPC ; GRAB THE ARGUMENT ID BYTE
|
||
0D9E 858A STA ABYTE ; HOLD IT HERE
|
||
|
||
0DA0 A200 LDX #0
|
||
0DA2 868B STX ADEX ; INIT ARGUMENT INDEX
|
||
0DA4 F006 BEQ OPX1 ; JUMP TO TOP OF LOOP
|
||
|
||
0DA6 A58A OPX0: LDA ABYTE ; GET ARG BYTE
|
||
0DA8 0A ASL A ; SHIFT NEXT 2 ARG BITS
|
||
0DA9 0A ASL A ; INTO BITS 7 & 6
|
||
0DAA 858A STA ABYTE ; HOLD FOR LATER
|
||
|
||
0DAC 29C0 OPX1: AND #%11000000 ; MASK OUT GARBAGE BITS
|
||
0DAE D006 BNE OPX2
|
||
0DB0 20940E JSR GETLNG ; 00 = LONG IMMEDIATE
|
||
0DB3 4CC70D JMP OPXNXT
|
||
|
||
0DB6 C940 OPX2: CMP #%01000000 ; IS IT A SHORT IMMEDIATE?
|
||
0DB8 D006 BNE OPX3 ; NO, KEEP GUESSING
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 16
|
||
--- MAIN LOOP ---
|
||
|
||
0DBA 20900E JSR GETSHT ; 01 = SHORT IMMEDIATE
|
||
0DBD 4CC70D JMP OPXNXT
|
||
|
||
0DC0 C980 OPX3: CMP #%10000000 ; LAST TEST
|
||
0DC2 D017 BNE OPX4 ; 11 = NO MORE ARGUMENTS
|
||
0DC4 20A80E JSR GETVAR ; 10 = VARIABLE
|
||
|
||
0DC7 A68B OPXNXT: LDX ADEX ; RETRIEVE ARGUMENT INDEX
|
||
0DC9 A58C LDA VALUE+LO ; GRAB LSB OF VALUE
|
||
0DCB 9582 STA ARG1+LO,X ; STORE IN ARGUMENT TABLE
|
||
0DCD A58D LDA VALUE+HI ; GRAB MSB OF VALUE
|
||
0DCF 9583 STA ARG1+HI,X ; STORE THAT, TOO
|
||
|
||
0DD1 E681 INC NARGS ; UPDATE ARGUMENT COUNTER
|
||
|
||
0DD3 E8 INX
|
||
0DD4 E8 INX
|
||
0DD5 868B STX ADEX ; UPDATE INDEX
|
||
0DD7 E008 CPX #8 ; DONE 4 ARGUMENTS YET?
|
||
0DD9 90CB BCC OPX0 ; NO, GET SOME MORE
|
||
|
||
0DDB ; ALL X-OP ARGUMENTS READY
|
||
|
||
0DDB A580 OPX4: LDA OPCODE ; IS THIS
|
||
0DDD C9E0 CMP #$E0 ; AN EXTENDED 2-OP?
|
||
0DDF B003 BCS DOXOP ; NO, IT'S A REAL X-OP
|
||
0DE1 4C710E JMP OP2EX ; ELSE TREAT IT LIKE A 2-OP
|
||
|
||
0DE4 A252 DOXOP: LDX #LOW OPTX ; GET ADDR OF X-OP TABLE
|
||
0DE6 A010 LDY #HIGH OPTX ; INTO [X/Y]
|
||
0DE8 291F AND #%00011111 ; ISOLATE OP ID BITS
|
||
0DEA C90C CMP #NOPSX ; IS IT A LEGAL X-OP?
|
||
0DEC 9005 BCC DODIS ; YUP; TIME TO DISPATCH IT
|
||
|
||
0DEE ; *** ERROR #1 -- ILLEGAL X-OP ***
|
||
|
||
0DEE A901 LDA #1
|
||
0DF0 4CF91B JMP ZERROR
|
||
|
||
0DF3 ; ---------------
|
||
0DF3 ; OPCODE DISPATCH
|
||
0DF3 ; ---------------
|
||
|
||
0DF3 ; ENTRY: MASKED OPCODE INDEX IN [A]
|
||
0DF3 ; OP-TABLE ADDR IN X/Y (LSB/MSB)
|
||
|
||
0DF3 868E DODIS: STX I+LO ; SAVE TABLE ADDRESS
|
||
0DF5 848F STY I+HI ; IN A POINTER
|
||
|
||
0DF7 0A ASL A ; WORD-ALIGN THE OP INDEX
|
||
0DF8 A8 TAY
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 17
|
||
--- MAIN LOOP ---
|
||
|
||
0DF9 B18E LDA (I),Y ; GET LSB OF DISPATCH ADDRESS
|
||
0DFB 8D050E STA GO+LO ; INSTALL AS JSR OPERAND
|
||
0DFE C8 INY
|
||
0DFF B18E LDA (I),Y ; SAME WITH MSB
|
||
0E01 8D060E STA GO+HI
|
||
|
||
0E04 20 DB $20 ; 6502 "JSR" OPCODE
|
||
0E05 0000 GO: DW $0000 ; DUMMY OPERAND BYTES
|
||
|
||
0E07 4C7E0D JMP MLOOP ; GO BACK FOR ANOTHER OPCODE
|
||
|
||
0E0A ; -------------
|
||
0E0A ; HANDLE A 0-OP
|
||
0E0A ; -------------
|
||
|
||
0E0A A2E4 OP0: LDX #LOW OPT0 ; GET 0-OP TABLE ADDR
|
||
0E0C A00F LDY #HIGH OPT0 ; INTO [X/Y]
|
||
0E0E 290F AND #%00001111 ; ISOLATE 0-OP ID BITS
|
||
0E10 C90E CMP #NOPS0 ; OUT OF RANGE?
|
||
0E12 90DF BCC DODIS ; NO, DISPATCH IT
|
||
|
||
0E14 ; *** ERROR #2 -- ILLEGAL 0-OP ***
|
||
|
||
0E14 A902 LDA #2
|
||
0E16 4CF91B JMP ZERROR
|
||
|
||
0E19 ; -------------
|
||
0E19 ; HANDLE A 1-OP
|
||
0E19 ; -------------
|
||
|
||
0E19 2930 OP1: AND #%00110000 ; ISOLATE ARGUMENT BITS
|
||
0E1B D006 BNE OP1A
|
||
0E1D 20940E JSR GETLNG ; 00 = LONG IMMEDIATE
|
||
0E20 4C340E JMP OP1EX
|
||
|
||
0E23 C910 OP1A: CMP #%00010000 ; TEST AGAIN
|
||
0E25 D006 BNE OP1B
|
||
0E27 20900E JSR GETSHT ; 01 = SHORT IMMEDIATE
|
||
0E2A 4C340E JMP OP1EX
|
||
|
||
0E2D C920 OP1B: CMP #%00100000 ; ONE MORE TEST
|
||
0E2F D012 BNE BADOP1 ; UNDEFINED STATE!
|
||
0E31 20A80E JSR GETVAR ; 10 = VARIABLE
|
||
|
||
0E34 20850E OP1EX: JSR V2A1 ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS]
|
||
0E37 A200 LDX #LOW OPT1 ; GET ADDR OF 1-OP TABLE
|
||
0E39 A010 LDY #HIGH OPT1 ; INTO [X/Y]
|
||
0E3B A580 LDA OPCODE ; RESTORE OPCODE
|
||
0E3D 290F AND #%00001111 ; ISOLATE OP ID BITS
|
||
0E3F C910 CMP #NOPS1 ; IF WITHIN RANGE,
|
||
0E41 90B0 BCC DODIS ; EXECUTE THE 1-OP
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 18
|
||
--- MAIN LOOP ---
|
||
|
||
|
||
0E43 ; *** ERROR #3 -- ILLEGAL 1-OP ***
|
||
|
||
0E43 A903 BADOP1: LDA #3
|
||
0E45 4CF91B JMP ZERROR
|
||
|
||
0E48 ; -------------
|
||
0E48 ; HANDLE A 2-OP
|
||
0E48 ; -------------
|
||
|
||
0E48 2940 OP2: AND #%01000000 ; ISOLATE 1ST ARG BIT
|
||
0E4A D006 BNE OP2A
|
||
0E4C 20900E JSR GETSHT ; 0 = SHORT IMMEDIATE
|
||
0E4F 4C550E JMP OP2B
|
||
0E52 20A80E OP2A: JSR GETVAR ; 1 = VARIABLE
|
||
0E55 20850E OP2B: JSR V2A1 ; [VALUE] TO [ARG1], UPDATE [NARGS]
|
||
|
||
0E58 A580 LDA OPCODE ; RESTORE OPCODE BYTE
|
||
0E5A 2920 AND #%00100000 ; ISOLATE 2ND ARG BIT
|
||
0E5C D006 BNE OP2C
|
||
0E5E 20900E JSR GETSHT ; 0 = SHORT IMMEDIATE
|
||
0E61 4C670E JMP OP2D
|
||
0E64 20A80E OP2C: JSR GETVAR ; 1 = VARIABLE
|
||
0E67 A58C OP2D: LDA VALUE+LO ; MOVE 2ND [VALUE]
|
||
0E69 8584 STA ARG2+LO ; INTO [ARG2]
|
||
0E6B A58D LDA VALUE+HI
|
||
0E6D 8585 STA ARG2+HI
|
||
0E6F E681 INC NARGS ; UPDATE ARGUMENT COUNT
|
||
|
||
0E71 ; EXECUTE A 2-OP OR EXTENDED 2-OP
|
||
|
||
0E71 A220 OP2EX: LDX #LOW OPT2 ; LSB OF DISPATCH TABLE
|
||
0E73 A010 LDY #HIGH OPT2 ; MSB
|
||
0E75 A580 LDA OPCODE ; RESTORE OPCODE BYTE
|
||
0E77 291F AND #%00011111 ; ISOLATE OP ID BITS
|
||
0E79 C919 CMP #NOPS2
|
||
0E7B B003 BCS BADOP2 ; ERROR IF OUT OF RANGE
|
||
0E7D 4CF30D JMP DODIS ; ELSE DISPATCH
|
||
|
||
0E80 ; *** ERROR #4 -- ILLEGAL 2-OP ****
|
||
|
||
0E80 A904 BADOP2: LDA #4
|
||
0E82 4CF91B JMP ZERROR
|
||
|
||
0E85 ; --------------------------------------
|
||
0E85 ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS]
|
||
0E85 ; --------------------------------------
|
||
|
||
0E85 A58C V2A1: LDA VALUE+LO
|
||
0E87 8582 STA ARG1+LO
|
||
0E89 A58D LDA VALUE+HI
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 19
|
||
--- MAIN LOOP ---
|
||
|
||
0E8B 8583 STA ARG1+HI
|
||
0E8D E681 INC NARGS
|
||
0E8F 60 RTS
|
||
|
||
END
|
||
INCLUD SUBS.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 20
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
|
||
0E90 ; -----------------------
|
||
0E90 ; FETCH A SHORT IMMEDIATE
|
||
0E90 ; -----------------------
|
||
|
||
0E90 A900 GETSHT: LDA #0 ; MSB IS ZERO
|
||
0E92 F003 BEQ GETV ; FETCH LSB FROM Z-CODE
|
||
|
||
0E94 ; ----------------------
|
||
0E94 ; FETCH A LONG IMMEDIATE
|
||
0E94 ; ----------------------
|
||
|
||
0E94 201918 GETLNG: JSR NEXTPC ; GRAB MSB
|
||
|
||
0E97 858D GETV: STA VALUE+HI
|
||
0E99 201918 JSR NEXTPC ; GRAB LSB
|
||
0E9C 858C STA VALUE+LO
|
||
0E9E 60 RTS
|
||
|
||
0E9F ; ----------------
|
||
0E9F ; FETCH A VARIABLE
|
||
0E9F ; ----------------
|
||
|
||
0E9F ; FROM INSIDE AN OPCODE (VARIABLE ID IN [A])
|
||
|
||
0E9F AA VARGET: TAX ; IF NON-ZERO,
|
||
0EA0 D00B BNE GETVR1 ; ACCESS A VARIABLE
|
||
|
||
0EA2 20CE0E JSR POPVAL ; ELSE PULL VAR OFF Z-STACK
|
||
0EA5 4CE40E JMP PSHVAL ; WITHOUT ALTERING STACK
|
||
|
||
0EA8 ; FROM THE MAIN LOOP (VARIABLE ID IN Z-CODE)
|
||
|
||
0EA8 201918 GETVAR: JSR NEXTPC ; GRAB VAR-TYPE BYTE
|
||
0EAB F021 BEQ POPVAL ; VALUE IS ON Z-STACK
|
||
|
||
0EAD ; IS VARIABLE LOCAL OR GLOBAL?
|
||
|
||
0EAD C910 GETVR1: CMP #$10 ; IF >= 16,
|
||
0EAF B010 BCS GETVRG ; IT'S GLOBAL
|
||
|
||
0EB1 ; HANDLE A LOCAL VARIABLE
|
||
|
||
0EB1 38 GETVRL: SEC
|
||
0EB2 E901 SBC #1 ; FORM A ZERO-ALIGNED
|
||
0EB4 0A ASL A ; WORD INDEX
|
||
0EB5 AA TAX ; INTO THE [LOCALS] TABLE
|
||
|
||
0EB6 BD000A LDA LOCALS+LO,X ; GRAB LSB
|
||
0EB9 858C STA VALUE+LO
|
||
0EBB BD010A LDA LOCALS+HI,X ; AND MSB
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 21
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
0EBE 858D STA VALUE+HI
|
||
0EC0 60 RTS
|
||
|
||
0EC1 ; HANDLE A GLOBAL VARIABLE
|
||
|
||
0EC1 20320F GETVRG: JSR GVCALC ; GET ADDRESS OF GLOBAL INTO [I]
|
||
0EC4 B18E LDA (I),Y ; MSB OF GLOBAL ([Y] = 0)
|
||
0EC6 858D STA VALUE+HI
|
||
0EC8 C8 INY ; = 1
|
||
0EC9 B18E LDA (I),Y ; LSB OF GLOBAL
|
||
0ECB 858C STA VALUE+LO ; SAVE IT
|
||
0ECD 60 RTS ; AND WE'RE DONE
|
||
|
||
0ECE ; ----------------------------------
|
||
0ECE ; POP Z-STACK INTO [VALUE] AND [X/A]
|
||
0ECE ; ----------------------------------
|
||
|
||
0ECE C694 POPVAL: DEC ZSP
|
||
0ED0 F00D BEQ UNDER ; UNDERFLOW IF ZERO!
|
||
|
||
0ED2 A494 LDY ZSP ; READ STACK POINTER
|
||
0ED4 BE0005 LDX ZSTAKL,Y ; GRAB LSB OF STACK VALUE
|
||
0ED7 868C STX VALUE+LO ; GIVE TO [VALUE]
|
||
0ED9 B90006 LDA ZSTAKH,Y ; ALSO GRAB MSB
|
||
0EDC 858D STA VALUE+HI ; A SIMILAR FATE
|
||
0EDE 60 RTS
|
||
|
||
0EDF ; *** ERROR #5 -- Z-STACK UNDERFLOW ***
|
||
|
||
0EDF A905 UNDER: LDA #5
|
||
0EE1 4CF91B JMP ZERROR
|
||
|
||
0EE4 ; -----------------------
|
||
0EE4 ; PUSH [VALUE] TO Z-STACK
|
||
0EE4 ; -----------------------
|
||
|
||
0EE4 A68C PSHVAL: LDX VALUE+LO
|
||
0EE6 A58D LDA VALUE+HI
|
||
|
||
0EE8 ; ---------------------
|
||
0EE8 ; PUSH [X/A] TO Z-STACK
|
||
0EE8 ; ---------------------
|
||
|
||
0EE8 A494 PUSHXA: LDY ZSP ; READ STACK POINTER
|
||
0EEA 990006 STA ZSTAKH,Y ; PUSH MSB IN [A]
|
||
0EED 8A TXA
|
||
0EEE 990005 STA ZSTAKL,Y ; AND LSB IN [X]
|
||
|
||
0EF1 E694 INC ZSP ; UPDATE Z-STACK POINTER
|
||
0EF3 F001 BEQ OVER ; OVERFLOW IF ZEROED!
|
||
0EF5 60 RTS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 22
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
|
||
0EF6 ; *** ERROR #6 -- Z-STACK OVERFLOW ***
|
||
|
||
0EF6 A906 OVER: LDA #6
|
||
0EF8 4CF91B JMP ZERROR
|
||
|
||
0EFB ; --------------
|
||
0EFB ; RETURN A VALUE
|
||
0EFB ; --------------
|
||
|
||
0EFB ; FROM WITHIN AN OPCODE (VARIABLE ID IN [A])
|
||
|
||
0EFB AA VARPUT: TAX ; IF ZERO,
|
||
0EFC D013 BNE PUTVR1
|
||
|
||
0EFE C694 DEC ZSP ; FLUSH TOP WORD OFF STACK
|
||
0F00 D0E2 BNE PSHVAL ; AND REPLACE WITH [VALUE]
|
||
0F02 F0DB BEQ UNDER ; ERROR IF [ZSP] BECAME ZERO!
|
||
|
||
0F04 ; RETURN A ZERO
|
||
|
||
0F04 A900 RET0: LDA #0
|
||
|
||
0F06 ; RETURN BYTE IN [A]
|
||
|
||
0F06 858C PUTBYT: STA VALUE+LO
|
||
0F08 A900 LDA #0
|
||
0F0A 858D STA VALUE+HI ; CLEAR MSB
|
||
|
||
0F0C ; RETURN [VALUE]
|
||
|
||
0F0C 201918 PUTVAL: JSR NEXTPC ; GET VARIABLE ID BYTE
|
||
0F0F F0D3 BEQ PSHVAL ; [VALUE] GOES TO Z-STACK
|
||
|
||
0F11 ; LOCAL OR GLOBAL VARIABLE?
|
||
|
||
0F11 C910 PUTVR1: CMP #$10 ; IF >= 16,
|
||
0F13 B010 BCS PUTVLG ; IT'S GLOBAL
|
||
|
||
0F15 ; PUT A LOCAL VARIABLE
|
||
|
||
0F15 38 PUTVLL: SEC
|
||
0F16 E901 SBC #1 ; FORM A ZERO-ALIGNED
|
||
0F18 0A ASL A ; WORD INDEX
|
||
0F19 AA TAX ; INTO THE [LOCALS] TABLE
|
||
|
||
0F1A A58C LDA VALUE+LO ; GRAB LSB
|
||
0F1C 9D000A STA LOCALS+LO,X ; SAVE IN LOCAL TABLE
|
||
0F1F A58D LDA VALUE+HI ; DO SAME TO
|
||
0F21 9D010A STA LOCALS+HI,X ; MSB
|
||
0F24 60 RTS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 23
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
|
||
0F25 ; RETURN A GLOBAL VARIABLE
|
||
|
||
0F25 20320F PUTVLG: JSR GVCALC
|
||
0F28 A58D LDA VALUE+HI ; GET MSB
|
||
0F2A 918E STA (I),Y ; STORE AS 1ST BYTE ([Y] = 0)
|
||
0F2C C8 INY ; = 1
|
||
0F2D A58C LDA VALUE+LO ; NOW GET LSB
|
||
0F2F 918E STA (I),Y ; STORE AS 2ND BYTE
|
||
0F31 60 RTS
|
||
|
||
0F32 ; -----------------------
|
||
0F32 ; CALC GLOBAL WORD OFFSET
|
||
0F32 ; -----------------------
|
||
|
||
0F32 ; ENTRY: VAR-ID BYTE (16-255) IN [A]
|
||
0F32 ; EXIT: ABSOLUTE ADDRESS OF GLOBAL VAR IN [I]
|
||
0F32 ; [Y] = 0 FOR INDEXING
|
||
|
||
0F32 38 GVCALC: SEC
|
||
0F33 E910 SBC #$10 ; FORM A ZERO-ALIGNED INDEX
|
||
0F35 A000 LDY #0 ; MAKE SURE MSB OF OFFSET AND [Y]
|
||
0F37 848F STY I+HI ; ARE CLEARED
|
||
|
||
0F39 0A ASL A ; MULTIPLY OFFSET BY 2
|
||
0F3A 268F ROL I+HI ; TO WORD-ALIGN IT
|
||
|
||
0F3C 18 CLC ; ADD OFFSET TO ADDR OF GLOBAL TABLE
|
||
0F3D 65AC ADC GLOBAL+LO ; TO FORM THE ABSOLUTE
|
||
0F3F 858E STA I+LO ; ADDRESS OF THE
|
||
0F41 A58F LDA I+HI ; DESIRED GLOBAL VARIABLE
|
||
0F43 65AD ADC GLOBAL+HI ; STORE ADDRESS BACK IN [VAL]
|
||
0F45 858F STA I+HI ; AS A POINTER
|
||
|
||
0F47 60 WCEX: RTS
|
||
|
||
0F48 ; ---------------
|
||
0F48 ; PREDICATE FAILS
|
||
0F48 ; ---------------
|
||
|
||
0F48 201918 PREDF: JSR NEXTPC ; GET 1ST BRANCH BYTE
|
||
0F4B 100C BPL PREDB ; DO BRANCH IF BIT 7 OFF
|
||
|
||
0F4D ; -----------------------
|
||
0F4D ; IGNORE PREDICATE BRANCH
|
||
0F4D ; -----------------------
|
||
|
||
0F4D ; ENTRY: 1ST BRANCH BYTE IN [A]
|
||
|
||
0F4D 2940 PREDNB: AND #%01000000 ; TEST BIT 6
|
||
0F4F D0F6 BNE WCEX ; SHORT BRANCH IF SET
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 24
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
0F51 4C1918 JMP NEXTPC ; ELSE SKIP OVER 2ND BRANCH BYTE
|
||
|
||
0F54 ; ------------------
|
||
0F54 ; PREDICATE SUCCEEDS
|
||
0F54 ; ------------------
|
||
|
||
0F54 201918 PREDS: JSR NEXTPC ; GET 1ST BRANCH BYTE
|
||
0F57 10F4 BPL PREDNB ; DON'T BRANCH IF BIT 7 CLEAR
|
||
|
||
0F59 ; --------------------------
|
||
0F59 ; PERFORM A PREDICATE BRANCH
|
||
0F59 ; --------------------------
|
||
|
||
0F59 ; ENTRY: 1ST PRED BYTE IN [A]
|
||
|
||
0F59 AA PREDB: TAX ; SAVE HERE
|
||
0F5A 2940 AND #%01000000 ; LONG OR SHORT BRANCH?
|
||
0F5C F00B BEQ PREDLB ; LONG IF BIT 6 IS CLEAR
|
||
|
||
0F5E ; HANDLE A SHORT BRANCH
|
||
|
||
0F5E 8A TXA ; RESTORE PRED BYTE
|
||
0F5F 293F AND #%00111111 ; FORM SHORT OFFSET
|
||
0F61 858C STA VALUE+LO ; USE AS LSB OF BRANCH OFFSET
|
||
0F63 A900 LDA #0
|
||
0F65 858D STA VALUE+HI ; MSB OF OFFSET IS ZERO
|
||
0F67 F013 BEQ PREDB1 ; DO THE BRANCH
|
||
|
||
0F69 ; HANDLE A LONG BRANCH
|
||
|
||
0F69 8A PREDLB: TXA ; RESTORE 1ST PRED BYTE
|
||
0F6A 293F AND #%00111111 ; FORM MSB OF OFFSET
|
||
|
||
0F6C AA TAX ; SAVE HERE FOR REFERENCE
|
||
|
||
0F6D 2920 AND #%00100000 ; CHECK SIGN OF 14-BIT VALUE
|
||
0F6F F004 BEQ DOB2 ; POSITIVE IF ZERO, SO USE [X]
|
||
|
||
0F71 8A TXA ; ELSE RESTORE BYTE
|
||
0F72 09E0 ORA #%11100000 ; EXTEND THE SIGN BIT
|
||
0F74 AA TAX ; BACK HERE FOR STORAGE
|
||
|
||
0F75 868D DOB2: STX VALUE+HI
|
||
0F77 201918 JSR NEXTPC ; FETCH LSB OF 14-BIT OFFSET
|
||
0F7A 858C STA VALUE+LO
|
||
|
||
0F7C ; BRANCH TO Z-ADDRESS IN [VALUE]
|
||
|
||
0F7C A58D PREDB1: LDA VALUE+HI ; CHECK MSB OF OFFSET
|
||
0F7E D00E BNE PREDB3 ; DO BRANCH IF NZ
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 25
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
0F80 A58C LDA VALUE+LO ; IF LSB IS NON-ZERO,
|
||
0F82 D003 BNE PREDB2 ; MAKE SURE IT ISN'T 1
|
||
0F84 4C7510 JMP ZRFALS ; ELSE DO AN "RFALSE"
|
||
|
||
0F87 C901 PREDB2: CMP #1 ; IF OFFSET = 1
|
||
0F89 D003 BNE PREDB3
|
||
0F8B 4C6A10 JMP ZRTRUE ; DO AN "RTRUE"
|
||
|
||
0F8E ; ENTRY POINT FOR "JUMP"
|
||
|
||
0F8E 20C80F PREDB3: JSR DECVAL ; SUBTRACT 2 FROM THE OFFSET
|
||
0F91 20C80F JSR DECVAL ; IN [VALUE]
|
||
|
||
0F94 A900 LDA #0 ; CLEAR THE MSB
|
||
0F96 858F STA I+HI ; OF [I]
|
||
|
||
0F98 A58D LDA VALUE+HI ; MAKE MSB OF OFFSET
|
||
0F9A 858E STA I+LO ; THE LSB OF [I]
|
||
0F9C 0A ASL A ; EXTEND THE SIGN OF OFFSET
|
||
0F9D 268F ROL I+HI ; INTO MSB OF [I]
|
||
|
||
0F9F A58C LDA VALUE+LO ; GET LSB OF OFFSET
|
||
0FA1 18 CLC
|
||
0FA2 6596 ADC ZPCL ; ADD LOW 8 BITS OF ZPC
|
||
0FA4 9006 BCC PREDB5 ; IF OVERFLOWED,
|
||
|
||
0FA6 E68E INC I+LO ; UPDATE UPPER 9 BITS
|
||
0FA8 D002 BNE PREDB5
|
||
0FAA E68F INC I+HI
|
||
|
||
0FAC 8596 PREDB5: STA ZPCL ; UPDATE ZPC
|
||
|
||
0FAE A58E LDA I+LO ; IF UPPER 9 BITS ARE ZERO,
|
||
0FB0 058F ORA I+HI ; NO NEED TO CHANGE PAGES
|
||
0FB2 F013 BEQ ZNOOP
|
||
|
||
0FB4 A58E LDA I+LO ; ELSE CALC NEW UPPER BITS
|
||
0FB6 18 CLC
|
||
0FB7 6597 ADC ZPCM
|
||
0FB9 8597 STA ZPCM
|
||
|
||
0FBB A58F LDA I+HI
|
||
0FBD 6598 ADC ZPCH
|
||
0FBF 2901 AND #%00000001 ; USE ONLY BIT 0
|
||
0FC1 8598 STA ZPCH
|
||
|
||
0FC3 A900 LDA #0
|
||
0FC5 8599 STA ZPCFLG ; [ZPC] NO LONGER VALID
|
||
|
||
0FC7 ; FALL THROUGH ...
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 26
|
||
--- OPCODE SUPPORT SUBROUTINES ---
|
||
|
||
0FC7 ; ----
|
||
0FC7 ; NOOP
|
||
0FC7 ; ----
|
||
|
||
0FC7 60 ZNOOP: RTS
|
||
|
||
0FC8 ; -----------------
|
||
0FC8 ; DECREMENT [VALUE]
|
||
0FC8 ; -----------------
|
||
|
||
0FC8 A58C DECVAL: LDA VALUE+LO
|
||
0FCA 38 SEC
|
||
0FCB E901 SBC #1
|
||
0FCD 858C STA VALUE+LO
|
||
0FCF B002 BCS DVX
|
||
0FD1 C68D DEC VALUE+HI
|
||
0FD3 60 DVX: RTS
|
||
|
||
0FD4 ; -----------------
|
||
0FD4 ; INCREMENT [VALUE]
|
||
0FD4 ; -----------------
|
||
|
||
0FD4 E68C INCVAL: INC VALUE+LO
|
||
0FD6 D002 BNE IVX
|
||
0FD8 E68D INC VALUE+HI
|
||
0FDA 60 IVX: RTS
|
||
|
||
0FDB ; ----------------------
|
||
0FDB ; MOVE [ARG1] TO [VALUE]
|
||
0FDB ; ----------------------
|
||
|
||
0FDB A582 A12VAL: LDA ARG1+LO
|
||
0FDD 858C STA VALUE+LO
|
||
0FDF A583 LDA ARG1+HI
|
||
0FE1 858D STA VALUE+HI
|
||
0FE3 60 RTS
|
||
|
||
END
|
||
INCLUD DISPATCH.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 27
|
||
--- OPCODE DISPATCH TABLES ---
|
||
|
||
|
||
0FE4 ; 0-OPS
|
||
|
||
0FE4 6A10 OPT0: DW ZRTRUE ; 0
|
||
0FE6 7510 DW ZRFALS ; 1
|
||
0FE8 7910 DW ZPRI ; 2
|
||
0FEA 9610 DW ZPRR ; 3
|
||
0FEC C70F DW ZNOOP ; 4
|
||
0FEE DF23 DW ZSAVE ; 5
|
||
0FF0 7F24 DW ZREST ; 6
|
||
0FF2 3E1C DW ZSTART ; 7
|
||
0FF4 9F10 DW ZRSTAK ; 8
|
||
0FF6 CE0E DW POPVAL ; 9
|
||
0FF8 1F1C DW ZQUIT ; 10
|
||
0FFA C71C DW ZCRLF ; 11
|
||
0FFC 201D DW ZUSL ; 12
|
||
0FFE A510 DW ZVER ; 13
|
||
|
||
000E NOPS0 EQU 14 ; NUMBER OF 0-OPS
|
||
|
||
1000 ; 1-OPS
|
||
|
||
1000 2711 OPT1: DW ZZERO ; 0
|
||
1002 3011 DW ZNEXT ; 1
|
||
1004 3911 DW ZFIRST ; 2
|
||
1006 4C11 DW ZLOC ; 3
|
||
1008 5811 DW ZPTSIZ ; 4
|
||
100A 7511 DW ZINC ; 5
|
||
100C 8011 DW ZDEC ; 6
|
||
100E 8D11 DW ZPRB ; 7
|
||
1010 430E DW BADOP1 ; 8 (UNDEFINED)
|
||
1012 9B11 DW ZREMOV ; 9
|
||
1014 DD11 DW ZPRD ; 10
|
||
1016 FA11 DW ZRET ; 11
|
||
1018 3712 DW ZJUMP ; 12
|
||
101A 3D12 DW ZPRINT ; 13
|
||
101C 4B12 DW ZVALUE ; 14
|
||
101E 5312 DW ZBCOM ; 15
|
||
|
||
0010 NOPS1 EQU 16 ; NUMBER OF 1-OPS
|
||
|
||
1020 ; 2-OPS
|
||
|
||
1020 800E OPT2: DW BADOP2 ; 0 (UNDEFINED)
|
||
1022 0115 DW ZEQUAL ; 1
|
||
1024 6312 DW ZLESS ; 2
|
||
1026 7712 DW ZGRTR ; 3
|
||
1028 6912 DW ZDLESS ; 4
|
||
102A 8212 DW ZIGRTR ; 5
|
||
102C B212 DW ZIN ; 6
|
||
102E C212 DW ZBTST ; 7
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 28
|
||
--- OPCODE DISPATCH TABLES ---
|
||
|
||
1030 D512 DW ZBOR ; 8
|
||
1032 E112 DW ZBAND ; 9
|
||
1034 ED12 DW ZFSETP ; 10
|
||
1036 0113 DW ZFSET ; 11
|
||
1038 1413 DW ZFCLR ; 12
|
||
103A 2B13 DW ZSET ; 13
|
||
103C 3813 DW ZMOVE ; 14
|
||
103E 6213 DW ZGET ; 15
|
||
1040 7213 DW ZGETB ; 16
|
||
1042 8F13 DW ZGETP ; 17
|
||
1044 D713 DW ZGETPT ; 18
|
||
1046 0414 DW ZNEXTP ; 19
|
||
1048 2314 DW ZADD ; 20
|
||
104A 3014 DW ZSUB ; 21
|
||
104C 3D14 DW ZMUL ; 22
|
||
104E 6114 DW ZDIV ; 23
|
||
1050 6B14 DW ZMOD ; 24
|
||
|
||
0019 NOPS2 EQU 25 ; NUMBER OF 2-OPS
|
||
|
||
1052 ; X-OPS
|
||
|
||
1052 3415 OPTX: DW ZCALL ; 0
|
||
1054 C715 DW ZPUT ; 1
|
||
1056 D515 DW ZPUTB ; 2
|
||
1058 F015 DW ZPUTP ; 3
|
||
105A 9C16 DW ZREAD ; 4
|
||
105C 2116 DW ZPRC ; 5
|
||
105E 2616 DW ZPRN ; 6
|
||
1060 6B16 DW ZRAND ; 7
|
||
1062 8D16 DW ZPUSH ; 8
|
||
1064 9416 DW ZPOP ; 9
|
||
1066 4920 DW ZSPLIT ; 10
|
||
1068 8E20 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 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 29
|
||
--- 0-OPS ---
|
||
|
||
|
||
106A ; -----
|
||
106A ; RTRUE
|
||
106A ; -----
|
||
|
||
106A ; SIMULATE A "RETURN 1"
|
||
|
||
106A A201 ZRTRUE: LDX #1
|
||
|
||
106C A900 ZRT0: LDA #0
|
||
|
||
106E 8682 ZRT1: STX ARG1+LO ; GIVE TO
|
||
1070 8583 STA ARG1+HI ; [ARG1]
|
||
1072 4CFA11 JMP ZRET ; AND DO THE RETURN
|
||
|
||
1075 ; ------
|
||
1075 ; RFALSE
|
||
1075 ; ------
|
||
|
||
1075 ; SIMULATE A "RETURN 0"
|
||
|
||
1075 A200 ZRFALS: LDX #0
|
||
1077 F0F3 BEQ ZRT0
|
||
|
||
1079 ; ------
|
||
1079 ; PRINTI
|
||
1079 ; ------
|
||
|
||
1079 ; PRINT Z-STRING FOLLOWING THE OPCODE
|
||
|
||
1079 A598 ZPRI: LDA ZPCH ; MOVE [ZPC] INTO [MPC]
|
||
107B 859E STA MPCH
|
||
107D A597 LDA ZPCM
|
||
107F 859D STA MPCM
|
||
1081 A596 LDA ZPCL
|
||
1083 859C STA MPCL
|
||
|
||
1085 A900 LDA #0
|
||
1087 859F STA MPCFLG ; [MPC] NO LONGER VALID
|
||
|
||
1089 204219 JSR PZSTR ; PRINT THE Z-STRING AT [MPC]
|
||
|
||
108C A205 LDX #5 ; COPY STATE OF [MPC]
|
||
108E B59C PRIL: LDA MPC,X ; INTO [ZPC]
|
||
1090 9596 STA ZPC,X
|
||
1092 CA DEX
|
||
1093 10F9 BPL PRIL
|
||
1095 60 RTS
|
||
|
||
1096 ; ------
|
||
1096 ; PRINTR
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 30
|
||
--- 0-OPS ---
|
||
|
||
1096 ; ------
|
||
|
||
1096 ; DO A "PRINTI," FOLLOWED BY "CRLF" AND "RTRUE"
|
||
|
||
1096 207910 ZPRR: JSR ZPRI
|
||
1099 20C71C JSR ZCRLF
|
||
109C 4C6A10 JMP ZRTRUE
|
||
|
||
109F ; ------
|
||
109F ; RSTACK
|
||
109F ; ------
|
||
|
||
109F ; "RETURN" WITH VALUE ON STACK
|
||
|
||
109F 20CE0E ZRSTAK: JSR POPVAL ; GET VALUE INTO [X/A]
|
||
10A2 4C6E10 JMP ZRT1 ; AND GIVE IT TO "RETURN"
|
||
|
||
10A5 ; ------
|
||
10A5 ; VERIFY
|
||
10A5 ; ------
|
||
|
||
10A5 ; VERIFY GAME CODE ON DISK
|
||
|
||
10A5 205B1C ZVER: JSR VERNUM ; DISPLAY VERSION NUMBER, GET SIDE 1
|
||
|
||
10A8 A203 LDX #3
|
||
10AA A900 LDA #0
|
||
10AC 9590 ZVR: STA J+LO,X ; CLEAR [J], [K]
|
||
10AE 959C STA MPC,X ; [MPC] AND [MPCFLG]
|
||
10B0 CA DEX
|
||
10B1 10F9 BPL ZVR
|
||
|
||
10B3 A940 LDA #64 ; POINT [MPC] TO Z-ADDRESS $00040
|
||
10B5 859C STA MPCL ; 1ST 64 BYTES AREN'T CHECKED
|
||
|
||
10B7 A993 LDA #K+HI ; PATCH THE "GETBYT" ROUTINE
|
||
10B9 8D5A18 STA PATCH ; TO USE [K+HI]=0 INSTEAD OF [ZPURE]
|
||
|
||
10BC AD0426 LDA ZBEGIN+ZENDLD ; GET LAST BYTE OF ENDLOAD
|
||
10BF 858F STA I+HI ; FIRST MSB
|
||
10C1 AD0526 LDA ZBEGIN+ZENDLD+1
|
||
10C4 858E STA I+LO ; THEN LSB
|
||
|
||
10C6 ; CHECKSUM THE PRELOAD (SIDE 1)
|
||
|
||
10C6 204F18 VSUM: JSR GETBYT ; GET A Z-BYTE INTO [A]
|
||
10C9 18 CLC
|
||
10CA 6590 ADC J+LO ; ADD IT TO SUM
|
||
10CC 8590 STA J+LO ; IN [J]
|
||
10CE 9002 BCC VSUM0
|
||
10D0 E691 INC J+HI
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 31
|
||
--- 0-OPS ---
|
||
|
||
|
||
10D2 A59C VSUM0: LDA MPCL ; END OF Z-CODE YET?
|
||
10D4 C58E CMP I+LO ; CHECK LSB
|
||
10D6 D0EE BNE VSUM
|
||
|
||
10D8 A59D LDA MPCM ; AND MIDDLE BYTE
|
||
10DA C58F CMP I+HI ; (HIGH BIT NEEDN'T BE CHECKED)
|
||
10DC D0E8 BNE VSUM
|
||
|
||
10DE ; CHECKSUM "PURE" CODE (SIDE 2)
|
||
|
||
10DE 207F23 JSR SIDE2 ; PROMPT FOR SIDE 2
|
||
|
||
10E1 AD1A26 LDA ZBEGIN+ZLENTH ; GET MSB
|
||
10E4 858F STA I+HI ; AND
|
||
10E6 AD1B26 LDA ZBEGIN+ZLENTH+1 ; LSB OF Z-CODE LENGTH IN BYTES
|
||
10E9 0A ASL A ; MULTIPLY BY
|
||
10EA 858E STA I+LO ; TWO
|
||
10EC 268F ROL I+HI ; TO GET # BYTES
|
||
10EE 2692 ROL K+LO ; IN GAME
|
||
|
||
10F0 204F18 VSUM2: JSR GETBYT ; GET A Z-BYTE INTO [A]
|
||
10F3 18 CLC
|
||
10F4 6590 ADC J+LO ; ADD IT TO SUM
|
||
10F6 8590 STA J+LO ; IN [J]
|
||
10F8 9002 BCC VSUM3
|
||
10FA E691 INC J+HI
|
||
|
||
10FC A59C VSUM3: LDA MPCL ; END OF Z-CODE YET?
|
||
10FE C58E CMP I+LO ; CHECK LSB
|
||
1100 D0EE BNE VSUM2
|
||
|
||
1102 A59D LDA MPCM ; MIDDLE BYTE
|
||
1104 C58F CMP I+HI
|
||
1106 D0E8 BNE VSUM2
|
||
|
||
1108 A59E LDA MPCH ; AND HIGH BIT
|
||
110A C592 CMP K+LO
|
||
110C D0E2 BNE VSUM2
|
||
|
||
110E A9A4 LDA #ZPURE ; UNPATCH "GETBYT"
|
||
1110 8D5A18 STA PATCH
|
||
|
||
1113 AD1D26 LDA ZBEGIN+ZCHKSM+1 ; GET LSB OF CHECKSUM
|
||
1116 C590 CMP J+LO ; DOES IT MATCH?
|
||
1118 D00A BNE BADVER ; NO, PREDICATE FAILS
|
||
|
||
111A AD1C26 LDA ZBEGIN+ZCHKSM ; ELSE CHECK MSB
|
||
111D C591 CMP J+HI ; LOOK GOOD?
|
||
111F D003 BNE BADVER ; IF MATCHED,
|
||
1121 4C540F JMP PREDS ; GAME IS OKAY
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 32
|
||
--- 0-OPS ---
|
||
|
||
|
||
1124 4C480F BADVER: JMP PREDF
|
||
|
||
END
|
||
INCLUD OPS1.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 33
|
||
--- 1-OPS ---
|
||
|
||
|
||
1127 ; -----
|
||
1127 ; ZERO?
|
||
1127 ; -----
|
||
|
||
1127 ; [ARG1] = 0?
|
||
|
||
1127 A582 ZZERO: LDA ARG1+LO
|
||
1129 0583 ORA ARG1+HI
|
||
112B F01C BEQ PFINE
|
||
|
||
112D 4C480F PYUCK: JMP PREDF
|
||
|
||
1130 ; -----
|
||
1130 ; NEXT?
|
||
1130 ; -----
|
||
|
||
1130 ; RETURN "NEXT" POINTER IN OBJECT [ARG1];
|
||
1130 ; FAIL IF LAST AND RETURN ZERO
|
||
|
||
1130 A582 ZNEXT: LDA ARG1+LO
|
||
1132 204D1B JSR OBJLOC ; GET OBJECT ADDR INTO [I]
|
||
1135 A005 LDY #5 ; POINT TO "NEXT" SLOT
|
||
1137 D007 BNE FIRST1
|
||
|
||
1139 ; ------
|
||
1139 ; FIRST?
|
||
1139 ; ------
|
||
|
||
1139 ; RETURN "FIRST" POINTER IN OBJECT [ARG1];
|
||
1139 ; FAIL IF LAST AND RETURN ZERO
|
||
|
||
1139 A582 ZFIRST: LDA ARG1+LO
|
||
113B 204D1B JSR OBJLOC ; GET OBJECT ADDR INTO [I]
|
||
113E A006 LDY #6 ; POINT TO "FIRST" SLOT
|
||
|
||
1140 B18E FIRST1: LDA (I),Y ; GET CONTENTS OF SLOT
|
||
1142 20060F JSR PUTBYT ; PASS IT TO VARIABLE
|
||
|
||
1145 A58C LDA VALUE+LO ; EXAMINE THE VALUE JUST "PUT"
|
||
1147 F0E4 BEQ PYUCK ; FAIL IF IT WAS ZERO
|
||
|
||
1149 4C540F PFINE: JMP PREDS ; ELSE REJOICE
|
||
|
||
114C ; ---
|
||
114C ; LOC
|
||
114C ; ---
|
||
|
||
114C ; RETURN THE OBJECT CONTAINING OBJECT [ARG1];
|
||
114C ; RETURN ZERO IF NONE
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 34
|
||
--- 1-OPS ---
|
||
|
||
114C A582 ZLOC: LDA ARG1+LO
|
||
114E 204D1B JSR OBJLOC ; GET ADDR OF OBJECT INTO [I]
|
||
1151 A004 LDY #4 ; POINT TO "LOC" SLOT
|
||
1153 B18E LDA (I),Y ; GET THE BYTE
|
||
1155 4C060F JMP PUTBYT ; AND SHIP IT OUT
|
||
|
||
1158 ; ------
|
||
1158 ; PTSIZE
|
||
1158 ; ------
|
||
|
||
1158 ; RETURN LENGTH OF PROP TABLE [ARG1] IN BYTES
|
||
|
||
1158 A583 ZPTSIZ: LDA ARG1+HI ; MOVE ABS ADDR OF
|
||
115A 18 CLC ; THE PROP TABLE
|
||
115B 65A3 ADC ZCODE ; INTO [I]
|
||
115D 858F STA I+HI
|
||
|
||
115F A582 LDA ARG1+LO ; DECREMENT THE
|
||
1161 38 SEC ; ADDRESS
|
||
1162 E901 SBC #1 ; WHILE MOVING LSB
|
||
1164 858E STA I+LO
|
||
1166 B002 BCS PTZ0
|
||
1168 C68F DEC I+HI
|
||
|
||
116A A000 PTZ0: LDY #0 ; GET THE LENGTH
|
||
116C 20971B JSR PROPL ; OF PROPERTY AT [I] INTO [A]
|
||
|
||
116F 18 CLC
|
||
1170 6901 ADC #1 ; INCREMENT RESULT
|
||
1172 4C060F JMP PUTBYT ; AND RETURN IT
|
||
|
||
1175 ; ---
|
||
1175 ; INC
|
||
1175 ; ---
|
||
|
||
1175 ; INCREMENT VARIABLE [ARG1]
|
||
|
||
1175 A582 ZINC: LDA ARG1+LO
|
||
1177 209F0E JSR VARGET ; FETCH VARIABLE INTO [VALUE]
|
||
117A 20D40F JSR INCVAL ; INCREMENT IT
|
||
117D 4C8811 JMP ZD0
|
||
|
||
1180 ; ---
|
||
1180 ; DEC
|
||
1180 ; ---
|
||
|
||
1180 ; DECREMENT VARIABLE [ARG1]
|
||
|
||
1180 A582 ZDEC: LDA ARG1+LO
|
||
1182 209F0E JSR VARGET ; FETCH VAR INTO [VALUE]
|
||
1185 20C80F JSR DECVAL ; DECREMENT IT
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 35
|
||
--- 1-OPS ---
|
||
|
||
|
||
1188 A582 ZD0: LDA ARG1+LO ; PUT RESULT BACK
|
||
118A 4CFB0E JMP VARPUT ; INTO THE SAME VARIABLE
|
||
|
||
118D ; ------
|
||
118D ; PRINTB
|
||
118D ; ------
|
||
|
||
118D ; PRINT Z-STRING AT [ARG1]
|
||
|
||
118D A582 ZPRB: LDA ARG1+LO
|
||
118F 858E STA I+LO
|
||
1191 A583 LDA ARG1+HI
|
||
1193 858F STA I+HI
|
||
|
||
1195 201619 JSR SETWRD ; MOVE Z-ADDR TO [MPC]
|
||
1198 4C4219 JMP PZSTR ; AND PRINT
|
||
|
||
119B ; ------
|
||
119B ; REMOVE
|
||
119B ; ------
|
||
|
||
119B ; MOVE OBJECT [ARG1] INTO PSEUDO-OBJECT #0
|
||
|
||
119B A582 ZREMOV: LDA ARG1+LO ; GET SOURCE OBJECT ADDR
|
||
119D 204D1B JSR OBJLOC ; INTO [I]
|
||
|
||
11A0 A58E LDA I+LO ; COPY THE SOURCE ADDR
|
||
11A2 8590 STA J+LO ; INTO [J]
|
||
11A4 A58F LDA I+HI ; FOR LATER REFERENCE
|
||
11A6 8591 STA J+HI
|
||
|
||
11A8 A004 LDY #4 ; POINT TO "LOC" SLOT
|
||
11AA B18E LDA (I),Y ; GET THE DATA
|
||
11AC F02E BEQ REMVEX ; SCRAM IF NO OBJECT
|
||
|
||
11AE 204D1B JSR OBJLOC ; ELSE GET ADDR OF OBJECT [A] INTO [I]
|
||
11B1 A006 LDY #6 ; POINT TO "FIRST" SLOT
|
||
11B3 B18E LDA (I),Y ; GRAB DATA
|
||
11B5 C582 CMP ARG1+LO ; IS THIS THE FIRST?
|
||
11B7 D009 BNE REMVC1 ; NO, KEEP SEARCHING
|
||
|
||
11B9 A005 LDY #5 ; ELSE COPY SOURCE'S "NEXT" SLOT
|
||
11BB B190 LDA (J),Y
|
||
11BD C8 INY ; INTO DEST'S "FIRST" SLOT ([Y] = 6)
|
||
11BE 918E STA (I),Y
|
||
11C0 D011 BNE REMVC2 ; BRANCH ALWAYS
|
||
|
||
11C2 204D1B REMVC1: JSR OBJLOC
|
||
11C5 A005 LDY #5 ; GET "NEXT"
|
||
11C7 B18E LDA (I),Y
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 36
|
||
--- 1-OPS ---
|
||
|
||
11C9 C582 CMP ARG1+LO ; FOUND IT?
|
||
11CB D0F5 BNE REMVC1 ; NO, KEEP TRYING
|
||
|
||
11CD A005 LDY #5 ; WHEN FOUND
|
||
11CF B190 LDA (J),Y ; MOVE "NEXT" SLOT OF SOURCE
|
||
11D1 918E STA (I),Y ; TO "NEXT" SLOT OF DEST
|
||
|
||
11D3 A900 REMVC2: LDA #0
|
||
11D5 A004 LDY #4 ; CLEAR "LOC"
|
||
11D7 9190 STA (J),Y
|
||
11D9 C8 INY ; AND "NEXT" SLOTS ([Y] = 5)
|
||
11DA 9190 STA (J),Y ; OF SOURCE OBJECT
|
||
|
||
11DC 60 REMVEX: RTS
|
||
|
||
11DD ; ------
|
||
11DD ; PRINTD
|
||
11DD ; ------
|
||
|
||
11DD ; PRINT SHORT DESCRIPTION OF OBJECT [ARG1]
|
||
|
||
11DD A582 ZPRD: LDA ARG1+LO
|
||
|
||
11DF ; ENTRY POINT FOR "USL"
|
||
|
||
11DF 204D1B PRNTDC: JSR OBJLOC ; GET ADDR OF OBJECT INTO [I]
|
||
11E2 A007 LDY #7 ; GET PROP TABLE POINTER
|
||
11E4 B18E LDA (I),Y ; FETCH MSB
|
||
11E6 AA TAX ; SAVE IT HERE
|
||
11E7 C8 INY
|
||
11E8 B18E LDA (I),Y ; FETCH LSB
|
||
11EA 858E STA I+LO ; STORE LSB
|
||
11EC 868F STX I+HI ; AND MSB
|
||
|
||
11EE E68E INC I+LO ; POINT PAST THE
|
||
11F0 D002 BNE PDC0 ; LENGTH BYTE
|
||
11F2 E68F INC I+HI
|
||
|
||
11F4 201619 PDC0: JSR SETWRD ; CALC Z-STRING ADDR
|
||
11F7 4C4219 JMP PZSTR ; AND PRINT IT
|
||
|
||
11FA ; ------
|
||
11FA ; RETURN
|
||
11FA ; ------
|
||
|
||
11FA ; RETURN FROM "CALL" WITH VALUE [ARG1]
|
||
|
||
11FA A595 ZRET: LDA OLDZSP ; RE-SYNC THE
|
||
11FC 8594 STA ZSP ; Z-STACK POINTER
|
||
|
||
11FE 20CE0E JSR POPVAL ; POP # LOCALS INTO [X/A]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 37
|
||
--- 1-OPS ---
|
||
|
||
1201 868F STX I+HI ; SAVE HERE
|
||
1203 8A TXA ; SET FLAGS; ANY LOCALS?
|
||
1204 F019 BEQ RET2 ; SKIP IF NOT
|
||
|
||
1206 ; RESTORE PUSHED LOCALS
|
||
|
||
1206 CA DEX ; ZERO-ALIGN
|
||
1207 8A TXA ; AND
|
||
1208 0A ASL A ; WORD-ALIGN # LOCALS
|
||
1209 858E STA I+LO ; FOR USE AS A STORAGE INDEX
|
||
|
||
120B 20CE0E RET1: JSR POPVAL ; POP A LOCAL INTO [X/A]
|
||
|
||
120E A48E LDY I+LO ; RETRIEVE STORAGE INDEX
|
||
1210 99010A STA LOCALS+HI,Y ; STORE MSB OF LOCAL
|
||
1213 8A TXA ; MOVE LSB
|
||
1214 99000A STA LOCALS+LO,Y ; AND STORE THAT TOO
|
||
|
||
1217 C68E DEC I+LO
|
||
1219 C68E DEC I+LO ; UPDATE STORAGE INDEX
|
||
|
||
121B C68F DEC I+HI ; AND LOCALS COUNT
|
||
121D D0EC BNE RET1 ; POP TILL NO MORE LOCALS
|
||
|
||
121F ; RESTORE OTHER VARIABLES
|
||
|
||
121F 20CE0E RET2: JSR POPVAL ; POP [ZPCH] AND [ZPCM]
|
||
1222 8697 STX ZPCM
|
||
1224 8598 STA ZPCH
|
||
|
||
1226 20CE0E JSR POPVAL ; POP AND RESTORE
|
||
1229 8695 STX OLDZSP
|
||
122B 8596 STA ZPCL
|
||
|
||
122D A900 LDA #0
|
||
122F 8599 STA ZPCFLG ; ZPC CHANGED!
|
||
|
||
1231 20DB0F JSR A12VAL ; MOVE [ARG1] TO [VALUE]
|
||
1234 4C0C0F JMP PUTVAL ; AND RETURN IT
|
||
|
||
1237 ; ----
|
||
1237 ; JUMP
|
||
1237 ; ----
|
||
|
||
1237 ; JUMP TO Z-LOCATION IN [ARG1]
|
||
|
||
1237 20DB0F ZJUMP: JSR A12VAL ; MOVE [ARG1] TO [VALUE]
|
||
123A 4C8E0F JMP PREDB3 ; A BRANCH THAT ALWAYS SUCCEEDS
|
||
|
||
123D ; -----
|
||
123D ; PRINT
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 38
|
||
--- 1-OPS ---
|
||
|
||
123D ; -----
|
||
|
||
123D ; PRINT Z-STRING AT WORD POINTER [ARG1]
|
||
|
||
123D A582 ZPRINT: LDA ARG1+LO
|
||
123F 858E STA I+LO
|
||
1241 A583 LDA ARG1+HI
|
||
1243 858F STA I+HI
|
||
|
||
1245 203019 JSR SETSTR ; CALC STRING ADDRESS
|
||
1248 4C4219 JMP PZSTR ; AND PRINT IT
|
||
|
||
124B ; -----
|
||
124B ; VALUE
|
||
124B ; -----
|
||
|
||
124B ; RETURN VALUE OF VARIABLE [ARG1]
|
||
|
||
124B A582 ZVALUE: LDA ARG1+LO
|
||
124D 209F0E JSR VARGET ; GET THE VALUE
|
||
1250 4C0C0F JMP PUTVAL ; EASY ENOUGH
|
||
|
||
1253 ; ----
|
||
1253 ; BCOM
|
||
1253 ; ----
|
||
|
||
1253 ; COMPLEMENT [ARG1]
|
||
|
||
1253 A582 ZBCOM: LDA ARG1+LO
|
||
1255 49FF EOR #$FF
|
||
1257 AA TAX
|
||
1258 A583 LDA ARG1+HI
|
||
125A 49FF EOR #$FF
|
||
|
||
125C ; FALL THROUGH ...
|
||
|
||
125C ; ---------------------
|
||
125C ; RETURN VALUE IN [X/A]
|
||
125C ; ---------------------
|
||
|
||
125C 868C VEXIT: STX VALUE+LO
|
||
125E 858D STA VALUE+HI
|
||
1260 4C0C0F JMP PUTVAL
|
||
|
||
END
|
||
INCLUD OPS2.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 39
|
||
--- 2-OPS ---
|
||
|
||
|
||
1263 ; -----
|
||
1263 ; LESS?
|
||
1263 ; -----
|
||
|
||
1263 ; [ARG1] < [ARG2]?
|
||
|
||
1263 20DB0F ZLESS: JSR A12VAL ; MOVE [ARG1] TO [VALUE]
|
||
1266 4C6C12 JMP DLS0 ; MOVE [ARG2] TO [I] & COMPARE
|
||
|
||
1269 ; ------
|
||
1269 ; DLESS?
|
||
1269 ; ------
|
||
|
||
1269 ; DECREMENT [ARG1]; SUCCEED IF < [ARG2]
|
||
|
||
1269 208011 ZDLESS: JSR ZDEC ; MOVES ([ARG1]-1) TO [VALUE]
|
||
|
||
126C A584 DLS0: LDA ARG2+LO ; MOVE [ARG2] TO [I]
|
||
126E 858E STA I+LO
|
||
1270 A585 LDA ARG2+HI
|
||
1272 858F STA I+HI
|
||
|
||
1274 4C9512 JMP COMPAR ; COMPARE & RETURN
|
||
|
||
1277 ; -----
|
||
1277 ; GRTR?
|
||
1277 ; -----
|
||
|
||
1277 ; [ARG1] > [ARG2]?
|
||
|
||
1277 A582 ZGRTR: LDA ARG1+LO ; MOVE [ARG1] TO [I]
|
||
1279 858E STA I+LO
|
||
127B A583 LDA ARG1+HI
|
||
127D 858F STA I+HI
|
||
|
||
127F 4C8D12 JMP A2VAL ; MOVE [ARG2] TO [VALUE] & COMPARE
|
||
|
||
1282 ; ------
|
||
1282 ; IGRTR?
|
||
1282 ; ------
|
||
|
||
1282 ; INCREMENT [ARG1]; SUCCEED IF GREATER THAN [ARG2]
|
||
|
||
1282 207511 ZIGRTR: JSR ZINC ; GET ([ARG1]+1) INTO [VALUE]
|
||
|
||
1285 A58C LDA VALUE+LO ; MOVE [VALUE] TO [I]
|
||
1287 858E STA I+LO
|
||
1289 A58D LDA VALUE+HI
|
||
128B 858F STA I+HI
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 40
|
||
--- 2-OPS ---
|
||
|
||
128D A584 A2VAL: LDA ARG2+LO ; MOVE [ARG2] TO [VALUE]
|
||
128F 858C STA VALUE+LO
|
||
1291 A585 LDA ARG2+HI
|
||
1293 858D STA VALUE+HI
|
||
|
||
1295 209C12 COMPAR: JSR SCOMP ; COMPARE [VALUE] AND [I]
|
||
1298 9038 BCC PGOOD
|
||
129A B023 BCS PBAD
|
||
|
||
129C ; -----------------
|
||
129C ; SIGNED COMPARISON
|
||
129C ; -----------------
|
||
|
||
129C ; ENTRY: VALUES IN [VALUE] AND [I]
|
||
|
||
129C A58F SCOMP: LDA I+HI
|
||
129E 458D EOR VALUE+HI
|
||
12A0 1005 BPL SCMP
|
||
12A2 A58F LDA I+HI
|
||
12A4 C58D CMP VALUE+HI
|
||
12A6 60 RTS
|
||
|
||
12A7 A58D SCMP: LDA VALUE+HI
|
||
12A9 C58F CMP I+HI
|
||
12AB D004 BNE SCEX
|
||
12AD A58C LDA VALUE+LO
|
||
12AF C58E CMP I+LO
|
||
12B1 60 SCEX: RTS
|
||
|
||
12B2 ; ---
|
||
12B2 ; IN?
|
||
12B2 ; ---
|
||
|
||
12B2 ; IS OBJECT [ARG1] CONTAINED IN OBJECT [ARG2]?
|
||
|
||
12B2 A582 ZIN: LDA ARG1+LO
|
||
12B4 204D1B JSR OBJLOC ; GET ADDR OF TARGET OBJECT INTO [I]
|
||
|
||
12B7 A004 LDY #4 ; POINT TO "LOC" SLOT
|
||
12B9 B18E LDA (I),Y ; GET DATA
|
||
12BB C584 CMP ARG2+LO ; IS IT THERE?
|
||
12BD F013 BEQ PGOOD ; YES, SUCCEED
|
||
|
||
12BF 4C480F PBAD: JMP PREDF ; TOO BAD, CHUM ...
|
||
|
||
12C2 ; ----
|
||
12C2 ; BTST
|
||
12C2 ; ----
|
||
|
||
12C2 ; IS EVERY "ON" BIT IN [ARG1]
|
||
12C2 ; ALSO "ON" IN [ARG2]?
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 41
|
||
--- 2-OPS ---
|
||
|
||
|
||
12C2 A584 ZBTST: LDA ARG2+LO ; FIRST CHECK LSBS
|
||
12C4 2582 AND ARG1+LO
|
||
12C6 C584 CMP ARG2+LO ; LSBS MATCH?
|
||
12C8 D0F5 BNE PBAD ; NO, EXIT NOW
|
||
|
||
12CA A585 LDA ARG2+HI ; ELSE CHECK MSBS
|
||
12CC 2583 AND ARG1+HI
|
||
12CE C585 CMP ARG2+HI ; MATCHED?
|
||
12D0 D0ED BNE PBAD ; SORRY ...
|
||
|
||
12D2 4C540F PGOOD: JMP PREDS
|
||
|
||
12D5 ; ---
|
||
12D5 ; BOR
|
||
12D5 ; ---
|
||
|
||
12D5 ; RETURN [ARG1] "OR" [ARG2]
|
||
|
||
12D5 A582 ZBOR: LDA ARG1+LO
|
||
12D7 0584 ORA ARG2+LO
|
||
12D9 AA TAX
|
||
12DA A583 LDA ARG1+HI
|
||
12DC 0585 ORA ARG2+HI
|
||
12DE 4C5C12 JMP VEXIT
|
||
|
||
12E1 ; ----
|
||
12E1 ; BAND
|
||
12E1 ; ----
|
||
|
||
12E1 ; RETURN [ARG1] "AND" [ARG2]
|
||
|
||
12E1 A582 ZBAND: LDA ARG1+LO
|
||
12E3 2584 AND ARG2+LO
|
||
12E5 AA TAX
|
||
12E6 A583 LDA ARG1+HI
|
||
12E8 2585 AND ARG2+HI
|
||
12EA 4C5C12 JMP VEXIT
|
||
|
||
12ED ; -----
|
||
12ED ; FSET?
|
||
12ED ; -----
|
||
|
||
12ED ; IS FLAG [ARG1] SET IN OBJECT [ARG2]?
|
||
|
||
12ED 20A91B ZFSETP: JSR FLAGSU ; GET BITS INTO [K] AND [J]
|
||
12F0 A593 LDA K+HI ; DO MSBS
|
||
12F2 2591 AND J+HI
|
||
12F4 8593 STA K+HI
|
||
|
||
12F6 A592 LDA K+LO ; DO LSBS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 42
|
||
--- 2-OPS ---
|
||
|
||
12F8 2590 AND J+LO
|
||
|
||
12FA 0593 ORA K+HI ; ANY BITS ON?
|
||
12FC D0D4 BNE PGOOD ; TARGET BIT MUST BE ON
|
||
12FE 4C480F JMP PREDF
|
||
|
||
1301 ; ----
|
||
1301 ; FSET
|
||
1301 ; ----
|
||
|
||
1301 ; SET FLAG [ARG2] IN OBJECT [ARG1]
|
||
|
||
1301 20A91B ZFSET: JSR FLAGSU ; GET BITS INTO [K] & [J], ADDR IN [I]
|
||
|
||
1304 A000 LDY #0
|
||
1306 A593 LDA K+HI ; FIRST DO MSBS
|
||
1308 0591 ORA J+HI
|
||
130A 918E STA (I),Y
|
||
|
||
130C C8 INY
|
||
130D A592 LDA K+LO ; THEN LSBS
|
||
130F 0590 ORA J+LO
|
||
1311 918E STA (I),Y
|
||
1313 60 RTS
|
||
|
||
1314 ; ------
|
||
1314 ; FCLEAR
|
||
1314 ; ------
|
||
|
||
1314 ; CLEAR FLAG [ARG2] IN OBJECT [ARG1]
|
||
|
||
1314 20A91B ZFCLR: JSR FLAGSU ; GETS BITS INTO [J] & [K], ADDR IN [I]
|
||
|
||
1317 A000 LDY #0
|
||
1319 A591 LDA J+HI ; FETCH MSB
|
||
131B 49FF EOR #$FF ; COMPLEMENT IT
|
||
131D 2593 AND K+HI ; RUB OUT FLAG
|
||
131F 918E STA (I),Y
|
||
|
||
1321 C8 INY
|
||
1322 A590 LDA J+LO ; SAME FOR LSB
|
||
1324 49FF EOR #$FF
|
||
1326 2592 AND K+LO
|
||
1328 918E STA (I),Y
|
||
132A 60 RTS
|
||
|
||
132B ; ---
|
||
132B ; SET
|
||
132B ; ---
|
||
|
||
132B ; SET VARIABLE [ARG1] EQUAL TO [ARG2]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 43
|
||
--- 2-OPS ---
|
||
|
||
|
||
132B A584 ZSET: LDA ARG2+LO ; MOVE THE VALUE
|
||
132D 858C STA VALUE+LO ; INTO [VALUE]
|
||
132F A585 LDA ARG2+HI
|
||
1331 858D STA VALUE+HI
|
||
|
||
1333 A582 LDA ARG1+LO ; GET VARIABLE ID
|
||
1335 4CFB0E JMP VARPUT ; AND CHANGE THE VARIABLE
|
||
|
||
1338 ; ----
|
||
1338 ; MOVE
|
||
1338 ; ----
|
||
|
||
1338 ; MOVE OBJECT [ARG1] INTO OBJECT [ARG2]
|
||
|
||
1338 209B11 ZMOVE: JSR ZREMOV ; REMOVE FIRST
|
||
|
||
133B A582 LDA ARG1+LO
|
||
133D 204D1B JSR OBJLOC ; GET SOURCE OBJECT ADDR INTO [I]
|
||
|
||
1340 A58E LDA I+LO ; COPY SOURCE ADDRESS
|
||
1342 8590 STA J+LO ; INTO [J]
|
||
1344 A58F LDA I+HI
|
||
1346 8591 STA J+HI
|
||
|
||
1348 A584 LDA ARG2+LO ; GET DEST OBJECT ID
|
||
134A A004 LDY #4 ; POINT TO "LOC" SLOT OF SOURCE
|
||
134C 918E STA (I),Y ; AND MOVE IT IN
|
||
|
||
134E 204D1B JSR OBJLOC ; GET ADDR OF DEST OBJECT INTO [I]
|
||
|
||
1351 A006 LDY #6 ; POINT TO "FIRST" SLOT
|
||
1353 B18E LDA (I),Y ; GET "FIRST" OF DEST
|
||
1355 AA TAX ; SAVE HERE FOR A MOMENT
|
||
|
||
1356 A582 LDA ARG1+LO ; GET SOURCE OBJECT ID
|
||
1358 918E STA (I),Y ; MAKE IT "FIRST" OF DEST
|
||
|
||
135A 8A TXA ; RESTORE "FIRST" OF DEST
|
||
135B F004 BEQ ZMVEX ; SCRAM IF ZERO
|
||
|
||
135D A005 LDY #5 ; MAKE "FIRST" OF DEST
|
||
135F 9190 STA (J),Y ; THE "NEXT" OF SOURCE
|
||
|
||
1361 60 ZMVEX: RTS
|
||
|
||
1362 ; ---
|
||
1362 ; GET
|
||
1362 ; ---
|
||
|
||
1362 ; RETURN ITEM [ARG2] IN WORD-TABLE [ARG1]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 44
|
||
--- 2-OPS ---
|
||
|
||
|
||
1362 207713 ZGET: JSR WCALC ; CALC ADDRESS
|
||
1365 204F18 JSR GETBYT ; GET 1ST BYTE (MSB)
|
||
|
||
1368 858D DOGET: STA VALUE+HI ; SAVE MSB
|
||
136A 204F18 JSR GETBYT ; GET LSB
|
||
136D 858C STA VALUE+LO ; SAVE AND
|
||
136F 4C0C0F JMP PUTVAL ; HAND IT OVER
|
||
|
||
1372 ; ----
|
||
1372 ; GETB
|
||
1372 ; ----
|
||
|
||
1372 ; RETURN ITEM [ARG2] IN BYTE-TABLE AT [ARG1]
|
||
|
||
1372 207B13 ZGETB: JSR BCALC
|
||
1375 F0F1 BEQ DOGET ; [A] = 0, SO CLEAR MSB OF [VALUE]
|
||
|
||
1377 ; --------------------
|
||
1377 ; CALC TABLE ADDRESSES
|
||
1377 ; --------------------
|
||
|
||
1377 ; WORD-ALIGNED ENTRY
|
||
|
||
1377 0684 WCALC: ASL ARG2+LO ; WORD-ALIGN FOR
|
||
1379 2685 ROL ARG2+HI ; WORD ACCESS
|
||
|
||
137B ; BYTE-ALIGNED ENTRY
|
||
|
||
137B A584 BCALC: LDA ARG2+LO ; ADD BASE ADDR OF TABLE
|
||
137D 18 CLC ; TO ITEM
|
||
137E 6582 ADC ARG1+LO ; INDEX
|
||
1380 859C STA MPCL
|
||
|
||
1382 A585 LDA ARG2+HI ; SAME FOR MSBS
|
||
1384 6583 ADC ARG1+HI
|
||
1386 859D STA MPCM
|
||
|
||
1388 A900 LDA #0
|
||
138A 859E STA MPCH ; CLEAR TOP BIT
|
||
138C 859F STA MPCFLG ; & INVALIDATE [MPC]
|
||
138E 60 RTS
|
||
|
||
138F ; ----
|
||
138F ; GETP
|
||
138F ; ----
|
||
|
||
138F ; RETURN PROPERTY [ARG2] OF OBJECT [ARG1];
|
||
138F ; IF NO PROP [ARG2], RETURN [ARG2]'TH ELEMENT OF OBJECT #0
|
||
|
||
138F 20761B ZGETP: JSR PROPB
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 45
|
||
--- 2-OPS ---
|
||
|
||
|
||
1392 20921B GETP1: JSR PROPN
|
||
1395 C584 CMP ARG2+LO
|
||
1397 F01B BEQ GETP3
|
||
1399 9006 BCC GETP2
|
||
|
||
139B 209F1B JSR PROPNX
|
||
139E 4C9213 JMP GETP1 ; TRY AGAIN WITH NEXT PROP
|
||
|
||
13A1 A584 GETP2: LDA ARG2+LO ; GET PROPERTY #
|
||
13A3 38 SEC ; ZERO-ALIGN IT
|
||
13A4 E901 SBC #1
|
||
13A6 0A ASL A ; WORD-ALIGN IT
|
||
13A7 A8 TAY ; USE AS AN INDEX
|
||
13A8 B1B2 LDA (OBJTAB),Y ; GET MSB OF PROPERTY
|
||
13AA 858D STA VALUE+HI
|
||
13AC C8 INY
|
||
13AD B1B2 LDA (OBJTAB),Y ; DO SAME WITH LSB
|
||
13AF 858C STA VALUE+LO
|
||
13B1 4C0C0F JMP PUTVAL ; RETURN DEFAULT IN [VALUE]
|
||
|
||
13B4 20971B GETP3: JSR PROPL
|
||
13B7 C8 INY ; MAKE [Y] POINT TO 1ST BYTE OF PROP
|
||
13B8 AA TAX ; (SET FLAGS) IF LENGTH IN [A] = 0
|
||
13B9 F009 BEQ GETPB ; GET A BYTE PROPERTY
|
||
13BB C901 CMP #1 ; IF LENGTH = 1
|
||
13BD F00B BEQ GETPW ; GET A WORD PROPERTY
|
||
|
||
13BF ; *** ERROR #7: PROPERTY LENGTH ***
|
||
|
||
13BF A907 LDA #7
|
||
13C1 4CF91B JMP ZERROR
|
||
|
||
13C4 ; GET A 1-BYTE PROPERTY
|
||
|
||
13C4 B18E GETPB: LDA (I),Y ; GET LSB INTO [A]
|
||
13C6 A200 LDX #0 ; CLEAR MSB IN [X]
|
||
13C8 F006 BEQ ETPEX
|
||
|
||
13CA ; GET A 2-BYTE PROPERTY
|
||
|
||
13CA B18E GETPW: LDA (I),Y ; GET MSB
|
||
13CC AA TAX ; INTO [X]
|
||
13CD C8 INY ; POINT TO LSB
|
||
13CE B18E LDA (I),Y ; GET IT INTO [A]
|
||
|
||
13D0 858C ETPEX: STA VALUE+LO ; STORE LSB
|
||
13D2 868D STX VALUE+HI ; AND MSB
|
||
13D4 4C0C0F JMP PUTVAL
|
||
|
||
13D7 ; -----
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 46
|
||
--- 2-OPS ---
|
||
|
||
13D7 ; GETPT
|
||
13D7 ; -----
|
||
|
||
13D7 ; RETURN POINTER TO PROP TABLE [ARG2]
|
||
13D7 ; IN OBJECT [ARG1]
|
||
|
||
13D7 20761B ZGETPT: JSR PROPB
|
||
|
||
13DA 20921B GETPT1: JSR PROPN ; RETURNS OFFSET IN [Y]
|
||
13DD C584 CMP ARG2+LO
|
||
13DF F008 BEQ GETPT2
|
||
13E1 901E BCC DORET
|
||
13E3 209F1B JSR PROPNX ; TRY NEXT PROPERTY
|
||
13E6 4CDA13 JMP GETPT1
|
||
|
||
13E9 E68E GETPT2: INC I+LO
|
||
13EB D002 BNE GETPT3
|
||
13ED E68F INC I+HI
|
||
|
||
13EF 98 GETPT3: TYA ; FETCH OFFSET
|
||
13F0 18 CLC
|
||
13F1 658E ADC I+LO ; ADD LSB OF TABLE ADDRESS
|
||
13F3 858C STA VALUE+LO
|
||
|
||
13F5 A58F LDA I+HI ; AND MSB
|
||
13F7 6900 ADC #0
|
||
13F9 38 SEC ; STRIP OFF
|
||
13FA E5A3 SBC ZCODE ; RELATIVE POINTER
|
||
13FC 858D STA VALUE+HI
|
||
13FE 4C0C0F JMP PUTVAL ; AND RETURN
|
||
|
||
1401 4C040F DORET: JMP RET0 ; ELSE RETURN A ZERO
|
||
|
||
1404 ; -----
|
||
1404 ; NEXTP
|
||
1404 ; -----
|
||
|
||
1404 ; RETURN INDEX # OF PROP FOLLOWING PROP [ARG2] IN OBJECT [ARG1];
|
||
1404 ; RETURN ZERO IF LAST; RETURN FIRST IF [ARG2]=0; ERROR IF NONE
|
||
|
||
1404 20761B ZNEXTP: JSR PROPB
|
||
1407 A584 LDA ARG2+LO ; IF [ARG2]=0
|
||
1409 F012 BEQ NXTP3 ; RETURN "FIRST" SLOT
|
||
|
||
140B 20921B NXTP1: JSR PROPN ; FETCH PROPERTY #
|
||
140E C584 CMP ARG2+LO ; COMPARE TO TARGET #
|
||
1410 F008 BEQ NXTP2 ; FOUND IT!
|
||
1412 90ED BCC DORET ; LAST PROP, SO RETURN ZERO
|
||
1414 209F1B JSR PROPNX ; ELSE TRY NEXT PROPERTY
|
||
1417 4C0B14 JMP NXTP1
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 47
|
||
--- 2-OPS ---
|
||
|
||
141A 209F1B NXTP2: JSR PROPNX ; POINT TO FOLLOWING PROPERTY
|
||
|
||
141D 20921B NXTP3: JSR PROPN ; GET THE PROPERTY #
|
||
1420 4C060F JMP PUTBYT ; AND RETURN IT
|
||
|
||
1423 ; ---
|
||
1423 ; ADD
|
||
1423 ; ---
|
||
|
||
1423 ; RETURN [ARG1] + [ARG2]
|
||
|
||
1423 A582 ZADD: LDA ARG1+LO ; ADD LSBS
|
||
1425 18 CLC
|
||
1426 6584 ADC ARG2+LO
|
||
1428 AA TAX ; SAVE LSB HERE
|
||
1429 A583 LDA ARG1+HI ; ADD MSBS
|
||
142B 6585 ADC ARG2+HI
|
||
142D 4C5C12 JMP VEXIT
|
||
|
||
1430 ; ---
|
||
1430 ; SUB
|
||
1430 ; ---
|
||
|
||
1430 ; RETURN [ARG1] - [ARG2]
|
||
|
||
1430 A582 ZSUB: LDA ARG1+LO ; SUBTRACT LSBS
|
||
1432 38 SEC
|
||
1433 E584 SBC ARG2+LO
|
||
1435 AA TAX ; SAVE LSB HERE
|
||
1436 A583 LDA ARG1+HI ; SUBTRACT MSBS
|
||
1438 E585 SBC ARG2+HI
|
||
143A 4C5C12 JMP VEXIT ; EXIT WITH [X]=LSB, [A]=MSB
|
||
|
||
143D ; ---
|
||
143D ; MUL
|
||
143D ; ---
|
||
|
||
143D ; RETURN [ARG1] * [ARG2]
|
||
|
||
143D 20F714 ZMUL: JSR MINIT ; INIT THINGS
|
||
|
||
1440 66D8 ZMLOOP: ROR MTEMP+HI
|
||
1442 66D7 ROR MTEMP+LO
|
||
1444 6685 ROR ARG2+HI
|
||
1446 6684 ROR ARG2+LO
|
||
1448 900D BCC ZMNEXT
|
||
|
||
144A A582 LDA ARG1+LO
|
||
144C 18 CLC
|
||
144D 65D7 ADC MTEMP+LO
|
||
144F 85D7 STA MTEMP+LO
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 48
|
||
--- 2-OPS ---
|
||
|
||
1451 A583 LDA ARG1+HI
|
||
1453 65D8 ADC MTEMP+HI
|
||
1455 85D8 STA MTEMP+HI
|
||
|
||
1457 CA ZMNEXT: DEX
|
||
1458 10E6 BPL ZMLOOP
|
||
|
||
145A A684 LDX ARG2+LO ; PUT LSB OF PRODUCT
|
||
145C A585 LDA ARG2+HI ; AND MSB
|
||
145E 4C5C12 JMP VEXIT ; WHERE "VEXIT" EXPECTS THEM
|
||
|
||
1461 ; ---
|
||
1461 ; DIV
|
||
1461 ; ---
|
||
|
||
1461 ; RETURN QUOTIENT OF [ARG1] / [ARG2]
|
||
|
||
1461 207514 ZDIV: JSR DIVIDE
|
||
1464 A6D3 LDX QUOT+LO
|
||
1466 A5D4 LDA QUOT+HI
|
||
1468 4C5C12 JMP VEXIT
|
||
|
||
146B ; ---
|
||
146B ; MOD
|
||
146B ; ---
|
||
|
||
146B ; RETURN REMAINDER OF [ARG1] / [ARG2]
|
||
|
||
146B 207514 ZMOD: JSR DIVIDE
|
||
146E A6D5 LDX REMAIN+LO ; FETCH THE REMAINDER
|
||
1470 A5D6 LDA REMAIN+HI ; IN [REMAIN]
|
||
1472 4C5C12 JMP VEXIT ; AND RETURN IT
|
||
|
||
1475 ; ---------------
|
||
1475 ; SIGNED DIVISION
|
||
1475 ; ---------------
|
||
|
||
1475 ; ENTRY: DIVIDEND IN [ARG1], DIVISOR IN [ARG2]
|
||
1475 ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN]
|
||
|
||
1475 A583 DIVIDE: LDA ARG1+HI ; SIGN OF REMAINDER
|
||
1477 85DA STA RSIGN ; IS THE SIGN OF THE DIVIDEND
|
||
1479 4585 EOR ARG2+HI ; SIGN OF QUOTIENT IS POSITIVE
|
||
147B 85D9 STA QSIGN ; IF SIGNS OF TERMS ARE THE SAME
|
||
|
||
147D A582 LDA ARG1+LO ; MOVE [ARG1] TO [QUOT]
|
||
147F 85D3 STA QUOT+LO
|
||
1481 A583 LDA ARG1+HI
|
||
1483 85D4 STA QUOT+HI ; IF DIVIDEND IS POSITIVE
|
||
1485 1003 BPL ABSDIV ; MOVE DIVISOR
|
||
1487 20B314 JSR ABQUOT ; ELSE CALC ABS(DIVIDEND) FIRST
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 49
|
||
--- 2-OPS ---
|
||
|
||
|
||
148A A584 ABSDIV: LDA ARG2+LO
|
||
148C 85D5 STA REMAIN+LO
|
||
148E A585 LDA ARG2+HI
|
||
1490 85D6 STA REMAIN+HI ; IF REMAINDER IS POSITIVE
|
||
1492 1003 BPL GODIV ; WE'RE READY TO DIVIDE
|
||
1494 20A514 JSR ABREM ; ELSE CALC ABS(DIVISOR)
|
||
|
||
1497 20C114 GODIV: JSR UDIV ; DO UNSIGNED DIVIDE
|
||
|
||
149A A5D9 LDA QSIGN ; SHOULD QUOTIENT BE FLIPPED?
|
||
149C 1003 BPL RFLIP ; NO, TEST REMAINDER
|
||
149E 20B314 JSR ABQUOT ; ELSE GET ABSOLUTE VALUE
|
||
|
||
14A1 A5DA RFLIP: LDA RSIGN ; SHOULD EMAINDER BE FLIPPED?
|
||
14A3 100D BPL DIVEX ; NO, WE'RE DONE
|
||
|
||
14A5 ; ELSE FALL THROUGH ...
|
||
|
||
14A5 ; ----------------
|
||
14A5 ; CALC ABS(REMAIN)
|
||
14A5 ; ----------------
|
||
|
||
14A5 A900 ABREM: LDA #0
|
||
14A7 38 SEC
|
||
14A8 E5D5 SBC REMAIN+LO
|
||
14AA 85D5 STA REMAIN+LO
|
||
14AC A900 LDA #0
|
||
14AE E5D6 SBC REMAIN+HI
|
||
14B0 85D6 STA REMAIN+HI
|
||
|
||
14B2 60 DIVEX: RTS
|
||
|
||
14B3 ; --------------
|
||
14B3 ; CALC ABS(QUOT)
|
||
14B3 ; --------------
|
||
|
||
14B3 A900 ABQUOT: LDA #0
|
||
14B5 38 SEC
|
||
14B6 E5D3 SBC QUOT+LO
|
||
14B8 85D3 STA QUOT+LO
|
||
14BA A900 LDA #0
|
||
14BC E5D4 SBC QUOT+HI
|
||
14BE 85D4 STA QUOT+HI
|
||
14C0 60 RTS
|
||
|
||
14C1 ; -----------------
|
||
14C1 ; UNSIGNED DIVISION
|
||
14C1 ; -----------------
|
||
|
||
14C1 ; ENTRY: DIVIDEND IN [QUOT], DIVISOR IN [REMAIN]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 50
|
||
--- 2-OPS ---
|
||
|
||
14C1 ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN]
|
||
|
||
14C1 A5D5 UDIV: LDA REMAIN+LO ; CHECK [REMAIN]
|
||
14C3 05D6 ORA REMAIN+HI ; BEFORE PROCEEDING
|
||
14C5 F02B BEQ DIVERR ; CAN'T DIVIDE BY ZERO!
|
||
|
||
14C7 20F714 JSR MINIT ; SET IT ALL UP
|
||
|
||
14CA 26D3 UDLOOP: ROL QUOT+LO
|
||
14CC 26D4 ROL QUOT+HI
|
||
14CE 26D7 ROL MTEMP+LO
|
||
14D0 26D8 ROL MTEMP+HI
|
||
|
||
14D2 A5D7 LDA MTEMP+LO
|
||
14D4 38 SEC
|
||
14D5 E5D5 SBC REMAIN+LO
|
||
14D7 A8 TAY ; SAVE HERE
|
||
14D8 A5D8 LDA MTEMP+HI
|
||
14DA E5D6 SBC REMAIN+HI
|
||
14DC 9004 BCC UDNEXT
|
||
14DE 84D7 STY MTEMP+LO
|
||
14E0 85D8 STA MTEMP+HI
|
||
|
||
14E2 CA UDNEXT: DEX
|
||
14E3 D0E5 BNE UDLOOP
|
||
|
||
14E5 26D3 ROL QUOT+LO ; SHIFT LAST CARRY FOR QUOTIENT
|
||
14E7 26D4 ROL QUOT+HI
|
||
|
||
14E9 A5D7 LDA MTEMP+LO ; MOVE REMAINDER
|
||
14EB 85D5 STA REMAIN+LO ; INTO [REMAIN]
|
||
14ED A5D8 LDA MTEMP+HI
|
||
14EF 85D6 STA REMAIN+HI
|
||
14F1 60 RTS
|
||
|
||
14F2 ; *** ERROR #8: DIVISION BY ZERO ***
|
||
|
||
14F2 A908 DIVERR: LDA #8
|
||
14F4 4CF91B JMP ZERROR
|
||
|
||
14F7 ; ---------
|
||
14F7 ; MATH INIT
|
||
14F7 ; ---------
|
||
|
||
14F7 A210 MINIT: LDX #16 ; INIT LOOPING INDEX
|
||
14F9 A900 LDA #0
|
||
14FB 85D7 STA MTEMP+LO ; CLEAR TEMP
|
||
14FD 85D8 STA MTEMP+HI ; REGISTER
|
||
14FF 18 CLC ; AND CARRY
|
||
1500 60 RTS
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 51
|
||
--- 2-OPS ---
|
||
|
||
END
|
||
INCLUD OPSX.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 52
|
||
--- X-OPS ---
|
||
|
||
|
||
1501 ; ------
|
||
1501 ; EQUAL?
|
||
1501 ; ------
|
||
|
||
1501 ; IS [ARG1] = [ARG2] (OR [ARG3] OR [ARG4])?
|
||
|
||
1501 C681 ZEQUAL: DEC NARGS ; DOUBLE-CHECK # ARGS
|
||
1503 D005 BNE DOEQ ; MUST BE AT LEAST TWO, OR ...
|
||
|
||
1505 ; *** ERROR #9: NOT ENOUGH "EQUAL?" ARGS ***
|
||
|
||
1505 A909 LDA #9
|
||
1507 4CF91B JMP ZERROR
|
||
|
||
150A A582 DOEQ: LDA ARG1+LO ; FETCH LSB
|
||
150C A683 LDX ARG1+HI ; AND MSB OF [ARG1]
|
||
|
||
150E C584 CMP ARG2+LO ; TEST LSB OF [ARG2]
|
||
1510 D004 BNE TRY2 ; NO GOOD, LOOK FOR ANOTHER ARG
|
||
1512 E485 CPX ARG2+HI ; ELSE TRY MSB OF [ARG2]
|
||
1514 F018 BEQ EQOK ; MATCHED!
|
||
|
||
1516 C681 TRY2: DEC NARGS ; OUT OF ARGS YET?
|
||
1518 F017 BEQ EQBAD ; YES, WE FAILED
|
||
|
||
151A C586 CMP ARG3+LO ; TRY LSB OF [ARG3]
|
||
151C D004 BNE TRY3 ; NO GOOD, LOOK FOR ANOTHER ARG
|
||
151E E487 CPX ARG3+HI ; HOW ABOUT MSB OF [ARG3]?
|
||
1520 F00C BEQ EQOK ; YAY!
|
||
|
||
1522 C681 TRY3: DEC NARGS ; OUT OF ARGS YET?
|
||
1524 F00B BEQ EQBAD ; IF NOT ...
|
||
|
||
1526 C588 CMP ARG4+LO ; TRY [ARG4]
|
||
1528 D007 BNE EQBAD ; SORRY, CHUM
|
||
152A E489 CPX ARG4+HI ; MSB MATCHED?
|
||
152C D003 BNE EQBAD ; TOO BAD
|
||
|
||
152E 4C540F EQOK: JMP PREDS ; FINALLY MATCHED!
|
||
|
||
1531 4C480F EQBAD: JMP PREDF ; FAILURE (SNIFF!)
|
||
|
||
1534 ; ----
|
||
1534 ; CALL
|
||
1534 ; ----
|
||
|
||
1534 ; BRANCH TO FUNCTION AT ([ARG1]*2), PASSING
|
||
1534 ; OPTIONAL PARAMETERS IN [ARG2]-[ARG4]
|
||
|
||
1534 A582 ZCALL: LDA ARG1+LO
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 53
|
||
--- X-OPS ---
|
||
|
||
1536 0583 ORA ARG1+HI ; IS CALL ADDRESS ZERO?
|
||
1538 D003 BNE DOCALL ; NO, CONTINUE
|
||
|
||
153A 4C060F JMP PUTBYT ; ELSE RETURN THE ZERO IN [A]
|
||
|
||
153D A695 DOCALL: LDX OLDZSP ; SAVE OLD STACK POINTER
|
||
153F A596 LDA ZPCL ; AND LSB OF [ZPC]
|
||
1541 20E80E JSR PUSHXA ; ON THE Z-STACK
|
||
|
||
1544 A697 LDX ZPCM ; SAVE MIDDLE 8 BITS
|
||
1546 A598 LDA ZPCH ; AND TOP BIT OF [ZPC]
|
||
1548 20E80E JSR PUSHXA ; AS WELL
|
||
|
||
154B ; FORM 16-BIT ADDRESS FROM [ARG1]
|
||
|
||
154B A900 LDA #0 ; CLEAR HIGH BIT FOR ROTATE
|
||
154D 8599 STA ZPCFLG ; AND INVALIDATE [ZPC]
|
||
|
||
154F 0682 ASL ARG1+LO ; MULTIPLY [ARG1]
|
||
1551 2683 ROL ARG1+HI ; BY TWO
|
||
1553 2A ROL A ; HIGH BIT INTO [A]
|
||
1554 8598 STA ZPCH ; NEW HIGH BIT OF [ZPC]
|
||
|
||
1556 A583 LDA ARG1+HI ; GET NEW LOW BYTES
|
||
1558 8597 STA ZPCM
|
||
155A A582 LDA ARG1+LO
|
||
155C 8596 STA ZPCL
|
||
|
||
155E 201918 JSR NEXTPC ; FETCH # LOCALS TO PASS
|
||
1561 8590 STA J+LO ; SAVE HERE FOR COUNTING
|
||
1563 8591 STA J+HI ; AND HERE FOR LATER REFERENCE
|
||
1565 F02B BEQ ZCALL2 ; SKIP IF NO LOCALS
|
||
|
||
1567 A900 LDA #0
|
||
1569 858E STA I+LO ; ELSE INIT STORAGE INDEX
|
||
|
||
156B A48E ZCALL1: LDY I+LO
|
||
156D BE000A LDX LOCALS+LO,Y ; GET LSB OF LOCAL INTO [X]
|
||
1570 B9010A LDA LOCALS+HI,Y ; AND MSB INTO [A]
|
||
1573 848E STY I+LO ; SAVE THE INDEX
|
||
1575 20E80E JSR PUSHXA ; PUSH LOCAL IN [X/A] ONTO Z-STACK
|
||
|
||
1578 201918 JSR NEXTPC ; GET MSB OF NEW LOCAL
|
||
157B 858F STA I+HI ; SAVE IT HERE
|
||
157D 201918 JSR NEXTPC ; NOW GET LSB
|
||
|
||
1580 A48E LDY I+LO ; RESTORE INDEX
|
||
1582 99000A STA LOCALS+LO,Y ; STORE LSB INTO [LOCALS]
|
||
1585 A58F LDA I+HI ; RETRIEVE MSB
|
||
1587 99010A STA LOCALS+HI,Y ; STORE IT INTO [LOCALS]
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 54
|
||
--- X-OPS ---
|
||
|
||
158A C8 INY
|
||
158B C8 INY ; UPDATE
|
||
158C 848E STY I+LO ; THE STORAGE INDEX
|
||
|
||
158E C690 DEC J+LO ; ANY MORE LOCALS?
|
||
1590 D0D9 BNE ZCALL1 ; YES, KEEP LOOPING
|
||
|
||
1592 ; MOVE UP TO 3 ARGUMENTS TO [LOCALS]
|
||
|
||
1592 C681 ZCALL2: DEC NARGS ; EXTRA ARGS IN THIS CALL?
|
||
1594 F026 BEQ ZCALL3 ; NO, CONTINUE
|
||
|
||
1596 A584 LDA ARG2+LO ; MOVE [ARG2] TO LOCAL #1
|
||
1598 8D000A STA LOCALS+LO
|
||
159B A585 LDA ARG2+HI
|
||
159D 8D010A STA LOCALS+HI
|
||
|
||
15A0 C681 DEC NARGS ; ANY LEFT?
|
||
15A2 F018 BEQ ZCALL3 ; NO, SCRAM
|
||
|
||
15A4 A586 LDA ARG3+LO ; MOVE [ARG3] TO LOCAL #2
|
||
15A6 8D020A STA LOCALS+LO+2
|
||
15A9 A587 LDA ARG3+HI
|
||
15AB 8D030A STA LOCALS+HI+2
|
||
|
||
15AE C681 DEC NARGS ; ANY LEFT?
|
||
15B0 F00A BEQ ZCALL3 ; NO, EXUENT
|
||
|
||
15B2 A588 LDA ARG4+LO ; MOVE [ARG4] TO LOCAL #3
|
||
15B4 8D040A STA LOCALS+LO+4
|
||
15B7 A589 LDA ARG4+HI
|
||
15B9 8D050A STA LOCALS+HI+4
|
||
|
||
15BC A691 ZCALL3: LDX J+HI ; RETRIEVE # LOCALS
|
||
15BE 8A TXA ; DUPE FOR NO GOOD REASON
|
||
15BF 20E80E JSR PUSHXA ; PUSH # LOCALS ONTO Z-STACK
|
||
|
||
15C2 A594 LDA ZSP ; REMEMBER WHERE
|
||
15C4 8595 STA OLDZSP ; WE CAME FROM
|
||
|
||
15C6 60 RTS ; WHEW!
|
||
|
||
15C7 ; ---
|
||
15C7 ; PUT
|
||
15C7 ; ---
|
||
|
||
15C7 ; SET ITEM [ARG2] IN WORD-TABLE [ARG1] EQUAL TO [ARG3]
|
||
|
||
15C7 0684 ZPUT: ASL ARG2+LO ; WORD-ALIGN [ARG2]
|
||
15C9 2685 ROL ARG2+HI
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 55
|
||
--- X-OPS ---
|
||
|
||
15CB 20DD15 JSR PCALC ; GET ITEM ADDR INTO [I]
|
||
15CE A587 LDA ARG3+HI ; STORE MSB OF [ARG3]
|
||
15D0 918E STA (I),Y ; INTO MSB OF TABLE POSITION
|
||
15D2 C8 INY ; POINT TO LSB
|
||
15D3 D003 BNE PUTLSB ; BRANCH ALWAYS
|
||
|
||
15D5 ; ----
|
||
15D5 ; PUTB
|
||
15D5 ; ----
|
||
|
||
15D5 ; SET ITEM [ARG2] IN BYTE-TABLE [ARG1] EQUAL TO [ARG3]
|
||
|
||
15D5 20DD15 ZPUTB: JSR PCALC
|
||
|
||
15D8 ; ENTRY FOR "PUT"
|
||
|
||
15D8 A586 PUTLSB: LDA ARG3+LO ; GET LSB OF [ARG3]
|
||
15DA 918E STA (I),Y ; STORE IN TABLE AT [Y]
|
||
15DC 60 RTS
|
||
|
||
15DD ; ---------------------------
|
||
15DD ; CALC ITEM ADDRESS FOR "PUT"
|
||
15DD ; ---------------------------
|
||
|
||
15DD A584 PCALC: LDA ARG2+LO ; ADD ITEM OFFSET IN [ARG2]
|
||
15DF 18 CLC ; TO TABLE ADDR IN [ARG1]
|
||
15E0 6582 ADC ARG1+LO ; TO FORM A POINTER
|
||
15E2 858E STA I+LO ; IN [I]
|
||
|
||
15E4 A585 LDA ARG2+HI ; SAME FOR MSB
|
||
15E6 6583 ADC ARG1+HI
|
||
15E8 18 CLC
|
||
15E9 65A3 ADC ZCODE ; MAKE IT ABSOLUTE
|
||
15EB 858F STA I+HI
|
||
|
||
15ED A000 LDY #0 ; ZERO FOR INDEXING
|
||
15EF 60 RTS
|
||
|
||
15F0 ; ----
|
||
15F0 ; PUTP
|
||
15F0 ; ----
|
||
|
||
15F0 ; SET PROPERTY [ARG2] IN OBJECT [ARG1] EQUAL TO [ARG3]
|
||
|
||
15F0 20761B ZPUTP: JSR PROPB
|
||
|
||
15F3 20921B PUTP1: JSR PROPN
|
||
15F6 C584 CMP ARG2+LO
|
||
15F8 F008 BEQ PUTP2
|
||
15FA 901B BCC PNERR ; ERROR IF LOWER
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 56
|
||
--- X-OPS ---
|
||
|
||
15FC 209F1B JSR PROPNX ; TRY NEXT PROPERTY
|
||
15FF 4CF315 JMP PUTP1
|
||
|
||
1602 20971B PUTP2: JSR PROPL
|
||
1605 C8 INY ; MAKE [Y] POINT TO 1ST PROPERTY BYTE
|
||
1606 AA TAX ; (SET FLAGS) IF LENGTH IN [A] = 0
|
||
1607 F009 BEQ PUTP3 ; PUT A BYTE
|
||
1609 C901 CMP #1 ; PUT A WORD IF [A] = 1
|
||
160B D00F BNE PLERR ; ELSE LENGTH IS BAD
|
||
|
||
160D A587 LDA ARG3+HI ; GET MSB OF PROPERTY
|
||
160F 918E STA (I),Y ; AND STORE IN OBJECT
|
||
1611 C8 INY ; POINT TO LSB SLOT
|
||
|
||
1612 A586 PUTP3: LDA ARG3+LO ; FETCH LSB
|
||
1614 918E STA (I),Y ; AND STORE IN OBJECT
|
||
1616 60 RTS
|
||
|
||
1617 ; *** ERROR #10: BAD PROPERTY NUMBER ***
|
||
|
||
1617 A90A PNERR: LDA #10
|
||
1619 4CF91B JMP ZERROR
|
||
|
||
161C ; *** ERROR #11: PUTP PROPERTY LENGTH ***
|
||
|
||
161C A90B PLERR: LDA #11
|
||
161E 4CF91B JMP ZERROR
|
||
|
||
1621 ; ------
|
||
1621 ; PRINTC
|
||
1621 ; ------
|
||
|
||
1621 ; PRINT CHAR WITH ASCII VALUE IN [ARG1]
|
||
|
||
1621 A582 ZPRC: LDA ARG1+LO ; GRAB THE CHAR
|
||
1623 4C891C JMP COUT ; AND SHIP IT OUT
|
||
|
||
1626 ; ------
|
||
1626 ; PRINTN
|
||
1626 ; ------
|
||
|
||
1626 ; PRINT VALUE OF [ARG1] AS A SIGNED INTEGER
|
||
|
||
1626 A582 ZPRN: LDA ARG1+LO ; MOVE [ARG1] TO [QUOT]
|
||
1628 85D3 STA QUOT+LO
|
||
162A A583 LDA ARG1+HI
|
||
162C 85D4 STA QUOT+HI
|
||
|
||
162E ; PRINT [QUOT]
|
||
|
||
162E A5D4 NUMBER: LDA QUOT+HI ; IF VALUE IS POSITIVE
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 57
|
||
--- X-OPS ---
|
||
|
||
1630 1008 BPL DIGCNT ; CONTINUE
|
||
|
||
1632 A92D LDA #$2D ; ELSE START WITH A MINUS SIGN
|
||
1634 20891C JSR COUT
|
||
|
||
1637 20B314 JSR ABQUOT ; AND CALC ABS([QUOT])
|
||
|
||
163A ; COUNT # OF DECIMAL DIGITS
|
||
|
||
163A A900 DIGCNT: LDA #0 ; RESET
|
||
163C 85DB STA DIGITS ; DIGIT INDEX
|
||
|
||
163E A5D3 DGC: LDA QUOT+LO ; IS QUOTIENT
|
||
1640 05D4 ORA QUOT+HI ; ZERO YET?
|
||
1642 F012 BEQ PRNTN3 ; YES, READY TO PRINT
|
||
|
||
1644 A90A LDA #10 ; ELSE DIVIDE [QUOT]
|
||
1646 85D5 STA REMAIN+LO ; BY 10 (LSB)
|
||
1648 A900 LDA #0
|
||
164A 85D6 STA REMAIN+HI ; 10 (MSB)
|
||
|
||
164C 20C114 JSR UDIV ; UNSIGNED DIVIDE
|
||
|
||
164F A5D5 LDA REMAIN+LO ; FETCH LSB OF REMAINDER (THE DIGIT)
|
||
1651 48 PHA ; SAVE IT ON STACK
|
||
1652 E6DB INC DIGITS ; UPDATE DIGIT COUNT
|
||
1654 D0E8 BNE DGC ; LOOP TILL QUOTIENT=0
|
||
|
||
1656 A5DB PRNTN3: LDA DIGITS ; IF DIGIT COUNT IS NZ
|
||
1658 D005 BNE PRNTN4 ; CONTINUE
|
||
|
||
165A A930 LDA #'0' ; ELSE PRINT "0"
|
||
165C 4C891C JMP COUT ; AND RETURN
|
||
|
||
165F 68 PRNTN4: PLA ; PULL A DIGIT OFF THE STACK
|
||
1660 18 CLC
|
||
1661 6930 ADC #'0' ; CONVERT TO ASCII
|
||
1663 20891C JSR COUT ; AND PRINT IT
|
||
1666 C6DB DEC DIGITS ; OUT OF DIGITS YET?
|
||
1668 D0F5 BNE PRNTN4 ; NO, KEEP LOOPING
|
||
166A 60 RTS
|
||
|
||
166B ; ------
|
||
166B ; RANDOM
|
||
166B ; ------
|
||
|
||
166B ; RETURN A RANDOM VALUE BETWEEN 0 AND [ARG1]
|
||
|
||
166B A582 ZRAND: LDA ARG1+LO ; MAKE [ARG1] THE DIVISOR
|
||
166D 8584 STA ARG2+LO
|
||
166F A583 LDA ARG1+HI
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 58
|
||
--- X-OPS ---
|
||
|
||
1671 8585 STA ARG2+HI
|
||
|
||
1673 20811C JSR RANDOM ; GET RANDOM BYTES INTO [A] AND [X]
|
||
1676 8682 STX ARG1+LO ; MAKE THEM THE DIVIDEND
|
||
1678 297F AND #$7F ; MAKE SURE MSB IS POSITIVE
|
||
167A 8583 STA ARG1+HI
|
||
|
||
167C 207514 JSR DIVIDE ; SIGNED DIVIDE, [ARG1] / [ARG2]
|
||
|
||
167F A5D5 LDA REMAIN+LO ; MOVE REMAINDER
|
||
1681 858C STA VALUE+LO ; INTO [VALUE]
|
||
1683 A5D6 LDA REMAIN+HI
|
||
1685 858D STA VALUE+HI
|
||
|
||
1687 20D40F JSR INCVAL ; INCREMENT [VALUE]
|
||
168A 4C0C0F JMP PUTVAL ; AND RETURN RESULT
|
||
|
||
168D ; ----
|
||
168D ; PUSH
|
||
168D ; ----
|
||
|
||
168D ; PUSH [ARG1] ONTO THE Z-STACK
|
||
|
||
168D A682 ZPUSH: LDX ARG1+LO
|
||
168F A583 LDA ARG1+HI
|
||
1691 4CE80E JMP PUSHXA
|
||
|
||
1694 ; ---
|
||
1694 ; POP
|
||
1694 ; ---
|
||
|
||
1694 ; POP WORD OFF Z-STACK, STORE IN VARIABLE [ARG1]
|
||
|
||
1694 20CE0E ZPOP: JSR POPVAL ; VALUE INTO [VALUE]
|
||
1697 A582 LDA ARG1+LO ; GET VARIABLE ID
|
||
1699 4CFB0E JMP VARPUT ; AND CHANGE THE VARIABLE
|
||
|
||
END
|
||
INCLUD READ.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 59
|
||
--- READ HANDLER ---
|
||
|
||
|
||
169C ; ----
|
||
169C ; READ
|
||
169C ; ----
|
||
|
||
169C ; READ LINE INTO TABLE [ARG1]; PARSE INTO TABLE [ARG2]
|
||
|
||
169C 20201D ZREAD: JSR ZUSL ; UPDATE THE STATUS LINE
|
||
|
||
169F A583 LDA ARG1+HI ; MAKE THE TABLE ADDRESSES
|
||
16A1 18 CLC ; ABSOLUTE
|
||
16A2 65A3 ADC ZCODE ; LSBS NEED NOT CHANGE
|
||
16A4 8583 STA ARG1+HI
|
||
|
||
16A6 A585 LDA ARG2+HI
|
||
16A8 18 CLC
|
||
16A9 65A3 ADC ZCODE
|
||
16AB 8585 STA ARG2+HI
|
||
|
||
16AD 205B1F JSR INPUT ; READ LINE; RETURN LENGTH IN [A]
|
||
16B0 85C2 STA LINLEN ; SAVE # CHARS IN LINE
|
||
|
||
16B2 A900 LDA #0
|
||
16B4 85C3 STA WRDLEN ; INIT # CHARS IN WORD COUNTER
|
||
|
||
16B6 A001 LDY #1 ; POINT TO "# WORDS READ" SLOT
|
||
16B8 9184 STA (ARG2),Y ; AND CLEAR IT ([A] = 0)
|
||
|
||
16BA 84C0 STY SOURCE ; INIT SOURCE TABLE PNTR ([Y] = 1)
|
||
16BC C8 INY ; = 2
|
||
16BD 84C1 STY RESULT ; AND RESULT TABLE POINTER
|
||
|
||
16BF ; MAIN LOOP STARTS HERE
|
||
|
||
16BF A000 READL: LDY #0 ; POINT TO "MAX # WORDS" SLOT
|
||
16C1 B184 LDA (ARG2),Y ; AND READ IT
|
||
|
||
16C3 F004 BEQ RLERR ; IF ENTRY IS ZERO, PATCH IT (BM 5/14/85)
|
||
16C5 C93C CMP #60 ; IF ENTRY <= 59,
|
||
16C7 9004 BCC RL0 ; CONTINUE
|
||
|
||
16C9 A93B RLERR: LDA #59 ; FORCE # TOKENS
|
||
16CB 9184 STA (ARG2),Y ; TO BE 59
|
||
|
||
16CD C8 RL0: INY ; (Y = 1) POINT TO "# WORDS READ" SLOT
|
||
16CE D184 CMP (ARG2),Y ; TOO MANY WORDS?
|
||
16D0 9006 BCC RLEX ; EXIT IF SO (BM 5/1/85)
|
||
|
||
16D2 A5C2 RL1: LDA LINLEN
|
||
16D4 05C3 ORA WRDLEN ; OUT OF CHARS AND WORDS?
|
||
16D6 D001 BNE RL2 ; NOT YET
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 60
|
||
--- READ HANDLER ---
|
||
|
||
|
||
16D8 60 RLEX: RTS ; ELSE EXIT
|
||
|
||
16D9 A5C3 RL2: LDA WRDLEN ; GET WORD LENGTH
|
||
16DB C906 CMP #6 ; 6 CHARS DONE?
|
||
16DD 9003 BCC RL3 ; NO, KEEP GOING
|
||
16DF 207017 JSR FLUSHW ; ELSE FLUSH REMAINDER OF WORD
|
||
|
||
16E2 A5C3 RL3: LDA WRDLEN ; GET WORD LENGTH AGAIN
|
||
16E4 D024 BNE READL2 ; CONTINUE IF NOT FIRST CHAR
|
||
|
||
16E6 ; START A NEW WORD
|
||
|
||
16E6 A205 LDX #5 ; CLEAR Z-WORD INPUT BUFFER
|
||
16E8 95B4 RLL: STA IN,X ; [A] = 0
|
||
16EA CA DEX
|
||
16EB 10FB BPL RLL
|
||
|
||
16ED 206217 JSR EFIND ; GET BASE ADDRESS INTO [ENTRY]
|
||
16F0 A5C0 LDA SOURCE ; STORE THE START POS OF THE WORD
|
||
16F2 A003 LDY #3 ; INTO THE "WORD START" SLOT
|
||
16F4 91C4 STA (ENTRY),Y ; OF THE RESULT TABLE
|
||
|
||
16F6 A8 TAY
|
||
16F7 B182 LDA (ARG1),Y ; GET A CHAR FROM SOURCE BUFFER
|
||
16F9 209D17 JSR SIB ; IS IT A SELF-INSERTING BREAK?
|
||
16FC B026 BCS DOSIB ; YES IF CARRY WAS SET
|
||
|
||
16FE 208B17 JSR NORM ; IS IT A "NORMAL" BREAK?
|
||
1701 9007 BCC READL2 ; NO, CONTINUE
|
||
|
||
1703 E6C0 INC SOURCE ; ELSE FLUSH THE STRANDED BREAK
|
||
1705 C6C2 DEC LINLEN ; UPDATE # CHARS LEFT IN LINE
|
||
1707 4CBF16 JMP READL ; AND LOOP
|
||
|
||
170A A5C2 READL2: LDA LINLEN ; OUT OF CHARS YET?
|
||
170C F01E BEQ READL3 ; LOOKS THAT WAY
|
||
|
||
170E A4C0 LDY SOURCE
|
||
1710 B182 LDA (ARG1),Y ; ELSE GRAB NEXT CHAR
|
||
1712 208617 JSR BREAK ; IS IT A BREAK?
|
||
1715 B015 BCS READL3 ; YES IF CARRY WAS SET
|
||
|
||
1717 A6C3 LDX WRDLEN ; ELSE STORE THE CHAR
|
||
1719 95B4 STA IN,X ; INTO THE INPUT BUFFER
|
||
|
||
171B C6C2 DEC LINLEN ; ONE LESS CHAR IN LINE
|
||
171D E6C3 INC WRDLEN ; ONE MORE IN WORD
|
||
171F E6C0 INC SOURCE ; POINT TO NEXT CHAR IN SOURCE
|
||
1721 4CBF16 JMP READL ; AND LOOP BACK
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 61
|
||
--- READ HANDLER ---
|
||
|
||
1724 85B4 DOSIB: STA IN ; PUT THE BREAK INTO 1ST WORD SLOT
|
||
1726 C6C2 DEC LINLEN ; ONE LESS CHAR IN LINE
|
||
1728 E6C3 INC WRDLEN ; ONE MORE IN WORD BUFFER
|
||
172A E6C0 INC SOURCE ; POINT TO NEXT SOURCE CHAR
|
||
|
||
172C A5C3 READL3: LDA WRDLEN ; ANY CHARS IN WORD YET?
|
||
172E F08F BEQ READL ; APPARENTLY NOT, SO LOOP BACK
|
||
|
||
1730 206217 JSR EFIND ; GET ENTRY ADDR INTO [ENTRY]
|
||
1733 A5C3 LDA WRDLEN ; GET ACTUAL LNGTH OF WORD
|
||
1735 A002 LDY #2 ; STORE IT IN "WORD LENGTH" SLOT
|
||
1737 91C4 STA (ENTRY),Y ; OF THE CURRENT ENTRY
|
||
|
||
1739 205E1A JSR CONZST ; CONVERT ASCII IN [IN] TO Z-STRING
|
||
173C 20AF17 JSR FINDW ; AND LOOK IT UP IN VOCABULARY
|
||
|
||
173F A001 LDY #1
|
||
1741 B184 LDA (ARG2),Y ; FETCH THE # WORDS READ
|
||
1743 18 CLC
|
||
1744 6901 ADC #1 ; INCREMENT IT
|
||
1746 9184 STA (ARG2),Y ; AND UPDATE
|
||
|
||
1748 206217 JSR EFIND ; MAKE [ENTRY] POINT TO ENTRY
|
||
|
||
174B A000 LDY #0
|
||
174D 84C3 STY WRDLEN ; CLEAR # CHARS IN WORD
|
||
174F A58D LDA VALUE+HI ; GET MSB OF VOCAB ENTRY ADDRESS
|
||
1751 91C4 STA (ENTRY),Y ; AND STORE IN 1ST SLOT OF ENTRY
|
||
1753 C8 INY
|
||
1754 A58C LDA VALUE+LO ; ALSO STORE LSB IN 2ND SLOT
|
||
1756 91C4 STA (ENTRY),Y
|
||
|
||
1758 A5C1 LDA RESULT ; UPDATE THE
|
||
175A 18 CLC ; RESULT TABLE POINTER
|
||
175B 6904 ADC #4 ; SO IT POINTS TO THE
|
||
175D 85C1 STA RESULT ; NEXT ENTRY
|
||
|
||
175F 4CBF16 JMP READL ; AND LOOP BACK
|
||
|
||
1762 ; -----------------------------------
|
||
1762 ; FIND BASE ADDR OF RESULT ENTRY SLOT
|
||
1762 ; -----------------------------------
|
||
|
||
1762 A584 EFIND: LDA ARG2+LO ; LSB OF RESULT TABLE BASE
|
||
1764 18 CLC
|
||
1765 65C1 ADC RESULT ; AND CURRENT POINTER
|
||
1767 85C4 STA ENTRY+LO ; SAVE IN [ENTRY]
|
||
1769 A585 LDA ARG2+HI ; ALSO ADD MSB
|
||
176B 6900 ADC #0
|
||
176D 85C5 STA ENTRY+HI
|
||
176F 60 RTS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 62
|
||
--- READ HANDLER ---
|
||
|
||
|
||
1770 ; ----------
|
||
1770 ; FLUSH WORD
|
||
1770 ; ----------
|
||
|
||
1770 A5C2 FLUSHW: LDA LINLEN ; ANY CHARS LEFT IN LINE?
|
||
1772 F011 BEQ FLEX ; NO, SCRAM
|
||
|
||
1774 A4C0 LDY SOURCE ; GET CURRENT CHAR POINTER
|
||
1776 B182 LDA (ARG1),Y ; AND GRAB A CHAR
|
||
1778 208617 JSR BREAK ; IS IT A BREAK?
|
||
177B B008 BCS FLEX ; EXIT IF SO
|
||
177D C6C2 DEC LINLEN ; ELSE UPDATE CHAR COUNT
|
||
177F E6C3 INC WRDLEN ; AND WORD-CHAR COUNT
|
||
1781 E6C0 INC SOURCE ; AND CHAR POINTER
|
||
1783 D0EB BNE FLUSHW ; AND LOOP BACK (ALWAYS)
|
||
|
||
1785 60 FLEX: RTS
|
||
|
||
1786 ; ---------------------------------
|
||
1786 ; IS CHAR IN [A] ANY TYPE OF BREAK?
|
||
1786 ; ---------------------------------
|
||
|
||
1786 209D17 BREAK: JSR SIB ; CHECK FOR A SIB FIRST
|
||
1789 B022 BCS FBRK ; EXIT NOW IF MATCHED
|
||
|
||
178B ; ELSE FALL THROUGH ...
|
||
|
||
178B ; --------------------------------
|
||
178B ; IS CHAR IN [A] A "NORMAL" BREAK?
|
||
178B ; --------------------------------
|
||
|
||
178B A205 NORM: LDX #NBRKS-1 ; NUMBER OF "NORMAL" BREAKS
|
||
178D DD9717 NBL: CMP BRKTBL,X ; MATCHED?
|
||
1790 F01B BEQ FBRK ; YES, EXIT
|
||
1792 CA DEX
|
||
1793 10F8 BPL NBL ; NO, KEEP LOOKING
|
||
1795 18 CLC ; NO MATCH, CLEAR CARRY
|
||
1796 60 RTS ; AND RETURN
|
||
|
||
1797 ; ------------------
|
||
1797 ; NORMAL BREAK CHARS
|
||
1797 ; ------------------
|
||
|
||
1797 213F2C2E BRKTBL: DB "!?,." ; IN ORDER OF
|
||
179B 0D DB $0D ; ASCENDING FREQUENCY
|
||
179C 20 DB SPACE ; SPACE CHAR IS TESTED FIRST FOR SPEED
|
||
|
||
0006 NBRKS EQU $-BRKTBL ; # NORMAL BREAKS
|
||
|
||
179D ; ---------------------
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 63
|
||
--- READ HANDLER ---
|
||
|
||
179D ; IS CHAR IN [A] A SIB?
|
||
179D ; ---------------------
|
||
|
||
179D AA SIB: TAX ; SAVE TEST CHAR
|
||
179E A000 LDY #0 ; 1ST BYTE IN VOCAB TABLE
|
||
17A0 B1AE LDA (VOCAB),Y ; HAS # SIBS
|
||
17A2 A8 TAY ; USE AS AN INDEX
|
||
17A3 8A TXA ; RESTORE TEST CHAR
|
||
17A4 D1AE SBL: CMP (VOCAB),Y ; MATCHED?
|
||
17A6 F005 BEQ FBRK ; YES, REPORT IT
|
||
17A8 88 DEY
|
||
17A9 D0F9 BNE SBL ; ELSE KEEP LOOPING
|
||
17AB 18 CLC ; NO MATCH, SO
|
||
17AC 60 RTS ; EXIT WITH CARRY CLEAR
|
||
|
||
17AD 38 FBRK: SEC ; EXIT WITH CARRY SET
|
||
17AE 60 RTS ; IF MATCHED WITH A BREAK CHAR
|
||
|
||
17AF ; -----------------
|
||
17AF ; VOCABULARY SEARCH
|
||
17AF ; -----------------
|
||
|
||
17AF ; ENTRY: 4-BYTE TARGET Z-WORD IN [OUT]
|
||
17AF ; EXIT: ABS ENTRY ADDRESS IN [VALUE] IF FOUND;
|
||
17AF ; OTHERWISE [VALUE] = 0
|
||
|
||
17AF A000 FINDW: LDY #0 ; GET # SIBS
|
||
17B1 B1AE LDA (VOCAB),Y ; IN VOCAB TABLE
|
||
17B3 18 CLC ; INCREMENT IT
|
||
17B4 6901 ADC #1 ; FOR PROPER ALIGNMENT
|
||
17B6 65AE ADC VOCAB+LO ; NOW ADD THE BASE ADDR OF THE TABLE
|
||
17B8 858C STA VALUE+LO ; TO GET THE ACTUAL BASE ADDR
|
||
17BA A5AF LDA VOCAB+HI ; OF THE VOCAB ENTRIES
|
||
17BC 6900 ADC #0 ; WHICH IS SAVED
|
||
17BE 858D STA VALUE+HI ; IN [VALUE]
|
||
|
||
17C0 B18C LDA (VALUE),Y ; GET # BYTES PER ENTRY ([Y] = 0)
|
||
17C2 85C8 STA ESIZE ; SAVE IT HERE
|
||
|
||
17C4 20D40F JSR INCVAL ; POINT TO NEXT BYTE
|
||
17C7 B18C LDA (VALUE),Y ; GET # ENTRIES IN TABLE (MSB)
|
||
17C9 85C7 STA NENTS+HI ; AND STUFF IT IN [NENTS]
|
||
|
||
17CB 20D40F JSR INCVAL ; NEXT BYTE
|
||
17CE B18C LDA (VALUE),Y ; DON'T FORGET THE LSB!
|
||
17D0 85C6 STA NENTS+LO
|
||
|
||
17D2 20D40F JSR INCVAL ; [VALUE] NOW POINTS TO 1ST ENTRY
|
||
|
||
17D5 ; BEGIN THE SEARCH!
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 64
|
||
--- READ HANDLER ---
|
||
|
||
17D5 A000 FWL1: LDY #0
|
||
17D7 B18C LDA (VALUE),Y ; GET 1ST BYTE OF ENTRY
|
||
17D9 C5BA CMP OUT ; MATCHED 1ST BYTE OF TARGET?
|
||
17DB D015 BNE WNEXT ; NO, SKIP TO NEXT WORD
|
||
|
||
17DD C8 INY
|
||
17DE B18C LDA (VALUE),Y
|
||
17E0 C5BB CMP OUT+1 ; 2ND BYTE MATCHED?
|
||
17E2 D00E BNE WNEXT ; NOPE
|
||
|
||
17E4 C8 INY
|
||
17E5 B18C LDA (VALUE),Y
|
||
17E7 C5BC CMP OUT+2 ; 3RD BYTE?
|
||
17E9 D007 BNE WNEXT ; SORRY ...
|
||
|
||
17EB C8 INY
|
||
17EC B18C LDA (VALUE),Y
|
||
17EE C5BD CMP OUT+3 ; LAST BYTE
|
||
17F0 F01F BEQ FWSUCC ; FOUND IT!
|
||
|
||
17F2 A5C8 WNEXT: LDA ESIZE ; GET ENTRY SIZE
|
||
17F4 18 CLC ; AND ADD IT TO ENTRY ADDRESS
|
||
17F5 658C ADC VALUE+LO ; TO MAKE [VALUE]
|
||
17F7 858C STA VALUE+LO ; POINT TO THE NEXT ENTRY
|
||
17F9 9002 BCC WNX
|
||
17FB E68D INC VALUE+HI
|
||
|
||
17FD A5C6 WNX: LDA NENTS+LO ; DECREMENT THE
|
||
17FF 38 SEC ; ENTRY COUNTER
|
||
1800 E901 SBC #1
|
||
1802 85C6 STA NENTS+LO
|
||
1804 B002 BCS WNX1
|
||
1806 C6C7 DEC NENTS+HI
|
||
|
||
1808 05C7 WNX1: ORA NENTS+HI ; KEEP SEARCHING
|
||
180A D0C9 BNE FWL1 ; UNTIL COUNT IS ZERO
|
||
|
||
180C 858C STA VALUE+LO
|
||
180E 858D STA VALUE+HI
|
||
1810 60 RTS ; THEN RETURN WITH [VALUE] = 0
|
||
|
||
1811 ; ENTRY MATCHED!
|
||
|
||
1811 A58D FWSUCC: LDA VALUE+HI ; CONVERT ABSOLUTE ENTRY ADDRESS
|
||
1813 38 SEC ; IN [VALUE]
|
||
1814 E5A3 SBC ZCODE ; TO RELATIVE Z-ADDRESS
|
||
1816 858D STA VALUE+HI ; LSB NEEDN'T CHANGE
|
||
1818 60 RTS
|
||
|
||
END
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 65
|
||
--- READ HANDLER ---
|
||
|
||
INCLUD PAGING.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 66
|
||
--- TIME-STAMP PAGING ROUTINE ---
|
||
|
||
|
||
1819 ; -------------------------
|
||
1819 ; FETCH NEXT BYTE OF Z-CODE
|
||
1819 ; -------------------------
|
||
|
||
1819 ; EXIT: BYTE AT [ZPC] IN [A] & [Y]; FLAGS SET
|
||
|
||
1819 A599 NEXTPC: LDA ZPCFLG ; IS [ZPCPNT] VALID?
|
||
181B D01E BNE NPC2 ; YES, GET THE BYTE
|
||
|
||
181D ; Z-PAGE HAS CHANGED!
|
||
|
||
181D A597 LDA ZPCM ; GET TOP
|
||
181F A498 LDY ZPCH ; 9 BITS OF [ZPC]
|
||
1821 D008 BNE NPC0 ; SWAP PAGE IF TOP BIT IS SET
|
||
|
||
1823 C5A4 CMP ZPURE ; IS THIS PAGE PRELOADED?
|
||
1825 B004 BCS NPC0 ; NO, SWAP IT IN
|
||
|
||
1827 65A3 ADC ZCODE ; ELSE MAKE IT ABSOLUTE
|
||
1829 D007 BNE NPC1 ; AND GIVE IT TO [ZPCPNT]
|
||
|
||
182B A200 NPC0: LDX #0
|
||
182D 869F STX MPCFLG ; INVALIDATE [MPC]
|
||
182F 208518 JSR PAGE ; AND GET ABS PAGE ADDR INTO [A]
|
||
|
||
1832 859B NPC1: STA ZPCPNT+HI ; SET ABS PAGE ADDRESS
|
||
1834 A2FF LDX #$FF
|
||
1836 8699 STX ZPCFLG ; VALIDATE [ZPCPNT]
|
||
1838 E8 INX ; = 0
|
||
1839 869A STX ZPCPNT+LO ; CLEAR LSB OF POINTER
|
||
|
||
183B A496 NPC2: LDY ZPCL ; FETCH PAGE INDEX
|
||
183D B19A LDA (ZPCPNT),Y ; GET Z-BYTE
|
||
|
||
183F E696 INC ZPCL ; END OF PAGE YET?
|
||
1841 D00A BNE NPC3 ; NO, EXIT
|
||
|
||
1843 A000 LDY #0
|
||
1845 8499 STY ZPCFLG ; ELSE INVALIDATE [ZPCPNT]
|
||
|
||
1847 E697 INC ZPCM ; POINT [ZPC] TO
|
||
1849 D002 BNE NPC3 ; THE NEXT
|
||
184B E698 INC ZPCH ; Z-PAGE
|
||
|
||
184D A8 NPC3: TAY ; SET FLAGS
|
||
184E 60 RTS ; AND RETURN
|
||
|
||
184F ; -------------------------------
|
||
184F ; GET NEXT BYTE OF VIRTUAL MEMORY
|
||
184F ; -------------------------------
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 67
|
||
--- TIME-STAMP PAGING ROUTINE ---
|
||
|
||
|
||
184F ; EXIT: BYTE AT [MPC] IN [A] & [Y]; FLAGS SET
|
||
|
||
184F A59F GETBYT: LDA MPCFLG ; IS [MPCPNT] VALID?
|
||
1851 D01E BNE GTBT2 ; YES, GET THE BYTE
|
||
|
||
1853 ; Z-PAGE HAS CHANGED!
|
||
|
||
1853 A59D LDA MPCM ; GET TOP
|
||
1855 A49E LDY MPCH ; 9 BITS OF [MPC]
|
||
1857 D008 BNE GTBT0 ; SWAP PAGE IF TOP BIT IS SET
|
||
|
||
185A PATCH EQU $+1 ; PATCH POINT FOR "VERIFY"
|
||
|
||
1859 C5A4 CMP ZPURE ; IS THIS PAGE PRELOADED?
|
||
185B B004 BCS GTBT0 ; NO, SWAP IT IN
|
||
|
||
185D 65A3 ADC ZCODE ; ELSE MAKE IT ABSOLUTE
|
||
185F D007 BNE GTBT1 ; AND GIVE IT TO [MPCPNT]
|
||
|
||
1861 A200 GTBT0: LDX #0
|
||
1863 8699 STX ZPCFLG ; INVALIDATE [ZPC]
|
||
1865 208518 JSR PAGE ; AND GET ABS PAGE ADDR INTO [A]
|
||
|
||
1868 85A1 GTBT1: STA MPCPNT+HI ; SET ABS PAGE ADDRESS
|
||
186A A2FF LDX #$FF
|
||
186C 869F STX MPCFLG ; VALIDATE [MPCPNT]
|
||
186E E8 INX ; = 0
|
||
186F 86A0 STX MPCPNT+LO ; CLEAR LSB OF POINTER
|
||
|
||
1871 A49C GTBT2: LDY MPCL ; FETCH PAGE INDEX
|
||
1873 B1A0 LDA (MPCPNT),Y ; GET Z-BYTE
|
||
|
||
1875 E69C INC MPCL ; END OF PAGE YET?
|
||
1877 D00A BNE GTBT3 ; NO, EXIT
|
||
|
||
1879 A000 LDY #0
|
||
187B 849F STY MPCFLG ; ELSE INVALIDATE [MPCPNT]
|
||
|
||
187D E69D INC MPCM ; POINT [MPC] TO
|
||
187F D002 BNE GTBT3 ; THE NEXT
|
||
1881 E69E INC MPCH ; Z-PAGE
|
||
|
||
1883 A8 GTBT3: TAY ; SET FLAGS
|
||
1884 60 RTS ; AND RETURN
|
||
|
||
1885 ; ------------------------
|
||
1885 ; LOCATE A SWAPABLE Z-PAGE
|
||
1885 ; ------------------------
|
||
|
||
1885 ; ENTRY: TARGET Z-PAGE IN [A/Y] (9 BITS)
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 68
|
||
--- TIME-STAMP PAGING ROUTINE ---
|
||
|
||
1885 ; EXIT: ABSOLUTE PAGE IN [A]
|
||
|
||
1885 85A8 PAGE: STA TARGET+LO ; SAVE THE
|
||
1887 84A9 STY TARGET+HI ; TARGET Z-PAGE HERE
|
||
|
||
1889 ; IS THIS Z-PAGE ALREADY PAGED IN?
|
||
|
||
1889 A200 LDX #0
|
||
188B 86A7 STX ZPAGE ; START AT BUFFER #0
|
||
|
||
188D DD0007 PG1: CMP PTABL,X ; LSB MATCHED?
|
||
1890 D008 BNE PG2 ; NO, TRY NEXT BUFFER
|
||
1892 98 TYA ; ELSE CHECK
|
||
1893 DD0008 CMP PTABH,X ; TOP BIT
|
||
1896 F02B BEQ PG4 ; MATCHED! BUFFER IN [ZPAGE]
|
||
1898 A5A8 LDA TARGET+LO ; ELSE RESTORE LSB
|
||
189A E6A7 PG2: INC ZPAGE ; UPDATE TALLY
|
||
189C E8 INX
|
||
189D E4A6 CPX PMAX ; OUT OF BUFFERS YET?
|
||
189F 90EC BCC PG1 ; NO, KEEP SEARCHING
|
||
|
||
18A1 ; SWAP IN THE TARGET PAGE
|
||
|
||
18A1 20FC18 PG3: JSR EARLY ; GET EARLIEST PAGE
|
||
18A4 A6AB LDX SWAP ; INTO [SWAP] & [X]
|
||
18A6 86A7 STX ZPAGE ; SAVE FOR LATER
|
||
|
||
18A8 A5A8 LDA TARGET+LO ; ASSIGN THE TARGET PAGE
|
||
18AA 9D0007 STA PTABL,X ; TO THE EARLIEST BUFFER
|
||
18AD 85EB STA DBLOCK+LO ; ALSO GIVE IT TO ZDOS
|
||
|
||
18AF A5A9 LDA TARGET+HI ; SAME FOR TOP BIT
|
||
18B1 2901 AND #%00000001 ; USE ONLY BIT 0
|
||
18B3 9D0008 STA PTABH,X
|
||
18B6 85EC STA DBLOCK+HI
|
||
|
||
18B8 8A TXA
|
||
18B9 18 CLC
|
||
18BA 65A5 ADC PAGE0 ; CALC ABS ADDR OF BUFFER
|
||
18BC 85EE STA DBUFF+HI ; GIVE IT TO ZDOS
|
||
|
||
18BE 203325 JSR GETDSK ; SWAP IN THE NEW PAGE
|
||
18C1 B034 BCS DSKERR ; ERROR IF CARRY SET
|
||
|
||
18C3 ; UPDATE THE TIMESTAMP
|
||
|
||
18C3 A4A7 PG4: LDY ZPAGE ; GET THE BUFFER INDEX
|
||
18C5 B90009 LDA LRUMAP,Y ; GET THIS BUFFER'S STAMP
|
||
18C8 C5AA CMP STAMP ; SAME AS CURRENT STAMP?
|
||
18CA F025 BEQ PG8 ; YES, EXIT
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 69
|
||
--- TIME-STAMP PAGING ROUTINE ---
|
||
|
||
18CC E6AA INC STAMP ; UPDATE STAMP
|
||
18CE D01C BNE PG7 ; CONTINUE IF NO OVERFLOW
|
||
|
||
18D0 ; HANDLE STAMP OVERFLOW
|
||
|
||
18D0 20FC18 JSR EARLY ; GET EARLIEST STAMP INTO [LRU]
|
||
|
||
18D3 A200 LDX #0 ; INIT INDEX
|
||
18D5 BD0009 PG5: LDA LRUMAP,X ; GET A STAMP READING
|
||
18D8 F006 BEQ PG6 ; EXIT IF ALREADY ZERO
|
||
18DA 38 SEC ; ELSE SUBTRACT OFF
|
||
18DB E5A2 SBC LRU ; THE EARLIEST TIMESTAMP
|
||
18DD 9D0009 STA LRUMAP,X ; AND REPLACE THE STAMP
|
||
18E0 E8 PG6: INX
|
||
18E1 E4A6 CPX PMAX ; END OF SWAPPING SPACE?
|
||
18E3 90F0 BCC PG5 ; LOOP TILL ALL STAMPS FIXED
|
||
|
||
18E5 A900 LDA #0 ; TURN BACK THE CLOCK
|
||
18E7 38 SEC ; TO REFLECT NEW
|
||
18E8 E5A2 SBC LRU ; STAMP READING
|
||
18EA 85AA STA STAMP
|
||
|
||
18EC A5AA PG7: LDA STAMP ; FETCH STAMP
|
||
18EE 990009 STA LRUMAP,Y ; STAMP TARGET PAGE WITH IT
|
||
|
||
18F1 A5A7 PG8: LDA ZPAGE ; GET BUFFER INDEX
|
||
18F3 18 CLC ; MAKE IT
|
||
18F4 65A5 ADC PAGE0 ; ABSOLUTE
|
||
18F6 60 RTS ; AND RETURN IT IN [A]
|
||
|
||
18F7 ; *** ERROR #14: DRIVE ACCESS ***
|
||
|
||
18F7 A90E DSKERR: LDA #14
|
||
18F9 4CF91B JMP ZERROR
|
||
|
||
18FC ; -------------------------
|
||
18FC ; LOCATE EARLIEST TIMESTAMP
|
||
18FC ; -------------------------
|
||
|
||
18FC ; EXIT: [LRU] - EARLIEST TIMESTAMP
|
||
18FC ; [SWAP] = INDEX TO EARLIEST BUFFER
|
||
|
||
18FC A200 EARLY: LDX #0 ; INIT INDEX
|
||
18FE 86AB STX SWAP ; AND [SWAP]
|
||
1900 AD0009 LDA LRUMAP ; GET STAMP OF BUFFER #0
|
||
1903 E8 INX ; START COMPARE WITH BUFFER #1
|
||
1904 DD0009 EAR0: CMP LRUMAP,X ; IS THIS STAMP EARLIER THAN [A]?
|
||
1907 9005 BCC EAR1 ; NO, TRY NEXT STAMP
|
||
1909 BD0009 LDA LRUMAP,X ; ELSE FETCH EARLIER ENTRY
|
||
190C 86AB STX SWAP ; AND REMEMBER WHERE WE FOUND IT
|
||
190E E8 EAR1: INX ; POINT TO NEXT STAMP
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 70
|
||
--- TIME-STAMP PAGING ROUTINE ---
|
||
|
||
190F E4A6 CPX PMAX ; OUT OF STAMPS YET?
|
||
1911 90F1 BCC EAR0 ; LOOP TILL EMPTY
|
||
|
||
1913 85A2 STA LRU ; SAVE EARLIEST STAMP HERE
|
||
1915 60 RTS
|
||
|
||
1916 ; -------------------------
|
||
1916 ; POINT [MPC] TO V-ADDR [I]
|
||
1916 ; -------------------------
|
||
|
||
1916 A58E SETWRD: LDA I+LO
|
||
1918 859C STA MPCL
|
||
191A A58F LDA I+HI
|
||
191C 859D STA MPCM
|
||
|
||
191E A900 LDA #0
|
||
1920 859E STA MPCH ; ZERO TOP BIT
|
||
1922 859F STA MPCFLG ; INVALIDATE [MPC]
|
||
1924 60 RTS
|
||
|
||
1925 ; ----------------------------
|
||
1925 ; GET Z-WORD AT [MPC] INTO [I]
|
||
1925 ; ----------------------------
|
||
|
||
1925 204F18 GETWRD: JSR GETBYT
|
||
1928 858F STA I+HI
|
||
192A 204F18 JSR GETBYT
|
||
192D 858E STA I+LO
|
||
192F 60 RTS
|
||
|
||
END
|
||
INCLUD ZSTRING.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 71
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
|
||
1930 ; -----------------------
|
||
1930 ; POINT TO ZSTRING IN [I]
|
||
1930 ; -----------------------
|
||
|
||
1930 A58E SETSTR: LDA I+LO ; WORD-ALIGN THE ADDRESS
|
||
1932 0A ASL A
|
||
1933 859C STA MPCL
|
||
1935 A58F LDA I+HI
|
||
1937 2A ROL A
|
||
1938 859D STA MPCM
|
||
193A A900 LDA #0
|
||
193C 859F STA MPCFLG ; [MPC] IS CHANGING!
|
||
193E 2A ROL A
|
||
193F 859E STA MPCH
|
||
|
||
1941 60 ZSTEX: RTS
|
||
|
||
1942 ; -----------------------
|
||
1942 ; PRINT Z-STRING AT [MPC]
|
||
1942 ; -----------------------
|
||
|
||
1942 A200 PZSTR: LDX #0
|
||
1944 86C9 STX PSET ; ASSUME PERMANENT CHARSET
|
||
1946 86CD STX ZFLAG ; CLEAR BYTE FLAG
|
||
1948 CA DEX ; = $FF
|
||
1949 86CA STX TSET ; NO TEMPSET ACTIVE
|
||
|
||
194B 20161A PZTOP: JSR GETZCH ; GET A Z-CHAR
|
||
194E B0F1 BCS ZSTEX ; END OF STRING IF CARRY IS SET
|
||
|
||
1950 85CB STA ZCHAR ; ELSE SAVE CHAR HERE
|
||
1952 AA TAX ; SET FLAGS
|
||
1953 F041 BEQ BLANK ; PRINT SPACE IF CHAR = 0
|
||
|
||
1955 C904 CMP #4 ; IS THIS AN F-WORD?
|
||
1957 905B BCC DOFREQ ; APPARENTLY SO
|
||
|
||
1959 C906 CMP #6 ; PERHAPS A SHIFT CODE?
|
||
195B 903D BCC NEWSET ; YES, CHANGE CHARSETS
|
||
|
||
195D 200A1A JSR GETSET ; ELSE GET CHARSET
|
||
1960 AA TAX ; SET FLAGS
|
||
1961 D00B BNE SET1 ; SKIP IF NOT CHARSET #0
|
||
|
||
1963 ; PRINT A LOWER-CASE CHAR (CHARSET #0)
|
||
|
||
1963 A95B LDA #$61-6 ; ASCII "a" MINUS Z-OFFSET
|
||
|
||
1965 18 TOASC: CLC
|
||
1966 65CB ADC ZCHAR ; ADD Z-CHAR INDEX
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 72
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
|
||
1968 20891C SHOVE: JSR COUT ; SHOW THE CHAR
|
||
196B 4C4B19 JMP PZTOP ; AND GRAB NEXT CHAR
|
||
|
||
196E ; PRINT AN UPPER-CASE CHAR (CHARSET #1)
|
||
|
||
196E C901 SET1: CMP #1 ; MAKE SURE IT'S SET #1
|
||
1970 D004 BNE SET2 ; ELSE MUST BE SET #2
|
||
|
||
1972 A93B LDA #$41-6 ; ASCII "A" MINUS Z-OFFSET
|
||
1974 D0EF BNE TOASC ; SAME AS SET #0
|
||
|
||
1976 ; PRINT FROM CHARSET #2
|
||
|
||
1976 A5CB SET2: LDA ZCHAR ; RETRIEVE THE Z-CHAR
|
||
1978 38 SEC
|
||
1979 E906 SBC #6 ; ZERO-ALIGN IT
|
||
197B F007 BEQ DIRECT ; IF ZERO, IT'S A "DIRECT" ASCII
|
||
|
||
197D AA TAX ; OTHERWISE USE CODE AS AN INDEX
|
||
197E BD331B LDA CHRTBL,X ; INTO THE CHARSET TABLE
|
||
1981 4C6819 JMP SHOVE ; AND PRINT THE CHAR
|
||
|
||
1984 ; DECODE A "DIRECT" ASCII CHAR
|
||
|
||
1984 20161A DIRECT: JSR GETZCH ; FETCH NEXT Z-CHAR
|
||
1987 0A ASL A
|
||
1988 0A ASL A
|
||
1989 0A ASL A
|
||
198A 0A ASL A
|
||
198B 0A ASL A ; SHIFT INTO POSITION
|
||
198C 85CB STA ZCHAR ; AND SAVE HERE
|
||
198E 20161A JSR GETZCH ; GRAB YET ANOTHER Z-CHAR
|
||
1991 05CB ORA ZCHAR ; SUPERIMPOSE THE 2ND BYTE
|
||
1993 4C6819 JMP SHOVE ; AND PRINT THE RESULT
|
||
|
||
1996 ; PRINT A SPACE
|
||
|
||
1996 A920 BLANK: LDA #SPACE ; ASCII SPACE CHAR
|
||
1998 D0CE BNE SHOVE
|
||
|
||
199A ; CHANGE CHARSET
|
||
|
||
199A 38 NEWSET: SEC ; CONVERT THE SHIFT CODE
|
||
199B E903 SBC #3 ; TO 1 OR 2
|
||
199D A8 TAY
|
||
199E 200A1A JSR GETSET ; IS MODE TEMPORARY?
|
||
19A1 D005 BNE TOPERM ; YES, DO A PERMSHIFT
|
||
19A3 84CA STY TSET ; ELSE JUST A TEMPSHIFT
|
||
19A5 4C4B19 JMP PZTOP ; AND CONTINUE
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 73
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
19A8 84C9 TOPERM: STY PSET ; SET PERM CHARSET
|
||
19AA C5C9 CMP PSET ; SAME AS BEFORE?
|
||
19AC F09D BEQ PZTOP ; YES, CONTINUE
|
||
19AE A900 LDA #0
|
||
19B0 85C9 STA PSET ; ELSE RESET CHARSET
|
||
19B2 F097 BEQ PZTOP ; BEFORE LOOPING BACK
|
||
|
||
19B4 ; PRINT AN F-WORD
|
||
|
||
19B4 38 DOFREQ: SEC
|
||
19B5 E901 SBC #1 ; ZERO-ALIGN THE CODE
|
||
19B7 0A ASL A ; AND MULTIPLY TIMES 64
|
||
19B8 0A ASL A ; TO OBTAIN THE SEGMENT OFFSET
|
||
19B9 0A ASL A ; INTO THE F-WORDS TABLE
|
||
19BA 0A ASL A
|
||
19BB 0A ASL A
|
||
19BC 0A ASL A
|
||
19BD 85CC STA OFFSET ; SAVE OFFSET FOR LATER
|
||
|
||
19BF 20161A JSR GETZCH ; NOW GET THE F-WORD POINTER
|
||
19C2 0A ASL A ; WORD-ALIGN IT
|
||
19C3 18 CLC ; AND
|
||
19C4 65CC ADC OFFSET ; ADD THE SEGMENT OFFSET
|
||
19C6 A8 TAY ; TO GET THE OFFSET OF THE F-WORD
|
||
19C7 B1B0 LDA (FWORDS),Y ; FROM THE START OF THE F-WORDS TABLE
|
||
19C9 858F STA I+HI ; SAVE MSB OF F-WORD ADDRESS
|
||
19CB C8 INY
|
||
19CC B1B0 LDA (FWORDS),Y ; ALSO SAVE LSB
|
||
19CE 858E STA I+LO ; Z-ADDRESS OF F-WORD IS IN [I]
|
||
|
||
19D0 ; SAVE THE STATE OF CURRENT Z-STRING
|
||
|
||
19D0 A59E LDA MPCH
|
||
19D2 48 PHA
|
||
19D3 A59D LDA MPCM
|
||
19D5 48 PHA
|
||
19D6 A59C LDA MPCL
|
||
19D8 48 PHA
|
||
19D9 A5C9 LDA PSET
|
||
19DB 48 PHA
|
||
19DC A5CD LDA ZFLAG
|
||
19DE 48 PHA
|
||
19DF A5CF LDA ZWORD+HI
|
||
19E1 48 PHA
|
||
19E2 A5CE LDA ZWORD+LO
|
||
19E4 48 PHA
|
||
|
||
19E5 203019 JSR SETSTR ; PRINT THE Z-STRING
|
||
19E8 204219 JSR PZSTR ; IN [I]
|
||
|
||
19EB ; RESTORE OLD Z-STRING
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 74
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
|
||
19EB 68 PLA
|
||
19EC 85CE STA ZWORD+LO
|
||
19EE 68 PLA
|
||
19EF 85CF STA ZWORD+HI
|
||
19F1 68 PLA
|
||
19F2 85CD STA ZFLAG
|
||
19F4 68 PLA
|
||
19F5 85C9 STA PSET
|
||
19F7 68 PLA
|
||
19F8 859C STA MPCL
|
||
19FA 68 PLA
|
||
19FB 859D STA MPCM
|
||
19FD 68 PLA
|
||
19FE 859E STA MPCH
|
||
|
||
1A00 A2FF LDX #$FF
|
||
1A02 86CA STX TSET ; DISABLE TEMP CHARSET
|
||
1A04 E8 INX ; = 0
|
||
1A05 869F STX MPCFLG ; [MPC] HAS CHANGED
|
||
1A07 4C4B19 JMP PZTOP ; CONTINUE INNOCENTLY
|
||
|
||
1A0A ; ----------------------
|
||
1A0A ; RETURN CURRENT CHARSET
|
||
1A0A ; ----------------------
|
||
|
||
1A0A A5CA GETSET: LDA TSET
|
||
1A0C 1003 BPL GS
|
||
1A0E A5C9 LDA PSET
|
||
1A10 60 RTS
|
||
|
||
1A11 A0FF GS: LDY #$FF
|
||
1A13 84CA STY TSET
|
||
1A15 60 RTS
|
||
|
||
1A16 ; -----------------
|
||
1A16 ; FETCH NEXT Z-CHAR
|
||
1A16 ; -----------------
|
||
|
||
1A16 A5CD GETZCH: LDA ZFLAG ; WHICH BYTE IS THIS?
|
||
1A18 1002 BPL GTZ0 ; $FF = LAST
|
||
1A1A 38 SEC ; SET CARRY TO INDICATE
|
||
1A1B 60 RTS ; NO MORE CHARS
|
||
|
||
1A1C D013 GTZ0: BNE GETZ1 ; NOT FIRST CHAR, EITHER
|
||
|
||
1A1E ; GET A Z-WORD INTO [ZWORD], RETURN 1ST CHAR IN TRIPLET
|
||
|
||
1A1E E6CD INC ZFLAG ; UPDATE CHAR COUNT
|
||
|
||
1A20 204F18 JSR GETBYT ; GET TRIPLET AT [MPC]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 75
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
1A23 85CF STA ZWORD+HI ; INTO [ZWORD]
|
||
1A25 204F18 JSR GETBYT
|
||
1A28 85CE STA ZWORD+LO
|
||
|
||
1A2A A5CF LDA ZWORD+HI
|
||
1A2C 4A LSR A
|
||
1A2D 4A LSR A ; SHIFT 1ST CHAR INTO PLACE
|
||
1A2E 4C5A1A JMP GTEXIT ; AND RETURN IT
|
||
|
||
1A31 38 GETZ1: SEC
|
||
1A32 E901 SBC #1
|
||
1A34 D016 BNE GETZ2 ; LAST CHAR IN TRIPLET IF ZERO
|
||
1A36 A902 LDA #2 ; ELSE
|
||
1A38 85CD STA ZFLAG ; RESET CHAR INDEX
|
||
|
||
1A3A A5CE LDA ZWORD+LO ; GET BOTTOM HALF OF TRIPLET
|
||
1A3C 858E STA I+LO ; MOVE HERE FOR SHIFTING
|
||
1A3E A5CF LDA ZWORD+HI ; GET TOP HALF
|
||
|
||
1A40 068E ASL I+LO ; SHIFT THE TOP 3 BITS OF LOWER HALF
|
||
1A42 2A ROL A ; INTO THE BOTTOM OF THE TOP HALF
|
||
1A43 068E ASL I+LO
|
||
1A45 2A ROL A
|
||
1A46 068E ASL I+LO
|
||
1A48 2A ROL A
|
||
1A49 4C5A1A JMP GTEXIT
|
||
|
||
1A4C A900 GETZ2: LDA #0 ; SET FLAG TO INDICATE
|
||
1A4E 85CD STA ZFLAG ; END OF TRIPLET
|
||
|
||
1A50 A5CF LDA ZWORD+HI ; TEST TOP HALF OF TRIPLET
|
||
1A52 1004 BPL GETZ3 ; CONTINUE IF NOT END OF STRING
|
||
1A54 A9FF LDA #$FF ; ELSE
|
||
1A56 85CD STA ZFLAG ; INDICATE LAST TRIPLET IN STRING
|
||
|
||
1A58 A5CE GETZ3: LDA ZWORD+LO ; GET BOTTOM HALF OF TRIPLET
|
||
|
||
1A5A 291F GTEXIT: AND #%00011111 ; MASK OUT GARBAGE BITS
|
||
1A5C 18 CLC
|
||
1A5D 60 RTS
|
||
|
||
1A5E ; ---------------------------------
|
||
1A5E ; CONVERT [IN] TO Z-STRING IN [OUT]
|
||
1A5E ; ---------------------------------
|
||
|
||
1A5E A905 CONZST: LDA #$05 ; FILL OUTPUT BUFFER
|
||
1A60 AA TAX ; WITH PAD CHARS ($05)
|
||
1A61 95BA CZSL: STA OUT,X
|
||
1A63 CA DEX
|
||
1A64 10FB BPL CZSL
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 76
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
1A66 A906 LDA #6 ; INIT
|
||
1A68 85D0 STA CONCNT ; CHAR COUNT
|
||
|
||
1A6A A900 LDA #0 ; CLEAR
|
||
1A6C 85D1 STA CONIN ; SOURCE AND
|
||
1A6E 85D2 STA CONOUT ; OUTPUT INDEXES
|
||
|
||
1A70 A6D1 CONTOP: LDX CONIN ; FETCH SOURCE INDEX
|
||
1A72 E6D1 INC CONIN ; AND UPDATE
|
||
1A74 B5B4 LDA IN,X ; GRAB AN ASCII CHAR
|
||
1A76 85CB STA ZCHAR ; SAVE IT HERE
|
||
1A78 D004 BNE NEXTZ ; CONTINUE IF CHAR WAS NZ
|
||
|
||
1A7A A905 LDA #5 ; ELSE SHIP OUT
|
||
1A7C D02C BNE CSHIP ; A PAD CHAR
|
||
|
||
1A7E A5CB NEXTZ: LDA ZCHAR
|
||
1A80 20F41A JSR SAYSET ; WHICH CHARSET TO USE?
|
||
1A83 F020 BEQ CSET0 ; LOWER-CASE IF ZERO
|
||
|
||
1A85 18 CLC ; ELSE DO A TEMP-SHIFT
|
||
1A86 6903 ADC #3 ; 4 = CHARSET 1, 5 = CHARSET 2
|
||
1A88 A6D2 LDX CONOUT ; FETCH OUTPUT INDEX
|
||
1A8A 95BA STA OUT,X ; SEND THE SHIFT CHAR
|
||
|
||
1A8C E6D2 INC CONOUT ; UPDATE INDEX
|
||
1A8E C6D0 DEC CONCNT ; AND CHAR COUNT
|
||
1A90 D003 BNE CTEST ; IF OUT OF CHARS
|
||
1A92 4C0D1B JMP ZCRUSH ; CRUSH 'EM!
|
||
|
||
1A95 A5CB CTEST: LDA ZCHAR ; TEST CHAR AGAIN
|
||
1A97 20F41A JSR SAYSET
|
||
1A9A C902 CMP #2
|
||
1A9C F019 BEQ CSET2 ; CHARSET #2
|
||
|
||
1A9E ; HANDLE CHARSET #1 (UPPER CASE ALPHA)
|
||
|
||
1A9E A5CB LDA ZCHAR
|
||
1AA0 38 SEC
|
||
1AA1 E93B SBC #$41-6 ; CONVERT TO Z-CHAR
|
||
1AA3 1005 BPL CSHIP ; AND SEND TO OUTPUT
|
||
|
||
1AA5 ; HANDLE CHARSET #0 (LOWER CASE ALPHA)
|
||
|
||
1AA5 A5CB CSET0: LDA ZCHAR
|
||
1AA7 38 SEC
|
||
1AA8 E95B SBC #$61-6 ; CONVERT TO Z-CHAR
|
||
|
||
1AAA ; SHIP Z-CHAR TO OUTPUT BUFFER
|
||
|
||
1AAA A6D2 CSHIP: LDX CONOUT ; FETCH OUTPUT INDEX
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 77
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
1AAC 95BA STA OUT,X
|
||
|
||
1AAE E6D2 INC CONOUT ; UPDATE INDEX
|
||
1AB0 C6D0 DEC CONCNT ; DONE 6 CHARS YET?
|
||
1AB2 D0BC BNE CONTOP ; NO, LOOP BACK
|
||
1AB4 4C0D1B JMP ZCRUSH ; ELSE CRUSH
|
||
|
||
1AB7 ; HANDLE CHARSET #2 (MISCELLANEOUS)
|
||
|
||
1AB7 A5CB CSET2: LDA ZCHAR ; GRAB CHAR
|
||
1AB9 20E41A JSR CTABLE ; IS IT IN CHARSET #3 TABLE?
|
||
1ABC D0EC BNE CSHIP ; YES, SEND IT TO OUTPUT
|
||
|
||
1ABE ; SEND A "DIRECT" ASCII CHAR
|
||
|
||
1ABE A906 LDA #6 ; ASCII ALERT!
|
||
1AC0 A6D2 LDX CONOUT
|
||
1AC2 95BA STA OUT,X
|
||
|
||
1AC4 E6D2 INC CONOUT ; UPDATE INDEX
|
||
1AC6 C6D0 DEC CONCNT ; AND CHAR COUNT
|
||
1AC8 F043 BEQ ZCRUSH ; BUFFER FULL!
|
||
|
||
1ACA ; SEND 1ST HALF OF "DIRECT"
|
||
|
||
1ACA A5CB LDA ZCHAR
|
||
1ACC 4A LSR A
|
||
1ACD 4A LSR A
|
||
1ACE 4A LSR A
|
||
1ACF 4A LSR A
|
||
1AD0 4A LSR A
|
||
1AD1 2903 AND #%00000011 ; MASK GARBAGE
|
||
1AD3 A6D2 LDX CONOUT
|
||
1AD5 95BA STA OUT,X
|
||
|
||
1AD7 E6D2 INC CONOUT
|
||
1AD9 C6D0 DEC CONCNT
|
||
1ADB F030 BEQ ZCRUSH ; BUFFER FULL!
|
||
|
||
1ADD ; SEND 2ND HALF OF "DIRECT"
|
||
|
||
1ADD A5CB LDA ZCHAR ; GET CHAR YET AGAIN
|
||
1ADF 291F AND #%00011111 ; MASK JUNK
|
||
1AE1 4CAA1A JMP CSHIP ; AND SHIP IT OUT
|
||
|
||
1AE4 ; ---------------------
|
||
1AE4 ; IS [A] IN CHARSET #3?
|
||
1AE4 ; ---------------------
|
||
|
||
1AE4 ; EXIT: [A] = CHAR CODE IF FOUND, Z-FLAG CLEARED
|
||
1AE4 ; Z-FLAG SET IF NOT FOUND
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 78
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
|
||
1AE4 A219 CTABLE: LDX #25
|
||
1AE6 DD331B CNL: CMP CHRTBL,X
|
||
1AE9 F004 BEQ CNOK
|
||
1AEB CA DEX
|
||
1AEC D0F8 BNE CNL
|
||
1AEE 60 RTS ; Z-FLAG SET IF NO MATCH
|
||
|
||
1AEF 8A CNOK: TXA ; CHAR CODE IS INDEX
|
||
1AF0 18 CLC
|
||
1AF1 6906 ADC #6 ; PLUS 6
|
||
1AF3 60 RTS
|
||
|
||
1AF4 ; -----------------------------
|
||
1AF4 ; RETURN CHARSET OF CHAR IN [A]
|
||
1AF4 ; -----------------------------
|
||
|
||
1AF4 C961 SAYSET: CMP #'a'
|
||
1AF6 9007 BCC SAY1
|
||
1AF8 C97B CMP #'z'+1
|
||
1AFA B003 BCS SAY1
|
||
1AFC A900 LDA #0 ; IT'S CHARSET #0
|
||
1AFE 60 RTS
|
||
|
||
1AFF C941 SAY1: CMP #'A'
|
||
1B01 9007 BCC SAY2
|
||
1B03 C95B CMP #'Z'+1
|
||
1B05 B003 BCS SAY2
|
||
1B07 A901 LDA #1 ; IT'S CHARSET #1
|
||
1B09 60 RTS
|
||
|
||
1B0A A902 SAY2: LDA #2 ; IT'S CHARSET #2
|
||
1B0C 60 RTS
|
||
|
||
1B0D ; ----------------------
|
||
1B0D ; CRUSH Z-CHARS IN [OUT]
|
||
1B0D ; ----------------------
|
||
|
||
1B0D A5BB ZCRUSH: LDA OUT+1 ; GET 2ND Z-CHAR
|
||
1B0F 0A ASL A ; SHIFT BITS INTO POSITION
|
||
1B10 0A ASL A
|
||
1B11 0A ASL A
|
||
1B12 0A ASL A
|
||
1B13 26BA ROL OUT ; ALONG WITH 1ST Z-CHAR
|
||
1B15 0A ASL A
|
||
1B16 26BA ROL OUT
|
||
1B18 05BC ORA OUT+2 ; SUPERIMPOSE 3RD Z-CHAR
|
||
1B1A 85BB STA OUT+1
|
||
|
||
1B1C A5BE LDA OUT+4 ; GET 5TH Z-CHAR
|
||
1B1E 0A ASL A ; SHIFT BITS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 79
|
||
--- Z-STRING HANDLERS ---
|
||
|
||
1B1F 0A ASL A
|
||
1B20 0A ASL A
|
||
1B21 0A ASL A
|
||
1B22 26BD ROL OUT+3 ; ALONG WITH 4TH Z-CHAR
|
||
1B24 0A ASL A
|
||
1B25 26BD ROL OUT+3
|
||
1B27 05BF ORA OUT+5 ; SUPERIMPOSE 6TH Z-CHAR
|
||
1B29 AA TAX ; SAVE HERE
|
||
1B2A A5BD LDA OUT+3 ; GRAB 4TH Z-CHAR
|
||
1B2C 0980 ORA #%10000000 ; SET HIGH BIT
|
||
1B2E 85BC STA OUT+2 ; MOVE CRUSHED Z-WORD
|
||
1B30 86BD STX OUT+3 ; INTO PLACE
|
||
1B32 60 RTS
|
||
|
||
1B33 ; -----------------------
|
||
1B33 ; CHARSET #2 DECODE TABLE
|
||
1B33 ; -----------------------
|
||
|
||
1B33 00 CHRTBL: DB 0 ; DUMMY BYTE FOR "DIRECT"
|
||
1B34 0D DB $0D ; EOL
|
||
1B35 30313233 DB "0123456789.,!?_#"
|
||
1B45 27 DB $27 ; SINGLE QUOTE
|
||
1B46 22 DB $22 ; DOUBLE QUOTE
|
||
1B47 2F5C2D3A DB "/\-:()"
|
||
|
||
END
|
||
INCLUD OBJECTS.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 80
|
||
--- OBJECT & PROPERTY HANDLERS ---
|
||
|
||
|
||
1B4D ; ----------------------------------
|
||
1B4D ; GET ABSOLUTE ADDRESS OF OBJECT [A]
|
||
1B4D ; ----------------------------------
|
||
|
||
1B4D ; EXIT: ADDRESS IN [I]
|
||
|
||
1B4D 858E OBJLOC: STA I+LO ; SAVE LSB FOR ADDING
|
||
|
||
1B4F A200 LDX #0 ; CLEAR MSB
|
||
1B51 868F STX I+HI ; FOR SHIFTING
|
||
|
||
1B53 0A ASL A ; MULTIPLY BY 8
|
||
1B54 268F ROL I+HI
|
||
1B56 0A ASL A
|
||
1B57 268F ROL I+HI
|
||
1B59 0A ASL A
|
||
1B5A 268F ROL I+HI
|
||
|
||
1B5C 18 CLC ; ADD TO ITSELF
|
||
1B5D 658E ADC I+LO ; TO GET TIMES 9
|
||
1B5F 9002 BCC OBJ1
|
||
1B61 E68F INC I+HI
|
||
|
||
1B63 18 OBJ1: CLC
|
||
1B64 6935 ADC #53 ; NOW ADD 53
|
||
1B66 9002 BCC OBJ2 ; (THE OBJECT TABLE OFFSET)
|
||
1B68 E68F INC I+HI
|
||
|
||
1B6A 18 OBJ2: CLC ; NEXT ADD THE ABS ADDR
|
||
1B6B 65B2 ADC OBJTAB+LO ; OF THE OBJECT TABLE
|
||
1B6D 858E STA I+LO
|
||
|
||
1B6F A58F LDA I+HI
|
||
1B71 65B3 ADC OBJTAB+HI
|
||
1B73 858F STA I+HI
|
||
1B75 60 RTS
|
||
|
||
1B76 ; -----------------------------
|
||
1B76 ; GET ADDRESS OF PROPERTY TABLE
|
||
1B76 ; -----------------------------
|
||
|
||
1B76 ; EXIT: [I] HAS ABSOLUTE ADDR OF PROPERTY TABLE
|
||
1B76 ; [Y] HAS OFFSET TO START OF PROP IDS
|
||
|
||
1B76 A582 PROPB: LDA ARG1+LO
|
||
1B78 204D1B JSR OBJLOC
|
||
1B7B A007 LDY #7
|
||
1B7D B18E LDA (I),Y ; GET MSB OF P-TABLE ADDRESS
|
||
1B7F 18 CLC
|
||
1B80 65A3 ADC ZCODE ; MAKE IT ABSOLUTE
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 81
|
||
--- OBJECT & PROPERTY HANDLERS ---
|
||
|
||
1B82 AA TAX ; AND SAVE HERE
|
||
1B83 C8 INY
|
||
1B84 B18E LDA (I),Y ; NOW GET LSB
|
||
1B86 858E STA I+LO
|
||
1B88 868F STX I+HI ; [I] NOW POINTS TO PROP TABLE
|
||
|
||
1B8A A000 LDY #0
|
||
1B8C B18E LDA (I),Y ; GET LENGTH OF SHORT DESC
|
||
1B8E 0A ASL A ; WORD-ALIGN IT
|
||
1B8F A8 TAY ; EXPECTED HERE
|
||
1B90 C8 INY ; POINT JUST PAST THE DESCRIPTION
|
||
1B91 60 RTS
|
||
|
||
1B92 ; -------------------
|
||
1B92 ; FETCH A PROPERTY ID
|
||
1B92 ; -------------------
|
||
|
||
1B92 ; ENTRY: LIKE "PROPB" EXIT
|
||
|
||
1B92 B18E PROPN: LDA (I),Y
|
||
1B94 291F AND #%00011111 ; MASK OUT LENGTH BITS
|
||
1B96 60 RTS
|
||
|
||
1B97 ; -------------------------------
|
||
1B97 ; FETCH # BYTES IN PROPERTY VALUE
|
||
1B97 ; -------------------------------
|
||
|
||
1B97 ; ENTRY: LIKE "PROPB" EXIT
|
||
|
||
1B97 B18E PROPL: LDA (I),Y
|
||
1B99 4A LSR A ; LENGTH IS IN
|
||
1B9A 4A LSR A ; BITS 7-5
|
||
1B9B 4A LSR A ; SO SHIFT INTO PLACE
|
||
1B9C 4A LSR A
|
||
1B9D 4A LSR A
|
||
1B9E 60 RTS
|
||
|
||
1B9F ; ----------------------
|
||
1B9F ; POINT TO NEXT PROPERTY
|
||
1B9F ; ----------------------
|
||
|
||
1B9F ; ENTRY: LIKE "PROPB" EXIT
|
||
|
||
1B9F 20971B PROPNX: JSR PROPL ; GET LENGTH OF CURRENT PROP
|
||
1BA2 AA TAX ; SAVE HERE
|
||
|
||
1BA3 C8 PPX: INY ; LOOP UNTIL
|
||
1BA4 CA DEX ; [Y] POINTS TO
|
||
1BA5 10FC BPL PPX ; START OF NEXT PROP
|
||
1BA7 C8 INY ; CORRECT ALIGNMENT
|
||
1BA8 60 RTS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 82
|
||
--- OBJECT & PROPERTY HANDLERS ---
|
||
|
||
|
||
1BA9 ; ----------------
|
||
1BA9 ; GET OBJECT FLAGS
|
||
1BA9 ; ----------------
|
||
|
||
1BA9 ; ENTRY: OBJECT # IN [ARG1], FLAG # IN [ARG2]
|
||
1BA9 ; EXIT: FLAG WORD IN [K], BIT ID IN [J],
|
||
1BA9 ; FLAG WORD ADDRESS IN [I]
|
||
|
||
1BA9 A582 FLAGSU: LDA ARG1+LO
|
||
1BAB 204D1B JSR OBJLOC ; GET OBJECT ADDR IN [I]
|
||
|
||
1BAE A584 LDA ARG2+LO ; LOOK AT FLAG ID
|
||
1BB0 C910 CMP #$10 ; FIRST SET OF FLAGS?
|
||
1BB2 900F BCC FLS1 ; YES, ADDR IN [I] IS CORRECT
|
||
|
||
1BB4 E910 SBC #16 ; ELSE ZERO-ALIGN FLAG INDEX
|
||
1BB6 AA TAX ; SAVE IT HERE
|
||
|
||
1BB7 A58E LDA I+LO ; ADD 2 TO ADDRESS IN [I]
|
||
1BB9 18 CLC ; TO POINT TO ADDRESS OF
|
||
1BBA 6902 ADC #2 ; 2ND FLAG WORD
|
||
1BBC 858E STA I+LO
|
||
1BBE 9002 BCC FLS0
|
||
1BC0 E68F INC I+HI
|
||
|
||
1BC2 8A FLS0: TXA ; RESTORE INDEX
|
||
|
||
1BC3 8592 FLS1: STA K+LO ; SAVE FLAG ID HERE
|
||
|
||
1BC5 A201 LDX #1 ; INIT THE
|
||
1BC7 8690 STX J+LO ; FLAG WORD TO
|
||
1BC9 CA DEX ; $0001
|
||
1BCA 8691 STX J+HI
|
||
|
||
1BCC A90F LDA #15 ; SUBTRACT THE BIT POSITION
|
||
1BCE 38 SEC ; FROM 15
|
||
1BCF E592 SBC K+LO ; TO GET THE SHIFT LOOP
|
||
1BD1 AA TAX ; INDEX
|
||
1BD2 F007 BEQ FLS2 ; EXIT NOW IF NO SHIFT NEEDED
|
||
|
||
1BD4 0690 FLSL: ASL J+LO ; SHIFT THE BIT
|
||
1BD6 2691 ROL J+HI ; INTO POSITION
|
||
1BD8 CA DEX
|
||
1BD9 D0F9 BNE FLSL
|
||
|
||
1BDB A000 FLS2: LDY #0 ; MOVE THE FLAG WORD
|
||
1BDD B18E LDA (I),Y ; INTO [J]
|
||
1BDF 8593 STA K+HI ; FIRST THE MSB
|
||
1BE1 C8 INY
|
||
1BE2 B18E LDA (I),Y
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 83
|
||
--- OBJECT & PROPERTY HANDLERS ---
|
||
|
||
1BE4 8592 STA K+LO ; THEN THE LSB
|
||
1BE6 60 RTS
|
||
|
||
END
|
||
|
||
INCLUD IO.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 84
|
||
--- GAME I/O: ATARI ---
|
||
|
||
|
||
1BE7 ; --------------
|
||
1BE7 ; INTERNAL ERROR
|
||
1BE7 ; --------------
|
||
|
||
1BE7 ; ENTRY: ERROR CODE IN [A]
|
||
|
||
1BE7 496E7465 ERRM: DB "Internal error "
|
||
1BF6 30302E ENUMB: DB "00."
|
||
0012 ERRML EQU $-ERRM
|
||
|
||
1BF9 A001 ZERROR: LDY #1 ; CONVERT ERROR BYTE IN [A]
|
||
|
||
1BFB A200 ZERR0: LDX #0 ; TO ASCII AT "ENUMB"
|
||
1BFD C90A ZERR1: CMP #10
|
||
1BFF 9005 BCC ZERR2
|
||
1C01 E90A SBC #10
|
||
1C03 E8 INX
|
||
1C04 D0F7 BNE ZERR1
|
||
|
||
1C06 0930 ZERR2: ORA #'0'
|
||
1C08 99F61B STA ENUMB,Y
|
||
1C0B 8A TXA
|
||
1C0C 88 DEY
|
||
1C0D 10EC BPL ZERR0
|
||
|
||
1C0F 20C71C JSR ZCRLF ; CLEAR LINE BUFFER
|
||
|
||
1C12 A900 LDA #0
|
||
1C14 85DF STA SCRIPT ; DISABLE SCRIPTING
|
||
|
||
1C16 A2E7 LDX #LOW ERRM
|
||
1C18 A91B LDA #HIGH ERRM
|
||
1C1A A012 LDY #ERRML
|
||
1C1C 20C21F JSR DLINE
|
||
|
||
1C1F ; FALL THROUGH ...
|
||
|
||
1C1F ; ----
|
||
1C1F ; QUIT
|
||
1C1F ; ----
|
||
|
||
1C1F 20C71C ZQUIT: JSR ZCRLF
|
||
|
||
1C22 A231 LDX #LOW TORES
|
||
1C24 A91C LDA #HIGH TORES
|
||
1C26 A00D LDY #TORESL
|
||
1C28 20C21F JSR DLINE ; "END OF STORY"
|
||
|
||
1C2B 20C71C JSR ZCRLF
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 85
|
||
--- GAME I/O: ATARI ---
|
||
|
||
1C2E 4C2E1C FREEZE: JMP FREEZE
|
||
|
||
1C31 456E6420 TORES: DB "End of story."
|
||
000D TORESL EQU $-TORES
|
||
|
||
1C3E ; -------
|
||
1C3E ; RESTART
|
||
1C3E ; -------
|
||
|
||
1C3E 207B23 ZSTART: JSR SIDE1 ; PROMPT FOR SIDE 1
|
||
|
||
1C41 AD1126 LDA ZBEGIN+ZSCRIP+1 ; SAVE THE STATE OF
|
||
1C44 2901 AND #%00000001 ; THE SCRIPT FLAG
|
||
1C46 8DD81F STA SFLAG ; (BM 5/14/85)
|
||
|
||
1C49 4CAE0C JMP WARM ; AND DO A WARMSTART
|
||
|
||
1C4C ; --------------------
|
||
1C4C ; PRINT VERSION NUMBER
|
||
1C4C ; --------------------
|
||
|
||
1C4C 41746172 VERS: DB "Atari Version D"
|
||
000F VERSL EQU $-VERS
|
||
|
||
1C5B 20C71C VERNUM: JSR ZCRLF ; FLUSH BUFFER
|
||
|
||
1C5E A24C LDX #LOW VERS
|
||
1C60 A91C LDA #HIGH VERS
|
||
1C62 A00F LDY #VERSL
|
||
1C64 20C21F JSR DLINE ; "VERSION X"
|
||
|
||
1C67 4C7B23 JMP SIDE1 ; GET SIDE 1 & RETURN
|
||
|
||
1C6A ; --------------------------
|
||
1C6A ; RETURN TOP RAM PAGE IN [A]
|
||
1C6A ; --------------------------
|
||
|
||
1C6A A200 MEMTOP: LDX #0
|
||
1C6C 8E00B0 STX $B000 ; CLEAR THIS CELL
|
||
1C6F AD00B0 LDA $B000 ; TEST IT
|
||
1C72 D00B BNE NOT48K ; NOT 48K IF NZ
|
||
1C74 CE00B0 DEC $B000 ; SET TO $FF
|
||
1C77 AD00B0 LDA $B000 ; TEST AGAIN
|
||
1C7A 1003 BPL NOT48K ; NOT 48K IF POSITIVE
|
||
1C7C A9BB LDA #$BB ; ELSE RETURN 48K
|
||
1C7E 60 RTS
|
||
|
||
1C7F 8A NOT48K: TXA ; RETURN 0 IN [A]
|
||
1C80 60 RTS
|
||
|
||
1C81 ; --------------------------------
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 86
|
||
--- GAME I/O: ATARI ---
|
||
|
||
1C81 ; RETURN RANDOM BYTES IN [A] & [X]
|
||
1C81 ; --------------------------------
|
||
|
||
1C81 AD0AD2 RANDOM: LDA MRAND
|
||
1C84 EA NOP
|
||
1C85 AE0AD2 LDX MRAND
|
||
1C88 60 RTS
|
||
|
||
1C89 ; -------------------
|
||
1C89 ; Z-PRINT A CHARACTER
|
||
1C89 ; -------------------
|
||
|
||
1C89 ; ENTRY: ASCII CHAR IN [A]
|
||
|
||
1C89 C90D COUT: CMP #$0D ; IF ASCII EOL,
|
||
1C8B F03A BEQ ZCRLF ; DO IT!
|
||
1C8D C920 CMP #SPACE ; IGNORE ALL OTHER
|
||
1C8F 900B BCC CEX ; CONTROLS
|
||
|
||
1C91 A6DD LDX LENGTH ; ELSE GET LINE POINTER
|
||
1C93 9D800A STA LBUFF,X ; ADD CHAR TO BUFFER
|
||
1C96 E027 CPX #XSIZE ; END OF LINE?
|
||
1C98 B003 BCS FLUSH ; YES, FLUSH THE LINE
|
||
1C9A E6DD INC LENGTH ; ELSE UPDATE POINTER
|
||
|
||
1C9C 60 CEX: RTS
|
||
|
||
1C9D ; -------------------
|
||
1C9D ; FLUSH OUTPUT BUFFER
|
||
1C9D ; -------------------
|
||
|
||
1C9D ; ENTRY: LENGTH OF BUFFER IN [X]
|
||
|
||
1C9D A920 FLUSH: LDA #SPACE
|
||
|
||
1C9F DD800A FL0: CMP LBUFF,X ; FIND LAST SPACE CHAR
|
||
1CA2 F005 BEQ FL1 ; IN THE LINE
|
||
1CA4 CA DEX
|
||
1CA5 D0F8 BNE FL0 ; IF NONE FOUND,
|
||
1CA7 A227 LDX #XSIZE ; FLUSH ENTIRE LINE
|
||
|
||
1CA9 86DE FL1: STX OLDLEN ; SAVE OLD LINE POS HERE
|
||
1CAB 86DD STX LENGTH ; MAKE IT THE NEW LINE LENGTH
|
||
|
||
1CAD 20C71C JSR ZCRLF ; PRINT LINE UP TO LAST SPACE
|
||
|
||
1CB0 ; START NEW LINE WITH REMAINDER OF OLD
|
||
|
||
1CB0 A6DE LDX OLDLEN ; GET OLD LINE POS
|
||
1CB2 A000 LDY #0 ; START NEW LINE AT BEGINNING
|
||
1CB4 E8 FL2: INX
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 87
|
||
--- GAME I/O: ATARI ---
|
||
|
||
1CB5 E027 CPX #XSIZE ; CONTINUE IF
|
||
1CB7 9005 BCC FL3 ; INSIDE OR
|
||
1CB9 F003 BEQ FL3 ; AT END OF LINE
|
||
1CBB 84DD STY LENGTH ; ELSE SET NEW LINE LENGTH
|
||
1CBD 60 RTS
|
||
|
||
1CBE BD800A FL3: LDA LBUFF,X ; GET CHAR FROM OLD LINE
|
||
1CC1 99800A STA LBUFF,Y ; MOVE TO START OF NEW LINE
|
||
1CC4 C8 INY ; UPDATE LENGTH OF NEW LINE
|
||
1CC5 D0ED BNE FL2
|
||
|
||
1CC7 ; ---------------
|
||
1CC7 ; CARRIAGE RETURN
|
||
1CC7 ; ---------------
|
||
|
||
1CC7 E6E0 ZCRLF: INC LINCNT ; NEW LINE GOING OUT
|
||
1CC9 A5E0 LDA LINCNT ; IS IT TIME TO
|
||
1CCB C5E1 CMP LMAX ; PRINT "MORE" YET?
|
||
1CCD 9028 BCC CR1 ; NO, CONTINUE
|
||
|
||
1CCF ; SCREEN FULL; PRINT "MORE"
|
||
|
||
1CCF 20201D JSR ZUSL ; UPDATE STATUS LINE
|
||
|
||
1CD2 A900 LDA #0
|
||
1CD4 85E0 STA LINCNT ; RESET LINE COUNTER
|
||
|
||
1CD6 A205 LDX #5 ; POKE "[MORE]" INTO BOTTOM LEFT CORNER
|
||
1CD8 BD1A1D ZCRMP: LDA MORE,X
|
||
1CDB 9DD8BF STA SCREEN+920,X
|
||
1CDE CA DEX
|
||
1CDF 10F7 BPL ZCRMP
|
||
|
||
1CE1 A9FF LDA #$FF ; WAIT FOR ANY KEY
|
||
1CE3 8DFC02 STA CH
|
||
1CE6 ADFC02 ZCR0: LDA CH
|
||
1CE9 C9FF CMP #$FF
|
||
1CEB F0F9 BEQ ZCR0
|
||
|
||
1CED A205 LDX #5 ; ERASE "[MORE]"
|
||
1CEF A900 LDA #0
|
||
1CF1 9DD8BF ZCRME: STA SCREEN+920,X
|
||
1CF4 CA DEX
|
||
1CF5 10FA BPL ZCRME
|
||
|
||
1CF7 A6DD CR1: LDX LENGTH
|
||
1CF9 A99B LDA #EOL ; INSTALL EOL AT
|
||
1CFB 9D800A STA LBUFF,X ; END OF CURRENT LINE
|
||
1CFE E6DD INC LENGTH ; UPDATE LINE LENGTH
|
||
|
||
1D00 A4DD LINOUT: LDY LENGTH ; IF BUFFER EMPTY,
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 88
|
||
--- GAME I/O: ATARI ---
|
||
|
||
1D02 F015 BEQ LINEX ; DON'T PRINT ANYTHING
|
||
1D04 84EA STY PRLEN ; SAVE LENGTH HERE FOR "PPRINT"
|
||
|
||
1D06 A200 LDX #0 ; SEND CONTENTS OF [LBUFF]
|
||
1D08 BD800A LOUT: LDA LBUFF,X ; TO SCREEN
|
||
1D0B 20EB1E JSR CHAR
|
||
1D0E E8 INX
|
||
1D0F 88 DEY
|
||
1D10 D0F6 BNE LOUT
|
||
|
||
1D12 20D91F JSR PPRINT ; PRINT [LBUFF] IF ENABLED
|
||
1D15 A900 LDA #0 ; RESET LINE LENGTH
|
||
1D17 85DD STA LENGTH ; TO ZERO
|
||
|
||
1D19 60 LINEX: RTS ; AND RETURN
|
||
|
||
1D1A BB MORE: DB 59+128 ; INVERSE "[MORE]"
|
||
1D1B AD DB 45+128 ; IN ATARI SCREEN CODE
|
||
1D1C AF DB 47+128
|
||
1D1D B2 DB 50+128
|
||
1D1E A5 DB 37+128
|
||
1D1F BD DB 61+128
|
||
|
||
1D20 ; ----------------------
|
||
1D20 ; UPDATE THE STATUS LINE
|
||
1D20 ; ----------------------
|
||
|
||
1D20 A555 ZUSL: LDA COLCRS+LO ; SAVE THE
|
||
1D22 48 PHA ; CURRENT
|
||
1D23 A554 LDA ROWCRS ; CURSOR
|
||
1D25 48 PHA ; POSITION
|
||
|
||
1D26 A5DD LDA LENGTH ; SAVE ALL
|
||
1D28 48 PHA ; STRING-PRINTING
|
||
1D29 A59E LDA MPCH ; VARIABLES
|
||
1D2B 48 PHA
|
||
1D2C A59D LDA MPCM
|
||
1D2E 48 PHA
|
||
1D2F A59C LDA MPCL
|
||
1D31 48 PHA
|
||
1D32 A5CA LDA TSET
|
||
1D34 48 PHA
|
||
1D35 A5C9 LDA PSET
|
||
1D37 48 PHA
|
||
1D38 A5CF LDA ZWORD+HI
|
||
1D3A 48 PHA
|
||
1D3B A5CE LDA ZWORD+LO
|
||
1D3D 48 PHA
|
||
1D3E A5CD LDA ZFLAG
|
||
1D40 48 PHA
|
||
1D41 A5DB LDA DIGITS
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 89
|
||
--- GAME I/O: ATARI ---
|
||
|
||
1D43 48 PHA
|
||
|
||
1D44 A227 LDX #XSIZE
|
||
1D46 BD800A USL0: LDA LBUFF,X ; MOVE CONTENTS OF [LBUFF]
|
||
1D49 9D200A STA BUFSAV,X ; TO [BUFSAV]
|
||
1D4C A920 LDA #SPACE ; CLEAR
|
||
1D4E 9D800A STA LBUFF,X ; [LBUFF] WITH SPACES
|
||
1D51 CA DEX
|
||
1D52 10F2 BPL USL0
|
||
|
||
1D54 A900 LDA #0
|
||
1D56 85DD STA LENGTH ; RESET LINE LENGTH
|
||
1D58 85DF STA SCRIPT ; DISABLE SCRIPTING
|
||
1D5A 8555 STA COLCRS+LO ; HOME THE
|
||
1D5C 8554 STA ROWCRS ; CURSOR
|
||
|
||
1D5E ; PRINT ROOM DESCRIPTION
|
||
|
||
1D5E A910 LDA #16 ; GLOBAL VAR #16 (ROOM ID)
|
||
1D60 20C10E JSR GETVRG ; GET IT INTO [VALUE]
|
||
1D63 A58C LDA VALUE+LO
|
||
1D65 20DF11 JSR PRNTDC ; PRINT SHORT ROOM DESCRIPTION
|
||
|
||
1D68 A917 LDA #23 ; MOVE LINE INDEX UP
|
||
1D6A 85DD STA LENGTH ; TO TIME/SCORE POSITION
|
||
|
||
1D6C A920 LDA #SPACE ; TRUNCATE LONG DESCS
|
||
1D6E 20891C JSR COUT ; WITH A SPACE
|
||
|
||
1D71 A911 LDA #17 ; GLOBAL VAR #17 (SCORE/HOURS)
|
||
1D73 20C10E JSR GETVRG ; GET IT INTO [VALUE]
|
||
|
||
1D76 A5DC LDA TIMEFL ; GET MODE FLAG
|
||
1D78 D032 BNE DOTIME ; USE TIME MODE IF NON-ZERO
|
||
|
||
1D7A ; PRINT "SCORE"
|
||
|
||
1D7A A953 LDA #'S'
|
||
1D7C 20891C JSR COUT
|
||
1D7F A963 LDA #'c'
|
||
1D81 20891C JSR COUT
|
||
1D84 A96F LDA #'o'
|
||
1D86 20891C JSR COUT
|
||
1D89 A972 LDA #'r'
|
||
1D8B 20891C JSR COUT
|
||
1D8E A965 LDA #'e'
|
||
1D90 20891C JSR COUT
|
||
1D93 A93A LDA #':'
|
||
1D95 20891C JSR COUT
|
||
1D98 A920 LDA #SPACE
|
||
1D9A 20891C JSR COUT
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 90
|
||
--- GAME I/O: ATARI ---
|
||
|
||
|
||
1D9D A58C LDA VALUE+LO ; MOVE SCORE VALUE
|
||
1D9F 85D3 STA QUOT+LO ; INTO [QUOT]
|
||
1DA1 A58D LDA VALUE+HI ; FOR PRINTING
|
||
1DA3 85D4 STA QUOT+HI
|
||
1DA5 202E16 JSR NUMBER ; PRINT SCORE VALUE IN DECIMAL
|
||
|
||
1DA8 A92F LDA #'/' ; PRINT A SLASH
|
||
1DAA D035 BNE MOVMIN ; BRANCH ALWAYS
|
||
|
||
1DAC ; PRINT "TIME"
|
||
|
||
1DAC A954 DOTIME: LDA #'T'
|
||
1DAE 20891C JSR COUT
|
||
1DB1 A969 LDA #'i'
|
||
1DB3 20891C JSR COUT
|
||
1DB6 A96D LDA #'m'
|
||
1DB8 20891C JSR COUT
|
||
1DBB A965 LDA #'e'
|
||
1DBD 20891C JSR COUT
|
||
1DC0 A93A LDA #':'
|
||
1DC2 20891C JSR COUT
|
||
1DC5 A920 LDA #SPACE
|
||
1DC7 20891C JSR COUT
|
||
|
||
1DCA A58C LDA VALUE+LO ; 00 IS REALLY 24
|
||
1DCC D002 BNE DT0
|
||
1DCE A918 LDA #24
|
||
1DD0 C90D DT0: CMP #13 ; IS HOURS > 12,
|
||
1DD2 9002 BCC DT1
|
||
1DD4 E90C SBC #12 ; CONVERT TO 1-12
|
||
1DD6 85D3 DT1: STA QUOT+LO ; MOVE FOR PRINTING
|
||
1DD8 A900 LDA #0
|
||
1DDA 85D4 STA QUOT+HI ; CLEAR MSB
|
||
1DDC 202E16 JSR NUMBER
|
||
|
||
1DDF A93A LDA #':' ; COLON
|
||
|
||
1DE1 20891C MOVMIN: JSR COUT ; PRINT SLASH OR COLON
|
||
|
||
1DE4 A912 LDA #18 ; GLOBAL VAR #18 (MOVES/MINUTES)
|
||
1DE6 20C10E JSR GETVRG ; GET IT INTO [VALUE]
|
||
1DE9 A58C LDA VALUE+LO ; MOVE TO [QUOT]
|
||
1DEB 85D3 STA QUOT+LO ; FOR EVENTUAL PRINTING
|
||
1DED A58D LDA VALUE+HI
|
||
1DEF 85D4 STA QUOT+HI
|
||
|
||
1DF1 A5DC LDA TIMEFL ; WHICH MODE?
|
||
1DF3 D006 BNE DOMINS ; TIME IF NZ
|
||
|
||
1DF5 ; PRINT NUMBER OF MOVES
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 91
|
||
--- GAME I/O: ATARI ---
|
||
|
||
|
||
1DF5 202E16 JSR NUMBER ; SHOW # MOVES
|
||
1DF8 4C271E JMP STATEX ; ALL DONE
|
||
|
||
1DFB ; PRINT MINUTES
|
||
|
||
1DFB A58C DOMINS: LDA VALUE+LO ; CHECK MINUTES
|
||
1DFD C90A CMP #10 ; IF MORE THAN TEN
|
||
1DFF B005 BCS DOM0 ; CONTINUE
|
||
|
||
1E01 A930 LDA #'0' ; ELSE PRINT A
|
||
1E03 20891C JSR COUT ; PADDING "0" FIRST
|
||
|
||
1E06 202E16 DOM0: JSR NUMBER ; SHOW MINUTES
|
||
|
||
1E09 A920 LDA #SPACE
|
||
1E0B 20891C JSR COUT ; SEPARATE THINGS
|
||
|
||
1E0E A911 LDA #17 ; CHECK "HOURS" AGAIN
|
||
1E10 20C10E JSR GETVRG
|
||
1E13 A58C LDA VALUE+LO
|
||
1E15 C90C CMP #12 ; PAST NOON?
|
||
1E17 B004 BCS DOPM ; YES, PRINT "PM"
|
||
|
||
1E19 A961 LDA #'a' ; ELSE PRINT "AM"
|
||
1E1B D002 BNE DOXM ; BRANCH ALWAYS
|
||
|
||
1E1D A970 DOPM: LDA #'p'
|
||
|
||
1E1F 20891C DOXM: JSR COUT
|
||
1E22 A96D LDA #'m'
|
||
1E24 20891C JSR COUT
|
||
|
||
1E27 ; STATUS LINE READY
|
||
|
||
1E27 A227 STATEX: LDX #XSIZE
|
||
1E29 A980 LDA #$80 ; CLEAR THE
|
||
1E2B 9D40BC STX0: STA SCREEN,X ; STATUS LINE!
|
||
1E2E CA DEX
|
||
1E2F D0FA BNE STX0
|
||
1E31 BD800A STX1: LDA LBUFF,X ; GET A CHAR FROM [LBUFF]
|
||
1E34 0980 ORA #%10000000 ; CONVERT TO INVERSE VIDEO
|
||
1E36 20EB1E JSR CHAR ; SEND TO SCREEN
|
||
1E39 E8 INX ; LOOP TILL
|
||
1E3A E4DD CPX LENGTH ; ALL CHARS SENT
|
||
1E3C 90F3 BCC STX1
|
||
|
||
1E3E A227 LDX #XSIZE ; RESTORE OLD [LBUFF]
|
||
1E40 BD200A STX2: LDA BUFSAV,X
|
||
1E43 9D800A STA LBUFF,X
|
||
1E46 CA DEX
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 92
|
||
--- GAME I/O: ATARI ---
|
||
|
||
1E47 10F7 BPL STX2
|
||
|
||
1E49 68 PLA ; RESTORE ALL
|
||
1E4A 85DB STA DIGITS ; SAVED VARIABLES
|
||
1E4C 68 PLA
|
||
1E4D 85CD STA ZFLAG
|
||
1E4F 68 PLA
|
||
1E50 85CE STA ZWORD+LO
|
||
1E52 68 PLA
|
||
1E53 85CF STA ZWORD+HI
|
||
1E55 68 PLA
|
||
1E56 85C9 STA PSET
|
||
1E58 68 PLA
|
||
1E59 85CA STA TSET
|
||
1E5B 68 PLA
|
||
1E5C 859C STA MPCL
|
||
1E5E 68 PLA
|
||
1E5F 859D STA MPCM
|
||
1E61 68 PLA
|
||
1E62 859E STA MPCH
|
||
1E64 68 PLA
|
||
1E65 85DD STA LENGTH
|
||
|
||
1E67 68 PLA ; RESTORE THE
|
||
1E68 8554 STA ROWCRS ; CURSOR POSITION
|
||
1E6A 68 PLA
|
||
1E6B 8555 STA COLCRS+LO
|
||
|
||
1E6D A2FF LDX #$FF
|
||
1E6F 86DF STX SCRIPT ; RE-ENABLE SCRIPTING
|
||
1E71 E8 INX ; = 0
|
||
1E72 869F STX MPCFLG ; INVALIDATE [MPC]
|
||
1E74 4CB120 JMP NEWLOG ; RESET THE LINE MAP & RETURN
|
||
|
||
END
|
||
INCLUD MACHINE.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 93
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
|
||
1E77 ; ----------------------------
|
||
1E77 ; FETCH ASCII KEYCODE INTO [A]
|
||
1E77 ; ----------------------------
|
||
|
||
1E77 ; EXIT: ASCII IN [A] & [IOCHAR]
|
||
|
||
1E77 20BD20 BADKEY: JSR BOOP
|
||
1E7A 4C821E JMP GKEY0
|
||
|
||
1E7D D8 GETKEY: CLD
|
||
1E7E 8A TXA ; SAVE [X] & [Y]
|
||
1E7F 48 PHA
|
||
1E80 98 TYA
|
||
1E81 48 PHA
|
||
|
||
1E82 A900 GKEY0: LDA #0
|
||
1E84 85F6 STA BLINK+LO ; LENGTHEN BLINK DELAY
|
||
1E86 85F7 STA BLINK+HI ; TO MAXIMUM
|
||
|
||
1E88 A555 LDA COLCRS+LO ; CALC CURSOR X-POS
|
||
1E8A 0A ASL A
|
||
1E8B 0A ASL A
|
||
1E8C 18 CLC
|
||
1E8D 6930 ADC #48
|
||
1E8F 8D04D0 STA HPOSM0
|
||
|
||
1E92 A554 LDA ROWCRS ; CALC CURSOR Y-POS
|
||
1E94 0A ASL A
|
||
1E95 0A ASL A
|
||
1E96 0A ASL A
|
||
1E97 18 CLC
|
||
1E98 6927 ADC #39
|
||
1E9A A8 TAY ; MOVE HERE FOR DRAWING
|
||
|
||
1E9B A903 LDA #%00000011 ; FORCE CURSOR "ON"
|
||
1E9D 85F8 STA CSHAPE
|
||
1E9F 99000B STA MISSL,Y ; AND DRAW IT
|
||
|
||
1EA2 AEFC02 GKEY1: LDX CH ; CHECK HARDWARE FOR A KEYPRESS
|
||
|
||
1EA5 E6F6 INC BLINK+LO
|
||
1EA7 D011 BNE NOBLIN
|
||
1EA9 E6F7 INC BLINK+HI
|
||
1EAB D00D BNE NOBLIN
|
||
|
||
1EAD A980 LDA #$80
|
||
1EAF 85F7 STA BLINK+HI ; RESET BLINK TIMER
|
||
|
||
1EB1 A5F8 LDA CSHAPE
|
||
1EB3 4903 EOR #%00000011
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 94
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
1EB5 85F8 STA CSHAPE ; FLIP CURSOR SHAPE
|
||
1EB7 99000B STA MISSL,Y ; DRAW CURSOR INTO MISSILE RAM
|
||
|
||
1EBA E0FF NOBLIN: CPX #$FF ; KEY PRESSED?
|
||
1EBC F0E4 BEQ GKEY1 ; NO, KEEP SCANNING
|
||
|
||
1EBE A9FF LDA #$FF
|
||
1EC0 8DFC02 STA CH ; RESET KEY HARDWARE
|
||
|
||
1EC3 8A TXA
|
||
1EC4 30B1 BMI BADKEY ; REJECT CTRL KEYS
|
||
|
||
1EC6 BD2621 LDA ATASCI,X ; GET CODE INTO [A]
|
||
1EC9 C99B CMP #EOL ; WAS IT EOL?
|
||
1ECB F003 BEQ CLICK ; OKAY IF SO
|
||
1ECD AA TAX ; ANY OTHER NEGATIVE CODE
|
||
1ECE 30A7 BMI BADKEY ; IS ILLEGAL
|
||
|
||
1ED0 ; ERASE CURSOR, "CLICK" THE SPEAKER
|
||
|
||
1ED0 85E2 CLICK: STA IOCHAR ; SAVE KEYCODE
|
||
1ED2 A900 LDA #0
|
||
1ED4 99000B STA MISSL,Y ; ERASE CURSOR
|
||
|
||
1ED7 A080 LDY #$80
|
||
1ED9 8C1FD0 CLK0: STY CONSOL
|
||
1EDC A208 LDX #8
|
||
1EDE CA CLK1: DEX
|
||
1EDF D0FD BNE CLK1
|
||
1EE1 88 DEY
|
||
1EE2 D0F5 BNE CLK0
|
||
|
||
1EE4 68 PLA ; RESTORE
|
||
1EE5 A8 TAY ; EVERYTHING
|
||
1EE6 68 PLA
|
||
1EE7 AA TAX
|
||
1EE8 A5E2 LDA IOCHAR ; GET CHAR INTO [A]
|
||
1EEA 60 RTS ; AND RETURN IT
|
||
|
||
1EEB ; -----------------
|
||
1EEB ; PRINT CHAR IN [A]
|
||
1EEB ; -----------------
|
||
|
||
1EEB 85E2 CHAR: STA IOCHAR ; SAVE HERE
|
||
1EED 8A TXA ; SAVE [X] AND [Y]
|
||
1EEE 48 PHA
|
||
1EEF 98 TYA
|
||
1EF0 48 PHA
|
||
|
||
1EF1 A454 LDY ROWCRS ; Y-POS INTO [Y]
|
||
1EF3 A655 LDX COLCRS+LO ; X-POS INTO [X]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 95
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
|
||
1EF5 A5E2 LDA IOCHAR ; RESTORE CHAR
|
||
1EF7 C99B CMP #EOL ; IS IT EOL?
|
||
1EF9 F056 BEQ OUTEOL ; YES, SPECIAL HANDLING
|
||
1EFB C90D CMP #$0D ; ALSO CHECK FOR
|
||
1EFD F052 BEQ OUTEOL ; ASCII EOL
|
||
|
||
1EFF ; HANDLE A NON-EOL CHAR
|
||
|
||
1EFF C016 CPY #YSIZE-1 ; ON LAST SCREEN LINE?
|
||
1F01 9037 BCC NOSCRL ; NO, NO SCROLL NEEDED
|
||
1F03 E027 CPX #XSIZE ; LAST CHAR ON LINE?
|
||
1F05 9033 BCC NOSCRL ; NO, DON'T SCROLL
|
||
|
||
1F07 ; SCROLL THE SCREEN
|
||
|
||
1F07 88 DOSCRL: DEY ; PUSH CURSOR UP ONE LINE
|
||
1F08 8454 STY ROWCRS
|
||
|
||
1F0A A6E3 LDX SLINE ; GET CURRENT SCROLL LINE
|
||
|
||
1F0C E017 SRL0: CPX #YSIZE
|
||
1F0E F020 BEQ SRL2 ; SCROLL DONE
|
||
|
||
1F10 BDF620 LDA LOLINE,X ; GET ADDR OF DEST LINE
|
||
1F13 85E7 STA LTO+LO ; INTO [LTO]
|
||
1F15 BD0E21 LDA HILINE,X
|
||
1F18 85E8 STA LTO+HI
|
||
|
||
1F1A E8 INX
|
||
1F1B BDF620 LDA LOLINE,X ; GET ADDR OF SOURCE LINE
|
||
1F1E 85E5 STA LFROM+LO ; INTO [LFROM]
|
||
1F20 BD0E21 LDA HILINE,X
|
||
1F23 85E6 STA LFROM+HI
|
||
|
||
1F25 A027 LDY #XSIZE
|
||
1F27 B1E5 SRL1: LDA (LFROM),Y ; MOVE SOURCE LINE
|
||
1F29 91E7 STA (LTO),Y ; TO DEST LINE
|
||
1F2B 88 DEY
|
||
1F2C 10F9 BPL SRL1
|
||
|
||
1F2E 30DC BMI SRL0 ; LOOP TILL [X] = YSIZE
|
||
|
||
1F30 A227 SRL2: LDX #XSIZE
|
||
1F32 A900 LDA #0
|
||
1F34 9DD8BF SRL3: STA SCREEN+920,X ; CLEAR LAST LINE
|
||
1F37 CA DEX ; OF SCREEN RAM
|
||
1F38 10FA BPL SRL3
|
||
|
||
1F3A A5E2 NOSCRL: LDA IOCHAR ; RESTORE CHAR
|
||
1F3C A20B LDX #$0B ; CIO "PUT CHAR"
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 96
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
1F3E 8E4203 STX ICCOM ; COMMAND
|
||
1F41 A200 LDX #0 ; IOCB #0 (E:)
|
||
1F43 8E4803 STX ICBLEN+LO ; ZERO THE
|
||
1F46 8E4903 STX ICBLEN+HI ; BUFFER LENGTH
|
||
1F49 2056E4 JSR CIOV ; SEND IT OUT!
|
||
|
||
1F4C 68 PLA ; RESTORE [X] AND [Y]
|
||
1F4D A8 TAY
|
||
1F4E 68 PLA
|
||
1F4F AA TAX
|
||
1F50 60 RTS
|
||
|
||
1F51 ; HANDLE EOL
|
||
|
||
1F51 A99B OUTEOL: LDA #$9B ; MAKE SURE [IOCHAR]
|
||
1F53 85E2 STA IOCHAR ; IS AN ATASCII EOL
|
||
1F55 C016 CPY #YSIZE-1 ; LAST SCREEN LINE?
|
||
1F57 90E1 BCC NOSCRL ; NO, DON'T SCROLL
|
||
1F59 B0AC BCS DOSCRL ; ELSE SCROLL
|
||
|
||
1F5B ; ---------------------
|
||
1F5B ; FETCH A LINE OF INPUT
|
||
1F5B ; ---------------------
|
||
|
||
1F5B ; ENTRY: ABS ADDR OF READ BUFFER IN [ARG1]
|
||
1F5B ; EXIT: # CHARS READ IN [A]
|
||
|
||
1F5B 20001D INPUT: JSR LINOUT ; FLUSH [LBUFF]
|
||
|
||
1F5E A0FF LDY #$FF
|
||
1F60 8CFC02 STY CH ; CLEAR KEYBOARD
|
||
1F63 C8 INY ; = 0
|
||
1F64 84E0 STY LINCNT ; RESET LINE COUNT
|
||
|
||
1F66 207D1E INLOOP: JSR GETKEY ; GET ASCII INTO [A] AND [IOCHAR]
|
||
|
||
1F69 C99B CMP #EOL ; EOL?
|
||
1F6B F02A BEQ ENDLIN ; LINE DONE IF SO
|
||
1F6D C97E CMP #BACKSP ; BACKSPACE?
|
||
1F6F F01C BEQ BACKUP ; SPECIAL HANDLING
|
||
|
||
1F71 99800A STA LBUFF,Y ; ELSE ADD CHAR TO INPUT BUFFER
|
||
1F74 C8 INY ; NEXT POSITION IN LINE
|
||
|
||
1F75 20EB1E SHOWIT: JSR CHAR ; SEND TO SCREEN
|
||
|
||
1F78 C04D CPY #77 ; 2 SCREEN LINES FULL?
|
||
1F7A 90EA BCC INLOOP ; NO, GET ANOTHER CHAR
|
||
|
||
1F7C ; HANDLE LINE OVERFLOW
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 97
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
1F7C 207D1E NOMORE: JSR GETKEY
|
||
1F7F C99B CMP #EOL ; IF EOL,
|
||
1F81 F014 BEQ ENDLIN ; WRAP UP THE LINE
|
||
1F83 C97E CMP #BACKSP ; BACKSPACE
|
||
1F85 F006 BEQ BACKUP ; IS OKAY TOO
|
||
1F87 20BD20 JSR BOOP ; ELSE COMPLAIN
|
||
1F8A 4C7C1F JMP NOMORE ; AND INSIST
|
||
|
||
1F8D ; HANDLE BACKSPACE
|
||
|
||
1F8D 88 BACKUP: DEY ; BACK UP THE POINTER
|
||
1F8E 10E5 BPL SHOWIT ; SEND BS IF NOT START OF LINE
|
||
1F90 20BD20 JSR BOOP ; ELSE SCREAM WITH PAIN
|
||
1F93 A000 LDY #0 ; RESET POINTER
|
||
1F95 F0CF BEQ INLOOP ; AND WAIT FOR SOMETHING BETTER
|
||
|
||
1F97 ; HANDLE END OF LINE
|
||
|
||
1F97 99800A ENDLIN: STA LBUFF,Y ; SHIP EOL TO BUFFER
|
||
1F9A C8 INY ; UPDATE INDEX
|
||
1F9B 84C2 STY LINLEN ; SAVE HERE FOR "READ"
|
||
1F9D 84EA STY PRLEN ; AND HERE FOR "PPRINT"
|
||
|
||
1F9F 20EB1E JSR CHAR ; AND SEND EOL TO SCREEN
|
||
|
||
1FA2 ; MOVE [LBUFF] TO [ARG1] W/LC CONVERSION
|
||
|
||
1FA2 B97F0A LEX0: LDA LBUFF-1,Y ; GET A CHAR FROM [LBUFF]
|
||
|
||
1FA5 C99B CMP #EOL ; ATASCII EOL?
|
||
1FA7 D004 BNE LEX1 ; IF SO,
|
||
1FA9 A90D LDA #$0D ; CONVERT TO ASCII
|
||
1FAB D00A BNE LEX2
|
||
|
||
1FAD C941 LEX1: CMP #'A' ; IF CHAR IS ALPHA,
|
||
1FAF 9006 BCC LEX2 ; CONVERT TO LOWER CASE
|
||
1FB1 C95B CMP #'Z'+1
|
||
1FB3 B002 BCS LEX2
|
||
1FB5 6920 ADC #$20
|
||
|
||
1FB7 9182 LEX2: STA (ARG1),Y ; MOVE CHAR TO INPUT BUFFER AT [ARG1]
|
||
1FB9 88 DEY ; LOOP TILL
|
||
1FBA 10E6 BPL LEX0 ; ALL CHARS MOVED
|
||
|
||
1FBC 20D91F JSR PPRINT ; SCRIPT [LBUFF] IF ENABLED
|
||
|
||
1FBF A5C2 LDA LINLEN ; RESTORE # CHARS
|
||
1FC1 60 RTS ; INTO [A]
|
||
|
||
1FC2 ; -----------------------
|
||
1FC2 ; DIRECT PRINT LINE [X/A]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 98
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
1FC2 ; -----------------------
|
||
|
||
1FC2 ; ENTRY: STRING ADDRESS IN [X/A] (LSB/MSB)
|
||
1FC2 ; STRING LENGTH IN [Y]
|
||
|
||
1FC2 8ECB1F DLINE: STX STRING+LO ; DROP STRING ADDRESS
|
||
1FC5 8DCC1F STA STRING+HI ; INTO DUMMY BYTES
|
||
|
||
1FC8 A200 LDX #0 ; INIT CHAR-FETCH INDEX
|
||
|
||
1FCA BD DOUT: DB $BD ; 6502 "LDA nnnn,X" OPCODE
|
||
1FCB 0000 STRING: DW $0000 ; DUMMY OPERAND BYTES
|
||
1FCD 20EB1E JSR CHAR
|
||
1FD0 E8 INX
|
||
1FD1 88 DEY ; LOOP TILL
|
||
1FD2 D0F6 BNE DOUT ; OUT OF CHARS
|
||
|
||
1FD4 60 RTS
|
||
|
||
1FD5 ; -----------------------
|
||
1FD5 ; SEND [LBUFF] TO PRINTER
|
||
1FD5 ; -----------------------
|
||
|
||
1FD5 ; ENTRY: LENTH OF LINE IN [PRLEN]
|
||
|
||
1FD5 503A PNAME: DB "P:" ; FILENAME FOR PRINTER
|
||
1FD7 9B DB EOL
|
||
|
||
1FD8 00 SFLAG: DB 0 ; PREVIOUS SCRIPTING STATE
|
||
|
||
1FD9 A5DF PPRINT: LDA SCRIPT ; SCRIPTING INTERNALLY ENABLED?
|
||
1FDB F06B BEQ PEX ; NO, SCRAM IMMEDIATELY
|
||
|
||
1FDD AD1126 LDA ZBEGIN+ZSCRIP+1 ; CHECK SCRIPT FLAG
|
||
1FE0 2901 AND #%00000001 ; SCRIPTING ON?
|
||
1FE2 F064 BEQ PEX ; NO, EXIT
|
||
|
||
1FE4 A5E9 LDA PSTAT ; CHECK PRINTER STATUS
|
||
1FE6 3060 BMI PEX ; CAN'T OPEN IF NEGATIVE
|
||
1FE8 D02F BNE PP1 ; ALREADY OPEN, SCRIPT THE LINE
|
||
|
||
1FEA ; OPEN THE PRINTER FOR OUTPUT
|
||
|
||
1FEA 203E20 JSR CLOSEP ; CLOSE IOCB #1 FIRST FOR SAFETY
|
||
|
||
1FED A210 LDX #$10 ; IOCB #1 (P:)
|
||
1FEF A9D5 LDA #LOW PNAME ; POINT
|
||
1FF1 9D4403 STA ICBADR+LO,X ; TO
|
||
1FF4 A91F LDA #HIGH PNAME ; P:
|
||
1FF6 9D4503 STA ICBADR+HI,X ; FILENAME
|
||
1FF9 A903 LDA #$03 ; CIO "OPEN"
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 99
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
1FFB 9D4203 STA ICCOM,X ; COMMAND
|
||
1FFE A908 LDA #$08 ; SET CHANNEL
|
||
2000 9D4A03 STA ICAUX1,X ; FOR WRITE-ONLY
|
||
2003 A900 LDA #0
|
||
2005 9D4B03 STA ICAUX2,X ; ZERO THIS BYTE
|
||
2008 2056E4 JSR CIOV ; OPEN IT!
|
||
200B 98 TYA ; STATUS CODE IN [Y]
|
||
200C 302C BMI BADP ; ERROR IF NEGATIVE
|
||
|
||
200E A970 LDA #$70
|
||
2010 8510 STA POKMSK
|
||
2012 8D0ED2 STA IRQEN ; DISABLE BREAK KEY
|
||
|
||
2015 A901 LDA #1 ; SET [PSTAT]
|
||
2017 85E9 STA PSTAT ; TO INDICATE "PRINTER READY"
|
||
|
||
2019 ; PRINT [LBUFF]
|
||
|
||
2019 A210 PP1: LDX #$10 ; IOCB #1 (P:)
|
||
201B A980 LDA #LOW LBUFF ; TELL CIO
|
||
201D 9D4403 STA ICBADR+LO,X ; WHERE
|
||
2020 A90A LDA #HIGH LBUFF ; [LBUFF]
|
||
2022 9D4503 STA ICBADR+HI,X ; IS HIDING
|
||
2025 A5EA LDA PRLEN ; # CHARS TO PRINT
|
||
2027 9D4803 STA ICBLEN+LO,X
|
||
202A A900 LDA #0 ; CLEAR THE
|
||
202C 9D4903 STA ICBLEN+HI,X ; MSB OF LINE LENGTH
|
||
202F A90B LDA #$0B ; CIO "PUT BUFFER" COMMAND (BM 4/9/85)
|
||
2031 9D4203 STA ICCOM,X ; COMMAND
|
||
2034 2056E4 JSR CIOV
|
||
2037 98 TYA
|
||
2038 100E BPL PEX ; EXIT IF NO ERROR
|
||
|
||
203A ; HANDLE PRINTER ERROR
|
||
|
||
203A A9FF BADP: LDA #$FF ; SET PRINTER STATUS
|
||
203C 85E9 STA PSTAT ; TO "CAN'T OPEN"
|
||
|
||
203E ; CLOSE PRINTER CHANNEL (IOCB #1)
|
||
|
||
203E A210 CLOSEP: LDX #$10 ; IOCB #1 (P:)
|
||
2040 A90C LDA #$0C ; CIO "CLOSE"
|
||
2042 9D4203 STA ICCOM,X ; COMMAND
|
||
2045 2056E4 JSR CIOV ; CLOSE THE CHANNEL
|
||
|
||
2048 60 PEX: RTS
|
||
|
||
2049 ; ------------
|
||
2049 ; SPLIT SCREEN
|
||
2049 ; ------------
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 100
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
2049 ; SPLIT SCREEN AT LINE [ARG1]
|
||
2049 ; DISABLE SPLIT IF [ARG1] = 0
|
||
2049 ; IGNORE IF SPLIT ALREADY ENABLED OR [ARG1] >= 20
|
||
|
||
2049 A682 ZSPLIT: LDX ARG1+LO ; IF [ARG1] = 0,
|
||
204B F02F BEQ OFFSPL ; TURN OFF SPLIT SCREEN
|
||
|
||
204D A5E4 LDA SPSTAT ; SPLIT ALREADY ENABLED?
|
||
204F D02A BNE SPLEX ; IGNORE REQUEST IF SO
|
||
|
||
2051 E014 CPX #20 ; IF [ARG1] >= 20,
|
||
2053 B026 BCS SPLEX ; IGNORE
|
||
|
||
2055 E8 INX
|
||
2056 86E3 STX SLINE ; ELSE SET NEW SPLIT LINE
|
||
2058 86E4 STX SPSTAT ; SET "SPLIT ENABLED" FLAG
|
||
|
||
205A BDF620 SPL0: LDA LOLINE,X ; MAKE [LFROM] POINT TO
|
||
205D 85E5 STA LFROM+LO ; LINE [X] IN WINDOW
|
||
205F BD0E21 LDA HILINE,X
|
||
2062 85E6 STA LFROM+HI
|
||
|
||
2064 A027 LDY #XSIZE ; CLEAR LINE [X]
|
||
2066 A900 LDA #0
|
||
2068 91E5 SPL1: STA (LFROM),Y
|
||
206A 88 DEY
|
||
206B 10FB BPL SPL1
|
||
|
||
206D CA DEX ; DONE ALL LINES?
|
||
206E D0EA BNE SPL0 ; LOOP TILL WINDOW CLEARED
|
||
2070 86E0 STX LINCNT ; RESET LINE COUNT TO ZERO
|
||
|
||
2072 A916 SPCALC: LDA #YSIZE-1 ; CALCULATE # LINES TO SCROLL
|
||
2074 38 SEC ; BEFORE "MORE" APPEARS:
|
||
2075 E5E3 SBC SLINE ; LMAX = YSIZE-SLINE-1
|
||
2077 85E1 STA LMAX
|
||
2079 C6E1 DEC LMAX
|
||
|
||
207B 60 SPLEX: RTS
|
||
|
||
207C ; --------------------
|
||
207C ; DISABLE SPLIT SCREEN
|
||
207C ; --------------------
|
||
|
||
207C 20A720 OFFSPL: JSR TOBOT1 ; SET CURSOR TO BOTTOM
|
||
|
||
207F A201 SPLOFF: LDX #1
|
||
2081 86E3 STX SLINE ; SPLIT AT LINE 1
|
||
2083 CA DEX ; = 0
|
||
2084 86E4 STX SPSTAT ; TURN OFF STATUS FLAG
|
||
2086 86E0 STX LINCNT ; RESET LINE COUNT
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 101
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
2088 A915 LDA #21
|
||
208A 85E1 STA LMAX ; SET MAXIMUM LINE SCROLL
|
||
208C D023 BNE NEWLOG ; RESET LINE MAP & RETURN
|
||
|
||
208E ; ------
|
||
208E ; SCREEN
|
||
208E ; ------
|
||
|
||
208E ; GO TO TOP WINDOW IF [A] = 0
|
||
208E ; GO TO BOTTOM IF [A] = 1
|
||
208E ; IGNORE IF SPLIT NOT ENABLED OR [A] <> 0 OR 1
|
||
|
||
208E A5E4 ZSCRN: LDA SPSTAT ; IF SPLIT NOT ENABLED,
|
||
2090 F0E9 BEQ SPLEX ; IGNORE REQUEST
|
||
|
||
2092 A582 LDA ARG1+LO ; IF [ARG1] = 0,
|
||
2094 0583 ORA ARG1+HI
|
||
2096 F00C BEQ TOBOT0 ; GO TO BOTTOM WINDOW
|
||
2098 C901 CMP #1 ; IF [ARG1] <> 1,
|
||
209A D0DF BNE SPLEX ; IGNORE THE REQUEST
|
||
|
||
209C ; SET TO TOP WINDOW
|
||
|
||
209C A015 TOTOP: LDY #21 ; TEMPORARILY RESET
|
||
209E 84E1 STY LMAX ; [LMAX] TO KILL "MORE"
|
||
20A0 A001 LDY #1 ; Y-POS = 1
|
||
20A2 D005 BNE DOSCRN
|
||
|
||
20A4 ; SET TO BOTTOM WINDOW
|
||
|
||
20A4 207220 TOBOT0: JSR SPCALC ; RE-CALC [LMAX]
|
||
|
||
20A7 A017 TOBOT1: LDY #23 ; Y-POS = 23
|
||
|
||
20A9 8454 DOSCRN: STY ROWCRS ; Y-POS = [Y]
|
||
20AB A900 LDA #0 ; X-POS = 0
|
||
20AD 8555 STA COLCRS+LO
|
||
20AF 85E0 STA LINCNT ; RESET LINE COUNT
|
||
|
||
20B1 ; FALL THROUGH ...
|
||
|
||
20B1 ; ----------------------
|
||
20B1 ; RESET LOGICAL LINE MAP
|
||
20B1 ; ----------------------
|
||
|
||
20B1 A9FF NEWLOG: LDA #$FF
|
||
20B3 8DB202 STA LOGMAP
|
||
20B6 8DB302 STA LOGMAP+1
|
||
20B9 8DB402 STA LOGMAP+2
|
||
20BC 60 RTS
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 102
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
20BD ; ---------
|
||
20BD ; RAZZ USER
|
||
20BD ; ---------
|
||
|
||
20BD A9C8 BOOP: LDA #200 ; SET
|
||
20BF 8D00D2 STA AUDF1 ; FREQUENCY
|
||
20C2 A9AA LDA #$AA ; PURE TONE, VOLUME #10
|
||
20C4 8D01D2 STA AUDC1
|
||
20C7 A9FC LDA #252 ; 4 JIFFY DELAY
|
||
20C9 8514 STA RTCLOK
|
||
20CB A514 BOOP0: LDA RTCLOK
|
||
20CD D0FC BNE BOOP0
|
||
20CF 8D01D2 STA AUDC1 ; SHUT OFF SOUND
|
||
20D2 60 RTS
|
||
|
||
20D3 ; ------------
|
||
20D3 ; CLEAR SCREEN
|
||
20D3 ; ------------
|
||
|
||
20D3 A940 CLS: LDA #LOW SCREEN
|
||
20D5 858E STA I+LO
|
||
20D7 A9BC LDA #HIGH SCREEN ; POINT [I] TO
|
||
20D9 858F STA I+HI ; SCREEN RAM
|
||
|
||
20DB A900 LDA #0
|
||
20DD 85DD STA LENGTH ; RESET LINE LENGTH
|
||
20DF A8 TAY
|
||
20E0 A204 LDX #4 ; CLEAR 4 PAGES
|
||
20E2 918E CLS0: STA (I),Y ; FOR SCREEN
|
||
20E4 C8 INY
|
||
20E5 D0FB BNE CLS0
|
||
20E7 E68F INC I+HI ; POINT TO NEXT PAGE
|
||
20E9 CA DEX ; 4 PAGES DONE?
|
||
20EA D0F6 BNE CLS0 ; LOOP TILL EMPTY
|
||
|
||
20EC A001 LDY #1 ; SET Y-POS TO 1
|
||
20EE 8454 STY ROWCRS
|
||
20F0 88 DEY ; X-POS TO 0
|
||
20F1 8455 STY COLCRS+LO
|
||
20F3 4C7F20 JMP SPLOFF ; DISABLE SPLIT-SCREEN & RETURN
|
||
|
||
20F6 ; -------------------
|
||
20F6 ; LINE ADDRESS TABLES
|
||
20F6 ; -------------------
|
||
|
||
20F6 406890B8 LOLINE: DB $40,$68,$90,$B8,$E0,$08,$30,$58
|
||
20FE 80A8D0F8 DB $80,$A8,$D0,$F8,$20,$48,$70,$98
|
||
2106 C0E81038 DB $C0,$E8,$10,$38,$60,$88,$B0,$D8
|
||
|
||
210E BCBCBCBC HILINE: DB $BC,$BC,$BC,$BC,$BC,$BD,$BD,$BD
|
||
2116 BDBDBDBD DB $BD,$BD,$BD,$BD,$BE,$BE,$BE,$BE
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 103
|
||
--- MACHINE-DEPENDENT I/O: ATARI ---
|
||
|
||
211E BEBEBFBF DB $BE,$BE,$BF,$BF,$BF,$BF,$BF,$BF
|
||
|
||
2126 ; ------------------------
|
||
2126 ; ATASCII CONVERSION TABLE
|
||
2126 ; ------------------------
|
||
|
||
2126 6C6A3BFF ATASCI: DB $6C,$6A,$3B,$FF,$FF,$6B,$FF,$FF ; UNSHIFTED
|
||
212E 6FFF7075 DB $6F,$FF,$70,$75,$9B,$69,$2D,$FF
|
||
2136 76FF63FF DB $76,$FF,$63,$FF,$FF,$62,$78,$7A
|
||
213E 34FF3336 DB $34,$FF,$33,$36,$FF,$35,$32,$31
|
||
2146 2C202E6E DB $2C,$20,$2E,$6E,$FF,$6D,$2F,$FF
|
||
214E 72FF6579 DB $72,$FF,$65,$79,$FF,$74,$77,$71
|
||
2156 39FF3037 DB $39,$FF,$30,$37,$7E,$38,$FF,$FF
|
||
215E 666864FF DB $66,$68,$64,$FF,$FF,$67,$73,$61
|
||
|
||
2166 4C4A3AFF DB $4C,$4A,$3A,$FF,$FF,$4B,$FF,$FF ; SHIFTED
|
||
216E 4FFF5055 DB $4F,$FF,$50,$55,$9B,$49,$2D,$FF
|
||
2176 56FF43FF DB $56,$FF,$43,$FF,$FF,$42,$58,$5A
|
||
217E 24FF2336 DB $24,$FF,$23,$36,$FF,$35,$22,$21
|
||
2186 2C202E4E DB $2C,$20,$2E,$4E,$FF,$4D,$3F,$FF
|
||
218E 52FF4559 DB $52,$FF,$45,$59,$FF,$54,$57,$51
|
||
2196 39FF3027 DB $39,$FF,$30,$27,$7E,$38,$FF,$FF
|
||
219E 464844FF DB $46,$48,$44,$FF,$FF,$47,$53,$41
|
||
|
||
END
|
||
INCLUD ZDOS.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 104
|
||
--- Z-DOS: ATARI ---
|
||
|
||
|
||
21A6 ; -----------------------------
|
||
21A6 ; SET UP SAVE & RESTORE SCREENS
|
||
21A6 ; -----------------------------
|
||
|
||
21A6 20C71C SAVRES: JSR ZCRLF ; CLEAR THE LINE BUFFER
|
||
21A9 20D320 JSR CLS ; AND THE SCREEN
|
||
|
||
21AC A900 LDA #0
|
||
21AE 85DF STA SCRIPT ; DISABLE SCRIPTING
|
||
21B0 8555 STA COLCRS+LO ; HOME CURSOR
|
||
21B2 8554 STA ROWCRS
|
||
21B4 60 RTS
|
||
|
||
21B5 ; -----------------
|
||
21B5 ; DISPLAY A DEFAULT
|
||
21B5 ; -----------------
|
||
|
||
21B5 ; ENTRY: DEFAULT (1-8) IN [A]
|
||
|
||
21B5 20284465 DEFAL: DB " (Default is "
|
||
21C2 2A29203E DEFNUM: DB "*) >"
|
||
0011 DEFALL EQU $-DEFAL
|
||
|
||
21C6 18 DODEF: CLC
|
||
21C7 6931 ADC #'1' ; CONVERT TO ASCII 1-9
|
||
21C9 8DC221 STA DEFNUM ; INSERT IN STRING
|
||
|
||
21CC A2B5 LDX #LOW DEFAL
|
||
21CE A921 LDA #HIGH DEFAL
|
||
21D0 A011 LDY #DEFALL
|
||
21D2 4CC21F JMP DLINE ; PRINT THE STRING
|
||
|
||
21D5 ; -----------------------------
|
||
21D5 ; GET SAVE & RESTORE PARAMETERS
|
||
21D5 ; -----------------------------
|
||
|
||
21D5 9B POSIT: DB EOL
|
||
21D6 506F7369 DB "Position 1-5"
|
||
000D POSITL EQU $-POSIT
|
||
|
||
21E2 9B WDRIV: DB EOL
|
||
21E3 44726976 DB "Drive 1 or 2"
|
||
000D WDRIVL EQU $-WDRIV
|
||
|
||
21EF 9B MIND: DB EOL
|
||
21F0 9B DB EOL
|
||
21F1 506F7369 DB "Position "
|
||
21FA 2A3B2044 MPOS: DB "*; Drive #"
|
||
2204 2A2E MDRI: DB "*."
|
||
2206 9B DB EOL
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 105
|
||
--- Z-DOS: ATARI ---
|
||
|
||
2207 41726520 DB "Are you sure? (Y or N) >"
|
||
0030 MINDL EQU $-MIND
|
||
|
||
221F 9B INSM: DB EOL
|
||
2220 496E7365 DB "Insert SAVE disk into Drive #"
|
||
223D 2A2E SAVDRI: DB "*."
|
||
0020 INSML EQU $-INSM
|
||
|
||
223F 594553 YES: DB "YES"
|
||
2242 9B DB EOL
|
||
0004 YESL EQU $-YES
|
||
|
||
2243 4E4F NO: DB "NO"
|
||
2245 9B DB EOL
|
||
0003 NOL EQU $-NO
|
||
|
||
2246 A2D5 PARAMS: LDX #LOW POSIT
|
||
2248 A921 LDA #HIGH POSIT
|
||
224A A00D LDY #POSITL
|
||
224C 20C21F JSR DLINE ; "POSITION (1-5)"
|
||
|
||
224F ; GET GAME SAVE POSITION
|
||
|
||
224F A5F1 LDA GPOSIT ; SHOW THE CURRENT
|
||
2251 20C621 JSR DODEF ; DEFAULT POSITION
|
||
|
||
2254 207D1E GETPOS: JSR GETKEY ; WAIT FOR A KEY
|
||
2257 C99B CMP #EOL ; IF [RETURN],
|
||
2259 F00D BEQ POSSET ; USE DEFAULT
|
||
225B 38 SEC
|
||
225C E931 SBC #'1' ; ELSE CONVERT ASCII TO BINARY
|
||
225E C905 CMP #5 ; IF BELOW "5"
|
||
2260 9008 BCC SETPOS ; MAKE IT THE NEW DEFAULT
|
||
2262 20BD20 JSR BOOP ; ELSE RAZZ
|
||
2265 4C5422 JMP GETPOS ; AND TRY AGAIN
|
||
|
||
2268 A5F1 POSSET: LDA GPOSIT ; USE DEFAULT
|
||
|
||
226A 85F3 SETPOS: STA TPOSIT ; USE KEYPRESS
|
||
226C 18 CLC
|
||
226D 6931 ADC #'1' ; CONVERT TO ASCII "1"-"5"
|
||
226F 8DFA21 STA MPOS ; STORE IN TEMP STRING
|
||
2272 8DD923 STA SVPOS
|
||
2275 8D7924 STA RSPOS
|
||
2278 20EB1E JSR CHAR ; AND DISPLAY IT
|
||
|
||
227B ; GET DRIVE ID
|
||
|
||
227B A2E2 LDX #LOW WDRIV
|
||
227D A921 LDA #HIGH WDRIV
|
||
227F A00D LDY #WDRIVL
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 106
|
||
--- Z-DOS: ATARI ---
|
||
|
||
2281 20C21F JSR DLINE ; "DRIVE 1 OR 2"
|
||
|
||
2284 A5F2 LDA GDRIVE ; SHOW DEFAULT
|
||
2286 20C621 JSR DODEF
|
||
|
||
2289 207D1E GETDRV: JSR GETKEY ; GET A KEYPRESS
|
||
228C C99B CMP #EOL ; IF [RETURN],
|
||
228E F00D BEQ DRVSET ; USE DEFAULT
|
||
2290 38 SEC
|
||
2291 E931 SBC #'1' ; CONVERT TO BINARY 0 OR 1
|
||
2293 C902 CMP #2 ; IF WITHIN RANGE,
|
||
2295 9008 BCC SETDRV ; SET NEW DEFAULT
|
||
2297 20BD20 JSR BOOP
|
||
229A 4C8922 JMP GETDRV ; ELSE TRY AGAIN
|
||
|
||
229D A5F2 DRVSET: LDA GDRIVE ; USE DEFAULT
|
||
|
||
229F 85F4 SETDRV: STA TDRIVE ; USE [A]
|
||
22A1 18 CLC
|
||
22A2 6931 ADC #'1' ; CONVERT TO ASCII 1 OR 2
|
||
22A4 8D3D22 STA SAVDRI ; STORE IN DRIVE STRING
|
||
22A7 8D0422 STA MDRI ; AND IN TEMP STRING
|
||
22AA 20EB1E JSR CHAR ; AND SHOW NEW SETTING
|
||
|
||
22AD A2EF LDX #LOW MIND ; SHOW TEMPORARY SETTINGS
|
||
22AF A921 LDA #HIGH MIND
|
||
22B1 A030 LDY #MINDL
|
||
22B3 20C21F JSR DLINE
|
||
|
||
22B6 ; VALIDATE RESPONSES
|
||
|
||
22B6 A9FF LDA #$FF
|
||
22B8 8DFC02 STA CH
|
||
22BB 207D1E GETYES: JSR GETKEY
|
||
22BE C979 CMP #'y' ; IF REPLY IS "Y"
|
||
22C0 F022 BEQ ALLSET ; ACCEPT RESPONSES
|
||
22C2 C959 CMP #'Y'
|
||
22C4 F01E BEQ ALLSET
|
||
22C6 C99B CMP #EOL ; EOL IS ALSO ACCEPTABLE
|
||
22C8 F01A BEQ ALLSET
|
||
|
||
22CA C96E CMP #'n' ; IF REPLY IS "N"
|
||
22CC F00A BEQ NOTSAT ; RESTATE PARAMETERS
|
||
22CE C94E CMP #'N'
|
||
22D0 F006 BEQ NOTSAT
|
||
|
||
22D2 20BD20 JSR BOOP ; ELSE BOOP
|
||
22D5 4CBB22 JMP GETYES ; INSIST ON Y OR N
|
||
|
||
22D8 A243 NOTSAT: LDX #LOW NO
|
||
22DA A922 LDA #HIGH NO
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 107
|
||
--- Z-DOS: ATARI ---
|
||
|
||
22DC A003 LDY #NOL
|
||
22DE 20C21F JSR DLINE ; PRINT "NO"/EOL
|
||
22E1 4C4622 JMP PARAMS ; AND TRY AGAIN
|
||
|
||
22E4 A23F ALLSET: LDX #LOW YES
|
||
22E6 A922 LDA #HIGH YES
|
||
22E8 A004 LDY #YESL
|
||
22EA 20C21F JSR DLINE ; PRINT "YES"/EOL
|
||
|
||
22ED A5F4 LDA TDRIVE ; MAKE THE TEMPORARY DRIVE
|
||
22EF 85F2 STA GDRIVE ; THE DEFAULT DRIVE
|
||
22F1 85F5 STA DRIVE ; AND SET [DRIVE] ACCORDINGLY
|
||
|
||
22F3 E6F5 INC DRIVE ; 1-ALIGN THE DRIVE ID
|
||
|
||
22F5 A6F3 LDX TPOSIT ; MAKE THE TEMP POSITION
|
||
22F7 86F1 STX GPOSIT ; THE DEFAULT POSITION
|
||
|
||
22F9 ; CALC TRACK & SECTOR OF GAME POSITION
|
||
|
||
22F9 BD2925 LDA OFFLOS,X ; INDEX INTO THE OFFSET TABLES
|
||
22FC 85EF STA SECTOR+LO ; SET [SECTOR] = 1ST SECTOR
|
||
22FE BD2E25 LDA OFFHIS,X ; IN REQUESTED SAVE POSITION
|
||
2301 85F0 STA SECTOR+HI
|
||
|
||
2303 A21F LDX #LOW INSM
|
||
2305 A922 LDA #HIGH INSM
|
||
2307 A020 LDY #INSML
|
||
2309 20C21F JSR DLINE ; "INSERT SAVE DISK IN DRIVE X."
|
||
|
||
230C ; FALL THROUGH ...
|
||
|
||
230C ; ---------------------
|
||
230C ; "PRESS RETURN" PROMPT
|
||
230C ; ---------------------
|
||
|
||
230C 20C71C RETURN: JSR ZCRLF
|
||
230F A233 LDX #LOW RTN
|
||
2311 A923 LDA #HIGH RTN
|
||
2313 A01B LDY #RTNL
|
||
2315 20C21F JSR DLINE ; SHOW PROMPT
|
||
|
||
2318 20C71C JSR ZCRLF
|
||
231B A93E LDA #'>'
|
||
231D 20EB1E JSR CHAR
|
||
|
||
2320 ; ENTRY FOR QUIT/RESTART
|
||
|
||
2320 A9FF GETRET: LDA #$FF
|
||
2322 8DFC02 STA CH
|
||
2325 207D1E GTRT0: JSR GETKEY ; WAIT FOR [RETURN]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 108
|
||
--- Z-DOS: ATARI ---
|
||
|
||
2328 C99B CMP #EOL
|
||
232A F006 BEQ GTRT1
|
||
232C 20BD20 JSR BOOP ; ACCEPT NO
|
||
232F 4C2523 JMP GTRT0 ; SUBSTITUTES!
|
||
|
||
2332 60 GTRT1: RTS
|
||
|
||
2333 50726573 RTN: DB "Press [RETURN] to continue."
|
||
001B RTNL EQU $-RTN
|
||
|
||
234E ; --------------------
|
||
234E ; PROMPT FOR GAME DISK
|
||
234E ; --------------------
|
||
|
||
234E 496E7365 GAME: DB "Insert Side "
|
||
235A 32206F66 DSIDE: DB "2 of the STORY disk into"
|
||
0024 GAMEL EQU $-GAME
|
||
|
||
2372 44726976 GAME2: DB "Drive #1."
|
||
0009 GAME2L EQU $-GAME2
|
||
|
||
237B A931 SIDE1: LDA #'1' ; ASK FOR SIDE 1
|
||
237D D002 BNE DOSIDE
|
||
|
||
237F A932 SIDE2: LDA #'2' ; ASK FOR SIDE 2
|
||
|
||
2381 8D5A23 DOSIDE: STA DSIDE
|
||
|
||
2384 A901 LDA #1 ; MAKE SURE WE'RE ON
|
||
2386 85F5 STA DRIVE ; THE BOOT DRIVE
|
||
|
||
2388 20C71C JSR ZCRLF
|
||
238B A24E LDX #LOW GAME
|
||
238D A923 LDA #HIGH GAME
|
||
238F A024 LDY #GAMEL
|
||
2391 20C21F JSR DLINE ; "INSERT STORY DISK"
|
||
|
||
2394 20C71C JSR ZCRLF
|
||
2397 A272 LDX #LOW GAME2
|
||
2399 A923 LDA #HIGH GAME2
|
||
239B A009 LDY #GAME2L
|
||
239D 20C21F JSR DLINE ; "DRIVE #1"
|
||
|
||
23A0 200C23 JSR RETURN ; "PRESS [RETURN] TO CONTINUE:"
|
||
|
||
23A3 A9FF LDA #$FF ; ENABLE
|
||
23A5 85DF STA SCRIPT ; SCRIPTING
|
||
23A7 60 RTS
|
||
|
||
23A8 ; -------------------------
|
||
23A8 ; SET UP PHONEY STATUS LINE
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 109
|
||
--- Z-DOS: ATARI ---
|
||
|
||
23A8 ; -------------------------
|
||
|
||
23A8 ; ENTRY: TEXT SET UP FOR "DLINE"
|
||
|
||
23A8 20C21F SROOM: JSR DLINE ; PRINT LINE IN [X/Y/A]
|
||
|
||
23AB A227 LDX #39 ; INVERT & BLACKEN TOP LINE
|
||
23AD BD40BC SRLP: LDA SCREEN,X
|
||
23B0 0980 ORA #%10000000
|
||
23B2 9D40BC STA SCREEN,X
|
||
23B5 CA DEX
|
||
23B6 10F5 BPL SRLP
|
||
23B8 60 RTS
|
||
|
||
23B9 ; ---------
|
||
23B9 ; SAVE GAME
|
||
23B9 ; ---------
|
||
|
||
23B9 53617665 SAV: DB "Save Position"
|
||
23C6 9B DB EOL
|
||
000E SAVL EQU $-SAV
|
||
|
||
23C7 9B SVING: DB EOL
|
||
23C8 9B DB EOL
|
||
23C9 53617669 DB "Saving position "
|
||
23D9 2A202E2E SVPOS: DB "* ..."
|
||
23DE 9B DB EOL
|
||
0018 SVINGL EQU $-SVING
|
||
|
||
23DF 20A621 ZSAVE: JSR SAVRES ; SET UP SCREEN
|
||
|
||
23E2 A2B9 LDX #LOW SAV
|
||
23E4 A923 LDA #HIGH SAV
|
||
23E6 A00E LDY #SAVL
|
||
23E8 20A823 JSR SROOM ; "SAVE POSITION"
|
||
|
||
23EB 204622 JSR PARAMS ; GET PARAMETERS
|
||
|
||
23EE A2C7 LDX #LOW SVING
|
||
23F0 A923 LDA #HIGH SVING
|
||
23F2 A018 LDY #SVINGL
|
||
23F4 20C21F JSR DLINE ; "SAVING POSITION X ..."
|
||
|
||
23F7 ; SAVE GAME PARAMETERS IN [BUFSAV]
|
||
|
||
23F7 AD0226 LDA ZBEGIN+ZID ; MOVE GAME ID
|
||
23FA 8D200A STA BUFSAV+0 ; INTO 1ST 2 BYTES
|
||
23FD AD0326 LDA ZBEGIN+ZID+1 ; OF THE AUX LINE BUFFER
|
||
2400 8D210A STA BUFSAV+1
|
||
|
||
2403 A594 LDA ZSP ; MOVE [ZSP]
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 110
|
||
--- Z-DOS: ATARI ---
|
||
|
||
2405 8D220A STA BUFSAV+2 ; TO 3RD BYTE
|
||
2408 A595 LDA OLDZSP ; MOVE [OLDZSP]
|
||
240A 8D230A STA BUFSAV+3 ; TO 4TH
|
||
|
||
240D A202 LDX #2 ; MOVE CONTENTS OF [ZPC]
|
||
240F B596 ZPCSAV: LDA ZPC,X ; TO BYTES 5-7
|
||
2411 9D240A STA BUFSAV+4,X ; OF [BUFSAV]
|
||
2414 CA DEX
|
||
2415 10F8 BPL ZPCSAV
|
||
|
||
2417 ; WRITE [LOCALS]/[BUFSAV] PAGE TO DISK
|
||
|
||
2417 A90A LDA #HIGH LOCALS
|
||
2419 85EE STA DBUFF+HI ; POINT TO THE PAGE
|
||
241B 208125 JSR PUTDSK ; AND WRITE IT OUT
|
||
241E 9009 BCC WSTACK ; IF SUCCEEDED, WRITE STACK
|
||
|
||
2420 207F23 BADSAV: JSR SIDE2 ; ELSE REQUEST STORY DISK
|
||
2423 20D320 JSR CLS
|
||
2426 4C480F JMP PREDF ; AND FAIL
|
||
|
||
2429 ; WRITE CONTENTS OF Z-STACK TO DISK
|
||
|
||
2429 A905 WSTACK: LDA #HIGH ZSTAKL ; POINT TO 1ST PAGE
|
||
242B 85EE STA DBUFF+HI
|
||
242D 208125 JSR PUTDSK ; WRITE 1ST AND
|
||
2430 B0EE BCS BADSAV
|
||
2432 208125 JSR PUTDSK ; 2ND PAGE OF Z-STACK
|
||
2435 B0E9 BCS BADSAV
|
||
|
||
2437 ; WRITE ENTIRE GAME PRELOAD TO DISK
|
||
|
||
2437 A5A3 LDA ZCODE ; POINT TO 1ST PAGE
|
||
2439 85EE STA DBUFF+HI ; OF PRELOAD
|
||
|
||
243B AE0E26 LDX ZBEGIN+ZPURBT ; GET # IMPURE PAGES
|
||
243E E8 INX ; USE FOR INDEXING
|
||
243F 868E STX I+LO
|
||
|
||
2441 208125 LSAVE: JSR PUTDSK
|
||
2444 B0DA BCS BADSAV
|
||
2446 C68E DEC I+LO
|
||
2448 D0F7 BNE LSAVE
|
||
|
||
244A 207F23 JSR SIDE2 ; PROMPT FOR GAME DISK
|
||
244D 20D320 JSR CLS
|
||
2450 4C540F JMP PREDS ; ELSE PREDICATE SUCCEEDS
|
||
|
||
2453 ; ------------
|
||
2453 ; RESTORE GAME
|
||
2453 ; ------------
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 111
|
||
--- Z-DOS: ATARI ---
|
||
|
||
|
||
2453 52657374 RES: DB "Restore Position"
|
||
2463 9B DB EOL
|
||
0011 RESL EQU $-RES
|
||
|
||
2464 9B RSING: DB EOL
|
||
2465 9B DB EOL
|
||
2466 52657374 DB "Restoring position "
|
||
2479 2A202E2E RSPOS: DB "* ..."
|
||
247E 9B DB EOL
|
||
001B RSINGL EQU $-RSING
|
||
|
||
247F 20A621 ZREST: JSR SAVRES
|
||
|
||
2482 A253 LDX #LOW RES
|
||
2484 A924 LDA #HIGH RES
|
||
2486 A011 LDY #RESL
|
||
2488 20A823 JSR SROOM ; "RESTORE POSITION"
|
||
|
||
248B 204622 JSR PARAMS ; GET PARAMETERS
|
||
|
||
248E A264 LDX #LOW RSING
|
||
2490 A924 LDA #HIGH RSING
|
||
2492 A01B LDY #RSINGL
|
||
2494 20C21F JSR DLINE ; "RESTORING POSITION X ..."
|
||
|
||
2497 ; SAVE LOCALS IN CASE OF ERROR
|
||
|
||
2497 A21F LDX #31
|
||
2499 BD000A LOCSAV: LDA LOCALS,X ; COPY ALL LOCALS
|
||
249C 9D0001 STA $0100,X ; TO BOTTOM OF MACHINE STACK
|
||
249F CA DEX
|
||
24A0 10F7 BPL LOCSAV
|
||
|
||
24A2 A90A LDA #HIGH LOCALS
|
||
24A4 85EE STA DBUFF+HI
|
||
24A6 206E25 JSR RDISK ; RETRIEVE 1ST BLOCK OF PRELOAD
|
||
24A9 B010 BCS WRONG ; BAD DISK READ IF CARRY CLEAR
|
||
|
||
24AB AD200A LDA BUFSAV+0 ; DOES 1ST BYTE OF SAVED GAME ID
|
||
24AE CD0226 CMP ZBEGIN+ZID ; MATCH THE CURRENT ID?
|
||
24B1 D008 BNE WRONG ; WRONG DISK IF NOT
|
||
|
||
24B3 AD210A LDA BUFSAV+1 ; WHAT ABOUT THE 2ND BYTE?
|
||
24B6 CD0326 CMP ZBEGIN+ZID+1
|
||
24B9 F014 BEQ RIGHT ; CONTINUE IF BOTH BYTES MATCH
|
||
|
||
24BB ; HANDLE RESTORE ERROR
|
||
|
||
24BB A21F WRONG: LDX #31 ; RESTORE ALL SAVED LOCALS
|
||
24BD BD0001 WR0: LDA $0100,X
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 112
|
||
--- Z-DOS: ATARI ---
|
||
|
||
24C0 9D000A STA LOCALS,X
|
||
24C3 CA DEX
|
||
24C4 10F7 BPL WR0
|
||
|
||
24C6 207F23 JSR SIDE2 ; PROMPT FOR GAME DISK
|
||
24C9 20D320 JSR CLS
|
||
24CC 4C480F JMP PREDF ; PREDICATE FAILS
|
||
|
||
24CF ; CONTINUE RESTORE
|
||
|
||
24CF AD1026 RIGHT: LDA ZBEGIN+ZSCRIP ; SAVE BOTH FLAG BYTES
|
||
24D2 858E STA I+LO
|
||
24D4 AD1126 LDA ZBEGIN+ZSCRIP+1
|
||
24D7 858F STA I+HI
|
||
|
||
24D9 A905 LDA #HIGH ZSTAKL ; RETRIEVE OLD CONTENTS OF
|
||
24DB 85EE STA DBUFF+HI ; Z-STACK
|
||
24DD 206E25 JSR RDISK ; GET 1ST BLOCK OF Z-STACK
|
||
24E0 B0D9 BCS WRONG
|
||
24E2 206E25 JSR RDISK ; AND 2ND BLOCK
|
||
24E5 B0D4 BCS WRONG
|
||
|
||
24E7 A5A3 LDA ZCODE
|
||
24E9 85EE STA DBUFF+HI
|
||
24EB 206E25 JSR RDISK ; GET 1ST BLOCK OF PRELOAD
|
||
24EE B0CB BCS WRONG
|
||
|
||
24F0 A58E LDA I+LO ; RESTORE THE STATE
|
||
24F2 8D1026 STA ZBEGIN+ZSCRIP ; OF THE FLAG WORD
|
||
24F5 A58F LDA I+HI
|
||
24F7 8D1126 STA ZBEGIN+ZSCRIP+1
|
||
|
||
24FA AD0E26 LDA ZBEGIN+ZPURBT ; GET # PAGES TO LOAD
|
||
24FD 858E STA I+LO
|
||
|
||
24FF 206E25 LREST: JSR RDISK ; FETCH THE REMAINDER
|
||
2502 B0B7 BCS WRONG
|
||
2504 C68E DEC I+LO ; OF THE PRELOAD
|
||
2506 D0F7 BNE LREST
|
||
|
||
2508 ; RESTORE THE STATE OF THE SAVED GAME
|
||
|
||
2508 AD220A LDA BUFSAV+2 ; RESTORE THE [ZSP]
|
||
250B 8594 STA ZSP
|
||
250D AD230A LDA BUFSAV+3 ; AND THE [OLDZSP]
|
||
2510 8595 STA OLDZSP
|
||
|
||
2512 A202 LDX #2 ; RESTORE THE [ZPC]
|
||
2514 BD240A RESZPC: LDA BUFSAV+4,X
|
||
2517 9596 STA ZPC,X
|
||
2519 CA DEX
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 113
|
||
--- Z-DOS: ATARI ---
|
||
|
||
251A 10F8 BPL RESZPC
|
||
|
||
251C A900 LDA #0
|
||
251E 8599 STA ZPCFLG ; INVALIDATE [ZPC]
|
||
|
||
2520 207F23 JSR SIDE2 ; PROMPT FOR GAME DISK
|
||
2523 20D320 JSR CLS
|
||
2526 4C540F JMP PREDS ; PREDICATE SUCCEEDS
|
||
|
||
2529 ; --------------------------
|
||
2529 ; SAVE/RESTORE OFFSET TABLES
|
||
2529 ; --------------------------
|
||
|
||
2529 ; 144 SECTORS (18K) PER SAVE POSITION
|
||
|
||
2529 01 OFFLOS: DB LOW 1
|
||
252A 91 DB LOW 145
|
||
252B 21 DB LOW 289
|
||
252C B1 DB LOW 433
|
||
252D 41 DB LOW 577
|
||
|
||
252E 00 OFFHIS: DB HIGH 1
|
||
252F 00 DB HIGH 145
|
||
2530 01 DB HIGH 289
|
||
2531 01 DB HIGH 433
|
||
2532 02 DB HIGH 577
|
||
|
||
END
|
||
INCLUD DISK.ASM
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 114
|
||
--- DISK ACCESS: ATARI ---
|
||
|
||
|
||
2533 ; --------------------
|
||
2533 ; READ A VIRTUAL BLOCK
|
||
2533 ; --------------------
|
||
|
||
2533 ; ENTRY: TARGET V-BLOCK IN [DBLOCK]
|
||
2533 ; TARGET RAM PAGE IN [DBUFF]
|
||
2533 ; EXIT: CARRY CLEAR IF OKAY, SET IF NOT
|
||
|
||
2533 D8 GETDSK: CLD
|
||
2534 A901 LDA #1 ; V-BLOCKS ALWAYS COME
|
||
2536 85F5 STA DRIVE ; FROM DRIVE #1
|
||
|
||
2538 ; CALCULATE SECTOR OF [DBLOCK]
|
||
|
||
2538 A6EB LDX DBLOCK+LO ; COPY LSB OF [DBLOCK]
|
||
253A 86EF STX SECTOR+LO ; INTO [SECTOR]
|
||
|
||
253C A5EC LDA DBLOCK+HI
|
||
253E 2901 AND #%00000001 ; MASK ALL BUT BIT 1
|
||
2540 85F0 STA SECTOR+HI
|
||
2542 D015 BNE INPURE ; BLOCK IS PURE IF MSB <> 0
|
||
|
||
2544 E4A4 CPX ZPURE ; ELSE CHECK LSB
|
||
2546 B011 BCS INPURE ; PURE IF >= [ZPURE]
|
||
|
||
2548 ; HANDLE A PRELOAD BLOCK
|
||
|
||
2548 06EF ASL SECTOR+LO ; MULTIPLY BY 2
|
||
254A 26F0 ROL SECTOR+HI ; FOR ATARI 128-BYTE SECTORS
|
||
|
||
254C A5EF LDA SECTOR+LO
|
||
254E 18 CLC
|
||
254F 6949 ADC #73 ; ADD DISK PRELOAD OFFSET
|
||
2551 85EF STA SECTOR+LO
|
||
2553 9019 BCC RDISK
|
||
2555 E6F0 INC SECTOR+HI
|
||
2557 D015 BNE RDISK ; AND READ THE SECTOR
|
||
|
||
2559 ; HANDLE A PURE BLOCK
|
||
|
||
2559 A5EF INPURE: LDA SECTOR+LO
|
||
255B 38 SEC ; STRIP OFF THE
|
||
255C E5A4 SBC ZPURE ; VIRTUAL PRELOAD OFFSET
|
||
255E 85EF STA SECTOR+LO
|
||
2560 B002 BCS INP0
|
||
2562 C6F0 DEC SECTOR+HI
|
||
|
||
2564 06EF INP0: ASL SECTOR+LO ; MULTIPLY BY 2
|
||
2566 26F0 ROL SECTOR+HI ; FOR ATARI 128-BYTE SECTORS
|
||
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 115
|
||
--- DISK ACCESS: ATARI ---
|
||
|
||
2568 E6EF INC SECTOR+LO ; DISK "PURE" OFFSET IS 1
|
||
256A D002 BNE RDISK
|
||
256C E6F0 INC SECTOR+HI
|
||
|
||
256E ; FALL THROUGH ...
|
||
|
||
256E ; -----------------
|
||
256E ; READ A DISK BLOCK
|
||
256E ; -----------------
|
||
|
||
256E ; ENTRY: TARGET SECTOR IN [SECTOR]
|
||
256E ; TARGET DRIVE IN [DRIVE]
|
||
256E ; PAGE TO READ IN [DBUFF]
|
||
256E ; EXIT: CARRY CLEAR IF OKAY, SET IF NOT
|
||
|
||
256E A952 RDISK: LDA #$52 ; "READ" COMMAND
|
||
2570 20A225 JSR DODISK ; GET DATA INTO [IOBUFF]
|
||
2573 B02C BCS IOERR ; SOMETHING WRONG IF CARRY SET
|
||
|
||
2575 A000 LDY #0 ; MOVE DATA IN [IOBUFF]
|
||
2577 B90004 RDSK0: LDA IOBUFF,Y ; TO [DBUFF]
|
||
257A 91ED STA (DBUFF),Y
|
||
257C C8 INY
|
||
257D D0F8 BNE RDSK0
|
||
|
||
257F F011 BEQ SNEXT ; UPDATE & RETURN
|
||
|
||
2581 ; ------------------
|
||
2581 ; WRITE A DISK BLOCK
|
||
2581 ; ------------------
|
||
|
||
2581 ; ENTRY: TARGET SECTOR IN [SECTOR]
|
||
2581 ; TARGET DRIVE IN [DRIVE]
|
||
2581 ; PAGE TO WRITE IN [DBUFF]
|
||
2581 ; EXIT: CARRY CLEAR IF OKAY, SET IF NOT
|
||
|
||
2581 A000 PUTDSK: LDY #0 ; MOVE THE PAGE
|
||
2583 B1ED PDSK0: LDA (DBUFF),Y ; AT [DBUFF]
|
||
2585 990004 STA IOBUFF,Y ; INTO [IOBUFF]
|
||
2588 C8 INY
|
||
2589 D0F8 BNE PDSK0
|
||
|
||
258B A957 LDA #$57 ; "WRITE" COMMAND
|
||
258D 20A225 JSR DODISK
|
||
2590 B00F BCS IOERR ; SOMETHING WRONG IF CARRY SET
|
||
|
||
2592 E6EE SNEXT: INC DBUFF+HI ; POINT TO NEXT RAM PAGE
|
||
|
||
2594 E6EB INC DBLOCK+LO ; NEXT V-PAGE
|
||
2596 D002 BNE SNX0
|
||
2598 E6EC INC DBLOCK+HI
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 116
|
||
--- DISK ACCESS: ATARI ---
|
||
|
||
|
||
259A E6EF SNX0: INC SECTOR+LO ; AND NEXT SECTOR
|
||
259C D002 BNE SNX1
|
||
259E E6F0 INC SECTOR+HI
|
||
|
||
25A0 18 SNX1: CLC ; CLEAR CARRY FOR SUCCESS
|
||
|
||
25A1 60 IOERR: RTS ; ELSE RETURN WITH CARRY SET
|
||
|
||
25A2 ; ---------------
|
||
25A2 ; ACCESS THE DISK
|
||
25A2 ; ---------------
|
||
|
||
25A2 ; ENTRY: [A] = $52 TO READ, $57 TO WRITE
|
||
25A2 ; [DRIVE] = TARGET DRIVE (1 OR 2)
|
||
25A2 ; [SECTOR] = TARGET SECTOR
|
||
25A2 ; EXIT: CARRY CLEAR IF OKAY, SET IF NOT
|
||
|
||
25A2 8D0203 DODISK: STA DCOMND ; SET READ/WRITE COMMAND
|
||
|
||
25A5 A5F5 LDA DRIVE ; SPECIFY
|
||
25A7 8D0103 STA DUNIT ; WHICH DRIVE TO USE
|
||
|
||
25AA ; CHECK VALIDITY OF SECTOR RANGE
|
||
|
||
25AA A6EF LDX SECTOR+LO ; GET LSB AND
|
||
25AC A5F0 LDA SECTOR+HI ; MSB OF TARGET SECTOR
|
||
25AE C902 CMP #$02 ; MSB WITHIN RANGE?
|
||
25B0 9006 BCC RANOK ; OKAY IF < 2
|
||
25B2 D042 BNE RANERR ; RANGE ERROR IF > 2
|
||
25B4 E0D0 CPX #$D0 ; IF MSB WAS $02, IS LSB < $CF?
|
||
25B6 B03E BCS RANERR ; ERROR IF NOT
|
||
|
||
25B8 8E0A03 RANOK: STX DAUX1 ; TELL SIO
|
||
25BB 8D0B03 STA DAUX2 ; WHICH SECTOR TO USE
|
||
|
||
25BE A900 LDA #LOW IOBUFF ; POINT TO
|
||
25C0 8D0403 STA DBUFLO ; THE BOTTOM HALF
|
||
25C3 A904 LDA #HIGH IOBUFF ; OF [IOBUFF]
|
||
25C5 8D0503 STA DBUFHI
|
||
|
||
25C8 2053E4 JSR DSKINV ; ACCESS 1ST HALF OF [IOBUFF]
|
||
25CB AD0303 LDA DSTATS ; CHECK STATUS
|
||
25CE 3024 BMI DERR ; ERROR IF NEGATIVE
|
||
|
||
25D0 E6EF INC SECTOR+LO ; POINT TO NEXT SECTOR
|
||
25D2 D002 BNE DDSK0
|
||
25D4 E6F0 INC SECTOR+HI
|
||
|
||
25D6 A5EF DDSK0: LDA SECTOR+LO ; UPDATE [DAUX1/2]
|
||
25D8 8D0A03 STA DAUX1
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT PAGE 117
|
||
--- DISK ACCESS: ATARI ---
|
||
|
||
25DB A5F0 LDA SECTOR+HI
|
||
25DD 8D0B03 STA DAUX2
|
||
|
||
25E0 A980 LDA #LOW BUFTOP ; POINT TO TOP HALF
|
||
25E2 8D0403 STA DBUFLO ; OF [IOBUFF]
|
||
25E5 A904 LDA #HIGH BUFTOP
|
||
25E7 8D0503 STA DBUFHI
|
||
|
||
25EA 2053E4 JSR DSKINV ; ACCESS TOP HALF OF [IOBUFF]
|
||
25ED AD0303 LDA DSTATS ; CHECK STATUS
|
||
25F0 3002 BMI DERR ; ERROR IF NEGATIVE
|
||
25F2 18 CLC ; CLEAR CARRY FOR NO ERRORS
|
||
25F3 60 RTS
|
||
|
||
25F4 38 DERR: SEC ; OR SET IT IF ERROR
|
||
25F5 60 RTS
|
||
|
||
25F6 ; *** ERROR #12: DISK ADDRESS OUT OF RANGE ***
|
||
|
||
25F6 A90C RANERR: LDA #12
|
||
25F8 4CF91B JMP ZERROR
|
||
|
||
END
|
||
|
||
25FB IF DEBUG
|
||
25FB INCLUD BUGGER.ASM
|
||
25FB ENDIF
|
||
|
||
0000 END
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. PAGE 118
|
||
---- SYMBOL TABLE ----
|
||
|
||
A12VAL 0FDB COLOR4 02C8 DOFREQ 19B4 FLS1 1BC3 GTBT0 1861
|
||
A2VAL 128D COMPAR 1295 DOGET 1368 FLS2 1BDB GTBT1 1868
|
||
ABQUOT 14B3 CONCNT 00D0 DOM0 1E06 FLSL 1BD4 GTBT2 1871
|
||
ABREM 14A5 CONIN 00D1 DOMINS 1DFB FLUSH 1C9D GTBT3 1883
|
||
ABSDIV 148A CONOUT 00D2 DOPM 1E1D FLUSHW 1770 GTEXIT 1A5A
|
||
ABYTE 008A CONSOL D01F DORET 1401 FREEZE 1C2E GTRT0 2325
|
||
ADEX 008B CONTOP 1A70 DOSCRL 1F07 FWL1 17D5 GTRT1 2332
|
||
ALLSET 22E4 CONZST 1A5E DOSCRN 20A9 FWORDS 00B0 GTZ0 1A1C
|
||
ARG1 0082 COUT 1C89 DOSIB 1724 FWSUCC 1811 GVCALC 0F32
|
||
ARG2 0084 CR1 1CF7 DOSIDE 2381 GAME 234E HI 0001
|
||
ARG3 0086 CRSINH 02F0 DOSVEC 000A GAME2 2372 HILINE 210E
|
||
ARG4 0088 CSET0 1AA5 DOTIME 1DAC GAME2L 0009 HPOSM0 D004
|
||
ATASCI 2126 CSET2 1AB7 DOUT 1FCA GAMEL 0024 HPOSP0 D000
|
||
AUDC1 D201 CSHAPE 00F8 DOXM 1E1F GDRIVE 00F2 I 008E
|
||
AUDCTL D208 CSHIP 1AAA DOXOP 0DE4 GETBYT 184F ICAUX1 034A
|
||
AUDF1 D200 CTABLE 1AE4 DRIVE 00F5 GETDRV 2289 ICAUX2 034B
|
||
BACKSP 007E CTEST 1A95 DRVSET 229D GETDSK 2533 ICBADR 0344
|
||
BACKUP 1F8D CZSL 1A61 DSIDE 235A GETKEY 1E7D ICBLEN 0348
|
||
BADKEY 1E77 DAUX1 030A DSKERR 18F7 GETLNG 0E94 ICCOM 0342
|
||
BADOP1 0E43 DAUX2 030B DSKINV E453 GETP1 1392 IN 00B4
|
||
BADOP2 0E80 DBLOCK 00EB DSTATS 0303 GETP2 13A1 INCVAL 0FD4
|
||
BADP 203A DBUFF 00ED DT0 1DD0 GETP3 13B4 INLOOP 1F66
|
||
BADSAV 2420 DBUFHI 0305 DT1 1DD6 GETPB 13C4 INP0 2564
|
||
BADVER 1124 DBUFLO 0304 DUMMY 0C0E GETPOS 2254 INPURE 2559
|
||
BCALC 137B DC0 0D8D DUNIT 0301 GETPT1 13DA INPUT 1F5B
|
||
BLANK 1996 DC1 0D94 DVX 0FD3 GETPT2 13E9 INSM 221F
|
||
BLINK 00F6 DCOMND 0302 EAR0 1904 GETPT3 13EF INSML 0020
|
||
BOOP 20BD DDSK0 25D6 EAR1 190E GETPW 13CA INVFLG 02B6
|
||
BOOP0 20CB DEBUG 0000 EARLY 18FC GETRET 2320 IOBUFF 0400
|
||
BOOT 0009 DECVAL 0FC8 EFIND 1762 GETSET 1A0A IOCHAR 00E2
|
||
BREAK 1786 DEFAL 21B5 ENDLIN 1F97 GETSHT 0E90 IOERR 25A1
|
||
BRKTBL 1797 DEFALL 0011 ENTRY 00C4 GETV 0E97 IRQEN D20E
|
||
BUFSAV 0A20 DEFNUM 21C2 ENUMB 1BF6 GETVAR 0EA8 IVX 0FDA
|
||
BUFTOP 0480 DERR 25F4 EOL 009B GETVR1 0EAD J 0090
|
||
CEX 1C9C DGC 163E EQBAD 1531 GETVRG 0EC1 K 0092
|
||
CH 02FC DIGCNT 163A EQOK 152E GETVRL 0EB1 LBUFF 0A80
|
||
CHAR 1EEB DIGITS 00DB ERRM 1BE7 GETWRD 1925 LDPRE 0D51
|
||
CHRTBL 1B33 DIRECT 1984 ERRML 0012 GETYES 22BB LENGTH 00DD
|
||
CIOV E456 DIVERR 14F2 ESIZE 00C8 GETZ1 1A31 LEX0 1FA2
|
||
CLICK 1ED0 DIVEX 14B2 ETPEX 13D0 GETZ2 1A4C LEX1 1FAD
|
||
CLK0 1ED9 DIVIDE 1475 FALSE 0000 GETZ3 1A58 LEX2 1FB7
|
||
CLK1 1EDE DLINE 1FC2 FBRK 17AD GETZCH 1A16 LFROM 00E5
|
||
CLOSEP 203E DLIST 0C15 FINDW 17AF GKEY0 1E82 LINCNT 00E0
|
||
CLS 20D3 DLS0 126C FIRST1 1140 GKEY1 1EA2 LINEX 1D19
|
||
CLS0 20E2 DMACTL D400 FL0 1C9F GLOBAL 00AC LINLEN 00C2
|
||
CNL 1AE6 DOB2 0F75 FL1 1CA9 GO 0E05 LINOUT 1D00
|
||
CNOK 1AEF DOCALL 153D FL2 1CB4 GODIV 1497 LMARGN 0052
|
||
COLCRS 0055 DODEF 21C6 FL3 1CBE GPOSIT 00F1 LMAX 00E1
|
||
COLD 0C4F DODIS 0DF3 FLAGSU 1BA9 GPRIOR 026F LO 0000
|
||
COLDST 0244 DODISK 25A2 FLEX 1785 GRACTL D01D LOCALS 0A00
|
||
COLOR1 02C5 DOEQ 150A FLS0 1BC2 GS 1A11 LOCSAV 2499
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. PAGE 119
|
||
---- SYMBOL TABLE ----
|
||
|
||
LOGMAP 02B2 NUMBER 162E PG1 188D PUTBYT 0F06 RTNL 001B
|
||
LOLINE 20F6 NXTP1 140B PG2 189A PUTDSK 2581 SAV 23B9
|
||
LOUT 1D08 NXTP2 141A PG3 18A1 PUTLSB 15D8 SAVDRI 223D
|
||
LREST 24FF NXTP3 141D PG4 18C3 PUTP1 15F3 SAVL 000E
|
||
LRU 00A2 OBJ1 1B63 PG5 18D5 PUTP2 1602 SAVRES 21A6
|
||
LRUMAP 0900 OBJ2 1B6A PG6 18E0 PUTP3 1612 SAY1 1AFF
|
||
LSAVE 2441 OBJLOC 1B4D PG7 18EC PUTVAL 0F0C SAY2 1B0A
|
||
LTO 00E7 OBJTAB 00B2 PG8 18F1 PUTVLG 0F25 SAYSET 1AF4
|
||
MDRI 2204 OFFHIS 252E PGOOD 12D2 PUTVLL 0F15 SBL 17A4
|
||
MEMTOP 1C6A OFFLOS 2529 PLERR 161C PUTVR1 0F11 SCEX 12B1
|
||
MIND 21EF OFFSET 00CC PLMRAM 0800 PYUCK 112D SCMP 12A7
|
||
MINDL 0030 OFFSPL 207C PMAX 00A6 PZSTR 1942 SCOMP 129C
|
||
MINIT 14F7 OLDLEN 00DE PMBASE D407 PZTOP 194B SCREEN BC40
|
||
MISSL 0B00 OLDLST BC20 PMG0 0C8D QSIGN 00D9 SCRIPT 00DF
|
||
MLOOP 0D7E OLDZSP 0095 PMG1 0C94 QUOT 00D3 SDLSTL 0230
|
||
MORE 1D1A OP0 0E0A PNAME 1FD5 RANDOM 1C81 SDMCTL 022F
|
||
MOVMIN 1DE1 OP1 0E19 PNERR 1617 RANERR 25F6 SECTOR 00EF
|
||
MPC 009C OP1A 0E23 POKMSK 0010 RANOK 25B8 SET1 196E
|
||
MPCFLG 009F OP1B 0E2D POPVAL 0ECE RDISK 256E SET2 1976
|
||
MPCH 009E OP1EX 0E34 PORTB D301 RDSK0 2577 SETDRV 229F
|
||
MPCL 009C OP2 0E48 POSIT 21D5 READL 16BF SETNP 0D0F
|
||
MPCM 009D OP2A 0E52 POSITL 000D READL2 170A SETPOS 226A
|
||
MPCPNT 00A0 OP2B 0E55 POSSET 2268 READL3 172C SETSTR 1930
|
||
MPOS 21FA OP2C 0E64 PP1 2019 REMAIN 00D5 SETWRD 1916
|
||
MRAND D20A OP2D 0E67 PPRINT 1FD9 REMVC1 11C2 SFLAG 1FD8
|
||
MTEMP 00D7 OP2EX 0E71 PPX 1BA3 REMVC2 11D3 SHOVE 1968
|
||
NARGS 0081 OPCODE 0080 PREDB 0F59 REMVEX 11DC SHOWIT 1F75
|
||
NBL 178D OPEXT 0D9B PREDB1 0F7C RES 2453 SIB 179D
|
||
NBRKS 0006 OPT0 0FE4 PREDB2 0F87 RESL 0011 SIDE1 237B
|
||
NENTS 00C6 OPT1 1000 PREDB3 0F8E RESULT 00C1 SIDE2 237F
|
||
NEWLOG 20B1 OPT2 1020 PREDB5 0FAC RESZPC 2514 SIZEM D00C
|
||
NEWSET 199A OPTX 1052 PREDF 0F48 RET0 0F04 SKCTL D20F
|
||
NEXTPC 1819 OPX0 0DA6 PREDLB 0F69 RET1 120B SLD 0C36
|
||
NEXTZ 1A7E OPX1 0DAC PREDNB 0F4D RET2 121F SLDL 0019
|
||
NO 2243 OPX2 0DB6 PREDS 0F54 RETURN 230C SLINE 00E3
|
||
NOBLIN 1EBA OPX3 0DC0 PRIL 108E RFLIP 14A1 SNEXT 2592
|
||
NOL 0003 OPX4 0DDB PRLEN 00EA RIGHT 24CF SNX0 259A
|
||
NOMORE 1F7C OPXNXT 0DC7 PRNTDC 11DF RL0 16CD SNX1 25A0
|
||
NOPS0 000E OUT 00BA PRNTN3 1656 RL1 16D2 SOURCE 00C0
|
||
NOPS1 0010 OUTEOL 1F51 PRNTN4 165F RL2 16D9 SPACE 0020
|
||
NOPS2 0019 OVER 0EF6 PROPB 1B76 RL3 16E2 SPCALC 2072
|
||
NOPSX 000C PAGE 1885 PROPL 1B97 RLERR 16C9 SPL0 205A
|
||
NORAM 0D0A PAGE0 00A5 PROPN 1B92 RLEX 16D8 SPL1 2068
|
||
NORM 178B PARAMS 2246 PROPNX 1B9F RLL 16E8 SPLEX 207B
|
||
NOSCRL 1F3A PATCH 185A PSET 00C9 ROWCRS 0054 SPLOFF 207F
|
||
NOT48K 1C7F PBAD 12BF PSHVAL 0EE4 RSIGN 00DA SPSTAT 00E4
|
||
NOTSAT 22D8 PCALC 15DD PSTAT 00E9 RSING 2464 SRL0 1F0C
|
||
NPC0 182B PDC0 11F4 PTABH 0800 RSINGL 001B SRL1 1F27
|
||
NPC1 1832 PDSK0 2583 PTABL 0700 RSPOS 2479 SRL2 1F30
|
||
NPC2 183B PEX 2048 PTZ0 116A RTCLOK 0014 SRL3 1F34
|
||
NPC3 184D PFINE 1149 PUSHXA 0EE8 RTN 2333 SRLP 23AD
|
||
|
||
|
||
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
|
||
|
||
ZIP/6502 INFOCOM, INC. PAGE 120
|
||
---- SYMBOL TABLE ----
|
||
|
||
SROOM 23A8 VARPUT 0EFB ZCALL3 15BC ZIP 0C00 ZPUTB 15D5
|
||
ST0 0CCB VERNUM 1C5B ZCHAR 00CB ZJUMP 1237 ZPUTP 15F0
|
||
ST1 0CD3 VERS 1C4C ZCHKSM 001C ZLENTH 001A ZQUIT 1C1F
|
||
ST2 0CDD VERSL 000F ZCODE 00A3 ZLESS 1263 ZRAND 166B
|
||
STAMP 00AA VEXIT 125C ZCR0 1CE6 ZLOC 114C ZREAD 169C
|
||
STATEX 1E27 VOCAB 00AE ZCRLF 1CC7 ZMLOOP 1440 ZREMOV 119B
|
||
STRING 1FCB VSUM 10C6 ZCRME 1CF1 ZMNEXT 1457 ZREST 247F
|
||
STX0 1E2B VSUM0 10D2 ZCRMP 1CD8 ZMOD 146B ZRET 11FA
|
||
STX1 1E31 VSUM2 10F0 ZCRUSH 1B0D ZMODE 0001 ZRFALS 1075
|
||
STX2 1E40 VSUM3 10FC ZD0 1188 ZMOVE 1338 ZRSTAK 109F
|
||
SVING 23C7 WARM 0CAE ZDEC 1180 ZMUL 143D ZRT0 106C
|
||
SVINGL 0018 WARM1 0CC7 ZDIV 1461 ZMVEX 1361 ZRT1 106E
|
||
SVPOS 23D9 WARMEX 0D5D ZDLESS 1269 ZNEXT 1130 ZRTRUE 106A
|
||
SWAP 00AB WCALC 1377 ZENDLD 0004 ZNEXTP 1404 ZSAVE 23DF
|
||
TARGET 00A8 WCEX 0F47 ZEQUAL 1501 ZNOOP 0FC7 ZSCRIP 0010
|
||
TDRIVE 00F4 WDRIV 21E2 ZEROPG 0080 ZOBJEC 000A ZSCRN 208E
|
||
TIMEFL 00DC WDRIVL 000D ZERR0 1BFB ZPAGE 00A7 ZSERIA 0012
|
||
TOASC 1965 WNEXT 17F2 ZERR1 1BFD ZPC 0096 ZSET 132B
|
||
TOBOT0 20A4 WNX 17FD ZERR2 1C06 ZPCFLG 0099 ZSP 0094
|
||
TOBOT1 20A7 WNX1 1808 ZERROR 1BF9 ZPCH 0098 ZSPLIT 2049
|
||
TOPERM 19A8 WR0 24BD ZFCLR 1314 ZPCL 0096 ZSTAKH 0600
|
||
TORES 1C31 WRDLEN 00C3 ZFIRST 1139 ZPCM 0097 ZSTAKL 0500
|
||
TORESL 000D WRONG 24BB ZFLAG 00CD ZPCPNT 009A ZSTART 1C3E
|
||
TOTOP 209C WSTACK 2429 ZFSET 1301 ZPCSAV 240F ZSTEX 1941
|
||
TPOSIT 00F3 XSIZE 0027 ZFSETP 12ED ZPOP 1694 ZSUB 1430
|
||
TRUE 00FF YES 223F ZFWORD 0018 ZPRB 118D ZUSL 1D20
|
||
TRY2 1516 YESL 0004 ZGET 1362 ZPRC 1621 ZVALUE 124B
|
||
TRY3 1522 YSIZE 0017 ZGETB 1372 ZPRD 11DD ZVER 10A5
|
||
TSET 00CA ZADD 1423 ZGETP 138F ZPRI 1079 ZVERS 0000
|
||
UDIV 14C1 ZBAND 12E1 ZGETPT 13D7 ZPRINT 123D ZVOCAB 0008
|
||
UDLOOP 14CA ZBCOM 1253 ZGLOBA 000C ZPRN 1626 ZVR 10AC
|
||
UDNEXT 14E2 ZBEGIN 2600 ZGO 0006 ZPRR 1096 ZWORD 00CE
|
||
UNDER 0EDF ZBOR 12D5 ZGRTR 1277 ZPTSIZ 1158 ZZERO 1127
|
||
USL0 1D46 ZBTST 12C2 ZID 0002 ZPURBT 000E
|
||
V2A1 0E85 ZCALL 1534 ZIGRTR 1282 ZPURE 00A4
|
||
VALUE 008C ZCALL1 156B ZIN 12B2 ZPUSH 168D
|
||
VARGET 0E9F ZCALL2 1592 ZINC 1175 ZPUT 15C7
|
||
|
||
***** NO ERRORS DETECTED *****
|