LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 1 ALBUG.M65 1 ;ALBUG.M65.71 12-Mar-82 15:25:26, Edit by HESS 2 3 .TITLE LBUG - 6502 DEBUGGER (ATARI VERSION) 4 ; (C) Ted Hess, Hudson, Ma. 1977,1978,1979,1980,1981,1982 5 6 .LIST MB ;LIST BINARY IN MACROS 7 .NLIST TOC ;NO TABLE OF CONTENTS 8 .ENABL LC ;ALLOW LOWER CASE TEXT 9 10 ; INVOKE SYSTEM MACROS FOR PARAMETER DEFINITIONS 11 12 .MCALL ATARI 13 .MCALL M6502 14 0000 ATARI 15 0000 M6502 16 17 ;***** THINGS TO DO ****** 18 ; 19 ; 1) Re-write parser for DDT syntax and better defaults 20 ; Make better use of ATARI keyboard! 21 ; 22 ;************************* 23 24 ;LBUG STORAGE ASSIGNMENTS (PAGE 0) 25 26 00E0 INBUF =$E0 ;INPUT BUFFER (2 BYTES) 27 00E2 POINT =$E2 ;OPEN CELL ADDRS (2 BYTES) 28 00E4 AC =$E4 ;ACCUMULATOR 29 00E5 XREG =$E5 ;X INDEX 30 00E6 YREG =$E6 ;Y INDEX 31 00E7 PS =$E7 ;PROCESSOR STATUS REG 32 00E8 SP =$E8 ;STACK POINTER 33 34 ;RANDOM CONSTANTS AND PARAMETERS 35 36 0031 DSKCOD =$31 ;DISK DEVICE CODE 37 0052 DSKR ='R ;DISK READ COMMAND 38 0057 DSKW ='W ;DISK WRITE COMMAND 39 0008 MAXBP =8 ;EIGHT IS TRADITIONAL (BREAK POINTS) 40 0018 LNSCR =24 ;# OF LINES ON SCREEN 41 0037 LPP =55 ;LINES/PAGE ON PRINTER 42 43 .IIF NDF,LORG, LORG= $8000 ;DEFAULT PROG ORIGIN 44 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 2 ALBUG.M65 46 ;MAIN ENTRY POINT - NORMAL START (LORG) 47 ;RESET ENTRY - REMOVE BREAKPOINTS (LORG+3) 48 49 0000 SETPC PPC,LORG 50 51 ;NORMAL START ENTRY 52 53 8000 4C 73 80 START: JMP STRT1 54 8003 4C 70 80 JMP RST 55 56 8006 7D 4C 61 VERS: .ASCII <.ATCLR>"Lady Bug - V4.0, (C) Ted Hess 1981"<.ATEOL> 8009 64 79 20 800C 42 75 67 800F 20 2D 20 8012 56 34 2E 8015 30 2C 20 8018 28 43 29 801B 20 54 65 801E 64 20 48 8021 65 73 73 8024 20 31 39 8027 38 31 9B 57 802A 0001 ROF: .BLKB 1 ; REGISTER OPENED FLAG 58 ; 0 = CLOSED 59 ; $1 = HEX/OCTAL 60 ; $FF = SYMBOLIC 61 802B 0001 CF: .BLKB 1 ;ADDRESS FLAG 62 ; $FF = NO ADDRESSES TYPED 63 ; $00 = ONE ADDRESS TYPED 64 ; $01 = COMMA TYPED 65 802C 0002 PRPC: .BLKB 2 ;PROGRAM COUNTER (AT BREAK) 66 802E 0001 LENGTH: .BLKB 1 ; LENGTH OF INSTR (0 := 1-BYTE) 67 802F 0001 PFRMT: .BLKB 1 ; PRINT FORMAT INDEX 68 8030 0002 VEB: .BLKB 2 ;4 BYTE PROGRAM BLOCK 69 8032 0001 LMNEM: .BLKB 1 ;(VEB+2) TEMP FOR MNEMONIC PRINT 70 8033 0001 RMNEM: .BLKB 1 ;(VEB+3) ... 71 8034 0002 STARTA: .BLKB 2 ;STARTING ADDRESS 72 8036 0002 ENDAD: .BLKB 2 ;ENDING ADDRESS 73 8038 0001 TEMPX: .BLKB 1 ;NEED TO SAVE X AROUND OS 74 8039 0001 TEMPY: .BLKB 1 ;TEMP SAVE Y 75 803A 0001 SNGLF: .BLKB 1 ;SINGLE STEP FLAG 76 803B 0001 BPN: .BLKB 1 ;BREAKPOINT NUMBER OR 0 77 803C 0001 DRVNO: .BLKB 1 ;DISK UNIT # 78 803D 0001 PIOCB: .BLKB 1 ;IOCB INDEX FOR PRINTER/EDITOR 79 803E 0001 PNTF: .BLKB 1 ; PRINTER FLAG 80 81 803F 0001 TABPT: .BLKB 1 ;INDEX INTO TAB RING 82 8040 0008 TABRNG: .BLKW 8 ;RING BUFFER FOR TAB/UNTAB 83 84 ;BREAKPOINT TABLES 85 86 8050 0008 BPINS: .BLKB MAXBP ;SAVE INSTR 87 8058 0008 BPCNT: .BLKB MAXBP ;PROCEED COUNT 88 8060 0008 BPLOCL: .BLKB MAXBP ;LOCATION LOW 89 8068 0008 BPLOCH: .BLKB MAXBP ;LOCATION HIGH 90 91 ;RESET ENTRY 92 93 8070 20 3F 88 RST: CALL REMB ;REMOVE BREAK POINTS 94 95 ; NORMAL STARTUP JOINS HERE 96 97 8073 20 A8 87 STRT1: CALL INITS ;INITIALIZE THINGS 98 8076 TYPE VERS ;OUTPUT HERALD (1) 8076 A2 06 (1) 8078 A0 80 (1) 807A 20 85 F3 99 807D CLR ;CLEAR SS FLAG, ETC. (1) 807D A9 00 (2) 807F 8D 3A 80 (2) 8082 8D 3B 80 (2) 8085 8D 3C 80 (2) 8088 85 E7 100 808A SET2 BREAK,VBREAK ;BREAK POINT ENTRY (1) 808A A9 73 (1) 808C 8D 06 02 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 2-1 ALBUG.M65 (1) 808F A9 88 (1) 8091 8D 07 02 101 8094 BA TSX ;SAVE CURRENT STACK POINTER 102 8095 86 E8 STX SP 103 8097 4C BC 82 JMP RALL ;CLEAR ALL BREAK POINTS 104 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 3 ALBUG.M65 106 ;MAIN DECODER 107 108 809A 20 DF 80 ERR: CALL ERRFST ;PRINT ? 109 110 809D 20 2E 88 DCD: CALL CLOSEP ;CLOSE PRINTER IF OPEN 111 80A0 20 85 87 CALL CRLFS ;PRINT CRLF 112 80A3 DCD4: CLR ROF ;CLOSE OPEN REG (1) 80A3 A9 00 (2) 80A5 8D 2A 80 113 80A8 A6 E8 LDX SP ;RESTORE STACK POINTER 114 80AA 9A TXS 115 116 80AB A9 FF SCAN: LDA #$FF ;SET UP ADDRESS FLAG 117 80AD 8D 2B 80 STA CF 118 80B0 20 7C 86 CALL GETNUM ;INPUT SOMETHING 119 80B3 AE 2B 80 LDX CF ;GET QUANITY TYPED FLAG 120 80B6 30 0A BMI CLGL ;DO NOT DESTROY OLD VALUE FOR ' AND = 121 122 80B8 SCAN1: MOV2X INBUF,STARTA ;SET UP STARTING ADDRESS (1) 80B8 A6 E0 (1) 80BA 8E 34 80 (1) 80BD A6 E1 (1) 80BF 8E 35 80 123 ;FALL INTO SPECAIL CHARACTER DECODER 124 125 126 ;HERE TO CHECK LEGAL CHARACTER 127 128 80C2 A2 0C CLGL: LDX #MAXL ;INIT INDEX 129 80C4 DD EE 8A LGL1: CMP LGCH,X ;MATCH? 130 80C7 F0 05 BEQ LGL2 ;YES - PROCEED 131 80C9 CA DEX ;NO - STEP TO NEXT 132 80CA 10 F8 BPL LGL1 ;BRANCH IF MORE TO GO 133 80CC 30 CC BMI ERR ;ERROR IF NONE 134 135 ;FOUND MATCH - DISPATCH 136 137 80CE 8A LGL2: TXA ;GET INDEX 138 80CF 0A LGL3: ASL A ; TIMES 2 139 80D0 AA TAX ; BACK TO X 140 80D1 BD 06 8B LDA LDISP+1,X ;GET HIGH BYTE OF XFER 141 80D4 48 PHA ;PUT ON STACK 142 80D5 BD 05 8B LDA LDISP,X ;GET XFER LOW 143 80D8 48 PHA ;STACK NOW HAS XFER ADDRS 144 80D9 AD 2B 80 LDA CF ;GET ARGUMENT FLAG IN AC 145 80DC C9 01 CMP #1 ;SET FLAGS BASED ON ONE 146 80DE 60 RET ;DISPATCH 147 148 80DF A9 FD ERRFST: LDA #.ATBEL ;RING BELL 149 80E1 20 6D 87 CALL OUTSCH 150 80E4 A9 3F LDA #'? ;THEN PRINT ? 151 80E6 4C 6D 87 JMP OUTSCH LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 4 ALBUG.M65 153 ;COMMA - SAVE INPUT AS STARTING ADDRESS 154 155 80E9 AD 2B 80 COMMA: LDA CF ;GET ARGUMENT FLAG IN AC 156 80EC D0 AC BNE ERR ;MUST BE ONE AND ONLY ONE ARGUMENT TYPED SO FAR 157 80EE 20 7C 86 CALL GETNUM ;GET ANOTHER ARGUMENT 158 80F1 COMMA1: MOV2X INBUF,ENDAD ;SET UP ENDING ADDRESS (1) 80F1 A6 E0 (1) 80F3 8E 36 80 (1) 80F6 A6 E1 (1) 80F8 8E 37 80 159 80FB AE 2B 80 LDX CF ;GET ARGUMENT FLAG 160 80FE E0 02 CPX #2 ;CHECK TO SEE IF IT IS OPEN 161 8100 10 98 BPL ERR ;NO THEN IT IS AN ERROR 162 8102 30 BE BMI CLGL ;GO DISPATCH ON BREAK CHARACTER 163 164 165 ;ESC SEEN (ECHO $) 166 167 8104 A9 24 ESC: LDA #'$ 168 8106 20 6D 87 CALL OUTSCH 169 8109 20 F0 86 CALL GETSCH ;GET NEXT CHARACTER 170 810C 38 SEC ;CLEAR BORROW 171 810D E9 31 SBC #'1 ;CHECK FOR NUMBER 172 810F 30 89 BMI ERR ;IF LESS THAN THEN IT IS AN ERROR 173 8111 C9 08 CMP #MAXBP ;IS IT LESS THAN MAXIMUM ALLOWABLE BREAKPOINT 174 8113 30 24 BMI ESCB ;YES GO GET BREAKPOINT B 175 8115 E9 10 SBC #@20 ;CHECK FOR A 176 8117 30 81 BMI ERR ;IF LESS THAN A IT IS AN ERROR 177 8119 29 DF AND #@337 ;GET RID OF LOWERCASE BIT 178 811B C9 1A CMP #'Z-@100 ;IS IT GREATER THAN Z 179 811D 10 49 BPL ERR1 ;YES. REPORT ERROR 180 811F AA TAX ;PUT IT IN THE X REGISTER 181 8120 BD 53 8B LDA ARGNUM,X ;GET NUMBER OF ARGUMENTS 182 8123 CD 2B 80 CMP CF ;IS IT CORRECT 183 8126 F0 0B BEQ 10$ ;YES. SKIP REST OF TEST 184 8128 C9 80 CMP #$80 ;IS IT ONE OR NONE FLAG 185 812A D0 3C BNE ERR1 ;NO GIVE ERROR 186 812C AD 2B 80 LDA CF ;GET FLAG 187 812F C9 01 CMP #1 ;LESS THAN ONE 188 8131 10 35 BPL ERR1 ;NO. GO GIVE ERROR 189 8133 8A 10$: TXA ;GET INDEX BACK TO A 190 8134 18 CLC 191 8135 69 0D ADC #/2 ;CALC TABLE OFFSET 192 8137 D0 96 BNE LGL3 ;DISPATCH 193 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 5 ALBUG.M65 195 8139 AA ESCB: TAX ;SAVE BP NUMBER IN X 196 813A 20 F0 86 CALL GETSCH ;GET THE CHARACTER 197 813D 29 DF AND #@337 ;GET RID OF CASE BIT 198 813F C9 42 CMP #'B ;IS IT A B 199 8141 D0 25 BNE ERR1 ;NO. THEN IT IS AN ERROR 200 8143 4C 6D 82 JMP BKPT1 ;YES. GO DO BREAKPOINT 201 202 203 ;DOT (.) SEEN - SUBSTITUE CURRENT LOC 204 205 8146 DOT: MOV2 POINT,INBUF ;PUT LOC INTO BUFFER (1) 8146 A5 E2 (1) 8148 85 E0 (1) 814A A5 E3 (1) 814C 85 E1 206 814E 20 F0 86 DOT1: CALL GETSCH ;GET ANOTHER CHARACTER 207 8151 EE 2B 80 INC CF ;SAY QUANT TYPED 208 8154 D0 9B BNE COMMA1 ;GO SET UP ENDING ADDRESS 209 8156 4C B8 80 JMP SCAN1 ;BACK TO SCAN LOOP 210 211 212 ;PERCENT SEEN - SPECIAL REGISTER 213 214 8159 20 F0 86 PERC: CALL GETSCH ;LOOK AT NEXT CHAR 215 815C 29 DF AND #@337 ;GET RID OF CASE BIT 216 815E A2 04 LDX #MAXS ; AND CHECK FOR SPECIAL 217 8160 DD FB 8A PERC1: CMP LGPC,X ;MATCH? 218 8163 F0 06 BEQ PERC2 ;??? 219 8165 CA DEX ;NO - STEP TO NEXT 220 8166 10 F8 BPL PERC1 221 8168 4C 9A 80 ERR1: JMP ERR ;ERROR IF NO MORE 222 223 224 ;SETUP DESIRED REGISTER ADDRS AS INPUT TYPED 225 226 816B BD 00 8B PERC2: LDA PERAD,X ;GET ADDRS OF BYTE 227 816E 85 E0 STA INBUF ;STORE AS INPUT 228 8170 CLR INBUF+1 (1) 8170 A9 00 (2) 8172 85 E1 229 8174 F0 D8 BEQ DOT1 ;BACK TO INPUT LOOP 230 231 232 ;CARRIAGE RETURN TYPED 233 234 8176 20 27 86 CRET: CALL CLSE ;CLOSE OPEN REG IF ANY 235 8179 4C 9D 80 JMP DCD ;RE-INIT THINGS LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 6 ALBUG.M65 237 ;SLASH TYPED - OPEN A REG IN SYMBOLIC 238 239 817C 10 EA SLSH: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR 240 817E A9 FF LDA #$FF ;SET ROF FLAG 241 8180 D0 04 BNE SLSH1 ;JOIN COMMON CODE 242 243 ;SLASH TYPED - OPEN A REG (HEX) 244 245 8182 10 E4 BRAKET: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR 246 8184 A9 01 LDA #1 ;SET REG OPEN 247 8186 8D 2A 80 SLSH1: STA ROF 248 8189 20 6B 87 CALL OUTSSP ;TYPE A SPACE 249 818C AD 2B 80 LDA CF ;ANYTHING TYPED 250 818F D0 03 BNE 10$ ; ?? 251 8191 20 41 86 CALL INTPT ;YES - OPEN IT 252 8194 20 2F 87 10$: CALL PRTSCN ;GO DO OUTPUT 253 8197 4C AB 80 JMP SCAN 254 255 256 ;LINE FEED - OPEN NEXT REG 257 258 819A 10 CC LFD: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR 259 819C 20 85 87 CALL CRLFS ;OUTPUT 260 819F AD 2A 80 LFD0: LDA ROF ;CHECK TYPE 261 81A2 30 11 BMI LFDS ;DO SYMBOLIC NEXT INSTR 262 81A4 20 27 86 CALL CLSE ;CLOSE OPEN REG IF ANY 263 81A7 20 D0 87 CALL INCPT ;STEP TO NEXT LOC 264 81AA EE 2A 80 LFDC: INC ROF ;MARK OPEN HEX 265 81AD A2 5B LDX #'[ ;SLASH 266 81AF 20 25 87 CALL PRTSLC ;GO PRINT THE CONTENTS 267 81B2 4C AB 80 JMP SCAN 268 269 81B5 20 00 8A LFDS: CALL PCADJ ;STEP OVER INSTR 270 81B8 85 E2 STA POINT ;SAVE NEW PC 271 81BA 84 E3 STY POINT+1 272 81BC 20 1E 87 LFDS1: CALL PRTSLS ;GO PRINT LOCATION IN SYMBOLIC 273 81BF 4C AB 80 JMP SCAN ;BACK TO MAIN COMMAND DECODER LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 7 ALBUG.M65 275 ;^ OR TYPED - OPEN PREVIOUS 276 277 81C2 10 A4 BACK: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR 278 81C4 20 27 86 CALL CLSE ;CLOSE OPEN REG 279 81C7 20 4C 86 CALL DECPT ;DECREMENT THE POINTER 280 81CA 20 85 87 CALL CRLFS ;PUT OUT A CARRIAGE RETURN LINE FEED 281 81CD 4C AA 81 JMP LFDC ;COMMON CODE 282 283 ;TAB GO TO ADDRESS IF IN SYMBOLIC MODE 284 285 81D0 10 96 TAB: BPL ERR1 ;ERROR IF MORE THAN 1 ARG 286 81D2 AD 2A 80 LDA ROF ;GET OUTPUT MODE FLAG 287 81D5 10 91 BPL ERR1 ;ONLY GET EFFECTIVE ADDRESS IF SYMBOLIC 288 81D7 AE 3F 80 LDX TABPT ;SAVE POINT 289 81DA A5 E2 LDA POINT 290 81DC 9D 40 80 STA TABRNG,X ;IN RING BUFFER 291 81DF A5 E3 LDA POINT+1 292 81E1 9D 48 80 STA TABRNG+8,X 293 81E4 E8 INX ;STEP INDEX 294 81E5 8A TXA 295 81E6 29 07 AND #$07 ;MASK TO MOD 8 CNTR 296 81E8 8D 3F 80 STA TABPT ;STORE IT BACK 297 81EB 20 7E 89 CALL CALCAD ;CALCULATE EFFECTIVE ADDRESS 298 81EE MOV2 INBUF,POINT ;GET JMP ADDRESS (1) 81EE A5 E0 (1) 81F0 85 E2 (1) 81F2 A5 E1 (1) 81F4 85 E3 299 81F6 20 85 87 TAB1: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED 300 81F9 4C BC 81 JMP LFDS1 ;GO TYPE OUT NEW ADDRESS 301 302 ; UNTABIFY - POP RING THEN TAB 303 304 81FC 10 03 UNTAB: BPL 5$ ;ERROR IF ANYTHING TYPED 305 81FE AD 2A 80 LDA ROF ;REGISTER OPEN FLAG 306 8201 10 7D 5$: BPL ERR2 ;ERROR IF NOT SYMBOLIC MODE 307 8203 A9 07 LDA #$7 ;MASK FOR MOD 8 SUBTRACT 308 8205 CE 3F 80 DEC TABPT ;DECREMENT INDEX 309 8208 2D 3F 80 AND TABPT ;MASK IT 310 820B 8D 3F 80 STA TABPT ;STORE RESULT 311 820E AA TAX ;XFER TO INDEX 312 820F BD 40 80 LDA TABRNG,X ;FETCH SAVED VALUE 313 8212 85 E2 STA POINT ;RESTORE TO POINT 314 8214 BD 48 80 LDA TABRNG+8,X 315 8217 85 E3 STA POINT+1 316 8219 4C F6 81 JMP TAB1 ;FINISH THRU COMMON CODE 317 318 ;EQUAL SIGN - TYPE IN OCTAL 319 320 821C 10 62 TOC: BPL ERR2 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR 321 821E AD 34 80 LDA STARTA ;GET CHARACTER IN A 322 8221 8D 2F 80 STA PFRMT ;SAVE BYTE 323 8224 A2 03 LDX #3 ;TYPE 3 DIGITS 324 8226 A0 03 LDY #3 ; OF 3 BITS EACH 325 8228 18 CLC ;INIT CARRY BIT 326 8229 90 03 BCC 15$ ;SKIP FIRST SHIFT 327 822B 0E 2F 80 10$: ASL PFRMT ;SHIFT LEFT 328 822E 2A 15$: ROL A ;GET BIT INTO AC 329 822F 88 DEY ;COUNT BITS 330 8230 D0 F9 BNE 10$ ;CONTINUE FOR 3 BITS 331 8232 29 07 AND #@7 ;GRNTEE OIT 332 8234 20 A3 87 CALL HEXST1 ;TYPE OUT 333 8237 A0 03 LDY #3 ;RELOAD BIT COUNTER 334 8239 CA DEX ;DECREMENT DIGIT COUNTER 335 823A D0 EF BNE 10$ ;LOOP TILL DONE 336 823C 20 6B 87 TOCRET: CALL OUTSSP ;PRINT SPACE 337 823F 4C AB 80 JMP SCAN ;BACK TO MAIN LOOP 338 339 340 ;QUOTE - TYPE OUT ASCII 341 342 8242 10 3C QUOTE: BPL ERR2 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR 343 8244 AD 34 80 LDA STARTA ;GET CHARACTER IN A 344 8247 20 6D 87 CALL OUTSCH ;PRINT THE CHARACTER IN ASCII 345 824A 4C 3C 82 JMP TOCRET ;GO PRINT A SPACE AND RETURN 346 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 8 ALBUG.M65 348 ;$A - TYPE MEMORY OUT IN ASCII 349 350 824D 20 41 86 ASCII: CALL INTPT ;SET UP POINT FROM ADDRESS TYPED 351 8250 20 F0 86 CALL GETSCH ;GET QUOTE CHARACTER 352 8253 8D 2B 80 STA CF ;SAVE IT FOR COMPARE 353 8256 20 F0 86 10$: CALL GETSCH ;GET ANOTHER CHARACTER 354 8259 CD 2B 80 CMP CF 355 825C F0 0A BEQ 20$ ;IF QUOTE RETURN 356 825E A0 00 LDY #0 ;SET UP FOR INDEXING 357 8260 91 E2 STA (POINT),Y ;PUT THE CHARACTER IN MEMORY 358 8262 20 D0 87 CALL INCPT ;INCREMENT THE POINTER 359 8265 4C 56 82 JMP 10$ ;GO DO ANOTHER CHARACTER 360 361 8268 4C 9D 80 20$: JMP DCD ;GO BACK TO MAIN SCANING LOOP 362 363 364 ;$B - BREAKPOINT COMMAND 365 366 826B A2 FF BKPT: LDX #$FF ;SAY NO BREAKPOINT NUMBER GIVEN 367 826D AD 2B 80 BKPT1: LDA CF ;GET ARGUMENT FLAG 368 8270 30 46 BMI CLRALL ;POSSIBLE CLEAR ALL $B OR $NB/ 369 8272 E0 00 CPX #0 ;SPECIFIC BREAK POINT 370 8274 10 0D BPL BKPT2 ; IF QUANT AFTER $ 371 8276 A2 07 LDX #MAXBP-1 ;LOOK FOR A FREE ONE 372 8278 BD 50 80 5$: LDA BPINS,X 373 827B F0 06 BEQ BKPT2 ;FOUND IF ZERO 374 827D CA DEX ;STEP TO NEXT 375 827E 10 F8 BPL 5$ ; AND TRY AGAIN 376 8280 4C 9A 80 ERR2: JMP ERR ;BRANCH TO HERE FOR ERROR 377 378 ;X NOW CONTAINS AN INDEX INTO THE BP TABLES 379 380 8283 AD 34 80 BKPT2: LDA STARTA ;CHECK FOR 0$NB 381 8286 D0 05 BNE SETBP ;IF NOT ZERO CONTINUE 382 8288 AD 35 80 LDA STARTA+1 ;GET HIGH BYTE 383 828B F0 23 BEQ CLRONE ;CLEAR JUST ONE 384 385 ;NOW SET A BREAK POINT - ADDRS IN INTMP 386 387 828D SETBP: MOV2 STARTA,INBUF ;NEED IN PAGE 0 LOC (1) 828D AD 34 80 (1) 8290 85 E0 (1) 8292 AD 35 80 (1) 8295 85 E1 388 8297 A0 00 LDY #0 ;SET FOR INDIRECT 389 8299 B1 E0 LDA (INBUF),Y ;FETCH INSTR 390 829B F0 E3 BEQ ERR2 ;ERROR IF 00 391 829D 9D 50 80 STA BPINS,X ;SAVE IN TABLE 392 82A0 A5 E0 LDA INBUF ;SAVE ADDRS 393 82A2 9D 60 80 STA BPLOCL,X ; LOW 394 82A5 A5 E1 LDA INBUF+1 ; AND HIGH 395 82A7 9D 68 80 STA BPLOCH,X ;... 396 ; ... LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 9 ALBUG.M65 398 ; ... 399 82AA 20 62 87 BPXIT: CALL PRBLNK ;PRINT SOME SPACES 400 82AD 4C AB 80 JMP SCAN ;BACK TO DECODER 401 402 403 ;ROUTINE TO CLEAR ONE BREAKPOINT 404 ;C(X) - INDEX INTO BP TABLES, C(AC) := 0 405 406 82B0 9D 50 80 CLRONE: STA BPINS,X ;CLEAR BP 407 82B3 9D 58 80 STA BPCNT,X ; AND PROCEED COUNT 408 82B6 F0 F2 BEQ BPXIT ;RETURN 409 410 ;ROUTINE TO CLEAR ALL BREAK POINTS 411 412 82B8 E0 00 CLRALL: CPX #0 ;SPECIFIC BREAK POINT 413 82BA 10 10 BPL SHONE ;SHOW ONE BP 414 82BC A2 07 RALL: LDX #MAXBP-1 ;INIT COUNT 415 82BE A9 00 LDA #0 ;GET A ZERO 416 82C0 9D 50 80 5$: STA BPINS,X ;CLEAR BP 417 82C3 9D 58 80 STA BPCNT,X ;... 418 82C6 CA DEX 419 82C7 10 F7 BPL 5$ ;LOOP TILL DONE 420 82C9 4C 9D 80 JMP DCD ;RE-INIT THINGS 421 422 423 ;ROUTINE TO SHOW LOC OF BP 424 425 82CC 20 F0 86 SHONE: CALL GETSCH ;LOOK AHEAD CHAR 426 82CF C9 2F CMP #'/ ;GAURNTEE SLASH 427 82D1 D0 AD BNE ERR2 428 82D3 20 6B 87 CALL OUTSSP ;SPACE OVER 429 82D6 BD 50 80 LDA BPINS,X ;SEE IF ACTIVE 430 82D9 F0 A5 BEQ ERR2 ;NO - SORRY 431 82DB BD 68 80 LDA BPLOCH,X ;GET LOC HIGH 432 82DE 20 91 87 CALL PRTSBY ;PRINT IT 433 82E1 BD 60 80 LDA BPLOCL,X ;GET LOC LOW 434 82E4 20 91 87 CALL PRTSBY ;PRINT IT 435 82E7 4C 9D 80 JMP DCD ;CLOSE REG, ETC. LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 10 ALBUG.M65 437 ;$D - JUMP TO DOS 438 439 82EA 6C 0A 00 TODOS: JMP (DOSVEC) 440 441 ;$U - SELECT DISK UNIT 442 443 82ED AD 34 80 SETU: LDA STARTA ;GET UNIT # 444 82F0 F0 8E BEQ ERR2 ;MUST BE 1-4 445 82F2 C9 05 CMP #5 ;VALID? 446 82F4 90 8A BCC ERR2 ;TOO LARGE 447 82F6 8D 3C 80 STA DRVNO ;STORE UNIT # 448 82F9 4C AA 82 JMP BPXIT ;RETURN 449 450 ;$W - WRITE DISK SECTORS FROM MEMORY 451 452 82FC 20 6A 86 WRSECT: CALL GETVAL ;BUFFER 453 82FF A9 57 LDA #DSKW ;WRITE COMMAND 454 8301 D0 05 BNE INIDSK ;DO IT 455 456 ;$R - READ DISK SECTORS INTO MEMORY 457 458 8303 20 6A 86 RDSECT: CALL GETVAL ;GET BUFFER ADDRS 459 8306 A9 52 LDA #DSKR ;READ COMMAND 460 8308 8D 02 03 INIDSK: STA DCOMND ;STORE 461 830B MOV2 INBUF,DBUFLO ;SETUP BUFFER (1) 830B A5 E0 (1) 830D 8D 04 03 (1) 8310 A5 E1 (1) 8312 8D 05 03 462 8315 20 3E 86 CALL INTPTC ;SET POINT := START SECTOR 463 8318 A9 31 LDA #DSKCOD ;BUS I.D. FOR DISK 464 831A 8D 00 03 STA DDEVIC 465 831D AD 3C 80 LDA DRVNO ;SETUP DRIVE # 466 8320 8D 01 03 STA DUNIT 467 8323 A9 80 LDA #128 ;BYTE COUNT 468 8325 8D 08 03 STA DBYTLO 469 8328 CLR DBYTHI (1) 8328 A9 00 (2) 832A 8D 09 03 470 832D DSKLUP: MOV2 POINT,DAUX1 ;SETUP SECTOR ADDRS (1) 832D A5 E2 (1) 832F 8D 0A 03 (1) 8332 A5 E3 (1) 8334 8D 0B 03 471 8337 20 53 E4 CALL DSKINV ;INVOKE DISK HANDLER 472 833A 30 16 BMI IOCERR ;ERROR CODE IS .GE. $80 473 833C 20 58 86 CALL ENDCHK ;CHECK END, INCR POINT 474 833F 18 CLC ;NOT END - STEP TO NEXT BUFFER 475 8340 A9 80 LDA #128 ;128 BYTE/BUFFER 476 8342 6D 04 03 ADC DBUFLO 477 8345 8D 04 03 STA DBUFLO 478 8348 A9 00 LDA #0 ;PROPAGATE CARRY 479 834A 6D 05 03 ADC DBUFHI 480 834D 8D 05 03 STA DBUFHI 481 8350 D0 DB BNE DSKLUP ;LOOP TILL DONE 482 483 8352 20 DF 80 IOCERR: CALL ERRFST ;OUT ? 484 8355 20 6B 87 CALL OUTSSP 485 8358 AD 03 03 LDA DSTATS ;GET STATUS 486 835B 20 91 87 CALL PRTSBY ;PRINT ERROR CODE 487 835E 20 62 87 CALL PRBLNK ;SOME BLANKS 488 8361 20 8A 87 CALL PRTSPT ; THEN DISK ADDRS 489 8364 4C 9D 80 JMP DCD ;RETURN 490 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 11 ALBUG.M65 492 ;$F - FIND A BYTE IN MEMORY 493 494 8367 20 6A 86 FIND: CALL GETVAL ;GET THE BYTE 495 836A 20 3E 86 CALL INTPTC ;SET UP INDIRECT POINTER FROM START 496 836D A9 01 LDA #1 497 836F 8D 2A 80 STA ROF ;SET THE MODE FLAG 498 8372 A0 00 10$: LDY #0 ;SET UP INDEX 499 8374 B1 E2 LDA (POINT),Y ;GET BYTE FROM MEMORY 500 8376 C5 E0 CMP INBUF ;DOES IT MATCH 501 8378 D0 08 BNE 20$ ;NO 502 837A A2 5B LDX #'[ ;SLASH 503 837C 20 25 87 CALL PRTSLC ;GO PRINT THE CONTENTS 504 837F 20 85 87 CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED 505 8382 20 58 86 20$: CALL ENDCHK ;ARE WE FINISHED 506 8385 4C 72 83 JMP 10$ ;NO 507 508 509 ;$G - START SOMEWHERE 510 511 8388 20 3E 86 GO: CALL INTPTC ;GO SETUP ADDRESS 512 838B CLR ;CLEAR CURRENT BP (1) 838B A9 00 (2) 838D 8D 3B 80 (2) 8390 8D 3A 80 513 8393 20 5C 88 GO2: CALL INSB ;INSERT BP'S 514 8396 A6 E8 GO3: LDX SP ;RESTORE STACK 515 8398 9A TXS 516 8399 A5 E3 LDA POINT+1 ;SETUP RETURN ADDRS 517 839B 48 PHA ; ON STACK FOR RTI 518 839C A5 E2 LDA POINT 519 839E 48 PHA ;... 520 839F A5 E7 LDA PS ;PROCESSOR STATUS 521 83A1 48 PHA 522 83A2 A6 E5 LDX XREG ;RESTORE REGS 523 83A4 A4 E6 LDY YREG 524 83A6 A5 E4 LDA AC ;... 525 83A8 40 RTI ;GO BACK 526 527 ;HERE IF SINGLE STEP - SETUP FOR RE-ENTER AFTER XCT 528 529 83A9 AC 4F 85 GO1: LDY IOPC ;CHECK FOR JUMPS 530 83AC C0 4C CPY #$4C 531 83AE F0 0E BEQ GOJMP ;VANILLA JUMP 532 83B0 C0 6C CPY #$6C ;MAYBE JUMP, INDIRECT 533 83B2 F0 14 BEQ GOJMPI ; A LITTLE MORE HAIRY 534 83B4 C0 60 CPY #$60 ;"RTS"? 535 83B6 F0 2A BEQ IRTS ; INTERPRET SUBROUTINE RETURN 536 83B8 C0 40 CPY #$40 ;"RTI" 537 83BA F0 43 BEQ IRTI ; INTERPRET INTERRUPT RETURN 538 83BC D0 D8 BNE GO3 ; AND GO EXECUTE 539 540 83BE GOJMP: SET2 XCTBR,POINT ;EXECUTE HERE (1) 83BE A9 6C (1) 83C0 85 E2 (1) 83C2 A9 85 (1) 83C4 85 E3 541 83C6 D0 CE BNE GO3 542 543 83C8 GOJMPI: MOV2 XBTARG,POINT ;NEED TO PICK UP ACTUAL TARGET (1) 83C8 AD 7B 85 (1) 83CB 85 E2 (1) 83CD AD 7C 85 (1) 83D0 85 E3 544 83D2 A0 00 LDY #0 545 83D4 B1 E2 LDA (POINT),Y 546 83D6 8D 7B 85 STA XBTARG ;AND SET UP FOR "BRANCH" SIMULATION 547 83D9 C8 INY ;SET TO NEXT LOC 548 83DA B1 E2 LDA (POINT),Y 549 83DC 8D 7C 85 STA XBTARG+1 550 83DF 4C BE 83 JMP GOJMP ;NO GO SIMULATE JMP (I) 551 552 83E2 A6 E8 IRTS: LDX SP ;GET STACK POINTER 553 83E4 9A TXS ;SETUP FOR "RTS" SIMULATION 554 83E5 68 IRTS1: PLA ;PCL 555 83E6 8D 7B 85 STA XBTARG 556 83E9 68 PLA ;PCH LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 11-1 ALBUG.M65 557 83EA 8D 7C 85 STA XBTARG+1 558 83ED C0 40 CPY #$40 ;IS THIS SUBR OR INTERRUPT 559 83EF F0 08 BEQ 10$ ;DON'T INCREMENT PC IF "RTI" 560 83F1 EE 7B 85 INC XBTARG ;"RTS" NEED PC + 1 561 83F4 D0 03 BNE 10$ 562 83F6 EE 7C 85 INC XBTARG+1 563 83F9 BA 10$: TSX ;SAVE MODIFIED STACK PNTR 564 83FA 86 E8 STX SP 565 83FC 4C BE 83 JMP GOJMP 566 567 83FF A6 E8 IRTI: LDX SP ;SETUP STACK POINTER 568 8401 9A TXS 569 8402 68 PLA ;GET PROCESSOR STATUS 570 8403 85 E7 STA PS 571 8405 4C E5 83 JMP IRTS1 ;GOIN COMMON CODE 572 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 12 ALBUG.M65 574 ;$H - HEX DUMP TO TTY 575 576 8408 20 41 86 HDUMP: CALL INTPT ;SET UP START AND END ADDRESS 577 840B A5 E2 LDA POINT ;GET LOW PART OF ADDRESS 578 840D 29 F0 AND #$F0 ;MAKE IT START ON A NICE BOUNDRY 579 840F 85 E2 STA POINT 580 8411 20 A4 85 10$: CALL SETOUT ;SETUP OUTPUT DEVICE / GET LPP 581 8414 8D 2E 80 STA LENGTH ; SAVE IT AWAY 582 8417 20 85 87 20$: CALL CRLFS ;PRINT OUT CARRAGE RETURN LINEFEED 583 841A 20 8A 87 CALL PRTSPT ;PRINT OUT THE LOCATION 584 841D A9 10 LDA #$10 ;NUMBER OF BYTES PER LINE 585 841F 20 47 87 CALL DMPLIN ;PRINT A LINE OF DUMP 586 8422 20 58 86 CALL ENDCHK ;CHECK TO SEE IF WE ARE FINISHED 587 8425 CE 2E 80 DEC LENGTH ;COUNT LINE 588 8428 D0 ED BNE 20$ ;GO DO ANOTHER LINE 589 842A 20 DB 86 CALL PAGEWT ;GO WAIT FOR CONTINUE 590 842D 4C 11 84 JMP 10$ ;GO DO ANOTHER PAGE LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 13 ALBUG.M65 592 ;$I - INITIALIZE MEMORY 593 594 8430 20 6A 86 INIT: CALL GETVAL ;GET VALUE 595 8433 A6 E0 LDX INBUF ;GET BYTE INTO X 596 8435 20 3E 86 INITM1: CALL INTPTC ;SET UP ADDRESSES 597 8438 8A 10$: TXA ;GET CHARACTER BACK 598 8439 A0 00 LDY #0 ;SET UP FOR INDEXING 599 843B 91 E2 STA (POINT),Y ;SET MEMORY TO SPECIFIED VALUE 600 843D 20 58 86 CALL ENDCHK ;CHECK TO SEE IF FINISHED 601 8440 4C 38 84 JMP 10$ ;NO GO DO ANOTHER VALUE 602 603 604 ;$Z - ZERO MEMORY 605 606 8443 A2 00 ZERO: LDX #0 ;GET A ZERO 607 8445 F0 EE BEQ INITM1 ;GO INITIALIZE MEMORY 608 609 ;$M - MOVE A BLOCK OF STORE 610 611 8447 A9 8D MOVE: LDA #$8D ;GET STORE OPCODE 612 8449 20 BB 87 CALL INTIVB ;SET UP STORE AND RETURN IN VEB 613 844C 20 6A 86 CALL GETVAL ;GET TO ADDRESS 614 844F 20 41 86 CALL INTPT ;SET UP POINT FROM START 615 8452 MOV2 INBUF,VEB+1 ;SET UP ADDRESS (1) 8452 A5 E0 (1) 8454 8D 31 80 (1) 8457 A5 E1 (1) 8459 8D 32 80 616 845C A0 00 10$: LDY #0 ;SET UP FOR INDEXING 617 845E B1 E2 LDA (POINT),Y ;GET BYTE 618 8460 20 30 80 CALL VEB ;STORE IT AT NEW ADDRESS 619 8463 20 D7 87 CALL INCVEB ;BUMP THE VEB POINTER 620 8466 20 58 86 CALL ENDCHK ;FINISHED? 621 8469 4C 5C 84 JMP 10$ ;NO 622 623 ;$L - PRINTER SELECT TOGGLE 624 625 846C AD 34 80 PNTSEL: LDA STARTA ;COMPLIMENT PRINTER FLAG 626 846F 8D 3E 80 STA PNTF 627 8472 4C AA 82 JMP BPXIT ;RETURN TO MAIN LOOP LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 14 ALBUG.M65 629 ;$O - CALCULATE BRANCH OFFSET 630 631 8475 20 62 87 OFFSET: CALL PRBLNK ;PUT OUT SOME BLANKS 632 8478 18 CLC ;MAKE FROM BE ONE MORE 633 8479 AD 36 80 LDA ENDAD ;GET FIRST OF TO ADDRESS 634 847C ED 34 80 SBC STARTA ;SUBTRACT FROM ADDRESS 635 847F AA TAX ;SAVE LOW ORDER PART OF ADDRESS 636 8480 AD 37 80 LDA ENDAD+1 ;GET HIGH PART OF TO ADDRESS 637 8483 ED 35 80 SBC STARTA+1 ;SUBTRACT FROM ADDRESS 638 8486 A8 TAY ;SAVE HIGH ORDER BYTE 639 8487 D0 05 BNE 10$ ;IF IT IS ZERO MAY BE LEGAL ADDRESS 640 8489 8A TXA ;GET LOW PART BACK 641 848A 10 0D BPL 30$ ;VALID ADDRESS 642 848C 30 07 BMI 20$ ;ELSE ILLEGAL ADDRESS 643 848E C9 FF 10$: CMP #$FF ;OR $FF IS LEGAL 644 8490 D0 03 BNE 20$ 645 8492 8A TXA ;GET LOW PART BACK 646 8493 30 04 BMI 30$ ;VALID ADDRESS 647 8495 98 20$: TYA ;GET HIGH ORDER BYTE 648 8496 20 91 87 CALL PRTSBY ;GO PRINT HIGH ORDER BYTE 649 8499 8A 30$: TXA ;GET LOW ORDER BYTE 650 849A 20 91 87 CALL PRTSBY ;PRINT LOW BYTE 651 849D 20 85 87 CALL CRLFS ;AND CARRIAGE RETURN LINE FEED 652 84A0 4C AB 80 JMP SCAN ;GO BACK TO MAIN LOOP 653 654 ;$P - PROCEED FROM BREAKPOINT 655 656 84A3 20 85 87 PROC: CALL CRLFS ;SIGNAL START 657 84A6 CLR SNGLF ;NOT SINGLE STEP (1) 84A6 A9 00 (2) 84A8 8D 3A 80 658 84AB AD 2B 80 LDA CF ;QUANT TYPED 659 84AE 30 07 BMI PROC1 ;NO - PROCEED ONCE 660 84B0 AD 34 80 LDA STARTA ;GET LOW BYTE OF COUNT 661 84B3 F0 0E BEQ PERR ;DON'T ALLOW 0$P 662 84B5 D0 02 BNE PROC2 ;PROCEED COUNT IN AC 663 664 84B7 A9 01 PROC1: LDA #1 ;PRELOAD A ONE 665 84B9 AE 3B 80 PROC2: LDX BPN ;ACTUAL BP # 666 84BC F0 10 BEQ IXCT ;COULD BE FROM PANIC INT 667 84BE 9D 57 80 STA BPCNT-1,X ;STORE COUNT 668 84C1 D0 0B BNE IXCT ;JOIN SS CODE 669 670 84C3 4C 9A 80 PERR: JMP ERR ;HANDY BRANCH LOC 671 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 15 ALBUG.M65 673 ;$X - SINGLE STEP 674 675 84C6 EXEC: CLR BPN ;NO BREAKS IN PROGRESS (1) 84C6 A9 00 (2) 84C8 8D 3B 80 676 84CB EE 3A 80 INC SNGLF ;SET FLAG 677 678 84CE IXCT: MOV2 PRPC,POINT ;SET START ADDRESS (1) 84CE AD 2C 80 (1) 84D1 85 E2 (1) 84D3 AD 2D 80 (1) 84D6 85 E3 679 84D8 20 7E 89 CALL CALCAD ;GET LENGHT, EA, FORMAT 680 84DB MOV2 INBUF,XBTARG ;SET EA TO BRANCH TARGET (1) 84DB A5 E0 (1) 84DD 8D 7B 85 (1) 84E0 A5 E1 (1) 84E2 8D 7C 85 681 84E5 A2 EA LDX #$EA ;GET NOP 682 84E7 8E 50 85 STX IOPC+1 ;INIT FOR 1 BYTE INSTR 683 84EA 8E 51 85 STX IOPC+2 684 84ED B1 E2 LDA (POINT),Y ;GET OPCODE 685 84EF D0 01 BNE 5$ ;CONVERT "BRK" INTO "NOP" 686 84F1 8A TXA 687 84F2 8D 4F 85 5$: STA IOPC 688 84F5 AD 2E 80 LDA LENGTH ;LENGTH OF INSTR 689 84F8 F0 3D BEQ IXCT1 ;1 BYTE - GO NOW 690 84FA 20 D0 87 CALL INCPT ;MOVE TO NEXT BYTE 691 84FD AD 2F 80 LDA PFRMT ;CHECK FOR BRANCH 692 8500 C9 1D CMP #$1D ; INSTR 693 8502 D0 07 BNE IXCT3 ;NOT BRANCH 694 8504 A9 1B LDA #XCTBR-IOPC-2 ;BRANCH - SET UP DISPLACEMENT 695 8506 8D 50 85 STA IOPC+1 ;STORE IN OFFSET BYTE 696 8509 D0 2C BNE IXCT1 ;JOIN COMMON EXIT 697 698 850B B1 E2 IXCT3: LDA (POINT),Y ;GET NEXT BYTE 699 850D 8D 50 85 STA IOPC+1 ;STORE IN XCT BLOCK 700 8510 AD 2E 80 LDA LENGTH 701 8513 C9 02 CMP #2 ;CHECK FOR 1 OR 2 EXTRA BYTES 702 8515 D0 20 BNE IXCT1 ;ONLY 1 BYTE 703 8517 20 D0 87 CALL INCPT ;MOVE TO NEXT 704 851A B1 E2 LDA (POINT),Y ;GET 3RD AND LAST 705 851C 8D 51 85 STA IOPC+2 706 851F AD 4F 85 LDA IOPC ;GET OPCODE BYTE 707 8522 C9 20 CMP #$20 ;IS IT "JSR"? 708 8524 D0 11 BNE IXCT1 ;BRANCH IF NOT 709 8526 A6 E8 LDX SP ;GET SAVED STACK POINTER 710 8528 9A TXS ;SET STACK 711 8529 A5 E3 LDA POINT+1 ;YES - SETUP RETURN PC 712 852B 48 PHA 713 852C A5 E2 LDA POINT 714 852E 48 PHA 715 852F BA TSX ;SAVE UPDATED POINTER 716 8530 86 E8 STX SP ; FOR PROCEED 717 8532 A9 4C LDA #$4C ;CHANGE INTO "JMP" 718 8534 8D 4F 85 STA IOPC 719 8537 20 D0 87 IXCT1: CALL INCPT ;STEP TO INSTR AFTER THIS ONE 720 853A MOV2 POINT,XNOBR ;SETUP NO BRANCH LOC (1) 853A A5 E2 (1) 853C 8D 79 85 (1) 853F A5 E3 (1) 8541 8D 7A 85 721 8544 SET2 IOPC,POINT ;SET START ADDR TO IOPC BLOCK (1) 8544 A9 4F (1) 8546 85 E2 (1) 8548 A9 85 (1) 854A 85 E3 722 854C 4C A9 83 JMP GO1 ;AND START UP 723 724 ;EXECUTE BLOCK FOR INSTR XCT SIMULATOR 725 726 854F F0 1B IOPC: BEQ XCTBR 727 8551 EA .BYTE $EA ;NOP 728 8552 84 E6 STY YREG ;SAVE NEW STATE AFTER $X 729 8554 86 E5 STX XREG 730 8556 85 E4 STA AC LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 15-1 ALBUG.M65 731 8558 08 PHP 732 8559 68 PLA 733 855A 85 E7 STA PS ;PROCESSOR STATUS 734 855C BA TSX 735 855D 86 E8 STX SP ;STACK POINTER 736 855F XCTNB: MOV2 XNOBR,POINT ;NO BRANCH OCCURED (1) 855F AD 79 85 (1) 8562 85 E2 (1) 8564 AD 7A 85 (1) 8567 85 E3 737 8569 4C F3 88 JMP BRKY 738 739 856C XCTBR: MOV2 XBTARG,POINT ;BRANCH OCCURED (1) 856C AD 7B 85 (1) 856F 85 E2 (1) 8571 AD 7C 85 (1) 8574 85 E3 740 8576 4C F3 88 JMP BRKY 741 742 8579 0001 XNOBR: .BLKW 1 ;SAVED POINTERS FOR SINGLE STEP 743 857B 0001 XBTARG: .BLKW 1 744 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 16 ALBUG.M65 746 ;$Q - DISASSEMBLE CODE 747 748 857D 20 41 86 DISASS: CALL INTPT ;SET UP POINT 749 8580 20 A4 85 10$: CALL SETOUT ;SET OUTPUT DEVICE 750 8583 8D 2B 80 STA CF ; RETURNS LINES/PAGE 751 8586 20 85 87 20$: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED 752 8589 20 1E 87 CALL PRTSLS ;GO PRINT A LINE 753 858C 20 58 86 CALL ENDCHK ;CHECK TO SEE IF FINISHED 754 858F AD 2E 80 LDA LENGTH ;GET LENGTH OF INSTRUCTION 755 8592 18 CLC ;ONE ALREADY ADDED AT ENDCHK 756 8593 20 04 8A CALL PCADJ3 ;POINT TO NEXT INSTRUCTION 757 8596 85 E2 STA POINT ;SAVE UPDATED ADDRESS 758 8598 84 E3 STY POINT+1 759 859A CE 2B 80 DEC CF ;ACCOUNT FOR LINE 760 859D D0 E7 BNE 20$ ;GO DO ANOTHER INSTRUCTION 761 859F 20 DB 86 CALL PAGEWT ;GO WAIT FOR GO AHEAD 762 85A2 D0 DC BNE 10$ ;GO DO ANOTHER PAGE 763 764 ;ROUTINE TO SETUP FOR OUTPUT - CHECK PNTF FOR PRINTER 765 766 85A4 AD 3E 80 SETOUT: LDA PNTF ;WANT PRINTER? 767 85A7 F0 06 BEQ 10$ 768 85A9 20 E0 87 CALL OPENP ;YES - OPEN IT IF NOT OPEN ALREADY 769 85AC A9 37 LDA #LPP ;RETURN LINES/PAGE 770 85AE 60 RET 771 772 85AF A9 18 10$: LDA #LNSCR ;LINE/SCREEN (EDITOR) 773 85B1 60 RET LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 17 ALBUG.M65 775 ;$S - SEARCH FOR ADDRESS 776 777 85B2 20 6A 86 SEARCH: CALL GETVAL ;GET A WORD 778 85B5 MOV2 INBUF,VEB ;SAVE VALUE SEARCHING FOR (1) 85B5 A5 E0 (1) 85B7 8D 30 80 (1) 85BA A5 E1 (1) 85BC 8D 31 80 779 85BF 20 3E 86 CALL INTPTC ;SET UP ADDRESSES 780 85C2 20 4C 86 CALL DECPT ;DECREMENT IT BY ONE 781 85C5 A0 00 10$: LDY #0 ;SET UP INDEX 782 85C7 B1 E2 LDA (POINT),Y ;GET FIRST BYTE 783 85C9 CD 30 80 CMP VEB ;DOES IT MATCH 784 85CC D0 22 BNE 20$ ;NO 785 85CE C8 INY ;BUMP POINTER 786 85CF B1 E2 LDA (POINT),Y ;GET SECOND BYTE 787 85D1 CD 31 80 CMP VEB+1 ;DOES IT MATCH 788 85D4 D0 1A BNE 20$ ;NO 789 85D6 20 8A 87 CALL PRTSPT ;PRINT THE ADDRESS 790 85D9 A9 2F LDA #'/ ;PRINT SEPERATOR 791 85DB 20 6D 87 CALL OUTSCH ;PRINT IT 792 85DE 20 6B 87 CALL OUTSSP ;PUT OUT A SPACE 793 85E1 AD 31 80 LDA VEB+1 ;GET HIGH BYTE 794 85E4 20 91 87 CALL PRTSBY ;PRINT THE BYTE 795 85E7 AD 30 80 LDA VEB ;GET LOW BYTE 796 85EA 20 91 87 CALL PRTSBY ;PRINT IT 797 85ED 4C 0E 86 JMP 30$ ;GO DO CARRIAGE RETURN LINE FEED 798 799 85F0 20 7E 89 20$: CALL CALCAD ;GET EFFECTIVE ADDRESS OF INSTRUCTION 800 85F3 A5 E0 LDA INBUF ;GET LOW BYTE 801 85F5 CD 30 80 CMP VEB ;DOES IT MATCH 802 85F8 D0 17 BNE 40$ ;NO 803 85FA A5 E1 LDA INBUF+1 ;GET HIGH BYTE 804 85FC CD 31 80 CMP VEB+1 ;DOES IT MATCH 805 85FF D0 10 BNE 40$ ;NO 806 8601 20 1E 87 CALL PRTSLS ;GO PRINT THE CONTENTS 807 8604 AD 2F 80 LDA PFRMT ; 808 8607 C9 1D CMP #$1D ;CHECK TO SEE IF IT WAS A BRANCH 809 8609 F0 03 BEQ 30$ ;YES. NO NEED TO BUMP TWO 810 860B 20 D0 87 CALL INCPT ;BUMP POINTER SO WE DO NOT GET ADDRESS AGAIN 811 860E 20 85 87 30$: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED 812 8611 20 58 86 40$: CALL ENDCHK ;ARE WE FINISHED 813 8614 4C C5 85 JMP 10$ ;NO LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 18 ALBUG.M65 815 ;$T - TYPE OUT MEMORY IN ASCII 816 817 8617 20 3E 86 TYPE: CALL INTPTC ;SET UP ADDRESSES 818 861A A0 00 10$: LDY #0 ;SET UP FOR INDEXING 819 861C B1 E2 LDA (POINT),Y ;GET A CHARACTER 820 861E 20 6D 87 CALL OUTSCH ;PRINT THE CHARACTER 821 8621 20 58 86 CALL ENDCHK ;FINISHED? 822 8624 4C 1A 86 JMP 10$ ;NO 823 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 19 ALBUG.M65 825 ;ROUTINES DEALING WITH POINT 826 827 ;REGISTER CLOSE ROUTINE 828 ;CLOSE LOCATION AND UPDATE IF NECESSARY 829 830 8627 A0 00 CLSE: LDY #0 ;PREPARE TO MODIFY 831 8629 AD 2A 80 LDA ROF ;GET FLAG 832 862C F0 0C BEQ CLSEX ;XFER IF NONE OPEN 833 862E 30 0A BMI CLSEX ; OR SYMBOLIC 834 8630 AD 2B 80 LDA CF ;ANYTHING TYPED? 835 8633 30 05 BMI CLSEX ;NO - DO NOTHING 836 8635 AD 34 80 LDA STARTA ; CURRENT OPEN REG 837 8638 91 E2 STA (POINT),Y ; WITH INPUT VALUE 838 863A 8C 2A 80 CLSEX: STY ROF ;SET REGISTER CLOSED 839 863D 60 RET ;RETURN 840 841 842 ;SET UP POINT FROM THE STARTING ADDRESS 843 844 863E 20 85 87 INTPTC: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED FIRST 845 8641 INTPT: MOV2 STARTA,POINT (1) 8641 AD 34 80 (1) 8644 85 E2 (1) 8646 AD 35 80 (1) 8649 85 E3 846 864B 60 RET 847 848 849 ;DECREMENT THE PC 850 851 864C 38 DECPT: SEC ;PREPARE TO DECREMENT POINT 852 864D A5 E2 LDA POINT 853 864F E9 01 SBC #1 854 8651 85 E2 STA POINT 855 8653 B0 02 BCS 10$ 856 8655 C6 E3 DEC POINT+1 ;HANDLE BORROW 857 8657 60 10$: RET 858 859 860 ;CHECK TO SEE IF POINT IS AT END YET 861 862 8658 A5 E2 ENDCHK: LDA POINT ;CHECK TO SEE IF FINISHED 863 865A CD 36 80 CMP ENDAD 864 865D A5 E3 LDA POINT+1 865 865F ED 37 80 SBC ENDAD+1 866 8662 B0 03 BCS 20$ ;IF GREATER THAN, FINISHED 867 8664 4C D0 87 JMP INCPT ;INCREMENT THE POINTER 868 869 8667 4C 9D 80 20$: JMP DCD ;FINISHED GO BACK TO MAIN LOOP LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 20 ALBUG.M65 871 ;ROUTINES TO PICK UP VALUES 872 873 ; GET ADDITIONAL VALUE, PROMPT FOR INPUT, ERROR IF NOT 874 ; TERMINATED BY 875 876 866A 20 6B 87 GETVAL: CALL OUTSSP ;OUTPUT SPACE 877 866D A9 3A LDA #': ; AND PROMPT 878 866F 20 6D 87 CALL OUTSCH 879 8672 20 7C 86 CALL GETNUM 880 8675 C9 9B CMP #.ATEOL ;TERMINATED PROPERLY? 881 8677 F0 1E BEQ ABTRET ;YES - RETURN 882 8679 4C 9A 80 JMP ERR ;NOPE -ERROR 883 884 ;GET A NUMBER RETURN WITH TERMINATOR IN A 885 886 867C GETNUM: CLR2 INBUF ;CLEAR THE BUFFER (1) 867C A9 00 (2) 867E 85 E0 (2) 8680 85 E1 887 8682 20 A8 86 CALL PACKCH ;GET A CHARACTER 888 8685 D0 08 BNE ABTCHK ;IF NOT HEX RETURN WITH CHARACTER IN A 889 8687 EE 2B 80 INC CF ;SAY WE HAVE A NUMBER 890 868A 20 A8 86 10$: CALL PACKCH ;GO GET ANOTHER CHARACTER 891 868D F0 FB BEQ 10$ ;IF HEX GO GET ANOTHER CHARACTER 892 ;;; ... ; FALL INTO ABTCHK 893 894 ;CHECK FOR RUBOUT OR BREAK. IF FOUND RETURN TO COMMAND DECODER 895 896 868F C9 7E ABTCHK: CMP #.ATRUB ;RUBOUT 897 8691 F0 05 BEQ ABORT ;ABORT COMMAND 898 8693 C9 80 CMP #BRKABT ;BREAK TYPED 899 8695 F0 01 BEQ ABORT 900 8697 60 ABTRET: RET 901 902 8698 ABORT: TYPE EXES ;PUT OUT XXX (1) 8698 A2 A2 (1) 869A A0 86 (1) 869C 20 85 F3 903 869F 4C A3 80 JMP DCD4 904 905 86A2 20 20 58 EXES: .ASCII " XXX"<.ATEOL> 86A5 58 58 9B 906 907 ;GET A CHARACTER AND PACK IT 908 909 86A8 20 F0 86 PACKCH: CALL GETSCH ;GET THE CHARACTER 910 86AB C9 3A CMP #'9+1 ;CAN IT BE A NUMBER 911 86AD 30 10 BMI PACK ;YES GO TRY TO PACK IT 912 86AF C9 41 CMP #'A ;IS IT A CHARACTER 913 86B1 30 0A BMI 10$ ;NO. INVALID CHARACTER RETURN 914 86B3 C9 7E CMP #.ATRUB ;RUBOUT 915 86B5 F0 06 BEQ 10$ ;YES. INVALID CHARACTER RETURN 916 86B7 29 DF AND #@337 ;GET RID OF LOWERCASE BIT 917 86B9 C9 47 CMP #'F+1 ;IS IT G OR LARGER 918 86BB 30 02 BMI PACK ;NO. GO PACK IT 919 86BD A8 10$: TAY ;SIGNAL ILLEGAL CHARACTER 920 86BE 60 RET 921 922 86BF C9 30 PACK: CMP #'0 ;CHECK FOR HEX 923 86C1 30 17 BMI PACKX 924 86C3 C9 40 CMP #'A-1 ;ADJUST FOR A-F 925 86C5 30 03 BMI 10$ 926 86C7 18 CLC ;BY ADDING OFFSET 927 86C8 69 09 ADC #$09 928 86CA 2A 10$: ROL A ;SHIFT IN 929 86CB 2A ROL A 930 86CC 2A ROL A 931 86CD 2A ROL A 932 86CE A0 04 LDY #$04 ;4 MORE SHIFTS THRU CARRY 933 86D0 2A 20$: ROL A ; TO MOVE INTO INBUF 934 86D1 26 E0 ROL INBUF 935 86D3 26 E1 ROL INBUF+1 ;RIPPLE BIT THROUGH 936 86D5 88 DEY ;COUNT LOOP 937 86D6 D0 F8 BNE 20$ 938 86D8 A9 00 LDA #$00 ;RETURN A = 0 IF OK NUMBER 939 86DA 60 PACKX: RET LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 20-1 ALBUG.M65 940 941 ;WAIT FOR A CHARACTER TO BE TYPED IF IT IS A RUBOUT RETURN TO COMMAND 942 ;DECODER 943 944 86DB AD 3D 80 PAGEWT: LDA PIOCB ;ARE WE PRINTING? 945 86DE F0 05 BEQ 10$ 946 86E0 A9 0C LDA #@14 ;OUTPUT FF 947 86E2 4C 6D 87 JMP OUTSCH 948 949 86E5 A9 FD 10$: LDA #.ATBEL ;GET BELL 950 86E7 20 6D 87 CALL OUTSCH ;RING IT 951 86EA 20 F0 86 CALL GETSCH ;WAIT FOR CHARACTER 952 86ED 4C 8F 86 JMP ABTCHK ;CHECK FOR ABORT OR PROCEED 953 954 ;ROUTINE TO GET A CARACTER 955 ; RETURNS CHARACTER IN A 956 ; USES Y 957 958 86F0 8E 38 80 GETSCH: STX TEMPX ;SAVE X 959 86F3 8C 39 80 STY TEMPY ; AND Y AROUND O/S 960 86F6 A9 00 LDA #0 961 86F8 85 2A STA ICAX1Z ;CLEAR FLAG 962 86FA 20 E2 F6 CALL KGETCH ;RETURNS STATUS IN Y, CHAR IN A 963 86FD 30 0A BMI 20$ ;DON'T ECHO SPECIAL CHARS 964 86FF C9 7E CMP #.ATRUB ;CHECK BS/DEL KEY 965 8701 F0 0B BEQ 30$ ; RUBOUT DOESN'T ECHO 966 8703 C9 20 CMP #.CHSP ;CHECK FOR CONTROLS 967 8705 B0 6C BCS OUTSCN ; ECHO IF NOT 968 8707 90 05 BCC 30$ ;RETURN CHAR - NO ECHO 969 970 8709 C0 80 20$: CPY #BRKABT ;BREAK KEY TYPED? 971 870B D0 01 BNE 30$ 972 870D 98 TYA ;YES - RETURN BREAK FLAG 973 870E AE 38 80 30$: LDX TEMPX ;RESTORE 974 8711 AC 39 80 LDY TEMPY 975 8714 60 RET ; ELSE RETURN 976 977 ;ROUTINE TO GET TWO HEX CARACTERS INTO AC 978 ; RETURNS CHARACTER IN A 979 ; X PRESERVED Y RETURNED = 0 980 981 8715 20 A8 86 GETSBY: CALL PACKCH ;GET A CHARACTER 982 8718 20 A8 86 CALL PACKCH ;GET ANOTHER CHARACTER 983 871B A5 E0 LDA INBUF ;LOAD UP BYTE 984 871D 60 RET LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 21 ALBUG.M65 986 ;GENERAL PURPOSE PRINTING ROUTIMES 987 988 ;PRINT LOCATION AND IT'S CONTENETS IF FORM SPECIFIED BY ROF 989 990 871E A9 FF PRTSLS: LDA #$FF ;SET THE TYPEOUT MODE BACK 991 8720 8D 2A 80 STA ROF 992 8723 A2 2F LDX #'/ ;SLASH 993 8725 20 8A 87 PRTSLC: CALL PRTSPT ;PRINT CONTENTS OF POINT 994 8728 8A TXA ;GET CHAR BACK 995 8729 20 6D 87 CALL OUTSCH 996 872C 20 6B 87 CALL OUTSSP ; AND A SPACE 997 ;;; ... ; FALL INTO PRTSCN 998 999 ;PRINT OUT CONTENTS OF CURRENT LOCATION IN FORM SPECIFIED BY ROF 1000 1001 872F A0 00 PRTSCN: LDY #0 ;SET FOR GLOBAL INDEX 1002 8731 B1 E2 LDA (POINT),Y ;GET CURRENT LOCATION IN A 1003 8733 8D 34 80 STA STARTA ;SAVE FOR QUOTE OR EQUAL 1004 8736 AE 2A 80 LDX ROF ;SEE WHAT KIND 1005 8739 30 06 BMI 20$ ;BR IF SYMBOLIC 1006 873B 20 91 87 CALL PRTSBY ;PRINT CONTENTS 1007 873E 4C 6B 87 10$: JMP OUTSSP ;AWAIT NEXT REQUEST 1008 1009 8741 20 05 89 20$: CALL DSMBL ;PRINT SYMBOLIC 1010 8744 4C 3E 87 JMP 10$ ; AND RETURN TO CMD LOOP 1011 1012 ;DUMP NUMBER OF LOCATIONS IN A TO SCREEN 1013 1014 8747 8D 2F 80 DMPLIN: STA PFRMT ;SAVE IT 1015 874A 20 62 87 CALL PRBLNK ;SPACE OVER 2 1016 874D F0 06 BEQ 20$ ;DO NOT INCREMENT POINTER FIRST TIME 1017 1018 874F 20 D0 87 10$: CALL INCPT ;INCREMENT THE POINTER 1019 8752 20 6B 87 CALL OUTSSP ;PRINT BLANK 1020 8755 A0 00 20$: LDY #0 ;SET UP FOR INDEXING 1021 8757 B1 E2 LDA (POINT),Y ;GET LOCATION 1022 8759 20 91 87 CALL PRTSBY ;PRINT IT 1023 875C CE 2F 80 DEC PFRMT ;ACCOUNT FOR CHARACTER 1024 875F D0 EE BNE 10$ ;NOT FINISHED GO DO MORE 1025 8761 60 RET 1026 1027 ;OUTPUT NUMBER OF BLANKS IN X 1028 1029 8762 A2 02 PRBLNK: LDX #$2 1030 8764 20 6B 87 PRBL2: CALL OUTSSP 1031 8767 CA DEX 1032 8768 D0 FA BNE PRBL2 ;LOOP TILL COUNT = 0 1033 876A 60 RET 1034 1035 1036 ;ROUTINE TO OUTPUT CHARACTER TO OUTPUT PORT 1037 ; CHARACTER IN A 1038 1039 ; USES Y AND RETURNS CHARACTER IN A 1040 1041 876B A9 20 OUTSSP: LDA #.CHSP ;LOAD UP A BLANK 1042 876D 8E 38 80 OUTSCH: STX TEMPX ;SAVE X & Y AROUND O/S CALLS 1043 8770 8C 39 80 STY TEMPY 1044 8773 48 OUTSCN: PHA ;SAVE THE CHARACTER 1045 8774 A8 TAY ; AND MOVE TO Y 1046 8775 AE 3D 80 LDX PIOCB ;GET IOCB INDEX 1047 8778 A9 0B LDA #PUTCHR ;1 CHAR OUTPUT 1048 877A 20 10 88 CALL CIOC ;OUTPUT TO EDITOR/PRINTER 1049 877D AE 38 80 LDX TEMPX ;RESTORE X 1050 8780 AC 39 80 LDY TEMPY ;RESTORE Y 1051 8783 68 PLA 1052 8784 60 RET 1053 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 22 ALBUG.M65 1055 ;ROUTINE TO WRITE OUT CARRIAGE RETURN LINE FEED 1056 ; USES A AND Y 1057 1058 8785 A9 9B CRLFS: LDA #.ATEOL 1059 8787 4C 6D 87 JMP OUTSCH ;WRITE IT OUT AND RETURN 1060 1061 ;ROUTINE TO PRINT CURRENT LOCATION 1062 ; PRINTS POINT 1063 ; USES A AND Y 1064 1065 878A A5 E3 PRTSPT: LDA POINT+1 ;GET HIGH ORDER BYTE 1066 878C 20 91 87 CALL PRTSBY 1067 878F A5 E2 LDA POINT ;GET LOW ORDER BYTE 1068 ;;; ... ;FALL INTO PRTSBY 1069 1070 ;ROUTINE TO PRINT BYTE AS TWO HEX DIGITS 1071 ; BYTE IS IN A 1072 1073 8791 48 PRTSBY: PHA ;SAVE THE BYTE 1074 8792 4A LSR A ;GET HIGH ORDER FOUR BITS 1075 8793 4A LSR A 1076 8794 4A LSR A 1077 8795 4A LSR A 1078 8796 20 9A 87 CALL HEXSTA ;GO CONVERT IT TO HEX 1079 8799 68 PLA ;GET THE ORGINAL BYTE BACK 1080 ;;; ... ; FALL INTO HEXSTA 1081 1082 1083 ;ROUTINE TO CONVERT A HEX DIGIT TO ASCII 1084 ; DIGIT IS IN A 1085 1086 879A 29 0F HEXSTA: AND #$0F ;GET JUST ONE DIGIT 1087 879C C9 0A CMP #$0A ;IS IT A DECIMAL DIGIT 1088 879E 18 CLC ;CLEAR THE CARRY 1089 879F 30 02 BMI HEXST1 ;IF NEGATIVE IT IS A DECIMAL DIGIT 1090 87A1 69 07 ADC #$07 ;ADD IN OFFSET TO GET A-F 1091 87A3 69 30 HEXST1: ADC #$30 ;CONVERT TO ASCII 1092 87A5 4C 6D 87 JMP OUTSCH ;GOT WRITE CHARACTER AND RETURN LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 23 ALBUG.M65 1094 ; MISC ROUTINES 1095 1096 87A8 D8 INITS: CLD ;CLEAR DECIMAL MODE 1097 87A9 A9 02 LDA #LEDGE ;SET DEFAULT MARGINS 1098 87AB 85 52 STA LMARGN 1099 87AD A9 27 LDA #REDGE 1100 87AF 85 53 STA RMARGN 1101 87B1 A9 94 LDA #$94 ;SETUP BACKGROUND COLOR 1102 87B3 8D C8 02 STA COLOR4 ;TO BE SAME AS FOREGROUND 1103 87B6 4C 2E 88 JMP CLOSEP ;CLOSE PRINTER IF OPEN 1104 1105 ;SET UP VEB AREA 1106 1107 87B9 A9 AD INTSVB: LDA #$AD ;LDA OP CODE 1108 87BB 8D 30 80 INTIVB: STA VEB 1109 87BE AD 34 80 INTVEB: LDA STARTA ;SET UP SUB 1110 87C1 8D 31 80 STA VEB+1 1111 87C4 AD 35 80 LDA STARTA+1 1112 87C7 8D 32 80 STA VEB+2 1113 87CA A9 60 LDA #$60 ;"RTS" 1114 87CC 8D 33 80 STA VEB+3 1115 87CF 60 RET 1116 1117 ;ROUTINE TO INCRENT POINT 1118 1119 87D0 INCPT: INC2 POINT (1) 87D0 E6 E2 (1) 87D2 D0 02 (1) 87D4 E6 E3 1120 87D6 60 RET 1121 1122 ;ROUTINE TO INCREMENT ADDRS IN VEB 1123 1124 87D7 INCVEB: INC2 VEB+1 (1) 87D7 EE 31 80 (1) 87DA D0 03 (1) 87DC EE 32 80 1125 87DF 60 INCRET: RET LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 24 ALBUG.M65 1127 ;PRINTER ROUTINES 1128 1129 87E0 AD 3D 80 OPENP: LDA PIOCB ;CHECK IF ALREADY OPEN 1130 87E3 D0 FA BNE INCRET ;YES - DON'T REOPEN 1131 87E5 A2 10 LDX #$10 ;START AT IOCB#1 1132 87E7 BD 40 03 5$: LDA ICHID,X ;GET ID 1133 87EA C9 FF CMP #$FF ;FREE? 1134 87EC F0 0E BEQ THSONE 1135 87EE E0 70 CPX #$70 ;LAST ONE? 1136 87F0 F0 07 BEQ PNONE 1137 87F2 8A TXA ;STEP INDEX TO NEXT 1138 87F3 18 CLC 1139 87F4 69 10 ADC #$10 1140 87F6 AA TAX ;BACK TO X 1141 87F7 D0 EE BNE 5$ 1142 1143 87F9 4C 9A 80 PNONE: JMP ERR ;NO FREE IOCB'S 1144 1145 ;FOUND FREE IOCB (INDEX IN X) 1146 1147 87FC 8E 3D 80 THSONE: STX PIOCB ;SAVE IOCB INDEX 1148 87FF A9 08 LDA #OPNOT ;OPEN FOR OUTPUT 1149 8801 9D 4A 03 STA ICAX1,X 1150 8804 SET2 PDEV,ICBAL,X ;POINT TO DEVICE TEXT (1) 8804 A9 3C (1) 8806 9D 44 03 (1) 8809 A9 88 (1) 880B 9D 45 03 1151 880E A9 03 LDA #OPEN ;OPEN COMMAND 1152 8810 9D 42 03 CIOC: STA ICCOM,X ;STORE COMMAND 1153 8813 A9 00 LDA #0 ;SET LENGTH TO ZERO 1154 8815 9D 48 03 STA ICBLL,X 1155 8818 9D 49 03 STA ICBLH,X 1156 881B 98 TYA ;MIGHT HAVE CHARACTER 1157 881C 20 56 E4 CALL CIOV ;INVOKE O/S 1158 881F 8C 03 03 STY DSTATS ;PUT COMPLETION CODE HERE 1159 8822 10 BB BPL INCRET ;RETURN IF NO ERROR 1160 8824 C0 80 CPY #BRKABT ;BREAK TYPED? 1161 8826 F0 03 BEQ 10$ 1162 8828 4C 52 83 JMP IOCERR ;COMMON ERROR HANDLER 1163 1164 882B 4C 98 86 10$: JMP ABORT ;ABORT I/O - RETURN TO TOP LEVEL 1165 1166 ; CLOSE PRINTER IOCB 1167 1168 882E AE 3D 80 CLOSEP: LDX PIOCB ;SETUP IOCB INDEX 1169 8831 F0 AC BEQ INCRET ;RETURN IF NONE 1170 8833 CLR PIOCB ;FLAG NO PRINTER (1) 8833 A9 00 (2) 8835 8D 3D 80 1171 8838 A9 0C LDA #CLOSE ;CLOSE COMMAND 1172 883A D0 D4 BNE CIOC ; INVOKE CIO 1173 1174 883C 50 3A 9B PDEV: .ASCII "P:"<.ATEOL> 1175 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 25 ALBUG.M65 1177 ;GENERAL BREAKPOINT ROUTINES 1178 1179 ;ROUTINE TO REMOVE BREAKPOINTS 1180 1181 883F A2 07 REMB: LDX #MAXBP-1 ;COUNT OF THINGS TO DO 1182 8841 BD 50 80 5$: LDA BPINS,X ;GET INSTR OR ZERO 1183 8844 F0 05 BEQ 10$ ;NO BP IF ZERO 1184 8846 20 4F 88 CALL SETA ;SET UP ADDRS 1185 8849 91 E0 STA (INBUF),Y ;STORE INSTR 1186 884B CA 10$: DEX 1187 884C 10 F3 BPL 5$ ;LOOP OVER ALL 1188 884E 60 RET ;RETURN 1189 1190 ;SETUP ADDRS OF GIVEN BREAKPOINT FOR INDIRECT 1191 ;RETURNS INBUF WITH BPLOC,X , Y := 0 1192 ;PRESERVES AC 1193 1194 884F BC 60 80 SETA: LDY BPLOCL,X ;GET LOW ADDRS BYTE 1195 8852 84 E0 STY INBUF ;USE THIS AS TEMP 1196 8854 BC 68 80 LDY BPLOCH,X ;GET HIGH ADDRS BYTE 1197 8857 84 E1 STY INBUF+1 1198 8859 A0 00 LDY #0 ;SET FOR GLOBAL INDIRECT 1199 885B 60 RET ;RETURN 1200 1201 ;ROUTINE TO INSERT BREAKPOINTS 1202 1203 885C A2 07 INSB: LDX #MAXBP-1 ;DO ALL 1204 885E BD 50 80 5$: LDA BPINS,X ;SEE IF ACTIVE 1205 8861 F0 0C BEQ 10$ ;SKIP IF NO BP 1206 8863 20 4F 88 CALL SETA ;SET UP ADDRS 1207 8866 B1 E0 LDA (INBUF),Y ;GET OLD INSTR 1208 8868 9D 50 80 STA BPINS,X ;SAVE OLD INSTR 1209 886B A9 00 LDA #0 ;PUT BREAK IN PLACE 1210 886D 91 E0 STA (INBUF),Y ;... 1211 886F CA 10$: DEX 1212 8870 10 EC BPL 5$ ;LOOP TILL DONE 1213 8872 60 RET ;RETURN 1214 1215 ;INTERUPT SERVICES 1216 1217 ;IRQ - INSTRUCTION OR ACTUAL APPLICATION INT. 1218 1219 8873 68 BREAK: PLA ;AC IS ON STACK 1220 8874 85 E4 STA AC ;SAVE ACCUM 1221 8876 68 PLA ;PROCESSOR STATUS 1222 8877 85 E7 STA PS 1223 8879 84 E6 STY YREG ;SAVE INDEX REGS 1224 887B 86 E5 STX XREG 1225 887D 68 PLA ;PC LOW 1226 887E 38 SEC ;DECREMENT PC TO REAL LOC 1227 887F E9 02 SBC #2 ;ADJUST PC FOR ACTUAL BP LOC 1228 8881 8D 2C 80 10$: STA PRPC ;SAVE HERE FOR $P 1229 8884 85 E2 STA POINT ;SAVE HERE FOR EXAMINE 1230 8886 68 PLA ;PC HIGH 1231 8887 B0 02 BCS 20$ ;CHECK BORROW 1232 8889 E9 00 SBC #0 ;ADJUST BY 1 1233 888B 8D 2D 80 20$: STA PRPC+1 1234 888E 85 E3 STA POINT+1 1235 8890 BA TSX ;GET STACK PNTR 1236 8891 86 E8 STX SP ; SAVE IT AWAY 1237 8893 20 3F 88 CALL REMB ;REMOVE BREAKPOINTS NOW 1238 8896 A2 08 LDX #MAXBP ;SEARCH FOR BPN 1239 8898 BD 4F 80 25$: LDA BPINS-1,X ;ACTIVE BP? 1240 889B F0 08 BEQ 30$ ;NO - SKIP TO NEXT 1241 889D AD 2D 80 LDA PRPC+1 ;GET PC HIGH 1242 88A0 DD 67 80 CMP BPLOCH-1,X ;MATCH? 1243 88A3 F0 08 BEQ 35$ ;YES - TRY FOR LOW 1244 88A5 CA 30$: DEX ;STEP TO NEXT 1245 88A6 D0 F0 BNE 25$ ; MORE TO DO 1246 88A8 8E 3B 80 STX BPN ;SIGNAL NO B.P. 1247 88AB F0 25 BEQ BRKX ;NONE FOUND (MAYBE PANIC) 1248 ;.. LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 26 ALBUG.M65 1250 ;.. 1251 1252 88AD AD 2C 80 35$: LDA PRPC ;GET PC LOW 1253 88B0 DD 5F 80 CMP BPLOCL-1,X ;MATCH? 1254 88B3 D0 F0 BNE 30$ ;NO - KEEP LOOKING 1255 1256 ;ACTUAL BPN IN X 1257 1258 88B5 8E 3B 80 STX BPN ;SAVE BPN 1259 88B8 BD 57 80 LDA BPCNT-1,X ;BREAT THIS TIME? (0) 1260 88BB F0 15 BEQ BRKX ;BREAK IF ZERO 1261 88BD DE 57 80 DEC BPCNT-1,X ;COUNT THIS TIME 1262 88C0 F0 10 BEQ BRKX ; AND DO AUTO PROC (IF .NE. 0) 1263 88C2 CLR SNGLF ; NOT SINGLE STEP (1) 88C2 A9 00 (2) 88C4 8D 3A 80 1264 88C7 SETXA IXCT ;EXIT THROUGH HERE (1) 88C7 A2 CE (1) 88C9 A9 84 1265 88CB 48 BRKRTI: PHA ;SAVE HIGH PC 1266 88CC 8A TXA ;GET LOW 1267 88CD 48 PHA ;SAVE IT TOO 1268 88CE A5 E7 LDA PS 1269 88D0 48 PHA ;CURRENT PROCESSOR STATUS 1270 88D1 40 RTI ;DISMISS TO ROUTINE 1271 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 27 ALBUG.M65 1273 ;HERE TO ENTER BREAKPOINT - CLEAR SINGLE STEP FLAG 1274 1275 88D2 BRKX: CLR SNGLF ; CLEAR SS FLAG (1) 88D2 A9 00 (2) 88D4 8D 3A 80 1276 88D7 SETXA DOBRK (1) 88D7 A2 DD (1) 88D9 A9 88 1277 88DB D0 EE BNE BRKRTI ;EXIT INT TO DOBRK 1278 1279 88DD 20 85 87 DOBRK: CALL CRLFS ;PUT OUT A CR/LF 1280 88E0 A9 42 LDA #'B ;PRINT BN;ADDRS 1281 88E2 20 6D 87 CALL OUTSCH 1282 88E5 AD 3B 80 LDA BPN ;MAYBE 0 1283 88E8 20 9A 87 CALL HEXSTA ;TYPE LOW 4 BITS 1284 88EB A9 3B LDA #'; 1285 88ED 20 6D 87 CALL OUTSCH 1286 88F0 4C BC 81 JMP LFDS1 ;GO PRINT OUT ADDRESS AND INSTR. 1287 1288 88F3 BRKY: MOV2 POINT,PRPC ;SINGLE STEP ENTRY - POINT HAS PC (1) 88F3 A5 E2 (1) 88F5 8D 2C 80 (1) 88F8 A5 E3 (1) 88FA 8D 2D 80 1289 88FD AD 3A 80 LDA SNGLF ;WAS THIS SINGLE STEP? 1290 8900 D0 DB BNE DOBRK ; SIMULATE BREAK IF $X 1291 8902 4C 93 83 JMP GO2 ;ELSE - JUST PROCEED 1292 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 28 ALBUG.M65 6502 DISASSEMBLER 1294 .SBTTL 6502 DISASSEMBLER 1295 1296 1297 8905 20 7E 89 DSMBL: CALL CALCAD ;CALCULATE EFFECTIVE ADDRESS 1298 8908 48 PHA ;SAVE MNEMONIC TABLE INDEX 1299 8909 B1 E2 PROP: LDA (POINT),Y ;GET OP AND PRINT IT 1300 890B 20 91 87 CALL PRTSBY 1301 890E A2 01 LDX #$1 ;ONE SPACE 1302 8910 20 64 87 10$: CALL PRBL2 1303 8913 CC 2E 80 CPY LENGTH ;PRINT INSTR (1 TO 3 BYTES) 1304 8916 C8 INY ; IN A 12-CHAR FIELD 1305 8917 90 F0 BCC PROP 1306 8919 A2 03 LDX #$3 ;CHAR COUNT FOR MNEMONIC PRINT 1307 891B C0 04 CPY #$4 1308 891D 90 F1 BCC 10$ 1309 891F 68 PLA ;RECOVER MNEMONIC INDEX 1310 8920 A8 TAY 1311 8921 B9 6E 8A LDA MNEML,Y 1312 8924 8D 32 80 STA LMNEM ;FETCH 3-CHAR MNEMONIC 1313 8927 B9 AE 8A LDA MNEMR,Y ; (PACKED IN 2 BYTES) 1314 892A 8D 33 80 STA RMNEM 1315 892D A9 00 PRMN1: LDA #$0 1316 892F A0 05 LDY #$5 1317 8931 0E 33 80 PRMN2: ASL RMNEM 1318 8934 2E 32 80 ROL LMNEM ;SHIFT 5 BITS OF CHAR INTO A 1319 8937 2A ROL A ; (CLEARS CARRY) 1320 8938 88 DEY 1321 8939 D0 F6 BNE PRMN2 1322 893B 69 3F ADC #$3F ;ADD '?' OFFSET 1323 893D 20 6D 87 CALL OUTSCH 1324 8940 CA DEX 1325 8941 D0 EA BNE PRMN1 1326 8943 20 62 87 CALL PRBLNK ;PRINT 3 BLANKS 1327 8946 A2 06 LDX #$6 ;COUNT FOR 6 PRINT FORMAT BITS 1328 8948 E0 03 PRADR1: CPX #$3 1329 894A D0 1B BNE PRADR3 ;IF X=3 THEN PRINT ADDRESS VAL 1330 894C AC 2E 80 LDY LENGTH 1331 894F F0 16 BEQ PRADR3 ;NO PRINT IF LENGTH=0 1332 8951 AD 2F 80 LDA PFRMT 1333 8954 C9 E8 CMP #$E8 ;HANDLE REL ADDRESSING MODE 1334 8956 D0 06 BNE PRADR2 ;IF NOT DO NOT ADJUST NUMBER OF BYTES 1335 8958 C8 INY ;IF RELATIVE BRANCH PRINT 2 BYTES 1336 8959 CLR PFRMT ;CLEAR PFRMT (1) 8959 A9 00 (2) 895B 8D 2F 80 1337 895E B9 DF 00 PRADR2: LDA INBUF-1,Y ;SPECIAL (PRINT TARGET ADDRS) 1338 8961 20 91 87 CALL PRTSBY ;OUTPUT 1 OR 2 BYTE ADDRS 1339 8964 88 DEY ; MSB FIRST 1340 8965 D0 F7 BNE PRADR2 1341 8967 0E 2F 80 PRADR3: ASL PFRMT ;TEST NEXT PRINT FORMAT BIT 1342 896A 90 0E BCC PRADR4 ;IF 0, DON'T PRINT 1343 896C BD 61 8A LDA CHAR1-1,X ; CORRESPONDING CHARS 1344 896F 20 6D 87 CALL OUTSCH ;OUTPUT 1 OR 2 CHARS 1345 8972 BD 67 8A LDA CHAR2-1,X ; (IF CHAR FROM CHAR2 IS 0, 1346 8975 F0 03 BEQ PRADR4 ; DON'T OUTPUT IT) 1347 8977 20 6D 87 CALL OUTSCH 1348 897A CA PRADR4: DEX 1349 897B D0 CB BNE PRADR1 1350 897D 60 RET 1351 1352 1353 ;SET UP LENGTH, PFRMT AND EFFECTIV ADDRESS 1354 ; RETURNS INDEX INTO MNEMONIC TABLES IN A AND 0 IN Y 1355 1356 897E A0 00 CALCAD: LDY #0 ;SET UP FOR INDEXING 1357 8980 84 E1 STY INBUF+1 ;ZERO HIGH BYTE OF ADDRESS IN CASE ONLY ONE BYTE 1358 8982 B1 E2 LDA (POINT),Y ;GET OPCODE 1359 8984 A8 TAY ;SAVE IN Y 1360 8985 4A LSR A ; EVEN/ODD TEST 1361 8986 90 0B BCC IEVEN 1362 8988 4A LSR A ; TEST B1 1363 8989 B0 17 BCS IERR ; XXXXXX11 INSTR INVALID 1364 898B C9 22 CMP #$22 1365 898D F0 13 BEQ IERR ; 10001001 INSTR INVALID 1366 898F 29 07 AND #$7 ;MASK 3 BITS FOR ADDRS MODE 1367 8991 09 80 ORA #$80 ; ADD INDEXING OFFSET. LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 28-1 ALBUG.M65 6502 DISASSEMBLER 1368 8993 4A IEVEN: LSR A ;LSB INTO CARRY FOR 1369 8994 AA TAX ; LEFT/RIGHT TEST BELOW. 1370 8995 BD 10 8A LDA MODE1,X ;INDEX INTO ADDRS MODE TABLE 1371 8998 B0 04 BCS RTMODE ;IF CARRY SET USE LSD FOR 1372 899A 4A LSR A ; PRINT FORMAT INDEX. 1373 899B 4A LSR A 1374 899C 4A LSR A 1375 899D 4A LSR A ; IF CARRY CLEAR, USE MSD 1376 899E 29 0F RTMODE: AND #$F ;MASK FOR 4-BIT INDEX 1377 89A0 D0 04 BNE GETFMT ; 0 FOR INVALID OPCODES 1378 89A2 A0 80 IERR: LDY #$80 ;SUBSTITUTE $80 FOR INVALID OP. 1379 89A4 A9 00 LDA #$0 ;SET PRINT FORMAT TO 0 1380 89A6 AA GETFMT: TAX 1381 89A7 BD 54 8A LDA MODE2,X ;INDEX INTO PRINT FORMAT TABLE 1382 89AA 8D 2F 80 STA PFRMT ;SAVE FOR ADDRESS FIELD FORMAT 1383 89AD 29 03 AND #$3 ;MASK 2-BIT LENGTH 0 = 1-BYTE, 1384 89AF 8D 2E 80 STA LENGTH ; 1 = 2-BYTE, 2 = 3-BYTE. 1385 89B2 98 TYA ;RESTORE OP CODE 1386 89B3 48 PHA ;SAVE OPCODE ON STACK 1387 89B4 AC 2E 80 LDY LENGTH ;GET LENGTH 1388 89B7 F0 13 BEQ 10$ ;IF ZERO SET CURRENT ADDRESS IN INBUF FOR TAB 1389 89B9 B1 E2 LDA (POINT),Y ;GET FIRST BYTE OF ADDRESS 1390 89BB C0 01 CPY #1 ;IS IT A 2 BYTE INSTRUCTION 1391 89BD D0 16 BNE 20$ ;NO GO PRINT BOTH BYTES 1392 89BF E0 0D CPX #13 ;WAS INDEX TO MODE2 FOR RELATIVE 1393 89C1 D0 17 BNE 30$ ;NO GO DO JUST ONE BYTE 1394 89C3 20 F7 89 CALL RELADR ;GO CALCULATE RELATIVE ADDRESS 1395 89C6 84 E1 STY INBUF+1 ;SAVE HIGH ORDER BYTE 1396 89C8 8A TXA ;GET LOW ORDER BYTE BACK 1397 89C9 4C DA 89 JMP 30$ ;GO FINISH UP 1398 1399 89CC A5 E3 10$: LDA POINT+1 ;GET HIGH ORDER BYTE OF ADDRESS 1400 89CE 85 E1 STA INBUF+1 ;AND SAVE IT 1401 89D0 A5 E2 LDA POINT ;GET LOW BYTE 1402 89D2 4C DA 89 JMP 30$ ;GO SAVE IT AND FINISH 1403 1404 89D5 85 E1 20$: STA INBUF+1 ;SAVE HIGH BYTE OF ADDRESS 1405 89D7 88 DEY ;SET TO GET LOW ORDER BYTE 1406 89D8 B1 E2 LDA (POINT),Y ;GET LOW BYTE 1407 89DA 85 E0 30$: STA INBUF ;SAVE LOW BYTE OF ADDRESS 1408 89DC 68 PLA ;GET OPCODE BACK 1409 89DD A8 TAY ;AND SAVE IT IN Y 1410 89DE 29 8F AND #$8F ;MASK IT FOR 1XXX1010 TEST 1411 89E0 AA TAX ; AND SAVE IT. 1412 89E1 98 TYA ;OPCODE AGAIN 1413 89E2 A0 03 LDY #$3 1414 89E4 E0 8A CPX #$8A 1415 89E6 F0 0B BEQ 60$ 1416 89E8 4A 40$: LSR A 1417 89E9 90 08 BCC 60$ ;FORM INDEX INTO MNEMONIC TABLE 1418 89EB 4A LSR A 1419 89EC 4A 50$: LSR A ; 1XXX1010 -> 00101XXX 1420 89ED 09 20 ORA #$20 ; XXXYYY01 -> 00111XXX 1421 89EF 88 DEY ; XXXYYY10 -> 00110XXX 1422 89F0 D0 FA BNE 50$ ; XXXYY100 -> 00100XXX 1423 89F2 C8 INY ; XXXXX000 -> 000XXXXX 1424 89F3 88 60$: DEY 1425 89F4 D0 F2 BNE 40$ 1426 89F6 60 RET 1427 1428 1429 ;HERE TO HANDLE RELATIVE BRANCH ADDRS 1430 1431 89F7 20 04 8A RELADR: CALL PCADJ3 ;PCL,H + DISPL + 1 TO A,Y 1432 89FA AA TAX 1433 89FB E8 INX 1434 89FC D0 01 BNE 10$ ; +1 TO X,Y 1435 89FE C8 INY 1436 89FF 60 10$: RET LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 29 ALBUG.M65 6502 DISASSEMBLER 1438 ;ADD LENGTH TO POINT 1439 1440 8A00 AD 2E 80 PCADJ: LDA LENGTH ;0=1-BYTE, 1=2-BYTE, 2=3-BYTE 1441 8A03 38 SEC 1442 8A04 A4 E3 PCADJ3: LDY POINT+1 1443 8A06 AA TAX ;TEST DISPL SIGN (FOR REL 1444 8A07 10 01 BPL 10$ ; BRANCH). EXTEND NEG 1445 8A09 88 DEY ; BY DECREMENTING PCH. 1446 8A0A 65 E2 10$: ADC POINT 1447 8A0C 90 01 BCC 20$ ;PCL+LENGTH (OR DISPL) +1 TO A. 1448 8A0E C8 INY ;CARRY INTO Y (PCH) 1449 8A0F 60 20$: RET 1450 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30 ALBUG.M65 6502 DISASSEMBLER 1452 ;TABLES 1453 1454 8A10 40 MODE1: .BYTE $40 1455 8A11 02 .BYTE $2 1456 8A12 45 .BYTE $45 1457 8A13 03 .BYTE $3 1458 8A14 D0 .BYTE $D0 1459 8A15 08 .BYTE $8 1460 8A16 40 .BYTE $40 1461 8A17 09 .BYTE $9 1462 8A18 30 .BYTE $30 ;XXXXXXZ0 INSTRS. 1463 8A19 22 .BYTE $22 1464 8A1A 45 .BYTE $45 ; Z=0, LEFT HALF-BYTE 1465 8A1B 33 .BYTE $33 ; Z=1, RIGHT HALF-BYTE 1466 8A1C D0 .BYTE $D0 1467 8A1D 08 .BYTE $8 1468 8A1E 40 .BYTE $40 1469 8A1F 09 .BYTE $9 1470 8A20 40 .BYTE $40 1471 8A21 02 .BYTE $2 1472 8A22 45 .BYTE $45 1473 8A23 33 .BYTE $33 1474 8A24 D0 .BYTE $D0 1475 8A25 08 .BYTE $8 1476 8A26 40 .BYTE $40 1477 8A27 09 .BYTE $9 1478 8A28 40 .BYTE $40 1479 8A29 02 .BYTE $2 ;(WAS 0) 1480 8A2A 45 .BYTE $45 ;(WAS 40) 1481 8A2B B3 .BYTE $B3 ;(WAS B0) 1482 8A2C D0 .BYTE $D0 1483 8A2D 08 .BYTE $8 ;(WAS 0) 1484 8A2E 40 .BYTE $40 1485 8A2F 09 .BYTE $9 ;(WAS 0) 1486 8A30 00 .BYTE $0 1487 8A31 22 .BYTE $22 1488 8A32 44 .BYTE $44 1489 8A33 33 .BYTE $33 1490 8A34 D0 .BYTE $D0 1491 8A35 8C .BYTE $8C 1492 8A36 44 .BYTE $44 1493 8A37 00 .BYTE $0 1494 8A38 11 .BYTE $11 1495 8A39 22 .BYTE $22 1496 8A3A 44 .BYTE $44 1497 8A3B 33 .BYTE $33 1498 8A3C D0 .BYTE $D0 1499 8A3D 8C .BYTE $8C 1500 8A3E 44 .BYTE $44 1501 8A3F 9A .BYTE $9A 1502 8A40 10 .BYTE $10 1503 8A41 22 .BYTE $22 1504 8A42 44 .BYTE $44 1505 8A43 33 .BYTE $33 1506 8A44 D0 .BYTE $D0 1507 8A45 08 .BYTE $8 1508 8A46 40 .BYTE $40 1509 8A47 09 .BYTE $9 1510 8A48 10 .BYTE $10 1511 8A49 22 .BYTE $22 1512 8A4A 44 .BYTE $44 1513 8A4B 33 .BYTE $33 1514 8A4C D0 .BYTE $D0 1515 8A4D 08 .BYTE $8 1516 8A4E 40 .BYTE $40 1517 8A4F 09 .BYTE $9 1518 8A50 62 .BYTE $62 1519 8A51 13 .BYTE $13 ;YYXXXZ01 INSTRS. 1520 8A52 78 .BYTE $78 1521 8A53 A9 .BYTE $A9 1522 1523 8A54 00 MODE2: .BYTE $0 ;ERR 1524 8A55 21 .BYTE $21 ;IMM 1525 8A56 01 .BYTE $1 ;Z-PAG (WAS 81) 1526 8A57 02 .BYTE $2 ;ABS (WAS 82) 1527 8A58 00 .BYTE $0 ;IMPL LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-1 ALBUG.M65 6502 DISASSEMBLER 1528 8A59 80 .BYTE $80 ;ACC (WAS 0) 1529 8A5A 59 .BYTE $59 ;(Z-PAG,X) 1530 8A5B 4D .BYTE $4D ;(Z-PAG),Y 1531 8A5C 11 .BYTE $11 ;Z-PAG,X (WAS 91) 1532 8A5D 12 .BYTE $12 ;ABS,X (WAS 92) 1533 8A5E 06 .BYTE $6 ;ABS,Y (WAS 86) 1534 8A5F 4A .BYTE $4A ;(ABS) 1535 8A60 05 .BYTE $5 ;Z-PAG,Y (WAS 85) 1536 8A61 1D .BYTE $1D ;REL (WAS 9D) 1537 1538 8A62 2C CHAR1: .BYTE ', ;COMMA 1539 8A63 29 .BYTE ') ;RPAREN 1540 8A64 2C .BYTE ', ;COMMA 1541 8A65 23 .BYTE '# ;SHARP 1542 8A66 28 .BYTE '( ;LPAREN 1543 8A67 41 .BYTE 'A ;(WAS '$) 1544 1545 8A68 59 CHAR2: .BYTE 'Y 1546 8A69 00 .BYTE 0 ;NULL 1547 8A6A 58 .BYTE 'X 1548 8A6B 00 .BYTE 0 ;(WAS '$) 1549 8A6C 00 .BYTE 0 ;(WAS '$) 1550 8A6D 00 .BYTE 0 1551 1552 8A6E 1C MNEML: .BYTE $1C ;XXXXX000 INSTRS. 1553 8A6F 8A .BYTE $8A 1554 8A70 1C .BYTE $1C 1555 8A71 23 .BYTE $23 1556 8A72 5D .BYTE $5D 1557 8A73 8B .BYTE $8B 1558 8A74 1B .BYTE $1B 1559 8A75 A1 .BYTE $A1 1560 8A76 9D .BYTE $9D 1561 8A77 8A .BYTE $8A 1562 8A78 1D .BYTE $1D 1563 8A79 23 .BYTE $23 1564 8A7A 9D .BYTE $9D 1565 8A7B 8B .BYTE $8B 1566 8A7C 1D .BYTE $1D 1567 8A7D A1 .BYTE $A1 1568 8A7E 00 .BYTE $0 1569 8A7F 29 .BYTE $29 1570 8A80 19 .BYTE $19 1571 8A81 AE .BYTE $AE 1572 8A82 69 .BYTE $69 1573 8A83 A8 .BYTE $A8 1574 8A84 19 .BYTE $19 1575 8A85 23 .BYTE $23 1576 8A86 24 .BYTE $24 1577 8A87 53 .BYTE $53 1578 8A88 1B .BYTE $1B 1579 8A89 23 .BYTE $23 1580 8A8A 24 .BYTE $24 1581 8A8B 53 .BYTE $53 1582 8A8C 19 .BYTE $19 1583 8A8D A1 .BYTE $A1 1584 8A8E 00 .BYTE $0 ;XXXYY100 INSTRS 1585 8A8F 1A .BYTE $1A 1586 8A90 5B .BYTE $5B 1587 8A91 5B .BYTE $5B 1588 8A92 A5 .BYTE $A5 1589 8A93 69 .BYTE $69 1590 8A94 24 .BYTE $24 1591 8A95 24 .BYTE $24 1592 8A96 AE .BYTE $AE ;1XXX1010 INSTRS. 1593 8A97 AE .BYTE $AE 1594 8A98 A8 .BYTE $A8 1595 8A99 AD .BYTE $AD 1596 8A9A 29 .BYTE $29 1597 8A9B 00 .BYTE $0 1598 8A9C 7C .BYTE $7C 1599 8A9D 00 .BYTE $0 1600 8A9E 15 .BYTE $15 ;XXXYYY10 INSTRS. 1601 8A9F 9C .BYTE $9C 1602 8AA0 6D .BYTE $6D 1603 8AA1 9C .BYTE $9C ;(WAS 0) LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-2 ALBUG.M65 6502 DISASSEMBLER 1604 8AA2 A5 .BYTE $A5 1605 8AA3 69 .BYTE $69 1606 8AA4 29 .BYTE $29 1607 8AA5 53 .BYTE $53 1608 8AA6 84 .BYTE $84 ;XXXYYY01 INSTRS. 1609 8AA7 13 .BYTE $13 1610 8AA8 34 .BYTE $34 1611 8AA9 11 .BYTE $11 1612 8AAA A5 .BYTE $A5 1613 8AAB 69 .BYTE $69 1614 8AAC 23 .BYTE $23 1615 8AAD A0 .BYTE $A0 1616 1617 8AAE D8 MNEMR: .BYTE $D8 ;XXXXX000 INSTRS. 1618 8AAF 62 .BYTE $62 1619 8AB0 5A .BYTE $5A 1620 8AB1 48 .BYTE $48 1621 8AB2 26 .BYTE $26 1622 8AB3 62 .BYTE $62 1623 8AB4 94 .BYTE $94 1624 8AB5 88 .BYTE $88 1625 8AB6 54 .BYTE $54 1626 8AB7 44 .BYTE $44 1627 8AB8 C8 .BYTE $C8 1628 8AB9 54 .BYTE $54 1629 8ABA 68 .BYTE $68 1630 8ABB 44 .BYTE $44 1631 8ABC E8 .BYTE $E8 1632 8ABD 94 .BYTE $94 1633 8ABE 00 .BYTE $0 1634 8ABF B4 .BYTE $B4 1635 8AC0 08 .BYTE $8 1636 8AC1 84 .BYTE $84 1637 8AC2 74 .BYTE $74 1638 8AC3 B4 .BYTE $B4 1639 8AC4 28 .BYTE $28 1640 8AC5 6E .BYTE $6E 1641 8AC6 74 .BYTE $74 1642 8AC7 F4 .BYTE $F4 1643 8AC8 CC .BYTE $CC 1644 8AC9 4A .BYTE $4A 1645 8ACA 72 .BYTE $72 1646 8ACB F2 .BYTE $F2 1647 8ACC A4 .BYTE $A4 1648 8ACD 8A .BYTE $8A 1649 8ACE 00 .BYTE $0 ;XXXYY100 INSTRS. 1650 8ACF AA .BYTE $AA 1651 8AD0 A2 .BYTE $A2 1652 8AD1 A2 .BYTE $A2 1653 8AD2 74 .BYTE $74 1654 8AD3 74 .BYTE $74 1655 8AD4 74 .BYTE $74 1656 8AD5 72 .BYTE $72 1657 8AD6 44 .BYTE $44 ;1XXX1010 INSTRS. 1658 8AD7 68 .BYTE $68 1659 8AD8 B2 .BYTE $B2 1660 8AD9 32 .BYTE $32 1661 8ADA B2 .BYTE $B2 1662 8ADB 00 .BYTE $0 1663 8ADC 22 .BYTE $22 1664 8ADD 00 .BYTE $0 1665 8ADE 1A .BYTE $1A ;XXXYYY10 INSTRS. 1666 8ADF 1A .BYTE $1A 1667 8AE0 26 .BYTE $26 1668 8AE1 26 .BYTE $26 ;(WAS 0) 1669 8AE2 72 .BYTE $72 1670 8AE3 72 .BYTE $72 1671 8AE4 88 .BYTE $88 1672 8AE5 C8 .BYTE $C8 1673 8AE6 C4 .BYTE $C4 1674 8AE7 CA .BYTE $CA 1675 8AE8 26 .BYTE $26 1676 8AE9 48 .BYTE $48 1677 8AEA 44 .BYTE $44 1678 8AEB 44 .BYTE $44 1679 8AEC A2 .BYTE $A2 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-3 ALBUG.M65 6502 DISASSEMBLER 1680 8AED C8 .BYTE $C8 1681 LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 31 ALBUG.M65 6502 DISASSEMBLER 1683 ;SPECIAL SYMBOL TABLE 1684 1685 8AEE 2F