ca65 V2.17 - Git 582aa41 Main file : Monitor.ca65 Current file: Monitor.ca65 000000r 1 ; 000000r 1 ; ACORN System 1 Monitor 000000r 1 ; 000000r 1 ; Disassembled from original PROMs and comments added from Manual. 000000r 1 ; Corrections from Errata sheet incorporated and a few typo's. 000000r 1 ; 000000r 1 ; (Chris Oddy November 2018) 000000r 1 ; 000000r 1 .setcpu "6502" 000000r 1 .listbytes unlimited 000000r 1 ; 000000r 1 ; Zero Page Registers 000000r 1 ; 000000r 1 MAP := $00 ; M Address 000000r 1 GAP := $02 ; GO Address 000000r 1 PAP := $04 ; Breakpoint Address 000000r 1 FAP := $06 ; Tape From Address 000000r 1 TAP := $08 ; Tape To Address 000000r 1 R0 := $0A ; Register 0, A after Breakpoint 000000r 1 R1 := $0B ; Register 1, X after Breakpoint 000000r 1 R2 := $0C ; Register 2, Y after Breakpoint 000000r 1 R3 := $0D ; Register 3, P after Breakpoint 000000r 1 KEY := $0D ; Last Pressed Key 000000r 1 REPEAT := $0E ; Single or Repeat Scan 000000r 1 EXEC := $0F ; Execution Status 000000r 1 D := $10 ; Display Address 000000r 1 R4 := $10 ; Register 4, PCH after Breakpoint 000000r 1 R5 := $11 ; Register 5, PCL after Breakpoint 000000r 1 R6 := $12 ; Register 6 000000r 1 R7 := $13 ; Register 7 000000r 1 P := $18 ; Breakpoint Storage 000000r 1 COL := $19 ; Key Column 000000r 1 TX := $1A ; Temporary X Storage 000000r 1 TY := $1A ; Temporary Y Storage 000000r 1 RECAL := $1B ; Breakpoint Correction 000000r 1 USERNMI := $001C ; NMI Routine Address 000000r 1 USERIRQ := $001E ; IRQ Routine Address 000000r 1 000000r 1 ; Hardware Address's 000000r 1 000000r 1 PIA := $0E20 ; A Programmable I/O 000000r 1 PIB := $0E21 ; B Programmable I/O 000000r 1 ADDR := $0E22 ; A Data direction register 000000r 1 BDDR := $0E23 ; B Data direction register 000000r 1 000000r 1 .org $FE00 00FE00 1 00FE00 1 A0 06 QUAD: ldy #$06 ; DISPLAY THE 4 BYTES AT X-3, X-2, 00FE02 1 ; X-1 & X IN THAT ORDER ON THE 00FE02 1 ; DISPLAY 00FE02 1 B5 00 STILL: lda 0,X ; GET THE BYTE POINTED TO BY X 00FE04 1 20 6F FE jsr DHEXTD ; USE DOUBLE HEX TO DISPLAY ROUTINE 00FE07 1 CA dex ; NEXT X 00FE08 1 88 dey ; NEXT Y POSITION 00FE09 1 88 dey 00FE0A 1 10 F6 bpl STILL ; FALL AUTO DISPLAY WHEN 00FE0C 1 ; FINISHED - Y POSITION & ALSO 00FE0C 1 ; LOOP COUNTER 00FE0C 1 86 1A DISPLAY:stx TX ; SAVE X!!!! 00FE0E 1 A2 07 RESCAN: ldx #$07 ; SCAN 8 DIGITS, NO MATTER WHAT 00FE10 1 8E 22 0E stx ADDR ; SET UP DATA DIRECTION REGISTER 00FE13 1 A0 00 SCAN: ldy #$00 ; CLEAR Y FOR LATER USE 00FE15 1 B5 10 lda D,X ; GET DISPLAY DATA FROM THE 00FE17 1 ; ZERO PAGE MEMORY 00FE17 1 8D 21 0E sta PIB ; & PUT IT ONTO SEGMENTS 00FE1A 1 8E 20 0E stx PIA ; SET DIGIT DRIVE ON AND THE KEY 00FE1D 1 ; COLUMNS 00FE1D 1 AD 20 0E lda PIA ; GET KEY DIGIT BACK 00FE20 1 29 3F and #$3F ; REMOVE SURPLUS TOP BITS 00FE22 1 24 0F bit EXEC ; CHECK STATUS ='1' MEANS NOT 00FE24 1 ; PROCESSING A KEY 00FE24 1 10 18 bpl BUTTON ; BUT 0 MEANS THAT WE ARE 00FE26 1 ; THUS CAN BE BLOWN TO AN 00FE26 1 ; ESCAPE FROM THE DISPLAY 00FE26 1 ; ROUTINE ALTOGETHER ON STATUS 00FE26 1 ; C0 AT THE MOMENT IT IGNORES 00FE26 1 ; KEYS IF GIVEN THIS STATUS 00FE26 1 C9 38 cmp #$38 ; CHECK FOR ALL 1'S ROW INPUT 00FE28 1 ; FROM KEYBOARD = SET COPY IF SO 00FE28 1 B0 06 bcs DELAY ; IF ALL 1's THEN NO KEY HAS BEEN 00FE2A 1 ; PRESSED 00FE2A 1 86 19 stx COL ; STORE THE PRESSED KEY'S 00FE2C 1 ; COLUMN INFORMATION 00FE2C 1 A9 40 lda #$40 ; SET STATUS TO "WE ARE 00FE2E 1 ; PROCESSING A KEY" 00FE2E 1 85 0F KEYCLEAR:sta EXEC 00FE30 1 A1 00 DELAY: lda (0,X) 00FE32 1 88 dey ; Y WAS ZERO SO HERE IS A 256x5uS 00FE33 1 ; DELAY 00FE33 1 D0 FB bne DELAY ; Y WILL BE ZERO ON EXIT 00FE35 1 CA dex 00FE36 1 10 DB bpl SCAN ; IF X WAS STILL +VE, CONTINUE 00FE38 1 ; THIS SCAN 00FE38 1 A5 0E lda REPEAT ; IF WE SHOULD CONTINUE 00FE3A 1 ; SCANNING THEN TOP BIT IS SET 00FE3A 1 30 D2 bmi RESCAN ; CONTINUE SCANNING 00FE3C 1 10 14 bpl OUTPUT ; IF TOP BIT IS ZERO, THEN USE THIS 00FE3E 1 ; DATA AS THE KEY ITSELF 00FE3E 1 E4 19 BUTTON: cpx COL ; ARE WE ON THE SAME KEY'S COLUMN? 00FE40 1 D0 EE bne DELAY ; NO 00FE42 1 C9 38 cmp #$38 ; HAS A KEY ACTUALLY BEEN PRESSED? 00FE44 1 90 04 bcc PRESSED ; YES 00FE46 1 A9 80 lda #$80 ; NO, THEN CLEAR THE EXECUTION 00FE48 1 ; STATUS - THE KEY HAS BEEN 00FE48 1 ; PRESSED & RELEASED 00FE48 1 D0 E4 bne KEYCLEAR ; ALWAYS BRANCH 00FE4A 1 C5 0F PRESSED:cmp EXEC ; A KEY HAS BEEN PRESSED 00FE4C 1 F0 E2 beq DELAY ; BUT IT HAS ALREADY BEEN EXECUTED 00FE4E 1 85 0F sta EXEC ; SET IT AS BEING EXECUTED 00FE50 1 49 38 eor #$38 ; JIGGERY POKERY TO ENCODE THE 00FE52 1 ; ROW INPUTS TO BINARY 00FE52 1 29 1F OUTPUT: and #$1F ; ALSO ENSURE THE KEY IN REPEAT 00FE54 1 ; WAS OF REASONABLE SIZE 00FE54 1 C9 10 cmp #$10 ; A HEX KEY OR NOT? CARRY CLEAR 00FE56 1 ; IF HEX 00FE56 1 85 0D sta KEY ; PUT THE KEY IN A TEMP LOCATION 00FE58 1 ; FOR FURTHER USE (BY "MODIFY") 00FE58 1 A6 1A ldx TX ; RETRIEVE X 00FE5A 1 8C 21 0E sty PIB ; TURN THE SEGMENT DRIVES OFF 00FE5D 1 60 rts ; AND RETURN 00FE5E 1 A1 00 MHEXTD: lda (0,X) ; MEMORY HEX TO DISPLAY = GET A 00FE60 1 ; BYTE FROM MEMORY 00FE60 1 A0 06 RDHEXTD:ldy #$06 ; RIGHT (OF DISPLAY) DOUBLE HEX 00FE62 1 ; TO DISPLAY :SET Y TO RIGHT OF 00FE62 1 ; DISPLAY 00FE62 1 D0 0B bne DHEXTD ; AND USE DHEXTD 00FE64 1 A0 03 QHEXTD1:ldy #$03 ; QUAD HEX TO DISPLAY 1: SET Y 00FE66 1 ; TO USE POSNS 1,2,3 & 4 00FE66 1 B5 00 QHEXTD2:lda 0,X ; 2: USE ANY Y: GET THE DATA 00FE68 1 20 6F FE jsr DHEXTD ; AND USE DHEXTD 00FE6B 1 88 dey 00FE6C 1 88 dey ; HAVING DECREMENTED THE POSITION 00FE6D 1 B5 01 lda 1,X ; GET THE HIGH BYTE OF THE DATA 00FE6F 1 ; & USE DHEXTD 00FE6F 1 C8 DHEXTD: iny ; DOUBLE HEX TO DISPLAY :FIRST 00FE70 1 ; HEX ON RIGHTEST POSITION 00FE70 1 48 pha ; SAVE A 00FE71 1 20 7A FE jsr HEXTD ; USE HEX TO DISPLAY 00FE74 1 88 dey ; GET Y BACK TO CORRECT POSITION 00FE75 1 68 pla ; RETRIEVE A 00FE76 1 4A lsr A 00FE77 1 4A lsr A 00FE78 1 4A lsr A 00FE79 1 4A lsr A ; ORIENTED FOR OTHER HEX DIGIT 00FE7A 1 84 1A HEXTD: sty TY ; HEX TO DISPLAY = SAVE Y 00FE7C 1 29 0F and #$0F ; REMOVE SURPLUS BITS FROM A 00FE7E 1 A8 tay ; & PUT IT IN Y 00FE7F 1 B9 EA FF LDA FONT,Y ; GET THE 7 SEGMENT FORM 00FE82 1 A4 1A ldy TY ; RETRIEVE Y 00FE84 1 99 10 00 sta D,Y ; AND POSITION THE 7 SEG FORM ON 00FE87 1 ; THE DISPLAY 00FE87 1 60 rts 00FE88 1 20 64 FE QDATFET:jsr QHEXTD1 ; QUAD DATA FETCH - DISPLAY OLD DATA 00FE8B 1 20 0C FE jsr DISPLAY ; GET KEY 00FE8E 1 B0 20 bcs RETURN ; NON HEX RETURN 00FE90 1 A0 04 ldy #$04 ; LOOP COUNTER 00FE92 1 0A asl A 00FE93 1 0A asl A 00FE94 1 0A asl A 00FE95 1 0A asl A ; DIGIT IN A IN CORRECT PLACE 00FE96 1 0A SHIFTIN:asl A ; MULTI SHIFT TO GET DIGIT INTO MEMORY 00FE97 1 36 00 rol 0,X ; INDEXED 00FE99 1 36 01 rol 1,X 00FE9B 1 88 dey 00FE9C 1 D0 F8 bne SHIFTIN ; KEEP SHIFTING IN 00FE9E 1 F0 E8 beq QDATFET ; GO AND DO IT ALL AGAIN 00FEA0 1 F6 06 COM16: inc $06,X ; INCREMENT & COMPARE 16 BIT 00FEA2 1 ; NOS - INCREMENT LOWER 00FEA2 1 D0 02 bne NOINC ; NO HIGH INCREMENT 00FEA4 1 F6 07 inc $07,X 00FEA6 1 B5 06 NOINC: lda $06,X ; LOW BYTE EQUALITY TEST 00FEA8 1 D5 08 cmp $08,X 00FEAA 1 D0 04 bne RETURN ; NO NEED TO DO HIGH BYTE 00FEAC 1 B5 07 lda $07,X ; HIGH BYTE EQUALITY TEST 00FEAE 1 D5 09 cmp $09,X 00FEB0 1 60 RETURN: rts 00FEB1 1 A0 40 PUTBYTE:ldy #$40 ; PUT BYTE TO TAPE - CONFIGURE 00FEB3 1 ; I/O PORT 00FEB3 1 8C 22 0E sty ADDR 00FEB6 1 A0 07 ldy #$07 ; LOOP COUNTER 00FEB8 1 8C 20 0E sty PIA ; AND SEND THE START BIT 00FEBB 1 6A ror A 00FEBC 1 6A ror A ; BACK A UP A COUPLE OF BITS 00FEBD 1 20 CD FE AGAIN: jsr WAIT ; WAIT TO SEND OUT RESET BIT 00FEC0 1 6A ror A ; SENDING ORDER IS BIT 0 -> BIT 7 00FEC1 1 8D 20 0E sta PIA ; SEND BIT 00FEC4 1 88 dey 00FEC5 1 10 F6 bpl AGAIN ; KEEP GOING 00FEC7 1 20 CD FE jsr WAIT ; WAIT FOR THAT BIT TO END 00FECA 1 8C 20 0E sty PIA ; SEND STOP BIT : Y IS FF 00FECD 1 20 D0 FE WAIT: jsr HALFWAIT ; 300 BAUD WAITING TIME - IN TWO 00FED0 1 ; PARTS 00FED0 1 84 1A HALFWAIT:sty TY ; 1/2 THE WAITING TIME - SAVE Y 00FED2 1 A0 48 ldy #$48 ; 72 X 5uS DELAY 00FED4 1 88 WAIT1: dey ; PART ONE OF THE WAIT 00FED5 1 D0 FD bne WAIT1 00FED7 1 88 WAIT2: dey ; Y WAS ZERO ON ENTRY - 256 x 5uS 00FED8 1 ; DELAY 00FED8 1 D0 FD bne WAIT2 00FEDA 1 A4 1A ldy TY ; RETRIEVE Y 00FEDC 1 60 rts 00FEDD 1 A0 08 GETBYTE:ldy #$08 ; GET BYTE FROM TAPE - LOAD COUNTER 00FEDF 1 2C 20 0E START: bit PIA ; WAIT FOR 1 -> 0 TRANSISITON - 00FEE2 1 ; A START BIT 00FEE2 1 30 FB bmi START 00FEE4 1 20 D0 FE jsr HALFWAIT ; WAIT HALF THE TIME, SO 00FEE7 1 ; SAMPLING IN THE CENTRE 00FEE7 1 20 CD FE INPUT: jsr WAIT ; FULL WAIT TIME BETWEEN SAMPLES 00FEEA 1 0E 20 0E asl PIA ; GET SAMPLE INTO CARRY 00FEED 1 6A ror A ; AND AUTO A 00FEEE 1 88 dey 00FEEF 1 D0 F6 bne INPUT ; KEEP GOING 00FEF1 1 F0 DA beq WAIT ; USE WAIT TO GET OUT ONTO THE 00FEF3 1 ; STOP BIT HIGH 00FEF3 1 A2 FF RESET: ldx #$FF ; MAIN PROGRAM 00FEF5 1 9A txs ; INITIALIZE STACK 00FEF6 1 8E 23 0E stx BDDR ; AND B DATA DIRECTION REGISTER 00FEF9 1 86 0E stx REPEAT ; MULTI-SCAN DISPLAY MODE 00FEFB 1 A0 80 INIT: ldy #$80 ; THE FAMILIAR DOT ON THE DISPLAY 00FEFD 1 A2 09 ldx #$09 ; ALL EIGHT DISPLAYS AND 00FEFF 1 ; INITIALIZE EXEC 00FEFF 1 94 0E ROUND: sty REPEAT,X ; Y USED FOR AMUSEMENT 00FF01 1 CA dex 00FF02 1 D0 FB bne ROUND ; X ZERO ON EXIT, SO UP & DOWN 00FF04 1 ; IMMEDIATELY VALID 00FF04 1 20 0C FE RESTART:jsr DISPLAY ; MARK RETURN TO MONITOR POINT 00FF07 1 ; DISPLAY DISPLAY & GET KEY 00FF07 1 90 F2 REENTER:bcc INIT ; HEX KEY GETS THE DOTS BACK 00FF09 1 29 07 SEARCH: and #$07 ; REMOVE ANY STRAY BITS 00FF0B 1 ; (EFFECTIVELY SUBTRACT 10) 00FF0B 1 C9 04 cmp #$04 00FF0D 1 90 25 bcc FETADD ; KEYS OF VALUE LESS THAN 4 00FF0F 1 ; NEED AN ADDRESS 00FF0F 1 F0 6F beq LOAD ; KEY 4 IS THE LOAD-KEY 00FF11 1 C9 06 TEST6: cmp #$06 00FF13 1 F0 09 beq UP ; KEY 6 IS UP 00FF15 1 B0 0F bcs DOWN ; & KEY 7 IS DOWN 00FF17 1 A5 0A RETURN2:lda R0 ; MUST BE KEY 5 - GET A BACK 00FF19 1 A6 0B ldx R1 ; GET X BACK 00FF1B 1 A4 0C ldy R2 ; GET Y BACK 00FF1D 1 40 rti ; GET P & PC BACK & CONTINUE 00FF1E 1 ; FROM WHERE YOU WERE 00FF1E 1 F6 00 UP: inc 0,X ; 16 BIT INDEXED INCREMENT 00FF20 1 D0 0C bne ENTERM 00FF22 1 F6 01 inc 1,X 00FF24 1 B0 08 bcs ENTERM ; A BRANCH ALWAYS: THE CARRY 00FF26 1 ; WAS SET BY THE FF11 COMPARE 00FF26 1 B5 00 DOWN: lda 0,X ; 16 BIT INDEXED DECREMENT 00FF28 1 D0 02 bne NODEC 00FF2A 1 D6 01 dec 1,X 00FF2C 1 D6 00 NODEC: dec 0,X 00FF2E 1 20 64 FE ENTERM: jsr QHEXTD1 ; NOW DISPLAY THE VALUE 00FF31 1 4C 45 FF jmp MODIFY ; AND GET INTO THE MODIFY SECTION 00FF34 1 84 16 FETADD: sty D+6 ; CLEAR DISPLAYS 6 00FF36 1 84 17 sty D+7 ; & 7 - Y WAS ZERO ON EXIT FROM DISPLAY 00FF38 1 0A asl A ; DOUBLE A 00FF39 1 AA tax ; THE ZERO PAGE ADDRESSES MAP, 00FF3A 1 ; GAP, PAP & FAP 00FF3A 1 49 F7 eor #$F7 ; FIX UP DIGIT 0 COMMAND SYMBOL 00FF3C 1 85 10 sta D 00FF3E 1 20 88 FE jsr QDATFET ; FETCH THE ADDRESS, INTO MAP, 00FF41 1 ; GAP, PAP OR FAP 00FF41 1 E0 02 cpx #$02 ; CHECK X TO FIND OUT WHICH 00FF43 1 ; COMMAND WE'RE DOING 00FF43 1 B0 15 bcs N1 ; MUST BE 2,4 OR 6 - AS 0 IS 00FF45 1 20 5E FE MODIFY: jsr MHEXTD ; DISPLAY THE MEMORY 00FF48 1 20 0C FE jsr DISPLAY ; AND GET KEY 00FF4B 1 B0 BC bcs SEARCH ; IF NOT HEX DO OVER 00FF4D 1 A1 00 lda (0, X) ; HEX SO GET OLD INFO 00FF4F 1 0A asl A 00FF50 1 0A asl A 00FF51 1 0A asl A 00FF52 1 0A asl A ; MOVED ALONG 00FF53 1 05 0D ora KEY ; AND PUT IN NEW INFO 00FF55 1 81 00 sta (0, X) ; AND PUT IT BACK 00FF57 1 4C 45 FF jmp MODIFY ; THEN KEEP DOING IT 00FF5A 1 D0 03 N1: bne N2 ; MUST BE 4 OR 6 AS 2 IS .. 00FF5C 1 6C 02 00 GO: jmp (GAP) ; THE VERY SIMPLE GO 00FF5F 1 E0 04 N2: cpx #$04 ; IS IT 4 OR 6? 00FF61 1 F0 36 beq POINT ; WELL IT'S NOT 4 00FF63 1 A2 08 STORE: ldx #$08 ; SO IT MUST BE 6 - X NOW POINTS 00FF65 1 ; TO TAP 00FF65 1 86 10 stx D ; GIVE PROMPT 00FF67 1 20 88 FE jsr QDATFET ; AND GET 2ND STORE INFO 00FF6A 1 A2 04 ldx #$04 ; LOOP COUNT 00FF6C 1 B5 05 ADDRESS:lda $05,X ; SEND ADDRESSES TO TAPE 00FF6E 1 20 B1 FE jsr PUTBYTE 00FF71 1 CA dex 00FF72 1 D0 F8 bne ADDRESS ; X NEATLY ZEROED ON EXIT 00FF74 1 A1 06 DATAS: lda ($06,X) ; DATA SEND - GET INFO FROM MEMORY 00FF76 1 20 B1 FE jsr PUTBYTE ; AND SEND IT TO TAPE 00FF79 1 20 A0 FE jsr COM16 ; SEE IF PRINTED 00FF7C 1 D0 F6 bne DATAS ; NO 00FF7E 1 F0 2A beq WAYOUT ; YES 00FF80 1 A2 04 LOAD: ldx #$04 00FF82 1 20 DD FE ADDRSL: jsr GETBYTE ; RESCUE ADDRESSES FROM TAPE 00FF85 1 95 05 sta $05,X ; PUT THEM IN FAP & TAP, THOUGH 00FF87 1 ; IT COULD BE ELSEWHERE 00FF87 1 CA dex 00FF88 1 D0 F8 bne ADDRSL ; X NEATLY SERVED AGAIN 00FF8A 1 20 DD FE DATAL: jsr GETBYTE ; GET DATA FROM TAPE 00FF8D 1 81 06 sta ($06,X) ; AND STORE IT IN MEMORY 00FF8F 1 8D 21 0E sta PIB ; AND ON THE DISPLAY SO IT CAN BE SEEN 00FF92 1 20 A0 FE jsr COM16 ; SEE IF FINISHED 00FF95 1 D0 F3 bne DATAL ; NO 00FF97 1 F0 11 beq WAYOUT ; YES 00FF99 1 A1 00 POINT: lda (0,X) ; SET/CLEAR BREAK POINT - GET 00FF9B 1 ; DATA FROM ADDRESSED MEMORY 00FF9B 1 F0 06 beq SET ; IF ZERO BREAK POINT HAS 00FF9D 1 ; ALREADY BEEN SET = MUST CLEAR IT 00FF9D 1 85 18 sta P ; NOT ZERO SO SAVE THE INFORMATION 00FF9F 1 A9 00 lda #$00 ; AND PUT IN A BREAK POINT 00FFA1 1 F0 02 beq OUT 00FFA3 1 A5 18 SET: lda P ; WAS SET SO GET OLD INFORMATION BACK 00FFA5 1 81 00 OUT: sta ($00,X) ; INSERT BREAK POINT OR OLD INFORMATION 00FFA7 1 20 5E FE jsr MHEXTD ; NOW READ IT OUT AGAIN TO REVEAL ROM 00FFAA 1 4C 04 FF WAYOUT: jmp RESTART ; GO BACK & DO IT ALL OVER AGAIN 00FFAD 1 6C 1C 00 NMI: jmp (USERNMI) ; INDIRECTION ON NMI 00FFB0 1 6C 1E 00 IRQ: jmp (USERIRQ) ; INDIRECTION ON IRQ 00FFB3 1 85 0A BREAK: sta R0 ; WHEN THE IRQ/BREAK VECTOR 00FFB5 1 ; POINTS HERE THEN DISPLAY 00FFB5 1 ; EVERYTHING - SAVE A 00FFB5 1 86 0B stx R1 ; SAVE X 00FFB7 1 84 0C sty R2 ; SAVE Y 00FFB9 1 68 pla ; GET P OFF STACK 00FFBA 1 48 pha ; PUT IT BACK FOR FUTURE USE 00FFBB 1 85 0D sta R3 ; STORE Q IN REGISTER 3 00FFBD 1 A2 0D ldx #R3 ; SET X TO POINT AT REGISTERS 00FFBF 1 ; 3 -> 0 FOR QUAD 00FFBF 1 A9 FF lda #$FF ; KILL POSSIBILITY OF DISPLAY 00FFC1 1 ; BEING ON SINGLE SCAN 00FFC1 1 85 0E sta REPEAT 00FFC3 1 20 00 FE jsr QUAD ; USE QUAD TO WRITE OUT A X Y P 00FFC6 1 BA tsx ; GET STACK POINTER 00FFC7 1 86 13 stx R7 00FFC9 1 C8 iny ; Y ZERO SINCE QUAD ENDED WITH 00FFCA 1 ; DISPLAY SO THIS FORMS 01 00FFCA 1 84 12 sty R6 00FFCC 1 D8 cld ; CLEAR DECIMAL MODE FOR BINARY 00FFCD 1 ; SUBTRACT - DOESN'T AFFECT 00FFCD 1 ; USER SINCE P IS STACKED 00FFCD 1 BD 02 01 lda $0102,X ; GET PCL OFF STACK 00FFD0 1 38 sec 00FFD1 1 E5 1B sbc RECAL ; CORRECT IT BY AMOUNT IN RECAL 00FFD3 1 9D 02 01 sta $0102,X ; PUT IT BACK ON STACK 00FFD6 1 85 11 sta R5 ; AND STORE IT FOR QUAD 00FFD8 1 BD 03 01 lda $0103,X ; PCH OFF STACK 00FFDB 1 E9 00 sbc #$00 ; REST OF TWO BYTE SUBTRACTION 00FFDD 1 9D 03 01 sta $0103,X ; PUT IT BACK ON STACK 00FFE0 1 85 10 sta R4 ; AND STORE IT FOR QUAD 00FFE2 1 A2 13 ldx #R7 ; POINT X AT THESE REGISTERS - 00FFE4 1 ; QUAD WILL DESTROY THEM 00FFE4 1 20 00 FE jsr QUAD ; QUAD WRITES OUT PC SP 00FFE7 1 4C 07 FF jmp REENTER ; AND THE WHOLE SHEBARG STARTS OVER AGAIN 00FFEA 1 3F 06 5B 4F FONT: .byte $3F,$06,$5B,$4F ; '0'-'3' 00FFEE 1 66 6D 7D 07 .byte $66,$6D,$7D,$07 ; '4'-'7 00FFF2 1 7F 6F 77 7C .byte $7F,$6F,$77,$7C ; '8','9','A','b' 00FFF6 1 58 5E 79 71 .byte $58,$5E,$79,$71 ; 'c','d','E','F' 00FFFA 1 AD FF NMIVEC: .word NMI ; POINT TO THE ADDED INDIRECTION 00FFFC 1 F3 FE RSTVEC: .word RESET ; POINT TO THE RESET ENTRY POINT 00FFFE 1 B0 FF IRQVEC: .word IRQ ; POINT TO THE ADDED INDIRECTION 00FFFE 1