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 *****