2023-11-16 18:19:54 -05:00

6290 lines
270 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 1
0000 ; ----------------------------
0000 ; GRIP/6502 1.0
0000 ; G-CODE INTERPRETER PROGRAM
0000 ; FOR ATARI 400/800/1200/XL
0000 ; ----------------------------
0000 ; INFOCOM, INC.
0000 ; 55 WHEELER STREET
0000 ; CAMBRIDGE, MA 02138
0000 ; COMPANY PRIVATE -- NOT FOR DISTRIBUTION
0000 ; -------------------------
0000 ; MEMORY ALLOCATION EQUATES
0000 ; -------------------------
0000 ; THESE MUST BE DEFINED FOR EACH MACHINE
;ZSTART EQU $80 ; FIRST FREE ZERO-PAGE LOCATION
;***
;ZSTART EQU $7E ; FIRST FREE ZERO-PAGE LOCATION
;***
;***
006B ZSTART EQU $6B ; FIRST FREE ZERO-PAGE LOCATION
;***
00FF ZEND EQU $FF ; LAST FREE ZERO-PAGE LOCATION
0400 MSTART EQU $0400 ; FIRST FREE RAM LOCATION
0000 DEBUG EQU 0 ; ASSEMBLY FLAG FOR DEBUGGER
0000 ; -----------
0000 ; ERROR CODES
0000 ; -----------
0000 ; 00 -- GAME PRELOAD TOO BIG
0000 ; 01 -- IMAGE PRELOAD TOO BIG
0000 ; 02 -- UNDEFINED X-OP
0000 ; 03 -- UNDEFINED 0-OP
0000 ; 04 -- UNDEFINED 1-OP
0000 ; 05 -- UNDEFINED 2-OP
0000 ; 06 -- G-STACK UNDERFLOW
0000 ; 07 -- G-STACK OVERFLOW
0000 ; 08 -- DIVISION BY ZERO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 2
0000 ; 09 -- PURITY VIOLATION (PUT/PUTB/ITER)
0000 ; 0A -- DISK ADDRESS RANGE
0000 ; 0B -- DISK ACCESS
0000 ; 0C -- NO CALL ADDRESS
0000 ; 0D -- UNDEFINED SOUND
0000 ; 0E -- PURITY VIOLATION (SETI/SWAPI)
0000 ; ----------------
0000 ; BATCH PROCESSING
0000 ; ----------------
INCLUD EQ.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 3
--- SOFTWARE EQUATES ---
0000 ; -------------------
0000 ; MEMORY ORGANIZATION
0000 ; -------------------
0400 BUFFER EQU MSTART ; 256-BYTE DISK BUFFER
0500 GSTAKL EQU MSTART+$100 ; G-STACK LSBS
0600 GSTAKH EQU MSTART+$200 ; G-STACK MSBS
0700 MEMMAP EQU MSTART+$300 ; ABSOLUTE MEMORY MAP
0800 PAGMAP EQU MSTART+$400 ; PAGING BUFFER MAP (128 BYTES)
0880 LRUMAP EQU MSTART+$480 ; LRU MAP (128 BYTES)
0900 VLOWS EQU MSTART+$500 ; LSB PLOT TABLE (192 BYTES)
09C0 VHIGHS EQU VLOWS+$C0 ; MSB PLOT TABLE (192 BYTES)
0A80 LOCALS EQU VLOWS+$180 ; LOCAL VARIABLE STORAGE (32 BYTES)
0AA0 CARGS EQU LOCALS+$20 ; CALL ARGUMENT STORAGE (32 BYTES)
0AC0 CTYPES EQU CARGS+$20 ; CALL ARGUMENT LIST (16 BYTES)
0B00 GRIP EQU MSTART+$700 ; BEGINNING OF GRIP CODE
2300 GBEGIN EQU GRIP+$1800 ; START OF PRELOAD
0000 ; -----------------
0000 ; PROGRAM CONSTANTS
0000 ; -----------------
0000 FALSE EQU 0
00FF TRUE EQU $FF
0000 LO EQU 0
0001 HI EQU 1
0042 INTRP EQU 'B' ; INTERPRETER VERSION #
0000 ; ---------------------
0000 ; G-CODE HEADER OFFSETS
0000 ; ---------------------
0000 GVERS EQU 0 ; (BYTE) G-MACHINE VERSION ("1")
0001 GMODE EQU 1 ; (BYTE) MODE BYTE
0002 GID EQU 2 ; (WORD) GAME ID
0004 GEND EQU 4 ; (WORD) END OF G-PRELOAD
0006 GSTART EQU 6 ; (WORD) EXECUTION START ADDRESS
0008 GPUR EQU 8 ; (WORD) START OF PURE G-CODE
000A GGLOB EQU 10 ; (WORD) START OF GLOBAL VARIABLE TABLE
000C GSER EQU 12 ; (6 BYTES) ASCII SERIAL NUMBER
0012 GLEN EQU 18 ; (WORD) LENGTH OF G-PROGRAM IN BYTES
0014 GCHECK EQU 20 ; (WORD) G-CODE CHECKSUM
0016 IVERS EQU 22 ; (WORD) INTERPRETER VERSION
0000 ; ---------------------
0000 ; I-FILE HEADER OFFSETS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 4
--- SOFTWARE EQUATES ---
0000 ; ---------------------
0000 ILEN EQU 0 ; (WORD) I-FILE LENGTH IN BYTES
0002 IEND EQU 2 ; (WORD) END OF I-FILE PRELOAD
0004 ICHECK EQU 4 ; (WORD) I-FILE CHECKSUM WORD
0006 IBLKS EQU 6 ; (BYTE) # BLOCKSETS IN FILE
0007 IICONS EQU 7 ; (BYTE) # ICONS IN FILE
0000 ; -------------------
0000 ; ZERO-PAGE VARIABLES
0000 ; -------------------
006B OPCODE EQU ZSTART ; (BYTE) CURRENT OPCODE
006C NARGS EQU OPCODE+1 ; (BYTE) CURRENT # ARGUMENTS
006D ARG1 EQU OPCODE+2 ; (WORD) ARGUMENT 1 REGISTER
006F ARG2 EQU OPCODE+4 ; (WORD) ARGUMENT 2 REGISTER
0071 ARG3 EQU OPCODE+6 ; (WORD) ARGUMENT 3 REGISTER
0073 ARG4 EQU OPCODE+8 ; (WORD) ARGUMENT 4 REGISTER
0075 ABYTE EQU OPCODE+10 ; (BYTE) X-OP ARGUMENT BYTE
0076 ADEX EQU OPCODE+11 ; (BYTE) X-OP ARGUMENT INDEX
0077 ADEX2 EQU OPCODE+12 ; (BYTE) "CALL" ARG-BYTE INDEX
0078 VALUE EQU OPCODE+13 ; (WORD) VALUE RETURN REGISTER
007A I EQU VALUE+2 ; (WORD) GENERAL INDEX REGISTER #1
007C J EQU VALUE+4 ; (WORD) GENERAL INDEX REGISTER #2
007E K EQU VALUE+6 ; (WORD) " " " #3
0080 GPC EQU VALUE+8 ; (WORD) G-CODE PROGRAM COUNTER
0080 GPCL EQU GPC ; (BYTE) LSB OF GPC
0081 GPCH EQU GPC+1 ; (BYTE) MSB OF GPC
;***
0082 GPC0: EQU GPC+2 ; (BYTE) BIT 0 OF BYTE IS BIT 0 OF GPC
;***
0083 GPCFLG EQU GPC+3 ; (BYTE) GPC VALIDITY FLAG
0084 GPOINT EQU GPC+4 ; (WORD) ABSOLUTE G-MEMORY POINTER
0086 VPC EQU GPC+6 ; (WORD) VIRTUAL MEMORY POINTER
0086 VPCL EQU VPC ; (BYTE) LSB OF VPC
0087 VPCH EQU VPC+1 ; (BYTE) MSB OF VPC
;***
0088 VPC0 EQU VPC+2 ; (BYTE) LEAST SIG BIT OF VPC
;***
0089 VPCFLG EQU VPC+3 ; (BYTE) VPC VALIDITY FLAG
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 5
--- SOFTWARE EQUATES ---
008A VPOINT EQU VPC+4 ; (WORD) ABSOLUTE V-MEMORY POINTER
008C VPCSAV EQU VPC+6 ; (WORD) [VPC] SAVE REGISTER
008E GSP EQU VPC+8 ; (BYTE) G-STACK POINTER
008F OLDGSP EQU GSP+1 ; (BYTE) OLD G-STACK POINTER
0090 GCODE EQU GSP+2 ; (BYTE) ABS 1ST PAGE OF G-PRELOAD
0091 ICODE EQU GCODE+1 ; (WORD) ABS START ADDR OF I-PRELOAD
0093 GPURE EQU GCODE+3 ; (BYTE) 1ST V-PAGE OF "PURE" G-CODE
0094 ISTART EQU GPURE+1 ; (BYTE) 1ST V-PAGE OF I-FILE
0095 IPURE EQU GPURE+2 ; (BYTE) 1ST V-PAGE OF "PURE" I-FILE
0096 PAGE0 EQU GPURE+3 ; (BYTE) ABS 1ST PAGE OF PAGING SPACE
0097 PMAX EQU PAGE0+1 ; (BYTE) MAXIMUM # SWAPPING PAGES
0098 STAMP EQU PAGE0+2 ; (BYTE) LRU TIMESTAMP
0099 LRU EQU PAGE0+3 ; (BYTE) EARLIEST TIMESTAMP
009A SWAP EQU PAGE0+4 ; (BYTE) LRU SWAPPING PAGE
009B TARGET EQU PAGE0+5 ; (BYTE) TARGET BUFFER ADDRESS
009C GLOBAL EQU PAGE0+6 ; (WORD) ABSOLUTE GLOBAL TABLE ADDR
009E BTAB EQU GLOBAL+2 ; (WORD) ABSOLUTE BLOCKSET TABLE ADDR
00A0 ITAB EQU GLOBAL+4 ; (WORD) ABSOLUTE ICON TABLE ADDR
00A2 NBLOKS EQU GLOBAL+6 ; (BYTE) # BLOCKSETS IN I-FILE
00A3 NICONS EQU GLOBAL+7 ; (BYTE) # ICONS IN I-FILE
00A4 QUOT EQU GLOBAL+8 ; (WORD) QUOTIENT REGISTER
00A6 REMAIN EQU QUOT+2 ; (WORD) REMAINDER REGISTER
00A8 MTEMP EQU QUOT+4 ; (WORD) TEMP MATH REGISTER
00AA QSIGN EQU QUOT+6 ; (BYTE) SIGN OF QUOTIENT
00AB RSIGN EQU QUOT+7 ; (BYTE) SIGN OF REMAINDER
00AC MUSHFT EQU QUOT+8 ; (BYTE) MULTIPLY TEMP FOR BLOCKS
00AD MUL EQU QUOT+9 ; (BYTE) DITTO
00AE MUH EQU QUOT+10 ; (BYTE) DITTO
00AF IADR1 EQU QUOT+11 ; (WORD) ABS ADDR OF ICON #1
;***
00B1 IADR10 EQU IADR1+2 ; (BYTE) SAME IDEA AS VPC0
;***
00B2 IADR2 EQU IADR1+3 ; (WORD) ABS ADDR OF ICON #2
;***
00B4 IADR20 EQU IADR1+5 ; (BYTE) SAME IDEA AS VPC0
;***
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 6
--- SOFTWARE EQUATES ---
00B5 IX1 EQU IADR1+6 ; (BYTE) X-SIZE OF ICON #1
00B6 IX2 EQU IADR1+7 ; (BYTE) X-SIZE OF ICON #2
00B7 IY1 EQU IADR1+8 ; (BYTE) Y-SIZE OF ICON #1
00B8 IY2 EQU IADR1+9 ; (BYTE) Y-SIZE OF ICON #2
00B9 XDEX1 EQU IADR1+10 ; (BYTE) X-INDEX #1
00BA XDEX2 EQU IADR1+11 ; (BYTE) X-INDEX #2
00BB YDEX1 EQU IADR1+12 ; (BYTE) Y-INDEX #1
00BC YDEX2 EQU IADR1+13 ; (BYTE) Y-INDEX #2
00BD ITERS EQU IADR1+14 ; (BYTE) # ICON ITERATIONS
00BE ITICN EQU IADR1+15 ; (BYTE) COUNTER FOR ITERATE ROUTINE
00BF ITPNT EQU IADR1+16 ; (BYTE) COUTNER FOR ITERATE ROUTINE
00C0 XPOS EQU IADR1+17 ; (WORD) ICON X-POSITION
00C2 YPOS EQU IADR1+19 ; (WORD) ICON Y-POSITION
00C4 TOPCUT EQU IADR1+21 ; (BYTE) TEMP FOR AMOUNT TO CUT OFF TOP IN SET
0000 ; UP ROUTINE OF SHOWI
00C5 SIDCUT EQU IADR1+22 ; (BYTE) SAME AS TOPCUT FOR SIDE
00C6 IXSKIP EQU IADR1+23 ; (BYTE) AMOUNT TO ADD TO IADR1 TO GET NEXT
0000 ; BLOCK AT NEXT ROW
00C7 MDXCUT EQU IADR1+24 ; (BYTE) IF YOU DON'T UNDERSTAND, OH WELL.
;MDYCUT EQU IADR1+25 ; (BYTE) NOT SHURE THIS IS USED IN FINAL
00C9 WINDX1 EQU IADR1+26 ; (BYTE) LEFT CLIP VALUE
00CA WINDY1 EQU WINDX1+1 ; (BYTE) RIGHT CLIP VALUE
00CB WINDX2 EQU WINDX1+2 ; (BYTE) TOP CLIP VALUE
00CC WINDY2 EQU WINDX1+3 ; (BYTE) BOTTOM CLIP VALUE
00CD WINDH EQU WINDX1+4 ; (BYTE) HEIGHT OF WINDOW (WINDY2-WINDY1)
00CE WINDW EQU WINDX1+5 ; (BYTE) WIDTH OF WINDOW (WINDX2-WINDX1)
00CF BSET EQU WINDX1+6 ; (BYTE) CURRENT BLOCKSET ID
00D0 BSADR EQU BSET+1 ; (WORD) ABS ADDR OF CURRENT BLOCKSET
00D2 BSIZE EQU BSET+3 ; (BYTE) # BLOCKS IN CURRENT BLOCKSET
00D3 BLOCK EQU BSET+4 ; (8 BYTES) IMAGE BLOCK BUFFER
00DB MASK EQU BSET+12 ; (8 BYTES) IMAGE MASK BUFFER
00E3 MSKFLG EQU BSET+20 ; (BYTE) FLAG FOR MASKING 00=DISABLED
00E4 TOX EQU BSET+21 ; (BYTE) X-SAVE FOR "DUMP"
00E5 XPSAV EQU BSET+22 ; (WORD) X-POSITION SAVE
00E7 XCURS EQU BSET+24 ; (BYTE) GAME CURSOR X-POS
00E8 YCURS EQU BSET+25 ; (BYTE) GAME CURSOR Y-POS
00E9 NEGATE EQU BSET+26 ; (BYTE) BLOCK NEGATE FLAG
00EA BLKLEN EQU BSET+27 ; (BYTE) # BYTES PER BLOCK
00EB DBLOCK EQU BSET+28 ; (BYTE) G-CODE BLOCK TO ACCESS
00EC DBTOP EQU DBLOCK+1 ; (BYTE) MSB HOLDER FOR "GETDSK"
00ED DBUFF EQU DBLOCK+2 ; (WORD) DISK BUFFER PAGE POINTER
00EF SECTOR EQU DBLOCK+4 ; (WORD) SECTOR ADDRESS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 7
--- SOFTWARE EQUATES ---
;***
00F1 DCNT EQU DBLOCK+6 ; (BYTE) COUNTER FOR GROS
;***
00F2 LINE EQU DBLOCK+7 ; (WORD) TEXT LINE ADDRESS
00F4 LEN EQU LINE+2 ; (BYTE) TEXT LINE LENGTH
00F5 CURSOR EQU LINE+3 ; (BYTE) TEXT CURSOR POSITION (0-39)
00F6 CHKSUM EQU LINE+4 ; (WORD) HOLDS IMAGE CHECKSUM FOR VERIFY
END
INCLUD HARDEQ.ASM ; M
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 8
--- HARDWARE EQUATES: ATARI ---
A100 SCREEN EQU $A100 ; START OF SCREEN RAM
0000 ; ----------------------
0000 ; ATARI HARDWARE EQUATES
0000 ; ----------------------
0000 ; ZER0-PAGE
0009 BOOT EQU $09 ; BOOT FLAG
000A DOSVEC EQU $0A ; DOS START VECTOR
000C DOSINI EQU $0C ; DOS INIT VECTOR
0010 POKMSK EQU $10 ; FOR BREAK KEY DISABLE
0011 BRKKEY EQU $11 ; BREAK KEY FLAG
0014 RTCLOK EQU $14 ; JIFFY CLOCK
0041 SOUNDR EQU $41 ; NOISY I/O FLAG
004D ATRACT EQU $4D ; ATTRACT MODE FLAG
0054 ROWCRS EQU $54 ; OS CURSOR ROW
0055 COLCRS EQU $55 ; OS CURSOR COLUMN
0058 SAVMSC EQU $58 ; OS SCREEN ADDRESS
006A RAMTOP EQU $6A ; OS TOP OF RAM
00D4 FR0 EQU $D4 ; FP REGISTER #0
00E0 FR1 EQU $E0 ; FP REGISTER #1
00F2 CIX EQU $F2 ; FP INDEX
00F3 INBUFF EQU $F3 ; ASCII BUFFER POINTER
0000 ; PAGES 2-5
022F SDMCTL EQU $022F ; DMA CONTROL
0230 SDLSTL EQU $0230 ; DISPLAY LIST ADDRESS
0244 COLDST EQU $0244 ; COLDSTART FLAG
0278 STICK0 EQU $0278 ; JOYSTICK #0
0279 STICK1 EQU $0279 ; JOYSTICK #1
0284 STRIG0 EQU $0284 ; JOYSTICK #0 TRIGGER
0285 STRIG1 EQU $0285 ; JOYSTICK #1 TRIGGER
02C5 COLOR1 EQU $02C5 ; GRAPHICS FOREGROUND COLOR
02C6 COLOR2 EQU $02C6 ; BACKGROUND COLOR
02E4 RAMSIZ EQU $02E4 ; AMOUNT OF RAM IN SYSTEM
02F0 CRSINH EQU $02F0 ; OS CURSOR INHIBIT
02FC CH EQU $02FC ; KEYBOARD READ FLAG
0301 DUNIT EQU $0301 ; DRIVE #
0302 DCOMND EQU $0302 ; DISK COMMAND
0303 DSTATS EQU $0303 ; DISK I/O STATUS
0304 DBUFLO EQU $0304 ; DISK BUFFER ADDR (LSB)
0305 DBUFHI EQU $0305 ; DISK BUFFER ADDR (MSB)
030A DAUX1 EQU $030A ; SECTOR ADDR (LSB)
030B DAUX2 EQU $030B ; SECTOR ADDR (MSB)
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 9
--- HARDWARE EQUATES: ATARI ---
0342 ICCOM EQU $0342 ; IOCB #0 COMMAND
0344 ICBADR EQU $0344 ; IOCB #0 BUFFER ADDR
0348 ICBLEN EQU $0348 ; IOCB #0 LENGTH
034A ICAUX1 EQU $034A ; IOCB #0 AUX BYTE #1
034B ICAUX2 EQU $034B ; IOCB #0 AUX BYTE #2
03A0 TEXT EQU $03A0 ; TEXT BUFFER
0580 LBUFF EQU $0580 ; ASCII OUTPUT BUFFER
0000 ; GTIA, POKEY, ANTIC
D01F CONSOL EQU $D01F ; CONSOLE KEY REGISTER
D200 AUDF1 EQU $D200 ; AUDIO CH1 FREQ
D201 AUDC1 EQU $D201 ; AUDIO CH1 CTRL
D202 AUDF2 EQU $D202 ; AUDIO CH2 FREQ
D203 AUDC2 EQU $D203 ; AUDIO CH2 CTRL
D204 AUDF3 EQU $D204 ; AUDIO CH3 FREQ
D205 AUDC3 EQU $D205 ; AUDIO CH3 CTRL
D206 AUDF4 EQU $D206 ; AUDIO CH4 FREQ
D207 AUDC4 EQU $D207 ; AUDIO CH4 CTRL
D208 AUDCTL EQU $D208 ; AUDIO CONTROL
D20A RANDOM EQU $D20A ; RANDOM BYTE
D20E IRQEN EQU $D20E ; IRQ ENABLE
D20F SKCTL EQU $D20F ; SERIAL PORT CONTROL
D301 PORTB EQU $D301 ; PORT B (XL ROM SWITCH)
D400 DMACTL EQU $D400 ; DMA CONTROL
0000 ; OS ROM
D8E6 FASC EQU $D8E6 ; FP TO ASCII
D9AA IFP EQU $D9AA ; INTEGER TO FP
D9D2 FPI EQU $D9D2 ; FP TO INTEGER
DA44 ZFR0 EQU $DA44 ; CLEAR FR0
DA46 ZFR1 EQU $DA46 ; CLEAR FR1
DA60 FSUB EQU $DA60 ; FP SUBTRACT
DA66 FADD EQU $DA66 ; FP ADD
DADB FMUL EQU $DADB ; FP MULTIPLY
DB28 FDIV EQU $DB28 ; FP DIVIDE
DDB6 FMOVE EQU $DDB6 ; MOVE FR0 TO FR1
E453 DSKINV EQU $E453 ; SIO DISK ACCESS
E456 CIOV EQU $E456 ; CIO VECTOR
E465 SIOINV EQU $E465 ; SIO INIT (FOR SOUND)
E477 COLDSV EQU $E477 ; COLDSTART VECTOR
END
INCLUD COLD.ASM ; M
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 10
--- MACHINE COLDSTART: ATARI ---
0B00 ORG GRIP
0B00 ; -----------------
0B00 ; ATARI BOOT HEADER
0B00 ; -----------------
0B00 00 DB 0 ; FLAG BYTE (IGNORED)
0B01 35 DB 53 ; LOAD ALL OF TRACKS 0, 1 AND 2
0B02 000B DW GRIP ; WHERE TO LOAD THE SECTORS
0B04 0E0B DW DUMMY ; POINT TO INIT SUBROUTINE
0B06 ; --------------
0B06 ; BOOT COLDSTART
0B06 ; --------------
0B06 A9EB LDA #LOW COLD ; POINT [DOSVEC] TO
0B08 850A STA DOSVEC+LO ; THE COLDSTART ROUTINE
0B0A A90B LDA #HIGH COLD
0B0C 850B STA DOSVEC+HI
0B0E A9FF DUMMY: LDA #$FF ; DISABLE BASIC ROM
0B10 8D01D3 STA PORTB ; IN XL-SERIES MACHINES
0B13 18 CLC ; SUCCESS FLAG
0B14 60 RTS
0B15 ; -------------
0B15 ; DISPLAY LISTS
0B15 ; -------------
0B15 ; LIST 1: SCREEN W/STATUS LINE
0B15 707060 DL1: DB $70,$70,$60 ; 23 BLANK LINES
0B18 42 DB $42 ; TEXT LINE W/LMS
0B19 A003 DW TEXT ; ADDRESS OF TEXT LINE
0B1B 02 DB $02 ; A SECOND LINE OF TEXT
0B1C 01 DB $01 ; JUMP INSTRUCTION
0B1D 340B DW DL2A ; INTO DL2
0B1F ; LIST 2: SCREEN W/O STATUS LINE (NORMAL)
0B1F 707070 DL2: DB $70,$70,$70 ; 24 BLANK LINES
0B22 4F DB $4F ; 1 SCAN LINE W/LMS
0B23 00A1 DW SCREEN ; ADDRESS OF SCREEN RAM
0B25 0F0F0F0F DB $0F,$0F,$0F,$0F ; 7 MORE
0B29 0F0F0F DB $0F,$0F,$0F ; SCAN LINES (0)
0B2C 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (2)
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 11
--- MACHINE COLDSTART: ATARI ---
0B34 4F DL2A: DB $4F ; 1 SCAN LINE W/LMS
0B35 80A3 DW SCREEN+640 ; ADDRESS OF 8TH SCAN LINE
0B37 0F0F0F0F DB $0F,$0F,$0F,$0F ; 7 MORE
0B3B 0F0F0F DB $0F,$0F,$0F ; SCAN LINES (1)
0B3E 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (3)
0B46 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (4)
0B4E 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (5)
0B56 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (6)
0B5E 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (7)
0B66 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (8)
0B6E 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (9)
0B76 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (10)
0B7E 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (11)
0B86 4F DB $4F ; 1 SCAN LINE W/LMS
0B87 00B0 DW SCREEN+3840 ; ADDRESS OF 96TH SCAN LINE
0B89 0F0F0F0F DB $0F,$0F,$0F,$0F ; 7 MORE
0B8D 0F0F0F DB $0F,$0F,$0F ; SCAN LINES (12)
0B90 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (13)
0B98 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (14)
0BA0 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (15)
0BA8 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (16)
0BB0 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (17)
0BB8 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (18)
0BC0 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (19)
0BC8 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (20)
0BD0 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (21)
0BD8 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (22)
0BE0 0F0F0F0F DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; (23)
0BE8 41 DB $41 ; JUMP ON VERTICAL BLANK
0BE9 1F0B DLTOP: DW DL2 ; TO TOP OF D-LIST 2
0BEB ; ---------
0BEB ; COLDSTART
0BEB ; ---------
0BEB D8 COLD: CLD
0BEC A2FF LDX #$FF ; RESET THE
0BEE 9A TXS ; HARDWARE STACK
0BEF 8EFC02 STX CH ; AND KEYBOARD REGISTER
0BF2 8E01D3 STX PORTB ; REMOVE BASIC ROM IN XL-SERIES MACHINES
0BF5 E8 INX ; = 0
0BF6 8E00D4 STX DMACTL ; SHUT OFF
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 12
--- MACHINE COLDSTART: ATARI ---
0BF9 8E2F02 STX SDMCTL ; ANTIC
0BFC 8EC602 STX COLOR2 ; BLACK BACKGROUND
0BFF 8E4402 STX COLDST ; COLDSTART OKAY
0C02 8E08D2 STX AUDCTL ; CLEAR SOUND
0C05 8641 STX SOUNDR ; PREVENT I/O BEEPS
0C07 E8 INX ; = 1
0C08 8609 STX BOOT ; BOOT SUCCESSFUL
0C0A A903 LDA #3
0C0C 8D0FD2 STA SKCTL ; RESET SOUND
0C0F A970 LDA #$70
0C11 8510 STA POKMSK ; DISABLE
0C13 8D0ED2 STA IRQEN ; THE BREAK KEY
0C16 A90E LDA #14 ; WHITE
0C18 8DC502 STA COLOR1 ; GRAPHICS
0C1B ; SET UP THE PLOT TABLES
0C1B A900 LDA #LOW SCREEN ; ADDRESS OF SCAN LINE 0
0C1D 8D0009 STA VLOWS ; HARD-WIRE THE 1ST POSITION
0C20 857A STA I+LO ; ALSO INIT INDEX
0C22 A9A1 LDA #HIGH SCREEN ; SAME FOR MSBS
0C24 8DC009 STA VHIGHS
0C27 857B STA I+HI
0C29 A201 LDX #1 ; START AT LINE 1
0C2B A57A PTCALC: LDA I+LO
0C2D 18 CLC
0C2E 6928 ADC #40
0C30 857A STA I+LO
0C32 9D0009 STA VLOWS,X
0C35 A57B LDA I+HI
0C37 6900 ADC #0
0C39 857B STA I+HI
0C3B 9DC009 STA VHIGHS,X
0C3E E8 INX
0C3F E0C0 CPX #192
0C41 D0E8 BNE PTCALC
0C43 A97F LDA #$7F
0C45 856D STA ARG1+LO
0C47 856E STA ARG1+HI
0C49 201F1C JSR GCLEAR ; CLEAR SCREEN TO BLACK
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 13
--- MACHINE COLDSTART: ATARI ---
0C4C IF DEBUG
0C4C JSR BUGNIT ; SET UP DEBUGGER
0C4C ELSE
0C4C A91F LDA #LOW DL2 ; ELSE USE FULL-SCREEN
0C4E 8D3002 STA SDLSTL+LO
0C51 8DE90B STA DLTOP+LO
0C54 A90B LDA #HIGH DL2
0C56 8D3102 STA SDLSTL+HI
0C59 8DEA0B STA DLTOP+HI
0C5C ENDIF
0C5C A922 LDA #$22
0C5E 8D2F02 STA SDMCTL ; RESTORE ANTIC
0C61 ; FALL THROUGH TO WARMSTART ...
END
INCLUD WARM.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 14
--- WARMSTART ROUTINE ---
0C61 ; ---------
0C61 ; WARMSTART
0C61 ; ---------
0C61 A900 WARM: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
0C63 A26B LDX #ZSTART
0C65 9500 CLRZ: STA 0,X
0C67 E8 INX
; CPX #ZEND ; NOT NEEDED FOR ATARI
0C68 D0FB BNE CLRZ
0C6A ; CLEAR THE MEMORY, LRU & SWAPPING MAPS
0C6A AA TAX ; = 0
0C6B 9D0007 CLRT: STA MEMMAP,X
0C6E 9D0008 STA PAGMAP,X
0C71 E8 INX
0C72 D0F7 BNE CLRT
0C74 E68E INC GSP ; INIT G-STACK POINTERS
0C76 E68F INC OLDGSP ; TO 1
0C78 E698 INC STAMP ; 1ST TIMESTAMP IS 1
0C7A A928 LDA #40 ; SET DEFAULT CLIPPING PARAMETERS
0C7C 85CB STA WINDX2
0C7E 85CE STA WINDW ; DEFAULT WINDOW WIDTH
0C80 A918 LDA #24
0C82 85CC STA WINDY2
0C84 85CD STA WINDH ; DEFAULT WINDOW HEIGHT
0C86 ; FETCH 1ST BLOCK OF G-PRELOAD
0C86 A923 LDA #HIGH GBEGIN
0C88 8590 STA GCODE ; 1ST PAGE OF G-PRELOAD
0C8A 85EE STA DBUFF+HI ; LSB OF [DBUFF] IS ALWAYS ZERO
0C8C C694 DEC ISTART ; (= $FF) FORCE LOAD FROM G-FILE
0C8E 202722 JSR GETDSK ; GRAB G-BLOCK #0 (G-PRELOAD HEADER)
0C91 ; EXTRACT DATA FROM G-PRELOAD HEADER
0C91 AE0423 LDX GBEGIN+GEND ; END OF PRELOAD (MSB)
0C94 E8 INX ; MAKE IT AT LEAST 1
0C95 8693 STX GPURE ; 1ST VIRTUAL PAGE OF "PURE" G-CODE
0C97 8A TXA
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 15
--- WARMSTART ROUTINE ---
;***
0C98 0A ASL A ; * 2 FOR 512 BYTE PAGES
0C99 B012 BCS NOGRAM ; IT WOULD BE BAD IF CARRY WERE SET
;***
; CLC
0C9B 6590 ADC GCODE ; ABSOLUTE END OF G-PRELOAD
0C9D 8592 STA ICODE+HI ; IS ABSOLUTE START OF I-PRELOAD
0C9F A942 LDA #INTRP ; SET INTERPRETER VERSION
0CA1 8D1623 STA GBEGIN+IVERS ; FOR GAME
0CA4 20FD1C JSR MEMTOP ; GET TOP FREE PAGE INTO [A]
0CA7 C592 CMP ICODE+HI ; ENOUGH ROOM FOR G-PRELOAD?
0CA9 F002 BEQ NOGRAM
0CAB B005 BCS GETLEN ; ONLY IF [MEMTOP] >= [ICODE]
0CAD ; *** ERROR #0: GAME PRELOAD TOO BIG ***
0CAD A900 NOGRAM: LDA #0
0CAF 4C5F1C JMP GERROR
0CB2 ; CALC VIRTUAL ADDRESS OF I-FILE
0CB2 AE1223 GETLEN: LDX GBEGIN+GLEN ; MSB OF G-CODE LENGTH
0CB5 E8 INX
0CB6 8694 STX ISTART ; 1ST VIRTUAL PAGE OF I-FILE
0CB8 ; FETCH THE REST OF THE G-PRELOAD
0CB8 A5EB GPGET: LDA DBLOCK
0CBA C593 CMP GPURE
0CBC B006 BCS IHEAD
0CBE 202722 JSR GETDSK
0CC1 4CB80C JMP GPGET
0CC4 ; NOW GET THE I-FILE HEADER
0CC4 A594 IHEAD: LDA ISTART ; POINT TO 1ST BLOCK
0CC6 85EB STA DBLOCK ; OF IMAGE FILE
0CC8 A592 LDA ICODE+HI ; TELL GROS
0CCA 85EE STA DBUFF+HI ; WHERE TO PUT IT
0CCC 202722 JSR GETDSK ; AND GET IT!
0CCF ; EXTRACT DATA FROM I-FILE HEADER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 16
--- WARMSTART ROUTINE ---
0CCF A002 LDY #IEND ; "END OF I-PRELOAD" POINTER (MSB)
0CD1 B191 LDA (ICODE),Y
0CD3 AA TAX ; COPY IT HERE
0CD4 E8 INX ; POINT TO NEXT PAGE
0CD5 8A TXA
0CD6 18 CLC
0CD7 6594 ADC ISTART ; ADD 1ST V-PAGE OF I-FILE
0CD9 8595 STA IPURE ; TO GET V-PAGE OF "PURE" I-CODE
0CDB 8A TXA
;***
0CDC 0A ASL A ; * 2 FOR 512 BYTE PAGES
0CDD B00E BCS ITOBIG ; AGAIN IT WOULD BE BAD IF CARRY WERE SET
;***
; CLC
0CDF 6592 ADC ICODE+HI ; ADD BASE ADDR OF I-PRELOAD
0CE1 8596 STA PAGE0 ; TO GET BASE PAGE OF SWAPPING SPACE
0CE3 20FD1C JSR MEMTOP ; GET TOP FREE PAGE INTO [A] AGAIN
0CE6 38 SEC
0CE7 E596 SBC PAGE0 ; CALC # PAGES IN SWAPPING SPACE
0CE9 C910 CMP #16 ; MUST HAVE AT LEAST 2K
0CEB B005 BCS ENOUGH ; OF SWAPPING SPACE
0CED ; *** ERROR #1: IMAGE PRELOAD TOO BIG ***
0CED A901 ITOBIG: LDA #1
0CEF 4C5F1C JMP GERROR
0CF2 AA ENOUGH: TAX ; CHECK SIZE OF PAGING SPACE
0CF3 1002 BPL NOUGH ; MUST BE NO LARGER
0CF5 A97E LDA #$7E ; THAN 32K!
;***
0CF7 4A NOUGH: LSR A ; DIVIDE !RAM! PAGES/2 TO GET #/BUFFERS
0CF8 ****
0CF8 8597 STA PMAX ; ESTABLISH # SWAPPING PAGES
0CFA ; GRAB THE REST OF THE I-PRELOAD
0CFA A5EB GETIP: LDA DBLOCK
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 17
--- WARMSTART ROUTINE ---
0CFC C595 CMP IPURE
0CFE B006 BCS GCALC
0D00 202722 JSR GETDSK
0D03 4CFA0C JMP GETIP
0D06 ; CALC ADDRESS OF GLOBAL VARIABLE TABLE
;GCALC: LDA GBEGIN+GGLOB ; MSB OF GLOBAL VARS
; CLC
; ADC GCODE ; MAKE IT ABSOLUTE
; STA GLOBAL+HI
; LDA GBEGIN+GGLOB+1 ; LSB NEEDN'T CHANGE
; STA GLOBAL+LO
;***
0D06 ;-----------------------------------------------------------
0D06 ; [GGLOB] IS A VIRTUAL WORD POINTER TO THE GLOBAL TABLE
0D06 ; MAKE [GLOBAL] A !RAM! ABSOLUTE POINTER TO THE GLOBAL TABLE
0D06 ;
0D06 ; WE MULTIPLY [GGLOB]*2 TO MAKE IT A BYTE POINTER AND ADD
0D06 ; TO THE BEGINING ADDRESS OF PRELOAD.
0D06 ;------------------------------------------------------------
0D06 AD0B23 GCALC: LDA GBEGIN+GGLOB+1 ; MAKE IT A BYTE POINTER WITH A * 2
0D09 0A ASL A
0D0A 859C STA GLOBAL+LO
0D0C AD0A23 LDA GBEGIN+GGLOB
0D0F 2A ROL A
0D10 18 CLC ; I THINK THE CARRY WOULD BE CLEAR ANYWAY
0D11 6590 ADC GCODE
0D13 859D STA GLOBAL+HI
;***
0D15 ; G-VAR #16 = # BLOCKSETS IN I-FILE
0D15 A006 LDY #IBLKS ; GET # BLOCKSETS IN I-FILE
0D17 B191 LDA (ICODE),Y
0D19 85A2 STA NBLOKS ; SAVE HERE
0D1B 8578 STA VALUE+LO ; MSB IS ALREADY CLEARED
0D1D A910 LDA #16
0D1F 207F0F JSR PUTVLG
0D22 ; G-VAR #18 = # ICONS IN I-FILE
0D22 A007 LDY #IICONS ; GET # ICONS IN I-FILE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 18
--- WARMSTART ROUTINE ---
0D24 B191 LDA (ICODE),Y ; FROM THE I-FILE HEADER
0D26 85A3 STA NICONS ; SAVE HERE
0D28 8578 STA VALUE+LO ; MSB ALREADY CLEARED
0D2A A912 LDA #18
0D2C 207F0F JSR PUTVLG
0D2F ; [BTAB] = ABSOLUTE BLOCKSET TABLE ADDR
0D2F A592 LDA ICODE+HI ; BLOCKSET TABLE BEGINS
0D31 859F STA BTAB+HI ; 8 BYTES AFTER THE START
0D33 A908 LDA #8 ; OF THE I-FILE
0D35 859E STA BTAB+LO
0D37 ; G-VAR #17 = V-WORD OF BLOCKSET TABLE
;***
0D37 4A LSR A ; /2 FOR 4-WORD OFFSET
;***
0D38 8578 STA VALUE+LO ; SAME 8-BYTE OFFSET AS [BTAB]
0D3A A594 LDA ISTART ; 1ST VIRTUAL PAGE # OF I-FILE
0D3C 8579 STA VALUE+HI
0D3E A911 LDA #17
0D40 207F0F JSR PUTVLG
0D43 ; G-VAR #19 = VIRTUAL WORD ADDRESS OF ICON TABLE
0D43 A5A2 LDA NBLOKS ; GET # BLOCKS IN I-FILE
; ASL A ; WORD-ALIGN IT
; ROL MTEMP+HI ; TO GET SIZE OF BLOCKSET TABLE
; STA MTEMP+LO ; SAVE LSB OF SIZE
0D45 18 CLC ; ADD THE V-WORD ADDR OF THE B-TABLE
0D46 6578 ADC VALUE+LO ; TO GET V-WORD ADDR OF I-TABLE
0D48 8578 STA VALUE+LO ; INTO [VALUE]
; LDA MTEMP+HI
;***
0D4A A900 LDA #00
;***
0D4C 6579 ADC VALUE+HI
0D4E 8579 STA VALUE+HI
0D50 A913 LDA #19
0D52 207F0F JSR PUTVLG
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 19
--- WARMSTART ROUTINE ---
0D55 ; PREPARE FOR TABLE PATCHING
;***
0D55 A5A2 LDA NBLOKS ; * 2 FOR LENGTH IN BYTES INSTED OF WORDS
0D57 0A ASL A
0D58 85A8 STA MTEMP+LO
0D5A 26A9 ROL MTEMP+HI
;***
0D5C A59E LDA BTAB+LO ; MAKE [I] POINT TO
0D5E 857A STA I+LO ; START OF B-TABLE
0D60 18 CLC ; WHILE WE'RE AT IT,
0D61 65A8 ADC MTEMP+LO ; ADD SIZE OF B-TABLE
0D63 85A0 STA ITAB+LO ; TO GET ABS START ADDR OF I-TABLE
0D65 857C STA J+LO ; INTO [ITAB] AND [J]
0D67 A59F LDA BTAB+HI ; DON'T FORGET MSBS!
0D69 857B STA I+HI
0D6B 65A9 ADC MTEMP+HI
0D6D 85A1 STA ITAB+HI
0D6F 857D STA J+HI
0D71 ; PATCH THE BLOCKSET TABLE
;***
0D71 ;SHOULD WORK AS IS
;***
0D71 A5A2 LDA NBLOKS ; GET # BLOCKSETS
0D73 85AA STA QSIGN ; SAVE HERE FOR INDEXING
0D75 A000 LDY #0 ; [I] HAS START OF B-TABLE
0D77 B17A PATB: LDA (I),Y ; GET MSB OF A B-POINTER
0D79 18 CLC
0D7A 6594 ADC ISTART ; ADD ITS VIRTUAL OFFSET
0D7C 917A STA (I),Y
0D7E C8 INY ; NO NEED TO TOUCH LSB
0D7F C8 INY ; SO SKIP OVER IT
0D80 D002 BNE PATB1 ; CONTINUE UNTIL PAGE BOUNDARY HIT
0D82 E67B INC I+HI ; IF HIT, POINT TO NEXT PAGE
0D84 C6AA PATB1: DEC QSIGN ; DECREMENT # BLOCKSETS
0D86 D0EF BNE PATB ; KEEP PATCHING TILL NONE LEFT
0D88 ; PATCH THE ICON TABLE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 20
--- WARMSTART ROUTINE ---
0D88 A5A3 LDA NICONS ; GET # ICONS
0D8A 85AA STA QSIGN ; FOR INDEXING
0D8C A000 LDY #0 ; [J] HAS START OF I-TABLE
0D8E B17C PATI: LDA (J),Y ; GET MSB OF I-POINTER
0D90 18 CLC
0D91 6594 ADC ISTART ; ADD ITS VIRTUAL OFFSET
0D93 917C STA (J),Y
0D95 C8 INY ; SKIP OVER LSB
0D96 C8 INY
0D97 D002 BNE PATI1
0D99 E67D INC J+HI
0D9B C6AA PATI1: DEC QSIGN ; DECREMENT # ICONS
0D9D D0EF BNE PATI ; KEEP PATCHING TILL NONE LEFT
0D9F ; INIT THE VIRTUAL MEMORY MAP
0D9F A200 LDX #0 ; 1ST VIRTUAL PAGE
0DA1 A490 LDY GCODE ; 1ST ABSOLUTE PAGE OF G-PRELOAD
0DA3 98 MINIT0: TYA
0DA4 9D0007 STA MEMMAP,X
0DA7 C8 INY ; NEXT ABSOLUTE PAGE
;***
0DA8 C8 INY ; SKIP 2 RAM PAGES FOR EVERY VIRTUAL PAGE
;***
0DA9 E8 INX ; NEXT VIRTUAL PAGE
0DAA E493 CPX GPURE ; END OF PRELOAD?
0DAC 90F5 BCC MINIT0 ; NO, KEEP FILLING
0DAE A694 LDX ISTART ; 1ST VIRTUAL PAGE OF I-CODE
0DB0 A492 LDY ICODE+HI ; 1ST ABSOLUTE PAGE OF I-PRELOAD
0DB2 98 MINIT1: TYA
0DB3 9D0007 STA MEMMAP,X
0DB6 C8 INY ; NEXT ABSOLUTE PAGE
;***
0DB7 C8 INY ; SKIP 2 RAM FOR EVERY 1 VIRTUAL
;***
0DB8 E8 INX ; NEXT VIRTUAL PAGE
0DB9 E495 CPX IPURE ; END OF I-PRELOAD?
0DBB 90F5 BCC MINIT1
0DBD ; ESTABLISH START ADDRESS OF G-PROGRAM
0DBD AD0623 LDA GBEGIN+GSTART ; MSB
0DC0 8581 STA GPCH
0DC2 AD0723 LDA GBEGIN+GSTART+1 ; LSB
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- INITIALIZATION PAGE 21
--- WARMSTART ROUTINE ---
0DC5 8580 STA GPCL
;***
0DC7 A901 LDA #$01 ; START OF GAME IS ALWAYS ON THE ODD BYTE
0DC9 8582 STA GPC0 ; OF THE [GSTART] WORD
0DCB A900 LDA #$00
0DCD 8583 STA GPCFLG
;***
0DCF ; FALL THROUGH TO MAIN LOOP ...
END
INCLUD MAIN.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 22
--- MAIN LOOP ---
0DCF A2FF MLOOP: LDX #$FF ; RESET THE
0DD1 9A TXS ; HARDWARE STACK
0DD2 E8 INX ; = 0
0DD3 866C STX NARGS ; CLEAR # ARGS
0DD5 20D21A JSR NEXTPC ; GET Z-BYTE INTO [A]
0DD8 856B STA OPCODE ; FLAGS ARE SET
0DDA IF DEBUG
0DDA LDA #0 ; BREAKPOINT #0
0DDA JSR DOBUG
0DDA LDA OPCODE
0DDA ENDIF
0DDA ; DECODE AN OPCODE
0DDA AA TAX ; SET FLAGS
0DDB 3003 BMI DC0 ; IF POSITIVE,
0DDD 4CA20E JMP OP2 ; IT'S A 2-OP
0DE0 C9E0 DC0: CMP #$E0 ; IS IT "CALL"?
0DE2 D003 BNE DC1
0DE4 4CF712 JMP GCALL
0DE7 C9B0 DC1: CMP #$B0
0DE9 B003 BCS DC2
0DEB 4C730E JMP OP1 ; OR MAYBE A 1-OP
0DEE C9C0 DC2: CMP #$C0
0DF0 B003 BCS OPEXT
0DF2 4C640E JMP OP0 ; PERHAPS A 0-OP
0DF5 ; --------------
0DF5 ; HANDLE AN X-OP
0DF5 ; --------------
0DF5 20D21A OPEXT: JSR NEXTPC ; GRAB ARGUMENT BYTE
0DF8 8575 STA ABYTE ; HOLD IT HERE
0DFA A200 LDX #0
0DFC 8676 STX ADEX ; INIT LOOP INDEX
0DFE F006 BEQ OPX1 ; JUMP INTO LOOP
0E00 A575 TOPX: LDA ABYTE ; GET ARG BYTE
0E02 0A ASL A ; SHIFT NEXT 2 ARG BITS
0E03 0A ASL A ; INTO BITS 7 & 6
0E04 8575 STA ABYTE ; HOLD FOR LATER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 23
--- MAIN LOOP ---
0E06 29C0 OPX1: AND #%11000000 ; MASK OUT GARBAGE BITS
0E08 D006 BNE OPX2
0E0A 20EE0E JSR GETLNG ; 00 = LONG IMMEDIATE
0E0D 4C210E JMP OPXNXT
0E10 C940 OPX2: CMP #%01000000 ; IS IT A SHORT IMMEDIATE?
0E12 D006 BNE OPX3 ; NO, KEEP GUESSING
0E14 20EA0E JSR GETSHT ; 01 = SHORT IMMEDIATE
0E17 4C210E JMP OPXNXT
0E1A C980 OPX3: CMP #%10000000 ; LAST TEST
0E1C D017 BNE OPX4 ; 11 = NO MORE ARGUMENTS
0E1E 20020F JSR GETVAR ; 10 = VARIABLE
0E21 A676 OPXNXT: LDX ADEX ; ARGUMENT INDEX
0E23 A578 LDA VALUE+LO ; GRAB LSB OF VALUE
0E25 956D STA ARG1+LO,X ; STORE IN ARGUMENT TABLE
0E27 A579 LDA VALUE+HI ; GRAB MSB OF VALUE
0E29 956E STA ARG1+HI,X ; STORE THAT, TOO
0E2B E66C INC NARGS ; UPDATE ARGUMENT COUNTER
0E2D E8 INX
0E2E E8 INX
0E2F 8676 STX ADEX ; UPDATE INDEX
0E31 E008 CPX #8 ; DONE 4 ARGUMENTS YET?
0E33 90CB BCC TOPX ; NO, GET SOME MORE
0E35 ; ALL X-OP ARGUMENTS READY
0E35 A56B OPX4: LDA OPCODE ; IS THIS
0E37 C9E0 CMP #$E0 ; AN EXTENDED 2-OP?
0E39 B003 BCS DOXOP ; NO, IT'S A REAL X-OP
0E3B 4CCB0E JMP OP2EX ; ELSE TREAT IT LIKE A 2-OP
0E3E A261 DOXOP: LDX #LOW OPTX ; GET ADDR OF X-OP TABLE
0E40 A010 LDY #HIGH OPTX ; INTO [X/Y]
0E42 291F AND #%00011111 ; ISOLATE OP ID BITS
0E44 C911 CMP #NOPSX ; IS IT A LEGAL X-OP?
0E46 9005 BCC DODIS ; YUP; TIME TO DISPATCH IT
0E48 ; *** ERROR #2: UNDEFINED X-OP ***
0E48 A902 LDA #2
0E4A 4C5F1C JMP GERROR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 24
--- MAIN LOOP ---
0E4D ; ---------------
0E4D ; OPCODE DISPATCH
0E4D ; ---------------
0E4D ; ENTRY: MASKED OPCODE INDEX IN [A]
0E4D ; OP-TABLE ADDR IN X/Y (LSB/MSB)
0E4D 867A DODIS: STX I+LO ; SAVE TABLE ADDRESS
0E4F 847B STY I+HI ; IN A POINTER
0E51 0A ASL A ; WORD-ALIGN THE OP INDEX
0E52 A8 TAY
0E53 B17A LDA (I),Y ; GET LSB OF DISPATCH ADDRESS
0E55 8D5F0E STA GO+LO ; INSTALL AS JSR OPERAND
0E58 C8 INY
0E59 B17A LDA (I),Y ; SAME WITH MSB
0E5B 8D600E STA GO+HI
0E5E 20 DB $20 ; 6502 "JSR" OPCODE
0E5F 0000 GO: DW $0000 ; DUMMY OPERAND BYTES
0E61 4CCF0D JMP MLOOP ; GO BACK FOR ANOTHER OPCODE
0E64 ; -------------
0E64 ; HANDLE A 0-OP
0E64 ; -------------
0E64 A21B OP0: LDX #LOW OPT0 ; GET ADDR OF 0-OP TABLE
0E66 A010 LDY #HIGH OPT0 ; INTO [X/Y]
0E68 290F AND #%00001111 ; ISOLATE OP ID BITS
0E6A C908 CMP #NOPS0 ; OUT OF RANGE?
0E6C 90DF BCC DODIS ; NO, DISPATCH
0E6E ; *** ERROR #3: UNDEFINED 0-OP ***
0E6E A903 LDA #3
0E70 4C5F1C JMP GERROR
0E73 ; -------------
0E73 ; HANDLE A 1-OP
0E73 ; -------------
0E73 2930 OP1: AND #%00110000 ; ISOLATE ARGUMENT BITS
0E75 D006 BNE OP1A
0E77 20EE0E JSR GETLNG ; 00 = LONG IMMEDIATE
0E7A 4C8E0E JMP OP1EX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 25
--- MAIN LOOP ---
0E7D C910 OP1A: CMP #%00010000 ; TEST AGAIN
0E7F D006 BNE OP1B
0E81 20EA0E JSR GETSHT ; 01 = SHORT IMMEDIATE
0E84 4C8E0E JMP OP1EX
0E87 C920 OP1B: CMP #%00100000 ; ONE MORE TEST
0E89 D012 BNE BADOP1 ; UNDEFINED STATE!
0E8B 20020F JSR GETVAR ; 10 = VARIABLE
0E8E 20DF0E OP1EX: JSR V2A1 ; VALUE TO [ARG1], UPDATE COUNT
0E91 A22B LDX #LOW OPT1 ; LSB OF DISPATCH TABLE
0E93 A010 LDY #HIGH OPT1 ; MSB
0E95 A56B LDA OPCODE ; RESTORE OPCODE
0E97 290F AND #%00001111 ; ISOLATE OP ID BITS
0E99 C909 CMP #NOPS1 ; IF WITHIN RANGE,
0E9B 90B0 BCC DODIS ; EXECUTE THE 1-OP
0E9D ; *** ERROR #4: UNDEFINED 1-OP ***
0E9D A904 BADOP1: LDA #4
0E9F 4C5F1C JMP GERROR
0EA2 ; -------------
0EA2 ; HANDLE A 2-OP
0EA2 ; -------------
0EA2 2940 OP2: AND #%01000000 ; ISOLATE 1ST ARG BIT
0EA4 D006 BNE OP2A
0EA6 20EA0E JSR GETSHT ; 0 = SHORT IMMEDIATE
0EA9 4CAF0E JMP OP2B
0EAC 20020F OP2A: JSR GETVAR ; 1 = VARIABLE
0EAF 20DF0E OP2B: JSR V2A1 ; VALUE TO [ARG1], UPDATE COUNT
0EB2 A56B LDA OPCODE ; RESTORE OPCODE BYTE
0EB4 2920 AND #%00100000 ; ISOLATE 2ND ARG BIT
0EB6 D006 BNE OP2C
0EB8 20EA0E JSR GETSHT ; 0 = SHORT IMMEDIATE
0EBB 4CC10E JMP OP2D
0EBE 20020F OP2C: JSR GETVAR ; 1 = VARIABLE
0EC1 A578 OP2D: LDA VALUE+LO ; MOVE VALUE TO [ARG2]
0EC3 856F STA ARG2+LO
0EC5 A579 LDA VALUE+HI
0EC7 8570 STA ARG2+HI
0EC9 E66C INC NARGS ; UPDATE COUNT
0ECB ; ENTRY FOR EXTENDED 2-OPS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 26
--- MAIN LOOP ---
0ECB A23D OP2EX: LDX #LOW OPT2 ; LSB OF DISPATCH TABLE
0ECD A010 LDY #HIGH OPT2 ; MSB
0ECF A56B LDA OPCODE ; RESTORE OPCODE BYTE
0ED1 291F AND #%00011111 ; ISOLATE OP ID BITS
0ED3 C912 CMP #NOPS2
0ED5 B003 BCS BADOP2 ; ERROR IF OUT OF RANGE
0ED7 4C4D0E JMP DODIS ; ELSE DISPATCH
0EDA ; *** ERROR #5: UNDEFINED 2-OP ****
0EDA A905 BADOP2: LDA #5
0EDC 4C5F1C JMP GERROR
0EDF ; --------------------------------------
0EDF ; MOVE [VALUE] TO [ARG1], UPDATE [NARGS]
0EDF ; --------------------------------------
0EDF A578 V2A1: LDA VALUE+LO
0EE1 856D STA ARG1+LO
0EE3 A579 LDA VALUE+HI
0EE5 856E STA ARG1+HI
0EE7 E66C INC NARGS
0EE9 60 RTS
END
INCLUD SUBS.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 27
--- OPCODE SUPPORT SUBROUTINES ---
0EEA ; -----------------------
0EEA ; FETCH A SHORT IMMEDIATE
0EEA ; -----------------------
0EEA A900 GETSHT: LDA #0 ; CLEAR MSB OF [VALUE]
0EEC F003 BEQ GLG ; AND GRAB LSB
0EEE ; ----------------------
0EEE ; FETCH A LONG IMMEDIATE
0EEE ; ----------------------
0EEE 20D21A GETLNG: JSR NEXTPC ; GRAB MSB
0EF1 8579 GLG: STA VALUE+HI ; STORE IT
0EF3 20D21A JSR NEXTPC ; GRAB LSB
0EF6 8578 STA VALUE+LO ; STORE THAT TOO
0EF8 60 RTS
0EF9 ; ----------------
0EF9 ; FETCH A VARIABLE
0EF9 ; ----------------
0EF9 ; FROM WITHIN AN OPCODE (VARIABLE ID IN [A])
0EF9 AA VARGET: TAX ; IF NON-ZERO,
0EFA D00B BNE GETVR1 ; ACCESS A VARIABLE
0EFC 20280F JSR POPVAL ; ELSE PULL VAR OFF Z-STACK
0EFF 4C3E0F JMP PSHVAL ; WITHOUT ALTERING STACK
0F02 ; FROM THE MAIN LOOP (ID BYTE IN Z-CODE)
0F02 20D21A GETVAR: JSR NEXTPC ; GRAB VAR-TYPE BYTE
0F05 F021 BEQ POPVAL ; VALUE IS ON Z-STACK
0F07 ; IS VARIABLE LOCAL OR GLOBAL?
0F07 C910 GETVR1: CMP #$10 ; IF >= 16,
0F09 B010 BCS GETVRG ; IT'S GLOBAL
0F0B ; HANDLE A LOCAL VARIABLE
0F0B 38 GETVRL: SEC
0F0C E901 SBC #1 ; FORM A ZERO-ALIGNED
0F0E 0A ASL A ; WORD INDEX
0F0F AA TAX ; INTO THE [LOCALS]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 28
--- OPCODE SUPPORT SUBROUTINES ---
0F10 BD800A LDA LOCALS+LO,X ; GRAB LSB
0F13 8578 STA VALUE+LO
0F15 BD810A LDA LOCALS+HI,X ; AND MSB
0F18 8579 STA VALUE+HI
0F1A 60 RTS
0F1B ; HANDLE A GLOBAL VARIABLE
0F1B 208C0F GETVRG: JSR GVCALC ; GET ADDRESS OF GLOBAL INTO [I]
0F1E B17A LDA (I),Y ; MSB OF GLOBAL ([Y] = 0)
0F20 8579 STA VALUE+HI
0F22 C8 INY ; = 1
0F23 B17A LDA (I),Y ; LSB OF GLOBAL
0F25 8578 STA VALUE+LO ; SAVE IT
0F27 60 RTS ; AND WE'RE DONE
0F28 ; ----------------------------------
0F28 ; POP G-STACK INTO [VALUE] AND [X/A]
0F28 ; ----------------------------------
0F28 C68E POPVAL: DEC GSP
0F2A F00D BEQ UNDER ; UNDERFLOW IF ZERO!
0F2C A48E LDY GSP ; READ STACK POINTER
0F2E BE0005 LDX GSTAKL,Y ; GRAB LSB OF STACK VALUE
0F31 8678 STX VALUE+LO ; GIVE TO [VALUE]
0F33 B90006 LDA GSTAKH,Y ; ALSO GRAB MSB
0F36 8579 STA VALUE+HI ; A SIMILAR FATE
0F38 60 RTS
0F39 ; *** ERROR #6: G-STACK UNDERFLOW ***
0F39 A906 UNDER: LDA #6
0F3B 4C5F1C JMP GERROR
0F3E ; -----------------------
0F3E ; PUSH [VALUE] TO G-STACK
0F3E ; -----------------------
0F3E A678 PSHVAL: LDX VALUE+LO
0F40 A579 LDA VALUE+HI
0F42 ; FALL THROUGH ...
0F42 ; ---------------------
0F42 ; PUSH [X/A] TO G-STACK
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 29
--- OPCODE SUPPORT SUBROUTINES ---
0F42 ; ---------------------
0F42 A48E PSHXA: LDY GSP
0F44 990006 STA GSTAKH,Y
0F47 8A TXA
0F48 990005 STA GSTAKL,Y
0F4B E68E INC GSP
0F4D F001 BEQ OVER ; OVERFLOW IF ZEROED!
0F4F 60 RTS
0F50 ; *** ERROR #7: G-STACK OVERFLOW ***
0F50 A907 OVER: LDA #7
0F52 4C5F1C JMP GERROR
0F55 ; --------------
0F55 ; RETURN A VALUE
0F55 ; --------------
0F55 ; FROM WITHIN AN OPCODE (VARIABLE ID IN [A])
0F55 AA VARPUT: TAX ; IF ZERO,
0F56 D013 BNE PUTVR1
0F58 C68E DEC GSP ; FLUSH TOP WORD OFF STACK
0F5A D0E2 BNE PSHVAL ; AND REPLACE WITH [VALUE]
0F5C F0DB BEQ UNDER ; ERROR IF ZSP BECAME ZERO!
0F5E ; RETURN A ZERO
0F5E A900 RET0: LDA #0
0F60 ; RETURN BYTE IN [A]
0F60 8578 PUTBYT: STA VALUE+LO
0F62 A900 LDA #0
0F64 8579 STA VALUE+HI ; CLEAR MSB
0F66 ; RETURN [VALUE]; VARIABLE ID IN NEXT Z-BYTE
0F66 20D21A PUTVAL: JSR NEXTPC ; GET VAR-TYPE BYTE
0F69 F0D3 BEQ PSHVAL ; VALUE GOES TO STACK IF ZERO
0F6B ; LOCAL OR GLOBAL VARIABLE?
0F6B C910 PUTVR1: CMP #$10 ; IF >= 16,
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 30
--- OPCODE SUPPORT SUBROUTINES ---
0F6D B010 BCS PUTVLG ; IT'S GLOBAL
0F6F ; PUT A LOCAL VARIABLE
0F6F 38 PUTVLL: SEC
0F70 E901 SBC #1 ; FORM A ZERO-ALIGNED
0F72 0A ASL A ; WORD INDEX
0F73 AA TAX ; INTO [LOCALS]
0F74 A578 LDA VALUE+LO ; GRAB LSB
0F76 9D800A STA LOCALS+LO,X ; SAVE IN LOCAL TABLE
0F79 A579 LDA VALUE+HI ; DO SAME TO
0F7B 9D810A STA LOCALS+HI,X ; MSB
0F7E 60 RTS
0F7F ; PUT A GLOBAL VARIABLE
0F7F 208C0F PUTVLG: JSR GVCALC ; GET ADDR OF GLOBAL INTO [I]
0F82 A579 LDA VALUE+HI ; GET MSB
0F84 917A STA (I),Y ; STORE AS 1ST BYTE ([Y] = 0)
0F86 C8 INY ; [Y] = 1
0F87 A578 LDA VALUE+LO ; NOW GET LSB
0F89 917A STA (I),Y ; STORE AS 2ND BYTE
0F8B 60 RTS
0F8C ; -----------------------
0F8C ; CALC GLOBAL WORD OFFSET
0F8C ; -----------------------
0F8C ; ENTRY: VAR-ID BYTE (16-255) IN [A]
0F8C ; EXIT: ADDRESS OF GLOBAL VAR IN [VAL]
0F8C ; [Y] = 0 FOR INDEXING
0F8C 38 GVCALC: SEC
0F8D E910 SBC #$10 ; FORM A ZERO-ALIGNED INDEX
0F8F A000 LDY #0 ; MAKE SURE MSB OF OFFSET AND [Y]
0F91 847B STY I+HI ; ARE CLEARED
0F93 0A ASL A ; MULTIPLY OFFSET BY 2
0F94 267B ROL I+HI ; TO WORD-ALIGN IT
0F96 18 CLC ; TO ADDRESS OF GLOBAL TABLE
0F97 659C ADC GLOBAL+LO ; TO FORM THE ABSOLUTE
0F99 857A STA I+LO ; ADDRESS OF THE
0F9B A57B LDA I+HI ; DESIRED GLOBAL VARIABLE
0F9D 659D ADC GLOBAL+HI ; STORE ADDRESS BACK IN [I]
0F9F 857B STA I+HI ; AS A POINTER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 31
--- OPCODE SUPPORT SUBROUTINES ---
0FA1 60 WCEX: RTS
0FA2 ; ---------------
0FA2 ; PREDICATE FAILS
0FA2 ; ---------------
0FA2 20D21A PREDF: JSR NEXTPC ; GET 1ST BRANCH BYTE
0FA5 100C BPL PREDB ; BRANCH IF BIT 7 CLEAR
0FA7 ; -----------------------
0FA7 ; IGNORE PREDICATE BRANCH
0FA7 ; -----------------------
0FA7 ; ENTRY: 1ST BRANCH BYTE IN [A]
0FA7 2940 PREDNB: AND #%01000000 ; TEST BIT 6
0FA9 D0F6 BNE WCEX ; SHORT BRANCH IF SET
0FAB 4CD21A JMP NEXTPC ; ELSE SKIP OVER 2ND BRANCH BYTE
0FAE ; ------------------
0FAE ; PREDICATE SUCCEEDS
0FAE ; ------------------
0FAE 20D21A PREDS: JSR NEXTPC ; GET 1ST BRANCH BYTE
0FB1 10F4 BPL PREDNB ; DON'T BRANCH IF BIT 7 CLEAR
0FB3 ; --------------------------
0FB3 ; PERFORM A PREDICATE BRANCH
0FB3 ; --------------------------
0FB3 ; ENTRY: 1ST PRED BYTE IN [A]
0FB3 AA PREDB: TAX ; COPY FOR LATER
0FB4 2940 AND #%01000000 ; LONG OR SHORT BRANCH?
0FB6 F00B BEQ PREDLB ; LONG IF BIT 6 IS CLEAR
0FB8 ; HANDLE A SHORT BRANCH
0FB8 8A TXA ; RESTORE PRED BYTE
0FB9 293F AND #%00111111 ; FORM SHORT OFFSET
0FBB 8578 STA VALUE+LO ; USE AS LSB OF BRANCH OFFSET
0FBD A900 LDA #0
0FBF 8579 STA VALUE+HI ; MSB OF OFFSET IS ZERO
0FC1 F013 BEQ PREDB1 ; DO THE BRANCH
0FC3 ; HANDLE A LONG BRANCH
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 32
--- OPCODE SUPPORT SUBROUTINES ---
0FC3 8A PREDLB: TXA ; RESTORE 1ST PRED BYTE
0FC4 293F AND #%00111111 ; FORM MSB OF OFFSET
0FC6 AA TAX ; SAVE HERE FOR REFERENCE
0FC7 2920 AND #%00100000 ; CHECK SIGN OF 14-BIT VALUE
0FC9 F004 BEQ DOB2 ; POSITIVE IF ZERO, USE [X] FOR MSB
0FCB 8A TXA ; ELSE RESTORE BYTE
0FCC 09E0 ORA #%11100000 ; EXTEND SIGN BIT
0FCE AA TAX ; BACK HERE FOR STORAGE
0FCF 8679 DOB2: STX VALUE+HI
0FD1 20D21A JSR NEXTPC ; FETCH LSB OF 14-BIT OFFSET
0FD4 8578 STA VALUE+LO
0FD6 ; BRANCH TO Z-ADDRESS IN [VALUE]
0FD6 A579 PREDB1: LDA VALUE+HI ; CHECK MSB OF OFFSET
0FD8 D00E BNE PREDB3 ; DO BRANCH IF NZ
0FDA A578 LDA VALUE+LO ; IF LSB IS NON-ZERO,
0FDC D003 BNE PREDB2 ; MAKE SURE IT ISN'T 1
0FDE 4C8E10 JMP GRFALS ; ELSE DO AN "RFALSE" IF [VALUE] = 0
0FE1 C901 PREDB2: CMP #1 ; IF OFFSET = 1
0FE3 D003 BNE PREDB3
0FE5 4C8310 JMP GRTRUE ; DO AN "RTRUE"
0FE8 ; ENTRY POINT FOR "JUMP"
0FE8 200610 PREDB3: JSR DECVAL ; CALC [VALUE]-2
0FEB 200610 JSR DECVAL
;***
0FEE A579 LDA VALUE+HI
0FF0 A678 LDX VALUE+LO
0FF2 20D918 JSR ADDGPC
0FF5 A579 LDA VALUE+HI ; EXTEND SIGN
0FF7 2980 AND #$80
0FF9 18 CLC
0FFA 6581 ADC GPCH
0FFC 8581 STA GPCH
;***
; LDA VALUE+LO ; GET LSB OF OFFSET
; CLC
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 33
--- OPCODE SUPPORT SUBROUTINES ---
; ADC GPCL ; ADD LSB OF GPC
; BCC PREDB5 ; IF OVERFLOWED,
; INC VALUE+HI ; UPDATE MSB OF OFFSET
;PREDB5: STA GPCL ; UPDATE ZPCL
; LDA VALUE+HI ; IF MSB IS ZERO,
; BEQ GNOOP ; PAGE IS STILL VALID
; CLC
; ADC GPCH
; STA GPCH ; ELSE SWITCH PAGES
; LDA #0 ; INVALIDATE [GPC]
; STA GPCFLG
0FFE ; FALL THROUGH ...
0FFE ; ----
0FFE ; NOOP
0FFE ; ----
0FFE 60 GNOOP: RTS
0FFF ; -----------------
0FFF ; INCREMENT [VALUE]
0FFF ; -----------------
0FFF E678 INCVAL: INC VALUE+LO
1001 D002 BNE IVX
1003 E679 INC VALUE+HI
1005 60 IVX: RTS
1006 ; -----------------
1006 ; DECREMENT [VALUE]
1006 ; -----------------
1006 A578 DECVAL: LDA VALUE+LO
1008 38 SEC
1009 E901 SBC #1
100B 8578 STA VALUE+LO
100D B002 BCS DVX
100F C679 DEC VALUE+HI
1011 60 DVX: RTS
1012 ; ----------------------
1012 ; MOVE [ARG1] TO [VALUE]
1012 ; ----------------------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 34
--- OPCODE SUPPORT SUBROUTINES ---
1012 A56D A12VAL: LDA ARG1+LO
1014 8578 STA VALUE+LO
1016 A56E LDA ARG1+HI
1018 8579 STA VALUE+HI
101A 60 RTS
END
INCLUD DISPATCH.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 35
--- OPCODE DISPATCH TABLES ---
101B ; -------------------
101B ; 0-OP DISPATCH TABLE
101B ; -------------------
101B FE0F OPT0: DW GNOOP ; 0
101D 8310 DW GRTRUE ; 1
101F 8E10 DW GRFALS ; 2
1021 9210 DW GRSTAK ; 3
1023 280F DW GFSTAK ; 4
1025 7A1C DW GQUIT ; 5
1027 AE0F DW GCOPYP ; 6
1029 461E DW GVERP ; 7
0008 NOPS0 EQU 8 ; # VALID 0-OPS
102B ; -------------------
102B ; 1-OP DISPATCH TABLE
102B ; -------------------
102B 9810 OPT1: DW GPUSH ; 0
102D 9F10 DW GPOP ; 1
102F A510 DW GVALUE ; 2
1031 AD10 DW GINC ; 3
1033 B810 DW GDEC ; 4
1035 C510 DW GZEROP ; 5
1037 D110 DW GBNOT ; 6
1039 DD10 DW GJUMP ; 7
103B E310 DW GRET ; 8
0009 NOPS1 EQU 9 ; # VALID 1-OPS
103D ; -------------------
103D ; 2-OP DISPATCH TABLE
103D ; -------------------
103D DA0E OPT2: DW BADOP2 ; 0, UNDEFINED
103F 2511 DW GADD ; 1
1041 3211 DW GSUB ; 2
1043 3F11 DW GMUL ; 3
1045 6311 DW GDIV ; 4
1047 6D11 DW GMOD ; 5
1049 0312 DW GBAND ; 6
104B 0F12 DW GBIOR ; 7
104D 1B12 DW GBXOR ; 8
104F 2712 DW GBITSP ; 9
1051 3912 DW GEQP ; 10
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- MAIN LOOP PAGE 36
--- OPCODE DISPATCH TABLES ---
1053 6512 DW GLESSP ; 11
1055 6B12 DW GDLESP ; 12
1057 7912 DW GGRTRP ; 13
1059 8412 DW GIGRTP ; 14
105B B412 DW GSET ; 15
105D C112 DW GGET ; 16
105F D512 DW GGETB ; 17
0012 NOPS2 EQU 18 ; # VALID 2-OPS
1061 ; -------------------
1061 ; X-OP DISPATCH TABLE
1061 ; -------------------
1061 F712 OPTX: DW GCALL ; 0
1063 F113 DW GPUT ; 1
1065 FC13 DW GPUTB ; 2
1067 241D DW GINPUT ; 3
1069 BD14 DW GSHOWI ; 4
106B 8816 DW GSETI ; 5
106D BC16 DW GSWAPI ; 6
106F 251E DW GSOUND ; 7
1071 3F14 DW GRAND ; 8
1073 1F1C DW GCLEAR ; 9
1075 B714 DW GSHOWN ; 10
1077 1C17 DW GWIND ; 11
1079 6114 DW GITER ; 12
107B B414 DW GLOAD ; 13
107D B114 DW GDUMP ; 14
107F D01F DW GREST ; 15
1081 6D20 DW GSAVE ; 16
0011 NOPSX EQU 17 ; # VALID X-OPS
END
INCLUD OPS0.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 37
--- 0-OPS ---
1083 ; -----
1083 ; RTRUE
1083 ; -----
1083 ; SIMULATE "RETURN 1"
1083 A201 GRTRUE: LDX #1
1085 A900 GRT1: LDA #0
1087 866D GRT2: STX ARG1+LO
1089 856E STA ARG1+HI
108B 4CE310 JMP GRET
108E ; ------
108E ; RFALSE
108E ; ------
108E ; SIMULATE "RETURN 0"
108E A200 GRFALS: LDX #0
1090 F0F3 BEQ GRT1
1092 ; ------
1092 ; RSTACK
1092 ; ------
1092 ; "RETURN" WITH VALUE ON STACK
1092 20280F GRSTAK: JSR POPVAL ; GET VALUE INTO [X/A]
1095 4C8710 JMP GRT2
1098 ; ------
1098 ; FSTACK
1098 ; ------
1098 ; FLUSH TOP VALUE OFF G-STACK
0F28 GFSTAK EQU POPVAL
END
INCLUD OPS1.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 38
--- 1-OPS ---
1098 ; ----
1098 ; PUSH
1098 ; ----
1098 ; PUSH [ARG1] ONTO G-STACK
1098 A66D GPUSH: LDX ARG1+LO
109A A56E LDA ARG1+HI
109C 4C420F JMP PSHXA
109F ; ---
109F ; POP
109F ; ---
109F ; POP Z-STACK INTO VARIABLE [ARG1]
109F 20280F GPOP: JSR POPVAL
10A2 4CC010 JMP DOPUT
10A5 ; -----
10A5 ; VALUE
10A5 ; -----
10A5 ; RETURN VALUE OF VARIABLE [ARG1]
10A5 A56D GVALUE: LDA ARG1+LO ; GET VARIABLE ID
10A7 20F90E JSR VARGET ; PUT VALUE INTO [VALUE]
10AA 4C660F JMP PUTVAL
10AD ; ---
10AD ; INC
10AD ; ---
10AD ; INCREMENT VARIABLE [ARG1]
10AD A56D GINC: LDA ARG1+LO
10AF 20F90E JSR VARGET
10B2 20FF0F JSR INCVAL
10B5 4CC010 JMP DOPUT
10B8 ; ---
10B8 ; DEC
10B8 ; ---
10B8 ; DECREMENT VARIABLE [ARG1]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 39
--- 1-OPS ---
10B8 A56D GDEC: LDA ARG1+LO
10BA 20F90E JSR VARGET
10BD 200610 JSR DECVAL
10C0 A56D DOPUT: LDA ARG1+LO
10C2 4C550F JMP VARPUT
10C5 ; -----
10C5 ; ZERO?
10C5 ; -----
10C5 ; [ARG1] = 0 ?
10C5 A56D GZEROP: LDA ARG1+LO
10C7 056E ORA ARG1+HI
10C9 F003 BEQ PYES
10CB 4CA20F JMP PREDF
10CE 4CAE0F PYES: JMP PREDS
10D1 ; ----
10D1 ; BNOT
10D1 ; ----
10D1 ; COMPLEMENT [ARG1]
10D1 A56D GBNOT: LDA ARG1+LO
10D3 49FF EOR #$FF
10D5 AA TAX
10D6 A56E LDA ARG1+HI
10D8 49FF EOR #$FF
10DA 4C1E11 JMP VEXIT
10DD ; ----
10DD ; JUMP
10DD ; ----
10DD ; JUMP TO G-ADDRESS [ARG1]
10DD 201210 GJUMP: JSR A12VAL ; MOVE [ARG1] TO [VALUE]
10E0 4CE80F JMP PREDB3 ; A BRANCH THAT ALWAYS SUCCEEDS
10E3 ; ------
10E3 ; RETURN
10E3 ; ------
10E3 ; RETURN FROM "CALL" WITH VALUE [ARG1]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 40
--- 1-OPS ---
10E3 A58F GRET: LDA OLDGSP
10E5 858E STA GSP ; SYNC THE G-STACK
10E7 20280F JSR POPVAL ; POP # LOCALS INTO [X]
10EA 8A TXA ; ANY LOCALS?
10EB F018 BEQ RET2 ; NO, SKIP
10ED ; RESTORE ALL PUSHED LOCALS
10ED 0A ASL A ; WORD-ALIGN # LOCALS
10EE 8576 STA ADEX ; USE FOR INDEXING
10F0 C676 DEC ADEX ; ZERO-ALIGN THE INDEX
10F2 20280F RET1: JSR POPVAL ; POP LOCAL INTO [X/A] AND [VALUE]
10F5 A676 LDX ADEX ; GET INDEX
10F7 9D800A STA LOCALS,X ; STORE MSB IN TABLE
10FA CA DEX
10FB A578 LDA VALUE+LO ; SAME FOR LSB
10FD 9D800A STA LOCALS,X
1100 CA DEX
1101 8676 STX ADEX ; SAVE INDEX
1103 10ED BPL RET1 ; LOOP TILL EMPTY
1105 ; RESTORE GPC
1105 20280F RET2: JSR POPVAL ; RESTORE [GPC]
;***
1108 8682 STX GPC0 ; DON'T FORGET THAT 17TH BIT
110A 20280F JSR POPVAL
;***
110D 8680 STX GPCL
110F 8581 STA GPCH
1111 A900 LDA #0
1113 8583 STA GPCFLG ; PC HAS CHANGED
1115 20280F JSR POPVAL
1118 868F STX OLDGSP ; RESTORE OLD GSP
111A A66D LDX ARG1+LO
111C A56E LDA ARG1+HI
111E ; FALL THROUGH TO ...
111E ; -----------------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 41
--- 1-OPS ---
111E ; VALUE RETURN EXIT
111E ; -----------------
111E ; ENTRY: VALUE IN [X/A] (LSB/MSB)
111E 8678 VEXIT: STX VALUE+LO
1120 8579 STA VALUE+HI
1122 4C660F JMP PUTVAL
END
INCLUD OPS2.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 42
--- 2-OPS ---
1125 ; ---
1125 ; ADD
1125 ; ---
1125 ; RETURN [ARG1] + [ARG2]
1125 A56D GADD: LDA ARG1+LO
1127 18 CLC
1128 656F ADC ARG2+LO
112A AA TAX
112B A56E LDA ARG1+HI
112D 6570 ADC ARG2+HI
112F 4C1E11 JMP VEXIT
1132 ; ---
1132 ; SUB
1132 ; ---
1132 ; RETURN [ARG1] - [ARG2]
1132 A56D GSUB: LDA ARG1+LO
1134 38 SEC
1135 E56F SBC ARG2+LO
1137 AA TAX
1138 A56E LDA ARG1+HI
113A E570 SBC ARG2+HI
113C 4C1E11 JMP VEXIT
113F ; ---
113F ; MUL
113F ; ---
113F ; RETURN [ARG1] * [ARG2]
113F 20F911 GMUL: JSR MINIT ; INIT LOOP AND TEMPS
1142 66A9 GMLOOP: ROR MTEMP+HI
1144 66A8 ROR MTEMP+LO
1146 6670 ROR ARG2+HI
1148 666F ROR ARG2+LO
114A 900D BCC GMNEXT
114C A56D LDA ARG1+LO
114E 18 CLC
114F 65A8 ADC MTEMP+LO
1151 85A8 STA MTEMP+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 43
--- 2-OPS ---
1153 A56E LDA ARG1+HI
1155 65A9 ADC MTEMP+HI
1157 85A9 STA MTEMP+HI
1159 CA GMNEXT: DEX
115A 10E6 BPL GMLOOP
115C A66F LDX ARG2+LO ; [ARG2] CONTAINS PRODUCT
115E A570 LDA ARG2+HI
1160 4C1E11 JMP VEXIT
1163 ; ---
1163 ; DIV
1163 ; ---
1163 ; RETURN QUOTIENT OF [ARG1] / [ARG2]
1163 207711 GDIV: JSR DIVIDE
1166 A6A4 LDX QUOT+LO
1168 A5A5 LDA QUOT+HI
116A 4C1E11 JMP VEXIT
116D ; ---
116D ; MOD
116D ; ---
116D ; RETURN REMAINDER OF [ARG1] / [ARG2]
116D 207711 GMOD: JSR DIVIDE
1170 A6A6 LDX REMAIN+LO
1172 A5A7 LDA REMAIN+HI
1174 4C1E11 JMP VEXIT
1177 ; ---------------
1177 ; SIGNED DIVISION
1177 ; ---------------
1177 ; ENTRY: DIVIDEND IN [ARG1], DIVISOR IN [ARG2]
1177 ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN]
1177 A56E DIVIDE: LDA ARG1+HI ; SIGN OF THE DIVIDEND
1179 85AB STA RSIGN ; IS SIGN OF REMAINDER
117B 4570 EOR ARG2+HI ; SIGN OF QUOTIENT IS POSITIVE
117D 85AA STA QSIGN ; IF SIGNS OF TERMS ARE THE SAME
117F A56D LDA ARG1+LO ; MOVE [ARG1] TO [QUOT]
1181 85A4 STA QUOT+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 44
--- 2-OPS ---
1183 A56E LDA ARG1+HI ; IS DIVIDEND POSITIVE?
1185 85A5 STA QUOT+HI
1187 1003 BPL ABSDIV ; YES, CONTINUE
1189 20B511 JSR ABQUOT ; ELSE CALC ABSOLUTE VALUE
118C A56F ABSDIV: LDA ARG2+LO ; MOVE [ARG2] TO [REMAIN]
118E 85A6 STA REMAIN+LO
1190 A570 LDA ARG2+HI ; IS DIVISOR POSITIVE?
1192 85A7 STA REMAIN+HI
1194 1003 BPL GODIV ; IF NOT,
1196 20A711 JSR ABREM ; CALC ABSOLUTE VALUE
1199 20C311 GODIV: JSR UDIV ; UNSIGNED DIVIDE
119C A5AA LDA QSIGN ; SHOULD QUOTIENT BE FLIPPED?
119E 1003 BPL RFLIP ; NO, CHECK REMAINDER
11A0 20B511 JSR ABQUOT ; ELSE FLIP QUOTIENT
11A3 A5AB RFLIP: LDA RSIGN ; FLIP REMAINDER?
11A5 100D BPL DIVEX ; NO, SCRAM
11A7 ; OR FALL THROUGH ...
11A7 ; ----------------
11A7 ; CALC ABS(REMAIN)
11A7 ; ----------------
11A7 A900 ABREM: LDA #0
11A9 38 SEC
11AA E5A6 SBC REMAIN+LO
11AC 85A6 STA REMAIN+LO
11AE A900 LDA #0
11B0 E5A7 SBC REMAIN+HI
11B2 85A7 STA REMAIN+HI
11B4 60 DIVEX: RTS
11B5 ; --------------
11B5 ; CALC ABS(QUOT)
11B5 ; --------------
11B5 A900 ABQUOT: LDA #0
11B7 38 SEC
11B8 E5A4 SBC QUOT+LO
11BA 85A4 STA QUOT+LO
11BC A900 LDA #0
11BE E5A5 SBC QUOT+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 45
--- 2-OPS ---
11C0 85A5 STA QUOT+HI
11C2 60 RTS
11C3 ; -----------------
11C3 ; UNSIGNED DIVISION
11C3 ; -----------------
11C3 ; ENTRY: DIVIDEND IN [QUOT], DIVISOR IN [REMAIN]
11C3 ; EXIT: QUOTIENT IN [QUOT], REMAINDER IN [REMAIN]
11C3 A5A6 UDIV: LDA REMAIN+LO
11C5 05A7 ORA REMAIN+HI
11C7 F02B BEQ DIVERR ; CAN'T DIVIDE BY ZERO!
11C9 20F911 JSR MINIT ; INIT LOOP & TEMP REGISTER
11CC 26A4 UDLOOP: ROL QUOT+LO
11CE 26A5 ROL QUOT+HI
11D0 26A8 ROL MTEMP+LO
11D2 26A9 ROL MTEMP+HI
11D4 A5A8 LDA MTEMP+LO
11D6 38 SEC
11D7 E5A6 SBC REMAIN+LO
11D9 A8 TAY
11DA A5A9 LDA MTEMP+HI
11DC E5A7 SBC REMAIN+HI
11DE 9004 BCC UDNEXT
11E0 84A8 STY MTEMP+LO
11E2 85A9 STA MTEMP+HI
11E4 CA UDNEXT: DEX
11E5 D0E5 BNE UDLOOP
11E7 26A4 ROL QUOT+LO ; SHIFT LAST CARRY
11E9 26A5 ROL QUOT+HI ; INTO QUOTIENT
11EB A5A8 LDA MTEMP+LO ; MOVE REMAINDER
11ED 85A6 STA REMAIN+LO ; INTO [REMAIN]
11EF A5A9 LDA MTEMP+HI
11F1 85A7 STA REMAIN+HI
11F3 60 RTS
11F4 ; *** ERROR #8: DIVISION BY ZERO ***
11F4 A908 DIVERR: LDA #8
11F6 4C5F1C JMP GERROR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 46
--- 2-OPS ---
11F9 ; ---------
11F9 ; MATH INIT
11F9 ; ---------
11F9 A210 MINIT: LDX #16 ; INIT BIT LOOP INDEX
11FB A900 LDA #0 ; CLEAR TEMP MATH REGISTER
11FD 85A8 STA MTEMP+LO
11FF 85A9 STA MTEMP+HI
1201 18 CLC ; CLEAR FOR LOOPING
1202 60 RTS
1203 ; ----
1203 ; BAND
1203 ; ----
1203 ; RETURN [ARG1] "AND" [ARG2]
1203 A56D GBAND: LDA ARG1+LO
1205 256F AND ARG2+LO
1207 AA TAX
1208 A56E LDA ARG1+HI
120A 2570 AND ARG2+HI
120C 4C1E11 JMP VEXIT
120F ; ----
120F ; BIOR
120F ; ----
120F ; RETURN [ARG1] "OR" [ARG2]
120F A56D GBIOR: LDA ARG1+LO
1211 056F ORA ARG2+LO
1213 AA TAX
1214 A56E LDA ARG1+HI
1216 0570 ORA ARG2+HI
1218 4C1E11 JMP VEXIT
121B ; ----
121B ; BXOR
121B ; ----
121B ; RETURN [ARG1] "XOR" [ARG2]
121B A56D GBXOR: LDA ARG1+LO
121D 456F EOR ARG2+LO
121F AA TAX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 47
--- 2-OPS ---
1220 A56E LDA ARG1+HI
1222 4570 EOR ARG2+HI
1224 4C1E11 JMP VEXIT
1227 ; -----
1227 ; BITS?
1227 ; -----
1227 ; IS EVERY "ON" BIT IN [ARG1] ALSO "ON" IN [ARG2]?
1227 A56F GBITSP: LDA ARG2+LO
1229 256D AND ARG1+LO
122B C56F CMP ARG2+LO
122D D033 BNE PBAD
122F A570 LDA ARG2+HI
1231 256E AND ARG1+HI
1233 C570 CMP ARG2+HI
1235 D02B BNE PBAD
1237 F026 BEQ PGOOD
1239 ; ------
1239 ; EQUAL?
1239 ; ------
1239 ; DOES [ARG1] = [ARG2] (OR [ARG3] OR [ARG4])?
1239 C66C GEQP: DEC NARGS ; ZERO-ALIGN ARGUMENT COUNT
123B A66D LDX ARG1+LO ; FETCH LSB AND
123D A56E LDA ARG1+HI ; MSB OF [ARG1]
123F E46F CPX ARG2+LO ; LSB OF [ARG2] MATCHED?
1241 D004 BNE EQP1 ; NO, TRY NEXT ARG
1243 C570 CMP ARG2+HI ; MSBS MATCH?
1245 F018 BEQ PGOOD ; HOORAY!
1247 C66C EQP1: DEC NARGS ; OUT OF ARGS YET?
1249 F017 BEQ PBAD ; IF SO, SCRAM
124B E471 CPX ARG3+LO ; ELSE CHECK [ARG3]
124D D004 BNE EQP2
124F C572 CMP ARG3+HI
1251 F00C BEQ PGOOD
1253 C66C EQP2: DEC NARGS ; ANOTHER ARG?
1255 F00B BEQ PBAD ; NO, EXIT
1257 E473 CPX ARG4+LO ; ELSE CHECK [ARG4]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 48
--- 2-OPS ---
1259 D007 BNE PBAD
125B C574 CMP ARG4+HI
125D D003 BNE PBAD
125F 4CAE0F PGOOD: JMP PREDS
1262 4CA20F PBAD: JMP PREDF
1265 ; -----
1265 ; LESS?
1265 ; -----
1265 ; IS [ARG1] < [ARG2]?
1265 201210 GLESSP: JSR A12VAL ; MOVE [ARG1] INTO [VALUE]
1268 4C6E12 JMP DLS0
126B ; ------
126B ; DLESS?
126B ; ------
126B ; DECREMENT [ARG1]; SUCCEED IF < [ARG2]
126B 20B810 GDLESP: JSR GDEC
126E A56F DLS0: LDA ARG2+LO ; MOVE [ARG2]
1270 857A STA I+LO ; INTO [I]
1272 A570 LDA ARG2+HI
1274 857B STA I+HI
1276 4C9712 JMP COMPAR ; [ARG1]-1 IS ALREADY IN [VALUE]
1279 ; -----
1279 ; GRTR?
1279 ; -----
1279 ; IS [ARG1] > [ARG2]?
1279 A56D GGRTRP: LDA ARG1+LO ; MOVE [ARG1]
127B 857A STA I+LO ; INTO [I]
127D A56E LDA ARG1+HI
127F 857B STA I+HI
1281 4C8F12 JMP A2VAL
1284 ; ------
1284 ; IGRTR?
1284 ; ------
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 49
--- 2-OPS ---
1284 ; INCREMENT [ARG1]; SUCCEED IF > [ARG2]
1284 20AD10 GIGRTP: JSR GINC
1287 A578 LDA VALUE+LO ; MOVE [ARG1]-1
1289 857A STA I+LO ; INTO [I]
128B A579 LDA VALUE+HI
128D 857B STA I+HI
128F A56F A2VAL: LDA ARG2+LO ; MOVE [ARG2]
1291 8578 STA VALUE+LO ; INTO [VALUE]
1293 A570 LDA ARG2+HI
1295 8579 STA VALUE+HI
1297 209E12 COMPAR: JSR SCOMP ; SIGNED COMPARE
129A 90C3 BCC PGOOD
129C B0C4 BCS PBAD
129E ; -------------------------------
129E ; SIGNED COMPARE OF [VALUE] & [I]
129E ; -------------------------------
129E A57B SCOMP: LDA I+HI
12A0 4579 EOR VALUE+HI
12A2 1005 BPL SCMP
12A4 A57B LDA I+HI
12A6 C579 CMP VALUE+HI
12A8 60 RTS
12A9 A579 SCMP: LDA VALUE+HI
12AB C57B CMP I+HI
12AD D004 BNE SCEX
12AF A578 LDA VALUE+LO
12B1 C57A CMP I+LO
12B3 60 SCEX: RTS
12B4 ; ---
12B4 ; SET
12B4 ; ---
12B4 ; SET VARIABLE [ARG1] EQUAL TO [ARG2]
12B4 A56F GSET: LDA ARG2+LO ; MOVE [ARG2]
12B6 8578 STA VALUE ; INTO [VALUE]
12B8 A570 LDA ARG2+HI
12BA 8579 STA VALUE+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 50
--- 2-OPS ---
12BC A56D LDA ARG1+LO ; GET VARIABLE ID
12BE 4C550F JMP VARPUT ; AND SET THE VALUE
12C1 ; ---
12C1 ; GET
12C1 ; ---
12C1 ; RETURN ITEM [ARG2] IN WORD-TABLE [ARG1]
12C1 20E512 GGET: JSR CALCW ; V-ADDR OF WORD IN [VPC]
;***
12C4 A900 LDA #00
12C6 8588 STA VPC0
;***
12C8 20251B JSR GETBYT ; GET MSB OF VALUE
12CB 8579 DOGET: STA VALUE+HI
12CD 20251B JSR GETBYT ; AND LSB
12D0 8578 STA VALUE+LO
12D2 4C660F JMP PUTVAL
12D5 ; ----
12D5 ; GETB
12D5 ; ----
12D5 ; RETURN ITEM [ARG2] IN BYTE-TABLE [ARG1]
12D5 20DC12 GGETB: JSR CALCB ; V-ADDR OF BYTE IN [VPC]
12D8 A900 LDA #0 ; MSB WILL BE ZERO
12DA F0EF BEQ DOGET
12DC ; --------------------
12DC ; CALC TABLE ADDRESSES
12DC ; --------------------
;CALCW: ASL ARG2+LO ; WORD-ALIGN TABLE INDEX
; ROL ARG2+HI
;
;***
12DC 4670 CALCB: LSR ARG2+HI ; BYTE-ALIGN TABLE INDEX
12DE 666F ROR ARG2+LO
12E0 A900 LDA #00
12E2 2A ROL A ; PUT CARRY IN A
12E3 8588 STA VPC0
;***
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 51
--- 2-OPS ---
;CALCB: LDA ARG2+LO ; CALC LSB OF V-ADDRESS
;***
12E5 A56F CALCW: LDA ARG2+LO ; CALC LSB OF V-ADDRESS
12E7 18 CLC
12E8 656D ADC ARG1+LO
12EA 8586 STA VPCL
12EC A570 LDA ARG2+HI ; ALSO CALC MSB
12EE 656E ADC ARG1+HI
12F0 8587 STA VPCH
12F2 A900 LDA #0
12F4 8589 STA VPCFLG ; INVALIDATE [VPC]
12F6 60 RTS
END
INCLUD OPSX.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 52
--- X-OPS ---
12F7 ; ----
12F7 ; CALL
12F7 ; ----
12F7 ; ENTRY: [NARGS] = 0
12F7 A20F GCALL: LDX #15 ; FILL THE ARG-TYPE LIST
12F9 A9C0 LDA #%11000000 ; WITH "NO MORE ARGS" BYTES
12FB 9DC00A GCL: STA CTYPES,X
12FE CA DEX
12FF 10FA BPL GCL
1301 A904 LDA #4
1303 8576 STA ADEX ; INIT BYTE INDEX
1305 8577 STA ADEX2 ; AND ARG BYTE COUNTER
1307 20D21A GCL0: JSR NEXTPC ; GRAB AN ARGUMENT BYTE
130A 8575 STA ABYTE ; SAVE IT HERE
130C 4C1513 JMP GCL2 ; SKIP OVER 1ST SHIFT
130F A575 GCL1: LDA ABYTE
1311 0A ASL A
1312 0A ASL A
1313 8575 STA ABYTE
1315 29C0 GCL2: AND #%11000000 ; MASK GARBAGE
1317 C9C0 CMP #%11000000 ; LAST ARGUMENT?
1319 F013 BEQ GCL3 ; YES, TIME TO DECODE ARGS
131B A66C LDX NARGS ; ELSE ADD THIS ARGUMENT
131D 9DC00A STA CTYPES,X ; TO THE ARG-TYPE LIST
1320 E66C INC NARGS ; UPDATE # ARGUMENTS
1322 C676 DEC ADEX ; THIS ARG BYTE EMPTY?
1324 D0E9 BNE GCL1 ; NO, GET NEXT ARG
1326 A904 LDA #4 ; ELSE RESET
1328 8576 STA ADEX ; ARGUMENT INDEX
132A C677 DEC ADEX2 ; DONE 4 ARG BYTES?
132C D0D9 BNE GCL0 ; NO, GET ANOTHER
132E ; [CTYPES] HAS LIST OF ARG TYPES
132E ; [NARGS] HAS # ARGUMENTS
132E A900 GCL3: LDA #0 ; RESET THE
1330 8576 STA ADEX ; ARGUMENT INDEX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 53
--- X-OPS ---
1332 8577 STA ADEX2 ; AND STORAGE INDEX
1334 A56C LDA NARGS ; CONTINUE ONLY IF
1336 D005 BNE GCL4 ; [NARGS] <> 0
1338 ; *** ERROR #12: NO CALL ADDRESS ***
1338 A90C LDA #12
133A 4C5F1C JMP GERROR
133D A676 GCL4: LDX ADEX ; GET ARG INDEX
133F E46C CPX NARGS ; OUT OF ARGS YET?
1341 F02C BEQ GCL8 ; YES IF [X] = [NARGS]
1343 E676 INC ADEX ; ELSE UPDATE THE INDEX
1345 BDC00A LDA CTYPES,X ; GET A TYPE BYTE
1348 D006 BNE GCL5
134A 20EE0E JSR GETLNG ; 00 = LONG IMMEDIATE
134D 4C5D13 JMP GCL7
1350 C940 GCL5: CMP #%01000000
1352 D006 BNE GCL6
1354 20EA0E JSR GETSHT ; 01 = SHORT IMMEDIATE
1357 4C5D13 JMP GCL7
135A 20020F GCL6: JSR GETVAR ; ELSE GET VARIABLE
135D ; ARGUMENT IS NOW IN [VALUE]
135D A677 GCL7: LDX ADEX2 ; GET STORAGE INDEX
135F A578 LDA VALUE+LO ; MOVE LSB OF VALUE
1361 9DA00A STA CARGS,X ; INTO [CARGS]
1364 A579 LDA VALUE+HI ; ALSO MOVE
1366 9DA10A STA CARGS+1,X ; MSB
1369 E8 INX
136A E8 INX ; UPDATE THE
136B 8677 STX ADEX2 ; STORAGE INDEX
136D D0CE BNE GCL4 ; LOOP BACK FOR ANOTHER ARGUMENT
136F ; ARGUMENTS IN [CARGS], # ARGUMENTS IN [NARGS]
136F ADA00A GCL8: LDA CARGS+LO ; IS CALL ADDRESS
1372 0DA10A ORA CARGS+HI ; ZERO?
1375 D003 BNE DOCALL ; NO, CONTINUE
1377 4C600F JMP PUTBYT ; ELSE RETURN THE ZERO IN [A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 54
--- X-OPS ---
137A A68F DOCALL: LDX OLDGSP ; SAVE [OLDGSP]
137C 8A TXA
137D 20420F JSR PSHXA
1380 A680 LDX GPCL ; AND [GPC]
1382 A581 LDA GPCH
1384 20420F JSR PSHXA
;***
1387 A682 LDX GPC0
1389 20420F JSR PSHXA
;***
138C ADA00A LDA CARGS+LO ; RESET [GPC]
138F 8580 STA GPCL
1391 ADA10A LDA CARGS+HI
1394 8581 STA GPCH
1396 A900 LDA #0
;***
1398 8582 STA GPC0 ; ALL FUNCTIONS START ON WORD BOUNDRIES
;***
139A 8583 STA GPCFLG ; AND ANNOUNCE CHANGE
139C 20D21A JSR NEXTPC ; GET # LOCALS IN FUNCTION
139F 8576 STA ADEX ; SAVE HERE FOR REFERENCE
13A1 8577 STA ADEX2 ; AND HERE FOR COUNTING
13A3 F027 BEQ CALL2 ; IF ZERO, JUMP AHEAD
13A5 A900 LDA #0
13A7 857C STA J+LO ; INIT LOOP INDEX
13A9 A47C CALL1: LDY J+LO
13AB BE800A LDX LOCALS,Y ; GET LSB OF LOCAL INTO [X]
13AE B9810A LDA LOCALS+1,Y ; GET MSB INTO [A]
13B1 20420F JSR PSHXA ; PUSH [X/A]
13B4 20D21A JSR NEXTPC ; GET MSB OF NEW LOCAL
13B7 A47C LDY J+LO
13B9 99810A STA LOCALS+1,Y ; MOVE MSB TO [LOCALS]
13BC 20D21A JSR NEXTPC ; GET LSB OF NEW LOCAL
13BF A47C LDY J+LO
13C1 99800A STA LOCALS,Y ; STORE LSB
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 55
--- X-OPS ---
13C4 C8 INY
13C5 C8 INY
13C6 847C STY J+LO ; UPDATE STORAGE INDEX
13C8 C677 DEC ADEX2 ; ANY MORE LOCALS?
13CA D0DD BNE CALL1 ; YES, LOOP BACK
13CC C66C CALL2: DEC NARGS ; ANY ARGS LEFT?
13CE F014 BEQ CALL4 ; NO, SCRAM NOW
13D0 ; PASS UP TO 15 [CARGS] TO [LOCALS]
13D0 A200 LDX #0 ; INIT LOOP INDEX
13D2 BDA20A CALL3: LDA CARGS+2,X ; GET LSB OF ARGUMENT
13D5 9D800A STA LOCALS,X ; ASSIGN TO A LOCAL
13D8 BDA30A LDA CARGS+3,X ; SAME FOR
13DB 9D810A STA LOCALS+1,X ; MSB
13DE E8 INX ; POINT TO THE
13DF E8 INX ; NEXT ENTRIES
13E0 C66C DEC NARGS ; OUT OF ARGS YET?
13E2 D0EE BNE CALL3 ; NO, KEEP LOOPING
13E4 ; PUSH # LOCALS
13E4 A676 CALL4: LDX ADEX ; # LOCALS KEPT HERE
13E6 8A TXA
13E7 20420F JSR PSHXA
13EA A58E LDA GSP ; REMEMBER WHERE WE ARE
13EC 858F STA OLDGSP
13EE 4CCF0D JMP MLOOP ; BACK TO MAIN LOOP
13F1 ; ---
13F1 ; PUT
13F1 ; ---
13F1 ; SET ITEM [ARG2] IN WORD-TABLE [ARG1] EQUAL TO [ARG3]
;GPUT: ASL ARG2+LO ; WORD-ALIGN
; ROL ARG2+HI ; [ARG2]
; JSR PCALC
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 56
--- X-OPS ---
;***
13F1 18 GPUT: CLC
13F2 200914 JSR PCALC ; GET ADDRESS INTO [I]
;***
13F5 A572 LDA ARG3+HI
13F7 917A STA (I),Y ; [Y] = 0
13F9 C8 INY
13FA D008 BNE PUTLSB ; BRANCH ALWAYS
13FC ; ----
13FC ; PUTB
13FC ; ----
13FC ; SET ITEM [ARG2] IN BYTE-TABLE [ARG1] EQUAL TO [ARG3]
;GPUTB: JSR PCALC
;***
13FC 18 GPUTB: CLC
13FD 4670 LSR ARG2+HI ; DIVIDE BY TWO TO ADJUST FOR BYTE POINTING
13FF 666F ROR ARG2+LO ; LEAVE BIT 0 IN CARRY FOR PCALC
1401 200914 JSR PCALC
;***
1404 A571 PUTLSB: LDA ARG3+LO
1406 917A STA (I),Y
1408 60 RTS
1409 ; ------------------
1409 ; CALC "PUT" ADDRESS
1409 ; ------------------
1409 A000 PCALC: LDY #0 ; FOR INDEXING
;***
140B 9001 BCC PCALC1 ; TAKE CARE OF CARRY FROM GPUTB
140D C8 INY
;***
140E A56F PCALC1: LDA ARG2+LO ; ADD ITEM OFFSET
1410 18 CLC ; TO TABLE ADDRESS
1411 656D ADC ARG1+LO ; FIRST LSB
1413 857A STA I+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 57
--- X-OPS ---
1415 A570 LDA ARG2+HI ; THEN MSB
1417 656E ADC ARG1+HI
1419 C593 ICENT: CMP GPURE ; IS CODE IN G-PRELOAD? (ENTRY FOR ICALC)
141B 9014 BCC USEGP ; YES, OK TO CHANGE
141D C594 CMP ISTART ; IS IT BELOW THE I-FILE?
141F 9019 BCC PURERR ; CAN'T CHANGE PURE CODE!
1421 C595 CMP IPURE ; IS IT ABOVE THE I-PRELOAD?
1423 B015 BCS PURERR ; YES, UNCHANGEABLE!
1425 ; POINT TO BYTE IN I-PRELOAD
1425 38 SEC
1426 E594 SBC ISTART ; STRIP OF V-OFFSET
;***
1428 067A ASL I+LO ; *2
142A 2A ROL A
142B ****
142B 18 CLC
142C 6592 ADC ICODE+HI ; MAKE IT ABSOLUTE
142E 857B STA I+HI
;***
1430 60 PCALC2: RTS
;***
; RTS
1431 ; POINT TO BYTE IN G-PRELOAD
;***
1431 067A USEGP: ASL I+LO ; * 2 FOR 512 BYTE PAGES
1433 2A ROL A
;***
1434 18 CLC
1435 6590 ADC GCODE ; CALC ABSOLUTE ADDR
1437 857B STA I+HI ; IN G-PRELOAD
1439 60 RTS
143A ; *** ERROR #9: PURITY VIOLATION ***
143A A909 PURERR: LDA #9
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 58
--- X-OPS ---
143C 4C5F1C JMP GERROR
143F ; ------
143F ; RANDOM
143F ; ------
143F ; RETURN A RANDOM VALUE BETWEEN 1 AND [ARG1]
143F A56D GRAND: LDA ARG1+LO ; MAKE [ARG1]
1441 856F STA ARG2+LO ; A DIVISOR
1443 A56E LDA ARG1+HI
1445 8570 STA ARG2+HI
1447 200A1D JSR DORAND ; GET RANDOM BYTES
144A 866D STX ARG1+LO ; INTO [A] & [X]
144C 297F AND #%01111111 ; MAKE IT A POSITIVE
144E 856E STA ARG1+HI ; DIVIDEND
1450 207711 JSR DIVIDE ; SIGNED DIVISION
1453 A5A6 LDA REMAIN+LO ; GRAB THE REMAINDER
1455 8578 STA VALUE+LO
1457 A5A7 LDA REMAIN+HI
1459 8579 STA VALUE+HI
145B 20FF0F JSR INCVAL ; INCREMENT IT
145E 4C660F JMP PUTVAL ; AND RETURN THE RESULT
1461 ;-------------------------------------
1461 ; GITER: INITIALIZE ITERATION TABLE AT
1461 ; WORD-ADDRESS ARG1
1461 ;-------------------------------------
1461 A900 GITER: LDA #00 ; SET ARG4=0 FOR ICALC
1463 8573 STA ARG4+LO
1465 8574 STA ARG4+HI
1467 A56E LDA ARG1+HI ; MOVE ARG1 TO ARG3
1469 8572 STA ARG3+HI
146B A56D LDA ARG1+LO
146D 8571 STA ARG3+LO
146F 208918 JSR ICALC ; THIS WILL ALSO CHECK PURITY VIOLATIONS
1472 B17A LDA (I),Y ; GET NUMBER OF ENTRIES IN TABLE
1474 85BE STA ITICN
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 59
--- X-OPS ---
1476 C8 INY
1477 98 TYA ; INIT ICOUNT Y=1 A=1
1478 917A STA (I),Y
147A E673 INC ARG4+LO ; POINT TO FIRST WORD OF FIRST ENTRY
147C 208918 GITER1: JSR ICALC
147F B17A LDA (I),Y ; HIGH BYTE OF ICON ADDRESS
1481 48 PHA ; SAVE
1482 C8 INY ; =1
1483 B17A LDA (I),Y ; LOWBYTE OF ADDRESS
1485 AA TAX
1486 68 PLA
1487 20361A JSR GETI ; GET ICON INFORMATION
148A A900 LDA #0
148C A006 LDY #6
148E 917A STA (I),Y ; SET NEGATE FOR POSITIVE DISPLAY
1490 C8 INY ; =7
1491 A901 LDA #1
1493 917A STA (I),Y ; SET FIRST ITERATION=1
1495 C8 INY ; =8
1496 A5CF LDA BSET
1498 917A STA (I),Y ; SAVE BSET
149A C8 INY ; =9
149B A5BD LDA ITERS
149D 917A STA (I),Y ; SAVE # OF ITERS
149F C8 INY ; =10
14A0 A5B5 LDA IX1
14A2 917A STA (I),Y ; SAVE ICON WIDTH
14A4 C8 INY ; =11
14A5 A5B7 LDA IY1
14A7 917A STA (I),Y ; SAVE ICON HEIGHTH
14A9 207D18 JSR NXTENT
14AC C6BE DEC ITICN
14AE D0CC BNE GITER1
14B0 60 RTS
14B1 ;------------------------
14B1 ; GDUMP : NOT IMPLIMENTED
14B1 ; RETURN 0
14B1 ;------------------------
14B1 4C5E0F GDUMP: JMP RET0
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 60
--- X-OPS ---
14B4 ;-------------------------
14B4 ; GLOAD : NOT IMPLIMENTED
14B4 ; RETURN 0
14B4 ;------------------------
14B4 4C5E0F GLOAD: JMP RET0
END
INCLUD IO.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 61
--- I/O ROUTINES ---
14B7 ; -----
14B7 ; SHOWN
14B7 ; -----
14B7 ; DISPLAY NEGATIVE ICON [ARG3] AT X=[ARG1], Y=[ARG2]
14B7 ; IF [ARG4] IS GIVEN IT POINTS TO THE MASK TO BE USED
14B7 A9FF GSHOWN: LDA #$FF
14B9 85E9 STA NEGATE ; SET NEGATE FLAG
14BB D004 BNE SHOWI ; AND DO A "SHOWI"
14BD ; -----
14BD ; SHOWI
14BD ; -----
14BD ; DISPLAY ICON [ARG3] AT X=[ARG1], Y=[ARG2]
14BD ; IF [ARG4] IS GIVEN IT POINTS TO THE MASK TO BE USED
14BD A900 GSHOWI: LDA #0
14BF 85E9 STA NEGATE ; DISABLE NEGATE
14C1 ; ****************NEW ROUTINE********************
14C1 A900 SHOWI: LDA #0
14C3 85E3 STA MSKFLG ; DISABLE MASKING UNTIL FURTHER NOTICE
14C5 A56C LDA NARGS
14C7 C903 CMP #3
14C9 F019 BEQ NOMASK ; DO THE NORMAL THING
14CB A673 LDX ARG4+LO ; GET MASK INFO
14CD A574 LDA ARG4+HI
14CF 201B1A JSR ISU ; THIS ENTRY INTO [ISETUP] WILL PUT
14D2 ; THE DATA FOR ICON [ARG4] INTO
14D2 ; IX2,IY2,IADR2 ETC.
14D2 ; AND RETURN WITH DATA FROM ICON [ARG3]
14D2 ; IN IX1,IY1 ETC.
14D2 ; * NOTE IT WILL NOT DETECT DIFFERENT *
14D2 ; * BLOCKSETS IT USES THE BSET FROM *
14D2 ; * [ARG3] *
14D2 A5B5 LDA IX1
14D4 C5B6 CMP IX2 ; IF THE WIDTH AND HEIGHT ARE NOT
14D6 D02E BNE DRAWEX ; DO NOTHING
14D8 A5B7 LDA IY1
14DA C5B8 CMP IY2
14DC D028 BNE DRAWEX
14DE A9FF LDA #$FF ; SET MASK FLAG
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 62
--- I/O ROUTINES ---
14E0 85E3 STA MSKFLG
14E2 D007 BNE ITENT ; GOTO RIGHT PLACE
14E4 A671 NOMASK: LDX ARG3+LO ; SET UP
14E6 A572 LDA ARG3+HI ; BSET, ITERS, IX1, IY1, IADR1+LO, IADR1+HI
14E8 20361A JSR GETI
14EB A900 ITENT: LDA #0
14ED 85C4 STA TOPCUT ; ZERO THIS
14EF 85AE STA MUH ; THIS TOO
14F1 85C5 STA SIDCUT ; AND THIS
; STA MDYCUT ; AND THIS
14F3 85C7 STA MDXCUT ; AND THIS
14F5 A66F LDX ARG2+LO ; ICON Y1 POS LO
14F7 A570 LDA ARG2+HI
14F9 F01B BEQ DRAWI1 ; ICON STARTS ON WINDOW PAGE (YPOS= 00 XX)
14FB C9FF CMP #$FF
14FD D007 BNE DRAWEX ; ICON WILL NOT BE DISPLAYED
14FF ;STARTS ON PAGE BEFORE WINDOW PAGE
14FF 8A TXA ; PUT LO YPOS IN <A>
1500 49FF EOR #$FF ; C=1 FROM CMP #$FF
1502 65CA ADC WINDY1 ; FIND DISTANCE FROM ICON Y1-> WINDOW Y1
1504 9017 BCC DRAWI2
1506 ; FALL THRU DISTANCE > MAX SIZE OF 255
1506 60 DRAWEX: RTS ; GENERAL PURPOUS EXIT FROM DRAW ICON
1507 A5CC DRAWI3: LDA WINDY2 ; * [WINDY2] IS ONE GREATER THAN LAST *
1509 38 SEC ; * LINE OF WINDOW TO DISPLAY *
150A E56F SBC ARG2+LO ; * IF THIS MAKES A DIFFERANCE TAKE *
150C 90F8 BCC DRAWEX ; AMOUNT TO CUT FROM ROWS DISPLAYED
150E C5B7 CMP IY1 ; * THE SEC MIGHT FIX *
1510 B00D BCS DRAWI4
1512 85B7 STA IY1 ; EXIT WHEN ICON STARTS BELOW WINDOW
1514 9009 BCC DRAWI4
1516 ; THE ABOVE SECTION OCCURS IF THE ICON STARTS INDSIDE THE WINDOW
1516 ; AND FINDS THE NUMBER ROWS TO DRAW
1516 38 DRAWI1: SEC ; ICON ON ZERO PAGE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 63
--- I/O ROUTINES ---
1517 A5CA LDA WINDY1
1519 E56F SBC ARG2+LO ; FIND (WINDY1-ICONY1)
151B 90EA BCC DRAWI3 ; IF NEGATIVE ICON STARTS AFTER WINDOW Y1
151D 85C4 DRAWI2: STA TOPCUT ; OTHERWISE CUT THIS AMOUNT FROM TOP OF ICON
151F A5B7 DRAWI4: LDA IY1 ; HEIGHT OF ICON
1521 38 SEC
1522 E5C4 SBC TOPCUT ; DO CUT
1524 F0E0 BEQ DRAWEX
1526 90DE BCC DRAWEX ; NO ICON LEFT TO DRAW. GOOD BYE
1528 85BB STA YDEX1 ; *** NEED TO USE OTHER NAME???? ***
152A E5CD SBC WINDH ; *(+-1) SET IN WINDSET (HEIGHT OF WINDOW)
152C 9004 BCC DRAWI5 ; ICON SMALLER THAN WINDOW (DISPLAY ALL)
152E A5CD LDA WINDH ; DISPLAY A WINDOWS WORTH OF ICON
1530 85BB STA YDEX1
1532 ; MULTIPLY TOPCUT AND ICON WIDTH, ADD TO ICON POINTER TO POINT
1532 ; AT FIRST DISPLAYED ROW BLOCK
1532 A5C4 DRAWI5: LDA TOPCUT ; * NOT NEEDED IF NOT CHANGED LATER *
1534 85AC STA MUSHFT ; * JUST USE TOPCUT *
1536 18 CLC
1537 656F ADC ARG2+LO ; CHANGE STARY YPOS OF ICON TO REFLECT
1539 85C2 STA YPOS+LO ; TOPCUT
153B A007 LDY #7 ; SHIFT COUNTER
153D A6B5 LDX IX1 ; WIDTH COEFICIANT
153F CA DEX ; LESS ONE SO ADC C=0 SAME AS ADC C=1
1540 8A DRAWI6: TXA ; GET IX1 BACK IN <A> FOR ADD
1541 46AC LSR MUSHFT ; SHIFT BIT 0 INTO <C>
1543 9004 BCC DRAWI7 ; C=0 SAME AS ADDING 0
1545 65AE ADC MUH
1547 85AE STA MUH ; ADD IXA TO TOTAL
1549 66AE DRAWI7: ROR MUH ; MUTIPLY BY 2
154B 66AD ROR MUL
154D 88 DEY
154E 10F0 BPL DRAWI6 ; DO 8 TIMES (8 BITS) GET IT?
; LDA IADR1+LO
; CLC
; ADC MUL ; ADD OFFSET INTO ICON
; STA IADR1+LO
; LDA IADR1+HI
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 64
--- I/O ROUTINES ---
; ADC MUH
; STA IADR1+HI
;***
1550 A5AE LDA MUH
1552 A6AD LDX MUL
1554 202F19 JSR ADDIA1
1557 A5E3 LDA MSKFLG ; IF MASK ENABLED
1559 F005 BEQ NOMSK1
155B A5AE LDA MUH ; X IS STILL MUL
155D 200619 JSR ADDIA2
;***
1560 ; COMPUTE THE DISPLAYED WIDTH AND THE IXSKIP
1560 A5B5 NOMSK1: LDA IX1 ; KLUDGE
1562 85C7 STA MDXCUT
1564 A66D LDX ARG1+LO ; ICON X CORDINATE
1566 A56E LDA ARG1+HI
1568 F01B BEQ DRAWI8 ; ICON STARTS ON WINDOW PAGE (XPOS= 00 XX)
156A C9FF CMP #$FF
156C D007 BNE DRAWE2 ; ICON WILL NOT BE DISPLAYED
156E ; STARTS ON PAGE BEFORE WINDOW PAGE
156E 8A TXA ; PUT LO XPOS IN <A>
156F 49FF EOR #$FF ; C=1 FROM CMP #$FF
1571 65C9 ADC WINDX1 ; FIND DISTANCE FROM ICON X1-> WINDOW X1
1573 9017 BCC DRAWI9
1575 ; FALL THRU DISTANCE > MAX ICON SIZE OF 255
1575 60 DRAWE2: RTS ; AN EXIT FROM DRAW ICON
1576 A5CB DRAWIA: LDA WINDX2 ; ICON STARTS INSIDE WINDOW
1578 38 SEC
1579 E56D SBC ARG1+LO ; CHECK IF ICON STARTS TO RIGHT OF WINDOW
157B 90F8 BCC DRAWE2 ; FOR LATER
157D C5B5 CMP IX1
157F B00D BCS DRAWIB
1581 85B5 STA IX1 ; STARTS TO RIGHT DON T BOTHER
1583 9009 BCC DRAWIB
1585 A5C9 DRAWI8: LDA WINDX1 ; ICON STARTS ON ZERO PAGE
1587 38 SEC
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 65
--- I/O ROUTINES ---
1588 E56D SBC ARG1+LO ; FIND (WINDX2-ICONX1)
158A 90EA BCC DRAWIA ; IF NEGATIVE ICON STARTS AFTER WINDOW X1
158C 85C5 DRAWI9: STA SIDCUT ; OTHERWISE CUT THIS FROF LEFT OF ICON
158E A5B5 DRAWIB: LDA IX1 ; WIDTH OF ICON
1590 38 SEC
1591 E5C5 SBC SIDCUT ; DO CUT
1593 F0E0 BEQ DRAWE2
1595 90DE BCC DRAWE2 ; NO ICON TO DRAW BYE BYE
1597 85B9 STA XDEX1
1599 E5CE SBC WINDW ; IF ICON SMALLER THAN WINDOW DISPLAY ALL
159B 9004 BCC DRAWIC
159D A5CE LDA WINDW ; OTHERWISE DISPLAY WINDOW WIDTH OF ICON
159F 85B9 STA XDEX1
;DRAWIC: LDA IADR1+LO
; CLC
; ADC SIDCUT
; STA IADR1+LO
; BCC DRAWID
; INC IADR1+HI
;***
15A1 A900 DRAWIC: LDA #00
15A3 A6C5 LDX SIDCUT
15A5 202F19 JSR ADDIA1
;***
15A8 A5E3 LDA MSKFLG ; IS MASK ENABLED
15AA F005 BEQ DRAWID
15AC A900 LDA #00 ; X IS STILL SIDCUT
15AE 200619 JSR ADDIA2
15B1 A5C7 DRAWID: LDA MDXCUT
15B3 38 SEC
15B4 E5B9 SBC XDEX1
15B6 85C6 STA IXSKIP
15B8 A5B9 LDA XDEX1
15BA 85B5 STA IX1 ; SET THE COUNTER REFRESH VALUE
15BC A56D LDA ARG1+LO
15BE 18 CLC
15BF 65C5 ADC SIDCUT
15C1 85C0 STA XPOS+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 66
--- I/O ROUTINES ---
15C3 85E5 STA XPSAV+LO
15C5 ;**************************************
15C5 A5CF LDA BSET ; GET REQUIRED BLOCK SET INTO RAM
15C7 204919 JSR GETBS
15CA A5E3 LDA MSKFLG ; IF ENABLED GO DO THE MASK THING
15CC D042 BNE DOMASK
15CE ; DRAW THE ICON ITERATION AT [IADR1]
15CE A5AF DRAW: LDA IADR1+LO ; POINT [VPC] TO NEXT ICON BYTE
15D0 8586 STA VPCL
15D2 A5B0 LDA IADR1+HI
15D4 8587 STA VPCH
;***
15D6 A5B1 LDA IADR10
15D8 8588 STA VPC0
;***
15DA A900 LDA #0
15DC 8589 STA VPCFLG ; INVALIDATE [VPC]
15DE 20251B JSR GETBYT ; GET BLOCK ID INTO [A]
15E1 20C019 JSR GETBLK ; GET BLOCK [A] INTO [BLOCK]
15E4 A6C0 LDX XPOS+LO ; GET SCREEN COORDINATES
15E6 A5C2 LDA YPOS+LO ; INTO [X] AND [A]
15E8 20D21D JSR DUMP ; DUMP [BLOCK] AT X=[X], Y=[A]
15EB C6B9 DEC XDEX1 ; DEC INDEX OF DISPLAYED WIDTH
15ED F008 BEQ CLPRI2 ; OUT OF COLUMNS: DO NEXT ROW
15EF E6C0 INC XPOS+LO ; INCREMENT X CORDINATE
;***
15F1 202019 JSR INCIA1
;***
15F4 4CCE15 JMP DRAW
15F7 A5B5 CLPRI2: LDA IX1 ; REFRESH
15F9 85B9 STA XDEX1 ; X-COUNT
15FB A5E5 LDA XPSAV+LO ; RESET X-POS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 67
--- I/O ROUTINES ---
15FD 85C0 STA XPOS+LO
;***
15FF A900 LDA #0
1601 A6C6 LDX IXSKIP
1603 202F19 JSR ADDIA1
1606 202019 JSR INCIA1
;***
1609 E6C2 INC YPOS+LO ; INCREMENT
160B C6BB DEC YDEX1 ; OUT OF Y'S YET?
160D D0BF BNE DRAW ; NO, KEEP DUMPING
160F 60 RTS ; TILL EMPTY
1610 ; DRAW THE ICON ITERATION AT [IADR1] WITH MASK AT [IADR2]
1610 A5B2 DOMASK: LDA IADR2+LO ; POINT [VPC] TO NEXT MASK BYTE
1612 8586 STA VPCL
1614 A5B3 LDA IADR2+HI
1616 8587 STA VPCH
1618 A5B4 LDA IADR20
161A 8588 STA VPC0
161C A5E9 LDA NEGATE ; SAVE NEGATE STATUS
161E 48 PHA
161F A900 LDA #00
1621 8589 STA VPCFLG ; INVAL FLAG
1623 85E9 STA NEGATE ; NEVER NEGATE THE MASK
1625 20251B JSR GETBYT ; GET MASK BLOCK
1628 20C019 JSR GETBLK ; GET MASK INTO [BLOCK]
162B 207E16 JSR B2MASK ; COPY [BLOCK] INTO [MASK]
162E A5AF LDA IADR1+LO ; POINT [VPC] TO NEXT ICON BYTE
1630 8586 STA VPCL
1632 A5B0 LDA IADR1+HI
1634 8587 STA VPCH
1636 A5B1 LDA IADR10
1638 8588 STA VPC0
163A 68 PLA ; RESTORE THE NEGATE
163B 85E9 STA NEGATE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 68
--- I/O ROUTINES ---
163D A900 LDA #0
163F 8589 STA VPCFLG ; INVALIDATE [VPC]
1641 20251B JSR GETBYT ; GET BLOCK ID INTO [A]
1644 20C019 JSR GETBLK ; GET BLOCK [A] INTO [BLOCK]
1647 A6C0 LDX XPOS+LO ; GET SCREEN COORDINATES
1649 A5C2 LDA YPOS+LO ; INTO [X] AND [A]
164B 20F51D JSR DMPMSK ; DRAW [BLOCK] AGAINST [MASK] AT X=[X], Y=[A]
164E C6B9 DEC XDEX1 ; DEC INDEX OF DISPLAYED WIDTH
1650 F00B BEQ CLPRIA ; OUT OF COLUMNS: DO NEXT ROW
1652 E6C0 INC XPOS+LO ; INCREMENT X CORDINATE
;***
1654 202019 JSR INCIA1
1657 20F718 JSR INCIA2
;***
165A 4C1016 JMP DOMASK
165D A5B5 CLPRIA: LDA IX1 ; REFRESH
165F 85B9 STA XDEX1 ; X-COUNT
1661 A5E5 LDA XPSAV+LO ; RESET X-POS
1663 85C0 STA XPOS+LO
;***
1665 A900 LDA #0
1667 A6C6 LDX IXSKIP
1669 202F19 JSR ADDIA1
166C 202019 JSR INCIA1
166F A900 LDA #0
1671 200619 JSR ADDIA2
1674 20F718 JSR INCIA2
;***
1677 E6C2 INC YPOS+LO ; INCREMENT
1679 C6BB DEC YDEX1 ; OUT OF Y'S YET?
167B D093 BNE DOMASK ; NO, KEEP DUMPING
167D 60 RTS ; TILL EMPTY
167E ; ------
167E ; B2MASK
167E ; ------
167E A207 B2MASK: LDX #7
1680 B5D3 B2MLP: LDA BLOCK,X
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 69
--- I/O ROUTINES ---
1682 95DB STA MASK,X
1684 CA DEX
1685 10F9 BPL B2MLP
1687 60 RTS
1688 ; ----
1688 ; SETI
1688 ; ----
1688 ; COPY ICON [ARG3] INTO ICON [ARG4] WITH
1688 ; TOP LEFT CORNER AT X=[ARG1], Y=[ARG2];
1688 ; RETURN ZERO IF RANGE ERROR, ONE IF OKAY
1688 20101A GSETI: JSR ISETUP ; GET STATS OF SOURCE & DEST
168B 20921A JSR DOFIT ; WILL SOURCE FIT IN DEST?
168E 9003 BCC SI0 ; CARRY CLEAR IF OKAY
1690 4C5E0F JMP RET0 ; ELSE RETURN A ZERO
1693 ; [IADR2] HAS ABS ADDR OF SUB-ICON
1693 ; [VPC] POINTS TO 1ST BYTE OF SOURCE ICON
1693 A900 SI0: LDA #0
1695 857A STA I+LO ; INIT X-ROW POINTER
1697 20251B SI1: JSR GETBYT ; GET A BYTE FROM SOURCE
169A A47A LDY I+LO
169C 91B2 STA (IADR2),Y ; STORE IN DEST
169E E67A INC I+LO ; UPDATE ROW POINTER
16A0 C6B9 DEC XDEX1 ; OUT OF SOURCE X'S YET?
16A2 D0F3 BNE SI1 ; NO, MOVE ANOTHER BYTE
16A4 A5B5 LDA IX1 ; ELSE REFRESH
16A6 85B9 STA XDEX1 ; X-COUNT
16A8 A5B6 LDA IX2 ; GET X-SIZE OF DEST
16AA 18 CLC
16AB 65B2 ADC IADR2+LO ; ADD TO BASE ADDR OF SUB-ICON
16AD 85B2 STA IADR2+LO ; TO GET ADDR OF NEXT SUB-ROW
16AF 9002 BCC SI3
16B1 E6B3 INC IADR2+HI
16B3 C6BB SI3: DEC YDEX1 ; OUT OF Y'S YET?
16B5 D0DC BNE SI0 ; RESET X-INDEX AND LOOP TILL EMPTY
16B7 A901 LDA #1
16B9 4C600F JMP PUTBYT ; RETURN A 1 FOR SUCCESS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 70
--- I/O ROUTINES ---
16BC ; -----
16BC ; SWAPI
16BC ; -----
16BC ; SAME AS "SETI" EXCEPT ICON [ARG4] SUB-DATA IS COPIED
16BC ; BACK INTO ICON [ARG3]
16BC 20101A GSWAPI: JSR ISETUP
16BF A5B0 LDA IADR1+HI ; MAKE SURE SOURCE ICON
16C1 C595 CMP IPURE ; IS IN I-PRELOAD
16C3 9005 BCC GSW0 ; ERROR IF NOT
16C5 ; *** ERROR #14: PURITY VIOLATION (SETI/SWAPI) ***
16C5 A90E PRERR2: LDA #14
16C7 4C5F1C JMP GERROR
16CA 20921A GSW0: JSR DOFIT ; WILL SOURCE FIT IN DEST?
16CD 9003 BCC GSW1 ; CARRY CLEAR IF OKAY
16CF 4C5E0F JMP RET0 ; ELSE RETURN A ZERO
16D2 A5B0 GSW1: LDA IADR1+HI ; MAKE [IADR1] ABSOLUTE
16D4 38 SEC
16D5 E594 SBC ISTART ; STRIP OFF VIRTUAL OFFSET
;***
16D7 46B1 LSR IADR10
16D9 26AF ROL IADR1+LO
16DB 2A ROL A
;***
16DC 18 CLC
16DD 6592 ADC ICODE+HI ; ADD BASE ADDR OF I-PRELOAD
16DF 85B0 STA IADR1+HI ; LSB NEEDN'T CHANGE
16E1 A900 GSW2: LDA #0 ; INIT ROW INDEX
16E3 857A STA I+LO
16E5 A47A GSW3: LDY I+LO ; GET ROW INDEX
16E7 B1AF LDA (IADR1),Y ; GET BYTE FROM SOURCE ICON
16E9 857B STA I+HI ; SAVE IT HERE
16EB B1B2 LDA (IADR2),Y ; GET BYTE FROM DEST ICON
16ED 91AF STA (IADR1),Y ; MOVE IT TO SOURCE ICON
16EF A57B LDA I+HI ; RETRIEVE SOURCE BYTE
16F1 91B2 STA (IADR2),Y ; AND MOVE IT TO DEST ICON
16F3 E67A INC I+LO ; UPDATE ROW INDEX
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 71
--- I/O ROUTINES ---
16F5 C6B9 DEC XDEX1 ; OUT OF X'S YET?
16F7 D0EC BNE GSW3 ; NO, KEEP LOOPING
16F9 A5B5 LDA IX1 ; ELSE REFRESH X-COUNT
16FB 85B9 STA XDEX1
16FD A5B6 LDA IX2 ; ADD X-SIZE OF DEST
16FF 18 CLC ; TO BASE ADDR OF SUB-ICON
1700 65B2 ADC IADR2+LO ; TO GET ADDR OF NEXT ROW
1702 85B2 STA IADR2+LO
1704 9002 BCC GSW4
1706 E6B3 INC IADR2+HI
1708 A5B5 GSW4: LDA IX1 ; ADD X-SIZE OF SOURCE
170A 18 CLC ; TO BASE ADDR OF SOURCE
170B 65AF ADC IADR1+LO ; TO GET ADDR OF NEXT ROW
170D 85AF STA IADR1+LO
170F 9002 BCC GSW5
1711 E6B0 INC IADR1+HI
1713 C6BB GSW5: DEC YDEX1 ; OUT OF Y'S YET?
1715 D0CA BNE GSW2 ; RESET ROW INDEX & LOOP TILL EMPTY
1717 A901 LDA #1
1719 4C600F JMP PUTBYT ; RETURN A 1 FOR SUCCESS
171C ; ------
171C ; WINDOW
171C ; ------
006D X1 EQU ARG1
006F Y1 EQU ARG2
0071 X2 EQU ARG3
0073 Y2 EQU ARG4
171C A006 GWIND: LDY #6 ; SET INDEX TO DO ALL ARGS
171E A200 WILP: LDX #0 ; TO ZERO ARGS LATER
1720 B96E00 LDA X1+HI,Y ; TEST IF - OR >255
1723 F009 BEQ WISK1 ; IF 0 DONT ADJUST GOTO NEXT ARG
1725 1004 BPL WISK2 ; IF PLUS ADJUST TO 255
1727 966D STX X1+LO,Y ; CLIP FROM NEGATIVE TO ZERO
1729 3003 BMI WISK1 ; BRANCH
172B CA WISK2: DEX ; [X] = 255
172C 966D STX X1+LO,Y ; IF > 255 CLIP TO 255
172E 88 WISK1: DEY
172F 88 DEY ; 2 DEYS FOR NEXT ARG (WORD)
1730 10EC BPL WILP ; DO Y2-X1
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 72
--- I/O ROUTINES ---
1732 A227 LDX #39 ; MAXIMUM X-VALUE
1734 A017 LDY #23 ; MAXIMUM Y-VALUE
1736 A56D LDA X1+LO ; CLIP X1
1738 C928 CMP #40
173A 9002 BCC WISK3
173C 866D STX X1+LO
173E A571 WISK3: LDA X2+LO ; CLIP X2
1740 C928 CMP #40
1742 9002 BCC WISK4
1744 8671 STX X2+LO
1746 A56F WISK4: LDA Y1+LO ; CLIP Y1
1748 C918 CMP #24
174A 9002 BCC WISK5
174C 846F STY Y1+LO
174E A573 WISK5: LDA Y2+LO ; CLIP Y2
1750 C918 CMP #24
1752 9002 BCC WISK6
1754 8473 STY Y2+LO
1756 ; SWITCH IF NEEDED
1756 A66D WISK6: LDX X1+LO
1758 A471 LDY X2+LO
175A E471 CPX X2+LO ; IS X1 > X2?
175C B006 BCS WISK7 ; BRANCH YES
175E 86C9 STX WINDX1 ; SET X1 = X1
1760 84CB STY WINDX2 ; SET X2 = X2
1762 9004 BCC WISK8 ; BRANCH
1764 86CB WISK7: STX WINDX2 ; SWAP
1766 84C9 STY WINDX1 ; X1 AND X2
1768 A66F WISK8: LDX Y1+LO ; GET Y1 AND
176A A473 LDY Y2+LO ; Y2
176C E473 CPX Y2+LO ; IS Y1 > Y2?
176E B006 BCS WISK9 ; BRANCH YES
1770 86CA STX WINDY1 ; SET Y1 = Y1
1772 84CC STY WINDY2 ; SET Y2 = Y2
1774 9004 BCC WISKA ; BRANCH
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 73
--- I/O ROUTINES ---
1776 86CC WISK9: STX WINDY2 ; SWAP
1778 84CA STY WINDY1 ; Y1 AND Y2
177A E6CB WISKA: INC WINDX2 ; THIS IS SO A BCC WILL WORK ON CLIP
177C E6CC INC WINDY2 ; SAME
177E A5CC LDA WINDY2 ; COMPUTE HEIGHT
1780 38 SEC
1781 E5CA SBC WINDY1
1783 85CD STA WINDH
1785 A5CB LDA WINDX2 ; COMPUTE WIDTH
1787 E5C9 SBC WINDX1 ; C=1 FROM ABOVE
1789 85CE STA WINDW
178B 60 RTS
178C 84AC MULXY STY MUSHFT
178E A007 LDY #7
1790 A900 LDA #0
1792 85AE STA MUH
1794 8A TXA ; TEST 0
1795 F012 BEQ MU0
1797 CA DEX
1798 8A MULP1: TXA
1799 46AC LSR MUSHFT
179B 9004 BCC MUSK1
179D 65AE ADC MUH
179F 85AE STA MUH
17A1 66AE MUSK1: ROR MUH
17A3 66AD ROR MUL
17A5 88 DEY
17A6 10F0 BPL MULP1
17A8 60 RTS
17A9 85AD MU0: STA MUL
17AB 60 RTS
END
INCLUD ITERS.ASM
17AC ;--------------------------------------------
17AC ; ITERATIONS
17AC ; EXECUTE THE ITERATION TABLE AT [ARG2]
17AC ; TEST FOR INPUT AFTER EACH ENTRY IS DONE AND
17AC ; -------------------------------------------
17AC A570 ITRATE: LDA ARG2+HI
17AE 8572 STA ARG3+HI ; POINT ARG3 AT TABLE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 74
--- ITERATION STUFF ---
17B0 A56F LDA ARG2+LO
17B2 8571 STA ARG3+LO
17B4 A900 LDA #00 ; SET OFFSET INTO TABLE=0
17B6 8574 STA ARG4+HI
17B8 8573 STA ARG4+LO
17BA 208918 JSR ICALC ; POINT [I] AT TABLE
17BD B17A LDA (I),Y ; NUMBER OF ENTRIES
17BF 85BE STA ITICN
17C1 C8 INY
17C2 B17A LDA (I),Y ; ENTRY TO START WITH
17C4 85BF STA ITPNT ; (NORMALLY ENTRY 1)
17C6 E673 INC ARG4+LO ; POINT AT FISRT WORD IN FIRST ENTRY
17C8 A201 LDX #1
17CA E4BF ITLP2: CPX ITPNT ; SKIP ENTRIES 1 TO ITPNT
17CC F006 BEQ ITLOOP
17CE 207D18 JSR NXTENT
17D1 E8 INX
17D2 D0F6 BNE ITLP2 ; BRA
17D4 208918 ITLOOP: JSR ICALC ; SET (I) CORECTLY
17D7 B17A LDA (I),Y ; POINT IADR1 AT "HEADER"
17D9 85B0 STA IADR1+HI
17DB 84B1 STY IADR10
17DD C8 INY
17DE B17A LDA (I),Y
17E0 85AF STA IADR1+LO
17E2 A007 LDY #7 ; CURRENT ITERATION
17E4 B17A LDA (I),Y
17E6 48 PHA ; SAVE
17E7 AA TAX
17E8 E8 INX ; TAKE CARE OF SETING FOR NEXT ITERATION
17E9 A009 LDY #9 ; NUMBER OF ITERATIONS
17EB D17A CMP (I),Y
17ED D002 BNE ITSKP2
17EF A201 LDX #1 ; RESTET TO FIRST ITERATION
17F1 8A ITSKP2: TXA
17F2 A007 LDY #7
17F4 917A STA (I),Y ; NEXT ITERATION
17F6 C8 INY ;=8
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 75
--- ITERATION STUFF ---
17F7 B17A LDA (I),Y ; BSET
17F9 85CF STA BSET
17FB A00A LDY #10 ; WIDTH
17FD B17A LDA (I),Y
17FF 85B5 STA IX1
1801 AA TAX
1802 C8 INY
1803 B17A LDA (I),Y ; HEIGHT
1805 85B7 STA IY1
1807 A8 TAY
1808 208C17 JSR MULXY ; FIND WIDTH*HEIGHT
180B 68 PLA ; RESTORE CURRENT ITERATION
180C A8 TAY
180D 88 ITLP3: DEY ; ZERO ALIGN FIRST TIME THRU/ THEN JUST DEX
180E F00A BEQ ITSKP3
1810 A5AE LDA MUH ; ADD LENGTH OF ICON (WIDTH*HEIGTH)
1812 A6AD LDX MUL
1814 202F19 JSR ADDIA1
1817 4C0D18 JMP ITLP3
181A 98 ITSKP3: TYA ;=0
181B A204 LDX #4
181D 202F19 JSR ADDIA1 ; SKIP 4 HEADER BYTES
1820 A002 LDY #2 ; =2
1822 B17A LDA (I),Y ; ICON XPOS
1824 856E STA ARG1+HI
1826 C8 INY ; =3
1827 B17A LDA (I),Y
1829 856D STA ARG1+LO
182B C8 INY ; =4
182C B17A LDA (I),Y ; ICON YPOS
182E 8570 STA ARG2+HI
1830 C8 INY ; =5
1831 B17A LDA (I),Y
1833 856F STA ARG2+LO
1835 C8 INY ; =6
1836 B17A LDA (I),Y ; NEGATE
1838 85E9 ITSKP4: STA NEGATE
183A A900 LDA #00
183C 85E3 STA MSKFLG ; DISABLE MASKING
183E 20EB14 JSR ITENT ; ENTER DRAW ROUTINE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 76
--- ITERATION STUFF ---
1841 207D18 JSR NXTENT ; POINT ARG4 AT NEXT ENTRY
1844 A6BF LDX ITPNT ; ARE WE DONE YET?
1846 E4BE CPX ITICN
1848 F023 BEQ ITEXI ; YES WE ARE DONE
184A E6BF INC ITPNT ; OTHERWISE POINT TO NEXT ENTRY
184C A579 LDA VALUE+HI ; IF INPUT WAS CALLED WITH A NEG INT
184E 3007 BMI NONSNS ; DO NOT LOOK FOR INPUT
1850 205D1D JSR SENSE ; DO WE HAVE AN INPUT
1853 C98F CMP #%10001111
1855 D003 BNE ITSKP5 ; GO HANDLE AN INPUT
1857 4CD417 NONSNS: JMP ITLOOP ; OTHERWISE DO NEXT ENTRY
185A 48 ITSKP5: PHA ; SAVE INPUT
185B A900 LDA #00
185D 8574 STA ARG4+HI
185F 8573 STA ARG4+LO ; POINT AT TABLE HEADER
1861 208918 JSR ICALC
1864 C8 INY ; =1
1865 A5BF LDA ITPNT ; SAVE STATUS OF HOW FAR WE GOT IN DOING
1867 917A STA (I),Y ; THE TABLE
1869 68 PLA ; RESTORE SENSE
186A 4C600F JMP PUTBYT ; RETURN SENSE
186D A900 ITEXI: LDA #00
186F 8574 STA ARG4+HI
1871 8573 STA ARG4+LO
1873 208918 JSR ICALC ; POINT TO TABLE HEADER
1876 C8 INY ; =1
1877 98 TYA
1878 917A STA (I),Y
187A 4C351D JMP NOIT
187D ;-----------------------------
187D ; SKIP 6 WORDS (1 TABLE ENTRY)
187D ;-----------------------------
187D A906 NXTENT: LDA #6 ; ADD 6 TO ARG4
187F 18 CLC
1880 6573 ADC ARG4+LO
1882 8573 STA ARG4+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 77
--- ITERATION STUFF ---
1884 9002 BCC NEXI
1886 E674 INC ARG4+HI
1888 60 NEXI: RTS
1889 ;-----------------------------------------------------------
1889 ; ICALC POINTS [I] AT THE RAM ADDRESS OF THE TABLE,OFFSET OF
1889 ; ARG3,ARG4
1889 ; AND GENERATES A PURITY ERROR IF [I] POINTS AT PURE CODE.
1889 ;
1889 ; EXITS: <Y>=0
1889 ;------------------------------------------------------------
1889 A000 ICALC: LDY #00
188B A573 LDA ARG4+LO
188D 18 CLC
188E 6571 ADC ARG3+LO
1890 857A STA I+LO
1892 A574 LDA ARG4+HI
1894 6572 ADC ARG3+HI
1896 4C1914 JMP ICENT ;ENTRY IN PCALC
END
INCLUD IOSUBS.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 78
--- I/O SUPPORT ROUTINES ---
1899 ;-----------------------------------------
1899 ; INCRIMENT [VPC]+HI,[VPC]+LO,[VPC0]
1899 ;-----------------------------------------
1899 A588 INCVPC: LDA VPC0 ; EFFECTIVLY ADD 1
189B 4901 EOR #$01 ; WITH EOR
189D 8588 STA VPC0
189F D008 BNE VPEX1
18A1 8589 STA VPCFLG ; INVALIDATE FLAG
18A3 E686 INC VPC+LO
18A5 D002 BNE VPEX1
18A7 E687 INC VPC+HI
18A9 60 VPEX1: RTS
18AA ;----------------------------
18AA ; ADD A,X TO [VPC]+HI,+LO,0
18AA ;----------------------------
18AA 867C ADDVPC: STX J+LO ; SAVE <X>
18AC 4A LSR A ; SHIFT SO AS TO ALIGN WITH 8,8,1 BIT PATTERN
18AD ; IN [VPC]
18AD 857D STA J+HI
18AF 667C ROR J+LO ; SHIFT LOW PART
18B1 9004 BCC AVISK
18B3 209918 JSR INCVPC ; IF CARRY SET ADD 1 TO [VPC]
18B6 18 CLC
18B7 A586 AVISK: LDA VPC+LO
18B9 657C ADC J+LO
18BB 8586 STA VPC+LO
18BD A587 LDA VPC+HI
18BF 657D ADC J+HI
18C1 8587 STA VPC+HI
18C3 A900 LDA #00 ; INVALIDATE FLAG
18C5 8589 STA VPCFLG
18C7 60 RTS
18C8 ;-----------------------------------------
18C8 ; INCRIMENT [GPC]+HI,[GPC]+LO,[GPC0]
18C8 ;-----------------------------------------
18C8 A582 INCGPC: LDA GPC0 ; EFFECTIVLY ADD 1
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 79
--- I/O SUPPORT ROUTINES ---
18CA 4901 EOR #$01 ; WITH EOR
18CC 8582 STA GPC0
18CE D008 BNE GPEX1
18D0 8583 STA GPCFLG ; INVALIDATE FLAG
18D2 E680 INC GPC+LO
18D4 D002 BNE GPEX1
18D6 E681 INC GPC+HI
18D8 60 GPEX1: RTS
18D9 ;----------------------------
18D9 ; ADD A,X TO [GPC]+HI,+LO,0
18D9 ;----------------------------
18D9 867C ADDGPC: STX J+LO ; SAVE <X>
18DB 4A LSR A ; SHIFT SO AS TO ALIGN WITH 8,8,1 BIT PATTERN
18DC ; IN [GPC]
18DC 857D STA J+HI
18DE 667C ROR J+LO ; SHIFT LOW PART
18E0 9004 BCC AGISK
18E2 20C818 JSR INCGPC ; IF CARRY SET ADD 1 TO [GPC]
18E5 18 CLC
18E6 A580 AGISK: LDA GPC+LO
18E8 657C ADC J+LO
18EA 8580 STA GPC+LO
18EC A581 LDA GPC+HI
18EE 657D ADC J+HI
18F0 8581 STA GPC+HI
18F2 A900 LDA #00 ; INVALIDATE FLAG
18F4 8583 STA GPCFLG
18F6 60 RTS
18F7 ;-----------------------------------------
18F7 ; INCRIMENT [IADR2]+HI,[IADR2]+LO,[IADR20]
18F7 ;-----------------------------------------
18F7 A5B4 INCIA2: LDA IADR20 ; EFFECTIVLY ADD 1
18F9 4901 EOR #$01 ; WITH EOR
18FB 85B4 STA IADR20
18FD D006 BNE INEX2
18FF E6B2 INC IADR2+LO
1901 D002 BNE INEX2
1903 E6B3 INC IADR2+HI
1905 60 INEX2: RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 80
--- I/O SUPPORT ROUTINES ---
1906 ;----------------------------
1906 ; ADD A,X TO [IADR2]+HI,+LO,0
1906 ;----------------------------
1906 867C ADDIA2: STX J+LO ; SAVE <X>
1908 4A LSR A ; SHIFT SO AS TO ALIGN WITH 8,8,1 BIT PATTERN
1909 ; IN [IADR2]
1909 857D STA J+HI
190B 667C ROR J+LO ; SHIFT LOW PART
190D 9004 BCC ADIS2
190F 20F718 JSR INCIA2 ; IF CARRY SET ADD 1 TO [IADR1]
1912 18 CLC
1913 A5B2 ADIS2: LDA IADR2+LO
1915 657C ADC J+LO
1917 85B2 STA IADR2+LO
1919 A5B3 LDA IADR2+HI
191B 657D ADC J+HI
191D 85B3 STA IADR2+HI
191F 60 RTS
1920 ;-----------------------------------------
1920 ; INCRIMENT [IADR1]+HI,[IADR1]+LO,[IADR10]
1920 ;-----------------------------------------
1920 A5B1 INCIA1: LDA IADR10 ; EFFECTIVLY ADD 1
1922 4901 EOR #$01 ; WITH EOR
1924 85B1 STA IADR10
1926 D006 BNE INEX1
1928 E6AF INC IADR1+LO
192A D002 BNE INEX1
192C E6B0 INC IADR1+HI
192E 60 INEX1: RTS
192F ;----------------------------
192F ; ADD A,X TO [IADR1]+HI,+LO,0
192F ;----------------------------
192F 867C ADDIA1: STX J+LO ; SAVE <X>
1931 4A LSR A ; SHIFT SO AS TO ALIGN WITH 8,8,1 BIT PATTERN
1932 ; IN [IADR1]
1932 857D STA J+HI
1934 667C ROR J+LO ; SHIFT LOW PART
1936 9004 BCC ADISK
1938 202019 JSR INCIA1 ; IF CARRY SET ADD 1 TO [IADR1]
193B 18 CLC
193C A5AF ADISK: LDA IADR1+LO
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 81
--- I/O SUPPORT ROUTINES ---
193E 657C ADC J+LO
1940 85AF STA IADR1+LO
1942 A5B0 LDA IADR1+HI
1944 657D ADC J+HI
1946 85B0 STA IADR1+HI
1948 60 RTS
1949 ; ----------------
1949 ; GET BLOCKSET [A]
1949 ; ----------------
1949 ; ENTRY: BLOCKSET ID # (1-255) IN [A]
1949 ; EXIT: VIRTUAL BASE ADDR OF BLOCKSET DATA IN [BSADR]
1949 ; # BLOCKS IN [BSIZE]
1949 ; BLOCKSET DATA PAGED INTO RAM
1949 A000 GETBS: LDY #0
194B 8489 STY VPCFLG ; INVALIDATE [VPC]
194D 847B STY I+HI ; CLEAR MSB OF INDEX
194F 84AD STY MUL ; AND MULTIPLICATION
1951 84AE STY MUH ; REGISTERS
1953 38 SEC
1954 E901 SBC #1 ; ZERO-ALIGN AND
1956 0A ASL A ; WORD-ALIGN THE
1957 267B ROL I+HI ; BLOCKSET INDEX (ALSO CLEARS CARRY)
1959 659E ADC BTAB+LO ; ADD BASE ADDRESS OF
195B 857A STA I+LO ; BLOCKSET TABLE
195D A57B LDA I+HI ; TO GET ABS ADDR OF POINTER
195F 659F ADC BTAB+HI ; INTO [I]
1961 857B STA I+HI
1963 B17A LDA (I),Y ; GET MSB OF POINTER ([Y] = 0)
1965 8587 STA VPCH
1967 C8 INY ; ALSO GET LSB
1968 B17A LDA (I),Y ; SO THAT [VPC] POINTS TO
196A 8586 STA VPCL ; V-ADDR OF BLOCKSET FILE
;***
196C A900 LDA #00
196E 8588 STA VPC0
;***
1970 20251B JSR GETBYT
1973 85EA STA BLKLEN ; SAVE # BYTES PER BLOCK
1975 20251B JSR GETBYT ; 2ND BYTE HAS # BLOCKS
1978 85D2 STA BSIZE ; SAVE HERE FOR REFERENCE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 82
--- I/O SUPPORT ROUTINES ---
197A 85AC STA MUSHFT ; AND HERE FOR MULTIPLY
197C A586 LDA VPCL ; MOVE V-ADDR OF BLOCKSET DATA
197E 85D0 STA BSADR+LO ; INTO [BSADR]
1980 A587 LDA VPCH
1982 85D1 STA BSADR+HI
1984 C595 CMP IPURE ; IS THIS SET IN I-PRELOAD?
1986 9037 BCC GBLX ; EXIT NOW IF SO
1988 ; LOAD THE ENTIRE BLOCKSET AT [VPC] INTO PAGING RAM
1988 A007 LDY #7 ; INIT BIT-LOOP INDEX
198A A6EA LDX BLKLEN ; GET BLOCK LENGTH
198C CA DEX ; ZERO-ALIGN
198D 8A GBL1: TXA ; MULTIPLY BY
198E 46AC LSR MUSHFT ; # BLOCKS IN BLOCKSET
1990 9004 BCC GBL2 ; TO GET SIZE
1992 65AE ADC MUH ; OF BLOCKSET
1994 85AE STA MUH ; IN [MUL/H]
1996 66AE GBL2: ROR MUH
1998 66AD ROR MUL
199A 88 DEY
199B 10F0 BPL GBL1
;***
199D 46AE LSR MUH
199F 66AD ROR MUL
;***
19A1 A586 LDA VPCL ; ADD LSB OF BLOCKSET START ADDRESS
19A3 18 CLC ; TO LSB OF
19A4 65AD ADC MUL ; BLOCKSET SIZE IN [MUL/H]
19A6 9002 BCC GBL3 ; CONTINUE IF NO PAGE OVERFLOW
19A8 E6AE INC MUH ; ELSE FORCE EXTRA PAGE LOAD
19AA A5AE GBL3: LDA MUH ; IF [MUH] = 0,
19AC F011 BEQ GBLX ; NO MORE PAGES ARE NEEDED
19AE E687 GBL4: INC VPCH ; ELSE POINT TO NEXT PAGE
19B0 A900 LDA #0
19B2 8589 STA VPCFLG ; INVALIDATE [VPC]
19B4 20251B JSR GETBYT ; GET A BYTE (FORCE PAGE LOAD)
19B7 C6AE DEC MUH ; LOADED ALL BLOCKSET PAGES YET?
19B9 D0F3 BNE GBL4 ; LOOP TILL EMPTY
19BB A900 LDA #0
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 83
--- I/O SUPPORT ROUTINES ---
19BD 8589 STA VPCFLG ; INVALIDATE [VPC]
19BF 60 GBLX: RTS
19C0 ; ---------------------------------
19C0 ; GET BLOCK [A] IN CURRENT BLOCKSET
19C0 ; ---------------------------------
19C0 ; ENTRY: BLOCK ID # (0-255) IN [A]
19C0 ; EXIT: BLOCK DATA IN [BLOCK]
19C0 85AC GETBLK: STA MUSHFT ; SAVE BLOCK ID
19C2 A900 LDA #0
19C4 8589 STA VPCFLG ; INVALIDATE [VPC]
19C6 85AD STA MUL ; CLEAR LSB AND
19C8 85AE STA MUH ; MSB OF OFFSET
19CA A007 LDY #7 ; INIT BIT-SHIFT INDEX
19CC A6EA LDX BLKLEN ; GET LENGTH OF BLOCKS
19CE CA DEX ; ZERO-ALIGN
19CF 867A STX I+LO ; SAVE FOR LATER LOOPING
19D1 8A MULP: TXA
19D2 46AC LSR MUSHFT
19D4 9004 BCC MUSK
19D6 65AE ADC MUH
19D8 85AE STA MUH
19DA 66AE MUSK: ROR MUH
19DC 66AD ROR MUL
19DE 88 DEY
19DF 10F0 BPL MULP
;MUEND: LDA MUL ; [MUL/H] HAS BLOCK OFFSET
; CLC
; ADC BSADR+LO ; ADD THE VIRTUAL BASE ADDR
; STA VPCL ; OF THE CURRENT BLOCKSET
; LDA MUH ; TO GET THE VIRTUAL BASE ADDRESS
; ADC BSADR+HI ; OF THE DESIRED BLOCK
; STA VPCH
;***
19E1 A5D0 MUEND: LDA BSADR+LO ; PUT WORD POINTER TO START OF BLOCKSET
19E3 8586 STA VPCL ; IN VPCH,L
19E5 A5D1 LDA BSADR+HI
19E7 8587 STA VPCH
19E9 A900 LDA #00 ; ZERO BOTTEM BIT
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 84
--- I/O SUPPORT ROUTINES ---
19EB 8588 STA VPC0
19ED A5AE LDA MUH ; ADD OFFSET TO BLOCK TO VPC
19EF A6AD LDX MUL
19F1 20AA18 JSR ADDVPC
;***
19F4 20251B GBLL: JSR GETBYT ; GET A BYTE
19F7 A67A LDX I+LO
19F9 95D3 STA BLOCK,X ; STORE BYTE IN [BLOCK]
19FB C67A DEC I+LO
19FD CA DEX ; LOOP TILL
19FE 10F4 BPL GBLL ; ALL BYTES DONE
1A00 ; NEGATE [BLOCK] IF [NEGATE] IS TRUE
1A00 A5E9 LDA NEGATE
1A02 F00B BEQ BLOCKX
1A04 A207 LDX #7 ; NEGATE [BLOCK]
1A06 B5D3 GBLLL: LDA BLOCK,X
1A08 49FF EOR #$FF
1A0A 95D3 STA BLOCK,X
1A0C CA DEX
1A0D 10F7 BPL GBLLL
1A0F 60 BLOCKX: RTS
1A10 ; ------------------------
1A10 ; SETUP FOR SETI AND SWAPI
1A10 ; ------------------------
1A10 A673 ISETUP: LDX ARG4+LO ; GET ADDR OF DESTINATION ICON
1A12 A574 LDA ARG4+HI
1A14 C595 CMP IPURE ; IS DEST IN I-PRELOAD?
1A16 9003 BCC ISU ; CONTINUE IF SO
1A18 4CC516 JMP PRERR2 ; ELSE PURITY VIOLATION!
1A1B ;----------------------
1A1B ; ENTRY FOR MASK SET UP
1A1B ;----------------------
1A1B 20361A ISU: JSR GETI ; FETCH STATS OF DEST ICON
1A1E A5B5 LDA IX1 ; COPY DEST ICON STATS
1A20 85B6 STA IX2 ; INTO AUXILIARY REGISTERS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 85
--- I/O SUPPORT ROUTINES ---
1A22 A5B7 LDA IY1
1A24 85B8 STA IY2
1A26 A5B1 LDA IADR10
1A28 85B4 STA IADR20
1A2A A5AF LDA IADR1+LO
1A2C 85B2 STA IADR2+LO
1A2E A5B0 LDA IADR1+HI
1A30 85B3 STA IADR2+HI
1A32 A671 LDX ARG3+LO ; NOW GET SOURCE ICON STATS
1A34 A572 LDA ARG3+HI
1A36 ; FALL THROUGH TO ...
1A36 ; --------
1A36 ; GET ICON
1A36 ; --------
1A36 ; ENTRY: V-ADDR OF ICON FILE IN [X/A]
1A36 ; EXIT: ICON DATA V-ADDR IN [IADR1]
1A36 ; X-SIZE IN [IX1] & [XDEX1]
1A36 ; Y-SIZE IN [IY1] & [YDEX1]
1A36 ; ASSIGNED BLOCKSET IN [BSET]
1A36 8686 GETI: STX VPCL
1A38 8587 STA VPCH
1A3A A900 LDA #0
;***
1A3C 8588 STA VPC0
;***
1A3E 8589 STA VPCFLG ; INVALIDATE [VPC]
1A40 20251B JSR GETBYT ; 1ST BYTE HAS
1A43 85CF STA BSET ; ASSIGNED BLOCKSET
1A45 20251B JSR GETBYT ; 2ND BYTE HAS
1A48 85BD STA ITERS ; # ITERATIONS
1A4A 20251B JSR GETBYT ; 3RD BYTE HAS
1A4D 85B5 STA IX1 ; X-SIZE
1A4F 20251B JSR GETBYT ; 4TH BYTE HAS
1A52 85B7 STA IY1 ; Y-SIZE
1A54 857C STA J+LO ; SAVE HERE FOR LATER
1A56 A586 LDA VPCL ; SAVE BASE V-ADDR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 86
--- I/O SUPPORT ROUTINES ---
1A58 85AF STA IADR1+LO ; IN [IADR]
1A5A A587 LDA VPCH
1A5C 85B0 STA IADR1+HI
1A5E A588 LDA VPC0
1A60 85B1 STA IADR10
1A62 C595 CMP IPURE ; IS THIS ICON PRELOADED?
1A64 9023 BCC NEWXY ; YES, SCRAM NOW
1A66 ; MAKE SURE ICON DATA IS PAGED INTO RAM
1A66 A586 LDA VPCL ; GET CURRENT PAGE POINTER
1A68 18 CLC
1A69 65B5 ADC IX1 ; ADD X-OFFSET
1A6B B008 BCS ILD1 ; GET NEW PAGE IF BOUNDARY CROSSED
1A6D C67C ILD0: DEC J+LO ; OUT OF X-LINES YET?
1A6F F014 BEQ ILD2 ; YES, ICON IS ALL LOADED
1A71 65B5 ADC IX1 ; ELSE ADD ANOTHER X-LINE
1A73 90F8 BCC ILD0 ; LOOP BACK IF SAME PAGE
1A75 857D ILD1: STA J+HI ; SAVE NEW PAGE POINTER
1A77 E687 INC VPCH ; POINT TO NEXT PAGE
1A79 A900 LDA #0
1A7B 8589 STA VPCFLG ; INVALIDATE [VPC]
1A7D 20251B JSR GETBYT ; TO FORCE PAGE LOAD
1A80 A57D LDA J+HI ; RESTORE POINTER
1A82 18 CLC ; CLEAR CARRY FOR NEW LOOP
1A83 90E8 BCC ILD0 ; BRANCH ALWAYS
1A85 A900 ILD2: LDA #0
1A87 8589 STA VPCFLG ; INVALIDATE [VPC]
1A89 ; FALL THROUGH ...
1A89 ; -------------------------
1A89 ; REFRESH [XDEX1] & [YDEX1]
1A89 ; -------------------------
1A89 A5B5 NEWXY: LDA IX1
1A8B 85B9 STA XDEX1
1A8D A5B7 LDA IY1
1A8F 85BB STA YDEX1
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 87
--- I/O SUPPORT ROUTINES ---
1A91 60 RTS
1A92 ; -----------------------------
1A92 ; WILL SOURCE ICON FIT IN DEST?
1A92 ; -----------------------------
1A92 ; ENTRY: SOURCE STATS IN [1] REGISTERS, DEST IN [2]
1A92 ; EXIT: CARRY CLEAR IF FIT OKAY, ELSE CARRY SET
1A92 ; [IADR2] HAS ABSOLUTE ADDRESS OF SUB-ICON
1A92 A56D DOFIT: LDA ARG1+LO ; GET X-POSITION
1A94 18 CLC
1A95 65B5 ADC IX1 ; ADD X-SIZE OF SOURCE
1A97 C5B6 CMP IX2 ; COMPARE TO SIZE OF DEST
1A99 9002 BCC FIT ; OKAY IF LESS
1A9B D034 BNE FITEX ; OR EQUAL; ELSE EXIT W/CARRY SET
1A9D A56F FIT: LDA ARG2+LO ; GET Y-POSITION
1A9F A8 TAY ; SAVE HERE FOR INDEXING BELOW
1AA0 18 CLC
1AA1 65B7 ADC IY1 ; ADD SIZE OF SOURCE
1AA3 C5B8 CMP IY2 ; COMPARE TO SIZE OF DEST
1AA5 9002 BCC FIT0 ; OKAY IS LESS
1AA7 D028 BNE FITEX ; SO IS EQUAL; ELSE EXIT W/CARRY SET
1AA9 ; MAKE [IADR2] POINT TO ADDR OF SUB-ICON
1AA9 A56D FIT0: LDA ARG1+LO ; IF X-POS OF SUB-ICON IS 0,
1AAB F011 BEQ FIT3 ; DON'T ADD X-OFFSET
; LDA IADR2+LO
; CLC
; ADC ARG1+LO ; ADD X-COORD OF SUB-ICON
; STA IADR2+LO ; TO BASE ADDR OF DEST ICON
; BCC FIT3 ; TO GET BASE ADDR OF SUB-ICON
; INC IADR2+HI
; BNE FIT3 ; ALWAYS SKIP 1ST Y-ITERATION
;***
1AAD A900 LDA #0
1AAF A66D LDX ARG1+LO
1AB1 200619 JSR ADDIA2
1AB4 4CBE1A JMP FIT3
;***
;FIT2: LDA IADR2+LO ; ADD X-SIZE OF DEST ICON
; CLC ; TO BASE ADDR OF SUB-ICON
; ADC IX2 ; ONCE FOR EACH Y-COORD
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- OPCODE EXECUTORS PAGE 88
--- I/O SUPPORT ROUTINES ---
; STA IADR2+LO
; BCC FIT3
; INC IADR2+HI
;***
1AB7 A900 FIT2: LDA #0
1AB9 A6B6 LDX IX2
1ABB 200619 JSR ADDIA2
;***
1ABE 88 FIT3: DEY ; OUT OF Y-COORDS YET?
1ABF 10F6 BPL FIT2 ; NO, KEEP ADDING
1AC1 A5B3 LDA IADR2+HI ; MAKE SUB-ICON ADDR ABSOLUTE
1AC3 38 SEC ; BY STRIPPING OFF THE
1AC4 E594 SBC ISTART ; V-OFFSET
;***
1AC6 46B4 LSR IADR20
1AC8 26B2 ROL IADR2+LO
1ACA 2A ROL A
;***
1ACB 18 CLC ; AND ADDING THE ABS ADDR
1ACC 6592 ADC ICODE+HI ; OF THE
1ACE 85B3 STA IADR2+HI ; I-PRELOAD (LSB NEEDN'T CHANGE)
1AD0 18 CLC ; CLEAR CARRY FOR SUCCESS
1AD1 60 FITEX: RTS
END
INCLUD PAGING.ASM
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 89
--- PAGING ROUTINES ---
1AD2 ; -----------------------
1AD2 ; GET NEXT BYTE OF G-CODE
1AD2 ; -----------------------
1AD2 ; EXIT: BYTE IN [A] & [Y], FLAGS SET
1AD2 A583 NEXTPC: LDA GPCFLG ; IS [GPOINT] VALID?
1AD4 D025 BNE NPC2 ; YES, CONTINUE
1AD6 A681 LDX GPCH ; GET TARGET V-PAGE
1AD8 BD0007 LDA MEMMAP,X ; IS IT ALREADY RESIDENT?
1ADB F00A BEQ NPC0 ; NO, PAGE IT IN
1ADD C596 CMP PAGE0 ; IS IT IN PRELOAD?
1ADF 900E BCC NPC1 ; YES, CONTINUE
1AE1 ; HANDLE A RESIDENT "PURE" PAGE
1AE1 20A01B JSR UPTIME ; UPDATE STAMP
1AE4 4CEF1A JMP NPC1 ; CONTINUE W/PAGE ADDR IN [A]
1AE7 ; FETCH A NON-RESIDENT "PURE" PAGE
1AE7 8589 NPC0: STA VPCFLG ; ([A]=0) INVALIDATE [VPC]
1AE9 20781B JSR PAGE ; GET ABS PAGE OF V-BLOCK [X] IN [A]
1AEC 4CD21A JMP NEXTPC
;THIS JUMP SHOULD NOT BE NEEDED BUT SEEMS TO HELP
1AEF ; [A] HAS ABS ADDR OF TARGET PAGE (FIRST RAM PAGE OF TWO PAGES)
1AEF 8585 NPC1: STA GPOINT+HI ; FORM MSB OF G-POINTER
1AF1 A580 LDA GPCL ; IF BIT 7 SET
1AF3 1002 BPL NPC1A
1AF5 E685 INC GPOINT+HI ; POINT [GPOINT] AT NEXT RAM PAGE
1AF7 A9FF NPC1A: LDA #$FF
1AF9 8583 STA GPCFLG ; VALIDATE [GPC]
1AFB ; [GPOINT] HAS POINTER TO ABS PAGE ADDR
1AFB ; PUT BITS 0 THRU 7 OF GPC INTO <Y>
1AFB A582 NPC2: LDA GPC0 ; PUT BIT 0 INTO <C>
1AFD 4A LSR A
1AFE A580 LDA GPCL ; GET BITS 1-8
1B00 2A ROL A ; DON'T WORRY ABOUT BIT 8
1B01 A8 TAY
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 90
--- PAGING ROUTINES ---
1B02 B184 LDA (GPOINT),Y ; GET A G-BYTE
1B04 ; INCREMENT [GPC]
1B04 ; IF CROSSING A !RAM! PAGE ADJUST [GPOINT]
1B04 ; IF CROSSING A V-PAGE INVALIDATE FLAG
1B04 48 PHA ; SAVE THE BYTE
1B05 A582 LDA GPC0 ; EFFECTIVLY ADD 1
1B07 4901 EOR #$01
1B09 8582 STA GPC0
1B0B D015 BNE NPC3 ; BRANCH NO CARRY
1B0D E680 INC GPCL
1B0F F00B BEQ NPC4 ; BRANCH CROSSED V-PAGE
1B11 A580 LDA GPCL ; TEST FOR CROSS !RAM! PAGE
1B13 297F AND #$7F
1B15 D00B BNE NPC3 ; BRANCH NO CROSS
1B17 E685 INC GPOINT+HI ; ADJUST RAM POINTER
1B19 4C221B JMP NPC3
1B1C E681 NPC4: INC GPCH ; CROSS V-PAGE
1B1E A900 LDA #00
1B20 8583 STA GPCFLG ; INVALIDATE FLAG
1B22 68 NPC3: PLA ; RESTORE BYTE
1B23 A8 TAY ; SET FLAGS
1B24 60 RTS
1B25 ; ----------------------------
1B25 ; GET A BYTE OF VIRTUAL MEMORY
1B25 ; ----------------------------
1B25 ; EXIT: SAME AS "NEXTPC"
1B25 A589 GETBYT: LDA VPCFLG ; [VPC] VALID?
1B27 D025 BNE GTBT2 ; YES, CONTINUE
1B29 A687 LDX VPCH ; GET TARGET V-PAGE
1B2B BD0007 LDA MEMMAP,X ; ALREADY IN RAM?
1B2E F00A BEQ GTBT0 ; NO, PAGE IT IN
1B30 C596 CMP PAGE0 ; IS IT PRELOADED?
1B32 900E BCC GTBT1 ; YES, CONTINUE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 91
--- PAGING ROUTINES ---
1B34 ; HANDLE A RESIDENT PAGE
1B34 20A01B JSR UPTIME ; STAMP PAGE & UPDATE STAMP
1B37 4C421B JMP GTBT1 ; CONTINUE W/BUFFER ADDR IN [A]
1B3A ; HANDLE A NON-RESIDENT PAGE
1B3A 8583 GTBT0: STA GPCFLG ; ([A]=0) INVALIDATE [GPC]
1B3C 20781B JSR PAGE ; GET ABS PAGE OF V-BLOCK [X] INTO [A]
1B3F 4C251B JMP GETBYT
;THIS JMP SHOULD NOT BE NEEDED BUT SEEMS TO HELP
1B42 ; [A] HAS ABS PAGE # OF TARGET PAGE
1B42 858B GTBT1: STA VPOINT+HI ; SET MSB OF POINTER
1B44 A586 LDA VPCL ; IF BIT 7 SET
1B46 1002 BPL GTBT1A
1B48 E68B INC VPOINT+HI ; POINT AT NEXT RAM PAGE
1B4A A9FF GTBT1A: LDA #$FF
1B4C 8589 STA VPCFLG ; VALIDATE [VPC]
1B4E ; [VPOINT] POINTS TO ABS ADDR OF TARGET V-PAGE
1B4E ; PUT BITS 0 THRU 7 OF GPC INTO <Y>
1B4E A588 GTBT2: LDA VPC0 ; PUT BIT 0 INTO <C>
1B50 4A LSR A
1B51 A586 LDA VPCL ; GET BITS 1-8
1B53 2A ROL A ; DON'T WORRY ABOUT BIT 8
1B54 A8 TAY
1B55 B18A LDA (VPOINT),Y ; GET A V-BYTE
1B57 ; INCREMENT [VPC]
1B57 ; IF CROSSING A !RAM! PAGE ADJUST [GPOINT]
1B57 ; IF CROSSING A V-PAGE INVALIDATE FLAG
1B57 48 PHA ; SAVE THE BYTE
1B58 A588 LDA VPC0 ; EFFECTIVLY ADD 1
1B5A 4901 EOR #$01
1B5C 8588 STA VPC0
1B5E D015 BNE GTBT3 ; BRANCH NO CARRY
1B60 E686 INC VPCL
1B62 F00B BEQ GTBT4 ; BRANCH CROSSED V-PAGE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 92
--- PAGING ROUTINES ---
1B64 A586 LDA VPCL ; TEST FOR CROSS !RAM! PAGE
1B66 297F AND #$7F
1B68 D00B BNE GTBT3 ; BRANCH NO CROSS
1B6A E68B INC VPOINT+HI ; ADJUST RAM POINTER
1B6C 4C751B JMP GTBT3
1B6F E687 GTBT4: INC VPCH ; CROSS V-PAGE
1B71 A900 LDA #00
1B73 8589 STA VPCFLG ; INVALIDATE FLAG
1B75 68 GTBT3: PLA ; RESTORE BYTE
1B76 A8 TAY ; SET FLAGS
1B77 60 RTS
1B78 ; -------------------------------
1B78 ; LOCATE A PAGE OF VIRTUAL MEMORY
1B78 ; -------------------------------
1B78 ;-----------------------------------------------------------------
1B78 ; A VIRTUAL PAGE IS 512 BYTES OF VIRTUAL MEMORY.
1B78 ; WHEN PAGED INTO MACHINE RAM IT MUST OCCUPY TWO CONSECUTIVE
1B78 ; 256 BYTE !RAM! PAGES.
1B78 ;
1B78 ; [PAGMAP],BUFFER RETURN THE V-PAGE IN THAT BUFFFER
1B78 ; (A BUFFER IS TWO CONSECUTIVE RAM PAGES)
1B78 ; [MEMMAP],VPAGE RETURNS RAM PAGE LOWER HALF OF VPAGE IS IN
1B78 ;
1B78 ; [PAGE0] - RAM PAGE WHERE BUFFER(0) STARTS
1B78 ;-----------------------------------------------------------------
1B78 ; ENTRY: V-BLOCK TO SEARCH FOR IN [X]
1B78 ; EXIT: ABSOLUTE PAGE ADDRESS IN [A]
1B78 86EB PAGE: STX DBLOCK ; GIVE TARGET V-PAGE TO GROS
1B7A ; DE-ALLOCATE THE EARLIEST V-PAGE
1B7A 20D61B PGE1: JSR EARLY ; GET INDEX OF EARLIEST BUFFER INTO [SWAP]
1B7D A49A LDY SWAP
1B7F BE0008 LDX PAGMAP,Y ; GET V-PAGE OF EARLIEST BUFFER
1B82 F005 BEQ PGE2 ; 0 = NO PAGE IN BUFFER
1B84 A900 LDA #0
1B86 9D0007 STA MEMMAP,X ; ZERO THE [MEMMAP] ENTRY
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 93
--- PAGING ROUTINES ---
1B89 ; SPLICE THE TARGET PAGE INTO THE BUFFER MAP
1B89 A5EB PGE2: LDA DBLOCK ; TARGET V-PAGE
1B8B 990008 STA PAGMAP,Y ; ADD IT TO BUFFER MAP
1B8E AA TAX ; USE LATER FOR INDEX INTO [MEMMAP]
1B8F 98 TYA ; CALC THE ABSOLUTE ADDRESS
1B90 0A ASL A ; * 2 FOR 512 BYTE VPAGES
1B91 18 CLC ; OF THE
1B92 6596 ADC PAGE0 ; CORRESPONDING BUFFER
1B94 9D0007 STA MEMMAP,X ; TELL [MEMMAP] WHERE TO FIND THE PAGE
1B97 85EE STA DBUFF+HI ; TELL GROS WHERE THE BUFFER IS
1B99 859B STA TARGET ; SAVE HERE
1B9B 202722 JSR GETDSK ; GET PAGE [DBLOCK] INTO [DBUFF]
1B9E A59B LDA TARGET ; RESTORE BUFFER PAGE
1BA0 ; FALL THROUGH ...
1BA0 ; ----------------
1BA0 ; UPDATE TIMESTAMP
1BA0 ; ----------------
1BA0 ; ENTRY: ABS BUFFER PAGE OF V-BLOCK
1BA0 859B UPTIME: STA TARGET ; SAVE FOR LATER
1BA2 38 SEC ; FORM A ZERO-ALIGNED
1BA3 E596 SBC PAGE0 ; INDEX
;***
1BA5 4A LSR A ; / 2 FOR 512 BYTE PAGES
;***
1BA6 A8 TAY ; INTO [LRUMAP]
1BA7 B98008 LDA LRUMAP,Y ; CHECK THIS PAGE'S STAMP
1BAA C598 CMP STAMP ; SAME AS CURRENT STAMP?
1BAC F025 BEQ UT3 ; EXIT NOW IF SO
1BAE E698 INC STAMP ; ELSE UPDATE STAMP
1BB0 D01C BNE UT2 ; CONTINUE IF NO OVERFLOW
1BB2 ; HANDLE STAMP OVERFLOW
1BB2 20EF1B JSR EARLY2 ; GET EARLIEST STAMP INTO [LRU]
1BB5 A200 LDX #0 ; INIT INDEX
1BB7 BD8008 UT0: LDA LRUMAP,X ; ELSE GET A STAMP READING
1BBA F006 BEQ UT1 ; EXIT IF ZERO
1BBC 38 SEC ; SUBTRACT OFF
1BBD E599 SBC LRU ; EARLIEST STAMP READING
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 94
--- PAGING ROUTINES ---
1BBF 9D8008 STA LRUMAP,X ; REPLACE IN MAP
1BC2 E8 UT1: INX
1BC3 E497 CPX PMAX ; LOOP TILL
1BC5 90F0 BCC UT0 ; ALL STAMPS FIXED
1BC7 A900 LDA #0 ; TURN BACK
1BC9 38 SEC ; THE CLOCK
1BCA E599 SBC LRU ; TO REFLECT STAMP FUDGING
1BCC 8598 STA STAMP
1BCE A598 UT2: LDA STAMP ; STAMP BUFFER [Y]
1BD0 998008 STA LRUMAP,Y ; WITH THE NEW STAMP
1BD3 A59B UT3: LDA TARGET ; RESTORE BUFFER ADDR
1BD5 60 RTS
1BD6 ; --------------------------------
1BD6 ; LOCATE EARLIEST ACTIVE TIMESTAMP
1BD6 ; --------------------------------
1BD6 ; EXIT: [LRU] = EARLIEST TIMESTAMP
1BD6 ; [SWAP] = INDEX TO EARLIEST BUFFER
1BD6 A200 EARLY: LDX #0 ; INIT INDEX
1BD8 869A STX SWAP
1BDA AD8008 LDA LRUMAP ; GET TIMESTAMP OF BUFFER #0
1BDD E8 INX ; START COMPARE WITH BUFFER #1
1BDE DD8008 EAR0: CMP LRUMAP,X ; IS THIS STAMP EARLIER THAN [A]?
1BE1 9005 BCC EAR1 ; IF STILL SMALLER, TRY NEXT STAMP
1BE3 BD8008 LDA LRUMAP,X ; ELSE CHANGE EARLIEST ENTRY
1BE6 869A STX SWAP ; AND UPDATE BUFFER INDEX
1BE8 E8 EAR1: INX
1BE9 E497 CPX PMAX ; OUT OF BUFFERS?
1BEB 90F1 BCC EAR0 ; LOOP TILL EMPTY
1BED 60 RTS ; [SWAP] HAS INDEX TO EARLIEST BUFFER
1BEE ; THIS IS FOR OVERFLOW, IGNORES 0 ENTRIES
1BEE 00 SAVEY: DB 0
1BEF A200 EARLY2: LDX #0 ; INIT INDEX
1BF1 869A STX SWAP
1BF3 8CEE1B STY SAVEY
1BF6 BD8008 EAR23: LDA LRUMAP,X ; GET TIMESTAMP OF BUFFER #0
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MEMORY MANAGEMENT PAGE 95
--- PAGING ROUTINES ---
1BF9 C900 CMP #0 ; DON'T USE A ZERO VALUE
1BFB D007 BNE EAR22 ; OK, NOT 0
1BFD E8 INX
1BFE E497 CPX PMAX ; OUT OF BUFFERS?
1C00 90F4 BCC EAR23 ; NO, KEEP LOOKING
1C02 B013 BCS EAR24 ; YUP, SO WILL HAVE TO USE 0
1C04 E8 EAR22: INX ; START COMPARE WITH NEXT BUFFER
1C05 DD8008 EAR20: CMP LRUMAP,X ; IS THIS STAMP EARLIER THAN [A]?
1C08 9008 BCC EAR21 ; IF STILL SMALLER, TRY NEXT STAMP
1C0A BC8008 LDY LRUMAP,X
1C0D F003 BEQ EAR21
1C0F 98 TYA
1C10 869A STX SWAP
1C12 E8 EAR21: INX
1C13 E497 CPX PMAX ; OUT OF BUFFERS?
1C15 90EE BCC EAR20 ; LOOP TILL EMPTY
1C17 8599 EAR24: STA LRU ; [A] HAS EARLIEST STAMP
; CMP #2 ; DON'T MAKE IT 0
; BCC EAR25
1C19 C699 DEC LRU ; MAKE SO END RESULT NOT 0
1C1B ACEE1B EAR25: LDY SAVEY
1C1E 60 RTS ; [SWAP] HAS INDEX TO EARLIEST BUFFER
END
INCLUD MACHINE.ASM ; M
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 96
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1C1F ; ------------
1C1F ; CLEAR SCREEN
1C1F ; ------------
1C1F ; CLEAR SCREEN TO WHITE IF [ARG1] NEGATIVE
1C1F ; CLEAR SCREEN TO BLACK IF [ARG1] POSITIVE
1C1F A900 GCLEAR: LDA #LOW SCREEN ; MAKE [I] POINT TO
1C21 857A STA I+LO ; THE 1ST BYTE OF
1C23 A9A1 LDA #HIGH SCREEN ; SCREEN RAM
1C25 857B STA I+HI
1C27 A21E LDX #30 ; # PAGES TO CLEAR
1C29 A000 LDY #0 ; INIT LOOP INDEX
1C2B A56E LDA ARG1+HI ; IF [ARG1]
1C2D 3004 BMI GCLSN ; NEGATIVE CLEAR TO WHITE
1C2F A900 LDA #00
1C31 F002 BEQ GCLS ; CLEAR SCREEN TO BLACK
1C33 A9FF GCLSN: LDA #$FF ; ELSE CLEAR TO WHITE
1C35 917A GCLS: STA (I),Y
1C37 C8 INY
1C38 D0FB BNE GCLS
1C3A E67B INC I+HI
1C3C CA DEX
1C3D D0F6 BNE GCLS
1C3F 60 RTS
1C40 ; ------------------------
1C40 ; TEXT (ATARI SCREEN CODE)
1C40 ; ------------------------
1C40 296E7465 ERRM: DB 41,110,116,101,114,110,97,108,0 ; INTERNAL
1C49 2572726F DB 37,114,114,111,114,0,3,0 ; ERROR #
0011 ERRML EQU $-ERRM
1C51 252E2400 ENDM: DB 37,46,36,0,47,38,0 ; END OF
1C58 33253333 DB 51,37,51,51,41,47,46 ; SESSION
000E ENDML EQU $-ENDM
1C5F ; -----
1C5F ; ERROR
1C5F ; -----
1C5F ; ENTRY: ERROR CODE IN [A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 97
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1C5F 8500 GERROR: STA $00 ; SAVE ERROR CODE
1C61 20A61C JSR STATUS ; SET UP STATUS LINE
1C64 A240 LDX #LOW ERRM ; GET LSB
1C66 A91C LDA #HIGH ERRM ; AND MSB OF TEXT ADDRESS
1C68 A011 LDY #ERRML ; AND ITS LENGTH
1C6A 20E51C JSR PRINT ; PRINT "INTERNAL ERROR #"
1C6D A500 LDA $00 ; RETRIEVE ERROR CODE
1C6F 20CE1C JSR HEX ; DISPLAY IT IN HEX
1C72 A900 LDA #0
1C74 20DD1C JSR CHAR ; PRINT A SPACE
1C77 4C811C JMP GOVER ; AND PRINT "GAME OVER"
1C7A ; ----
1C7A ; QUIT
1C7A ; ----
1C7A 20A61C GQUIT: JSR STATUS ; SET UP MESSAGE LINE
1C7D A90D LDA #13
1C7F 85F5 STA CURSOR ; CENTER TEXT
1C81 A251 GOVER: LDX #LOW ENDM ; LSB AND
1C83 A91C LDA #HIGH ENDM ; MSB OF TEXT ADDRESS
1C85 A00E LDY #ENDML ; LENGTH
1C87 20E51C JSR PRINT ; PRINT "GAME OVER"
1C8A AD1FD0 HOLD: LDA CONSOL ; WAIT FOR CONSOLE KEYPRESS
1C8D C907 CMP #7
1C8F F0F9 BEQ HOLD
1C91 AD1FD0 LETGO: LDA CONSOL ; WAIT FOR KEY RELEASE
1C94 C907 CMP #7
1C96 D0F9 BNE LETGO
1C98 4CEB0B JMP COLD ; AND DO A COLDSTART
1C9B ; -----------------
1C9B ; CLEAR STATUS LINE
1C9B ; -----------------
1C9B A24F NEWLIN: LDX #79
1C9D A900 LDA #0
1C9F 9DA003 NEWL0: STA TEXT,X
1CA2 CA DEX
1CA3 10FA BPL NEWL0
1CA5 60 RTS
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 98
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1CA6 ; ------------------
1CA6 ; SET UP STATUS LINE
1CA6 ; ------------------
1CA6 ; FOR ERRORS & DEBUGGER
1CA6 209B1C STATUS: JSR NEWLIN
1CA9 A900 LDA #0
1CAB 85F5 STA CURSOR
1CAD A215 LDX #LOW DL1 ; TELL THE D-LIST WHERE
1CAF A90B LDA #HIGH DL1 ; TO START ITSELF
1CB1 8EE90B STX DLTOP+LO
1CB4 8DEA0B STA DLTOP+HI
1CB7 8E3002 STX SDLSTL+LO ; ALSO TELL ANTIC
1CBA 8D3102 STA SDLSTL+HI ; WHERE TO FIND OUR LIST
1CBD 60 RTS
1CBE ; ----------------
1CBE ; PRINT [A] IN HEX
1CBE ; ----------------
1CBE ; HEX CHARS IN ATARI SCREEN CODE
1CBE 10111213 HCHARS: DB 16,17,18,19,20,21,22,23,24,25 ; 0-9
1CC8 21222324 DB 33,34,35,36,37,38 ; A-F
1CCE 48 HEX: PHA ; SAVE HERE
1CCF 4A LSR A ; SHIFT TOP NIBBLE
1CD0 4A LSR A ; INTO POSITION
1CD1 4A LSR A
1CD2 4A LSR A
1CD3 20D71C JSR NIBBLE ; AND PRINT IT
1CD6 68 PLA ; RETRIEVE BYTE
1CD7 290F NIBBLE: AND #%00001111 ; ISOLATE BITS 3-0
1CD9 AA TAX
1CDA BDBE1C LDA HCHARS,X
1CDD ; FALL THROUGH ...
1CDD ; -----------------
1CDD ; PRINT CHAR IN [A]
1CDD ; -----------------
1CDD A6F5 CHAR: LDX CURSOR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 99
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1CDF 9DA003 STA TEXT,X
1CE2 E6F5 INC CURSOR
1CE4 60 RTS
1CE5 ; ----------
1CE5 ; PRINT TEXT
1CE5 ; ----------
1CE5 ; ENTRY: TEXT ADDRESS IN [X/A] (LSB/MSB)
1CE5 ; TEXT LENGTH IN [Y]
1CE5 86F2 PRINT: STX LINE+LO ; LSB OF ADDRESS
1CE7 85F3 STA LINE+HI ; MSB OF ADDRESS
1CE9 84F4 STY LEN ; LENGTH
1CEB A000 LDY #0
1CED A6F5 LDX CURSOR
1CEF B1F2 PR0: LDA (LINE),Y
1CF1 9DA003 STA TEXT,X
1CF4 E8 INX
1CF5 C8 INY
1CF6 C6F4 DEC LEN
1CF8 D0F5 BNE PR0
1CFA 86F5 STX CURSOR
1CFC 60 RTS
1CFD ; ------
1CFD ; MEMTOP
1CFD ; ------
1CFD ; EXIT: [A]=$A0 IF 48K, ELSE [A]=0
1CFD A900 MEMTOP: LDA #0 ; CLEAR $A000
1CFF 8D00A0 STA $A000
1D02 AE00A0 LDX $A000 ; CHECK THE VALUE
1D05 D002 BNE EMPTY ; RETURN [A]=0 IF NON-ZERO
1D07 A9A0 LDA #$A0 ; ELSE RETURN $A0
1D09 60 EMPTY: RTS
1D0A ; ------
1D0A ; RANDOM
1D0A ; ------
1D0A ; EXIT: RANDOM 16-BIT WORD IN [X/A]
1D0A AD0AD2 DORAND: LDA RANDOM
1D0D EA NOP ; A PAUSE ...
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 100
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1D0E AE0AD2 LDX RANDOM
1D11 60 RTS
1D12 ; ------------
1D12 ; SIMPLE DELAY
1D12 ; ------------
1D12 ; ENTRY: NEGATIVE JIFFY COUNT IN [VALUE]
1D12 A900 DELAY: LDA #0 ; WAIT A JIFFY
1D14 8514 STA RTCLOK
1D16 A514 DEL1: LDA RTCLOK
1D18 F0FC BEQ DEL1
1D1A E678 INC VALUE+LO
1D1C D0F4 BNE DELAY
1D1E E679 INC VALUE+HI
1D20 D0F0 BNE DELAY
1D22 F019 BEQ MOVED ; GET A VALUE AND RETURN
1D24 ; -----
1D24 ; INPUT
1D24 ; -----
1D24 A56D GINPUT: LDA ARG1+LO ; MOVE [ARG1] INTO [VALUE]
1D26 8578 STA VALUE+LO
1D28 A56E LDA ARG1+HI
1D2A 8579 STA VALUE+HI
1D2C A56C LDA NARGS ; IF THERE ARE 2 ARGS THEN DO THE TABLE
1D2E C901 CMP #1 ; ITERATIONS
1D30 F003 BEQ NOIT
1D32 4CAC17 JMP ITRATE ; YES VIRGINIA, A JUMP
1D35 A579 NOIT: LDA VALUE+HI
1D37 30D9 BMI DELAY ; DO A SIMPLE DELAY
1D39 0578 ORA VALUE+LO ; IF NON-ZERO,
1D3B D006 BNE TICK ; ENTER SENSE LOOP
1D3D 205D1D MOVED: JSR SENSE ; ELSE READ JUST ONCE
1D40 4C600F MOVED2: JMP PUTBYT ; ELSE RETURN [A]
1D43 ; INPUT SENSE LOOP
1D43 205D1D TICK: JSR SENSE ; GET READING INTO [A]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 101
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1D46 C98F CMP #%10001111 ; ANY INPUT?
1D48 D0F6 BNE MOVED2 ; YES, RETURN IT
1D4A A900 LDA #0 ; ELSE WAIT 1 JIFFY
1D4C 8514 STA RTCLOK
1D4E A514 TICK1: LDA RTCLOK
1D50 F0FC BEQ TICK1
1D52 200610 JSR DECVAL ; DECREMENT COUNT
1D55 A578 LDA VALUE+LO
1D57 0579 ORA VALUE+HI ; ZERO YET?
1D59 D0E8 BNE TICK ; NO, LOOP BACK
1D5B F0E0 BEQ MOVED ; RETURN
1D5D ; -------------------------
1D5D ; CHECK KEYBOARD & JOYSTICK
1D5D ; -------------------------
1D5D ; EXIT: INPUT STATUS IN [A]
1D5D A900 SENSE: LDA #0
1D5F 854D STA ATRACT ; KILL ATTRACT MODE
1D61 ADFC02 LDA CH ; READ THE KEYBOARD REGISTER
1D64 C9FF CMP #$FF ; KEY PRESSED YET?
1D66 F01B BEQ STICK ; IF NOT, CHECK STICK
1D68 A8 TAY ; ELSE SAVE KEYCODE HERE
1D69 A2FF LDX #$FF ; RESET THE
1D6B 8EFC02 STX CH ; KEYBOARD REGISTER
1D6E 29C0 AND #%11000000 ; SHIFT OR CTRL CHAR?
1D70 D011 BNE STICK ; IGNORE IF SO
1D72 B9921D LDA ATASCI,Y ; GET ATASCII CODE INTO [A]
1D75 C961 CMP #'a' ; CONVERT TO
1D77 9007 BCC KEXIT ; UPPER CASE ALPHA
1D79 C97B CMP #'z'+1 ; IF NECESSARY
1D7B B003 BCS KEXIT
1D7D 38 SEC
1D7E E920 SBC #$20
1D80 297F KEXIT: AND #%01111111 ; MAKE SURE IT'S POSITIVE
1D82 60 RTS
1D83 ; CHECK THE JOYSTICK
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 102
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1D83 AD7802 STICK: LDA STICK0
1D86 290F AND #%00001111 ; MASK GARBAGE
1D88 AE8402 LDX STRIG0 ; ALSO CHECK TRIGGER
1D8B D002 BNE STIKEX ; EXIT IF NOT PRESSED
1D8D 0910 ORA #%00010000 ; ELSE SET BIT 4
1D8F 0980 STIKEX: ORA #%10000000 ; NEGATIVE FOR STICK READING
1D91 60 RTS ; RETURN WITH CODE IN [A]
1D92 ; ------------------------
1D92 ; ATASCII CONVERSION TABLE
1D92 ; ------------------------
1D92 6C6A3B8A ATASCI: DB $6C,$6A,$3B,$8A,$8B,$6B,$2B,$2A
1D9A 6F807075 DB $6F,$80,$70,$75,$9B,$69,$2D,$3D
1DA2 7680638C DB $76,$80,$63,$8C,$8D,$62,$78,$7A
1DAA 34803336 DB $34,$80,$33,$36,$1B,$35,$32,$31
1DB2 2C202E6E DB $2C,$20,$2E,$6E,$80,$6D,$2F,$81
1DBA 72806579 DB $72,$80,$65,$79,$7F,$74,$77,$71
1DC2 39803037 DB $39,$80,$30,$37,$7E,$38,$3C,$3E
1DCA 66686480 DB $66,$68,$64,$80,$82,$67,$73,$61
1DD2 ; --------------------
1DD2 ; DUMP BLOCK TO SCREEN
1DD2 ; --------------------
1DD2 ; ENTRY: BLOCK TO DUMP IN [BLOCK] (TOP BYTE IN [BLOCK+7])
1DD2 ; X-COORDINATE IN [X], Y-COORDINATE IN [A]
1DD2 86E4 DUMP: STX TOX ; SAVE X-COORDINATE
1DD4 0A ASL A ; MULTIPLY Y-COORD BY 8
1DD5 0A ASL A ; TO GET MODE LINE (0-191)
1DD6 0A ASL A
1DD7 A8 TAY ; USE AS INDEX
1DD8 A207 LDX #7 ; INIT BLOCK-FETCHING INDEX
1DDA B90009 DUMP0: LDA VLOWS,Y ; GET LSB OF LINE ADDR
1DDD 18 CLC
1DDE 65E4 ADC TOX ; ADD X-POS
1DE0 8DEE1D STA TOADR+LO ; TO GET LSB OF SCREEN ADDR
1DE3 B9C009 LDA VHIGHS,Y ; GET MSB OF LINE ADDR
1DE6 6900 ADC #0
1DE8 8DEF1D STA TOADR+HI ; FORM MSB OF SCREEN ADDR
1DEB B5D3 LDA BLOCK,X ; GET BLOCK DATA
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 103
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1DED 8D DB $8D ; 6502 "STA nnnn" INSTRUCTION
1DEE 0000 TOADR: DW $0000 ; SCREEN RAM ADDRESS
1DF0 C8 INY ; NEXT SCAN LINE
1DF1 CA DEX ; DONE 8 BYTES YET?
1DF2 10E6 BPL DUMP0 ; NO, FETCH MORE
1DF4 60 RTS
1DF5 ; -----------------------------------------------
1DF5 ; DUMP BLOCK TO SCREEN WITH MASK
1DF5 ;
1DF5 ; IF THE MASK BIT IS 1 THEN THE SCREEN SHOWS THRU
1DF5 ; IF THE MASK BIT IS 0 THEN THE ICON IS DISPLAYED
1DF5 ; -----------------------------------------------
1DF5 ; ENTRY: BLOCK TO DUMP IN [BLOCK] (TOP BYTE IN [BLOCK+7])
1DF5 ; MASK IN [MASK]
1DF5 ; X-COORDINATE IN [X], Y-COORDINATE IN [A]
1DF5 86E4 DMPMSK: STX TOX ; SAVE X-COORDINATE
1DF7 0A ASL A ; MULTIPLY Y-COORD BY 8
1DF8 0A ASL A ; TO GET MODE LINE (0-191)
1DF9 0A ASL A
1DFA A8 TAY ; USE AS INDEX
1DFB A207 LDX #7 ; INIT BLOCK-FETCHING INDEX
1DFD B90009 DMSK0: LDA VLOWS,Y ; GET LSB OF LINE ADDR
1E00 18 CLC
1E01 65E4 ADC TOX ; ADD X-POS
1E03 8D151E STA TOADR2+LO+1 ; TO GET LSB OF SCREEN ADDR
1E06 8D1E1E STA TOADR3+LO+1
1E09 B9C009 LDA VHIGHS,Y ; GET MSB OF LINE ADDR
1E0C 6900 ADC #0
1E0E 8D161E STA TOADR2+HI+1 ; FORM MSB OF SCREEN ADDR
1E11 8D1F1E STA TOADR3+HI+1
1E14 ADFFFF TOADR2: LDA $FFFF ; DUMMY GET SCREEN BYTE
1E17 55D3 EOR BLOCK,X
1E19 35DB AND MASK,X
1E1B 55D3 EOR BLOCK,X
1E1D 8DFFFF TOADR3: STA $FFFF ; DUMMY PUT BACK ON SCREEN
1E20 C8 INY ; NEXT SCAN LINE
1E21 CA DEX ; DONE 8 BYTES YET?
1E22 10D9 BPL DMSK0 ; NO, FETCH MORE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 104
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1E24 60 RTS
1E25 ; -----
1E25 ; SOUND
1E25 ; -----
1E25 ; PLAY SOUND [ARG1] (1-127)
1E25 A56D GSOUND: LDA ARG1+LO
1E27 3018 BMI SNDERR ; RANGE ERROR!
1E29 C905 CMP #SOUNDS+1
1E2B B014 BCS SNDERR ; SOUND NOT DEFINED
1E2D 38 SEC
1E2E E901 SBC #1 ; ZERO-ALIGN
1E30 0A ASL A ; AND WORD-ALIGN
1E31 AA TAX ; THE SOUND ID INDEX
1E32 BD561F LDA STABLE+LO,X ; GET LSB OF EXECUTION ADDR
1E35 8D3F1E STA PLAY+LO
1E38 BD571F LDA STABLE+HI,X ; AND MSB
1E3B 8D401E STA PLAY+HI
1E3E 4C DB $4C ; 6502 "JMP" INSTRUCTION
1E3F 0000 PLAY: DW $0000 ; SOUND JUMP VECTOR
1E41 ; *** ERROR #13: UNDEFINED SOUND ***
1E41 A90D SNDERR: LDA #13
1E43 4C5F1C JMP GERROR
1E46 ; -----
1E46 ; COPY?
1E46 ; -----
1E46 ; IS THIS A LEGAL COPY OF THE DISK?
0FAE GCOPYP EQU PREDS
1E46 ; -------
1E46 ; VERIFY?
1E46 ; -------
1E46 ; ARE THE GAME AND IMAGE FILES INTACT?
1E46 ; NOTE: THIS DOES NOT OBSERVE EXTRA BIT LOW
1E46 ; BUT USES EXTRA BIT HIGH! Le
1E46 A900 GVERP: LDA #0 ; CLEAR
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 105
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1E48 857C STA J+LO ; ACCUM FOR CHECKSUM
1E4A 857D STA J+HI
1E4C 857E STA K+LO
1E4E 85EB STA DBLOCK ; START AT 1ST GAME SECTOR
1E50 8587 STA VPCH ; START @ BYTE 0064
1E52 8588 STA VPC0 ; USE AS HIGH BIT
1E54 A940 LDA #64 ; 64 W/LOW BIT IN VPC0
1E56 8586 STA VPCL
1E58 AD1223 LDA GBEGIN+GLEN ; SET BYTE LENGTH
1E5B 857B STA I+HI ; FOR GAME CHECK
1E5D AD1323 LDA GBEGIN+GLEN+1 ; (LENGTH IN WORDS -
1E60 0A ASL A ; SO MULTIPLY BY 2
1E61 857A STA I+LO ; TO GET BYTES
1E63 267B ROL I+HI
1E65 267E ROL K+LO
1E67 4C6E1E JMP READIN ; READ 1ST PAGE IN
1E6A A586 VSUM: LDA VPCL ; NEW PAGE?
1E6C D018 BNE VSUM2 ; NO, CONTINUE
1E6E A200 READIN: LDX #0 ; SET UP FOR GETDSK
1E70 86EC STX DBTOP
1E72 86F1 STX DCNT
1E74 E8 INX
1E75 8E0103 STX DUNIT
1E78 A952 LDA #$52 ; "READ"
1E7A 8D0203 STA DCOMND
1E7D A904 LDA #HIGH BUFFER ; NO MOVE
1E7F 85EE STA DBUFF+HI
1E81 A5EB LDA DBLOCK
1E83 205222 JSR GETGME
1E86 A486 VSUM2: LDY VPCL ; GET THIS BYTE
1E88 B90004 LDA BUFFER,Y
1E8B E686 INC VPCL ; SET FOR NEXT BYTE
1E8D D006 BNE VSUM3
1E8F E687 INC VPCH
1E91 D002 BNE VSUM3
1E93 E688 INC VPC0
1E95 18 VSUM3: CLC
1E96 657C ADC J+LO ; ADD IT TO ACCUM
1E98 857C STA J+LO
1E9A 9002 BCC VSUM0
1E9C E67D INC J+HI
1E9E A586 VSUM0: LDA VPCL ; CHECK IF ALL BYTES DONE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 106
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1EA0 C57A CMP I+LO
1EA2 D0C6 BNE VSUM
1EA4 A587 LDA VPCH
1EA6 C57B CMP I+HI
1EA8 D0C0 BNE VSUM
1EAA A588 LDA VPC0
1EAC C57E CMP K+LO
1EAE D0BA BNE VSUM ; AS WORD ALIGNED SIZE
1EB0 AD1423 LDA GBEGIN+GCHECK
1EB3 C57D CMP J+HI
1EB5 F003 BEQ VSUM4
1EB7 4C531F JMP BADVER ; OOPS
1EBA AD1523 VSUM4: LDA GBEGIN+GCHECK+1
1EBD C57C CMP J+LO
1EBF F003 BEQ IFILE
1EC1 4C531F JMP BADVER
1EC4 ; GAME FILE OK, CHECK IMAGE FILE
1EC4 A900 IFILE: LDA #0
1EC6 857E STA K+LO
1EC8 A591 LDA ICODE+LO ; FIND VIRTUAL IBEGIN
1ECA 857C STA J+LO
1ECC A592 LDA ICODE+HI
1ECE 857D STA J+HI
1ED0 A000 LDY #ILEN ; OFFSET TO LENGTH
1ED2 B17C LDA (J),Y
1ED4 857B STA I+HI ; SET I TO LENGTH
1ED6 C8 INY
1ED7 B17C LDA (J),Y
1ED9 0A ASL A ; *2 AS WORD VALUE
1EDA 857A STA I+LO
1EDC 267B ROL I+HI
1EDE 267E ROL K+LO
1EE0 A004 LDY #ICHECK ; GET CHECKSUM
1EE2 B17C LDA (J),Y ; WHILE IT'S EASY
1EE4 85F7 STA CHKSUM+HI ; SAVE IT HERE
1EE6 C8 INY
1EE7 B17C LDA (J),Y
1EE9 85F6 STA CHKSUM+LO
1EEB A900 LDA #0 ; CLEAR FOR IMAGE FILE
1EED 857C STA J+LO
1EEF 857D STA J+HI
1EF1 8587 STA VPCH
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 107
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1EF3 8588 STA VPC0
1EF5 85EB STA DBLOCK ; SET TO START OF IMAGE SECTORS.
1EF7 A908 LDA #8
1EF9 8586 STA VPCL ; HEADER OF IMAGE FILE
1EFB 4C021F JMP IRDIN
1EFE A586 ISUM: LDA VPCL ; NEW PAGE?
1F00 D018 BNE ISUM2 ; NO, CONTINUE
1F02 A200 IRDIN: LDX #0 ; SET UP FOR GETDSK
1F04 86EC STX DBTOP
1F06 86F1 STX DCNT
1F08 E8 INX
1F09 8E0103 STX DUNIT
1F0C A952 LDA #$52 ; "READ"
1F0E 8D0203 STA DCOMND
1F11 A904 LDA #HIGH BUFFER ; NO MOVE
1F13 85EE STA DBUFF+HI
1F15 A5EB LDA DBLOCK
1F17 204122 JSR GETIMG
1F1A A486 ISUM2: LDY VPCL ; GET THIS BYTE
1F1C B90004 LDA BUFFER,Y
1F1F E686 INC VPCL ; SET FOR NEXT BYTE
1F21 D006 BNE ISUM3
1F23 E687 INC VPCH
1F25 D002 BNE ISUM3
1F27 E688 INC VPC0
1F29 18 ISUM3: CLC
1F2A 657C ADC J+LO ; ADD IT TO ACCUM
1F2C 857C STA J+LO
1F2E 9002 BCC ISUM0
1F30 E67D INC J+HI
1F32 A586 ISUM0: LDA VPCL ; CHECK IF ALL BYTES DONE
1F34 C57A CMP I+LO
1F36 D0C6 BNE ISUM
1F38 A587 LDA VPCH
1F3A C57B CMP I+HI
1F3C D0C0 BNE ISUM
1F3E A588 LDA VPC0
1F40 C57E CMP K+LO
1F42 D0BA BNE ISUM ; AS WORD ALIGNED SIZE
1F44 A5F6 LDA CHKSUM+LO ; COMPARE TO SAVED CHECKSUM
1F46 C57C CMP J+LO
1F48 D009 BNE BADVER
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 108
--- MACHINE-DEPENDENT ROUTINES: ATARI ---
1F4A A5F7 LDA CHKSUM+HI
1F4C C57D CMP J+HI
1F4E D003 BNE BADVER
1F50 4CAE0F JMP PREDS ; SUCCESS!
1F53 4CA20F BADVER: JMP PREDF
END
INCLUD SOUND.ASM ; M
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 109
GAME-DEPENDENT SOUND LIBRARY (ATARI FOOBLITSKY)
1F56 ; ----------------------------
1F56 ; GAME-DEPENDENT SOUND LIBRARY
1F56 ; ----------------------------
1F56 5E1F STABLE: DW SND1
1F58 661F DW SND2
1F5A 7C1F DW SND3
1F5C A61F DW SND4
0004 SOUNDS EQU 4 ; # SOUNDS IN LIBRARY
1F5E ; ----------------
1F5E ; SOUND #1: "BOOP"
1F5E ; ----------------
1F5E A296 SND1: LDX #150 ; FREQUENCY
1F60 A9FC LDA #252 ; DURATION (4 JIFFIES)
1F62 A0AE LDY #$AE ; FULL VOLUME, NO DISTORTION
1F64 D006 BNE NOISE
1F66 ; -----------------
1F66 ; SOUND #2: "CLICK"
1F66 ; -----------------
1F66 A219 SND2: LDX #25 ; FREQUENCY
1F68 A9FF LDA #255 ; DURATION (1 JIFFY)
1F6A A0AE LDY #$AE ; FULL VOLUME, NO DISTORTION
1F6C ; FALL THROUGH ...
1F6C 8E00D2 NOISE: STX AUDF1
1F6F 8C01D2 STY AUDC1
1F72 8514 STA RTCLOK ; START TIMER
1F74 A514 S1L: LDA RTCLOK
1F76 D0FC BNE S1L
1F78 8D01D2 STA AUDC1 ; STOP SOUND
1F7B 60 RTS
1F7C ; ----------------
1F7C ; SOUND #3: "TING"
1F7C ; ----------------
1F7C A90A SND3: LDA #10 ; FREQUENCY
1F7E 8D00D2 STA AUDF1
1F81 A9AE LDA #$AE ; FULL, PURE TONE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 110
GAME-DEPENDENT SOUND LIBRARY (ATARI FOOBLITSKY)
1F83 8D01D2 STA AUDC1
1F86 A9FB LDA #251 ; 5-JIFFY SUSTAIN
1F88 8514 STA RTCLOK
1F8A A514 S3L1: LDA RTCLOK
1F8C D0FC BNE S3L1
1F8E ; DECAY TO ZERO VOLUME
1F8E A20E LDX #$0E ; VOLUME INDEX
1F90 8A S3L2: TXA
1F91 09A0 ORA #$A0 ; SUPERIMPOSE DISTORTION (PURE)
1F93 8D01D2 STA AUDC1
1F96 A9FC LDA #252 ; WAIT 4 JIFFIES ON EACH LEVEL
1F98 8514 STA RTCLOK
1F9A A514 S3L3: LDA RTCLOK
1F9C D0FC BNE S3L3
1F9E CA DEX
1F9F CA DEX ; LOOP BACK TILL
1FA0 D0EE BNE S3L2 ; NO MORE VOLUME
1FA2 8E01D2 STX AUDC1 ; STOP TONE
1FA5 60 RTS
1FA6 ; ----------------
1FA6 ; SOUND #4: "RAZZ"
1FA6 ; ----------------
1FA6 A964 SND4: LDA #100 ; FREQUENCY
1FA8 8D00D2 STA AUDF1
1FAB A92E LDA #$2E ; LOUD, DISTORTED TONE
1FAD 8D01D2 STA AUDC1
1FB0 A9FB LDA #251 ; 5-JIFFY SUSTAIN
1FB2 8514 STA RTCLOK
1FB4 A514 S4L1: LDA RTCLOK
1FB6 D0FC BNE S4L1
1FB8 ; DECAY TO ZERO VOLUME
1FB8 A20E LDX #$0E ; VOLUME INDEX
1FBA 8A S4L2: TXA
1FBB 0920 ORA #$20 ; SUPERIMPOSE DISTORTION
1FBD 8D01D2 STA AUDC1
1FC0 A9FC LDA #252 ; WAIT 4 JIFFIES ON EACH LEVEL
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 111
GAME-DEPENDENT SOUND LIBRARY (ATARI FOOBLITSKY)
1FC2 8514 STA RTCLOK
1FC4 A514 S4L3: LDA RTCLOK
1FC6 D0FC BNE S4L3
1FC8 CA DEX
1FC9 CA DEX ; LOOP BACK TILL
1FCA D0EE BNE S4L2 ; NO MORE VOLUME
1FCC 8E01D2 STX AUDC1 ; STOP TONE
1FCF 60 RTS
END
INCLUD SAVE.ASM ; M
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 112
--- SAVE/RESTORE ---
1FD0 ; --------
1FD0 ; GRESTORE
1FD0 ; --------
1FD0 20C821 GREST: JSR SRINIT ; INIT SCREEN, GET CR
1FD3 A900 LDA #0
1FD5 8583 STA GPCFLG ; INVALIDATE [GPC]
1FD7 8589 STA VPCFLG ; AND [VPC]
1FD9 A936 LDA #54
1FDB 85F5 STA CURSOR ; CENTER TEXT
1FDD A292 LDX #LOW RSTG
1FDF A921 LDA #HIGH RSTG
1FE1 A00E LDY #RSTGL
1FE3 20E51C JSR PRINT ; "RESTORING ..."
1FE6 200721 JSR READ ; READ 1ST BLOCK INTO [BUFFER]
1FE9 B07F BCS BADRD ; SCRAM IF ERROR
1FEB AD0004 LDA BUFFER ; CHECK MSB
1FEE CD0223 CMP GBEGIN+GID ; OF GAME ID
1FF1 D077 BNE BADRD ; SCRAM IF NO MATCH
1FF3 AD0104 LDA BUFFER+1 ; SAME FOR LSB
1FF6 CD0323 CMP GBEGIN+GID+1
1FF9 D06F BNE BADRD
1FFB AD0704 LDA BUFFER+7 ; ALSO COMPARE SIZE SAVED
1FFE C596 CMP PAGE0 ; TO CURRENT SIZE
2000 D068 BNE BADRD ; EXIT IF BAD
2002 AD0204 RST0: LDA BUFFER+2
2005 858E STA GSP ; RESTORE [GSP]
2007 AD0304 LDA BUFFER+3
200A 858F STA OLDGSP ; [OLDGSP]
200C AD0404 LDA BUFFER+4
200F 8580 STA GPCL ; [GPCL]
2011 AD0504 LDA BUFFER+5
2014 8581 STA GPCH ; [GPCH]
2016 AD0504 LDA BUFFER+5
2019 8581 STA GPCH ; [GPCH]
201B AD0604 LDA BUFFER+6
201E 8582 STA GPC0 ; [GPC0]
2020 A200 LDX #0
2022 8683 STX GPCFLG ; INVALIDATE [GPC]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 113
--- SAVE/RESTORE ---
2024 8689 STX VPCFLG ; AND [VPC]
2026 E8 INX ; = 1
2027 8698 STX STAMP ; RESET TIMESTAMP (?)
2029 A24F LDX #79 ; RESTORE [LOCALS], [CARGS], [CTYPES]
202B BD0804 RST1: LDA BUFFER+8,X
202E 9D800A STA LOCALS,X
2031 CA DEX
2032 10F7 BPL RST1
2034 200721 JSR READ ; RESTORE [GSTAKL]
2037 B031 BCS BADRD
2039 200721 JSR READ ; AND [GSTAKH]
203C B02C BCS BADRD
203E A900 LDA #LOW GBEGIN ; POINT [DBUFLO/HI]
2040 8D0403 STA DBUFLO ; TO PRELOAD
2043 A923 LDA #HIGH GBEGIN
2045 8D0503 STA DBUFHI
2048 200721 RST2: JSR READ ; READ A BLOCK
204B B01D BCS BADRD ; EXIT IF ERROR
204D AD0503 LDA DBUFHI ; END OF PRELOAD YET?
2050 C596 CMP PAGE0
2052 D0F4 BNE RST2 ; NO, KEEP READING
2054 209B1C JSR NEWLIN ; CLEAR STATUS LINE
2057 A90E LDA #14
2059 85F5 STA CURSOR ; CENTER TEXT
205B A2BA LDX #LOW GRD
205D A921 LDA #HIGH GRD
205F A00E LDY #GRDL
2061 20E51C JSR PRINT ; "GAME RESTORED"
2064 200222 JSR GETGD ; "INSERT GAME DISK, PRESS START"
2067 4CAE0F JMP PREDS ; SUCCEEDS
206A 4CED20 BADRD: JMP SRERR ; ELSE FAILS
206D ; -----
206D ; GSAVE
206D ; -----
206D 20C821 GSAVE: JSR SRINIT ; INIT SCREEN, GET CR
2070 A935 LDA #53
2072 85F5 STA CURSOR ; CENTER TEXT
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 114
--- SAVE/RESTORE ---
2074 A282 LDX #LOW SVG
2076 A921 LDA #HIGH SVG
2078 A010 LDY #SVGL
207A 20E51C JSR PRINT ; "SAVING GAME ..."
207D AD0223 LDA GBEGIN+GID ; SAVE 1ST
2080 8D0004 STA BUFFER ; AND
2083 AD0323 LDA GBEGIN+GID+1 ; 2ND BYTES OF
2086 8D0104 STA BUFFER+1 ; GAME ID WORD
2089 A58E LDA GSP
208B 8D0204 STA BUFFER+2 ; SAVE [GSP]
208E A58F LDA OLDGSP
2090 8D0304 STA BUFFER+3 ; SAVE [OLDGSP]
2093 A580 LDA GPCL ; SAVE [GPC]
2095 8D0404 STA BUFFER+4
2098 A581 LDA GPCH
209A 8D0504 STA BUFFER+5
209D A582 LDA GPC0
209F 8D0604 STA BUFFER+6
20A2 A596 LDA PAGE0 ; SAVE SIZE OF PRELOADS
20A4 8D0704 STA BUFFER+7
20A7 A24F LDX #79 ; SAVE [LOCALS], [CARGS] & [CTYPES]
20A9 BD800A SV0: LDA LOCALS,X
20AC 9D0804 STA BUFFER+8,X
20AF CA DEX
20B0 10F7 BPL SV0
20B2 200321 JSR WRITE ; WRITE [BUFFER] BLOCK
20B5 B036 BCS SRERR
20B7 200321 JSR WRITE ; WRITE [GSTAKL]
20BA B031 BCS SRERR
20BC 200321 JSR WRITE ; WRITE [GSTAKH]
20BF B02C BCS SRERR
20C1 A900 LDA #LOW GBEGIN ; POINT TO START OF PRELOADS
20C3 8D0403 STA DBUFLO
20C6 A923 LDA #HIGH GBEGIN
20C8 8D0503 STA DBUFHI
20CB 200321 SV1: JSR WRITE ; WRITE BLOCK
20CE B01D BCS SRERR ; SCRAM IF ERROR
20D0 AD0503 LDA DBUFHI ; WRITTEN ALL OF
20D3 C596 CMP PAGE0 ; PRELOAD(S)?
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 115
--- SAVE/RESTORE ---
20D5 D0F4 BNE SV1 ; NO, WRITE SOME MORE
20D7 209B1C JSR NEWLIN ; CLEAR STATUS LINE
20DA A90E LDA #14
20DC 85F5 STA CURSOR ; CENTER TEXT
20DE A2AC LDX #LOW SCOM
20E0 A921 LDA #HIGH SCOM
20E2 A00E LDY #SCOML
20E4 20E51C JSR PRINT ; "SAVE COMPLETE"
20E7 200222 JSR GETGD ; "INSERT GAME DISK"
20EA 4CAE0F JMP PREDS ; PREDICATE SUCCEEDS
20ED ; ------------------
20ED ; SAVE/RESTORE ERROR
20ED ; ------------------
20ED 209B1C SRERR: JSR NEWLIN ; CLEAR STATUS LINE
20F0 A90F LDA #15
20F2 85F5 STA CURSOR ; CENTER TEXT
20F4 A2A0 LDX #LOW DXX
20F6 A921 LDA #HIGH DXX
20F8 A00C LDY #DXXL
20FA 20E51C JSR PRINT ; "DISK ERROR!"
20FD 200222 JSR GETGD ; "INSERT GAME DISK, PRESS START"
2100 4CA20F JMP PREDF ; PREDICATE FAILED
2103 ; -------------------
2103 ; WRITE BLOCK TO DISK
2103 ; -------------------
2103 A957 WRITE: LDA #$57 ; SIO "WRITE" COMMAND
2105 D002 BNE DDISK
2107 ; --------------------
2107 ; READ BLOCK FROM DISK
2107 ; --------------------
2107 A952 READ: LDA #$52 ; SIO "READ" COMMAND
2109 8D0203 DDISK: STA DCOMND ; SET READ/WRITE MODE
210C A901 LDA #1 ; ALWAYS USE
210E 8D0103 STA DUNIT ; DRIVE #1
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 116
--- SAVE/RESTORE ---
2111 2053E4 JSR DSKINV ; ACCESS 1ST HALF
2114 AD0303 LDA DSTATS
2117 3010 BMI BADISK ; EXIT IF ERROR
2119 202B21 JSR NEXTSC ; SET UP NEXT ACCESS
211C 2053E4 JSR DSKINV ; ACCESS 2ND HALF
211F AD0303 LDA DSTATS
2122 3005 BMI BADISK ; EXIT IF ERROR
2124 202B21 JSR NEXTSC ; SET UP NEXT ACCESS
2127 18 CLC ; CARRY CLEAR = OKAY
2128 60 RTS
2129 38 BADISK: SEC ; CARRY SET = BAD I/O
212A 60 RTS
212B ; ---------------------------
212B ; POINT TO NEXT SECTOR/BUFFER
212B ; ---------------------------
212B EE0A03 NEXTSC: INC DAUX1 ; LSB OF SECTOR ID
212E D003 BNE NXC
2130 EE0B03 INC DAUX2 ; MSB
2133 AD0403 NXC: LDA DBUFLO ; POINT TO 2ND HALF
2136 D8 CLD ; OF BUFFER
2137 18 CLC
2138 6980 ADC #$80
213A 8D0403 STA DBUFLO
213D AD0503 LDA DBUFHI
2140 6900 ADC #0
2142 8D0503 STA DBUFHI
2145 60 RTS
2146 ; --------------------
2146 ; SAVE & RESTORE TEXT
2146 ; IN ATARI SCREEN CODE
2146 ; --------------------
2146 ; INSERT SAVE DISK, PRESS START
2146 296E7365 SAVEM: DB 41,110,115,101,114,116,0
214D 33213625 DB 51,33,54,37,0
2152 6469736B DB 100,105,115,107,12,0
2158 70726573 DB 112,114,101,115,115,0
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 117
--- SAVE/RESTORE ---
215E B3B4A1B2 DB 179,180,161,178,180,0
001E SAVEML EQU $-SAVEM
2164 ; INSERT GAME DISK, PRESS START
2164 296E7365 RESTM: DB 41,110,115,101,114,116,0
216B 27212D25 DB 39,33,45,37,0
2170 6469736B DB 100,105,115,107,12,0
2176 70726573 DB 112,114,101,115,115,0
217C B3B4A1B2 DB 179,180,161,178,180,0
001E RESTML EQU $-RESTM
2182 ; SAVING GAME ...
2182 33617669 SVG: DB 51,97,118,105,110,103,0
2189 67616D65 DB 103,97,109,101,0,14,14,14,0
0010 SVGL EQU $-SVG
2192 ; RESTORING ...
2192 32657374 RSTG: DB 50,101,115,116,111,114,105,110,103,0,14,14,14,0
000E RSTGL EQU $-RSTG
21A0 ; DISK ERROR!
21A0 2429332B DXX: DB 36,41,51,43,0,37,50,50,47,50,1,0
000C DXXL EQU $-DXX
21AC ; SAVE COMPLETE
21AC 33213625 SCOM: DB 51,33,54,37,0,35,47,45,48,44,37,52,37,0
000E SCOML EQU $-SCOM
21BA ; GAME RESTORED
21BA 27212D25 GRD: DB 39,33,45,37,0,50,37,51,52,47,50,37,36,0
000E GRDL EQU $-GRD
21C8 ; ------------------------
21C8 ; INIT SAVE/RESTORE SCREEN
21C8 ; ------------------------
21C8 20A61C SRINIT: JSR STATUS ; SET UP STATUS LINE
21CB A903 LDA #3
21CD 8541 STA SOUNDR ; ENABLE NOISY I/O
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 118
--- SAVE/RESTORE ---
21CF A906 LDA #6
21D1 85F5 STA CURSOR ; CENTER TEXT
21D3 A246 LDX #LOW SAVEM
21D5 A921 LDA #HIGH SAVEM
21D7 A01E LDY #SAVEML
21D9 20E51C JSR PRINT ; "INSERT SAVE DISK ..."
21DC A901 LDA #1 ; POINT [DAUX1/2] TO SECTOR 1
21DE 8D0A03 STA DAUX1
21E1 A900 LDA #0
21E3 8D0B03 STA DAUX2
21E6 A900 LDA #LOW BUFFER ; AND TO [BUFFER]
21E8 8D0403 STA DBUFLO
21EB A904 LDA #HIGH BUFFER
21ED 8D0503 STA DBUFHI
21F0 ; FALL THROUGH ...
21F0 ; -----------------
21F0 ; WAIT FOR "START"
21F0 ; -----------------
21F0 207C1F GETST: JSR SND3 ; "TING"
21F3 AD1FD0 GST0: LDA CONSOL
21F6 C906 CMP #6
21F8 D0F9 BNE GST0
21FA AD1FD0 GST1: LDA CONSOL
21FD C907 CMP #7
21FF D0F9 BNE GST1
2201 60 RTS
2202 ; --------------------
2202 ; PROMPT FOR GAME DISK
2202 ; --------------------
2202 A92E GETGD: LDA #46
2204 85F5 STA CURSOR ; CENTER LINE
2206 A264 LDX #LOW RESTM
2208 A921 LDA #HIGH RESTM
220A A01E LDY #RESTML
220C 20E51C JSR PRINT ; "INSERT GAME DISK ..."
220F 20F021 JSR GETST ; GET START KEY
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 119
--- SAVE/RESTORE ---
2212 A21F LDX #LOW DL2 ; SWITCH BACK TO
2214 A90B LDA #HIGH DL2 ; FULL-SCREEN DLIST
2216 8EE90B STX DLTOP+LO
2219 8DEA0B STA DLTOP+HI
221C 8E3002 STX SDLSTL+LO
221F 8D3102 STA SDLSTL+HI
2222 A900 LDA #0
2224 8541 STA SOUNDR ; DISABLE NOISY I/O
2226 60 RTS
END
INCLUD GROS.ASM ; M
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 120
--- GRIP OPERATING SYSTEM: ATARI ---
0037 GAME EQU 3*18+1 ; 1ST G-CODE BLOCK (55; TRACK 3, SECTOR 1)
00FD IMAGE EQU 14*18+1 ; 1ST I-FILE BLOCK (253; TRACK 14, SECTOR 1)
0480 BUFTOP EQU BUFFER+$80 ; TOP HALF OF [BUFFER]
2227 ;--------------------------------------------------
2227 ; FETCH VIRTUAL PAGE [DBLOCK] AND PUT AT RAM PAGES
2227 ; [DBUFF],[DBUFF]+1.
2227 ; ON EXIT POINT [DBLOCK] AT NEXT V-PAGE AND POINT
2227 ; [DBUFF] TO NEXT RAM PAGE
2227 ;--------------------------------------------------
2227 ; ----------------
2227 ; GET A DISK BLOCK
2227 ; ----------------
2227 A200 GETDSK: LDX #0
2229 86EC STX DBTOP ; CLEAR MSB OF BLOCK INDEX
222B E8 INX ; = 1
222C 8E0103 STX DUNIT ; ALWAYS USE DRIVE #1
222F 86F1 STX DCNT ; COUNTER FOR LOOP TO GET (2) 256 BYTE PAGES
2231 A952 LDA #$52 ; SIO "READ" COMMAND
2233 8D0203 STA DCOMND
2236 ; CALC WHICH DISK SECTORS TO GET
2236 A5EB LDA DBLOCK ; GET THE VIRTUAL PAGE INDEX
2238 C594 CMP ISTART ; IT IS BELOW THE IMAGE FILE?
223A 9013 BCC GETGAM ; IF SO, IT'S IN THE GAME FILE
223C ; GET BLOCK [A] FROM THE IMAGE FILE
223C E594 SBC ISTART ; ZERO-ALIGN THE BLOCK INDEX
223E 0A ASL A ; * 2 FOR ATARI 128-BYTE SECTORS
223F 26EC ROL DBTOP ; BUILD MSB
2241 ; ENTRY POINT FOR VERIFY
2241 0A GETIMG: ASL A ; * 2 AGAIN FOR 512 BYTE PAGES
2242 26EC ROL DBTOP
2244 18 CLC
2245 69FD ADC #LOW IMAGE ; ADD THE PHYSICAL I-FILE OFFSET
2247 AA TAX ; SAVE LSB HERE
2248 A5EC LDA DBTOP ; DO MSB
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 121
--- GRIP OPERATING SYSTEM: ATARI ---
224A 6900 ADC #HIGH IMAGE
224C 4C5B22 JMP DODSK
224F ; GET BLOCK [A] FROM THE GAME FILE
224F 0A GETGAM: ASL A ; * 2 FOR 128-BYTE SECTORS
2250 26EC ROL DBTOP
2252 ; ENTRY POINT FOR VERIFY
2252 0A GETGME: ASL A ; * 2 AGAIN FOR 512 BYTE PAGES
2253 18 CLC
2254 6937 ADC #LOW GAME ; ADD THE PHYSICAL G-FILE OFFSET
2256 AA TAX ; SAVE LSB HERE
2257 A5EC LDA DBTOP ; TAKE CARE OF MSB
2259 6900 ADC #HIGH GAME
225B ; VALIDATE SECTOR ADDRESS IN [X/A] (LSB/MSB)
225B ; MUST BE NO HIGHER THAN 717 ($02CD)
225B C902 DODSK: CMP #$02 ; MSB OUT OF RANGE?
225D 900B BCC ROK ; OK IF MSB < 2
225F F005 BEQ T717 ; CHECK LSB IF MSB = 2
2261 ; *** ERROR #10: DISK ADDRESS RANGE ***
2261 A90A RANGE: LDA #10
2263 4C5F1C JMP GERROR
2266 E0CE T717: CPX #$CE ; MSB WAS 2; IS LSB > $CD?
2268 B0F7 BCS RANGE ; RANGE ERROR IF SO
226A 86EF ROK: STX SECTOR+LO
226C 85F0 STA SECTOR+HI
226E A5EF DSKLP1: LDA SECTOR+LO
2270 8D0A03 STA DAUX1 ; LSB OF SECTOR ADDRESS
2273 A5F0 LDA SECTOR+HI
2275 8D0B03 STA DAUX2 ; MSB OF SECTOR ADDRESS
2278 A900 LDA #LOW BUFFER
227A 8D0403 STA DBUFLO
227D A904 LDA #HIGH BUFFER
227F 8D0503 STA DBUFHI
2282 ; FETCH DISK BLOCK INTO [BUFFER]
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 122
--- GRIP OPERATING SYSTEM: ATARI ---
2282 2053E4 JSR DSKINV ; GET 1ST HALF OF BLOCK
2285 AD0303 LDA DSTATS ; IF STATUS IS NEGATIVE,
2288 3040 BMI DERR ; SOMETHING WENT WRONG
228A A980 LDA #LOW BUFTOP ; POINT TO
228C 8D0403 STA DBUFLO ; TOP HALF-PAGE
228F A904 LDA #HIGH BUFTOP ; OF [BUFFER]
2291 8D0503 STA DBUFHI
2294 E6EF INC SECTOR+LO ; ALSO POINT
2296 D002 BNE DODSK1 ; TO THE
2298 E6F0 INC SECTOR+HI ; NEXT SECTOR
229A A5EF DODSK1: LDA SECTOR+LO
229C 8D0A03 STA DAUX1
229F A5F0 LDA SECTOR+HI
22A1 8D0B03 STA DAUX2
22A4 2053E4 JSR DSKINV ; GET 2ND HALF OF BLOCK
22A7 AD0303 LDA DSTATS ; ERROR IF
22AA 301E BMI DERR ; [DSTATS] RETURNED NEGATIVE
22AC ; MOVE [BUFFER] TO PAGE [DBUFF]
22AC A000 LDY #0
22AE 84ED STY DBUFF+LO ; MAKE SURE LSB IS ZEROED!
22B0 B90004 MOVEB: LDA BUFFER,Y
22B3 91ED STA (DBUFF),Y
22B5 C8 INY
22B6 D0F8 BNE MOVEB
22B8 E6EE INC DBUFF+HI ; POINT TO NEXT RAM PAGE
22BA C6F1 DEC DCNT
22BC 3009 BMI DSKP1
22BE E6EF INC SECTOR+LO
22C0 D002 BNE DSKP0
22C2 E6F0 INC SECTOR+HI
22C4 4C6E22 DSKP0: JMP DSKLP1
22C7 E6EB DSKP1: INC DBLOCK ; POINT TO NEXT VIRTUAL PAGE
22C9 60 RTS
22CA ; *** ERROR #11: DISK ACCESS ***
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE -- MACHINE DEPENDENT PAGE 123
--- GRIP OPERATING SYSTEM: ATARI ---
22CA A90B DERR: LDA #11
22CC 4C5F1C JMP GERROR
END
22CF IF DEBUG
22CF INCLUD BUGGER.ASM
22CF ENDIF
0000 END
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- SYMBOL TABLE PAGE 124
---- SYMBOL TABLE ----
142B BSADR 00D0 DECVAL 1006 DSKP1 22C7 GBITSP 1227
0CF8 BSET 00CF DEL1 1D16 DSTATS 0303 GBL1 198D
0CF8 BSIZE 00D2 DELAY 1D12 DUMMY 0B0E GBL2 1996
142B BTAB 009E DERR 22CA DUMP 1DD2 GBL3 19AA
A12VAL 1012 BUFFER 0400 DIVERR 11F4 DUMP0 1DDA GBL4 19AE
A2VAL 128F BUFTOP 0480 DIVEX 11B4 DUNIT 0301 GBLL 19F4
ABQUOT 11B5 CALCB 12DC DIVIDE 1177 DVX 1011 GBLLL 1A06
ABREM 11A7 CALCW 12E5 DL1 0B15 DXX 21A0 GBLX 19BF
ABSDIV 118C CALL1 13A9 DL2 0B1F DXXL 000C GBNOT 10D1
ABYTE 0075 CALL2 13CC DL2A 0B34 EAR0 1BDE GBXOR 121B
ADDGPC 18D9 CALL3 13D2 DLS0 126E EAR1 1BE8 GCALC 0D06
ADDIA1 192F CALL4 13E4 DLTOP 0BE9 EAR20 1C05 GCALL 12F7
ADDIA2 1906 CARGS 0AA0 DMACTL D400 EAR21 1C12 GCHECK 0014
ADDVPC 18AA CH 02FC DMPMSK 1DF5 EAR22 1C04 GCL 12FB
ADEX 0076 CHAR 1CDD DMSK0 1DFD EAR23 1BF6 GCL0 1307
ADEX2 0077 CHKSUM 00F6 DOB2 0FCF EAR24 1C17 GCL1 130F
ADIS2 1913 CIOV E456 DOCALL 137A EAR25 1C1B GCL2 1315
ADISK 193C CIX 00F2 DODIS 0E4D EARLY 1BD6 GCL3 132E
AGISK 18E6 CLPRI2 15F7 DODSK 225B EARLY2 1BEF GCL4 133D
ARG1 006D CLPRIA 165D DODSK1 229A EMPTY 1D09 GCL5 1350
ARG2 006F CLRT 0C6B DOFIT 1A92 ENDM 1C51 GCL6 135A
ARG3 0071 CLRZ 0C65 DOGET 12CB ENDML 000E GCL7 135D
ARG4 0073 COLCRS 0055 DOMASK 1610 ENOUGH 0CF2 GCL8 136F
ATASCI 1D92 COLD 0BEB DOPUT 10C0 EQP1 1247 GCLEAR 1C1F
ATRACT 004D COLDST 0244 DORAND 1D0A EQP2 1253 GCLS 1C35
AUDC1 D201 COLDSV E477 DOSINI 000C ERRM 1C40 GCLSN 1C33
AUDC2 D203 COLOR1 02C5 DOSVEC 000A ERRML 0011 GCODE 0090
AUDC3 D205 COLOR2 02C6 DOXOP 0E3E FADD DA66 GCOPYP 0FAE
AUDC4 D207 COMPAR 1297 DRAW 15CE FALSE 0000 GDEC 10B8
AUDCTL D208 CONSOL D01F DRAWE2 1575 FASC D8E6 GDIV 1163
AUDF1 D200 CRSINH 02F0 DRAWEX 1506 FDIV DB28 GDLESP 126B
AUDF2 D202 CTYPES 0AC0 DRAWI1 1516 FIT 1A9D GDUMP 14B1
AUDF3 D204 CURSOR 00F5 DRAWI2 151D FIT0 1AA9 GEND 0004
AUDF4 D206 DAUX1 030A DRAWI3 1507 FIT2 1AB7 GEQP 1239
AVISK 18B7 DAUX2 030B DRAWI4 151F FIT3 1ABE GERROR 1C5F
B2MASK 167E DBLOCK 00EB DRAWI5 1532 FITEX 1AD1 GETBLK 19C0
B2MLP 1680 DBTOP 00EC DRAWI6 1540 FMOVE DDB6 GETBS 1949
BADISK 2129 DBUFF 00ED DRAWI7 1549 FMUL DADB GETBYT 1B25
BADOP1 0E9D DBUFHI 0305 DRAWI8 1585 FPI D9D2 GETDSK 2227
BADOP2 0EDA DBUFLO 0304 DRAWI9 158C FR0 00D4 GETGAM 224F
BADRD 206A DC0 0DE0 DRAWIA 1576 FR1 00E0 GETGD 2202
BADVER 1F53 DC1 0DE7 DRAWIB 158E FSUB DA60 GETGME 2252
BLKLEN 00EA DC2 0DEE DRAWIC 15A1 GADD 1125 GETI 1A36
BLOCK 00D3 DCNT 00F1 DRAWID 15B1 GAME 0037 GETIMG 2241
BLOCKX 1A0F DCOMND 0302 DSKINV E453 GBAND 1203 GETIP 0CFA
BOOT 0009 DDISK 2109 DSKLP1 226E GBEGIN 2300 GETLEN 0CB2
BRKKEY 0011 DEBUG 0000 DSKP0 22C4 GBIOR 120F GETLNG 0EEE
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- SYMBOL TABLE PAGE 125
---- SYMBOL TABLE ----
GETSHT 0EEA GRAND 143F HOLD 1C8A ITERS 00BD MUH 00AE
GETST 21F0 GRD 21BA I 007A ITEXI 186D MUL 00AD
GETVAR 0F02 GRDL 000E IADR1 00AF ITICN 00BE MULP 19D1
GETVR1 0F07 GREST 1FD0 IADR10 00B1 ITLOOP 17D4 MULP1 1798
GETVRG 0F1B GRET 10E3 IADR2 00B2 ITLP2 17CA MULXY 178C
GETVRL 0F0B GRFALS 108E IADR20 00B4 ITLP3 180D MUSHFT 00AC
GFSTAK 0F28 GRIP 0B00 IBLKS 0006 ITOBIG 0CED MUSK 19DA
GGET 12C1 GRSTAK 1092 ICALC 1889 ITPNT 00BF MUSK1 17A1
GGETB 12D5 GRT1 1085 ICAUX1 034A ITRATE 17AC NARGS 006C
GGLOB 000A GRT2 1087 ICAUX2 034B ITSKP2 17F1 NBLOKS 00A2
GGRTRP 1279 GRTRUE 1083 ICBADR 0344 ITSKP3 181A NEGATE 00E9
GID 0002 GSAVE 206D ICBLEN 0348 ITSKP4 1838 NEWL0 1C9F
GIGRTP 1284 GSER 000C ICCOM 0342 ITSKP5 185A NEWLIN 1C9B
GINC 10AD GSET 12B4 ICENT 1419 IVERS 0016 NEWXY 1A89
GINPUT 1D24 GSETI 1688 ICHECK 0004 IVX 1005 NEXI 1888
GITER 1461 GSHOWI 14BD ICODE 0091 IX1 00B5 NEXTPC 1AD2
GITER1 147C GSHOWN 14B7 IEND 0002 IX2 00B6 NEXTSC 212B
GJUMP 10DD GSOUND 1E25 IFILE 1EC4 IXSKIP 00C6 NIBBLE 1CD7
GLEN 0012 GSP 008E IFP D9AA IY1 00B7 NICONS 00A3
GLESSP 1265 GST0 21F3 IHEAD 0CC4 IY2 00B8 NOGRAM 0CAD
GLG 0EF1 GST1 21FA IICONS 0007 J 007C NOISE 1F6C
GLOAD 14B4 GSTAKH 0600 ILD0 1A6D K 007E NOIT 1D35
GLOBAL 009C GSTAKL 0500 ILD1 1A75 KEXIT 1D80 NOMASK 14E4
GMLOOP 1142 GSTART 0006 ILD2 1A85 LBUFF 0580 NOMSK1 1560
GMNEXT 1159 GSUB 1132 ILEN 0000 LEN 00F4 NONSNS 1857
GMOD 116D GSW0 16CA IMAGE 00FD LETGO 1C91 NOPS0 0008
GMODE 0001 GSW1 16D2 INBUFF 00F3 LINE 00F2 NOPS1 0009
GMUL 113F GSW2 16E1 INCGPC 18C8 LO 0000 NOPS2 0012
GNOOP 0FFE GSW3 16E5 INCIA1 1920 LOCALS 0A80 NOPSX 0011
GO 0E5F GSW4 1708 INCIA2 18F7 LRU 0099 NOUGH 0CF7
GODIV 1199 GSW5 1713 INCVAL 0FFF LRUMAP 0880 NPC0 1AE7
GOVER 1C81 GSWAPI 16BC INCVPC 1899 MASK 00DB NPC1 1AEF
GPC 0080 GTBT0 1B3A INEX1 192E MDXCUT 00C7 NPC1A 1AF7
GPC0 0082 GTBT1 1B42 INEX2 1905 MEMMAP 0700 NPC2 1AFB
GPCFLG 0083 GTBT1A 1B4A INTRP 0042 MEMTOP 1CFD NPC3 1B22
GPCH 0081 GTBT2 1B4E IPURE 0095 MINIT 11F9 NPC4 1B1C
GPCL 0080 GTBT3 1B75 IRDIN 1F02 MINIT0 0DA3 NXC 2133
GPEX1 18D8 GTBT4 1B6F IRQEN D20E MINIT1 0DB2 NXTENT 187D
GPGET 0CB8 GVALUE 10A5 ISETUP 1A10 MLOOP 0DCF OLDGSP 008F
GPOINT 0084 GVCALC 0F8C ISTART 0094 MOVEB 22B0 OP0 0E64
GPOP 109F GVERP 1E46 ISU 1A1B MOVED 1D3D OP1 0E73
GPUR 0008 GVERS 0000 ISUM 1EFE MOVED2 1D40 OP1A 0E7D
GPURE 0093 GWIND 171C ISUM0 1F32 MSKFLG 00E3 OP1B 0E87
GPUSH 1098 GZEROP 10C5 ISUM2 1F1A MSTART 0400 OP1EX 0E8E
GPUT 13F1 HCHARS 1CBE ISUM3 1F29 MTEMP 00A8 OP2 0EA2
GPUTB 13FC HEX 1CCE ITAB 00A0 MU0 17A9 OP2A 0EAC
GQUIT 1C7A HI 0001 ITENT 14EB MUEND 19E1 OP2B 0EAF
AVOCET SYSTEMS 6502 CROSS-ASSEMBLER - VERSION 2.01C
GRIP/6502 INFOCOM COMPANY PRIVATE --- SYMBOL TABLE PAGE 126
---- SYMBOL TABLE ----
OP2C 0EBE PREDS 0FAE S4L1 1FB4 SV0 20A9 VSUM 1E6A
OP2D 0EC1 PRERR2 16C5 S4L2 1FBA SV1 20CB VSUM0 1E9E
OP2EX 0ECB PRINT 1CE5 S4L3 1FC4 SVG 2182 VSUM2 1E86
OPCODE 006B PSHVAL 0F3E SAVEM 2146 SVGL 0010 VSUM3 1E95
OPEXT 0DF5 PSHXA 0F42 SAVEML 001E SWAP 009A VSUM4 1EBA
OPT0 101B PTCALC 0C2B SAVEY 1BEE T717 2266 WARM 0C61
OPT1 102B PURERR 143A SAVMSC 0058 TARGET 009B WCEX 0FA1
OPT2 103D PUTBYT 0F60 SCEX 12B3 TEXT 03A0 WILP 171E
OPTX 1061 PUTLSB 1404 SCMP 12A9 TICK 1D43 WINDH 00CD
OPX1 0E06 PUTVAL 0F66 SCOM 21AC TICK1 1D4E WINDW 00CE
OPX2 0E10 PUTVLG 0F7F SCOML 000E TOADR 1DEE WINDX1 00C9
OPX3 0E1A PUTVLL 0F6F SCOMP 129E TOADR2 1E14 WINDX2 00CB
OPX4 0E35 PUTVR1 0F6B SCREEN A100 TOADR3 1E1D WINDY1 00CA
OPXNXT 0E21 PYES 10CE SDLSTL 0230 TOPCUT 00C4 WINDY2 00CC
OVER 0F50 QSIGN 00AA SDMCTL 022F TOPX 0E00 WISK1 172E
PAGE 1B78 QUOT 00A4 SECTOR 00EF TOX 00E4 WISK2 172B
PAGE0 0096 RAMSIZ 02E4 SENSE 1D5D TRUE 00FF WISK3 173E
PAGMAP 0800 RAMTOP 006A SHOWI 14C1 UDIV 11C3 WISK4 1746
PATB 0D77 RANDOM D20A SI0 1693 UDLOOP 11CC WISK5 174E
PATB1 0D84 RANGE 2261 SI1 1697 UDNEXT 11E4 WISK6 1756
PATI 0D8E READ 2107 SI3 16B3 UNDER 0F39 WISK7 1764
PATI1 0D9B READIN 1E6E SIDCUT 00C5 UPTIME 1BA0 WISK8 1768
PBAD 1262 REMAIN 00A6 SIOINV E465 USEGP 1431 WISK9 1776
PCALC 1409 RESTM 2164 SKCTL D20F UT0 1BB7 WISKA 177A
PCALC1 140E RESTML 001E SND1 1F5E UT1 1BC2 WRITE 2103
PCALC2 1430 RET0 0F5E SND2 1F66 UT2 1BCE X1 006D
PGE1 1B7A RET1 10F2 SND3 1F7C UT3 1BD3 X2 0071
PGE2 1B89 RET2 1105 SND4 1FA6 V2A1 0EDF XCURS 00E7
PGOOD 125F RFLIP 11A3 SNDERR 1E41 VALUE 0078 XDEX1 00B9
PLAY 1E3F ROK 226A SOUNDR 0041 VARGET 0EF9 XDEX2 00BA
PMAX 0097 ROWCRS 0054 SOUNDS 0004 VARPUT 0F55 XPOS 00C0
POKMSK 0010 RSIGN 00AB SRERR 20ED VEXIT 111E XPSAV 00E5
POPVAL 0F28 RST0 2002 SRINIT 21C8 VHIGHS 09C0 Y1 006F
PORTB D301 RST1 202B STABLE 1F56 VLOWS 0900 Y2 0073
PR0 1CEF RST2 2048 STAMP 0098 VPC 0086 YCURS 00E8
PREDB 0FB3 RSTG 2192 STATUS 1CA6 VPC0 0088 YDEX1 00BB
PREDB1 0FD6 RSTGL 000E STICK 1D83 VPCFLG 0089 YDEX2 00BC
PREDB2 0FE1 RTCLOK 0014 STICK0 0278 VPCH 0087 YPOS 00C2
PREDB3 0FE8 S1L 1F74 STICK1 0279 VPCL 0086 ZEND 00FF
PREDF 0FA2 S3L1 1F8A STIKEX 1D8F VPCSAV 008C ZFR0 DA44
PREDLB 0FC3 S3L2 1F90 STRIG0 0284 VPEX1 18A9 ZFR1 DA46
PREDNB 0FA7 S3L3 1F9A STRIG1 0285 VPOINT 008A ZSTART 006B
***** NO ERRORS DETECTED *****