AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 1 0000 ; -------------------------- 0000 ; ZIP/6502 2.0 VERSION C 0000 ; Z-CODE INTERPRETER PROGRAM 0000 ; FOR CBM PLUS/4 0000 ; -------------------------- 0000 ; INFOCOM, INC. 0000 ; 55 WHEELER STREET 0000 ; CAMBRIDGE, MA 02136 0000 ; COMPANY PRIVATE -- NOT FOR DISTRIBUTION 1000 MSTART EQU $1000 ; START OF FREE PROGRAM RAM 0003 ZEROPG EQU $03 ; START OF FREE Z-PAGE RAM 007F ZPGTOP EQU $7F ; END OF FREE Z-PAGE RAM 0000 DEBUG EQU 0 ; ASSEMBLY FLAG FOR DEBUGGER 0000 ; ----------- 0000 ; ERROR CODES 0000 ; ----------- 0000 ; 00 -- INSUFFICIENT RAM 0000 ; 01 -- ILLEGAL X-OP 0000 ; 02 -- ILLEGAL 0-OP 0000 ; 03 -- ILLEGAL 1-OP 0000 ; 04 -- ILLEGAL 2-OP 0000 ; 05 -- Z-STACK UNDERFLOW 0000 ; 06 -- Z-STACK OVERFLOW 0000 ; 07 -- ILLEGAL PROPERTY LENGTH (GETP) 0000 ; 08 -- DIVISION BY ZERO 0000 ; 09 -- ILLEGAL ARGUMENT COUNT (EQUAL?) 0000 ; 10 -- ILLEGAL PROPERTY ID (PUTP) 0000 ; 11 -- ILLEGAL PROPERTY LENGTH (PUTP) 0000 ; 12 -- DISK ADDRESS OUT OF RANGE 0000 ; 13 -- PARSER OVERFLOW 0000 ; 14 -- DRIVE ACCESS 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 1000 IOBUFF EQU MSTART ; 256-BYTE DISK BUFFER 1100 ZSTAKL EQU MSTART+$100 ; Z-STACK LSBS 1200 ZSTAKH EQU MSTART+$200 ; Z-STACK MSBS 1300 PTABL EQU MSTART+$300 ; PAGING TABLE LSBS ($A0 BYTES) 13A0 PTABH EQU MSTART+$3A0 ; PAGING TABLE MSBS ($A0 BYTES) 1450 LRUMAP EQU MSTART+$450 ; TIMESTAMP MAP ($A0 BYTES) (BM 3/7/85) 1500 LOCALS EQU MSTART+$500 ; LOCAL VARIABLE STORAGE (32 BYTES) 1530 LBUFF EQU MSTART+$530 ; LINE INPUT BUFFER (80 BYTES) 1590 BUFSAV EQU MSTART+$590 ; I/O AUX BUFFER (40 BYTES) 1600 ZIP EQU MSTART+$600 ; START OF EXECUTABLE CODE 3200 ZBEGIN EQU ZIP+$1C00 ; START OF Z-CODE (ASSUME 7K ZIP) 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 --- 0003 OPCODE EQU ZEROPG ; (BYTE) CURRENT OPCODE 0004 NARGS EQU OPCODE+1 ; (BYTE) # ARGUMENTS 0005 ARG1 EQU OPCODE+2 ; (WORD) ARGUMENT #1 0007 ARG2 EQU OPCODE+4 ; (WORD) ARGUMENT #2 0009 ARG3 EQU OPCODE+6 ; (WORD) ARGUMENT #3 000B ARG4 EQU OPCODE+8 ; (WORD) ARGUMENT #4 000D ABYTE EQU OPCODE+10 ; (BYTE) X-OP ARGUMENT BYTE 000E ADEX EQU OPCODE+11 ; (BYTE) X-OP ARGUMENT INDEX 000F VALUE EQU OPCODE+12 ; (WORD) VALUE RETURN REGISTER 0011 I EQU VALUE+2 ; (WORD) GEN-PURPOSE REGISTER #1 0013 J EQU VALUE+4 ; (WORD) GEN-PURPOSE REGISTER #2 0015 K EQU VALUE+6 ; (WORD) GEN-PURPOSE REGISTER #3 0017 ZSP EQU VALUE+8 ; (BYTE) Z-STACK POINTER 0018 OLDZSP EQU ZSP+1 ; (BYTE) OLD Z-STACK POINTER 0019 ZPC EQU ZSP+2 ; (3 BYTES) ZIP PROGRAM COUNTER 0019 ZPCL EQU ZPC ; (BYTE) LOW 8 BITS OF [ZPC] 001A ZPCM EQU ZPC+1 ; (BYTE) MIDDLE 8 BITS OF [ZPC] 001B ZPCH EQU ZPC+2 ; (BYTE) HIGH BIT OF [ZPC] 001C ZPCFLG EQU ZPC+3 ; (BYTE) FLAG: "TRUE" IF [ZPCPNT] VALID 001D ZPCPNT EQU ZPC+4 ; (WORD) ABS POINTER TO CURRENT Z-PAGE 001F MPC EQU ZPC+6 ; (3 BYTES) MEMORY PROGRAM COUNTER 001F MPCL EQU MPC ; (BYTE) LOW 8 BITS OF [MPC] 0020 MPCM EQU MPC+1 ; (BYTE) MIDDLE 8 BITS OF [MPC] 0021 MPCH EQU MPC+2 ; (BYTE) HIGH BIT OF [MPC] 0022 MPCFLG EQU MPC+3 ; (BYTE) FLAG: "TRUE" IF [MPCPNT] VALID 0023 MPCPNT EQU MPC+4 ; (WORD) ABS POINTER TO CURRENT M-PAGE 0025 LRU EQU MPC+6 ; (BYTE) PAGING INDEX 0026 ZCODE EQU LRU+1 ; (BYTE) 1ST ABSOLUTE PAGE OF PRELOAD 0027 ZPURE EQU LRU+2 ; (BYTE) 1ST VIRTUAL PAGE OF "PURE" Z-CODE 0028 PAGE0 EQU LRU+3 ; (BYTE) 1ST PAGE OF ACTUAL SWAPPING SPACE 0029 PMAX EQU LRU+4 ; (BYTE) MAXIMUM # OF SWAPPING PAGES 002A ZPAGE EQU LRU+5 ; (BYTE) CURRENT SWAPPING PAGE 002B TARGET EQU LRU+6 ; (WORD) TARGET PAGE FOR SWAPPING 002D STAMP EQU LRU+8 ; (BYTE) CURRENT TIMESTAMP (BM 3/8/85) 002E SWAP EQU LRU+9 ; (BYTE) EARLIEST PAGE (BM 3/8/85) 002F GLOBAL EQU LRU+10 ; (WORD) GLOBAL VARIABLE POINTER 0031 VOCAB EQU GLOBAL+2 ; (WORD) VOCAB TABLE POINTER 0033 FWORDS EQU GLOBAL+4 ; (WORD) F-WORDS TABLE POINTER 0035 OBJTAB EQU GLOBAL+6 ; (WORD) OBJECT TABLE POINTER 0000 ; Z-STRING MANIPULATION VARIABLES 0037 IN EQU GLOBAL+8 ; (6 BYTES) INPUT BUFFER 003D OUT EQU IN+6 ; (6 BYTES) OUTPUT BUFFER AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 4 --- ZIP Z-PAGE VARIABLES --- 0043 SOURCE EQU OUT+6 ; (BYTE) SOURCE BUFFER POINTER 0044 RESULT EQU SOURCE+1 ; (BYTE) RESULT TABLE POINTER 0045 LINLEN EQU SOURCE+2 ; (BYTE) LENGTH OF CURRENT LINE 0046 WRDLEN EQU SOURCE+3 ; (BYTE) LENGTH OF CURRENT WORD 0047 ENTRY EQU SOURCE+4 ; (WORD) ADDR OF CURRENT RESULT ENTRY 0049 NENTS EQU SOURCE+6 ; (WORD) # ENTRIES IN VOCAB TABLE 004B ESIZE EQU SOURCE+8 ; (BYTE) SIZE OF VOCAB TABLE ENTRIES 004C PSET EQU SOURCE+9 ; (BYTE) PERMANENT CHARSET 004D TSET EQU SOURCE+10 ; (BYTE) TEMPORARY CHARSET 004E ZCHAR EQU SOURCE+11 ; (BYTE) CURRENT Z-CHAR 004F OFFSET EQU SOURCE+12 ; (BYTE) F-WORD TABLE OFFSET 0050 ZFLAG EQU SOURCE+13 ; (BYTE) Z-WORD ACCESS FLAG 0051 ZWORD EQU SOURCE+14 ; (WORD) CURRENT Z-WORD 0053 CONCNT EQU SOURCE+16 ; (BYTE) Z-STRING SOURCE COUNTER 0054 CONIN EQU SOURCE+17 ; (BYTE) CONVERSION SOURCE INDEX 0055 CONOUT EQU SOURCE+18 ; (BYTE) CONVERSION DEST INDEX 0000 ; MATH PACKAGE VARIABLES 0056 QUOT EQU SOURCE+19 ; (WORD) QUOTIENT FOR DIVISION 0058 REMAIN EQU QUOT+2 ; (WORD) REMAINDER FOR DIVISION 005A MTEMP EQU QUOT+4 ; (WORD) MATH TEMPORARY REGISTER 005C QSIGN EQU QUOT+6 ; (BYTE) SIGN OF QUOTIENT 005D RSIGN EQU QUOT+7 ; (BYTE) SIGN OF REMAINDER 005E DIGITS EQU QUOT+8 ; (BYTE) DIGIT COUNT FOR "PRINTN" 005F TIMEFL EQU QUOT+9 ; (BYTE) "TRUE" IF TIME MODE 0060 LENGTH EQU TIMEFL+1 ; (BYTE) LENGTH OF LINE IN [LINBUF] 0061 OLDLEN EQU TIMEFL+2 ; (BYTE) OLD LINE LENGTH 0062 SCRIPT EQU TIMEFL+3 ; (BYTE) SCRIPT ENABLE FLAG 0063 OLDX EQU TIMEFL+4 ; (BYTE) OLD CURSOR X 0064 OLDY EQU TIMEFL+5 ; (BYTE) OLD CURSOR Y 0065 LINCNT EQU TIMEFL+6 ; (BYTE) LINE COUNTER 0066 LMAX EQU TIMEFL+7 ; (BYTE) MAX # LINES/SCREEN 0067 IOCHAR EQU TIMEFL+8 ; (BYTE) CHARACTER BUFFER 0068 SLINE EQU IOCHAR+1 ; (BYTE) BORDERLINE FOR SPLIT 0069 SPSTAT EQU IOCHAR+2 ; (BYTE) SPLIT SCREEN STATUS FLAG 006A PSTAT EQU IOCHAR+3 ; (BYTE) PRINTER STATUS FLAG 006B PRLEN EQU IOCHAR+4 ; (BYTE) SCRIPT LINE LENGTH 006C LFROM EQU IOCHAR+5 ; (WORD) SCROLLING INDEX #1 006E LTO EQU IOCHAR+7 ; (WORD) SCROLLING INDEX #2 0070 DBLOCK EQU IOCHAR+9 ; (WORD) Z-BLOCK TO READ 0072 DBUFF EQU DBLOCK+2 ; (WORD) RAM PAGE TO ACCESS (LSB = 0) 0074 TRACK EQU DBLOCK+4 ; (BYTE) TARGET TRACK 0075 SECTOR EQU DBLOCK+5 ; (BYTE) TARGET SECTOR 0076 GPOSIT EQU DBLOCK+6 ; (BYTE) DEFAULT SAVE POSITION 0077 GDRIVE EQU DBLOCK+7 ; (BYTE) DEFAULT SAVE DRIVE 0078 TPOSIT EQU DBLOCK+8 ; (BYTE) TEMP SAVE POSITION AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- EQUATES PAGE 5 --- ZIP Z-PAGE VARIABLES --- 0079 TDRIVE EQU DBLOCK+9 ; (BYTE) TEMP SAVE DRIVE 007A DRIVE EQU DBLOCK+10 ; (BYTE) CURRENT DRIVE 007B DVD EQU DBLOCK+11 ; (WORD) DISK DIVIDEND 007D DSOR EQU DVD+2 ; (WORD) DISK DIVISOR 007F DTEMP EQU DVD+4 ; (WORD) DISK TEMP VARIABLE END INCLUD HARDEQ.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 6 --- HARDWARE EQUATES: CBM PLUS/4 --- 0000 ; ---------------------------------- 0000 ; MACHINE-DEPENDENT SOFTWARE EQUATES 0000 ; ---------------------------------- 0002 FAST EQU $02 ; (BYTE) FAST-READ AVAILABLE FLAG 00D8 CSHAPE EQU $D8 ; (BYTE) CURRENT CURSOR SHAPE 00D9 COLUMN EQU $D9 ; (BYTE) CURRENT CURSOR COLUMN 00DA SROW EQU $DA ; (WORD) CURRENT SCREEN ROW ADDR 00DC CROW EQU $DC ; (WORD) CURRENT COLOR ROW ADDR 00DE BLINK EQU $DE ; (WORD) BLINK TIMER 00E0 FINDEX EQU $E0 ; (BYTE) FAST-READ INDEX 00E1 FDATA EQU $E1 ; (BYTE) FAST-READ DATA BUFFER 00E2 FASTEN EQU $E2 ; (BYTE) FAST-READ ENABLE FLAG 0000 ; --------------------------- 0000 ; CBM PLUS/4 HARDWARE EQUATES 0000 ; --------------------------- 0800 COLRAM EQU $0800 ; COLOR (ATTRIBUTE) RAM 0C00 SCREEN EQU $0C00 ; SCREEN RAM 0027 XSIZE EQU 39 ; X-SIZE OF SCREEN 0018 YSIZE EQU 24 ; Y-SIZE OF SCREEN 000D EOL EQU $0D ; EOL CHAR 0020 SPACE EQU $20 ; SPACE CHAR 0014 BACKSP EQU $14 ; BACKSPACE 0051 WHITE EQU $51 ; WHITE COLOR FOR TEXT 0022 FADDR EQU $22 ; FUNCTION KEY STRING ADDRESS 0076 FKEY EQU $76 ; FUNCTION KEY ID 00A5 TIME EQU $A5 ; SYSTEM JIFFY CLOCK 00EF NDX EQU $EF ; # CHARS IN KEYBOARD QUEUE 053B COLOR EQU $053B ; TEXT COLOR 053C BLINKA EQU $053C ; BLINK ATTRIBUTE ($80 = BLINK) 0543 SHFLAG EQU $0543 ; SHIFT KEY FLAG 07E9 LINKEN EQU $07E9 ; LINE LINK ENABLE (BIT 6) 0000 ; --- 0000 ; TED 0000 ; --- FF00 TED EQU $FF00 ; START OF TED CHIP FF00 T1LSB EQU TED ; TIMER #1 LSB FF01 T1MSB EQU TED+1 ; TIMER #1 MSB FF02 T2LSB EQU TED+2 ; TIMER #2 LSB FF03 T2MSB EQU TED+3 ; TIMER #2 MSB FF04 T3LSB EQU TED+4 ; TIMER #3 LSB AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 7 --- HARDWARE EQUATES: CBM PLUS/4 --- FF05 T3MSB EQU TED+5 ; TIMER #3 MSB FF06 VSCROL EQU TED+6 ; V-SCROLL, DISPLAY CTRL FF07 HSCROL EQU TED+7 ; H-SCROLL, DISPLAY CTRL FF08 KEYLAT EQU TED+8 ; KEYBOARD LATCH FF09 INTREG EQU TED+9 ; INTERRUPT FLAGS FF0A IMASK EQU TED+10 ; INTERRUPT MASK FF0B RASTER EQU TED+11 ; RASTER LSB FF0C CURSH EQU TED+12 ; CURSOR POSITION MSB FF0D CURSL EQU TED+13 ; CURSOR POSITION LSB FF0E V1FLSB EQU TED+14 ; VOICE #1 FREQ LSB FF0F V2FLSB EQU TED+15 ; VOICE #2 FREQ LSB FF10 V2FMSB EQU TED+16 ; VOICE #2 FREQ MSB FF11 VOLUME EQU TED+17 ; VOLUME CTRL/VOICE SELECT FF12 BITMAP EQU TED+18 ; BITMAP BASE ADDR/VOICE #1 MSB FF13 CHBASE EQU TED+19 ; CHAR BASE ADDR FF14 SBASE EQU TED+20 ; SCREEN BASE ADDR FF15 BGCOL0 EQU TED+21 ; BACKGROUND COLOR #0 FF16 BGCOL1 EQU TED+22 ; BACKGROUND COLOR #1 FF17 BGCOL2 EQU TED+23 ; BACKGROUND COLOR #2 FF18 BGCOL3 EQU TED+24 ; BACKGROUND COLOR #3 FF19 BORDER EQU TED+25 ; BORDER COLOR FF1A BMRMSB EQU TED+26 ; BIT MAP RELOAD MSB FF1B BMRLSB EQU TED+27 ; BIT MAP RELOAD LSB FF1C VLINEH EQU TED+28 ; VERTICAL LINE MSB FF1D VLINEL EQU TED+29 ; VERTICAL LINE LSB FF1E HSCAN EQU TED+30 ; HORIZONTAL LINE MSB FF1F BLINRT EQU TED+31 ; BLINK RATE/VERTICAL SUBADDR FF3E ROMIN EQU TED+62 ; ROM ENABLE FF3F ROMOUT EQU TED+63 ; ROM DISABLE 0000 ; ------------------- 0000 ; KERNAL JUMP VECTORS 0000 ; ------------------- FFC6 CHKIN EQU $FFC6 ; OPEN CHANNEL FOR INPUT FFC9 CHKOUT EQU $FFC9 ; OPEN CHANNEL FOR OUTPUT FFCF CHRIN EQU $FFCF ; INPUT CHARACTER FROM CHANNEL FFD2 CHROUT EQU $FFD2 ; OUTPUT CHARACTER TO CHANNEL FFE7 CLALL EQU $FFE7 ; CLOSE ALL CHANNELS & FILES FFC3 CLOSE EQU $FFC3 ; CLOSE A FILE FFCC CLRCHN EQU $FFCC ; CLEAR CHANNEL FFE4 GETIN EQU $FFE4 ; GET CHAR FROM KEYBOARD QUEUE FFC0 OPEN EQU $FFC0 ; OPEN A FILE FFF0 PLOT EQU $FFF0 ; READ/SET CURSOR POSITION FFB7 READST EQU $FFB7 ; READ I/O STATUS FFBA SETLFS EQU $FFBA ; SET FILE ATTRIBUTES FF90 SETMSG EQU $FF90 ; SET KERNAL MESSAGES FFBD SETNAM EQU $FFBD ; SET FILENAME FF49 FUNCT EQU $FF49 ; DEFINE FUNCTION KEYS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 8 --- HARDWARE EQUATES: CBM PLUS/4 --- END INCLUD COLD.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 9 --- MACHINE COLDSTART: CBM PLUS/4 --- 1600 ORG ZIP 1600 ; --------- 1600 ; COLDSTART 1600 ; --------- 1600 78 COLD: SEI ; DISABLE INTERRUPTS 1601 A906 LDA #6 ; DISABLE FUNCTION KEYS 7-1 1603 8576 STA FKEY ; LEAVE "HELP" (F8) ALONE 1605 A900 COLD0: LDA #0 1607 2049FF JSR FUNCT 160A C676 DEC FKEY 160C A576 LDA FKEY 160E 10F5 BPL COLD0 1610 A9C0 LDA #$C0 ; COPY $C000-$FCFF TO RAM 1612 8512 STA I+HI ; SET UP MSB 1614 AA TAX ; INIT PAGE COUNTER 1615 A900 LDA #0 ; SET UP LSB 1617 8511 STA I+LO 1619 A8 TAY ; INIT PAGE INDEX 161A B111 COLD1: LDA (I),Y ; COPY ROM 161C 9111 STA (I),Y ; INTO RAM 161E C8 INY 161F D0F9 BNE COLD1 1621 E612 INC I+HI ; NEXT PAGE 1623 E8 INX 1624 E0FD CPX #$FD 1626 90F2 BCC COLD1 1628 A9FF LDA #$FF ; COPY $FF40-$FFFF 162A 8512 STA I+HI 162C A040 LDY #$40 162E B111 COLD2: LDA (I),Y 1630 9111 STA (I),Y 1632 C8 INY 1633 D0F9 BNE COLD2 1635 8D3FFF STA ROMOUT ; DISABLE ROMS 1638 A93F LDA #$3F ; PATCH THIS KERNAL ROUTINE 163A 8DE107 STA $07E1 ; TO PREVENT ROM INTERFERENCE ; LDA #LOW WARM1 ; CHANGE THE HARDWARE RESET VECTOR ; STA $FFFC ; TO POINT TO WARMSTART ; LDA #HIGH WARM1 ; STA $FFFD AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 10 --- MACHINE COLDSTART: CBM PLUS/4 --- 163D 58 CLI ; RE-ENABLE INTERRUPTS 163E A931 LDA #%00110001 ; GRAY 1640 8D15FF STA BGCOL0 ; BACKGROUND 1643 8D19FF STA BORDER ; AND BORDER 1646 A90E LDA #$0E 1648 20D2FF JSR CHROUT ; USE UPPER/LOWER CHARS 164B A908 LDA #$08 164D 20D2FF JSR CHROUT ; DISABLE CHARSET CHANGES 1650 A900 LDA #0 1652 2090FF JSR SETMSG ; DISABLE KERNAL MESSAGES 1655 4C7116 JMP WARM1 ; BRANCH ALWAYS 1658 ; --------------- 1658 ; WARMSTART ENTRY 1658 ; --------------- 1658 54686520 SLOAD: DB "The story is loading ..." 1670 0D DB EOL 0019 SLOADL EQU $-SLOAD 1671 D8 WARM1: CLD 1672 A2FF LDX #$FF 1674 9A TXS ; RESET MACHINE STACK 1675 20E7FF JSR CLALL ; CLOSE EVERYTHING 1678 20922A JSR CLS ; CLEAR SCREEN, ETC. 167B A008 LDY #8 ; POSITION "STORY LOADING" MESSAGE 167D A20B LDX #11 ; AT (8,11) 167F 18 CLC 1680 20F0FF JSR PLOT 1683 A258 LDX #LOW SLOAD 1685 A916 LDA #HIGH SLOAD 1687 A019 LDY #SLOADL 1689 20A329 JSR DLINE ; "THE STORY IS LOADING ..." 168C A908 LDA #8 ; MAKE BOOT DRIVE 168E 20D72E JSR DOPEN ; AND OPEN IT ; LDA FAST ; FAST-READ AVAILABLE? ; BEQ WARM2 ; NO, SKIP AHEAD ; JSR FINIT ; ELSE INIT FAST-READ 1691 ; FALL THROUGH TO ZIP WARMSTART AT "WARM2" END AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT INIT PAGE 11 --- MACHINE COLDSTART: CBM PLUS/4 --- INCLUD WARM.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 12 --- WARMSTART ROUTINE --- 1691 ; ------------- 1691 ; ZIP WARMSTART 1691 ; ------------- 1691 A900 WARM2: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES 1693 A203 LDX #ZEROPG 1695 9500 ST0: STA 0,X 1697 E8 INX 1698 E07F CPX #ZPGTOP 169A 90F9 BCC ST0 169C ; INIT THE PAGING TABLES & TIMESTAMP MAP (BM 3/8/85) 169C AA TAX ; = 0 169D A8 TAY ; DITTO 169E A9FF ST1: LDA #$FF 16A0 9D0013 STA PTABL,X ; PAGING TABLES ARE INITIALIZED 16A3 9DA013 STA PTABH,X ; TO ALL $FF 16A6 98 TYA ; TIMESTAMP MAP IS INITIALIZED 16A7 9D5014 STA LRUMAP,X ; TO ZEROES 16AA E8 INX 16AB E0A0 CPX #$A0 16AD 90EF BCC ST1 16AF E617 INC ZSP ; INIT Z-STACK POINTERS 16B1 E618 INC OLDZSP ; TO "1" 16B3 E662 INC SCRIPT ; ENABLE SCRIPTING 16B5 E62D INC STAMP ; INIT TIMESTAMP TO 1 (BM 3/8/85) 16B7 ; GRAB THE FIRST BLOCK OF PRELOAD 16B7 A932 LDA #HIGH ZBEGIN ; MSB OF PRELOAD START ADDRESS 16B9 8526 STA ZCODE ; FREEZE IT HERE 16BB 8573 STA DBUFF+HI ; LSB IS ALWAYS ZERO 16BD 20D92A JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0 16C0 ; EXTRACT GAME DATA FROM Z-CODE HEADER 16C0 AE0432 LDX ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER 16C3 E8 INX ; ADD 1 TO GET 16C4 8627 STX ZPURE ; 1ST "PURE" PAGE OF Z-CODE 16C6 8A TXA ; ADD START PAGE OF PRELOAD 16C7 18 CLC ; TO CALC ABSOLUTE START ADDRESS 16C8 6526 ADC ZCODE ; OF PAGING SPACE 16CA 8528 STA PAGE0 16CC 20F525 JSR MEMTOP ; RETURNS TOP RAM PAGE IN [A] 16CF 38 SEC 16D0 E528 SBC PAGE0 ; SUBTRACT ADDRESS OF PAGING SPACE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 13 --- WARMSTART ROUTINE --- 16D2 F002 BEQ NORAM 16D4 B005 BCS SETNP ; ERROR IF NOT ENOUGH RAM 16D6 ; *** ERROR #0 -- INSUFFICIENT RAM *** 16D6 A900 NORAM: LDA #0 16D8 4C9025 JMP ZERROR 16DB C9A0 SETNP: CMP #$A0 ; DON'T ALLOW MORE THAN 16DD 9002 BCC SETA0 ; $A0 PAGES 16DF A9A0 LDA #$A0 ; (BM 3/8/85) 16E1 8529 SETA0: STA PMAX ; SET # SWAPPING PAGES 16E3 AD0132 LDA ZBEGIN+ZMODE 16E6 0920 ORA #%00100000 ; ENABLE SPLIT-SCREEN 16E8 8D0132 STA ZBEGIN+ZMODE 16EB 2902 AND #%00000010 ; ISOLATE STATUS-FORMAT BIT 16ED 855F STA TIMEFL ; 0=SCORE, NZ=TIME 16EF AD0C32 LDA ZBEGIN+ZGLOBA ; GET MSB OF GLOBAL TABLE ADDR 16F2 18 CLC ; CONVERT TO 16F3 6526 ADC ZCODE ; ABSOLUTE ADDRESS 16F5 8530 STA GLOBAL+HI 16F7 AD0D32 LDA ZBEGIN+ZGLOBA+1 ; LSB NEEDN'T CHANGE 16FA 852F STA GLOBAL+LO 16FC AD1832 LDA ZBEGIN+ZFWORD ; DO SAME FOR FWORDS TABLE 16FF 18 CLC 1700 6526 ADC ZCODE 1702 8534 STA FWORDS+HI 1704 AD1932 LDA ZBEGIN+ZFWORD+1 ; NO CHANGE FOR LSB 1707 8533 STA FWORDS+LO 1709 AD0832 LDA ZBEGIN+ZVOCAB ; NOW DO VOCABULARY TABLE 170C 18 CLC 170D 6526 ADC ZCODE 170F 8532 STA VOCAB+HI 1711 AD0932 LDA ZBEGIN+ZVOCAB+1 ; LSB SAME 1714 8531 STA VOCAB+LO 1716 AD0A32 LDA ZBEGIN+ZOBJEC ; NOT TO MENTION 1719 18 CLC ; THE OBJECT TABLE 171A 6526 ADC ZCODE 171C 8536 STA OBJTAB+HI 171E AD0B32 LDA ZBEGIN+ZOBJEC+1 ; LSB SAME 1721 8535 STA OBJTAB+LO 1723 ; FETCH THE REST OF THE PRELOAD 1723 A570 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 --- 1725 C527 CMP ZPURE ; LOADED LAST PRELOAD PAGE YET? 1727 B006 BCS WARMEX ; YES, TIME TO PLAY! 1729 20D92A JSR GETDSK ; ELSE GRAB NEXT Z-BLOCK 172C 4C2317 JMP LDPRE 172F AD0632 WARMEX: LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE 1732 851A STA ZPCM ; MSB 1734 AD0732 LDA ZBEGIN+ZGO+1 ; AND LSB 1737 8519 STA ZPCL ; HIGH BIT ALREADY ZEROED 1739 20922A JSR CLS ; CLEAR SCREEN, DISABLE SPLIT 173C ; ... 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 --- 173C A900 MLOOP: LDA #0 173E 8504 STA NARGS ; RESET # ARGUMENTS 1740 20B021 JSR NEXTPC ; GET NEXT INSTRUCTION INTO [A] 1743 8503 STA OPCODE ; SAVE IT HERE 1745 IF DEBUG 1745 STA MBYTE 1745 LDA #0 ; BREAKPOINT #0 1745 JSR DOBUG 1745 LDA MBYTE 1745 ENDIF 1745 ; DECODE AN OPCODE 1745 AA TAX ; SET FLAGS 1746 3003 BMI DC0 ; IF POSITIVE, 1748 4C0618 JMP OP2 ; IT'S A 2-OP 174B C9B0 DC0: CMP #$B0 174D B003 BCS DC1 174F 4CD717 JMP OP1 ; OR MAYBE A 1-OP 1752 C9C0 DC1: CMP #$C0 1754 B003 BCS OPEXT 1756 4CC817 JMP OP0 ; PERHAPS A 0-OP 1759 ; -------------- 1759 ; HANDLE AN X-OP 1759 ; -------------- 1759 20B021 OPEXT: JSR NEXTPC ; GRAB THE ARGUMENT ID BYTE 175C 850D STA ABYTE ; HOLD IT HERE 175E A200 LDX #0 1760 860E STX ADEX ; INIT ARGUMENT INDEX 1762 F006 BEQ OPX1 ; JUMP TO TOP OF LOOP 1764 A50D OPX0: LDA ABYTE ; GET ARG BYTE 1766 0A ASL A ; SHIFT NEXT 2 ARG BITS 1767 0A ASL A ; INTO BITS 7 & 6 1768 850D STA ABYTE ; HOLD FOR LATER 176A 29C0 OPX1: AND #%11000000 ; MASK OUT GARBAGE BITS 176C D006 BNE OPX2 176E 205218 JSR GETLNG ; 00 = LONG IMMEDIATE 1771 4C8517 JMP OPXNXT 1774 C940 OPX2: CMP #%01000000 ; IS IT A SHORT IMMEDIATE? 1776 D006 BNE OPX3 ; NO, KEEP GUESSING 1778 204E18 JSR GETSHT ; 01 = SHORT IMMEDIATE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 16 --- MAIN LOOP --- 177B 4C8517 JMP OPXNXT 177E C980 OPX3: CMP #%10000000 ; LAST TEST 1780 D017 BNE OPX4 ; 11 = NO MORE ARGUMENTS 1782 206618 JSR GETVAR ; 10 = VARIABLE 1785 A60E OPXNXT: LDX ADEX ; RETRIEVE ARGUMENT INDEX 1787 A50F LDA VALUE+LO ; GRAB LSB OF VALUE 1789 9505 STA ARG1+LO,X ; STORE IN ARGUMENT TABLE 178B A510 LDA VALUE+HI ; GRAB MSB OF VALUE 178D 9506 STA ARG1+HI,X ; STORE THAT, TOO 178F E604 INC NARGS ; UPDATE ARGUMENT COUNTER 1791 E8 INX 1792 E8 INX 1793 860E STX ADEX ; UPDATE INDEX 1795 E008 CPX #8 ; DONE 4 ARGUMENTS YET? 1797 90CB BCC OPX0 ; NO, GET SOME MORE 1799 ; ALL X-OP ARGUMENTS READY 1799 A503 OPX4: LDA OPCODE ; IS THIS 179B C9E0 CMP #$E0 ; AN EXTENDED 2-OP? 179D B003 BCS DOXOP ; NO, IT'S A REAL X-OP 179F 4C2F18 JMP OP2EX ; ELSE TREAT IT LIKE A 2-OP 17A2 A210 DOXOP: LDX #LOW OPTX ; GET ADDR OF X-OP TABLE 17A4 A01A LDY #HIGH OPTX ; INTO [X/Y] 17A6 291F AND #%00011111 ; ISOLATE OP ID BITS 17A8 C90C CMP #NOPSX ; IS IT A LEGAL X-OP? 17AA 9005 BCC DODIS ; YUP; TIME TO DISPATCH IT 17AC ; *** ERROR #1 -- ILLEGAL X-OP *** 17AC A901 LDA #1 17AE 4C9025 JMP ZERROR 17B1 ; --------------- 17B1 ; OPCODE DISPATCH 17B1 ; --------------- 17B1 ; ENTRY: MASKED OPCODE INDEX IN [A] 17B1 ; OP-TABLE ADDR IN X/Y (LSB/MSB) 17B1 8611 DODIS: STX I+LO ; SAVE TABLE ADDRESS 17B3 8412 STY I+HI ; IN A POINTER 17B5 0A ASL A ; WORD-ALIGN THE OP INDEX 17B6 A8 TAY 17B7 B111 LDA (I),Y ; GET LSB OF DISPATCH ADDRESS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 17 --- MAIN LOOP --- 17B9 8DC317 STA GO+LO ; INSTALL AS JSR OPERAND 17BC C8 INY 17BD B111 LDA (I),Y ; SAME WITH MSB 17BF 8DC417 STA GO+HI 17C2 20 DB $20 ; 6502 "JSR" OPCODE 17C3 0000 GO: DW $0000 ; DUMMY OPERAND BYTES 17C5 4C3C17 JMP MLOOP ; GO BACK FOR ANOTHER OPCODE 17C8 ; ------------- 17C8 ; HANDLE A 0-OP 17C8 ; ------------- 17C8 A2A2 OP0: LDX #LOW OPT0 ; GET 0-OP TABLE ADDR 17CA A019 LDY #HIGH OPT0 ; INTO [X/Y] 17CC 290F AND #%00001111 ; ISOLATE 0-OP ID BITS 17CE C90E CMP #NOPS0 ; OUT OF RANGE? 17D0 90DF BCC DODIS ; NO, DISPATCH IT 17D2 ; *** ERROR #2 -- ILLEGAL 0-OP *** 17D2 A902 LDA #2 17D4 4C9025 JMP ZERROR 17D7 ; ------------- 17D7 ; HANDLE A 1-OP 17D7 ; ------------- 17D7 2930 OP1: AND #%00110000 ; ISOLATE ARGUMENT BITS 17D9 D006 BNE OP1A 17DB 205218 JSR GETLNG ; 00 = LONG IMMEDIATE 17DE 4CF217 JMP OP1EX 17E1 C910 OP1A: CMP #%00010000 ; TEST AGAIN 17E3 D006 BNE OP1B 17E5 204E18 JSR GETSHT ; 01 = SHORT IMMEDIATE 17E8 4CF217 JMP OP1EX 17EB C920 OP1B: CMP #%00100000 ; ONE MORE TEST 17ED D012 BNE BADOP1 ; UNDEFINED STATE! 17EF 206618 JSR GETVAR ; 10 = VARIABLE 17F2 204318 OP1EX: JSR V2A1 ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS] 17F5 A2BE LDX #LOW OPT1 ; GET ADDR OF 1-OP TABLE 17F7 A019 LDY #HIGH OPT1 ; INTO [X/Y] 17F9 A503 LDA OPCODE ; RESTORE OPCODE 17FB 290F AND #%00001111 ; ISOLATE OP ID BITS 17FD C910 CMP #NOPS1 ; IF WITHIN RANGE, 17FF 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 --- 1801 ; *** ERROR #3 -- ILLEGAL 1-OP *** 1801 A903 BADOP1: LDA #3 1803 4C9025 JMP ZERROR 1806 ; ------------- 1806 ; HANDLE A 2-OP 1806 ; ------------- 1806 2940 OP2: AND #%01000000 ; ISOLATE 1ST ARG BIT 1808 D006 BNE OP2A 180A 204E18 JSR GETSHT ; 0 = SHORT IMMEDIATE 180D 4C1318 JMP OP2B 1810 206618 OP2A: JSR GETVAR ; 1 = VARIABLE 1813 204318 OP2B: JSR V2A1 ; [VALUE] TO [ARG1], UPDATE [NARGS] 1816 A503 LDA OPCODE ; RESTORE OPCODE BYTE 1818 2920 AND #%00100000 ; ISOLATE 2ND ARG BIT 181A D006 BNE OP2C 181C 204E18 JSR GETSHT ; 0 = SHORT IMMEDIATE 181F 4C2518 JMP OP2D 1822 206618 OP2C: JSR GETVAR ; 1 = VARIABLE 1825 A50F OP2D: LDA VALUE+LO ; MOVE 2ND [VALUE] 1827 8507 STA ARG2+LO ; INTO [ARG2] 1829 A510 LDA VALUE+HI 182B 8508 STA ARG2+HI 182D E604 INC NARGS ; UPDATE ARGUMENT COUNT 182F ; EXECUTE A 2-OP OR EXTENDED 2-OP 182F A2DE OP2EX: LDX #LOW OPT2 ; LSB OF DISPATCH TABLE 1831 A019 LDY #HIGH OPT2 ; MSB 1833 A503 LDA OPCODE ; RESTORE OPCODE BYTE 1835 291F AND #%00011111 ; ISOLATE OP ID BITS 1837 C919 CMP #NOPS2 1839 B003 BCS BADOP2 ; ERROR IF OUT OF RANGE 183B 4CB117 JMP DODIS ; ELSE DISPATCH 183E ; *** ERROR #4 -- ILLEGAL 2-OP **** 183E A904 BADOP2: LDA #4 1840 4C9025 JMP ZERROR 1843 ; -------------------------------------- 1843 ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS] 1843 ; -------------------------------------- 1843 A50F V2A1: LDA VALUE+LO 1845 8505 STA ARG1+LO 1847 A510 LDA VALUE+HI 1849 8506 STA ARG1+HI AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 19 --- MAIN LOOP --- 184B E604 INC NARGS 184D 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 --- 184E ; ----------------------- 184E ; FETCH A SHORT IMMEDIATE 184E ; ----------------------- 184E A900 GETSHT: LDA #0 ; MSB IS ZERO 1850 F003 BEQ GETV ; FETCH LSB FROM Z-CODE 1852 ; ---------------------- 1852 ; FETCH A LONG IMMEDIATE 1852 ; ---------------------- 1852 20B021 GETLNG: JSR NEXTPC ; GRAB MSB 1855 8510 GETV: STA VALUE+HI 1857 20B021 JSR NEXTPC ; GRAB LSB 185A 850F STA VALUE+LO 185C 60 RTS 185D ; ---------------- 185D ; FETCH A VARIABLE 185D ; ---------------- 185D ; FROM INSIDE AN OPCODE (VARIABLE ID IN [A]) 185D AA VARGET: TAX ; IF NON-ZERO, 185E D00B BNE GETVR1 ; ACCESS A VARIABLE 1860 208C18 JSR POPVAL ; ELSE PULL VAR OFF Z-STACK 1863 4CA218 JMP PSHVAL ; WITHOUT ALTERING STACK 1866 ; FROM THE MAIN LOOP (VARIABLE ID IN Z-CODE) 1866 20B021 GETVAR: JSR NEXTPC ; GRAB VAR-TYPE BYTE 1869 F021 BEQ POPVAL ; VALUE IS ON Z-STACK 186B ; IS VARIABLE LOCAL OR GLOBAL? 186B C910 GETVR1: CMP #$10 ; IF >= 16, 186D B010 BCS GETVRG ; IT'S GLOBAL 186F ; HANDLE A LOCAL VARIABLE 186F 38 GETVRL: SEC 1870 E901 SBC #1 ; FORM A ZERO-ALIGNED 1872 0A ASL A ; WORD INDEX 1873 AA TAX ; INTO THE [LOCALS] TABLE 1874 BD0015 LDA LOCALS+LO,X ; GRAB LSB 1877 850F STA VALUE+LO 1879 BD0115 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 --- 187C 8510 STA VALUE+HI 187E 60 RTS 187F ; HANDLE A GLOBAL VARIABLE 187F 20F018 GETVRG: JSR GVCALC ; GET ADDRESS OF GLOBAL INTO [I] 1882 B111 LDA (I),Y ; MSB OF GLOBAL ([Y] = 0) 1884 8510 STA VALUE+HI 1886 C8 INY ; = 1 1887 B111 LDA (I),Y ; LSB OF GLOBAL 1889 850F STA VALUE+LO ; SAVE IT 188B 60 RTS ; AND WE'RE DONE 188C ; ---------------------------------- 188C ; POP Z-STACK INTO [VALUE] AND [X/A] 188C ; ---------------------------------- 188C C617 POPVAL: DEC ZSP 188E F00D BEQ UNDER ; UNDERFLOW IF ZERO! 1890 A417 LDY ZSP ; READ STACK POINTER 1892 BE0011 LDX ZSTAKL,Y ; GRAB LSB OF STACK VALUE 1895 860F STX VALUE+LO ; GIVE TO [VALUE] 1897 B90012 LDA ZSTAKH,Y ; ALSO GRAB MSB 189A 8510 STA VALUE+HI ; A SIMILAR FATE 189C 60 RTS 189D ; *** ERROR #5 -- Z-STACK UNDERFLOW *** 189D A905 UNDER: LDA #5 189F 4C9025 JMP ZERROR 18A2 ; ----------------------- 18A2 ; PUSH [VALUE] TO Z-STACK 18A2 ; ----------------------- 18A2 A60F PSHVAL: LDX VALUE+LO 18A4 A510 LDA VALUE+HI 18A6 ; --------------------- 18A6 ; PUSH [X/A] TO Z-STACK 18A6 ; --------------------- 18A6 A417 PUSHXA: LDY ZSP ; READ STACK POINTER 18A8 990012 STA ZSTAKH,Y ; PUSH MSB IN [A] 18AB 8A TXA 18AC 990011 STA ZSTAKL,Y ; AND LSB IN [X] 18AF E617 INC ZSP ; UPDATE Z-STACK POINTER 18B1 F001 BEQ OVER ; OVERFLOW IF ZEROED! 18B3 60 RTS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 22 --- OPCODE SUPPORT SUBROUTINES --- 18B4 ; *** ERROR #6 -- Z-STACK OVERFLOW *** 18B4 A906 OVER: LDA #6 18B6 4C9025 JMP ZERROR 18B9 ; -------------- 18B9 ; RETURN A VALUE 18B9 ; -------------- 18B9 ; FROM WITHIN AN OPCODE (VARIABLE ID IN [A]) 18B9 AA VARPUT: TAX ; IF ZERO, 18BA D013 BNE PUTVR1 18BC C617 DEC ZSP ; FLUSH TOP WORD OFF STACK 18BE D0E2 BNE PSHVAL ; AND REPLACE WITH [VALUE] 18C0 F0DB BEQ UNDER ; ERROR IF [ZSP] BECAME ZERO! 18C2 ; RETURN A ZERO 18C2 A900 RET0: LDA #0 18C4 ; RETURN BYTE IN [A] 18C4 850F PUTBYT: STA VALUE+LO 18C6 A900 LDA #0 18C8 8510 STA VALUE+HI ; CLEAR MSB 18CA ; RETURN [VALUE] 18CA 20B021 PUTVAL: JSR NEXTPC ; GET VARIABLE ID BYTE 18CD F0D3 BEQ PSHVAL ; [VALUE] GOES TO Z-STACK 18CF ; LOCAL OR GLOBAL VARIABLE? 18CF C910 PUTVR1: CMP #$10 ; IF >= 16, 18D1 B010 BCS PUTVLG ; IT'S GLOBAL 18D3 ; PUT A LOCAL VARIABLE 18D3 38 PUTVLL: SEC 18D4 E901 SBC #1 ; FORM A ZERO-ALIGNED 18D6 0A ASL A ; WORD INDEX 18D7 AA TAX ; INTO THE [LOCALS] TABLE 18D8 A50F LDA VALUE+LO ; GRAB LSB 18DA 9D0015 STA LOCALS+LO,X ; SAVE IN LOCAL TABLE 18DD A510 LDA VALUE+HI ; DO SAME TO 18DF 9D0115 STA LOCALS+HI,X ; MSB 18E2 60 RTS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 23 --- OPCODE SUPPORT SUBROUTINES --- 18E3 ; RETURN A GLOBAL VARIABLE 18E3 20F018 PUTVLG: JSR GVCALC 18E6 A510 LDA VALUE+HI ; GET MSB 18E8 9111 STA (I),Y ; STORE AS 1ST BYTE ([Y] = 0) 18EA C8 INY ; = 1 18EB A50F LDA VALUE+LO ; NOW GET LSB 18ED 9111 STA (I),Y ; STORE AS 2ND BYTE 18EF 60 RTS 18F0 ; ----------------------- 18F0 ; CALC GLOBAL WORD OFFSET 18F0 ; ----------------------- 18F0 ; ENTRY: VAR-ID BYTE (16-255) IN [A] 18F0 ; EXIT: ABSOLUTE ADDRESS OF GLOBAL VAR IN [I] 18F0 ; [Y] = 0 FOR INDEXING 18F0 38 GVCALC: SEC 18F1 E910 SBC #$10 ; FORM A ZERO-ALIGNED INDEX 18F3 A000 LDY #0 ; MAKE SURE MSB OF OFFSET AND [Y] 18F5 8412 STY I+HI ; ARE CLEARED 18F7 0A ASL A ; MULTIPLY OFFSET BY 2 18F8 2612 ROL I+HI ; TO WORD-ALIGN IT 18FA 18 CLC ; ADD OFFSET TO ADDR OF GLOBAL TABLE 18FB 652F ADC GLOBAL+LO ; TO FORM THE ABSOLUTE 18FD 8511 STA I+LO ; ADDRESS OF THE 18FF A512 LDA I+HI ; DESIRED GLOBAL VARIABLE 1901 6530 ADC GLOBAL+HI ; STORE ADDRESS BACK IN [VAL] 1903 8512 STA I+HI ; AS A POINTER 1905 60 WCEX: RTS 1906 ; --------------- 1906 ; PREDICATE FAILS 1906 ; --------------- 1906 20B021 PREDF: JSR NEXTPC ; GET 1ST BRANCH BYTE 1909 100C BPL PREDB ; DO BRANCH IF BIT 7 OFF 190B ; ----------------------- 190B ; IGNORE PREDICATE BRANCH 190B ; ----------------------- 190B ; ENTRY: 1ST BRANCH BYTE IN [A] 190B 2940 PREDNB: AND #%01000000 ; TEST BIT 6 190D 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 --- 190F 4CB021 JMP NEXTPC ; ELSE SKIP OVER 2ND BRANCH BYTE 1912 ; ------------------ 1912 ; PREDICATE SUCCEEDS 1912 ; ------------------ 1912 20B021 PREDS: JSR NEXTPC ; GET 1ST BRANCH BYTE 1915 10F4 BPL PREDNB ; DON'T BRANCH IF BIT 7 CLEAR 1917 ; -------------------------- 1917 ; PERFORM A PREDICATE BRANCH 1917 ; -------------------------- 1917 ; ENTRY: 1ST PRED BYTE IN [A] 1917 AA PREDB: TAX ; SAVE HERE 1918 2940 AND #%01000000 ; LONG OR SHORT BRANCH? 191A F00B BEQ PREDLB ; LONG IF BIT 6 IS CLEAR 191C ; HANDLE A SHORT BRANCH 191C 8A TXA ; RESTORE PRED BYTE 191D 293F AND #%00111111 ; FORM SHORT OFFSET 191F 850F STA VALUE+LO ; USE AS LSB OF BRANCH OFFSET 1921 A900 LDA #0 1923 8510 STA VALUE+HI ; MSB OF OFFSET IS ZERO 1925 F013 BEQ PREDB1 ; DO THE BRANCH 1927 ; HANDLE A LONG BRANCH 1927 8A PREDLB: TXA ; RESTORE 1ST PRED BYTE 1928 293F AND #%00111111 ; FORM MSB OF OFFSET 192A AA TAX ; SAVE HERE FOR REFERENCE 192B 2920 AND #%00100000 ; CHECK SIGN OF 14-BIT VALUE 192D F004 BEQ DOB2 ; POSITIVE IF ZERO, SO USE [X] 192F 8A TXA ; ELSE RESTORE BYTE 1930 09E0 ORA #%11100000 ; EXTEND THE SIGN BIT 1932 AA TAX ; BACK HERE FOR STORAGE 1933 8610 DOB2: STX VALUE+HI 1935 20B021 JSR NEXTPC ; FETCH LSB OF 14-BIT OFFSET 1938 850F STA VALUE+LO 193A ; BRANCH TO Z-ADDRESS IN [VALUE] 193A A510 PREDB1: LDA VALUE+HI ; CHECK MSB OF OFFSET 193C 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 --- 193E A50F LDA VALUE+LO ; IF LSB IS NON-ZERO, 1940 D003 BNE PREDB2 ; MAKE SURE IT ISN'T 1 1942 4C331A JMP ZRFALS ; ELSE DO AN "RFALSE" 1945 C901 PREDB2: CMP #1 ; IF OFFSET = 1 1947 D003 BNE PREDB3 1949 4C281A JMP ZRTRUE ; DO AN "RTRUE" 194C ; ENTRY POINT FOR "JUMP" 194C 208619 PREDB3: JSR DECVAL ; SUBTRACT 2 FROM THE OFFSET 194F 208619 JSR DECVAL ; IN [VALUE] 1952 A900 LDA #0 ; CLEAR THE MSB 1954 8512 STA I+HI ; OF [I] 1956 A510 LDA VALUE+HI ; MAKE MSB OF OFFSET 1958 8511 STA I+LO ; THE LSB OF [I] 195A 0A ASL A ; EXTEND THE SIGN OF OFFSET 195B 2612 ROL I+HI ; INTO MSB OF [I] 195D A50F LDA VALUE+LO ; GET LSB OF OFFSET 195F 18 CLC 1960 6519 ADC ZPCL ; ADD LOW 8 BITS OF ZPC 1962 9006 BCC PREDB5 ; IF OVERFLOWED, 1964 E611 INC I+LO ; UPDATE UPPER 9 BITS 1966 D002 BNE PREDB5 1968 E612 INC I+HI 196A 8519 PREDB5: STA ZPCL ; UPDATE ZPC 196C A511 LDA I+LO ; IF UPPER 9 BITS ARE ZERO, 196E 0512 ORA I+HI ; NO NEED TO CHANGE PAGES 1970 F013 BEQ ZNOOP 1972 A511 LDA I+LO ; ELSE CALC NEW UPPER BITS 1974 18 CLC 1975 651A ADC ZPCM 1977 851A STA ZPCM 1979 A512 LDA I+HI 197B 651B ADC ZPCH 197D 2901 AND #%00000001 ; USE ONLY BIT 0 197F 851B STA ZPCH 1981 A900 LDA #0 1983 851C STA ZPCFLG ; [ZPC] NO LONGER VALID 1985 ; FALL THROUGH ... AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 26 --- OPCODE SUPPORT SUBROUTINES --- 1985 ; ---- 1985 ; NOOP 1985 ; ---- 1985 60 ZNOOP: RTS 1986 ; ----------------- 1986 ; DECREMENT [VALUE] 1986 ; ----------------- 1986 A50F DECVAL: LDA VALUE+LO 1988 38 SEC 1989 E901 SBC #1 198B 850F STA VALUE+LO 198D B002 BCS DVX 198F C610 DEC VALUE+HI 1991 60 DVX: RTS 1992 ; ----------------- 1992 ; INCREMENT [VALUE] 1992 ; ----------------- 1992 E60F INCVAL: INC VALUE+LO 1994 D002 BNE IVX 1996 E610 INC VALUE+HI 1998 60 IVX: RTS 1999 ; ---------------------- 1999 ; MOVE [ARG1] TO [VALUE] 1999 ; ---------------------- 1999 A505 A12VAL: LDA ARG1+LO 199B 850F STA VALUE+LO 199D A506 LDA ARG1+HI 199F 8510 STA VALUE+HI 19A1 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 --- 19A2 ; 0-OPS 19A2 281A OPT0: DW ZRTRUE ; 0 19A4 331A DW ZRFALS ; 1 19A6 371A DW ZPRI ; 2 19A8 541A DW ZPRR ; 3 19AA 8519 DW ZNOOP ; 4 19AC 9E2D DW ZSAVE ; 5 19AE 392E DW ZREST ; 6 19B0 CE25 DW ZSTART ; 7 19B2 5D1A DW ZRSTAK ; 8 19B4 8C18 DW POPVAL ; 9 19B6 B125 DW ZQUIT ; 10 19B8 3D26 DW ZCRLF ; 11 19BA C226 DW ZUSL ; 12 19BC 631A DW ZVER ; 13 000E NOPS0 EQU 14 ; NUMBER OF 0-OPS 19BE ; 1-OPS 19BE C11A OPT1: DW ZZERO ; 0 19C0 CA1A DW ZNEXT ; 1 19C2 D31A DW ZFIRST ; 2 19C4 E61A DW ZLOC ; 3 19C6 F21A DW ZPTSIZ ; 4 19C8 0F1B DW ZINC ; 5 19CA 1A1B DW ZDEC ; 6 19CC 271B DW ZPRB ; 7 19CE 0118 DW BADOP1 ; 8 (UNDEFINED) 19D0 351B DW ZREMOV ; 9 19D2 771B DW ZPRD ; 10 19D4 941B DW ZRET ; 11 19D6 D11B DW ZJUMP ; 12 19D8 D71B DW ZPRINT ; 13 19DA E51B DW ZVALUE ; 14 19DC ED1B DW ZBCOM ; 15 0010 NOPS1 EQU 16 ; NUMBER OF 1-OPS 19DE ; 2-OPS 19DE 3E18 OPT2: DW BADOP2 ; 0 (UNDEFINED) 19E0 9B1E DW ZEQUAL ; 1 19E2 FD1B DW ZLESS ; 2 19E4 111C DW ZGRTR ; 3 19E6 031C DW ZDLESS ; 4 19E8 1C1C DW ZIGRTR ; 5 19EA 4C1C DW ZIN ; 6 19EC 5C1C DW ZBTST ; 7 AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- INIT & MAINLINE PAGE 28 --- OPCODE DISPATCH TABLES --- 19EE 6F1C DW ZBOR ; 8 19F0 7B1C DW ZBAND ; 9 19F2 871C DW ZFSETP ; 10 19F4 9B1C DW ZFSET ; 11 19F6 AE1C DW ZFCLR ; 12 19F8 C51C DW ZSET ; 13 19FA D21C DW ZMOVE ; 14 19FC FC1C DW ZGET ; 15 19FE 0C1D DW ZGETB ; 16 1A00 291D DW ZGETP ; 17 1A02 711D DW ZGETPT ; 18 1A04 9E1D DW ZNEXTP ; 19 1A06 BD1D DW ZADD ; 20 1A08 CA1D DW ZSUB ; 21 1A0A D71D DW ZMUL ; 22 1A0C FB1D DW ZDIV ; 23 1A0E 051E DW ZMOD ; 24 0019 NOPS2 EQU 25 ; NUMBER OF 2-OPS 1A10 ; X-OPS 1A10 CE1E OPTX: DW ZCALL ; 0 1A12 611F DW ZPUT ; 1 1A14 721F DW ZPUTB ; 2 1A16 8A1F DW ZPUTP ; 3 1A18 3620 DW ZREAD ; 4 1A1A BB1F DW ZPRC ; 5 1A1C C01F DW ZPRN ; 6 1A1E 0520 DW ZRAND ; 7 1A20 2720 DW ZPUSH ; 8 1A22 2E20 DW ZPOP ; 9 1A24 0B2A DW ZSPLIT ; 10 1A26 542A 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 --- 1A28 ; ----- 1A28 ; RTRUE 1A28 ; ----- 1A28 ; SIMULATE A "RETURN 1" 1A28 A201 ZRTRUE: LDX #1 1A2A A900 ZRT0: LDA #0 1A2C 8605 ZRT1: STX ARG1+LO ; GIVE TO 1A2E 8506 STA ARG1+HI ; [ARG1] 1A30 4C941B JMP ZRET ; AND DO THE RETURN 1A33 ; ------ 1A33 ; RFALSE 1A33 ; ------ 1A33 ; SIMULATE A "RETURN 0" 1A33 A200 ZRFALS: LDX #0 1A35 F0F3 BEQ ZRT0 1A37 ; ------ 1A37 ; PRINTI 1A37 ; ------ 1A37 ; PRINT Z-STRING FOLLOWING THE OPCODE 1A37 A51B ZPRI: LDA ZPCH ; MOVE [ZPC] INTO [MPC] 1A39 8521 STA MPCH 1A3B A51A LDA ZPCM 1A3D 8520 STA MPCM 1A3F A519 LDA ZPCL 1A41 851F STA MPCL 1A43 A900 LDA #0 1A45 8522 STA MPCFLG ; [MPC] NO LONGER VALID 1A47 20D922 JSR PZSTR ; PRINT THE Z-STRING AT [MPC] 1A4A A205 LDX #5 ; COPY STATE OF [MPC] 1A4C B51F PRIL: LDA MPC,X ; INTO [ZPC] 1A4E 9519 STA ZPC,X 1A50 CA DEX 1A51 10F9 BPL PRIL 1A53 60 RTS 1A54 ; ------ 1A54 ; PRINTR AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 30 --- 0-OPS --- 1A54 ; ------ 1A54 ; DO A "PRINTI," FOLLOWED BY "CRLF" AND "RTRUE" 1A54 20371A ZPRR: JSR ZPRI 1A57 203D26 JSR ZCRLF 1A5A 4C281A JMP ZRTRUE 1A5D ; ------ 1A5D ; RSTACK 1A5D ; ------ 1A5D ; "RETURN" WITH VALUE ON STACK 1A5D 208C18 ZRSTAK: JSR POPVAL ; GET VALUE INTO [X/A] 1A60 4C2C1A JMP ZRT1 ; AND GIVE IT TO "RETURN" 1A63 ; ------ 1A63 ; VERIFY 1A63 ; ------ 1A63 ; VERIFY GAME CODE ON DISK 1A63 20E925 ZVER: JSR VERNUM ; DISPLAY ZIP VERSION NUMBER 1A66 A203 LDX #3 1A68 A900 LDA #0 1A6A 9513 ZVR: STA J+LO,X ; CLEAR [J], [K] 1A6C 951F STA MPC,X ; [MPC] AND [MPCFLG] 1A6E CA DEX 1A6F 10F9 BPL ZVR 1A71 A940 LDA #64 ; POINT [MPC] TO Z-ADDRESS $00040 1A73 851F STA MPCL ; 1ST 64 BYTES AREN'T CHECKED 1A75 AD1A32 LDA ZBEGIN+ZLENTH ; GET LENGTH OF Z-CODE 1A78 8512 STA I+HI ; IN WORDS 1A7A AD1B32 LDA ZBEGIN+ZLENTH+1 ; FIRST MSB 1A7D 8511 STA I+LO ; THEN LSB 1A7F 0611 ASL I+LO ; CONVERT Z-CODE LENGTH 1A81 2612 ROL I+HI ; TO # BYTES 1A83 2615 ROL K+LO ; TOP BIT IN [K+LO] 1A85 A916 LDA #K+HI ; PATCH THE "GETBYT" ROUTINE 1A87 8DF121 STA PATCH ; TO USE [K+HI]=0 INSTEAD OF [ZPURE] 1A8A 20E621 VSUM: JSR GETBYT ; GET A Z-BYTE INTO [A] 1A8D 18 CLC 1A8E 6513 ADC J+LO ; ADD IT TO SUM 1A90 8513 STA J+LO ; IN [J] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 31 --- 0-OPS --- 1A92 9002 BCC VSUM0 1A94 E614 INC J+HI 1A96 A51F VSUM0: LDA MPCL ; END OF Z-CODE YET? 1A98 C511 CMP I+LO ; CHECK LSB 1A9A D0EE BNE VSUM 1A9C A520 LDA MPCM ; MIDDLE BYTE 1A9E C512 CMP I+HI 1AA0 D0E8 BNE VSUM 1AA2 A521 LDA MPCH ; AND HIGH BIT 1AA4 C515 CMP K+LO 1AA6 D0E2 BNE VSUM 1AA8 A927 LDA #ZPURE ; UNPATCH "GETBYT" 1AAA 8DF121 STA PATCH 1AAD AD1D32 LDA ZBEGIN+ZCHKSM+1 ; GET LSB OF CHECKSUM 1AB0 C513 CMP J+LO ; DOES IT MATCH? 1AB2 D00A BNE BADVER ; NO, PREDICATE FAILS 1AB4 AD1C32 LDA ZBEGIN+ZCHKSM ; ELSE CHECK MSB 1AB7 C514 CMP J+HI ; LOOK GOOD? 1AB9 D003 BNE BADVER ; IF MATCHED, 1ABB 4C1219 JMP PREDS ; GAME IS OKAY 1ABE 4C0619 BADVER: JMP PREDF END INCLUD OPS1.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 32 --- 1-OPS --- 1AC1 ; ----- 1AC1 ; ZERO? 1AC1 ; ----- 1AC1 ; [ARG1] = 0? 1AC1 A505 ZZERO: LDA ARG1+LO 1AC3 0506 ORA ARG1+HI 1AC5 F01C BEQ PFINE 1AC7 4C0619 PYUCK: JMP PREDF 1ACA ; ----- 1ACA ; NEXT? 1ACA ; ----- 1ACA ; RETURN "NEXT" POINTER IN OBJECT [ARG1]; 1ACA ; FAIL IF LAST AND RETURN ZERO 1ACA A505 ZNEXT: LDA ARG1+LO 1ACC 20E424 JSR OBJLOC ; GET OBJECT ADDR INTO [I] 1ACF A005 LDY #5 ; POINT TO "NEXT" SLOT 1AD1 D007 BNE FIRST1 1AD3 ; ------ 1AD3 ; FIRST? 1AD3 ; ------ 1AD3 ; RETURN "FIRST" POINTER IN OBJECT [ARG1]; 1AD3 ; FAIL IF LAST AND RETURN ZERO 1AD3 A505 ZFIRST: LDA ARG1+LO 1AD5 20E424 JSR OBJLOC ; GET OBJECT ADDR INTO [I] 1AD8 A006 LDY #6 ; POINT TO "FIRST" SLOT 1ADA B111 FIRST1: LDA (I),Y ; GET CONTENTS OF SLOT 1ADC 20C418 JSR PUTBYT ; PASS IT TO VARIABLE 1ADF A50F LDA VALUE+LO ; EXAMINE THE VALUE JUST "PUT" 1AE1 F0E4 BEQ PYUCK ; FAIL IF IT WAS ZERO 1AE3 4C1219 PFINE: JMP PREDS ; ELSE REJOICE 1AE6 ; --- 1AE6 ; LOC 1AE6 ; --- 1AE6 ; RETURN THE OBJECT CONTAINING OBJECT [ARG1]; 1AE6 ; RETURN ZERO IF NONE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 33 --- 1-OPS --- 1AE6 A505 ZLOC: LDA ARG1+LO 1AE8 20E424 JSR OBJLOC ; GET ADDR OF OBJECT INTO [I] 1AEB A004 LDY #4 ; POINT TO "LOC" SLOT 1AED B111 LDA (I),Y ; GET THE BYTE 1AEF 4CC418 JMP PUTBYT ; AND SHIP IT OUT 1AF2 ; ------ 1AF2 ; PTSIZE 1AF2 ; ------ 1AF2 ; RETURN LENGTH OF PROP TABLE [ARG1] IN BYTES 1AF2 A506 ZPTSIZ: LDA ARG1+HI ; MOVE ABS ADDR OF 1AF4 18 CLC ; THE PROP TABLE 1AF5 6526 ADC ZCODE ; INTO [I] 1AF7 8512 STA I+HI 1AF9 A505 LDA ARG1+LO ; DECREMENT THE 1AFB 38 SEC ; ADDRESS 1AFC E901 SBC #1 ; WHILE MOVING LSB 1AFE 8511 STA I+LO 1B00 B002 BCS PTZ0 1B02 C612 DEC I+HI 1B04 A000 PTZ0: LDY #0 ; GET THE LENGTH 1B06 202E25 JSR PROPL ; OF PROPERTY AT [I] INTO [A] 1B09 18 CLC 1B0A 6901 ADC #1 ; INCREMENT RESULT 1B0C 4CC418 JMP PUTBYT ; AND RETURN IT 1B0F ; --- 1B0F ; INC 1B0F ; --- 1B0F ; INCREMENT VARIABLE [ARG1] 1B0F A505 ZINC: LDA ARG1+LO 1B11 205D18 JSR VARGET ; FETCH VARIABLE INTO [VALUE] 1B14 209219 JSR INCVAL ; INCREMENT IT 1B17 4C221B JMP ZD0 1B1A ; --- 1B1A ; DEC 1B1A ; --- 1B1A ; DECREMENT VARIABLE [ARG1] 1B1A A505 ZDEC: LDA ARG1+LO 1B1C 205D18 JSR VARGET ; FETCH VAR INTO [VALUE] 1B1F 208619 JSR DECVAL ; DECREMENT IT AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 34 --- 1-OPS --- 1B22 A505 ZD0: LDA ARG1+LO ; PUT RESULT BACK 1B24 4CB918 JMP VARPUT ; INTO THE SAME VARIABLE 1B27 ; ------ 1B27 ; PRINTB 1B27 ; ------ 1B27 ; PRINT Z-STRING AT [ARG1] 1B27 A505 ZPRB: LDA ARG1+LO 1B29 8511 STA I+LO 1B2B A506 LDA ARG1+HI 1B2D 8512 STA I+HI 1B2F 20AD22 JSR SETWRD ; MOVE Z-ADDR TO [MPC] 1B32 4CD922 JMP PZSTR ; AND PRINT 1B35 ; ------ 1B35 ; REMOVE 1B35 ; ------ 1B35 ; MOVE OBJECT [ARG1] INTO PSEUDO-OBJECT #0 1B35 A505 ZREMOV: LDA ARG1+LO ; GET SOURCE OBJECT ADDR 1B37 20E424 JSR OBJLOC ; INTO [I] 1B3A A511 LDA I+LO ; COPY THE SOURCE ADDR 1B3C 8513 STA J+LO ; INTO [J] 1B3E A512 LDA I+HI ; FOR LATER REFERENCE 1B40 8514 STA J+HI 1B42 A004 LDY #4 ; POINT TO "LOC" SLOT 1B44 B111 LDA (I),Y ; GET THE DATA 1B46 F02E BEQ REMVEX ; SCRAM IF NO OBJECT 1B48 20E424 JSR OBJLOC ; ELSE GET ADDR OF OBJECT [A] INTO [I] 1B4B A006 LDY #6 ; POINT TO "FIRST" SLOT 1B4D B111 LDA (I),Y ; GRAB DATA 1B4F C505 CMP ARG1+LO ; IS THIS THE FIRST? 1B51 D009 BNE REMVC1 ; NO, KEEP SEARCHING 1B53 A005 LDY #5 ; ELSE COPY SOURCE'S "NEXT" SLOT 1B55 B113 LDA (J),Y 1B57 C8 INY ; INTO DEST'S "FIRST" SLOT ([Y] = 6) 1B58 9111 STA (I),Y 1B5A D011 BNE REMVC2 ; BRANCH ALWAYS 1B5C 20E424 REMVC1: JSR OBJLOC 1B5F A005 LDY #5 ; GET "NEXT" 1B61 B111 LDA (I),Y AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 35 --- 1-OPS --- 1B63 C505 CMP ARG1+LO ; FOUND IT? 1B65 D0F5 BNE REMVC1 ; NO, KEEP TRYING 1B67 A005 LDY #5 ; WHEN FOUND 1B69 B113 LDA (J),Y ; MOVE "NEXT" SLOT OF SOURCE 1B6B 9111 STA (I),Y ; TO "NEXT" SLOT OF DEST 1B6D A900 REMVC2: LDA #0 1B6F A004 LDY #4 ; CLEAR "LOC" 1B71 9113 STA (J),Y 1B73 C8 INY ; AND "NEXT" SLOTS ([Y] = 5) 1B74 9113 STA (J),Y ; OF SOURCE OBJECT 1B76 60 REMVEX: RTS 1B77 ; ------ 1B77 ; PRINTD 1B77 ; ------ 1B77 ; PRINT SHORT DESCRIPTION OF OBJECT [ARG1] 1B77 A505 ZPRD: LDA ARG1+LO 1B79 ; ENTRY POINT FOR "USL" 1B79 20E424 PRNTDC: JSR OBJLOC ; GET ADDR OF OBJECT INTO [I] 1B7C A007 LDY #7 ; GET PROP TABLE POINTER 1B7E B111 LDA (I),Y ; FETCH MSB 1B80 AA TAX ; SAVE IT HERE 1B81 C8 INY 1B82 B111 LDA (I),Y ; FETCH LSB 1B84 8511 STA I+LO ; STORE LSB 1B86 8612 STX I+HI ; AND MSB 1B88 E611 INC I+LO ; POINT PAST THE 1B8A D002 BNE PDC0 ; LENGTH BYTE 1B8C E612 INC I+HI 1B8E 20AD22 PDC0: JSR SETWRD ; CALC Z-STRING ADDR 1B91 4CD922 JMP PZSTR ; AND PRINT IT 1B94 ; ------ 1B94 ; RETURN 1B94 ; ------ 1B94 ; RETURN FROM "CALL" WITH VALUE [ARG1] 1B94 A518 ZRET: LDA OLDZSP ; RE-SYNC THE 1B96 8517 STA ZSP ; Z-STACK POINTER 1B98 208C18 JSR POPVAL ; POP # LOCALS INTO [X/A] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 36 --- 1-OPS --- 1B9B 8612 STX I+HI ; SAVE HERE 1B9D 8A TXA ; SET FLAGS; ANY LOCALS? 1B9E F019 BEQ RET2 ; SKIP IF NOT 1BA0 ; RESTORE PUSHED LOCALS 1BA0 CA DEX ; ZERO-ALIGN 1BA1 8A TXA ; AND 1BA2 0A ASL A ; WORD-ALIGN # LOCALS 1BA3 8511 STA I+LO ; FOR USE AS A STORAGE INDEX 1BA5 208C18 RET1: JSR POPVAL ; POP A LOCAL INTO [X/A] 1BA8 A411 LDY I+LO ; RETRIEVE STORAGE INDEX 1BAA 990115 STA LOCALS+HI,Y ; STORE MSB OF LOCAL 1BAD 8A TXA ; MOVE LSB 1BAE 990015 STA LOCALS+LO,Y ; AND STORE THAT TOO 1BB1 C611 DEC I+LO 1BB3 C611 DEC I+LO ; UPDATE STORAGE INDEX 1BB5 C612 DEC I+HI ; AND LOCALS COUNT 1BB7 D0EC BNE RET1 ; POP TILL NO MORE LOCALS 1BB9 ; RESTORE OTHER VARIABLES 1BB9 208C18 RET2: JSR POPVAL ; POP [ZPCH] AND [ZPCM] 1BBC 861A STX ZPCM 1BBE 851B STA ZPCH 1BC0 208C18 JSR POPVAL ; POP AND RESTORE 1BC3 8618 STX OLDZSP 1BC5 8519 STA ZPCL 1BC7 A900 LDA #0 1BC9 851C STA ZPCFLG ; ZPC CHANGED! 1BCB 209919 JSR A12VAL ; MOVE [ARG1] TO [VALUE] 1BCE 4CCA18 JMP PUTVAL ; AND RETURN IT 1BD1 ; ---- 1BD1 ; JUMP 1BD1 ; ---- 1BD1 ; JUMP TO Z-LOCATION IN [ARG1] 1BD1 209919 ZJUMP: JSR A12VAL ; MOVE [ARG1] TO [VALUE] 1BD4 4C4C19 JMP PREDB3 ; A BRANCH THAT ALWAYS SUCCEEDS 1BD7 ; ----- 1BD7 ; PRINT AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 37 --- 1-OPS --- 1BD7 ; ----- 1BD7 ; PRINT Z-STRING AT WORD POINTER [ARG1] 1BD7 A505 ZPRINT: LDA ARG1+LO 1BD9 8511 STA I+LO 1BDB A506 LDA ARG1+HI 1BDD 8512 STA I+HI 1BDF 20C722 JSR SETSTR ; CALC STRING ADDRESS 1BE2 4CD922 JMP PZSTR ; AND PRINT IT 1BE5 ; ----- 1BE5 ; VALUE 1BE5 ; ----- 1BE5 ; RETURN VALUE OF VARIABLE [ARG1] 1BE5 A505 ZVALUE: LDA ARG1+LO 1BE7 205D18 JSR VARGET ; GET THE VALUE 1BEA 4CCA18 JMP PUTVAL ; EASY ENOUGH 1BED ; ---- 1BED ; BCOM 1BED ; ---- 1BED ; COMPLEMENT [ARG1] 1BED A505 ZBCOM: LDA ARG1+LO 1BEF 49FF EOR #$FF 1BF1 AA TAX 1BF2 A506 LDA ARG1+HI 1BF4 49FF EOR #$FF 1BF6 ; FALL THROUGH ... 1BF6 ; --------------------- 1BF6 ; RETURN VALUE IN [X/A] 1BF6 ; --------------------- 1BF6 860F VEXIT: STX VALUE+LO 1BF8 8510 STA VALUE+HI 1BFA 4CCA18 JMP PUTVAL END INCLUD OPS2.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 38 --- 2-OPS --- 1BFD ; ----- 1BFD ; LESS? 1BFD ; ----- 1BFD ; [ARG1] < [ARG2]? 1BFD 209919 ZLESS: JSR A12VAL ; MOVE [ARG1] TO [VALUE] 1C00 4C061C JMP DLS0 ; MOVE [ARG2] TO [I] & COMPARE 1C03 ; ------ 1C03 ; DLESS? 1C03 ; ------ 1C03 ; DECREMENT [ARG1]; SUCCEED IF < [ARG2] 1C03 201A1B ZDLESS: JSR ZDEC ; MOVES ([ARG1]-1) TO [VALUE] 1C06 A507 DLS0: LDA ARG2+LO ; MOVE [ARG2] TO [I] 1C08 8511 STA I+LO 1C0A A508 LDA ARG2+HI 1C0C 8512 STA I+HI 1C0E 4C2F1C JMP COMPAR ; COMPARE & RETURN 1C11 ; ----- 1C11 ; GRTR? 1C11 ; ----- 1C11 ; [ARG1] > [ARG2]? 1C11 A505 ZGRTR: LDA ARG1+LO ; MOVE [ARG1] TO [I] 1C13 8511 STA I+LO 1C15 A506 LDA ARG1+HI 1C17 8512 STA I+HI 1C19 4C271C JMP A2VAL ; MOVE [ARG2] TO [VALUE] & COMPARE 1C1C ; ------ 1C1C ; IGRTR? 1C1C ; ------ 1C1C ; INCREMENT [ARG1]; SUCCEED IF GREATER THAN [ARG2] 1C1C 200F1B ZIGRTR: JSR ZINC ; GET ([ARG1]+1) INTO [VALUE] 1C1F A50F LDA VALUE+LO ; MOVE [VALUE] TO [I] 1C21 8511 STA I+LO 1C23 A510 LDA VALUE+HI 1C25 8512 STA I+HI AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 39 --- 2-OPS --- 1C27 A507 A2VAL: LDA ARG2+LO ; MOVE [ARG2] TO [VALUE] 1C29 850F STA VALUE+LO 1C2B A508 LDA ARG2+HI 1C2D 8510 STA VALUE+HI 1C2F 20361C COMPAR: JSR SCOMP ; COMPARE [VALUE] AND [I] 1C32 9038 BCC PGOOD 1C34 B023 BCS PBAD 1C36 ; ----------------- 1C36 ; SIGNED COMPARISON 1C36 ; ----------------- 1C36 ; ENTRY: VALUES IN [VALUE] AND [I] 1C36 A512 SCOMP: LDA I+HI 1C38 4510 EOR VALUE+HI 1C3A 1005 BPL SCMP 1C3C A512 LDA I+HI 1C3E C510 CMP VALUE+HI 1C40 60 RTS 1C41 A510 SCMP: LDA VALUE+HI 1C43 C512 CMP I+HI 1C45 D004 BNE SCEX 1C47 A50F LDA VALUE+LO 1C49 C511 CMP I+LO 1C4B 60 SCEX: RTS 1C4C ; --- 1C4C ; IN? 1C4C ; --- 1C4C ; IS OBJECT [ARG1] CONTAINED IN OBJECT [ARG2]? 1C4C A505 ZIN: LDA ARG1+LO 1C4E 20E424 JSR OBJLOC ; GET ADDR OF TARGET OBJECT INTO [I] 1C51 A004 LDY #4 ; POINT TO "LOC" SLOT 1C53 B111 LDA (I),Y ; GET DATA 1C55 C507 CMP ARG2+LO ; IS IT THERE? 1C57 F013 BEQ PGOOD ; YES, SUCCEED 1C59 4C0619 PBAD: JMP PREDF ; TOO BAD, CHUM ... 1C5C ; ---- 1C5C ; BTST 1C5C ; ---- 1C5C ; IS EVERY "ON" BIT IN [ARG1] 1C5C ; ALSO "ON" IN [ARG2]? AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 40 --- 2-OPS --- 1C5C A507 ZBTST: LDA ARG2+LO ; FIRST CHECK LSBS 1C5E 2505 AND ARG1+LO 1C60 C507 CMP ARG2+LO ; LSBS MATCH? 1C62 D0F5 BNE PBAD ; NO, EXIT NOW 1C64 A508 LDA ARG2+HI ; ELSE CHECK MSBS 1C66 2506 AND ARG1+HI 1C68 C508 CMP ARG2+HI ; MATCHED? 1C6A D0ED BNE PBAD ; SORRY ... 1C6C 4C1219 PGOOD: JMP PREDS 1C6F ; --- 1C6F ; BOR 1C6F ; --- 1C6F ; RETURN [ARG1] "OR" [ARG2] 1C6F A505 ZBOR: LDA ARG1+LO 1C71 0507 ORA ARG2+LO 1C73 AA TAX 1C74 A506 LDA ARG1+HI 1C76 0508 ORA ARG2+HI 1C78 4CF61B JMP VEXIT 1C7B ; ---- 1C7B ; BAND 1C7B ; ---- 1C7B ; RETURN [ARG1] "AND" [ARG2] 1C7B A505 ZBAND: LDA ARG1+LO 1C7D 2507 AND ARG2+LO 1C7F AA TAX 1C80 A506 LDA ARG1+HI 1C82 2508 AND ARG2+HI 1C84 4CF61B JMP VEXIT 1C87 ; ----- 1C87 ; FSET? 1C87 ; ----- 1C87 ; IS FLAG [ARG1] SET IN OBJECT [ARG2]? 1C87 204025 ZFSETP: JSR FLAGSU ; GET BITS INTO [K] AND [J] 1C8A A516 LDA K+HI ; DO MSBS 1C8C 2514 AND J+HI 1C8E 8516 STA K+HI 1C90 A515 LDA K+LO ; DO LSBS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 41 --- 2-OPS --- 1C92 2513 AND J+LO 1C94 0516 ORA K+HI ; ANY BITS ON? 1C96 D0D4 BNE PGOOD ; TARGET BIT MUST BE ON 1C98 4C0619 JMP PREDF 1C9B ; ---- 1C9B ; FSET 1C9B ; ---- 1C9B ; SET FLAG [ARG2] IN OBJECT [ARG1] 1C9B 204025 ZFSET: JSR FLAGSU ; GET BITS INTO [K] & [J], ADDR IN [I] 1C9E A000 LDY #0 1CA0 A516 LDA K+HI ; FIRST DO MSBS 1CA2 0514 ORA J+HI 1CA4 9111 STA (I),Y 1CA6 C8 INY 1CA7 A515 LDA K+LO ; THEN LSBS 1CA9 0513 ORA J+LO 1CAB 9111 STA (I),Y 1CAD 60 RTS 1CAE ; ------ 1CAE ; FCLEAR 1CAE ; ------ 1CAE ; CLEAR FLAG [ARG2] IN OBJECT [ARG1] 1CAE 204025 ZFCLR: JSR FLAGSU ; GETS BITS INTO [J] & [K], ADDR IN [I] 1CB1 A000 LDY #0 1CB3 A514 LDA J+HI ; FETCH MSB 1CB5 49FF EOR #$FF ; COMPLEMENT IT 1CB7 2516 AND K+HI ; RUB OUT FLAG 1CB9 9111 STA (I),Y 1CBB C8 INY 1CBC A513 LDA J+LO ; SAME FOR LSB 1CBE 49FF EOR #$FF 1CC0 2515 AND K+LO 1CC2 9111 STA (I),Y 1CC4 60 RTS 1CC5 ; --- 1CC5 ; SET 1CC5 ; --- 1CC5 ; SET VARIABLE [ARG1] EQUAL TO [ARG2] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 42 --- 2-OPS --- 1CC5 A507 ZSET: LDA ARG2+LO ; MOVE THE VALUE 1CC7 850F STA VALUE+LO ; INTO [VALUE] 1CC9 A508 LDA ARG2+HI 1CCB 8510 STA VALUE+HI 1CCD A505 LDA ARG1+LO ; GET VARIABLE ID 1CCF 4CB918 JMP VARPUT ; AND CHANGE THE VARIABLE 1CD2 ; ---- 1CD2 ; MOVE 1CD2 ; ---- 1CD2 ; MOVE OBJECT [ARG1] INTO OBJECT [ARG2] 1CD2 20351B ZMOVE: JSR ZREMOV ; REMOVE FIRST 1CD5 A505 LDA ARG1+LO 1CD7 20E424 JSR OBJLOC ; GET SOURCE OBJECT ADDR INTO [I] 1CDA A511 LDA I+LO ; COPY SOURCE ADDRESS 1CDC 8513 STA J+LO ; INTO [J] 1CDE A512 LDA I+HI 1CE0 8514 STA J+HI 1CE2 A507 LDA ARG2+LO ; GET DEST OBJECT ID 1CE4 A004 LDY #4 ; POINT TO "LOC" SLOT OF SOURCE 1CE6 9111 STA (I),Y ; AND MOVE IT IN 1CE8 20E424 JSR OBJLOC ; GET ADDR OF DEST OBJECT INTO [I] 1CEB A006 LDY #6 ; POINT TO "FIRST" SLOT 1CED B111 LDA (I),Y ; GET "FIRST" OF DEST 1CEF AA TAX ; SAVE HERE FOR A MOMENT 1CF0 A505 LDA ARG1+LO ; GET SOURCE OBJECT ID 1CF2 9111 STA (I),Y ; MAKE IT "FIRST" OF DEST 1CF4 8A TXA ; RESTORE "FIRST" OF DEST 1CF5 F004 BEQ ZMVEX ; SCRAM IF ZERO 1CF7 A005 LDY #5 ; MAKE "FIRST" OF DEST 1CF9 9113 STA (J),Y ; THE "NEXT" OF SOURCE 1CFB 60 ZMVEX: RTS 1CFC ; --- 1CFC ; GET 1CFC ; --- 1CFC ; RETURN ITEM [ARG2] IN WORD-TABLE [ARG1] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 43 --- 2-OPS --- 1CFC 20111D ZGET: JSR WCALC ; CALC ADDRESS 1CFF 20E621 JSR GETBYT ; GET 1ST BYTE (MSB) 1D02 8510 DOGET: STA VALUE+HI ; SAVE MSB 1D04 20E621 JSR GETBYT ; GET LSB 1D07 850F STA VALUE+LO ; SAVE AND 1D09 4CCA18 JMP PUTVAL ; HAND IT OVER 1D0C ; ---- 1D0C ; GETB 1D0C ; ---- 1D0C ; RETURN ITEM [ARG2] IN BYTE-TABLE AT [ARG1] 1D0C 20151D ZGETB: JSR BCALC 1D0F F0F1 BEQ DOGET ; [A] = 0, SO CLEAR MSB OF [VALUE] 1D11 ; -------------------- 1D11 ; CALC TABLE ADDRESSES 1D11 ; -------------------- 1D11 ; WORD-ALIGNED ENTRY 1D11 0607 WCALC: ASL ARG2+LO ; WORD-ALIGN FOR 1D13 2608 ROL ARG2+HI ; WORD ACCESS 1D15 ; BYTE-ALIGNED ENTRY 1D15 A507 BCALC: LDA ARG2+LO ; ADD BASE ADDR OF TABLE 1D17 18 CLC ; TO ITEM 1D18 6505 ADC ARG1+LO ; INDEX 1D1A 851F STA MPCL 1D1C A508 LDA ARG2+HI ; SAME FOR MSBS 1D1E 6506 ADC ARG1+HI 1D20 8520 STA MPCM 1D22 A900 LDA #0 1D24 8521 STA MPCH ; CLEAR TOP BIT 1D26 8522 STA MPCFLG ; & INVALIDATE [MPC] 1D28 60 RTS 1D29 ; ---- 1D29 ; GETP 1D29 ; ---- 1D29 ; RETURN PROPERTY [ARG2] OF OBJECT [ARG1]; 1D29 ; IF NO PROP [ARG2], RETURN [ARG2]'TH ELEMENT OF OBJECT #0 1D29 200D25 ZGETP: JSR PROPB AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 44 --- 2-OPS --- 1D2C 202925 GETP1: JSR PROPN 1D2F C507 CMP ARG2+LO 1D31 F01B BEQ GETP3 1D33 9006 BCC GETP2 1D35 203625 JSR PROPNX 1D38 4C2C1D JMP GETP1 ; TRY AGAIN WITH NEXT PROP 1D3B A507 GETP2: LDA ARG2+LO ; GET PROPERTY # 1D3D 38 SEC ; ZERO-ALIGN IT 1D3E E901 SBC #1 1D40 0A ASL A ; WORD-ALIGN IT 1D41 A8 TAY ; USE AS AN INDEX 1D42 B135 LDA (OBJTAB),Y ; GET MSB OF PROPERTY 1D44 8510 STA VALUE+HI 1D46 C8 INY 1D47 B135 LDA (OBJTAB),Y ; DO SAME WITH LSB 1D49 850F STA VALUE+LO 1D4B 4CCA18 JMP PUTVAL ; RETURN DEFAULT IN [VALUE] 1D4E 202E25 GETP3: JSR PROPL 1D51 C8 INY ; MAKE [Y] POINT TO 1ST BYTE OF PROP 1D52 AA TAX ; (SET FLAGS) IF LENGTH IN [A] = 0 1D53 F009 BEQ GETPB ; GET A BYTE PROPERTY 1D55 C901 CMP #1 ; IF LENGTH = 1 1D57 F00B BEQ GETPW ; GET A WORD PROPERTY 1D59 ; *** ERROR #7: PROPERTY LENGTH *** 1D59 A907 LDA #7 1D5B 4C9025 JMP ZERROR 1D5E ; GET A 1-BYTE PROPERTY 1D5E B111 GETPB: LDA (I),Y ; GET LSB INTO [A] 1D60 A200 LDX #0 ; CLEAR MSB IN [X] 1D62 F006 BEQ ETPEX 1D64 ; GET A 2-BYTE PROPERTY 1D64 B111 GETPW: LDA (I),Y ; GET MSB 1D66 AA TAX ; INTO [X] 1D67 C8 INY ; POINT TO LSB 1D68 B111 LDA (I),Y ; GET IT INTO [A] 1D6A 850F ETPEX: STA VALUE+LO ; STORE LSB 1D6C 8610 STX VALUE+HI ; AND MSB 1D6E 4CCA18 JMP PUTVAL 1D71 ; ----- AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 45 --- 2-OPS --- 1D71 ; GETPT 1D71 ; ----- 1D71 ; RETURN POINTER TO PROP TABLE [ARG2] 1D71 ; IN OBJECT [ARG1] 1D71 200D25 ZGETPT: JSR PROPB 1D74 202925 GETPT1: JSR PROPN ; RETURNS OFFSET IN [Y] 1D77 C507 CMP ARG2+LO 1D79 F008 BEQ GETPT2 1D7B 901E BCC DORET 1D7D 203625 JSR PROPNX ; TRY NEXT PROPERTY 1D80 4C741D JMP GETPT1 1D83 E611 GETPT2: INC I+LO 1D85 D002 BNE GETPT3 1D87 E612 INC I+HI 1D89 98 GETPT3: TYA ; FETCH OFFSET 1D8A 18 CLC 1D8B 6511 ADC I+LO ; ADD LSB OF TABLE ADDRESS 1D8D 850F STA VALUE+LO 1D8F A512 LDA I+HI ; AND MSB 1D91 6900 ADC #0 1D93 38 SEC ; STRIP OFF 1D94 E526 SBC ZCODE ; RELATIVE POINTER 1D96 8510 STA VALUE+HI 1D98 4CCA18 JMP PUTVAL ; AND RETURN 1D9B 4CC218 DORET: JMP RET0 ; ELSE RETURN A ZERO 1D9E ; ----- 1D9E ; NEXTP 1D9E ; ----- 1D9E ; RETURN INDEX # OF PROP FOLLOWING PROP [ARG2] IN OBJECT [ARG1]; 1D9E ; RETURN ZERO IF LAST; RETURN FIRST IF [ARG2]=0; ERROR IF NONE 1D9E 200D25 ZNEXTP: JSR PROPB 1DA1 A507 LDA ARG2+LO ; IF [ARG2]=0 1DA3 F012 BEQ NXTP3 ; RETURN "FIRST" SLOT 1DA5 202925 NXTP1: JSR PROPN ; FETCH PROPERTY # 1DA8 C507 CMP ARG2+LO ; COMPARE TO TARGET # 1DAA F008 BEQ NXTP2 ; FOUND IT! 1DAC 90ED BCC DORET ; LAST PROP, SO RETURN ZERO 1DAE 203625 JSR PROPNX ; ELSE TRY NEXT PROPERTY 1DB1 4CA51D JMP NXTP1 AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 46 --- 2-OPS --- 1DB4 203625 NXTP2: JSR PROPNX ; POINT TO FOLLOWING PROPERTY 1DB7 202925 NXTP3: JSR PROPN ; GET THE PROPERTY # 1DBA 4CC418 JMP PUTBYT ; AND RETURN IT 1DBD ; --- 1DBD ; ADD 1DBD ; --- 1DBD ; RETURN [ARG1] + [ARG2] 1DBD A505 ZADD: LDA ARG1+LO ; ADD LSBS 1DBF 18 CLC 1DC0 6507 ADC ARG2+LO 1DC2 AA TAX ; SAVE LSB HERE 1DC3 A506 LDA ARG1+HI ; ADD MSBS 1DC5 6508 ADC ARG2+HI 1DC7 4CF61B JMP VEXIT 1DCA ; --- 1DCA ; SUB 1DCA ; --- 1DCA ; RETURN [ARG1] - [ARG2] 1DCA A505 ZSUB: LDA ARG1+LO ; SUBTRACT LSBS 1DCC 38 SEC 1DCD E507 SBC ARG2+LO 1DCF AA TAX ; SAVE LSB HERE 1DD0 A506 LDA ARG1+HI ; SUBTRACT MSBS 1DD2 E508 SBC ARG2+HI 1DD4 4CF61B JMP VEXIT ; EXIT WITH [X]=LSB, [A]=MSB 1DD7 ; --- 1DD7 ; MUL 1DD7 ; --- 1DD7 ; RETURN [ARG1] * [ARG2] 1DD7 20911E ZMUL: JSR MINIT ; INIT THINGS 1DDA 665B ZMLOOP: ROR MTEMP+HI 1DDC 665A ROR MTEMP+LO 1DDE 6608 ROR ARG2+HI 1DE0 6607 ROR ARG2+LO 1DE2 900D BCC ZMNEXT 1DE4 A505 LDA ARG1+LO 1DE6 18 CLC 1DE7 655A ADC MTEMP+LO 1DE9 855A STA MTEMP+LO AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 47 --- 2-OPS --- 1DEB A506 LDA ARG1+HI 1DED 655B ADC MTEMP+HI 1DEF 855B STA MTEMP+HI 1DF1 CA ZMNEXT: DEX 1DF2 10E6 BPL ZMLOOP 1DF4 A607 LDX ARG2+LO ; PUT LSB OF PRODUCT 1DF6 A508 LDA ARG2+HI ; AND MSB 1DF8 4CF61B JMP VEXIT ; WHERE "VEXIT" EXPECTS THEM 1DFB ; --- 1DFB ; DIV 1DFB ; --- 1DFB ; RETURN QUOTIENT OF [ARG1] / [ARG2] 1DFB 200F1E ZDIV: JSR DIVIDE 1DFE A656 LDX QUOT+LO 1E00 A557 LDA QUOT+HI 1E02 4CF61B JMP VEXIT 1E05 ; --- 1E05 ; MOD 1E05 ; --- 1E05 ; RETURN REMAINDER OF [ARG1] / [ARG2] 1E05 200F1E ZMOD: JSR DIVIDE 1E08 A658 LDX REMAIN+LO ; FETCH THE REMAINDER 1E0A A559 LDA REMAIN+HI ; IN [REMAIN] 1E0C 4CF61B JMP VEXIT ; AND RETURN IT 1E0F ; --------------- 1E0F ; SIGNED DIVISION 1E0F ; --------------- 1E0F ; ENTRY: DIVIDEND IN [ARG1], DIVISOR IN [ARG2] 1E0F ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN] 1E0F A506 DIVIDE: LDA ARG1+HI ; SIGN OF REMAINDER 1E11 855D STA RSIGN ; IS THE SIGN OF THE DIVIDEND 1E13 4508 EOR ARG2+HI ; SIGN OF QUOTIENT IS POSITIVE 1E15 855C STA QSIGN ; IF SIGNS OF TERMS ARE THE SAME 1E17 A505 LDA ARG1+LO ; MOVE [ARG1] TO [QUOT] 1E19 8556 STA QUOT+LO 1E1B A506 LDA ARG1+HI 1E1D 8557 STA QUOT+HI ; IF DIVIDEND IS POSITIVE 1E1F 1003 BPL ABSDIV ; MOVE DIVISOR 1E21 204D1E JSR ABQUOT ; ELSE CALC ABS(DIVIDEND) FIRST AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 48 --- 2-OPS --- 1E24 A507 ABSDIV: LDA ARG2+LO 1E26 8558 STA REMAIN+LO 1E28 A508 LDA ARG2+HI 1E2A 8559 STA REMAIN+HI ; IF REMAINDER IS POSITIVE 1E2C 1003 BPL GODIV ; WE'RE READY TO DIVIDE 1E2E 203F1E JSR ABREM ; ELSE CALC ABS(DIVISOR) 1E31 205B1E GODIV: JSR UDIV ; DO UNSIGNED DIVIDE 1E34 A55C LDA QSIGN ; SHOULD QUOTIENT BE FLIPPED? 1E36 1003 BPL RFLIP ; NO, TEST REMAINDER 1E38 204D1E JSR ABQUOT ; ELSE GET ABSOLUTE VALUE 1E3B A55D RFLIP: LDA RSIGN ; SHOULD EMAINDER BE FLIPPED? 1E3D 100D BPL DIVEX ; NO, WE'RE DONE 1E3F ; ELSE FALL THROUGH ... 1E3F ; ---------------- 1E3F ; CALC ABS(REMAIN) 1E3F ; ---------------- 1E3F A900 ABREM: LDA #0 1E41 38 SEC 1E42 E558 SBC REMAIN+LO 1E44 8558 STA REMAIN+LO 1E46 A900 LDA #0 1E48 E559 SBC REMAIN+HI 1E4A 8559 STA REMAIN+HI 1E4C 60 DIVEX: RTS 1E4D ; -------------- 1E4D ; CALC ABS(QUOT) 1E4D ; -------------- 1E4D A900 ABQUOT: LDA #0 1E4F 38 SEC 1E50 E556 SBC QUOT+LO 1E52 8556 STA QUOT+LO 1E54 A900 LDA #0 1E56 E557 SBC QUOT+HI 1E58 8557 STA QUOT+HI 1E5A 60 RTS 1E5B ; ----------------- 1E5B ; UNSIGNED DIVISION 1E5B ; ----------------- 1E5B ; ENTRY: DIVIDEND IN [QUOT], DIVISOR IN [REMAIN] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 49 --- 2-OPS --- 1E5B ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN] 1E5B A558 UDIV: LDA REMAIN+LO ; CHECK [REMAIN] 1E5D 0559 ORA REMAIN+HI ; BEFORE PROCEEDING 1E5F F02B BEQ DIVERR ; CAN'T DIVIDE BY ZERO! 1E61 20911E JSR MINIT ; SET IT ALL UP 1E64 2656 UDLOOP: ROL QUOT+LO 1E66 2657 ROL QUOT+HI 1E68 265A ROL MTEMP+LO 1E6A 265B ROL MTEMP+HI 1E6C A55A LDA MTEMP+LO 1E6E 38 SEC 1E6F E558 SBC REMAIN+LO 1E71 A8 TAY ; SAVE HERE 1E72 A55B LDA MTEMP+HI 1E74 E559 SBC REMAIN+HI 1E76 9004 BCC UDNEXT 1E78 845A STY MTEMP+LO 1E7A 855B STA MTEMP+HI 1E7C CA UDNEXT: DEX 1E7D D0E5 BNE UDLOOP 1E7F 2656 ROL QUOT+LO ; SHIFT LAST CARRY FOR QUOTIENT 1E81 2657 ROL QUOT+HI 1E83 A55A LDA MTEMP+LO ; MOVE REMAINDER 1E85 8558 STA REMAIN+LO ; INTO [REMAIN] 1E87 A55B LDA MTEMP+HI 1E89 8559 STA REMAIN+HI 1E8B 60 RTS 1E8C ; *** ERROR #8: DIVISION BY ZERO *** 1E8C A908 DIVERR: LDA #8 1E8E 4C9025 JMP ZERROR 1E91 ; --------- 1E91 ; MATH INIT 1E91 ; --------- 1E91 A210 MINIT: LDX #16 ; INIT LOOPING INDEX 1E93 A900 LDA #0 1E95 855A STA MTEMP+LO ; CLEAR TEMP 1E97 855B STA MTEMP+HI ; REGISTER 1E99 18 CLC ; AND CARRY 1E9A 60 RTS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 50 --- 2-OPS --- END INCLUD OPSX.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 51 --- X-OPS --- 1E9B ; ------ 1E9B ; EQUAL? 1E9B ; ------ 1E9B ; IS [ARG1] = [ARG2] (OR [ARG3] OR [ARG4])? 1E9B C604 ZEQUAL: DEC NARGS ; DOUBLE-CHECK # ARGS 1E9D D005 BNE DOEQ ; MUST BE AT LEAST TWO, OR ... 1E9F ; *** ERROR #9: NOT ENOUGH "EQUAL?" ARGS *** 1E9F A909 LDA #9 1EA1 4C9025 JMP ZERROR 1EA4 A505 DOEQ: LDA ARG1+LO ; FETCH LSB 1EA6 A606 LDX ARG1+HI ; AND MSB OF [ARG1] 1EA8 C507 CMP ARG2+LO ; TEST LSB OF [ARG2] 1EAA D004 BNE TRY2 ; NO GOOD, LOOK FOR ANOTHER ARG 1EAC E408 CPX ARG2+HI ; ELSE TRY MSB OF [ARG2] 1EAE F018 BEQ EQOK ; MATCHED! 1EB0 C604 TRY2: DEC NARGS ; OUT OF ARGS YET? 1EB2 F017 BEQ EQBAD ; YES, WE FAILED 1EB4 C509 CMP ARG3+LO ; TRY LSB OF [ARG3] 1EB6 D004 BNE TRY3 ; NO GOOD, LOOK FOR ANOTHER ARG 1EB8 E40A CPX ARG3+HI ; HOW ABOUT MSB OF [ARG3]? 1EBA F00C BEQ EQOK ; YAY! 1EBC C604 TRY3: DEC NARGS ; OUT OF ARGS YET? 1EBE F00B BEQ EQBAD ; IF NOT ... 1EC0 C50B CMP ARG4+LO ; TRY [ARG4] 1EC2 D007 BNE EQBAD ; SORRY, CHUM 1EC4 E40C CPX ARG4+HI ; MSB MATCHED? 1EC6 D003 BNE EQBAD ; TOO BAD 1EC8 4C1219 EQOK: JMP PREDS ; FINALLY MATCHED! 1ECB 4C0619 EQBAD: JMP PREDF ; FAILURE (SNIFF!) 1ECE ; ---- 1ECE ; CALL 1ECE ; ---- 1ECE ; BRANCH TO FUNCTION AT ([ARG1]*2), PASSING 1ECE ; OPTIONAL PARAMETERS IN [ARG2]-[ARG4] 1ECE A505 ZCALL: LDA ARG1+LO AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 52 --- X-OPS --- 1ED0 0506 ORA ARG1+HI ; IS CALL ADDRESS ZERO? 1ED2 D003 BNE DOCALL ; NO, CONTINUE 1ED4 4CC418 JMP PUTBYT ; ELSE RETURN THE ZERO IN [A] 1ED7 A618 DOCALL: LDX OLDZSP ; SAVE OLD STACK POINTER 1ED9 A519 LDA ZPCL ; AND LSB OF [ZPC] 1EDB 20A618 JSR PUSHXA ; ON THE Z-STACK 1EDE A61A LDX ZPCM ; SAVE MIDDLE 8 BITS 1EE0 A51B LDA ZPCH ; AND TOP BIT OF [ZPC] 1EE2 20A618 JSR PUSHXA ; AS WELL 1EE5 ; FORM 16-BIT ADDRESS FROM [ARG1] 1EE5 A900 LDA #0 ; CLEAR HIGH BIT FOR ROTATE 1EE7 851C STA ZPCFLG ; AND INVALIDATE [ZPC] 1EE9 0605 ASL ARG1+LO ; MULTIPLY [ARG1] 1EEB 2606 ROL ARG1+HI ; BY TWO 1EED 2A ROL A ; HIGH BIT INTO [A] 1EEE 851B STA ZPCH ; NEW HIGH BIT OF [ZPC] 1EF0 A506 LDA ARG1+HI ; GET NEW LOW BYTES 1EF2 851A STA ZPCM 1EF4 A505 LDA ARG1+LO 1EF6 8519 STA ZPCL 1EF8 20B021 JSR NEXTPC ; FETCH # LOCALS TO PASS 1EFB 8513 STA J+LO ; SAVE HERE FOR COUNTING 1EFD 8514 STA J+HI ; AND HERE FOR LATER REFERENCE 1EFF F02B BEQ ZCALL2 ; SKIP IF NO LOCALS 1F01 A900 LDA #0 1F03 8511 STA I+LO ; ELSE INIT STORAGE INDEX 1F05 A411 ZCALL1: LDY I+LO 1F07 BE0015 LDX LOCALS+LO,Y ; GET LSB OF LOCAL INTO [X] 1F0A B90115 LDA LOCALS+HI,Y ; AND MSB INTO [A] 1F0D 8411 STY I+LO ; SAVE THE INDEX 1F0F 20A618 JSR PUSHXA ; PUSH LOCAL IN [X/A] ONTO Z-STACK 1F12 20B021 JSR NEXTPC ; GET MSB OF NEW LOCAL 1F15 8512 STA I+HI ; SAVE IT HERE 1F17 20B021 JSR NEXTPC ; NOW GET LSB 1F1A A411 LDY I+LO ; RESTORE INDEX 1F1C 990015 STA LOCALS+LO,Y ; STORE LSB INTO [LOCALS] 1F1F A512 LDA I+HI ; RETRIEVE MSB 1F21 990115 STA LOCALS+HI,Y ; STORE IT INTO [LOCALS] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 53 --- X-OPS --- 1F24 C8 INY 1F25 C8 INY ; UPDATE 1F26 8411 STY I+LO ; THE STORAGE INDEX 1F28 C613 DEC J+LO ; ANY MORE LOCALS? 1F2A D0D9 BNE ZCALL1 ; YES, KEEP LOOPING 1F2C ; MOVE UP TO 3 ARGUMENTS TO [LOCALS] 1F2C C604 ZCALL2: DEC NARGS ; EXTRA ARGS IN THIS CALL? 1F2E F026 BEQ ZCALL3 ; NO, CONTINUE 1F30 A507 LDA ARG2+LO ; MOVE [ARG2] TO LOCAL #1 1F32 8D0015 STA LOCALS+LO 1F35 A508 LDA ARG2+HI 1F37 8D0115 STA LOCALS+HI 1F3A C604 DEC NARGS ; ANY LEFT? 1F3C F018 BEQ ZCALL3 ; NO, SCRAM 1F3E A509 LDA ARG3+LO ; MOVE [ARG3] TO LOCAL #2 1F40 8D0215 STA LOCALS+LO+2 1F43 A50A LDA ARG3+HI 1F45 8D0315 STA LOCALS+HI+2 1F48 C604 DEC NARGS ; ANY LEFT? 1F4A F00A BEQ ZCALL3 ; NO, EXUENT 1F4C A50B LDA ARG4+LO ; MOVE [ARG4] TO LOCAL #3 1F4E 8D0415 STA LOCALS+LO+4 1F51 A50C LDA ARG4+HI 1F53 8D0515 STA LOCALS+HI+4 1F56 A614 ZCALL3: LDX J+HI ; RETRIEVE # LOCALS 1F58 8A TXA ; DUPE FOR NO GOOD REASON 1F59 20A618 JSR PUSHXA ; PUSH # LOCALS ONTO Z-STACK 1F5C A517 LDA ZSP ; REMEMBER WHERE 1F5E 8518 STA OLDZSP ; WE CAME FROM 1F60 60 RTS ; WHEW! 1F61 ; --- 1F61 ; PUT 1F61 ; --- 1F61 ; SET ITEM [ARG2] IN WORD-TABLE [ARG1] EQUAL TO [ARG3] 1F61 0607 ZPUT: ASL ARG2+LO ; WORD-ALIGN [ARG2] 1F63 2608 ROL ARG2+HI AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 54 --- X-OPS --- 1F65 20771F JSR PCALC ; GET ITEM ADDR INTO [I] 1F68 A50A LDA ARG3+HI ; [ARG3] 1F6A 9111 STA (I),Y ; INTO THE TABLE AT [I] 1F6C C8 INY 1F6D ; ENTRY FOR "PUTB" 1F6D A509 PUTLSB: LDA ARG3+LO 1F6F 9111 STA (I),Y 1F71 60 RTS 1F72 ; ---- 1F72 ; PUTB 1F72 ; ---- 1F72 ; SET ITEM [ARG2] IN BYTE-TABLE [ARG1] EQUAL TO [ARG3] 1F72 20771F ZPUTB: JSR PCALC 1F75 F0F6 BEQ PUTLSB ; BRANCH ALWAYS 1F77 ; --------------------------- 1F77 ; CALC ITEM ADDRESS FOR "PUT" 1F77 ; --------------------------- 1F77 A507 PCALC: LDA ARG2+LO ; ADD ITEM OFFSET IN [ARG2] 1F79 18 CLC ; TO TABLE ADDR IN [ARG1] 1F7A 6505 ADC ARG1+LO ; TO FORM A POINTER 1F7C 8511 STA I+LO ; IN [I] 1F7E A508 LDA ARG2+HI ; SAME FOR MSB 1F80 6506 ADC ARG1+HI 1F82 18 CLC 1F83 6526 ADC ZCODE ; MAKE IT ABSOLUTE 1F85 8512 STA I+HI 1F87 A000 LDY #0 ; ZERO FOR INDEXING 1F89 60 RTS 1F8A ; ---- 1F8A ; PUTP 1F8A ; ---- 1F8A ; SET PROPERTY [ARG2] IN OBJECT [ARG1] EQUAL TO [ARG3] 1F8A 200D25 ZPUTP: JSR PROPB 1F8D 202925 PUTP1: JSR PROPN 1F90 C507 CMP ARG2+LO 1F92 F008 BEQ PUTP2 1F94 901B BCC PNERR ; ERROR IF LOWER AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 55 --- X-OPS --- 1F96 203625 JSR PROPNX ; TRY NEXT PROPERTY 1F99 4C8D1F JMP PUTP1 1F9C 202E25 PUTP2: JSR PROPL 1F9F C8 INY ; MAKE [Y] POINT TO 1ST PROPERTY BYTE 1FA0 AA TAX ; (SET FLAGS) IF LENGTH IN [A] = 0 1FA1 F009 BEQ PUTP3 ; PUT A BYTE 1FA3 C901 CMP #1 ; PUT A WORD IF [A] = 1 1FA5 D00F BNE PLERR ; ELSE LENGTH IS BAD 1FA7 A50A LDA ARG3+HI ; GET MSB OF PROPERTY 1FA9 9111 STA (I),Y ; AND STORE IN OBJECT 1FAB C8 INY ; POINT TO LSB SLOT 1FAC A509 PUTP3: LDA ARG3+LO ; FETCH LSB 1FAE 9111 STA (I),Y ; AND STORE IN OBJECT 1FB0 60 RTS 1FB1 ; *** ERROR #10: BAD PROPERTY NUMBER *** 1FB1 A90A PNERR: LDA #10 1FB3 4C9025 JMP ZERROR 1FB6 ; *** ERROR #11: PUTP PROPERTY LENGTH *** 1FB6 A90B PLERR: LDA #11 1FB8 4C9025 JMP ZERROR 1FBB ; ------ 1FBB ; PRINTC 1FBB ; ------ 1FBB ; PRINT CHAR WITH ASCII VALUE IN [ARG1] 1FBB A505 ZPRC: LDA ARG1+LO ; GRAB THE CHAR 1FBD 4CFF25 JMP COUT ; AND SHIP IT OUT 1FC0 ; ------ 1FC0 ; PRINTN 1FC0 ; ------ 1FC0 ; PRINT VALUE OF [ARG1] AS A SIGNED INTEGER 1FC0 A505 ZPRN: LDA ARG1+LO ; MOVE [ARG1] TO [QUOT] 1FC2 8556 STA QUOT+LO 1FC4 A506 LDA ARG1+HI 1FC6 8557 STA QUOT+HI 1FC8 ; PRINT [QUOT] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 56 --- X-OPS --- 1FC8 A557 NUMBER: LDA QUOT+HI ; IF VALUE IS POSITIVE 1FCA 1008 BPL DIGCNT ; CONTINUE 1FCC A92D LDA #$2D ; ELSE START WITH A MINUS SIGN 1FCE 20FF25 JSR COUT 1FD1 204D1E JSR ABQUOT ; AND CALC ABS([QUOT]) 1FD4 ; COUNT # OF DECIMAL DIGITS 1FD4 A900 DIGCNT: LDA #0 ; RESET 1FD6 855E STA DIGITS ; DIGIT INDEX 1FD8 A556 DGC: LDA QUOT+LO ; IS QUOTIENT 1FDA 0557 ORA QUOT+HI ; ZERO YET? 1FDC F012 BEQ PRNTN3 ; YES, READY TO PRINT 1FDE A90A LDA #10 ; ELSE DIVIDE [QUOT] 1FE0 8558 STA REMAIN+LO ; BY 10 (LSB) 1FE2 A900 LDA #0 1FE4 8559 STA REMAIN+HI ; 10 (MSB) 1FE6 205B1E JSR UDIV ; UNSIGNED DIVIDE 1FE9 A558 LDA REMAIN+LO ; FETCH LSB OF REMAINDER (THE DIGIT) 1FEB 48 PHA ; SAVE IT ON STACK 1FEC E65E INC DIGITS ; UPDATE DIGIT COUNT 1FEE D0E8 BNE DGC ; LOOP TILL QUOTIENT=0 1FF0 A55E PRNTN3: LDA DIGITS ; IF DIGIT COUNT IS NZ 1FF2 D005 BNE PRNTN4 ; CONTINUE 1FF4 A930 LDA #'0' ; ELSE PRINT "0" 1FF6 4CFF25 JMP COUT ; AND RETURN 1FF9 68 PRNTN4: PLA ; PULL A DIGIT OFF THE STACK 1FFA 18 CLC 1FFB 6930 ADC #'0' ; CONVERT TO ASCII 1FFD 20FF25 JSR COUT ; AND PRINT IT 2000 C65E DEC DIGITS ; OUT OF DIGITS YET? 2002 D0F5 BNE PRNTN4 ; NO, KEEP LOOPING 2004 60 RTS 2005 ; ------ 2005 ; RANDOM 2005 ; ------ 2005 ; RETURN A RANDOM VALUE BETWEEN 0 AND [ARG1] 2005 A505 ZRAND: LDA ARG1+LO ; MAKE [ARG1] THE DIVISOR 2007 8507 STA ARG2+LO AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 57 --- X-OPS --- 2009 A506 LDA ARG1+HI 200B 8508 STA ARG2+HI 200D 20F825 JSR RANDOM ; GET RANDOM BYTES INTO [A] AND [X] 2010 8605 STX ARG1+LO ; MAKE THEM THE DIVIDEND 2012 297F AND #$7F ; MAKE SURE MSB IS POSITIVE 2014 8506 STA ARG1+HI 2016 200F1E JSR DIVIDE ; SIGNED DIVIDE, [ARG1] / [ARG2] 2019 A558 LDA REMAIN+LO ; MOVE REMAINDER 201B 850F STA VALUE+LO ; INTO [VALUE] 201D A559 LDA REMAIN+HI 201F 8510 STA VALUE+HI 2021 209219 JSR INCVAL ; INCREMENT [VALUE] 2024 4CCA18 JMP PUTVAL ; AND RETURN RESULT 2027 ; ---- 2027 ; PUSH 2027 ; ---- 2027 ; PUSH [ARG1] ONTO THE Z-STACK 2027 A605 ZPUSH: LDX ARG1+LO 2029 A506 LDA ARG1+HI 202B 4CA618 JMP PUSHXA 202E ; --- 202E ; POP 202E ; --- 202E ; POP WORD OFF Z-STACK, STORE IN VARIABLE [ARG1] 202E 208C18 ZPOP: JSR POPVAL ; VALUE INTO [VALUE] 2031 A505 LDA ARG1+LO ; GET VARIABLE ID 2033 4CB918 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 58 --- READ HANDLER --- 2036 ; ---- 2036 ; READ 2036 ; ---- 2036 ; READ LINE INTO TABLE [ARG1]; PARSE INTO TABLE [ARG2] 2036 20C226 ZREAD: JSR ZUSL ; UPDATE THE STATUS LINE 2039 A506 LDA ARG1+HI ; MAKE THE TABLE ADDRESSES 203B 18 CLC ; ABSOLUTE 203C 6526 ADC ZCODE ; LSBS NEED NOT CHANGE 203E 8506 STA ARG1+HI 2040 A508 LDA ARG2+HI 2042 18 CLC 2043 6526 ADC ZCODE 2045 8508 STA ARG2+HI 2047 204629 JSR INPUT ; READ LINE; RETURN LENGTH IN [A] 204A 8545 STA LINLEN ; SAVE # CHARS IN LINE 204C A900 LDA #0 204E 8546 STA WRDLEN ; INIT # CHARS IN WORD COUNTER 2050 A001 LDY #1 ; POINT TO "# WORDS READ" SLOT 2052 9107 STA (ARG2),Y ; AND CLEAR IT ([A] = 0) 2054 8443 STY SOURCE ; INIT SOURCE TABLE PNTR ([Y] = 1) 2056 C8 INY ; = 2 2057 8444 STY RESULT ; AND RESULT TABLE POINTER 2059 ; MAIN LOOP STARTS HERE 2059 A000 READL: LDY #0 ; POINT TO "MAX WORDS" SLOT 205B B107 LDA (ARG2),Y ; AND READ IT 205D F00A BEQ RL1 ; FOR THE "SAMPLER BUG" 205F C8 INY ; POINT TO "# WORDS READ" SLOT 2060 D107 CMP (ARG2),Y ; TOO MANY WORDS? 2062 B005 BCS RL1 ; NOT YET 2064 ; *** ERROR #13: PARSER OVERFLOW *** 2064 A90D LDA #13 2066 4C9025 JMP ZERROR 2069 A545 RL1: LDA LINLEN 206B 0546 ORA WRDLEN ; OUT OF CHARS AND WORDS? 206D D001 BNE RL2 ; NOT YET 206F 60 RLEX: RTS ; ELSE EXIT AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 59 --- READ HANDLER --- 2070 A546 RL2: LDA WRDLEN ; GET WORD LENGTH 2072 C906 CMP #6 ; 6 CHARS DONE? 2074 9003 BCC RL3 ; NO, KEEP GOING 2076 200721 JSR FLUSHW ; ELSE FLUSH REMAINDER OF WORD 2079 A546 RL3: LDA WRDLEN ; GET WORD LENGTH AGAIN 207B D024 BNE READL2 ; CONTINUE IF NOT FIRST CHAR 207D ; START A NEW WORD 207D A205 LDX #5 ; CLEAR Z-WORD INPUT BUFFER 207F 9537 RLL: STA IN,X ; [A] = 0 2081 CA DEX 2082 10FB BPL RLL 2084 20F920 JSR EFIND ; GET BASE ADDRESS INTO [ENTRY] 2087 A543 LDA SOURCE ; STORE THE START POS OF THE WORD 2089 A003 LDY #3 ; INTO THE "WORD START" SLOT 208B 9147 STA (ENTRY),Y ; OF THE RESULT TABLE 208D A8 TAY 208E B105 LDA (ARG1),Y ; GET A CHAR FROM SOURCE BUFFER 2090 203421 JSR SIB ; IS IT A SELF-INSERTING BREAK? 2093 B026 BCS DOSIB ; YES IF CARRY WAS SET 2095 202221 JSR NORM ; IS IT A "NORMAL" BREAK? 2098 9007 BCC READL2 ; NO, CONTINUE 209A E643 INC SOURCE ; ELSE FLUSH THE STRANDED BREAK 209C C645 DEC LINLEN ; UPDATE # CHARS LEFT IN LINE 209E 4C5920 JMP READL ; AND LOOP 20A1 A545 READL2: LDA LINLEN ; OUT OF CHARS YET? 20A3 F01E BEQ READL3 ; LOOKS THAT WAY 20A5 A443 LDY SOURCE 20A7 B105 LDA (ARG1),Y ; ELSE GRAB NEXT CHAR 20A9 201D21 JSR BREAK ; IS IT A BREAK? 20AC B015 BCS READL3 ; YES IF CARRY WAS SET 20AE A646 LDX WRDLEN ; ELSE STORE THE CHAR 20B0 9537 STA IN,X ; INTO THE INPUT BUFFER 20B2 C645 DEC LINLEN ; ONE LESS CHAR IN LINE 20B4 E646 INC WRDLEN ; ONE MORE IN WORD 20B6 E643 INC SOURCE ; POINT TO NEXT CHAR IN SOURCE 20B8 4C5920 JMP READL ; AND LOOP BACK 20BB 8537 DOSIB: STA IN ; PUT THE BREAK INTO 1ST WORD SLOT 20BD C645 DEC LINLEN ; ONE LESS CHAR IN LINE 20BF E646 INC WRDLEN ; ONE MORE IN WORD BUFFER AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 60 --- READ HANDLER --- 20C1 E643 INC SOURCE ; POINT TO NEXT SOURCE CHAR 20C3 A546 READL3: LDA WRDLEN ; ANY CHARS IN WORD YET? 20C5 F092 BEQ READL ; APPARENTLY NOT, SO LOOP BACK 20C7 20F920 JSR EFIND ; GET ENTRY ADDR INTO [ENTRY] 20CA A546 LDA WRDLEN ; GET ACTUAL LNGTH OF WORD 20CC A002 LDY #2 ; STORE IT IN "WORD LENGTH" SLOT 20CE 9147 STA (ENTRY),Y ; OF THE CURRENT ENTRY 20D0 20F523 JSR CONZST ; CONVERT ASCII IN [IN] TO Z-STRING 20D3 204621 JSR FINDW ; AND LOOK IT UP IN VOCABULARY 20D6 A001 LDY #1 20D8 B107 LDA (ARG2),Y ; FETCH THE # WORDS READ 20DA 18 CLC 20DB 6901 ADC #1 ; INCREMENT IT 20DD 9107 STA (ARG2),Y ; AND UPDATE 20DF 20F920 JSR EFIND ; MAKE [ENTRY] POINT TO ENTRY 20E2 A000 LDY #0 20E4 8446 STY WRDLEN ; CLEAR # CHARS IN WORD 20E6 A510 LDA VALUE+HI ; GET MSB OF VOCAB ENTRY ADDRESS 20E8 9147 STA (ENTRY),Y ; AND STORE IN 1ST SLOT OF ENTRY 20EA C8 INY 20EB A50F LDA VALUE+LO ; ALSO STORE LSB IN 2ND SLOT 20ED 9147 STA (ENTRY),Y 20EF A544 LDA RESULT ; UPDATE THE 20F1 18 CLC ; RESULT TABLE POINTER 20F2 6904 ADC #4 ; SO IT POINTS TO THE 20F4 8544 STA RESULT ; NEXT ENTRY 20F6 4C5920 JMP READL ; AND LOOP BACK 20F9 ; ----------------------------------- 20F9 ; FIND BASE ADDR OF RESULT ENTRY SLOT 20F9 ; ----------------------------------- 20F9 A507 EFIND: LDA ARG2+LO ; LSB OF RESULT TABLE BASE 20FB 18 CLC 20FC 6544 ADC RESULT ; AND CURRENT POINTER 20FE 8547 STA ENTRY+LO ; SAVE IN [ENTRY] 2100 A508 LDA ARG2+HI ; ALSO ADD MSB 2102 6900 ADC #0 2104 8548 STA ENTRY+HI 2106 60 RTS 2107 ; ---------- 2107 ; FLUSH WORD AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 61 --- READ HANDLER --- 2107 ; ---------- 2107 A545 FLUSHW: LDA LINLEN ; ANY CHARS LEFT IN LINE? 2109 F011 BEQ FLEX ; NO, SCRAM 210B A443 LDY SOURCE ; GET CURRENT CHAR POINTER 210D B105 LDA (ARG1),Y ; AND GRAB A CHAR 210F 201D21 JSR BREAK ; IS IT A BREAK? 2112 B008 BCS FLEX ; EXIT IF SO 2114 C645 DEC LINLEN ; ELSE UPDATE CHAR COUNT 2116 E646 INC WRDLEN ; AND WORD-CHAR COUNT 2118 E643 INC SOURCE ; AND CHAR POINTER 211A D0EB BNE FLUSHW ; AND LOOP BACK (ALWAYS) 211C 60 FLEX: RTS 211D ; --------------------------------- 211D ; IS CHAR IN [A] ANY TYPE OF BREAK? 211D ; --------------------------------- 211D 203421 BREAK: JSR SIB ; CHECK FOR A SIB FIRST 2120 B022 BCS FBRK ; EXIT NOW IF MATCHED 2122 ; ELSE FALL THROUGH ... 2122 ; -------------------------------- 2122 ; IS CHAR IN [A] A "NORMAL" BREAK? 2122 ; -------------------------------- 2122 A205 NORM: LDX #NBRKS-1 ; NUMBER OF "NORMAL" BREAKS 2124 DD2E21 NBL: CMP BRKTBL,X ; MATCHED? 2127 F01B BEQ FBRK ; YES, EXIT 2129 CA DEX 212A 10F8 BPL NBL ; NO, KEEP LOOKING 212C 18 CLC ; NO MATCH, CLEAR CARRY 212D 60 RTS ; AND RETURN 212E ; ------------------ 212E ; NORMAL BREAK CHARS 212E ; ------------------ 212E 213F2C2E BRKTBL: DB "!?,." ; IN ORDER OF 2132 0D DB EOL ; ASCENDING FREQUENCY 2133 20 DB SPACE ; SPACE CHAR IS TESTED FIRST FOR SPEED 0006 NBRKS EQU $-BRKTBL ; # NORMAL BREAKS 2134 ; --------------------- 2134 ; IS CHAR IN [A] A SIB? 2134 ; --------------------- AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 62 --- READ HANDLER --- 2134 AA SIB: TAX ; SAVE TEST CHAR 2135 A000 LDY #0 ; 1ST BYTE IN VOCAB TABLE 2137 B131 LDA (VOCAB),Y ; HAS # SIBS 2139 A8 TAY ; USE AS AN INDEX 213A 8A TXA ; RESTORE TEST CHAR 213B D131 SBL: CMP (VOCAB),Y ; MATCHED? 213D F005 BEQ FBRK ; YES, REPORT IT 213F 88 DEY 2140 D0F9 BNE SBL ; ELSE KEEP LOOPING 2142 18 CLC ; NO MATCH, SO 2143 60 RTS ; EXIT WITH CARRY CLEAR 2144 38 FBRK: SEC ; EXIT WITH CARRY SET 2145 60 RTS ; IF MATCHED WITH A BREAK CHAR 2146 ; ----------------- 2146 ; VOCABULARY SEARCH 2146 ; ----------------- 2146 ; ENTRY: 4-BYTE TARGET Z-WORD IN [OUT] 2146 ; EXIT: ABS ENTRY ADDRESS IN [VALUE] IF FOUND; 2146 ; OTHERWISE [VALUE] = 0 2146 A000 FINDW: LDY #0 ; GET # SIBS 2148 B131 LDA (VOCAB),Y ; IN VOCAB TABLE 214A 18 CLC ; INCREMENT IT 214B 6901 ADC #1 ; FOR PROPER ALIGNMENT 214D 6531 ADC VOCAB+LO ; NOW ADD THE BASE ADDR OF THE TABLE 214F 850F STA VALUE+LO ; TO GET THE ACTUAL BASE ADDR 2151 A532 LDA VOCAB+HI ; OF THE VOCAB ENTRIES 2153 6900 ADC #0 ; WHICH IS SAVED 2155 8510 STA VALUE+HI ; IN [VALUE] 2157 B10F LDA (VALUE),Y ; GET # BYTES PER ENTRY ([Y] = 0) 2159 854B STA ESIZE ; SAVE IT HERE 215B 209219 JSR INCVAL ; POINT TO NEXT BYTE 215E B10F LDA (VALUE),Y ; GET # ENTRIES IN TABLE (MSB) 2160 854A STA NENTS+HI ; AND STUFF IT IN [NENTS] 2162 209219 JSR INCVAL ; NEXT BYTE 2165 B10F LDA (VALUE),Y ; DON'T FORGET THE LSB! 2167 8549 STA NENTS+LO 2169 209219 JSR INCVAL ; [VALUE] NOW POINTS TO 1ST ENTRY 216C ; BEGIN THE SEARCH! 216C A000 FWL1: LDY #0 216E B10F LDA (VALUE),Y ; GET 1ST BYTE OF ENTRY 2170 C53D CMP OUT ; MATCHED 1ST BYTE OF TARGET? AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OPCODE EXECUTORS PAGE 63 --- READ HANDLER --- 2172 D015 BNE WNEXT ; NO, SKIP TO NEXT WORD 2174 C8 INY 2175 B10F LDA (VALUE),Y 2177 C53E CMP OUT+1 ; 2ND BYTE MATCHED? 2179 D00E BNE WNEXT ; NOPE 217B C8 INY 217C B10F LDA (VALUE),Y 217E C53F CMP OUT+2 ; 3RD BYTE? 2180 D007 BNE WNEXT ; SORRY ... 2182 C8 INY 2183 B10F LDA (VALUE),Y 2185 C540 CMP OUT+3 ; LAST BYTE 2187 F01F BEQ FWSUCC ; FOUND IT! 2189 A54B WNEXT: LDA ESIZE ; GET ENTRY SIZE 218B 18 CLC ; AND ADD IT TO ENTRY ADDRESS 218C 650F ADC VALUE+LO ; TO MAKE [VALUE] 218E 850F STA VALUE+LO ; POINT TO THE NEXT ENTRY 2190 9002 BCC WNX 2192 E610 INC VALUE+HI 2194 A549 WNX: LDA NENTS+LO ; DECREMENT THE 2196 38 SEC ; ENTRY COUNTER 2197 E901 SBC #1 2199 8549 STA NENTS+LO 219B B002 BCS WNX1 219D C64A DEC NENTS+HI 219F 054A WNX1: ORA NENTS+HI ; KEEP SEARCHING 21A1 D0C9 BNE FWL1 ; UNTIL COUNT IS ZERO 21A3 850F STA VALUE+LO 21A5 8510 STA VALUE+HI 21A7 60 RTS ; THEN RETURN WITH [VALUE] = 0 21A8 ; ENTRY MATCHED! 21A8 A510 FWSUCC: LDA VALUE+HI ; CONVERT ABSOLUTE ENTRY ADDRESS 21AA 38 SEC ; IN [VALUE] 21AB E526 SBC ZCODE ; TO RELATIVE Z-ADDRESS 21AD 8510 STA VALUE+HI ; LSB NEEDN'T CHANGE 21AF 60 RTS END INCLUD PAGING.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 64 --- TIME-STAMP PAGING ROUTINE (BM 3/8/85) --- 21B0 ; ------------------------- 21B0 ; FETCH NEXT BYTE OF Z-CODE 21B0 ; ------------------------- 21B0 ; EXIT: BYTE AT [ZPC] IN [A] & [Y]; FLAGS SET 21B0 A51C NEXTPC: LDA ZPCFLG ; IS [ZPCPNT] VALID? 21B2 D01E BNE NPC2 ; YES, GET THE BYTE 21B4 ; Z-PAGE HAS CHANGED! 21B4 A51A LDA ZPCM ; GET TOP 21B6 A41B LDY ZPCH ; 9 BITS OF [ZPC] 21B8 D008 BNE NPC0 ; SWAP PAGE IF TOP BIT IS SET 21BA C527 CMP ZPURE ; IS THIS PAGE PRELOADED? 21BC B004 BCS NPC0 ; NO, SWAP IT IN 21BE 6526 ADC ZCODE ; ELSE MAKE IT ABSOLUTE 21C0 D007 BNE NPC1 ; AND GIVE IT TO [ZPCPNT] 21C2 A200 NPC0: LDX #0 21C4 8622 STX MPCFLG ; INVALIDATE [MPC] 21C6 201C22 JSR PAGE ; AND GET ABS PAGE ADDR INTO [A] 21C9 851E NPC1: STA ZPCPNT+HI ; SET ABS PAGE ADDRESS 21CB A2FF LDX #$FF 21CD 861C STX ZPCFLG ; VALIDATE [ZPCPNT] 21CF E8 INX ; = 0 21D0 861D STX ZPCPNT+LO ; CLEAR LSB OF POINTER 21D2 A419 NPC2: LDY ZPCL ; FETCH PAGE INDEX 21D4 B11D LDA (ZPCPNT),Y ; GET Z-BYTE 21D6 E619 INC ZPCL ; END OF PAGE YET? 21D8 D00A BNE NPC3 ; NO, EXIT 21DA A000 LDY #0 21DC 841C STY ZPCFLG ; ELSE INVALIDATE [ZPCPNT] 21DE E61A INC ZPCM ; POINT [ZPC] TO 21E0 D002 BNE NPC3 ; THE NEXT 21E2 E61B INC ZPCH ; Z-PAGE 21E4 A8 NPC3: TAY ; SET FLAGS 21E5 60 RTS ; AND RETURN 21E6 ; ------------------------------- 21E6 ; GET NEXT BYTE OF VIRTUAL MEMORY 21E6 ; ------------------------------- AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 65 --- TIME-STAMP PAGING ROUTINE (BM 3/8/85) --- 21E6 ; EXIT: BYTE AT [MPC] IN [A] & [Y]; FLAGS SET 21E6 A522 GETBYT: LDA MPCFLG ; IS [MPCPNT] VALID? 21E8 D01E BNE GTBT2 ; YES, GET THE BYTE 21EA ; Z-PAGE HAS CHANGED! 21EA A520 LDA MPCM ; GET TOP 21EC A421 LDY MPCH ; 9 BITS OF [MPC] 21EE D008 BNE GTBT0 ; SWAP PAGE IF TOP BIT IS SET 21F1 PATCH EQU $+1 ; PATCH POINT FOR "VERIFY" 21F0 C527 CMP ZPURE ; IS THIS PAGE PRELOADED? 21F2 B004 BCS GTBT0 ; NO, SWAP IT IN 21F4 6526 ADC ZCODE ; ELSE MAKE IT ABSOLUTE 21F6 D007 BNE GTBT1 ; AND GIVE IT TO [MPCPNT] 21F8 A200 GTBT0: LDX #0 21FA 861C STX ZPCFLG ; INVALIDATE [ZPC] 21FC 201C22 JSR PAGE ; AND GET ABS PAGE ADDR INTO [A] 21FF 8524 GTBT1: STA MPCPNT+HI ; SET ABS PAGE ADDRESS 2201 A2FF LDX #$FF 2203 8622 STX MPCFLG ; VALIDATE [MPCPNT] 2205 E8 INX ; = 0 2206 8623 STX MPCPNT+LO ; CLEAR LSB OF POINTER 2208 A41F GTBT2: LDY MPCL ; FETCH PAGE INDEX 220A B123 LDA (MPCPNT),Y ; GET Z-BYTE 220C E61F INC MPCL ; END OF PAGE YET? 220E D00A BNE GTBT3 ; NO, EXIT 2210 A000 LDY #0 2212 8422 STY MPCFLG ; ELSE INVALIDATE [MPCPNT] 2214 E620 INC MPCM ; POINT [MPC] TO 2216 D002 BNE GTBT3 ; THE NEXT 2218 E621 INC MPCH ; Z-PAGE 221A A8 GTBT3: TAY ; SET FLAGS 221B 60 RTS ; AND RETURN 221C ; ------------------------ 221C ; LOCATE A SWAPABLE Z-PAGE 221C ; ------------------------ 221C ; 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 66 --- TIME-STAMP PAGING ROUTINE (BM 3/8/85) --- 221C ; EXIT: ABSOLUTE PAGE IN [A] 221C 852B PAGE: STA TARGET+LO ; SAVE THE 221E 842C STY TARGET+HI ; TARGET Z-PAGE HERE 2220 ; IS THIS Z-PAGE ALREADY PAGED IN? 2220 A200 LDX #0 2222 862A STX ZPAGE ; START AT BUFFER #0 2224 DD0013 PG1: CMP PTABL,X ; LSB MATCHED? 2227 D008 BNE PG2 ; NO, TRY NEXT BUFFER 2229 98 TYA ; ELSE CHECK 222A DDA013 CMP PTABH,X ; TOP BIT 222D F02B BEQ PG4 ; MATCHED! BUFFER IN [ZPAGE] 222F A52B LDA TARGET+LO ; ELSE RESTORE LSB 2231 E62A PG2: INC ZPAGE ; UPDATE TALLY 2233 E8 INX 2234 E429 CPX PMAX ; OUT OF BUFFERS YET? 2236 90EC BCC PG1 ; NO, KEEP SEARCHING 2238 ; SWAP IN THE TARGET PAGE 2238 209322 PG3: JSR EARLY ; GET EARLIEST PAGE 223B A62E LDX SWAP ; INTO [SWAP] & [X] 223D 862A STX ZPAGE ; SAVE FOR LATER 223F A52B LDA TARGET+LO ; ASSIGN THE TARGET PAGE 2241 9D0013 STA PTABL,X ; TO THE EARLIEST BUFFER 2244 8570 STA DBLOCK+LO ; ALSO GIVE IT TO ZDOS 2246 A52C LDA TARGET+HI ; SAME FOR TOP BIT 2248 2901 AND #%00000001 ; USE ONLY BIT 0 224A 9DA013 STA PTABH,X 224D 8571 STA DBLOCK+HI 224F 8A TXA 2250 18 CLC 2251 6528 ADC PAGE0 ; CALC ABS ADDR OF BUFFER 2253 8573 STA DBUFF+HI ; GIVE IT TO ZDOS 2255 20D92A JSR GETDSK ; SWAP IN THE NEW PAGE 2258 B034 BCS DISKE ; ERROR IF CARRY SET 225A ; UPDATE THE TIMESTAMP 225A A42A PG4: LDY ZPAGE ; GET THE BUFFER INDEX 225C B95014 LDA LRUMAP,Y ; GET THIS BUFFER'S STAMP 225F C52D CMP STAMP ; SAME AS CURRENT STAMP? 2261 F025 BEQ PG8 ; YES, EXIT AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 67 --- TIME-STAMP PAGING ROUTINE (BM 3/8/85) --- 2263 E62D INC STAMP ; UPDATE STAMP 2265 D01C BNE PG7 ; CONTINUE IF NO OVERFLOW 2267 ; HANDLE STAMP OVERFLOW 2267 209322 JSR EARLY ; GET EARLIEST STAMP INTO [LRU] 226A A200 LDX #0 ; INIT INDEX 226C BD5014 PG5: LDA LRUMAP,X ; GET A STAMP READING 226F F006 BEQ PG6 ; EXIT IF ALREADY ZERO 2271 38 SEC ; ELSE SUBTRACT OFF 2272 E525 SBC LRU ; THE EARLIEST TIMESTAMP 2274 9D5014 STA LRUMAP,X ; AND REPLACE THE STAMP 2277 E8 PG6: INX 2278 E429 CPX PMAX ; END OF SWAPPING SPACE? 227A 90F0 BCC PG5 ; LOOP TILL ALL STAMPS FIXED 227C A900 LDA #0 ; TURN BACK THE CLOCK 227E 38 SEC ; TO REFLECT NEW 227F E525 SBC LRU ; STAMP READING 2281 852D STA STAMP 2283 A52D PG7: LDA STAMP ; FETCH STAMP 2285 995014 STA LRUMAP,Y ; STAMP TARGET PAGE WITH IT 2288 A52A PG8: LDA ZPAGE ; GET BUFFER INDEX 228A 18 CLC ; MAKE IT 228B 6528 ADC PAGE0 ; ABSOLUTE 228D 60 RTS ; AND RETURN IT IN [A] 228E ; *** ERROR #14: DRIVE ACCESS *** 228E A90E DISKE: LDA #14 2290 4C9025 JMP ZERROR 2293 ; ------------------------- 2293 ; LOCATE EARLIEST TIMESTAMP 2293 ; ------------------------- 2293 ; EXIT: [LRU] - EARLIEST TIMESTAMP 2293 ; [SWAP] = INDEX TO EARLIEST BUFFER 2293 A200 EARLY: LDX #0 ; INIT INDEX 2295 862E STX SWAP ; AND [SWAP] 2297 AD5014 LDA LRUMAP ; GET STAMP OF BUFFER #0 229A E8 INX ; START COMPARE WITH BUFFER #1 229B DD5014 EAR0: CMP LRUMAP,X ; IS THIS STAMP EARLIER THAN [A]? 229E 9005 BCC EAR1 ; NO, TRY NEXT STAMP 22A0 BD5014 LDA LRUMAP,X ; ELSE FETCH EARLIER ENTRY 22A3 862E STX SWAP ; AND REMEMBER WHERE WE FOUND IT 22A5 E8 EAR1: INX ; POINT TO NEXT STAMP AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 68 --- TIME-STAMP PAGING ROUTINE (BM 3/8/85) --- 22A6 E429 CPX PMAX ; OUT OF STAMPS YET? 22A8 90F1 BCC EAR0 ; LOOP TILL EMPTY 22AA 8525 STA LRU ; SAVE EARLIEST STAMP HERE 22AC 60 RTS 22AD ; ------------------------- 22AD ; POINT [MPC] TO V-ADDR [I] 22AD ; ------------------------- 22AD A511 SETWRD: LDA I+LO 22AF 851F STA MPCL 22B1 A512 LDA I+HI 22B3 8520 STA MPCM 22B5 A900 LDA #0 22B7 8521 STA MPCH ; ZERO TOP BIT 22B9 8522 STA MPCFLG ; INVALIDATE [MPC] 22BB 60 RTS 22BC ; ---------------------------- 22BC ; GET Z-WORD AT [MPC] INTO [I] 22BC ; ---------------------------- 22BC 20E621 GETWRD: JSR GETBYT 22BF 8512 STA I+HI 22C1 20E621 JSR GETBYT 22C4 8511 STA I+LO 22C6 60 RTS END INCLUD ZSTRING.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 69 --- Z-STRING HANDLERS --- 22C7 ; ----------------------- 22C7 ; POINT TO ZSTRING IN [I] 22C7 ; ----------------------- 22C7 A511 SETSTR: LDA I+LO ; WORD-ALIGN THE ADDRESS 22C9 0A ASL A 22CA 851F STA MPCL 22CC A512 LDA I+HI 22CE 2A ROL A 22CF 8520 STA MPCM 22D1 A900 LDA #0 22D3 8522 STA MPCFLG ; [MPC] IS CHANGING! 22D5 2A ROL A 22D6 8521 STA MPCH 22D8 60 ZSTEX: RTS 22D9 ; ----------------------- 22D9 ; PRINT Z-STRING AT [MPC] 22D9 ; ----------------------- 22D9 A200 PZSTR: LDX #0 22DB 864C STX PSET ; ASSUME PERMANENT CHARSET 22DD 8650 STX ZFLAG ; CLEAR BYTE FLAG 22DF CA DEX ; = $FF 22E0 864D STX TSET ; NO TEMPSET ACTIVE 22E2 20AD23 PZTOP: JSR GETZCH ; GET A Z-CHAR 22E5 B0F1 BCS ZSTEX ; END OF STRING IF CARRY IS SET 22E7 854E STA ZCHAR ; ELSE SAVE CHAR HERE 22E9 AA TAX ; SET FLAGS 22EA F041 BEQ BLANK ; PRINT SPACE IF CHAR = 0 22EC C904 CMP #4 ; IS THIS AN F-WORD? 22EE 905B BCC DOFREQ ; APPARENTLY SO 22F0 C906 CMP #6 ; PERHAPS A SHIFT CODE? 22F2 903D BCC NEWSET ; YES, CHANGE CHARSETS 22F4 20A123 JSR GETSET ; ELSE GET CHARSET 22F7 AA TAX ; SET FLAGS 22F8 D00B BNE SET1 ; SKIP IF NOT CHARSET #0 22FA ; PRINT A LOWER-CASE CHAR (CHARSET #0) 22FA A95B LDA #$61-6 ; ASCII "a" MINUS Z-OFFSET 22FC 18 TOASC: CLC 22FD 654E ADC ZCHAR ; ADD Z-CHAR INDEX AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 70 --- Z-STRING HANDLERS --- 22FF 20FF25 SHOVE: JSR COUT ; SHOW THE CHAR 2302 4CE222 JMP PZTOP ; AND GRAB NEXT CHAR 2305 ; PRINT AN UPPER-CASE CHAR (CHARSET #1) 2305 C901 SET1: CMP #1 ; MAKE SURE IT'S SET #1 2307 D004 BNE SET2 ; ELSE MUST BE SET #2 2309 A93B LDA #$41-6 ; ASCII "A" MINUS Z-OFFSET 230B D0EF BNE TOASC ; SAME AS SET #0 230D ; PRINT FROM CHARSET #2 230D A54E SET2: LDA ZCHAR ; RETRIEVE THE Z-CHAR 230F 38 SEC 2310 E906 SBC #6 ; ZERO-ALIGN IT 2312 F007 BEQ DIRECT ; IF ZERO, IT'S A "DIRECT" ASCII 2314 AA TAX ; OTHERWISE USE CODE AS AN INDEX 2315 BDCA24 LDA CHRTBL,X ; INTO THE CHARSET TABLE 2318 4CFF22 JMP SHOVE ; AND PRINT THE CHAR 231B ; DECODE A "DIRECT" ASCII CHAR 231B 20AD23 DIRECT: JSR GETZCH ; FETCH NEXT Z-CHAR 231E 0A ASL A 231F 0A ASL A 2320 0A ASL A 2321 0A ASL A 2322 0A ASL A ; SHIFT INTO POSITION 2323 854E STA ZCHAR ; AND SAVE HERE 2325 20AD23 JSR GETZCH ; GRAB YET ANOTHER Z-CHAR 2328 054E ORA ZCHAR ; SUPERIMPOSE THE 2ND BYTE 232A 4CFF22 JMP SHOVE ; AND PRINT THE RESULT 232D ; PRINT A SPACE 232D A920 BLANK: LDA #SPACE ; ASCII SPACE CHAR 232F D0CE BNE SHOVE 2331 ; CHANGE CHARSET 2331 38 NEWSET: SEC ; CONVERT THE SHIFT CODE 2332 E903 SBC #3 ; TO 1 OR 2 2334 A8 TAY 2335 20A123 JSR GETSET ; IS MODE TEMPORARY? 2338 D005 BNE TOPERM ; YES, DO A PERMSHIFT 233A 844D STY TSET ; ELSE JUST A TEMPSHIFT 233C 4CE222 JMP PZTOP ; AND CONTINUE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 71 --- Z-STRING HANDLERS --- 233F 844C TOPERM: STY PSET ; SET PERM CHARSET 2341 C54C CMP PSET ; SAME AS BEFORE? 2343 F09D BEQ PZTOP ; YES, CONTINUE 2345 A900 LDA #0 2347 854C STA PSET ; ELSE RESET CHARSET 2349 F097 BEQ PZTOP ; BEFORE LOOPING BACK 234B ; PRINT AN F-WORD 234B 38 DOFREQ: SEC 234C E901 SBC #1 ; ZERO-ALIGN THE CODE 234E 0A ASL A ; AND MULTIPLY TIMES 64 234F 0A ASL A ; TO OBTAIN THE SEGMENT OFFSET 2350 0A ASL A ; INTO THE F-WORDS TABLE 2351 0A ASL A 2352 0A ASL A 2353 0A ASL A 2354 854F STA OFFSET ; SAVE OFFSET FOR LATER 2356 20AD23 JSR GETZCH ; NOW GET THE F-WORD POINTER 2359 0A ASL A ; WORD-ALIGN IT 235A 18 CLC ; AND 235B 654F ADC OFFSET ; ADD THE SEGMENT OFFSET 235D A8 TAY ; TO GET THE OFFSET OF THE F-WORD 235E B133 LDA (FWORDS),Y ; FROM THE START OF THE F-WORDS TABLE 2360 8512 STA I+HI ; SAVE MSB OF F-WORD ADDRESS 2362 C8 INY 2363 B133 LDA (FWORDS),Y ; ALSO SAVE LSB 2365 8511 STA I+LO ; Z-ADDRESS OF F-WORD IS IN [I] 2367 ; SAVE THE STATE OF CURRENT Z-STRING 2367 A521 LDA MPCH 2369 48 PHA 236A A520 LDA MPCM 236C 48 PHA 236D A51F LDA MPCL 236F 48 PHA 2370 A54C LDA PSET 2372 48 PHA 2373 A550 LDA ZFLAG 2375 48 PHA 2376 A552 LDA ZWORD+HI 2378 48 PHA 2379 A551 LDA ZWORD+LO 237B 48 PHA 237C 20C722 JSR SETSTR ; PRINT THE Z-STRING 237F 20D922 JSR PZSTR ; IN [I] 2382 ; RESTORE OLD Z-STRING AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 72 --- Z-STRING HANDLERS --- 2382 68 PLA 2383 8551 STA ZWORD+LO 2385 68 PLA 2386 8552 STA ZWORD+HI 2388 68 PLA 2389 8550 STA ZFLAG 238B 68 PLA 238C 854C STA PSET 238E 68 PLA 238F 851F STA MPCL 2391 68 PLA 2392 8520 STA MPCM 2394 68 PLA 2395 8521 STA MPCH 2397 A2FF LDX #$FF 2399 864D STX TSET ; DISABLE TEMP CHARSET 239B E8 INX ; = 0 239C 8622 STX MPCFLG ; [MPC] HAS CHANGED 239E 4CE222 JMP PZTOP ; CONTINUE INNOCENTLY 23A1 ; ---------------------- 23A1 ; RETURN CURRENT CHARSET 23A1 ; ---------------------- 23A1 A54D GETSET: LDA TSET 23A3 1003 BPL GS 23A5 A54C LDA PSET 23A7 60 RTS 23A8 A0FF GS: LDY #$FF 23AA 844D STY TSET 23AC 60 RTS 23AD ; ----------------- 23AD ; FETCH NEXT Z-CHAR 23AD ; ----------------- 23AD A550 GETZCH: LDA ZFLAG ; WHICH BYTE IS THIS? 23AF 1002 BPL GTZ0 ; $FF = LAST 23B1 38 SEC ; SET CARRY TO INDICATE 23B2 60 RTS ; NO MORE CHARS 23B3 D013 GTZ0: BNE GETZ1 ; NOT FIRST CHAR, EITHER 23B5 ; GET A Z-WORD INTO [ZWORD], RETURN 1ST CHAR IN TRIPLET 23B5 E650 INC ZFLAG ; UPDATE CHAR COUNT 23B7 20E621 JSR GETBYT ; GET TRIPLET AT [MPC] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 73 --- Z-STRING HANDLERS --- 23BA 8552 STA ZWORD+HI ; INTO [ZWORD] 23BC 20E621 JSR GETBYT 23BF 8551 STA ZWORD+LO 23C1 A552 LDA ZWORD+HI 23C3 4A LSR A 23C4 4A LSR A ; SHIFT 1ST CHAR INTO PLACE 23C5 4CF123 JMP GTEXIT ; AND RETURN IT 23C8 38 GETZ1: SEC 23C9 E901 SBC #1 23CB D016 BNE GETZ2 ; LAST CHAR IN TRIPLET IF ZERO 23CD A902 LDA #2 ; ELSE 23CF 8550 STA ZFLAG ; RESET CHAR INDEX 23D1 A551 LDA ZWORD+LO ; GET BOTTOM HALF OF TRIPLET 23D3 8511 STA I+LO ; MOVE HERE FOR SHIFTING 23D5 A552 LDA ZWORD+HI ; GET TOP HALF 23D7 0611 ASL I+LO ; SHIFT THE TOP 3 BITS OF LOWER HALF 23D9 2A ROL A ; INTO THE BOTTOM OF THE TOP HALF 23DA 0611 ASL I+LO 23DC 2A ROL A 23DD 0611 ASL I+LO 23DF 2A ROL A 23E0 4CF123 JMP GTEXIT 23E3 A900 GETZ2: LDA #0 ; SET FLAG TO INDICATE 23E5 8550 STA ZFLAG ; END OF TRIPLET 23E7 A552 LDA ZWORD+HI ; TEST TOP HALF OF TRIPLET 23E9 1004 BPL GETZ3 ; CONTINUE IF NOT END OF STRING 23EB A9FF LDA #$FF ; ELSE 23ED 8550 STA ZFLAG ; INDICATE LAST TRIPLET IN STRING 23EF A551 GETZ3: LDA ZWORD+LO ; GET BOTTOM HALF OF TRIPLET 23F1 291F GTEXIT: AND #%00011111 ; MASK OUT GARBAGE BITS 23F3 18 CLC 23F4 60 RTS 23F5 ; --------------------------------- 23F5 ; CONVERT [IN] TO Z-STRING IN [OUT] 23F5 ; --------------------------------- 23F5 A905 CONZST: LDA #$05 ; FILL OUTPUT BUFFER 23F7 AA TAX ; WITH PAD CHARS ($05) 23F8 953D CZSL: STA OUT,X 23FA CA DEX 23FB 10FB BPL CZSL AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 74 --- Z-STRING HANDLERS --- 23FD A906 LDA #6 ; INIT 23FF 8553 STA CONCNT ; CHAR COUNT 2401 A900 LDA #0 ; CLEAR 2403 8554 STA CONIN ; SOURCE AND 2405 8555 STA CONOUT ; OUTPUT INDEXES 2407 A654 CONTOP: LDX CONIN ; FETCH SOURCE INDEX 2409 E654 INC CONIN ; AND UPDATE 240B B537 LDA IN,X ; GRAB AN ASCII CHAR 240D 854E STA ZCHAR ; SAVE IT HERE 240F D004 BNE NEXTZ ; CONTINUE IF CHAR WAS NZ 2411 A905 LDA #5 ; ELSE SHIP OUT 2413 D02C BNE CSHIP ; A PAD CHAR 2415 A54E NEXTZ: LDA ZCHAR 2417 208B24 JSR SAYSET ; WHICH CHARSET TO USE? 241A F020 BEQ CSET0 ; LOWER-CASE IF ZERO 241C 18 CLC ; ELSE DO A TEMP-SHIFT 241D 6903 ADC #3 ; 4 = CHARSET 1, 5 = CHARSET 2 241F A655 LDX CONOUT ; FETCH OUTPUT INDEX 2421 953D STA OUT,X ; SEND THE SHIFT CHAR 2423 E655 INC CONOUT ; UPDATE INDEX 2425 C653 DEC CONCNT ; AND CHAR COUNT 2427 D003 BNE CTEST ; IF OUT OF CHARS 2429 4CA424 JMP ZCRUSH ; CRUSH 'EM! 242C A54E CTEST: LDA ZCHAR ; TEST CHAR AGAIN 242E 208B24 JSR SAYSET 2431 C902 CMP #2 2433 F019 BEQ CSET2 ; CHARSET #2 2435 ; HANDLE CHARSET #1 (UPPER CASE ALPHA) 2435 A54E LDA ZCHAR 2437 38 SEC 2438 E93B SBC #$41-6 ; CONVERT TO Z-CHAR 243A 1005 BPL CSHIP ; AND SEND TO OUTPUT 243C ; HANDLE CHARSET #0 (LOWER CASE ALPHA) 243C A54E CSET0: LDA ZCHAR 243E 38 SEC 243F E95B SBC #$61-6 ; CONVERT TO Z-CHAR 2441 ; SHIP Z-CHAR TO OUTPUT BUFFER 2441 A655 CSHIP: LDX CONOUT ; FETCH OUTPUT INDEX AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 75 --- Z-STRING HANDLERS --- 2443 953D STA OUT,X 2445 E655 INC CONOUT ; UPDATE INDEX 2447 C653 DEC CONCNT ; DONE 6 CHARS YET? 2449 D0BC BNE CONTOP ; NO, LOOP BACK 244B 4CA424 JMP ZCRUSH ; ELSE CRUSH 244E ; HANDLE CHARSET #2 (MISCELLANEOUS) 244E A54E CSET2: LDA ZCHAR ; GRAB CHAR 2450 207B24 JSR CTABLE ; IS IT IN CHARSET #3 TABLE? 2453 D0EC BNE CSHIP ; YES, SEND IT TO OUTPUT 2455 ; SEND A "DIRECT" ASCII CHAR 2455 A906 LDA #6 ; ASCII ALERT! 2457 A655 LDX CONOUT 2459 953D STA OUT,X 245B E655 INC CONOUT ; UPDATE INDEX 245D C653 DEC CONCNT ; AND CHAR COUNT 245F F043 BEQ ZCRUSH ; BUFFER FULL! 2461 ; SEND 1ST HALF OF "DIRECT" 2461 A54E LDA ZCHAR 2463 4A LSR A 2464 4A LSR A 2465 4A LSR A 2466 4A LSR A 2467 4A LSR A 2468 2903 AND #%00000011 ; MASK GARBAGE 246A A655 LDX CONOUT 246C 953D STA OUT,X 246E E655 INC CONOUT 2470 C653 DEC CONCNT 2472 F030 BEQ ZCRUSH ; BUFFER FULL! 2474 ; SEND 2ND HALF OF "DIRECT" 2474 A54E LDA ZCHAR ; GET CHAR YET AGAIN 2476 291F AND #%00011111 ; MASK JUNK 2478 4C4124 JMP CSHIP ; AND SHIP IT OUT 247B ; --------------------- 247B ; IS [A] IN CHARSET #3? 247B ; --------------------- 247B ; EXIT: [A] = CHAR CODE IF FOUND, Z-FLAG CLEARED 247B ; Z-FLAG SET IF NOT FOUND AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 76 --- Z-STRING HANDLERS --- 247B A219 CTABLE: LDX #25 247D DDCA24 CNL: CMP CHRTBL,X 2480 F004 BEQ CNOK 2482 CA DEX 2483 D0F8 BNE CNL 2485 60 RTS ; Z-FLAG SET IF NO MATCH 2486 8A CNOK: TXA ; CHAR CODE IS INDEX 2487 18 CLC 2488 6906 ADC #6 ; PLUS 6 248A 60 RTS 248B ; ----------------------------- 248B ; RETURN CHARSET OF CHAR IN [A] 248B ; ----------------------------- 248B C961 SAYSET: CMP #'a' 248D 9007 BCC SAY1 248F C97B CMP #'z'+1 2491 B003 BCS SAY1 2493 A900 LDA #0 ; IT'S CHARSET #0 2495 60 RTS 2496 C941 SAY1: CMP #'A' 2498 9007 BCC SAY2 249A C95B CMP #'Z'+1 249C B003 BCS SAY2 249E A901 LDA #1 ; IT'S CHARSET #1 24A0 60 RTS 24A1 A902 SAY2: LDA #2 ; IT'S CHARSET #2 24A3 60 RTS 24A4 ; ---------------------- 24A4 ; CRUSH Z-CHARS IN [OUT] 24A4 ; ---------------------- 24A4 A53E ZCRUSH: LDA OUT+1 ; GET 2ND Z-CHAR 24A6 0A ASL A ; SHIFT BITS INTO POSITION 24A7 0A ASL A 24A8 0A ASL A 24A9 0A ASL A 24AA 263D ROL OUT ; ALONG WITH 1ST Z-CHAR 24AC 0A ASL A 24AD 263D ROL OUT 24AF 053F ORA OUT+2 ; SUPERIMPOSE 3RD Z-CHAR 24B1 853E STA OUT+1 24B3 A541 LDA OUT+4 ; GET 5TH Z-CHAR 24B5 0A ASL A ; SHIFT BITS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 77 --- Z-STRING HANDLERS --- 24B6 0A ASL A 24B7 0A ASL A 24B8 0A ASL A 24B9 2640 ROL OUT+3 ; ALONG WITH 4TH Z-CHAR 24BB 0A ASL A 24BC 2640 ROL OUT+3 24BE 0542 ORA OUT+5 ; SUPERIMPOSE 6TH Z-CHAR 24C0 AA TAX ; SAVE HERE 24C1 A540 LDA OUT+3 ; GRAB 4TH Z-CHAR 24C3 0980 ORA #%10000000 ; SET HIGH BIT 24C5 853F STA OUT+2 ; MOVE CRUSHED Z-WORD 24C7 8640 STX OUT+3 ; INTO PLACE 24C9 60 RTS 24CA ; ----------------------- 24CA ; CHARSET #2 DECODE TABLE 24CA ; ----------------------- 24CA 00 CHRTBL: DB 0 ; DUMMY BYTE FOR "DIRECT" 24CB 0D DB $0D ; EOL 24CC 30313233 DB "0123456789.,!?_#" 24DC 27 DB $27 ; SINGLE QUOTE 24DD 22 DB $22 ; DOUBLE QUOTE 24DE 2F5C2D3A DB "/\-:()" END INCLUD OBJECTS.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 78 --- OBJECT & PROPERTY HANDLERS --- 24E4 ; ---------------------------------- 24E4 ; GET ABSOLUTE ADDRESS OF OBJECT [A] 24E4 ; ---------------------------------- 24E4 ; EXIT: ADDRESS IN [I] 24E4 8511 OBJLOC: STA I+LO ; SAVE LSB FOR ADDING 24E6 A200 LDX #0 ; CLEAR MSB 24E8 8612 STX I+HI ; FOR SHIFTING 24EA 0A ASL A ; MULTIPLY BY 8 24EB 2612 ROL I+HI 24ED 0A ASL A 24EE 2612 ROL I+HI 24F0 0A ASL A 24F1 2612 ROL I+HI 24F3 18 CLC ; ADD TO ITSELF 24F4 6511 ADC I+LO ; TO GET TIMES 9 24F6 9002 BCC OBJ1 24F8 E612 INC I+HI 24FA 18 OBJ1: CLC 24FB 6935 ADC #53 ; NOW ADD 53 24FD 9002 BCC OBJ2 ; (THE OBJECT TABLE OFFSET) 24FF E612 INC I+HI 2501 18 OBJ2: CLC ; NEXT ADD THE ABS ADDR 2502 6535 ADC OBJTAB+LO ; OF THE OBJECT TABLE 2504 8511 STA I+LO 2506 A512 LDA I+HI 2508 6536 ADC OBJTAB+HI 250A 8512 STA I+HI 250C 60 RTS 250D ; ----------------------------- 250D ; GET ADDRESS OF PROPERTY TABLE 250D ; ----------------------------- 250D ; EXIT: [I] HAS ABSOLUTE ADDR OF PROPERTY TABLE 250D ; [Y] HAS OFFSET TO START OF PROP IDS 250D A505 PROPB: LDA ARG1+LO 250F 20E424 JSR OBJLOC 2512 A007 LDY #7 2514 B111 LDA (I),Y ; GET MSB OF P-TABLE ADDRESS 2516 18 CLC 2517 6526 ADC ZCODE ; MAKE IT ABSOLUTE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 79 --- OBJECT & PROPERTY HANDLERS --- 2519 AA TAX ; AND SAVE HERE 251A C8 INY 251B B111 LDA (I),Y ; NOW GET LSB 251D 8511 STA I+LO 251F 8612 STX I+HI ; [I] NOW POINTS TO PROP TABLE 2521 A000 LDY #0 2523 B111 LDA (I),Y ; GET LENGTH OF SHORT DESC 2525 0A ASL A ; WORD-ALIGN IT 2526 A8 TAY ; EXPECTED HERE 2527 C8 INY ; POINT JUST PAST THE DESCRIPTION 2528 60 RTS 2529 ; ------------------- 2529 ; FETCH A PROPERTY ID 2529 ; ------------------- 2529 ; ENTRY: LIKE "PROPB" EXIT 2529 B111 PROPN: LDA (I),Y 252B 291F AND #%00011111 ; MASK OUT LENGTH BITS 252D 60 RTS 252E ; ------------------------------- 252E ; FETCH # BYTES IN PROPERTY VALUE 252E ; ------------------------------- 252E ; ENTRY: LIKE "PROPB" EXIT 252E B111 PROPL: LDA (I),Y 2530 4A LSR A ; LENGTH IS IN 2531 4A LSR A ; BITS 7-5 2532 4A LSR A ; SO SHIFT INTO PLACE 2533 4A LSR A 2534 4A LSR A 2535 60 RTS 2536 ; ---------------------- 2536 ; POINT TO NEXT PROPERTY 2536 ; ---------------------- 2536 ; ENTRY: LIKE "PROPB" EXIT 2536 202E25 PROPNX: JSR PROPL ; GET LENGTH OF CURRENT PROP 2539 AA TAX ; SAVE HERE 253A C8 PPX: INY ; LOOP UNTIL 253B CA DEX ; [Y] POINTS TO 253C 10FC BPL PPX ; START OF NEXT PROP 253E C8 INY ; CORRECT ALIGNMENT 253F 60 RTS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 80 --- OBJECT & PROPERTY HANDLERS --- 2540 ; ---------------- 2540 ; GET OBJECT FLAGS 2540 ; ---------------- 2540 ; ENTRY: OBJECT # IN [ARG1], FLAG # IN [ARG2] 2540 ; EXIT: FLAG WORD IN [K], BIT ID IN [J], 2540 ; FLAG WORD ADDRESS IN [I] 2540 A505 FLAGSU: LDA ARG1+LO 2542 20E424 JSR OBJLOC ; GET OBJECT ADDR IN [I] 2545 A507 LDA ARG2+LO ; LOOK AT FLAG ID 2547 C910 CMP #$10 ; FIRST SET OF FLAGS? 2549 900F BCC FLS1 ; YES, ADDR IN [I] IS CORRECT 254B E910 SBC #16 ; ELSE ZERO-ALIGN FLAG INDEX 254D AA TAX ; SAVE IT HERE 254E A511 LDA I+LO ; ADD 2 TO ADDRESS IN [I] 2550 18 CLC ; TO POINT TO ADDRESS OF 2551 6902 ADC #2 ; 2ND FLAG WORD 2553 8511 STA I+LO 2555 9002 BCC FLS0 2557 E612 INC I+HI 2559 8A FLS0: TXA ; RESTORE INDEX 255A 8515 FLS1: STA K+LO ; SAVE FLAG ID HERE 255C A201 LDX #1 ; INIT THE 255E 8613 STX J+LO ; FLAG WORD TO 2560 CA DEX ; $0001 2561 8614 STX J+HI 2563 A90F LDA #15 ; SUBTRACT THE BIT POSITION 2565 38 SEC ; FROM 15 2566 E515 SBC K+LO ; TO GET THE SHIFT LOOP 2568 AA TAX ; INDEX 2569 F007 BEQ FLS2 ; EXIT NOW IF NO SHIFT NEEDED 256B 0613 FLSL: ASL J+LO ; SHIFT THE BIT 256D 2614 ROL J+HI ; INTO POSITION 256F CA DEX 2570 D0F9 BNE FLSL 2572 A000 FLS2: LDY #0 ; MOVE THE FLAG WORD 2574 B111 LDA (I),Y ; INTO [J] 2576 8516 STA K+HI ; FIRST THE MSB 2578 C8 INY 2579 B111 LDA (I),Y AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- OP SUPPORT & MEMORY MANAGEMENT PAGE 81 --- OBJECT & PROPERTY HANDLERS --- 257B 8515 STA K+LO ; THEN THE LSB 257D 60 RTS END INCLUD IO.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 82 --- GAME I/O: CBM PLUS/4 --- 257E ; -------------- 257E ; INTERNAL ERROR 257E ; -------------- 257E ; ENTRY: ERROR CODE IN [A] 257E 496E7465 ERRM: DB "Internal error " 258D 30302E ENUMB: DB "00." 0012 ERRML EQU $-ERRM 2590 A001 ZERROR: LDY #1 ; CONVERT ERROR CODE IN [A] 2592 20122F ECON: JSR DIV10 ; TO ASCII IN [ENUMB] 2595 0930 ORA #'0' 2597 998D25 STA ENUMB,Y 259A 8A TXA 259B 88 DEY 259C 10F4 BPL ECON 259E 20CCFF JSR CLRCHN ; RESET I/O 25A1 203D26 JSR ZCRLF ; FLUSH BUFFER 25A4 A900 LDA #0 25A6 8562 STA SCRIPT ; DISABLE SCRIPTING 25A8 A27E LDX #LOW ERRM 25AA A925 LDA #HIGH ERRM 25AC A012 LDY #ERRML 25AE 20A329 JSR DLINE 25B1 ; FALL THROUGH ... 25B1 ; ------------ 25B1 ; QUIT/RESTART 25B1 ; ------------ 25B1 203D26 ZQUIT: JSR ZCRLF ; FLUSH BUFFER 25B4 A2C0 LDX #LOW EOS 25B6 A925 LDA #HIGH EOS 25B8 A00E LDY #EOSL 25BA 20A329 JSR DLINE ; "END OF STORY" ; LDA FAST ; FAST-READ ENGAGED? ; BEQ FREEZE ; JSR FOFF ; DISENGAGE IF SO 25BD 4CBD25 FREEZE: JMP FREEZE 25C0 456E6420 EOS: DB "End of story." 25CD 0D DB EOL 000E EOSL EQU $-EOS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 83 --- GAME I/O: CBM PLUS/4 --- 25CE ; ------- 25CE ; RESTART 25CE ; ------- 25CE 203D26 ZSTART: JSR ZCRLF ; CLEAR BUFFER 25D1 4C7116 JMP WARM1 ; AND DO A WARMSTART 25D4 ; -------------------- 25D4 ; PRINT VERSION NUMBER 25D4 ; -------------------- 25D4 43424D20 VERS: DB "CBM Plus/4 Version C" 25E8 0D DB EOL 0015 VERSL EQU $-VERS 25E9 203D26 VERNUM: JSR ZCRLF ; FLUSH BUFFER 25EC A2D4 LDX #LOW VERS 25EE A925 LDA #HIGH VERS 25F0 A015 LDY #VERSL 25F2 4CA329 JMP DLINE 25F5 ; -------------------------- 25F5 ; RETURN TOP RAM PAGE IN [A] 25F5 ; -------------------------- 25F5 A9BE MEMTOP: LDA #$BE ; IT'S A GIVEN 25F7 60 RTS 25F8 ; -------------------------------- 25F8 ; RETURN RANDOM BYTES IN [A] & [X] 25F8 ; -------------------------------- 25F8 AE1EFF RANDOM: LDX HSCAN ; SOMETHING FROM HERE 25FB AD1DFF LDA VLINEL ; AND HERE 25FE 60 RTS 25FF ; ------------------- 25FF ; Z-PRINT A CHARACTER 25FF ; ------------------- 25FF ; ENTRY: ASCII CHAR IN [A] 25FF C90D COUT: CMP #EOL ; IF EOL, 2601 F03A BEQ ZCRLF ; DO IT! 2603 C920 CMP #SPACE ; IGNORE ALL OTHER 2605 900B BCC CEX ; CONTROLS 2607 A660 LDX LENGTH ; ELSE GET LINE POINTER 2609 9D3015 STA LBUFF,X ; ADD CHAR TO BUFFER AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 84 --- GAME I/O: CBM PLUS/4 --- 260C E027 CPX #XSIZE ; END OF LINE? 260E B003 BCS FLUSH ; YES, FLUSH THE LINE 2610 E660 INC LENGTH ; ELSE UPDATE POINTER 2612 60 CEX: RTS 2613 ; ------------------- 2613 ; FLUSH OUTPUT BUFFER 2613 ; ------------------- 2613 ; ENTRY: LENGTH OF BUFFER IN [X] 2613 A920 FLUSH: LDA #SPACE 2615 DD3015 FL0: CMP LBUFF,X ; FIND LAST SPACE CHAR 2618 F005 BEQ FL1 ; IN THE LINE 261A CA DEX 261B D0F8 BNE FL0 ; IF NONE FOUND, 261D A227 LDX #XSIZE ; FLUSH ENTIRE LINE 261F 8661 FL1: STX OLDLEN ; SAVE OLD LINE POS HERE 2621 8660 STX LENGTH ; MAKE IT THE NEW LINE LENGTH 2623 203D26 JSR ZCRLF ; PRINT LINE UP TO LAST SPACE 2626 ; START NEW LINE WITH REMAINDER OF OLD 2626 A661 LDX OLDLEN ; GET OLD LINE POS 2628 A000 LDY #0 ; START NEW LINE AT BEGINNING 262A E8 FL2: INX 262B E027 CPX #XSIZE ; CONTINUE IF 262D 9005 BCC FL3 ; INSIDE OR 262F F003 BEQ FL3 ; AT END OF LINE 2631 8460 STY LENGTH ; ELSE SET NEW LINE LENGTH 2633 60 RTS 2634 BD3015 FL3: LDA LBUFF,X ; GET CHAR FROM OLD LINE 2637 993015 STA LBUFF,Y ; MOVE TO START OF NEW LINE 263A C8 INY ; UPDATE LENGTH OF NEW LINE 263B D0ED BNE FL2 263D ; --------------- 263D ; CARRIAGE RETURN 263D ; --------------- 263D E665 ZCRLF: INC LINCNT ; NEW LINE GOING OUT 263F A565 LDA LINCNT ; IS IT TIME TO 2641 C566 CMP LMAX ; PRINT "MORE" YET? 2643 9041 BCC CR1 ; NO, CONTINUE 2645 ; SCREEN FULL; PRINT "MORE" AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 85 --- GAME I/O: CBM PLUS/4 --- 2645 20C226 JSR ZUSL ; UPDATE STATUS LINE 2648 38 SEC 2649 20F0FF JSR PLOT ; GET CURSOR POSITION 264C 8463 STY OLDX 264E 8664 STX OLDY 2650 A900 LDA #0 2652 8565 STA LINCNT ; RESET LINE COUNTER 2654 8D3B05 STA COLOR ; PAINT IT, BLACK 2657 85EF STA NDX ; CLEAR QUEUE 2659 A2A9 LDX #LOW MORE 265B A926 LDA #HIGH MORE 265D A006 LDY #MOREL 265F 20A329 JSR DLINE ; PRINT "MORE" DIRECTLY 2662 A951 LDA #WHITE ; SWITCH BACK 2664 8D3B05 STA COLOR ; TO WHITE TEXT 2667 20E4FF MWAIT: JSR GETIN ; WAIT FOR ANY KEYPRESS 266A AA TAX 266B F0FA BEQ MWAIT 266D A463 LDY OLDX 266F A664 LDX OLDY 2671 18 CLC 2672 20F0FF JSR PLOT ; RESTORE CURSOR 2675 A2AF LDX #LOW MCLR 2677 A926 LDA #HIGH MCLR 2679 A006 LDY #MOREL 267B 20A329 JSR DLINE ; RUB OUT "MORE" 267E A463 LDY OLDX 2680 A664 LDX OLDY 2682 18 CLC 2683 20F0FF JSR PLOT ; RESTORE CURSOR AGAIN 2686 A660 CR1: LDX LENGTH 2688 A90D LDA #EOL ; INSTALL EOL AT 268A 9D3015 STA LBUFF,X ; END OF CURRENT LINE 268D E660 INC LENGTH ; UPDATE LINE LENGTH 268F A460 LINOUT: LDY LENGTH ; IF BUFFER EMPTY, 2691 F011 BEQ LINEX ; DON'T PRINT ANYTHING 2693 846B STY PRLEN ; SAVE LENGTH HERE FOR "PPRINT" 2695 A200 LDX #0 ; SEND CONTENTS OF [LBUFF] 2697 BD3015 LOUT: LDA LBUFF,X ; TO SCREEN AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 86 --- GAME I/O: CBM PLUS/4 --- 269A 20E128 JSR CHAR 269D E8 INX 269E 88 DEY 269F D0F6 BNE LOUT 26A1 20B629 JSR PPRINT ; PRINT [LBUFF] IF ENABLED 26A4 A900 LINEX: LDA #0 ; RESET LINE LENGTH 26A6 8560 STA LENGTH ; TO ZERO 26A8 60 RTS ; AND RETURN 26A9 5B4D4F52 MORE: DB "[MORE]" 0006 MOREL EQU $-MORE 26AF 20202020 MCLR: DB " " 26B5 ; ---------------------- 26B5 ; UPDATE THE STATUS LINE 26B5 ; ---------------------- 26B5 53636F72 SCORE: DB "Score: " 0007 SCOREL EQU $-SCORE 26BC 54696D65 CLOCK: DB "Time: " 0006 CLOCKL EQU $-CLOCK 26C2 38 ZUSL: SEC ; SAVE THE CURRENT 26C3 20F0FF JSR PLOT ; CURSOR POSITION 26C6 8463 STY OLDX 26C8 8664 STX OLDY 26CA A560 LDA LENGTH ; SAVE ALL 26CC 48 PHA ; STRING-PRINTING 26CD A521 LDA MPCH ; VARIABLES 26CF 48 PHA 26D0 A520 LDA MPCM 26D2 48 PHA 26D3 A51F LDA MPCL 26D5 48 PHA 26D6 A54D LDA TSET 26D8 48 PHA 26D9 A54C LDA PSET 26DB 48 PHA 26DC A552 LDA ZWORD+HI 26DE 48 PHA 26DF A551 LDA ZWORD+LO 26E1 48 PHA 26E2 A550 LDA ZFLAG 26E4 48 PHA 26E5 A55E LDA DIGITS 26E7 48 PHA AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 87 --- GAME I/O: CBM PLUS/4 --- 26E8 A227 LDX #XSIZE 26EA BD3015 USL0: LDA LBUFF,X ; MOVE CONTENTS OF [LBUFF] 26ED 9D9015 STA BUFSAV,X ; TO [BUFSAV] 26F0 A920 LDA #SPACE ; CLEAR 26F2 9D3015 STA LBUFF,X ; [LBUFF] WITH SPACES 26F5 CA DEX 26F6 10F2 BPL USL0 26F8 A900 LDA #0 26FA 8560 STA LENGTH ; RESET LINE LENGTH 26FC 8562 STA SCRIPT ; DISABLE SCRIPTING 26FE 8D3B05 STA COLOR ; PRINT STATUS LINE IN BLACK 2701 A913 LDA #$13 ; HOME THE 2703 20D2FF JSR CHROUT ; CURSOR 2706 A912 LDA #$12 ; PRINT IN 2708 20D2FF JSR CHROUT ; INVERSE VIDEO 270B ; PRINT ROOM DESCRIPTION 270B A910 LDA #16 ; GLOBAL VAR #16 (ROOM ID) 270D 207F18 JSR GETVRG ; GET IT INTO [VALUE] 2710 A50F LDA VALUE+LO 2712 20791B JSR PRNTDC ; PRINT SHORT ROOM DESCRIPTION 2715 A918 LDA #24 ; MOVE LINE INDEX UP 2717 8560 STA LENGTH ; TO TIME/SCORE POSITION 2719 A911 LDA #17 ; GLOBAL VAR #17 (SCORE/HOURS) 271B 207F18 JSR GETVRG ; GET IT INTO [VALUE] 271E A55F LDA TIMEFL ; GET MODE FLAG 2720 D032 BNE DOTIME ; USE TIME MODE IF NON-ZERO 2722 ; PRINT "SCORE" 2722 A953 LDA #'S' 2724 20FF25 JSR COUT 2727 A963 LDA #'c' 2729 20FF25 JSR COUT 272C A96F LDA #'o' 272E 20FF25 JSR COUT 2731 A972 LDA #'r' 2733 20FF25 JSR COUT 2736 A965 LDA #'e' 2738 20FF25 JSR COUT 273B A93A LDA #':' 273D 20FF25 JSR COUT 2740 A920 LDA #SPACE 2742 20FF25 JSR COUT AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 88 --- GAME I/O: CBM PLUS/4 --- 2745 A50F LDA VALUE+LO ; MOVE SCORE VALUE 2747 8556 STA QUOT+LO ; INTO [QUOT] 2749 A510 LDA VALUE+HI ; FOR PRINTING 274B 8557 STA QUOT+HI 274D 20C81F JSR NUMBER ; PRINT SCORE VALUE IN DECIMAL 2750 A92F LDA #'/' ; PRINT A SLASH 2752 D035 BNE MOVMIN ; BRANCH ALWAYS 2754 ; PRINT "TIME" 2754 A954 DOTIME: LDA #'T' 2756 20FF25 JSR COUT 2759 A969 LDA #'i' 275B 20FF25 JSR COUT 275E A96D LDA #'m' 2760 20FF25 JSR COUT 2763 A965 LDA #'e' 2765 20FF25 JSR COUT 2768 A93A LDA #':' 276A 20FF25 JSR COUT 276D A920 LDA #SPACE 276F 20FF25 JSR COUT 2772 A50F LDA VALUE+LO ; 00 IS REALLY 24 2774 D002 BNE DT0 2776 A918 LDA #24 2778 C90D DT0: CMP #13 ; IS HOURS > 12, 277A 9002 BCC DT1 277C E90C SBC #12 ; CONVERT TO 1-12 277E 8556 DT1: STA QUOT+LO ; MOVE FOR PRINTING 2780 A900 LDA #0 2782 8557 STA QUOT+HI ; CLEAR MSB 2784 20C81F JSR NUMBER 2787 A93A LDA #':' ; COLON 2789 20FF25 MOVMIN: JSR COUT ; PRINT SLASH OR COLON 278C A912 LDA #18 ; GLOBAL VAR #18 (MOVES/MINUTES) 278E 207F18 JSR GETVRG ; GET IT INTO [VALUE] 2791 A50F LDA VALUE+LO ; MOVE TO [QUOT] 2793 8556 STA QUOT+LO ; FOR EVENTUAL PRINTING 2795 A510 LDA VALUE+HI 2797 8557 STA QUOT+HI 2799 A55F LDA TIMEFL ; WHICH MODE? 279B D006 BNE DOMINS ; TIME IF NZ 279D ; PRINT NUMBER OF MOVES AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 89 --- GAME I/O: CBM PLUS/4 --- 279D 20C81F JSR NUMBER ; SHOW # MOVES 27A0 4CCF27 JMP STATEX ; ALL DONE 27A3 ; PRINT MINUTES 27A3 A50F DOMINS: LDA VALUE+LO ; CHECK MINUTES 27A5 C90A CMP #10 ; IF MORE THAN TEN 27A7 B005 BCS DOM0 ; CONTINUE 27A9 A930 LDA #'0' ; ELSE PRINT A 27AB 20FF25 JSR COUT ; PADDING "0" FIRST 27AE 20C81F DOM0: JSR NUMBER ; SHOW MINUTES 27B1 A920 LDA #SPACE 27B3 20FF25 JSR COUT ; SEPARATE THINGS 27B6 A911 LDA #17 ; CHECK "HOURS" AGAIN 27B8 207F18 JSR GETVRG 27BB A50F LDA VALUE+LO 27BD C90C CMP #12 ; PAST NOON? 27BF B004 BCS DOPM ; YES, PRINT "PM" 27C1 A941 LDA #'A' ; ELSE PRINT "AM" 27C3 D002 BNE DOXM ; BRANCH ALWAYS 27C5 A950 DOPM: LDA #'P' 27C7 20FF25 DOXM: JSR COUT 27CA A94D LDA #'M' 27CC 20FF25 JSR COUT 27CF ; STATUS LINE READY 27CF A928 STATEX: LDA #40 ; PRINT THE ENTIRE 27D1 8560 STA LENGTH ; STATUS LINE 27D3 208626 JSR CR1 27D6 A951 LDA #WHITE 27D8 8D3B05 STA COLOR ; BACK TO WHITE TEXT 27DB A227 LDX #XSIZE ; RESTORE OLD [LBUFF] 27DD BD9015 USLX: LDA BUFSAV,X 27E0 9D3015 STA LBUFF,X 27E3 CA DEX 27E4 10F7 BPL USLX 27E6 68 PLA ; RESTORE ALL 27E7 855E STA DIGITS ; SAVED VARIABLES 27E9 68 PLA AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 90 --- GAME I/O: CBM PLUS/4 --- 27EA 8550 STA ZFLAG 27EC 68 PLA 27ED 8551 STA ZWORD+LO 27EF 68 PLA 27F0 8552 STA ZWORD+HI 27F2 68 PLA 27F3 854C STA PSET 27F5 68 PLA 27F6 854D STA TSET 27F8 68 PLA 27F9 851F STA MPCL 27FB 68 PLA 27FC 8520 STA MPCM 27FE 68 PLA 27FF 8521 STA MPCH 2801 68 PLA 2802 8560 STA LENGTH 2804 A664 LDX OLDY ; RESTORE CURSOR 2806 A463 LDY OLDX 2808 18 CLC 2809 20F0FF JSR PLOT 280C A2FF LDX #$FF 280E 8662 STX SCRIPT ; RE-ENABLE SCRIPTING 2810 E8 INX ; = 0 2811 8622 STX MPCFLG ; INVALIDATE [MPC] 2813 60 RTS END INCLUD MACHINE.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 91 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2814 ; ---------------------------- 2814 ; FETCH ASCII KEYCODE INTO [A] 2814 ; ---------------------------- 2814 ; EXIT: ASCII IN [A] & [IOCHAR] 00E0 CYCLE EQU $E0 ; SHORT BLINK CYCLE 0064 CURSOR EQU $64 ; SCREEN CODE FOR UNDERLINE 2814 8A GETKEY: TXA ; SAVE [X] & [Y] 2815 48 PHA 2816 98 TYA 2817 48 PHA 2818 A900 GKEY0: LDA #0 281A 85DE STA BLINK+LO ; SET CURSOR BLINK 281C 85DF STA BLINK+HI ; FOR A LONG CYCLE 281E 38 SEC ; GET CURSOR COORDINATES 281F 20F0FF JSR PLOT ; INTO [X/Y] 2822 84D9 STY COLUMN ; SAVE X-POS HERE 2824 BDA72A LDA LOLINE,X ; GET LSB OF ROW ADDRESS 2827 85DA STA SROW+LO ; SAVE HERE 2829 85DC STA CROW+LO ; AND HERE 282B BDC02A LDA HILINE,X ; GET LSB OF ROW ADDRESS 282E 85DB STA SROW+HI ; USE AS-IS FOR SCREEN RAM 2830 38 SEC ; SUBTRACT 1K 2831 E904 SBC #4 ; TO GET CORRESPONDING 2833 85DD STA CROW+HI ; COLOR RAM ADDRESS 2835 A964 LDA #CURSOR 2837 85D8 STA CSHAPE 2839 91DA STA (SROW),Y ; FORCE CURSOR ON 283B A900 LDA #0 283D 91DC STA (CROW),Y ; MAKE CURSOR BLACK 283F 20E4FF GKEY1: JSR GETIN ; GET A KEYCODE 2842 AA TAX ; SAVE IT HERE 2843 A4D9 LDY COLUMN ; NEED THIS FOR LATER 2845 E6DE INC BLINK+LO ; UPDATE THE 2847 D018 BNE NOBLIN ; BLINK TIMER 2849 E6DF INC BLINK+HI 284B D014 BNE NOBLIN 284D A9E0 LDA #CYCLE ; RESET THE CURSOR 284F 85DF STA BLINK+HI ; FOR SHORT DUTY CYCLE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 92 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2851 A5D8 LDA CSHAPE ; FLIP THE CURSOR SHAPE 2853 C920 CMP #SPACE 2855 F004 BEQ SHAP0 ; IF SPACE, USE CURSOR 2857 A920 LDA #SPACE ; ELSE USE SPACE 2859 D002 BNE SHAP1 285B A964 SHAP0: LDA #CURSOR 285D 85D8 SHAP1: STA CSHAPE ; UPDATE CURSOR SHAPE 285F 91DA STA (SROW),Y ; INTO SCREEN RAM 2861 8A NOBLIN: TXA ; ANY KEY PRESSED? 2862 F0DB BEQ GKEY1 ; NOT IF CODE WAS ZERO 2864 ; CONVERT & MASK KEYCODE IN [A] 2864 C941 CMP #'A' ; CONVERT UNSHIFTED ALPHA 2866 9006 BCC MASK ; TO ASCII LOWER CASE 2868 C95B CMP #'Z'+1 286A B002 BCS MASK 286C 6920 ADC #$20 286E 297F MASK: AND #%01111111 ; SCREEN OUT SHIFTS 2870 C90D CMP #EOL ; EOL? 2872 F02A BEQ TICK 2874 C914 CMP #BACKSP ; BACKSPACE? 2876 F026 BEQ TICK 2878 C920 CMP #SPACE ; ANYTHING ELSE < "SPACE" 287A 901C BCC BADKEY ; IS BAD 287C C93C CMP #'<' ; CHANGE "<" 287E D004 BNE MASK0 ; TO "," 2880 A92C LDA #',' 2882 D01A BNE TICK 2884 C93E MASK0: CMP #'>' ; CHANGE ">" 2886 D004 BNE MASK1 ; TO "." 2888 A92E LDA #'.' 288A D012 BNE TICK 288C C97B MASK1: CMP #'z'+1 ; PASS L-C ALPHA 288E B008 BCS BADKEY 2890 C961 CMP #'a' 2892 B00A BCS TICK 2894 C95B CMP #'Z'+1 ; PASS U-C ALPHA 2896 9006 BCC TICK ; AND OTHER ASCII CHARS 2898 20772A BADKEY: JSR BOOP ; REJECT BAD KEYPRESS 289B 4C1828 JMP GKEY0 ; AND TRY AGAIN AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 93 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 289E ; "CLICK" THE KEY 289E 8567 TICK: STA IOCHAR ; SAVE KEYCODE HERE 28A0 A920 LDA #SPACE 28A2 91DA STA (SROW),Y ; ERASE CURSOR 28A4 A951 LDA #WHITE 28A6 91DC STA (CROW),Y ; MAKE SURE COLOR RAM IS WHITE 28A8 A900 LDA #0 ; LSB CLICK FREQ 28AA 8D0EFF STA V1FLSB 28AD A907 LDA #7 ; MSB CLICK FREQ W/BIT 2 SET 28AF 8D12FF STA BITMAP 28B2 A91F LDA #$1F ; VOICE #1, FULL VOLUME 28B4 8D11FF STA VOLUME 28B7 A200 LDX #0 ; A SHORT DELAY ... 28B9 A005 LDY #5 28BB CA TICK0: DEX 28BC D0FD BNE TICK0 28BE 88 DEY 28BF D0FA BNE TICK0 28C1 8C11FF STY VOLUME ; ... THEN SHUT OFF SOUND 28C4 68 PLA ; RESTORE [X] & [Y] 28C5 A8 TAY 28C6 68 PLA 28C7 AA TAX 28C8 A567 LDA IOCHAR ; RESTORE CODE INTO [A] 28CA 60 RTS 28CB ; ------------------------- 28CB ; OUTPUT AN ASCII CHARACTER 28CB ; ------------------------- 28CB C961 LETTER: CMP #'a' ; LOWER-CASE? 28CD 9005 BCC LET0 ; NO, CONTINUE 28CF 295F AND #%01011111 ; ELSE MASK FOR LOWER-CASE 28D1 4CD2FF JMP CHROUT 28D4 C941 LET0: CMP #'A' ; UPPER-CASE? 28D6 9006 BCC LETEX 28D8 C95B CMP #'Z'+1 28DA B002 BCS LETEX 28DC 0920 ORA #%00100000 ; MAKE UPPER 28DE 4CD2FF LETEX: JMP CHROUT 28E1 ; ----------------- 28E1 ; PRINT CHAR IN [A] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 94 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 28E1 ; ----------------- 28E1 8567 CHAR: STA IOCHAR ; SAVE HERE 28E3 8A TXA ; SAVE [X] AND [Y] 28E4 48 PHA 28E5 98 TYA 28E6 48 PHA 28E7 38 SEC ; GET CURSOR X- AND Y-POS 28E8 20F0FF JSR PLOT ; INTO [Y] AND [X], RESPECTIVELY 28EB 98 TYA 28EC C928 CMP #40 ; STRIP OFF THE 28EE 9003 BCC CHKEOL ; LOGICAL LINE OFFSET 28F0 E928 SBC #40 ; UPDATE [Y] IF NECESSARY 28F2 A8 TAY 28F3 A567 CHKEOL: LDA IOCHAR ; RESTORE CHAR 28F5 C90D CMP #EOL ; IS IT EOL? 28F7 F047 BEQ OUTEOL ; YES, SPECIAL HANDLING 28F9 ; HANDLE A NON-EOL CHAR 28F9 E017 CPX #YSIZE-1 ; ON LAST SCREEN LINE? 28FB 9039 BCC NOSCRL ; NO, NO SCROLL NEEDED 28FD C027 CPY #XSIZE ; LAST CHAR ON LINE? 28FF 9035 BCC NOSCRL ; NO, DON'T SCROLL 2901 ; SCROLL THE SCREEN 2901 CA DOSCRL: DEX ; PUSH CURSOR UP ONE LINE 2902 18 CLC 2903 20F0FF JSR PLOT ; RESET THE CURSOR 2906 A668 LDX SLINE ; GET CURRENT SCROLL LINE 2908 E018 SRL0: CPX #YSIZE 290A F020 BEQ SRL2 ; SCROLL DONE 290C BDA72A LDA LOLINE,X ; GET ADDR OF DEST LINE 290F 856E STA LTO+LO ; INTO [LTO] 2911 BDC02A LDA HILINE,X 2914 856F STA LTO+HI 2916 E8 INX 2917 BDA72A LDA LOLINE,X ; GET ADDR OF SOURCE LINE 291A 856C STA LFROM+LO ; INTO [LFROM] 291C BDC02A LDA HILINE,X 291F 856D STA LFROM+HI 2921 A027 LDY #XSIZE 2923 B16C SRL1: LDA (LFROM),Y ; MOVE SOURCE LINE AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 95 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2925 916E STA (LTO),Y ; TO DEST LINE 2927 88 DEY 2928 10F9 BPL SRL1 292A 30DC BMI SRL0 ; LOOP TILL [X] = YSIZE 292C A227 SRL2: LDX #XSIZE 292E A920 LDA #SPACE 2930 9DC00F SRL3: STA SCREEN+960,X ; CLEAR LAST LINE 2933 CA DEX ; OF SCREEN RAM 2934 10FA BPL SRL3 2936 A567 NOSCRL: LDA IOCHAR ; RESTORE CHAR 2938 20CB28 JSR LETTER ; OFF TO THE SCREEN! 293B 68 PLA ; RESTORE [X] AND [Y] 293C A8 TAY 293D 68 PLA 293E AA TAX 293F 60 RTS 2940 ; HANDLE EOL 2940 E017 OUTEOL: CPX #YSIZE-1 ; LAST SCREEN LINE? 2942 90F2 BCC NOSCRL ; NO, DON'T SCROLL 2944 B0BB BCS DOSCRL ; ELSE SCROLL 2946 ; --------------------- 2946 ; FETCH A LINE OF INPUT 2946 ; --------------------- 2946 ; ENTRY: ABS ADDR OF READ BUFFER IN [ARG1] 2946 ; EXIT: # CHARS READ IN [A] 2946 208F26 INPUT: JSR LINOUT ; FLUSH [LBUFF] 2949 A000 LDY #0 294B 8465 STY LINCNT ; RESET LINE COUNT 294D 84EF STY NDX ; AND KEY QUEUE 294F 201428 INLOOP: JSR GETKEY ; GET ASCII INTO [A] AND [IOCHAR] 2952 C90D CMP #EOL ; EOL? 2954 F02A BEQ ENDLIN ; LINE DONE IF SO 2956 C914 CMP #BACKSP ; BACKSPACE? 2958 F01C BEQ BACKUP ; SPECIAL HANDLING 295A 993015 STA LBUFF,Y ; ELSE ADD CHAR TO INPUT BUFFER 295D C8 INY ; NEXT POSITION IN LINE 295E 20E128 SHOWIT: JSR CHAR ; SEND TO SCREEN AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 96 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2961 C04D CPY #77 ; 2 SCREEN LINES FULL? 2963 90EA BCC INLOOP ; NO, GET ANOTHER CHAR 2965 ; HANDLE LINE OVERFLOW 2965 201428 NOMORE: JSR GETKEY 2968 C90D CMP #EOL ; IF EOL, 296A F014 BEQ ENDLIN ; WRAP UP THE LINE 296C C914 CMP #BACKSP ; BACKSPACE 296E F006 BEQ BACKUP ; IS OKAY TOO 2970 20772A JSR BOOP ; ELSE COMPLAIN 2973 4C6529 JMP NOMORE ; AND INSIST 2976 ; HANDLE BACKSPACE 2976 88 BACKUP: DEY ; BACK UP THE POINTER 2977 10E5 BPL SHOWIT ; SEND BS IF NOT START OF LINE 2979 20772A JSR BOOP ; ELSE SCREAM WITH PAIN 297C A000 LDY #0 ; RESET POINTER 297E F0CF BEQ INLOOP ; AND WAIT FOR SOMETHING BETTER 2980 ; HANDLE END OF LINE 2980 993015 ENDLIN: STA LBUFF,Y ; SHIP EOL TO BUFFER 2983 C8 INY ; UPDATE INDEX 2984 8445 STY LINLEN ; SAVE HERE FOR "READ" 2986 846B STY PRLEN ; AND HERE FOR "PPRINT" 2988 20E128 JSR CHAR ; AND SEND EOL TO SCREEN 298B ; MOVE [LBUFF] TO [ARG1] W/LC CONVERSION 298B B92F15 LEX1: LDA LBUFF-1,Y ; GET A CHAR FROM [LBUFF] 298E C941 CMP #'A' ; IF CHAR IS ALPHA, 2990 9006 BCC LEX2 ; CONVERT TO LOWER CASE 2992 C95B CMP #'Z'+1 2994 B002 BCS LEX2 2996 6920 ADC #$20 2998 9105 LEX2: STA (ARG1),Y ; MOVE CHAR TO INPUT BUFFER AT [ARG1] 299A 88 DEY ; LOOP TILL 299B 10EE BPL LEX1 ; ALL CHARS MOVED 299D 20B629 JSR PPRINT ; SCRIPT [LBUFF] IF ENABLED 29A0 A545 LDA LINLEN ; RESTORE # CHARS 29A2 60 RTS ; INTO [A] 29A3 ; ----------------------- 29A3 ; DIRECT PRINT LINE [X/A] 29A3 ; ----------------------- 29A3 ; ENTRY: STRING ADDRESS IN [X/A] (LSB/MSB) AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 97 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 29A3 ; STRING LENGTH IN [Y] 29A3 8EAC29 DLINE: STX STRING+LO ; DROP STRING ADDRESS 29A6 8DAD29 STA STRING+HI ; INTO DUMMY OPERAND BYTES 29A9 A200 LDX #0 ; INIT BYTE-FETCHING INDEX 29AB BD DOUT: DB $BD ; 6502 "LDA nnnn,X" OPCODE 29AC 0000 STRING: DW $0000 ; DUMMY OPERAND BYTES 29AE 20E128 JSR CHAR 29B1 E8 INX 29B2 88 DEY ; STRING DONE? 29B3 D0F6 BNE DOUT ; NO, KEEP PRINTING 29B5 60 RTS 29B6 ; ----------------------- 29B6 ; SEND [LBUFF] TO PRINTER 29B6 ; ----------------------- 29B6 ; ENTRY: LENTH OF LINE IN [PRLEN] 29B6 A562 PPRINT: LDA SCRIPT ; SCRIPTING INTERNALLY ENABLED? 29B8 F04E BEQ PEX ; NO, SCRAM IMMEDIATELY 29BA AD1132 LDA ZBEGIN+ZSCRIP+1 ; CHECK SCRIPT FLAG 29BD 2901 AND #%00000001 ; SCRIPTING ON? 29BF F038 BEQ PP3 ; NO, CHECK FOR "UNSCRIPT" 29C1 A56A LDA PSTAT ; CHECK PRINTER STATUS 29C3 3043 BMI PEX ; CAN'T OPEN IF NEGATIVE 29C5 D01A BNE PP1 ; ALREADY OPEN, SCRIPT THE LINE 29C7 ; OPEN THE PRINTER FOR OUTPUT ; LDA FAST ; FAST-READ ENGAGED? ; BEQ PP0 ; NO, IGNORE ; JSR FOFF ; ELSE DISENGAGE ; LDA #8 ; JSR DOPEN ; AND RESET THE DRIVE 29C7 E66A PP0: INC PSTAT ; SET STATUS TO "PRINTER OPENED" (1) 29C9 A904 LDA #4 ; LOGICAL FILE #4 29CB AA TAX ; DEVICE #4 29CC A007 LDY #7 ; ALLOW UPPER/LOWER CASE 29CE 20BAFF JSR SETLFS ; SET UP LOGICAL FILE 29D1 A900 LDA #0 29D3 20BDFF JSR SETNAM ; NO FILENAME REQUIRED 29D6 20C0FF JSR OPEN ; OPEN THE CHANNEL 29D9 9006 BCC PP1 ; OPEN OKAY IF CARRY CLEAR 29DB A9FF PPERR: LDA #$FF ; ELSE SET PRINTER STATUS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 98 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 29DD 856A STA PSTAT ; TO "CAN'T OPEN" 29DF D022 BNE PP5 ; AND SIMULATE AN "UNSCRIPT" 29E1 A204 PP1: LDX #4 ; SET PRINTER CHANNEL 29E3 20C9FF JSR CHKOUT ; TO "OUTPUT" 29E6 B0F3 BCS PPERR ; ERROR IF CARRY SET 29E8 A000 LDY #0 ; INIT INDEX 29EA B93015 PP2: LDA LBUFF,Y 29ED 20CB28 JSR LETTER 29F0 B0E9 BCS PPERR ; ERROR IF CARRY SET 29F2 C8 INY 29F3 C66B DEC PRLEN 29F5 D0F3 BNE PP2 29F7 F00F BEQ PEX ; RESET & RETURN 29F9 ; CHECK FOR "UNSCRIPT" 29F9 A56A PP3: LDA PSTAT ; CHECK PRINTER STATUS 29FB F00B BEQ PEX ; EXIT IF PRINTER WAS OFF 29FD 3009 BMI PEX ; OR UNOPENABLE 29FF A900 PP4: LDA #0 ; RESET PRINTER STATUS FLAG 2A01 856A STA PSTAT ; TO "CLOSED" 2A03 ; ENTRY FOR PRINTER ERROR 2A03 A904 PP5: LDA #4 2A05 20C3FF JSR CLOSE ; CLOSE THE PRINTER CHANNEL ; LDA FAST ; FAST-READ AVAILABLE? ; BEQ PEX ; NO, EXIT ; LDA #8 ; ELSE ; JSR DOPEN ; RESET BOOT DRIVE ; JMP FINIT ; RE-ENGAGE FAST-READ & RETURN 2A08 4CCCFF PEX: JMP CLRCHN 2A0B ; ------------ 2A0B ; SPLIT SCREEN 2A0B ; ------------ 2A0B ; SPLIT SCREEN AT LINE [ARG1] 2A0B ; DISABLE SPLIT IF [ARG1] = 0 2A0B ; IGNORE IF SPLIT ALREADY ENABLED OR [ARG1] >= 20 2A0B A605 ZSPLIT: LDX ARG1+LO ; IF [ARG1] = 0, 2A0D F02F BEQ OFFSPL ; TURN OFF SPLIT SCREEN 2A0F A569 LDA SPSTAT ; SPLIT ALREADY ENABLED? AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 99 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2A11 D02A BNE SPLEX ; IGNORE REQUEST IF SO 2A13 E014 CPX #20 ; IF [ARG1] >= 20, 2A15 B026 BCS SPLEX ; IGNORE 2A17 E8 INX 2A18 8668 STX SLINE ; ELSE SET NEW SPLIT LINE 2A1A 8669 STX SPSTAT ; SET "SPLIT ENABLED" FLAG 2A1C BDA72A SPL0: LDA LOLINE,X ; MAKE [LFROM] POINT TO 2A1F 856C STA LFROM+LO ; LINE [X] IN WINDOW 2A21 BDC02A LDA HILINE,X 2A24 856D STA LFROM+HI 2A26 A027 LDY #XSIZE ; CLEAR LINE [X] 2A28 A920 LDA #SPACE 2A2A 916C SPL1: STA (LFROM),Y 2A2C 88 DEY 2A2D 10FB BPL SPL1 2A2F CA DEX ; DONE ALL LINES? 2A30 D0EA BNE SPL0 ; LOOP TILL WINDOW CLEARED 2A32 8665 STX LINCNT ; RESET LINE COUNT TO ZERO 2A34 A917 SPCALC: LDA #YSIZE-1 ; CALCULATE # LINES TO SCROLL 2A36 38 SEC ; BEFORE "MORE" APPEARS: 2A37 E568 SBC SLINE ; LMAX = YSIZE-SLINE-1 2A39 8566 STA LMAX 2A3B C666 DEC LMAX 2A3D 60 SPLEX: RTS 2A3E ; -------------------- 2A3E ; DISABLE SPLIT SCREEN 2A3E ; -------------------- 2A3E 206A2A OFFSPL: JSR TOBOT 2A41 A201 SPLOFF: LDX #1 2A43 8668 STX SLINE ; SPLIT AT LINE 1 2A45 CA DEX ; = 0 2A46 8669 STX SPSTAT ; TURN OFF STATUS FLAG 2A48 8665 STX LINCNT ; RESET LINE COUNT 2A4A A915 LDA #21 2A4C 8566 STA LMAX ; SET MAXIMUM LINE SCROLL 2A4E A940 LDA #%01000000 2A50 8DE907 STA LINKEN ; DISABLE LINE LINKING 2A53 60 RTS 2A54 ; ------ 2A54 ; SCREEN AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 100 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2A54 ; ------ 2A54 ; GO TO TOP WINDOW IF [A] = 0 2A54 ; GO TO BOTTOM IF [A] = 1 2A54 ; IGNORE IF SPLIT NOT ENABLED OR [A] <> 0 OR 1 2A54 A569 ZSCRN: LDA SPSTAT ; IF SPLIT NOT ENABLED, 2A56 F0E5 BEQ SPLEX ; IGNORE REQUEST 2A58 A505 LDA ARG1+LO ; IF [ARG1] = 0, 2A5A 0506 ORA ARG1+HI 2A5C F00C BEQ TOBOT ; GO TO BOTTOM WINDOW 2A5E C901 CMP #1 ; IF [ARG1] <> 1, 2A60 D0DB BNE SPLEX ; IGNORE THE REQUEST 2A62 ; SET TO TOP WINDOW 2A62 A215 TOTOP: LDX #21 ; TEMPORARILY RESET 2A64 8666 STX LMAX ; [LMAX] TO KILL "MORE" 2A66 A201 LDX #1 ; Y-POS = 1 2A68 D005 BNE DOSCRN 2A6A ; SET TO BOTTOM WINDOW 2A6A 20342A TOBOT: JSR SPCALC ; RE-CALC [LMAX] 2A6D A217 LDX #23 ; Y-POS = 23 2A6F A000 DOSCRN: LDY #0 ; X-POS = 0 2A71 8465 STY LINCNT ; RESET LINE COUNT 2A73 18 CLC 2A74 4CF0FF JMP PLOT ; SET CURSOR TO X=[Y], Y=[X] 2A77 ; --------- 2A77 ; RAZZ USER 2A77 ; --------- 2A77 A900 BOOP: LDA #0 ; LSB BOOP FREQ 2A79 8D0EFF STA V1FLSB 2A7C A904 LDA #4 2A7E 8D12FF STA BITMAP ; MSB FREQ W/BIT 2 SET 2A81 A91F LDA #$1F 2A83 8D11FF STA VOLUME ; VOICE #1, FULL VOLUME 2A86 A9FC LDA #252 2A88 85A5 STA TIME 2A8A A5A5 BOOPL: LDA TIME ; WAIT 6 JIFFIES 2A8C D0FC BNE BOOPL 2A8E 8D11FF STA VOLUME ; SOUND OFF 2A91 60 RTS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 101 --- MACHINE-DEPENDENT I/O: CBM PLUS/4 --- 2A92 ; ------------------------ 2A92 ; CLEAR SCREEN & COLOR RAM 2A92 ; ------------------------ 2A92 A951 CLS: LDA #WHITE ; SET FOREGROUND COLOR 2A94 8D3B05 STA COLOR ; TO WHITE 2A97 A993 LDA #147 ; "CLEAR SCREEN" CHAR 2A99 20D2FF JSR CHROUT 2A9C A000 LDY #0 ; CURSOR TO (0,1) 2A9E A201 LDX #1 2AA0 18 CLC 2AA1 20F0FF JSR PLOT 2AA4 4C412A JMP SPLOFF ; DISABLE SPLIT SCREEN 2AA7 ; ------------------- 2AA7 ; LINE ADDRESS TABLES 2AA7 ; ------------------- 2AA7 00285078 LOLINE: DB $00,$28,$50,$78,$A0,$C8,$F0,$18 2AAF 406890B8 DB $40,$68,$90,$B8,$E0,$08,$30,$58 2AB7 80A8D0F8 DB $80,$A8,$D0,$F8,$20,$48,$70,$98 2ABF C0 DB $C0 2AC0 0C0C0C0C HILINE: DB $0C,$0C,$0C,$0C,$0C,$0C,$0C 2AC7 0D0D0D0D DB $0D,$0D,$0D,$0D,$0D,$0D 2ACD 0E0E0E0E DB $0E,$0E,$0E,$0E,$0E,$0E,$0E 2AD4 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F END INCLUD ZDOS.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 102 --- Z-DOS: CBM PLUS/4 --- 2AD9 ; --------------------- 2AD9 ; GET Z-BLOCK FROM DISK 2AD9 ; --------------------- 2AD9 ; ENTRY: Z-BLOCK # IN [BLOCK] 2AD9 ; TARGET PAGE IN [DBUFF+HI] 2AD9 D8 GETDSK: CLD 2ADA A908 LDA #8 2ADC 857A STA DRIVE ; GAME ALWAYS PLAYS FROM DRIVE #8 2ADE A570 LDA DBLOCK+LO 2AE0 857B STA DVD+LO 2AE2 A571 LDA DBLOCK+HI 2AE4 2901 AND #%00000001 ; FOR 128K VIRTUAL SYSTEM 2AE6 857C STA DVD+HI 2AE8 A900 LDA #0 2AEA 857E STA DSOR+HI ; CLEAR MSB 2AEC 857F STA DTEMP+LO ; AND [DTEMP] 2AEE 8580 STA DTEMP+HI 2AF0 A211 LDX #17 ; 17 SECTORS/TRACK 2AF2 867D STX DSOR+LO ; LSB OF DIVISOR 2AF4 CA DEX ; (= 16) INIT DIVIDE LOOP INDEX 2AF5 18 CLC 2AF6 267B DVLP: ROL DVD+LO 2AF8 267C ROL DVD+HI 2AFA 267F ROL DTEMP+LO 2AFC 2680 ROL DTEMP+HI 2AFE A57F LDA DTEMP+LO 2B00 38 SEC 2B01 E57D SBC DSOR+LO 2B03 A8 TAY 2B04 A580 LDA DTEMP+HI 2B06 E57E SBC DSOR+HI 2B08 9004 BCC DVLP1 2B0A 847F STY DTEMP+LO 2B0C 8580 STA DTEMP+HI 2B0E CA DVLP1: DEX 2B0F D0E5 BNE DVLP 2B11 267B ROL DVD+LO 2B13 267C ROL DVD+HI ; SHIFT LAST CARRY 2B15 A57F LDA DTEMP+LO ; REMAINDER IN [DTEMP] 2B17 8575 STA SECTOR ; IS SECTOR ID (0-16) AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 103 --- Z-DOS: CBM PLUS/4 --- 2B19 A57B LDA DVD+LO ; QUOTIENT IN [DVD] IS TRACK ID 2B1B 18 CLC 2B1C 6905 ADC #5 ; Z-CODE STARTS ON TRACK 5 2B1E C911 CMP #17 ; BELOW TRACK 17? 2B20 900F BCC DVLP2 ; YES, DONE 2B22 18 CLC 2B23 6901 ADC #1 ; ELSE SKIP OVER 17 2B25 C924 CMP #36 ; OUT OF RANGE? 2B27 B042 BCS TRKERR ; ERROR IF SO 2B29 C912 CMP #18 ; IS THIS TRACK 18? 2B2B D004 BNE DVLP2 ; NO, DONE 2B2D E675 INC SECTOR ; ELSE SKIP OVER 2B2F E675 INC SECTOR ; SECTORS 0 & 1 2B31 8574 DVLP2: STA TRACK ; LDA DBLOCK+LO ; GET LSB OF BLOCK ID ; AND #%00001111 ; MASK TO GET ; STA SECTOR ; SECTOR # (0-15) ; LDA DBLOCK+HI ; GET MSB OF BLOCK ID ; AND #%00001111 ; MASK OUT GARBAGE IN BITS 7-4 ; ASL A ; SHIFT THE LOW NIBBLE ; ASL A ; INTO THE HIGH NIBBLE ; ASL A ; ASL A ; STA TRACK ; AND SAVE IT HERE FOR A MOMENT ; LDA DBLOCK+LO ; GET LSB OF BLOCK ID AGAIN ; AND #%11110000 ; MASK OUT SECTOR # ; LSR A ; SHIFT THE HIGH NIBBLE ; LSR A ; INTO THE LOW NIBBLE ; LSR A ; LSR A ; ORA TRACK ; SUPERIMPOSE NEW HIGH NIBBLE ; CLC ; ADC #5 ; Z-CODE STARTS ON TRACK 5 ; CMP #17 ; BELOW TRACK 17? ; BCC TRAKOK ; USE AS-IS IF SO ; CLC ; ELSE SKIP OVER ; ADC #2 ; TRACKS 17 & 18 ; CMP #36 ; ANYTHING HIGHER THAN TRACK 35 ; BCS TRKERR ; IS AN ERROR ;TRAKOK:STA TRACK 2B33 ; ENTRY FOR "RESTORE" ([TRACK], [SECTOR] & [DRIVE] PRE-ASSIGNED) AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 104 --- Z-DOS: CBM PLUS/4 --- 2B33 18 GETRES: CLC ; CARRY CLEAR = "READ BLOCK" 2B34 208E2F JSR DISK ; GO DO IT! 2B37 B037 BCS DSKERR ; ERROR IF CARRY SET 2B39 A000 LDY #0 ; MOVE CONTENTS OF [IOBUFF] 2B3B B90010 GDKL: LDA IOBUFF,Y ; TO THE 2B3E 9172 STA (DBUFF),Y ; TARGET PAGE IN [DBUFF] 2B40 C8 INY 2B41 D0F8 BNE GDKL 2B43 E670 INC DBLOCK+LO ; POINT TO NEXT 2B45 D002 BNE GDEX ; Z-BLOCK 2B47 E671 INC DBLOCK+HI 2B49 4C5C2B GDEX: JMP NXTSEC ; POINT TO NEXT SECTOR & PAGE 2B4C ; -------------------- 2B4C ; PUT [DBLOCK] TO DISK 2B4C ; -------------------- 2B4C ; ENTRY: [TRACK], [SECTOR] & [DRIVE] ASSIGNED 2B4C ; PAGE TO WRITE IN [DBUFF] 2B4C A000 PUTDSK: LDY #0 ; MOVE PAGE AT [DBUFF] 2B4E B172 PTKL: LDA (DBUFF),Y ; INTO 2B50 990010 STA IOBUFF,Y ; [IOBUFF] FOR I/O 2B53 C8 INY 2B54 D0F8 BNE PTKL 2B56 38 SEC ; CARRY SET = "WRITE BLOCK" 2B57 208E2F JSR DISK 2B5A B00E BCS WRTERR ; CARRY SET IF ERROR 2B5C E675 NXTSEC: INC SECTOR ; POINT TO NEXT SECTOR 2B5E A575 LDA SECTOR 2B60 290F AND #%00001111 ; OVEFLOWED? 2B62 D002 BNE SECTOK ; CONTINUE IF NOT 2B64 E674 INC TRACK ; ELSE UPDATE TRACK # 2B66 8575 SECTOK: STA SECTOR ; AND SECTOR # 2B68 E673 INC DBUFF+HI ; POINT TO NEXT RAM PAGE 2B6A 60 WRTERR: RTS 2B6B ; *** ERROR #12: DISK ADDRESS OUT OF RANGE *** 2B6B A90C TRKERR: LDA #12 2B6D 4C9025 JMP ZERROR 2B70 ; *** ERROR #14: DRIVE ACCESS *** 2B70 A90E DSKERR: LDA #14 AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 105 --- Z-DOS: CBM PLUS/4 --- 2B72 4C9025 JMP ZERROR 2B75 ; ----------------------------- 2B75 ; SET UP SAVE & RESTORE SCREENS 2B75 ; ----------------------------- 2B75 203D26 SAVRES: JSR ZCRLF ; CLEAR THE BUFFER 2B78 20922A JSR CLS 2B7B A200 LDX #0 2B7D 8662 STX SCRIPT ; DISABLE SCRIPTING 2B7F A000 LDY #0 2B81 18 CLC 2B82 4CF0FF JMP PLOT ; HOME CURSOR & RETURN 2B85 ; ----------------- 2B85 ; DISPLAY A DEFAULT 2B85 ; ----------------- 2B85 ; ENTRY: DEFAULT (0-8) IN [A] 2B85 20284465 DEFAL: DB " (Default is " 2B92 2A293A DEFNUM: DB "*):" 0010 DEFALL EQU $-DEFAL 2B95 18 DODEF: CLC 2B96 6931 ADC #'1' ; CONVERT TO ASCII 1-9 2B98 8D922B STA DEFNUM ; INSERT IN STRING 2B9B A285 LDX #LOW DEFAL 2B9D A92B LDA #HIGH DEFAL 2B9F A010 LDY #DEFALL 2BA1 20A329 JSR DLINE ; PRINT THE STRING 2BA4 A900 LDA #0 2BA6 85EF STA NDX ; CLEAR KEY QUEUE 2BA8 60 RTS 2BA9 ; ----------------------------- 2BA9 ; GET SAVE & RESTORE PARAMETERS 2BA9 ; ----------------------------- 2BA9 0D POSIT: DB EOL 2BAA 506F7369 DB "Position 1-5" 000D POSITL EQU $-POSIT 2BB6 0D WDRIV: DB EOL 2BB7 44726976 DB "Drive 8 or 9" 000D WDRIVL EQU $-WDRIV 2BC3 0D MIND: DB EOL 2BC4 0D DB EOL AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 106 --- Z-DOS: CBM PLUS/4 --- 2BC5 506F7369 DB "Position " 2BCE 2A3B2044 MPOS: DB "*; Drive #" 2BD8 2A2E MDRI: DB "*." 2BDA 0D DB EOL 2BDB 41726520 DB "Are you sure? (Y or N):" 002F MINDL EQU $-MIND 2BF2 0D INSM: DB EOL 2BF3 496E7365 DB "Insert SAVE disk into Drive #" 2C10 2A2E SAVDRI: DB "*." 0020 INSML EQU $-INSM 2C12 594553 YES: DB 'YES' 2C15 0D DB EOL 0004 YESL EQU $-YES 2C16 4E4F NO: DB 'NO' 2C18 0D DB EOL 0003 NOL EQU $-NO 2C19 A951 PARAMS: LDA #WHITE 2C1B 8D3B05 STA COLOR ; WHITE TEXT 2C1E A2A9 LDX #LOW POSIT 2C20 A92B LDA #HIGH POSIT 2C22 A00D LDY #POSITL 2C24 20A329 JSR DLINE ; "POSITION (1-5)" 2C27 ; GET GAME POSITION 2C27 A576 CHANGE: LDA GPOSIT ; SHOW THE CURRENT 2C29 20952B JSR DODEF ; DEFAULT POSITION 2C2C 201428 GETPOS: JSR GETKEY ; WAIT FOR A KEY 2C2F C90D CMP #EOL ; IF [RETURN], 2C31 F00D BEQ POSSET ; USE DEFAULT 2C33 38 SEC 2C34 E931 SBC #'1' ; ELSE CONVERT ASCII TO BINARY 2C36 C905 CMP #5 ; IF BELOW "6" 2C38 9008 BCC SETPOS ; MAKE IT THE NEW DEFAULT 2C3A 20772A JSR BOOP ; ELSE RAZZ 2C3D 4C2C2C JMP GETPOS ; AND TRY AGAIN 2C40 A576 POSSET: LDA GPOSIT ; USE DEFAULT 2C42 8578 SETPOS: STA TPOSIT ; USE KEYPRESS 2C44 18 CLC 2C45 6931 ADC #'1' ; CONVERT TO ASCII "1"-"5" 2C47 8DCE2B STA MPOS ; STORE IN TEMP STRING 2C4A 8D982D STA SVPOS 2C4D 8D332E STA RSPOS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 107 --- Z-DOS: CBM PLUS/4 --- 2C50 20CB28 JSR LETTER ; AND DISPLAY IT 2C53 ; GET DRIVE ID 2C53 A2B6 LDX #LOW WDRIV 2C55 A92B LDA #HIGH WDRIV 2C57 A00D LDY #WDRIVL 2C59 20A329 JSR DLINE ; "DRIVE 8 OR 9" 2C5C A577 LDA GDRIVE ; SHOW DEFAULT 2C5E 18 CLC ; CONVERT 0 OR 1 2C5F 6907 ADC #7 ; TO 7 OR 8 2C61 20952B JSR DODEF ; SO DEFAULT WILL BE CORRECT 2C64 201428 GETDRV: JSR GETKEY ; GET A KEYPRESS 2C67 C90D CMP #EOL ; IF [RETURN], 2C69 F00D BEQ DRVSET ; USE DEFAULT 2C6B 38 SEC 2C6C E938 SBC #'8' ; CONVERT TO BINARY 0 OR 1 2C6E C902 CMP #2 ; IF WITHIN RANGE, 2C70 9008 BCC SETDRV ; SET NEW DEFAULT 2C72 20772A JSR BOOP 2C75 4C642C JMP GETDRV ; ELSE TRY AGAIN 2C78 A577 DRVSET: LDA GDRIVE ; USE DEFAULT 2C7A 8579 SETDRV: STA TDRIVE ; USE [A] 2C7C 18 CLC 2C7D 6938 ADC #'8' ; CONVERT TO ASCII 8 OR 9 2C7F 8D102C STA SAVDRI ; STORE IN DRIVE STRING 2C82 8DD82B STA MDRI ; AND IN TEMP STRING 2C85 20CB28 JSR LETTER ; AND SHOW NEW SETTING 2C88 A2C3 LDX #LOW MIND ; SHOW TEMPORARY SETTINGS 2C8A A92B LDA #HIGH MIND 2C8C A02F LDY #MINDL 2C8E 20A329 JSR DLINE 2C91 A900 GETYES: LDA #0 2C93 85EF STA NDX ; CLEAR KEY QUEUE 2C95 201428 JSR GETKEY 2C98 C959 CMP #'Y' ; IF REPLY IS "Y" 2C9A F01E BEQ ALLSET ; ACCEPT RESPONSES 2C9C C979 CMP #'y' 2C9E F01A BEQ ALLSET 2CA0 C94E CMP #'N' ; IF REPLY IS N, 2CA2 F00A BEQ RETRY ; DO A RETRY 2CA4 C96E CMP #'n' 2CA6 F006 BEQ RETRY AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 108 --- Z-DOS: CBM PLUS/4 --- 2CA8 20772A JSR BOOP ; INSIST ON Y/RETURN 2CAB 4C912C JMP GETYES ; OR N 2CAE A216 RETRY: LDX #LOW NO ; ELSE PRINT "NO" 2CB0 A92C LDA #HIGH NO 2CB2 A003 LDY #NOL 2CB4 20A329 JSR DLINE 2CB7 4C192C JMP PARAMS ; AND TRY AGAIN 2CBA A212 ALLSET: LDX #LOW YES ; PRINT "YES" 2CBC A92C LDA #HIGH YES 2CBE A004 LDY #YESL 2CC0 20A329 JSR DLINE 2CC3 A579 LDA TDRIVE ; MAKE THE TEMPORARY DRIVE 2CC5 8577 STA GDRIVE ; THE DEFAULT DRIVE 2CC7 A578 LDA TPOSIT ; AND THE TEMP POSITION 2CC9 8576 STA GPOSIT ; THE DEFAULT POSITION 2CCB ; CALC TRACK & SECTOR OF GAME POSITION 2CCB 0A ASL A ; * 2 2CCC 8574 STA TRACK ; SAVE HERE FOR A MOMENT 2CCE 0A ASL A ; * 4 2CCF 18 CLC 2CD0 6574 ADC TRACK ; * 6 (6 TRACKS PER POSITION) 2CD2 8574 STA TRACK 2CD4 E674 INC TRACK ; 1ST TRACK IS 1! 2CD6 A900 LDA #0 2CD8 8575 STA SECTOR ; ALWAYS START ON SECTOR #0 ; LDA FAST ; FAST-READ ENABLED? ; BEQ PRY ; NO, CONTINUE ; JSR FOFF ; ELSE DISENGAGE FAST-READ 2CDA A577 PRY: LDA GDRIVE ; TRY TO OPEN SPECIFIED DRIVE 2CDC 18 CLC 2CDD 6908 ADC #8 2CDF 20D72E JSR DOPEN ; THE DEFAULT DRIVE 2CE2 B00D BCS PARERR ; CARRY SET IF OPEN FAILED 2CE4 A2F2 LDX #LOW INSM 2CE6 A92B LDA #HIGH INSM 2CE8 A020 LDY #INSML 2CEA 20A329 JSR DLINE ; "INSERT SAVE DISK IN DRIVE X." 2CED 20F22C JSR RETURN ; "PRESS [RETURN] TO CONTINUE." 2CF0 18 CLC ; FOR SUCCESS 2CF1 60 PARERR: RTS 2CF2 ; --------------------- 2CF2 ; "PRESS RETURN" PROMPT AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 109 --- Z-DOS: CBM PLUS/4 --- 2CF2 ; --------------------- 2CF2 A20D RETURN: LDX #LOW RTN 2CF4 A92D LDA #HIGH RTN 2CF6 A01D LDY #RTNL 2CF8 20A329 JSR DLINE ; SHOW PROMPT 2CFB ; ENTRY FOR QUIT/RESTART 2CFB A900 GETRET: LDA #0 2CFD 85EF STA NDX ; CLEAR KEY QUEUE 2CFF 201428 JSR GETKEY ; WAIT FOR [RETURN] 2D02 C90D CMP #EOL 2D04 F006 BEQ RETEX 2D06 20772A JSR BOOP ; ACCEPT NO 2D09 4CFB2C JMP GETRET ; SUBSTITUTES! 2D0C 60 RETEX: RTS 2D0D 0D RTN: DB EOL 2D0E 50726573 DB "Press [RETURN] to continue." 2D29 0D DB EOL 001D RTNL EQU $-RTN 2D2A ; -------------------- 2D2A ; PROMPT FOR GAME DISK 2D2A ; -------------------- 2D2A 0D GAME: DB EOL 2D2B 496E7365 DB "Insert STORY disk into drive #8." 0021 GAMEL EQU $-GAME 2D4B A908 TOBOOT: LDA #8 2D4D 20D72E JSR DOPEN ; CLOSE OLD, OPEN BOOT DRIVE 2D50 A22A LDX #LOW GAME 2D52 A92D LDA #HIGH GAME 2D54 A021 LDY #GAMEL 2D56 20A329 JSR DLINE ; "INSERT STORY DISK IN DRIVE #8." 2D59 20F22C JSR RETURN ; "PRESS [RETURN] TO CONTINUE:" ; LDA FAST ; FAST-READ ENABLED? ; BEQ TBT0 ; NO, SCRAM ; JSR FINIT ; ELSE RE-INIT FAST CODE 2D5C A9FF TBT0: LDA #$FF ; RE-ENABLE 2D5E 8562 STA SCRIPT ; SCRIPTING 2D60 4C922A JMP CLS ; CLEAR SCREEN & RETURN 2D63 ; ------------------------- AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 110 --- Z-DOS: CBM PLUS/4 --- 2D63 ; SET UP PHONEY STATUS LINE 2D63 ; ------------------------- 2D63 ; ENTRY: TEXT SET UP FOR "DLINE" 2D63 20A329 SROOM: JSR DLINE 2D66 A227 LDX #39 ; INVERT & BLACKEN TOP LINE 2D68 BD000C SRLP: LDA SCREEN,X 2D6B 0980 ORA #%10000000 2D6D 9D000C STA SCREEN,X 2D70 A900 LDA #0 2D72 9D0008 STA COLRAM,X 2D75 CA DEX 2D76 10F0 BPL SRLP 2D78 60 RTS 2D79 ; --------- 2D79 ; SAVE GAME 2D79 ; --------- 2D79 53617665 SAV: DB "Save Position" 2D86 0D DB EOL 000E SAVL EQU $-SAV 2D87 0D SVING: DB EOL 2D88 53617669 DB "Saving position " 2D98 2A202E2E SVPOS: DB "* ..." 2D9D 0D DB EOL 0017 SVINGL EQU $-SVING 2D9E 20752B ZSAVE: JSR SAVRES ; SET UP SCREEN 2DA1 A279 LDX #LOW SAV 2DA3 A92D LDA #HIGH SAV 2DA5 A00E LDY #SAVL 2DA7 20632D JSR SROOM ; "SAVE POSITION" 2DAA 20192C JSR PARAMS ; GET PARAMETERS 2DAD 9006 BCC DOSAVE ; ERROR IF CARRY SET 2DAF 204B2D BADSAV: JSR TOBOOT ; GET BOOT DISK 2DB2 4C0619 JMP PREDF ; PREDICATE FAILS 2DB5 A287 DOSAVE: LDX #LOW SVING 2DB7 A92D LDA #HIGH SVING 2DB9 A017 LDY #SVINGL 2DBB 20A329 JSR DLINE ; "SAVING POSITION X ..." 2DBE ; SAVE GAME PARAMETERS IN [BUFSAV] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 111 --- Z-DOS: CBM PLUS/4 --- 2DBE AD0232 LDA ZBEGIN+ZID ; MOVE GAME ID 2DC1 8D9015 STA BUFSAV+0 ; INTO 1ST 2 BYTES 2DC4 AD0332 LDA ZBEGIN+ZID+1 ; OF THE AUX LINE BUFFER 2DC7 8D9115 STA BUFSAV+1 2DCA A517 LDA ZSP ; MOVE [ZSP] 2DCC 8D9215 STA BUFSAV+2 ; TO 3RD BYTE 2DCF A518 LDA OLDZSP ; MOVE [OLDZSP] 2DD1 8D9315 STA BUFSAV+3 ; TO 4TH 2DD4 A202 LDX #2 ; MOVE CONTENTS OF [ZPC] 2DD6 B519 ZPCSAV: LDA ZPC,X ; TO BYTES 5-7 2DD8 9D9415 STA BUFSAV+4,X ; OF [BUFSAV] 2DDB CA DEX 2DDC 10F8 BPL ZPCSAV 2DDE ; WRITE [LOCALS]/[BUFSAV] PAGE TO DISK 2DDE A915 LDA #HIGH LOCALS 2DE0 8573 STA DBUFF+HI ; POINT TO THE PAGE 2DE2 204C2B JSR PUTDSK ; AND WRITE IT OUT 2DE5 B0C8 BCS BADSAV ; CATCH WRITE ERROR HERE 2DE7 ; WRITE CONTENTS OF Z-STACK TO DISK 2DE7 A911 LDA #HIGH ZSTAKL ; POINT TO 1ST PAGE 2DE9 8573 STA DBUFF+HI 2DEB 204C2B JSR PUTDSK ; WRITE 1ST AND 2DEE B0BF BCS BADSAV 2DF0 204C2B JSR PUTDSK ; 2ND PAGE OF Z-STACK 2DF3 B0BA BCS BADSAV 2DF5 ; WRITE ENTIRE GAME PRELOAD TO DISK 2DF5 A526 LDA ZCODE ; POINT TO 1ST PAGE 2DF7 8573 STA DBUFF+HI ; OF PRELOAD 2DF9 AE0E32 LDX ZBEGIN+ZPURBT ; GET # IMPURE PAGES 2DFC E8 INX ; USE FOR INDEXING 2DFD 8611 STX I+LO 2DFF 204C2B LSAVE: JSR PUTDSK 2E02 B0AB BCS BADSAV 2E04 C611 DEC I+LO 2E06 D0F7 BNE LSAVE 2E08 204B2D JSR TOBOOT ; PROMPT FOR GAME DISK 2E0B 4C1219 JMP PREDS ; ELSE PREDICATE SUCCEEDS 2E0E ; ------------ 2E0E ; RESTORE GAME AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 112 --- Z-DOS: CBM PLUS/4 --- 2E0E ; ------------ 2E0E 52657374 RES: DB "Restore Position" 2E1E 0D DB EOL 0011 RESL EQU $-RES 2E1F 0D RSING: DB EOL 2E20 52657374 DB "Restoring position " 2E33 2A202E2E RSPOS: DB "* ..." 2E38 0D DB EOL 001A RSINGL EQU $-RSING 2E39 20752B ZREST: JSR SAVRES 2E3C A20E LDX #LOW RES 2E3E A92E LDA #HIGH RES 2E40 A011 LDY #RESL 2E42 20632D JSR SROOM ; "RESTORE POSITION" 2E45 20192C JSR PARAMS ; GET PARAMETERS 2E48 B036 BCS BADRES ; ERROR IF CARRY SET 2E4A A21F LDX #LOW RSING 2E4C A92E LDA #HIGH RSING 2E4E A01A LDY #RSINGL 2E50 20A329 JSR DLINE ; "RESTORING POSITION X ..." 2E53 ; SAVE LOCALS IN CASE OF ERROR 2E53 A21F LDX #31 2E55 BD0015 LOCSAV: LDA LOCALS,X ; COPY ALL LOCALS 2E58 9D0001 STA $0100,X ; TO BOTTOM OF MACHINE STACK 2E5B CA DEX 2E5C 10F7 BPL LOCSAV 2E5E A915 LDA #HIGH LOCALS 2E60 8573 STA DBUFF+HI 2E62 20332B JSR GETRES ; RETRIEVE 1ST BLOCK OF PRELOAD 2E65 AD9015 LDA BUFSAV+0 ; DOES 1ST BYTE OF SAVED GAME ID 2E68 CD0232 CMP ZBEGIN+ZID ; MATCH THE CURRENT ID? 2E6B D008 BNE WRONG ; WRONG DISK IF NOT 2E6D AD9115 LDA BUFSAV+1 ; WHAT ABOUT THE 2ND BYTE? 2E70 CD0332 CMP ZBEGIN+ZID+1 2E73 F011 BEQ RIGHT ; CONTINUE IF BOTH BYTES MATCH 2E75 ; HANDLE INCORRECT SAVE DISK 2E75 A21F WRONG: LDX #31 ; RESTORE ALL SAVED LOCALS 2E77 BD0001 WR0: LDA $0100,X AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 113 --- Z-DOS: CBM PLUS/4 --- 2E7A 9D0015 STA LOCALS,X 2E7D CA DEX 2E7E 10F7 BPL WR0 2E80 204B2D BADRES: JSR TOBOOT ; PROMPT FOR GAME DISK 2E83 4C0619 JMP PREDF ; PREDICATE FAILS 2E86 ; CONTINUE RESTORE 2E86 AD1032 RIGHT: LDA ZBEGIN+ZSCRIP ; SAVE BOTH FLAG BYTES 2E89 8511 STA I+LO 2E8B AD1132 LDA ZBEGIN+ZSCRIP+1 2E8E 8512 STA I+HI 2E90 A911 LDA #HIGH ZSTAKL ; RETRIEVE OLD CONTENTS OF 2E92 8573 STA DBUFF+HI ; Z-STACK 2E94 20332B JSR GETRES ; GET 1ST BLOCK OF Z-STACK 2E97 20332B JSR GETRES ; AND 2ND BLOCK 2E9A A526 LDA ZCODE 2E9C 8573 STA DBUFF+HI 2E9E 20332B JSR GETRES ; GET 1ST BLOCK OF PRELOAD 2EA1 A511 LDA I+LO ; RESTORE THE STATE 2EA3 8D1032 STA ZBEGIN+ZSCRIP ; OF THE FLAG WORD 2EA6 A512 LDA I+HI 2EA8 8D1132 STA ZBEGIN+ZSCRIP+1 2EAB AD0E32 LDA ZBEGIN+ZPURBT ; GET # PAGES TO LOAD 2EAE 8511 STA I+LO 2EB0 20332B LREST: JSR GETRES ; FETCH THE REMAINDER 2EB3 C611 DEC I+LO ; OF THE PRELOAD 2EB5 D0F9 BNE LREST 2EB7 ; RESTORE THE STATE OF THE SAVED GAME 2EB7 AD9215 LDA BUFSAV+2 ; RESTORE THE [ZSP] 2EBA 8517 STA ZSP 2EBC AD9315 LDA BUFSAV+3 ; AND THE [OLDZSP] 2EBF 8518 STA OLDZSP 2EC1 A202 LDX #2 ; RESTORE THE [ZPC] 2EC3 BD9415 RESZPC: LDA BUFSAV+4,X 2EC6 9519 STA ZPC,X 2EC8 CA DEX 2EC9 10F8 BPL RESZPC 2ECB A900 LDA #FALSE 2ECD 851C STA ZPCFLG ; INVALIDATE [ZPC] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 114 --- Z-DOS: CBM PLUS/4 --- 2ECF 204B2D JSR TOBOOT ; PROMPT FOR GAME DISK 2ED2 4C1219 JMP PREDS ; PREDICATE SUCCEEDS END INCLUD DISK.ASM AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 115 --- DISK ACCESS CODE: CBM PLUS/4 --- 2ED5 ; -------------- 2ED5 ; OPEN DRIVE [A] 2ED5 ; -------------- 2ED5 ; ENTRY: DISK ID (8 OR 9 BINARY) IN [A] 2ED5 4930 I0: DB "I0" 0002 I0L EQU $-I0 2ED7 857A DOPEN: STA DRIVE ; SAVE DRIVE ID HERE 2ED9 20082F JSR DCLOSE ; CLOSE COMMAND & DATA CHANNELS 2EDC A90F LDA #15 ; LOGICAL FILE # 2EDE A8 TAY ; SECONDARY ADDRESS 2EDF A67A LDX DRIVE ; DEVICE # (8 OR 9) 2EE1 20BAFF JSR SETLFS ; SET UP LOGICAL FILE 2EE4 A2D5 LDX #LOW I0 ; POINT TO FILENAME 2EE6 A02E LDY #HIGH I0 ; "I0:" 2EE8 A902 LDA #I0L ; LENGTH OF FILENAME 2EEA 20BDFF JSR SETNAM 2EED 4CC0FF JMP OPEN ; OPEN THE DISK (CARRY CLEAR IF OK) 2EF0 ; -------------------------- 2EF0 ; OPEN DIRECT ACCESS CHANNEL 2EF0 ; -------------------------- 2EF0 23 POUND: DB "#" 0001 POUNDL EQU $-POUND 2EF1 200D2F AOPEN: JSR ACLOSE 2EF4 A902 LDA #2 ; D/A CHANNEL ID 2EF6 A8 TAY ; SECONDARY ID 2EF7 A67A LDX DRIVE 2EF9 20BAFF JSR SETLFS 2EFC A2F0 LDX #LOW POUND ; POINT TO FILENAME 2EFE A02E LDY #HIGH POUND ; "#" 2F00 A901 LDA #POUNDL 2F02 20BDFF JSR SETNAM 2F05 4CC0FF JMP OPEN ; OPEN CHANNEL (CARRY CLEAR IF OK) 2F08 ; ------------------- 2F08 ; CLOSE CURRENT DRIVE 2F08 ; ------------------- 2F08 A90F DCLOSE: LDA #15 ; CLOSE COMMAND CHANNEL AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 116 --- DISK ACCESS CODE: CBM PLUS/4 --- 2F0A 20C3FF JSR CLOSE 2F0D ; FALL THROUGH ... 2F0D ; --------------------- 2F0D ; CLOSE THE D/A CHANNEL 2F0D ; --------------------- 2F0D A902 ACLOSE: LDA #2 ; AND THE 2F0F 4CC3FF JMP CLOSE ; DATA CHANNEL 2F12 ; ---------------- 2F12 ; DIVIDE [A] BY 10 2F12 ; ---------------- 2F12 ; EXIT: QUOTIENT IN [X], REMAINDER IN [A] 2F12 A200 DIV10: LDX #0 ; START WITH ZERO QUOTIENT 2F14 C90A D10L: CMP #10 ; IF DIVISOR < 10, 2F16 9005 BCC D10EX ; WE'RE DONE 2F18 E90A SBC #10 ; ELSE SUBTRACT ANOTHER 10 2F1A E8 INX ; UPDATE QUOTIENT 2F1B D0F7 BNE D10L ; BRANCH ALWAYS 2F1D 60 D10EX: RTS 2F1E ; --------------- 2F1E ; SEND Ux COMMAND 2F1E ; --------------- 2F1E ; ENTRY: ASCII "1" OR "2" IN [A] 2F1E 55 COMLIN: DB "U" 2F1F 2A DCOMM: DB "*" 2F20 3A322C30 DB ":2,0," 2F25 2A2A2A2C DTRAK: DB "***," 2F29 2A2A2A DSECT: DB "***" 2F2C 0D DB EOL 000F CMLL EQU $-COMLIN 2F2D 8D1F2F SENDU: STA DCOMM ; INSERT COMMAND ("1" OR "2") IN STRING 2F30 ; CONVERT [TRACK] AND [SECTOR] TO ASCII IN [COMLIN] 2F30 A574 LDA TRACK 2F32 A002 LDY #2 2F34 20122F TCON: JSR DIV10 ; DIVIDE BY 10 2F37 0930 ORA #'0' ; CONVERT TO ASCII 2F39 99252F STA DTRAK,Y ; STORE INTO STRING 2F3C 8A TXA ; GET QUOTIENT INTO [A] AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 117 --- DISK ACCESS CODE: CBM PLUS/4 --- 2F3D 88 DEY ; ZERO-FILL USUSED BYTES 2F3E 10F4 BPL TCON 2F40 A575 LDA SECTOR ; SAME FOR SECTOR ID 2F42 A002 LDY #2 2F44 20122F SCON: JSR DIV10 2F47 0930 ORA #'0' 2F49 99292F STA DSECT,Y 2F4C 8A TXA 2F4D 88 DEY 2F4E 10F4 BPL SCON 2F50 ; SEND COMMAND 2F50 20CCFF JSR CLRCHN 2F53 A20F LDX #15 ; OUTPUT TO THE 2F55 20C9FF JSR CHKOUT ; COMMAND CHANNEL 2F58 B010 BCS UEX ; EXIT W/CARRY SET IF ERROR 2F5A A000 LDY #0 2F5C B91E2F SCM0: LDA COMLIN,Y ; SEND THE COMMAND LINE 2F5F 20D2FF JSR CHROUT ; TO THE DRIVE CHANNEL 2F62 B006 BCS UEX 2F64 C8 INY ; A BYTE AT A TIME 2F65 C00F CPY #CMLL 2F67 90F3 BCC SCM0 2F69 18 CLC ; NO ERRORS! 2F6A 60 UEX: RTS 2F6B ; ---------------------- 2F6B ; SET THE BUFFER POINTER 2F6B ; ---------------------- 2F6B 422D503A BPLINE: DB "B-P:2,0" 2F72 0D DB EOL 0008 BPLL EQU $-BPLINE 2F73 20CCFF SETBP: JSR CLRCHN 2F76 A20F LDX #15 ; OUTPUT TO 2F78 20C9FF JSR CHKOUT ; COMMAND CHANNEL 2F7B B010 BCS BEX 2F7D A000 LDY #0 2F7F B96B2F SBPL: LDA BPLINE,Y 2F82 20D2FF JSR CHROUT 2F85 B006 BCS BEX 2F87 C8 INY 2F88 C008 CPY #BPLL 2F8A 90F3 BCC SBPL 2F8C 18 CLC ; NO ERRORS! 2F8D 60 BEX: RTS AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 118 --- DISK ACCESS CODE: CBM PLUS/4 --- 2F8E ; ------------------------------ 2F8E ; READ/WRITE A BLOCK TO [IOBUFF] 2F8E ; ------------------------------ 2F8E ; ENTRY: [TRACK] = TRACK # (1-35) 2F8E ; [SECTOR] = SECTOR # (0-15) 2F8E ; [DRIVE] = DRIVE ID (8 OR 9) 2F8E ; CARRY CLEAR TO READ, CARRY SET TO WRITE 2F8E B02A DISK: BCS DWRITE ; WRITE IF CARRY SET 2F90 ; READ A DISK BLOCK ; LDA FASTEN ; FAST-READ AVAILABLE? ; BEQ SLOW ; USE SLOW CODE IF NOT ; LDA FAST ; FAST-READ ENGAGED? ; BEQ SLOW ; NO, USE SLOW ; JMP DOFAST ; ELSE USE FAST-READ ROUTINES 2F90 20F12E SLOW: JSR AOPEN ; OPEN THE ACCESS CHANNEL 2F93 B059 BCS BADISK ; CARRY SET IF ERROR 2F95 A931 LDA #'1' ; SEND A "U1" COMMAND 2F97 202D2F JSR SENDU 2F9A B052 BCS BADISK 2F9C 20732F JSR SETBP ; SET THE BUFFER POINTER 2F9F B04D BCS BADISK 2FA1 20CCFF JSR CLRCHN 2FA4 A202 LDX #2 ; INPUT FROM 2FA6 20C6FF JSR CHKIN ; DATA CHANNEL 2FA9 B043 BCS BADISK 2FAB A000 LDY #0 2FAD 20CFFF READ1: JSR CHRIN ; GET A BYTE 2FB0 B03C BCS BADISK 2FB2 990010 STA IOBUFF,Y ; MOVE TO I/O BUFFER 2FB5 C8 INY 2FB6 D0F5 BNE READ1 ; DO 256 BYTES 2FB8 F028 BEQ SHUTD ; THEN EXIT 2FBA ; WRITE A BLOCK 2FBA 20F12E DWRITE: JSR AOPEN ; OPEN THE ACCESS CHANNEL 2FBD B02F BCS BADISK ; CARRY SET IF ERROR 2FBF 20732F JSR SETBP ; SET THE BUFFER POINTER AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. --- MACHINE DEPENDENT I/O PAGE 119 --- DISK ACCESS CODE: CBM PLUS/4 --- 2FC2 B02A BCS BADISK 2FC4 20CCFF JSR CLRCHN 2FC7 A202 LDX #2 ; OUTPUT TO 2FC9 20C9FF JSR CHKOUT ; DATA CHANNEL 2FCC B020 BCS BADISK 2FCE A000 LDY #0 2FD0 B90010 WRITE1: LDA IOBUFF,Y ; SEND CONTENTS OF [IOBUFF] 2FD3 20D2FF JSR CHROUT ; TO THE DRIVE 2FD6 B016 BCS BADISK 2FD8 C8 INY 2FD9 D0F5 BNE WRITE1 ; WRITE 256 BYTES 2FDB A932 LDA #'2' ; ISSUE A "U2" COMMAND 2FDD 202D2F JSR SENDU 2FE0 B00C BCS BADISK ; EXIT W/CARRY SET IF ERROR 2FE2 20B7FF SHUTD: JSR READST ; READ STATUS BYTE 2FE5 2983 AND #%10000011 ; MASK UNINTERESTING BITS 2FE7 D005 BNE BADISK ; ERROR IF ANY BIT SET 2FE9 20CCFF JSR CLRCHN ; RESET CHANNELS 2FEC 18 CLC ; CLEAR CARRY FOR SUCCESS 2FED 60 RTS 2FEE 20CCFF BADISK: JSR CLRCHN 2FF1 38 SEC ; SET CARRY FOR FAILURE 2FF2 60 RTS END 2FF3 IF DEBUG 2FF3 INCLUD BUGGER.ASM 2FF3 ENDIF 0000 END AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. PAGE 120 ---- SYMBOL TABLE ---- A12VAL 1999 CHRIN FFCF DEFALL 0010 EARLY 2293 GETKEY 2814 A2VAL 1C27 CHROUT FFD2 DEFNUM 2B92 ECON 2592 GETLNG 1852 ABQUOT 1E4D CHRTBL 24CA DGC 1FD8 EFIND 20F9 GETP1 1D2C ABREM 1E3F CLALL FFE7 DIGCNT 1FD4 ENDLIN 2980 GETP2 1D3B ABSDIV 1E24 CLOCK 26BC DIGITS 005E ENTRY 0047 GETP3 1D4E ABYTE 000D CLOCKL 0006 DIRECT 231B ENUMB 258D GETPB 1D5E ACLOSE 2F0D CLOSE FFC3 DISK 2F8E EOL 000D GETPOS 2C2C ADEX 000E CLRCHN FFCC DISKE 228E EOS 25C0 GETPT1 1D74 ALLSET 2CBA CLS 2A92 DIV10 2F12 EOSL 000E GETPT2 1D83 AOPEN 2EF1 CMLL 000F DIVERR 1E8C EQBAD 1ECB GETPT3 1D89 ARG1 0005 CNL 247D DIVEX 1E4C EQOK 1EC8 GETPW 1D64 ARG2 0007 CNOK 2486 DIVIDE 1E0F ERRM 257E GETRES 2B33 ARG3 0009 COLD 1600 DLINE 29A3 ERRML 0012 GETRET 2CFB ARG4 000B COLD0 1605 DLS0 1C06 ESIZE 004B GETSET 23A1 BACKSP 0014 COLD1 161A DOB2 1933 ETPEX 1D6A GETSHT 184E BACKUP 2976 COLD2 162E DOCALL 1ED7 FADDR 0022 GETV 1855 BADISK 2FEE COLOR 053B DODEF 2B95 FALSE 0000 GETVAR 1866 BADKEY 2898 COLRAM 0800 DODIS 17B1 FAST 0002 GETVR1 186B BADOP1 1801 COLUMN 00D9 DOEQ 1EA4 FASTEN 00E2 GETVRG 187F BADOP2 183E COMLIN 2F1E DOFREQ 234B FBRK 2144 GETVRL 186F BADRES 2E80 COMPAR 1C2F DOGET 1D02 FDATA 00E1 GETWRD 22BC BADSAV 2DAF CONCNT 0053 DOM0 27AE FINDEX 00E0 GETYES 2C91 BADVER 1ABE CONIN 0054 DOMINS 27A3 FINDW 2146 GETZ1 23C8 BCALC 1D15 CONOUT 0055 DOPEN 2ED7 FIRST1 1ADA GETZ2 23E3 BEX 2F8D CONTOP 2407 DOPM 27C5 FKEY 0076 GETZ3 23EF BGCOL0 FF15 CONZST 23F5 DORET 1D9B FL0 2615 GETZCH 23AD BGCOL1 FF16 COUT 25FF DOSAVE 2DB5 FL1 261F GKEY0 2818 BGCOL2 FF17 CR1 2686 DOSCRL 2901 FL2 262A GKEY1 283F BGCOL3 FF18 CROW 00DC DOSCRN 2A6F FL3 2634 GLOBAL 002F BITMAP FF12 CSET0 243C DOSIB 20BB FLAGSU 2540 GO 17C3 BLANK 232D CSET2 244E DOTIME 2754 FLEX 211C GODIV 1E31 BLINK 00DE CSHAPE 00D8 DOUT 29AB FLS0 2559 GPOSIT 0076 BLINKA 053C CSHIP 2441 DOXM 27C7 FLS1 255A GS 23A8 BLINRT FF1F CTABLE 247B DOXOP 17A2 FLS2 2572 GTBT0 21F8 BMRLSB FF1B CTEST 242C DRIVE 007A FLSL 256B GTBT1 21FF BMRMSB FF1A CURSH FF0C DRVSET 2C78 FLUSH 2613 GTBT2 2208 BOOP 2A77 CURSL FF0D DSECT 2F29 FLUSHW 2107 GTBT3 221A BOOPL 2A8A CURSOR 0064 DSKERR 2B70 FREEZE 25BD GTEXIT 23F1 BORDER FF19 CYCLE 00E0 DSOR 007D FUNCT FF49 GTZ0 23B3 BPLINE 2F6B CZSL 23F8 DT0 2778 FWL1 216C GVCALC 18F0 BPLL 0008 D10EX 2F1D DT1 277E FWORDS 0033 HI 0001 BREAK 211D D10L 2F14 DTEMP 007F FWSUCC 21A8 HILINE 2AC0 BRKTBL 212E DBLOCK 0070 DTRAK 2F25 GAME 2D2A HSCAN FF1E BUFSAV 1590 DBUFF 0072 DVD 007B GAMEL 0021 HSCROL FF07 CEX 2612 DC0 174B DVLP 2AF6 GDEX 2B49 I 0011 CHANGE 2C27 DC1 1752 DVLP1 2B0E GDKL 2B3B I0 2ED5 CHAR 28E1 DCLOSE 2F08 DVLP2 2B31 GDRIVE 0077 I0L 0002 CHBASE FF13 DCOMM 2F1F DVX 1991 GETBYT 21E6 IMASK FF0A CHKEOL 28F3 DEBUG 0000 DWRITE 2FBA GETDRV 2C64 IN 0037 CHKIN FFC6 DECVAL 1986 EAR0 229B GETDSK 2AD9 INCVAL 1992 CHKOUT FFC9 DEFAL 2B85 EAR1 22A5 GETIN FFE4 INLOOP 294F AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. PAGE 121 ---- SYMBOL TABLE ---- INPUT 2946 MPCL 001F OP2A 1810 PP1 29E1 RASTER FF0B INSM 2BF2 MPCM 0020 OP2B 1813 PP2 29EA READ1 2FAD INSML 0020 MPCPNT 0023 OP2C 1822 PP3 29F9 READL 2059 INTREG FF09 MPOS 2BCE OP2D 1825 PP4 29FF READL2 20A1 IOBUFF 1000 MSTART 1000 OP2EX 182F PP5 2A03 READL3 20C3 IOCHAR 0067 MTEMP 005A OPCODE 0003 PPERR 29DB READST FFB7 IVX 1998 MWAIT 2667 OPEN FFC0 PPRINT 29B6 REMAIN 0058 J 0013 NARGS 0004 OPEXT 1759 PPX 253A REMVC1 1B5C K 0015 NBL 2124 OPT0 19A2 PREDB 1917 REMVC2 1B6D KEYLAT FF08 NBRKS 0006 OPT1 19BE PREDB1 193A REMVEX 1B76 LBUFF 1530 NDX 00EF OPT2 19DE PREDB2 1945 RES 2E0E LDPRE 1723 NENTS 0049 OPTX 1A10 PREDB3 194C RESL 0011 LENGTH 0060 NEWSET 2331 OPX0 1764 PREDB5 196A RESULT 0044 LET0 28D4 NEXTPC 21B0 OPX1 176A PREDF 1906 RESZPC 2EC3 LETEX 28DE NEXTZ 2415 OPX2 1774 PREDLB 1927 RET0 18C2 LETTER 28CB NO 2C16 OPX3 177E PREDNB 190B RET1 1BA5 LEX1 298B NOBLIN 2861 OPX4 1799 PREDS 1912 RET2 1BB9 LEX2 2998 NOL 0003 OPXNXT 1785 PRIL 1A4C RETEX 2D0C LFROM 006C NOMORE 2965 OUT 003D PRLEN 006B RETRY 2CAE LINCNT 0065 NOPS0 000E OUTEOL 2940 PRNTDC 1B79 RETURN 2CF2 LINEX 26A4 NOPS1 0010 OVER 18B4 PRNTN3 1FF0 RFLIP 1E3B LINKEN 07E9 NOPS2 0019 PAGE 221C PRNTN4 1FF9 RIGHT 2E86 LINLEN 0045 NOPSX 000C PAGE0 0028 PROPB 250D RL1 2069 LINOUT 268F NORAM 16D6 PARAMS 2C19 PROPL 252E RL2 2070 LMAX 0066 NORM 2122 PARERR 2CF1 PROPN 2529 RL3 2079 LO 0000 NOSCRL 2936 PATCH 21F1 PROPNX 2536 RLEX 206F LOCALS 1500 NPC0 21C2 PBAD 1C59 PRY 2CDA RLL 207F LOCSAV 2E55 NPC1 21C9 PCALC 1F77 PSET 004C ROMIN FF3E LOLINE 2AA7 NPC2 21D2 PDC0 1B8E PSHVAL 18A2 ROMOUT FF3F LOUT 2697 NPC3 21E4 PEX 2A08 PSTAT 006A RSIGN 005D LREST 2EB0 NUMBER 1FC8 PFINE 1AE3 PTABH 13A0 RSING 2E1F LRU 0025 NXTP1 1DA5 PG1 2224 PTABL 1300 RSINGL 001A LRUMAP 1450 NXTP2 1DB4 PG2 2231 PTKL 2B4E RSPOS 2E33 LSAVE 2DFF NXTP3 1DB7 PG3 2238 PTZ0 1B04 RTN 2D0D LTO 006E NXTSEC 2B5C PG4 225A PUSHXA 18A6 RTNL 001D MASK 286E OBJ1 24FA PG5 226C PUTBYT 18C4 SAV 2D79 MASK0 2884 OBJ2 2501 PG6 2277 PUTDSK 2B4C SAVDRI 2C10 MASK1 288C OBJLOC 24E4 PG7 2283 PUTLSB 1F6D SAVL 000E MCLR 26AF OBJTAB 0035 PG8 2288 PUTP1 1F8D SAVRES 2B75 MDRI 2BD8 OFFSET 004F PGOOD 1C6C PUTP2 1F9C SAY1 2496 MEMTOP 25F5 OFFSPL 2A3E PLERR 1FB6 PUTP3 1FAC SAY2 24A1 MIND 2BC3 OLDLEN 0061 PLOT FFF0 PUTVAL 18CA SAYSET 248B MINDL 002F OLDX 0063 PMAX 0029 PUTVLG 18E3 SBASE FF14 MINIT 1E91 OLDY 0064 PNERR 1FB1 PUTVLL 18D3 SBL 213B MLOOP 173C OLDZSP 0018 POPVAL 188C PUTVR1 18CF SBPL 2F7F MORE 26A9 OP0 17C8 POSIT 2BA9 PYUCK 1AC7 SCEX 1C4B MOREL 0006 OP1 17D7 POSITL 000D PZSTR 22D9 SCM0 2F5C MOVMIN 2789 OP1A 17E1 POSSET 2C40 PZTOP 22E2 SCMP 1C41 MPC 001F OP1B 17EB POUND 2EF0 QSIGN 005C SCOMP 1C36 MPCFLG 0022 OP1EX 17F2 POUNDL 0001 QUOT 0056 SCON 2F44 MPCH 0021 OP2 1806 PP0 29C7 RANDOM 25F8 SCORE 26B5 AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C ZIP/6502 INFOCOM, INC. PAGE 122 ---- SYMBOL TABLE ---- SCOREL 0007 STRING 29AC VERSL 0015 ZENDLD 0004 ZPRC 1FBB SCREEN 0C00 SVING 2D87 VEXIT 1BF6 ZEQUAL 1E9B ZPRD 1B77 SCRIPT 0062 SVINGL 0017 VLINEH FF1C ZEROPG 0003 ZPRI 1A37 SECTOK 2B66 SVPOS 2D98 VLINEL FF1D ZERROR 2590 ZPRINT 1BD7 SECTOR 0075 SWAP 002E VOCAB 0031 ZFCLR 1CAE ZPRN 1FC0 SENDU 2F2D T1LSB FF00 VOLUME FF11 ZFIRST 1AD3 ZPRR 1A54 SET1 2305 T1MSB FF01 VSCROL FF06 ZFLAG 0050 ZPTSIZ 1AF2 SET2 230D T2LSB FF02 VSUM 1A8A ZFSET 1C9B ZPURBT 000E SETA0 16E1 T2MSB FF03 VSUM0 1A96 ZFSETP 1C87 ZPURE 0027 SETBP 2F73 T3LSB FF04 WARM1 1671 ZFWORD 0018 ZPUSH 2027 SETDRV 2C7A T3MSB FF05 WARM2 1691 ZGET 1CFC ZPUT 1F61 SETLFS FFBA TARGET 002B WARMEX 172F ZGETB 1D0C ZPUTB 1F72 SETMSG FF90 TBT0 2D5C WCALC 1D11 ZGETP 1D29 ZPUTP 1F8A SETNAM FFBD TCON 2F34 WCEX 1905 ZGETPT 1D71 ZQUIT 25B1 SETNP 16DB TDRIVE 0079 WDRIV 2BB6 ZGLOBA 000C ZRAND 2005 SETPOS 2C42 TED FF00 WDRIVL 000D ZGO 0006 ZREAD 2036 SETSTR 22C7 TICK 289E WHITE 0051 ZGRTR 1C11 ZREMOV 1B35 SETWRD 22AD TICK0 28BB WNEXT 2189 ZID 0002 ZREST 2E39 SHAP0 285B TIME 00A5 WNX 2194 ZIGRTR 1C1C ZRET 1B94 SHAP1 285D TIMEFL 005F WNX1 219F ZIN 1C4C ZRFALS 1A33 SHFLAG 0543 TOASC 22FC WR0 2E77 ZINC 1B0F ZRSTAK 1A5D SHOVE 22FF TOBOOT 2D4B WRDLEN 0046 ZIP 1600 ZRT0 1A2A SHOWIT 295E TOBOT 2A6A WRITE1 2FD0 ZJUMP 1BD1 ZRT1 1A2C SHUTD 2FE2 TOPERM 233F WRONG 2E75 ZLENTH 001A ZRTRUE 1A28 SIB 2134 TOTOP 2A62 WRTERR 2B6A ZLESS 1BFD ZSAVE 2D9E SLINE 0068 TPOSIT 0078 XSIZE 0027 ZLOC 1AE6 ZSCRIP 0010 SLOAD 1658 TRACK 0074 YES 2C12 ZMLOOP 1DDA ZSCRN 2A54 SLOADL 0019 TRKERR 2B6B YESL 0004 ZMNEXT 1DF1 ZSERIA 0012 SLOW 2F90 TRUE 00FF YSIZE 0018 ZMOD 1E05 ZSET 1CC5 SOURCE 0043 TRY2 1EB0 ZADD 1DBD ZMODE 0001 ZSP 0017 SPACE 0020 TRY3 1EBC ZBAND 1C7B ZMOVE 1CD2 ZSPLIT 2A0B SPCALC 2A34 TSET 004D ZBCOM 1BED ZMUL 1DD7 ZSTAKH 1200 SPL0 2A1C UDIV 1E5B ZBEGIN 3200 ZMVEX 1CFB ZSTAKL 1100 SPL1 2A2A UDLOOP 1E64 ZBOR 1C6F ZNEXT 1ACA ZSTART 25CE SPLEX 2A3D UDNEXT 1E7C ZBTST 1C5C ZNEXTP 1D9E ZSTEX 22D8 SPLOFF 2A41 UEX 2F6A ZCALL 1ECE ZNOOP 1985 ZSUB 1DCA SPSTAT 0069 UNDER 189D ZCALL1 1F05 ZOBJEC 000A ZUSL 26C2 SRL0 2908 USL0 26EA ZCALL2 1F2C ZPAGE 002A ZVALUE 1BE5 SRL1 2923 USLX 27DD ZCALL3 1F56 ZPC 0019 ZVER 1A63 SRL2 292C V1FLSB FF0E ZCHAR 004E ZPCFLG 001C ZVERS 0000 SRL3 2930 V2A1 1843 ZCHKSM 001C ZPCH 001B ZVOCAB 0008 SRLP 2D68 V2FLSB FF0F ZCODE 0026 ZPCL 0019 ZVR 1A6A SROOM 2D63 V2FMSB FF10 ZCRLF 263D ZPCM 001A ZWORD 0051 SROW 00DA VALUE 000F ZCRUSH 24A4 ZPCPNT 001D ZZERO 1AC1 ST0 1695 VARGET 185D ZD0 1B22 ZPCSAV 2DD6 ST1 169E VARPUT 18B9 ZDEC 1B1A ZPGTOP 007F STAMP 002D VERNUM 25E9 ZDIV 1DFB ZPOP 202E STATEX 27CF VERS 25D4 ZDLESS 1C03 ZPRB 1B27 ***** NO ERRORS DETECTED *****