From 92f5cb9a93c99d007d378ca3afe365df6ae92e8c Mon Sep 17 00:00:00 2001 From: Sven Oliver Moll Date: Mon, 4 Nov 2024 21:07:19 +0100 Subject: [PATCH] another evening of miscellaneous coding - int-test: terminal size output now in decimal - minor updates in documentation - added additional bootblock for minimal NMOS 6502 support - kernel/bios updates to improve minimal NMOS 6502 support - work on wozmon2: bugfix, improvements and new feature Signed-off-by: Sven Oliver Moll --- doc/cpu_detect.md | 2 +- doc/monitors.md | 21 ++++--- src/65c02/CMakeLists.txt | 11 +++- src/65c02/native_bios.inc | 19 ++++-- src/65c02/native_kernel.ld | 4 +- src/65c02/native_rom/bios.s | 28 ++++----- src/65c02/native_rom/kernel.s | 24 +++++--- src/65c02/nmos6502/bios.s | 98 ++++++++++++++++++++++++++++++ src/65c02/nmos6502/kernel.s | 92 ++++++++++++++++++++++++++++ src/65c02/sx4/int-test.s | 72 ++++++++++++++++++++-- src/65c02/sx4/wozmon2c.s | 109 ++++++++++++++++------------------ 11 files changed, 377 insertions(+), 103 deletions(-) create mode 100644 src/65c02/nmos6502/bios.s create mode 100644 src/65c02/nmos6502/kernel.s diff --git a/doc/cpu_detect.md b/doc/cpu_detect.md index bf22926..edd5132 100644 --- a/doc/cpu_detect.md +++ b/doc/cpu_detect.md @@ -105,7 +105,7 @@ with a pin layout similar to the original NMOS 6502 and the CMOS 65C02: - 65C02, the base CMOS variant, as compared to the NMOS version, a couple of bugs were fixed, and new instructions were introduced - 65SC02, a 65C02 with the bit-related opcodes removed ($x7 and $xF are - just 1 byte, 1 cycle NOPs) + just 1 byte, 1 cycle NOPs), STP and WAI are missing as well - 65816, a 16 bit capable variant of the 65SC02, with all 256 opcodes defined now - 65CE02, a CMOS reimplementation of the 65C02 by Commodore with also diff --git a/doc/monitors.md b/doc/monitors.md index b892154..feb4840 100644 --- a/doc/monitors.md +++ b/doc/monitors.md @@ -36,6 +36,10 @@ comes with a lot of new features like a disassembler, a direct mini assembler from the Apple //c and file access which is custom to the Sorbus Computer. +As of now, this monitor needs to be loaded from the internal drive +using the file browser. This is intended to change, once it is +considered stable. + Displaying and entering data works the same as on the original WozMon. There is an addition: instead of entering hex data, you can also enter ASCII by prepending the letter with a single quote (`'`). However, when @@ -63,10 +67,12 @@ When the prompt is a asterisk (`*`): opcode. (Option renamed from Ctrl-E.) The values of those registers can be changed by the `:` command as the edit address pointer has been put to the correct place in memory ($00FB-$00FF). -- `c000<0400.07ffM`: move (or rather copy) the memory from $0400 to $0BFF to +- `c000<0400.0bffM`: move (or rather copy) the memory from $0400 to $0BFF to $C000 to $C7FF. -- `c000<0400.07ffV`: verify (or rather compare) the memory from $0400 to +- `c000<0400.0bffV`: verify (or rather compare) the memory from $0400 to $0BFF to $C000 to $C7FF. +- `bd + $:$ "${CMAKE_CURRENT_SOURCE_DIR}/../bin/cpm" ${extra_files} - DEPENDS ${native_cpm_bootblock} ${native_browser} ${CPM_FILES} ${CPMFS_EXTRA_TARGETS} + DEPENDS ${native_cpm_bootblock} ${native_nmos6502_bootblock} ${native_browser} ${CPM_FILES} ${CPMFS_EXTRA_TARGETS} ) endfunction() @@ -133,6 +133,13 @@ add_executable(native_tools ) target_type(native_tools native_kernel) +add_executable(native_nmos6502_bootblock + nmos6502/kernel.s + native_rom/woz.s + nmos6502/bios.s + ) +target_type(native_nmos6502_bootblock native_kernel) + add_executable(native_cpm_bootblock linkcpm.s ../bin/cpm/CPM diff --git a/src/65c02/native_bios.inc b/src/65c02/native_bios.inc index d16b8de..5e23589 100644 --- a/src/65c02/native_bios.inc +++ b/src/65c02/native_bios.inc @@ -9,6 +9,7 @@ ; - For the 65CE02 code, the use of the int macro is strongly recommended ; to take care of the additional Z register, else the Z register must ; be $00 +; - For NMOS 6502 variant, only CHRIN, CHROUT and PRINT are suppored ; $FF00: read a character from UART in A, returns C=1 when no queue is empty .define CHRIN $FF00 @@ -32,19 +33,25 @@ .global brkjump ; kernel only, doesn't matter in other banks .global reset ; kernel only, doesn't matter in other banks -.ifp4510 -.macro int arg +.ifp02 + .macro int arg + .error trying to use software interrupt which is not supported on MOS 6502 + .endmacro +.else + .ifp4510 + .macro int arg stz $DF2B ; save Z register that can't be written to stack ldz #$00 ; clear Z register to be compatible to 65(S)C02 .byte $00,arg ; BRK with operand php ; ldz changes processor status register ldz $DF2B ; restore Z register plp ; restore processor status -.endmacro -.else -.macro int arg + .endmacro + .else + .macro int arg .byte $00,arg ; BRK with operand -.endmacro + .endmacro + .endif .endif ; will jump using vector UVBRK ($DF78/$DF79) diff --git a/src/65c02/native_kernel.ld b/src/65c02/native_kernel.ld index 71df0bc..d80387b 100644 --- a/src/65c02/native_kernel.ld +++ b/src/65c02/native_kernel.ld @@ -3,8 +3,8 @@ MEMORY { ROM: start = $E000, size = $1F00, define = yes, file = %O, fill = yes, fillval = $FF; - BIOS: start = $FF00, size = $00FA, define = yes, file = %O, fill = yes, fillval = $FF; - VECTORS: start = $FFFA, size = $0006, define = yes, file = %O, fill = yes; + BIOS: start = $FF00, size = $00EC, define = yes, file = %O, fill = yes, fillval = $FF; + VECTORS: start = $FFEC, size = $0014, define = yes, file = %O, fill = yes; ZP: start = $0004, size = $00FC, define = yes; STACK: start = $0100, size = $0100, define = yes; } diff --git a/src/65c02/native_rom/bios.s b/src/65c02/native_rom/bios.s index fadeafe..536d024 100644 --- a/src/65c02/native_rom/bios.s +++ b/src/65c02/native_rom/bios.s @@ -76,16 +76,6 @@ ramio_cmd: ; optional idea: push X to stack and expand ramio_cmd to 3 bytes for JSR -RESET: - ; reset routine that also works when copied to RAM - lda #$01 - sta BANK ; set banking to first ROM bank (kernel) - jmp reset ; jump to reset routine -NMI: - jmp (UVNMI) ; user vector for NMI ($DF7A) -IRQ: - jmp (UVIRQ) ; user vector for BRK/IRQ ($DF7E) -> irqcheck (default) - IRQCHECK: sta BRK_SA ; let's figure out the source of the IRQ pla ; get processor status from stack @@ -130,15 +120,25 @@ IRQCHECK: lda BRK_SA ; get stored accumulator rti ; return to calling code -.assert CHRIN = _chrin, error, "CHRIN at wrong address" -.assert CHROUT = _chrout, error, "CHROUT at wrong address" -.assert PRINT = _print, error, "PRINT at wrong address" - .out " =============================" .out .sprintf( " BIOS size: $%04x ($%04x free)", * - BIOS, $FA - (* - BIOS) ) .out " =============================" .segment "VECTORS" +NMI: + jmp (UVNMI) ; user vector for NMI ($DF7A) +IRQ: + jmp (UVIRQ) ; user vector for BRK/IRQ ($DF7E) -> irqcheck (default) +RESET: + ; reset routine that also works when copied to RAM + lda #$01 + sta BANK ; set banking to first ROM bank (kernel) + jmp reset ; jump to reset routine + .word NMI .word RESET .word IRQ + +.assert CHRIN = _chrin, error, "CHRIN at wrong address" +.assert CHROUT = _chrout, error, "CHROUT at wrong address" +.assert PRINT = _print, error, "PRINT at wrong address" diff --git a/src/65c02/native_rom/kernel.s b/src/65c02/native_rom/kernel.s index 4608e87..13612b8 100644 --- a/src/65c02/native_rom/kernel.s +++ b/src/65c02/native_rom/kernel.s @@ -70,9 +70,17 @@ reset: @no65c02loop: jsr PRINT - .byte 13, "NMOS 6502 not supported, dropping to WozMon", 0 + .byte 13, "NMOS 6502 not supported, key to boot sector 1 ", 0 +: + iny + bne :- + inx + bne :- jsr CHRIN bcs @no65c02loop + + lda #$01 + jmp boota ; slip through woz: @@ -117,13 +125,13 @@ cmos6502: : cmp #'B' bne :+ - ldy #$03 + lda #$03 @execrom2: jmp execrom ; execute 3rd ROM bank @ $E000 : cmp #'F' bne :+ - ldy #$02 + lda #$02 ldx #$00 ; jmp vector 0: file browser bra @execrom2 ; execute 2nd ROM bank @ $E000 : @@ -243,16 +251,16 @@ boota: .byte "Go",10,0 execram: ; execute loaded boot block in RAM at $E000 - ldy #$00 -execrom: ; has to be called with Y=bank to switch to - phy + lda #$00 +execrom: ; has to be called with A=bank to switch to + pha ldy #(@trampolineend-@trampoline-1) : lda @trampoline,y ; this requires bankswitching code written to RAM sta TRAMPOLINE,y dey bpl :- - ply + pla jmp TRAMPOLINE+@jmpbank0-@trampoline @trampoline: @@ -261,7 +269,7 @@ execrom: ; has to be called with Y=bank to switch to stz BANK ; set BANK back to $00 (RAM) rts @jmpbank0: - sty BANK + sta BANK jmp $E000 @trampolineend: diff --git a/src/65c02/nmos6502/bios.s b/src/65c02/nmos6502/bios.s new file mode 100644 index 0000000..7e3d5ce --- /dev/null +++ b/src/65c02/nmos6502/bios.s @@ -0,0 +1,98 @@ + +; set processor to NMOS 6502 +.p02 + +.include "../native.inc" +.include "../native_bios.inc" + +;------------------------------------------------------------------------- +; BIOS calls $FF00-$FFFF +;------------------------------------------------------------------------- + +.segment "BIOS" +BIOS: +_chrin: + ; read character from UART + jmp chrin +_chrout: + ; write character to UART + jmp chrout +_print: + ; print a string while keeping all registers + sta ASAVE ; save A, it is used together with + php ; processor status register, + pla ; which can be only read via stack + sta PSAVE ; save it + pla ; get lobyte of address of text from stack and + sta TMP16+0 ; store it into temporary vector + pla ; same for hibyte + sta TMP16+1 ; store + tya ; make function 6502 proof, store Y the NMOS way + pha + ldy #$00 ; required for "lda (TMP16),y" below +@loop: + inc TMP16+0 ; since JSR stores return address - 1, start with + bne :+ ; incrementing the pointer + inc TMP16+1 +: + lda (TMP16),y ; this could be "lda (tmp16)", but does not work with + ; NMOS 6502 or 65CE02 + beq @out ; $00 bytes indicates end of text + jsr chrout ; output the character + bpl @loop ; get next char (65C02 only opcode, jmp also works) +@out: + pla + tay ; restore save Y register + lda TMP16+1 ; get updated vector now pointing to end of text + pha ; write hibyte to stack + lda TMP16+0 ; (reverse order of fetching) + pha ; write lobyte to stack + lda PSAVE ; get saved processor status + pha ; put it on stack for restoring + lda ASAVE ; get saved A + plp ; get processor status from stack into register + rts ; now return to code after text + +chrout: + bit UARTWS ; wait for buffer to accept data + bmi chrout + sta UARTWR ; write data to output queue + rts + +chrin: + lda UARTRS ; check for size of input queue + bne :+ ; data available, fetch it + sec ; no input -> return 0 and set carry + rts +: + lda UARTRD ; get key value + clc + rts + + +IRQCHECK: + sta TRAP + rti ; return to calling code + +.out " ==================================" +.out .sprintf( " NMOS BIOS size: $%04x ($%04x free)", * - BIOS, $FA - (* - BIOS) ) +.out " ==================================" + +.segment "VECTORS" +NMI: + jmp (UVNMI) ; user vector for NMI ($DF7A) +IRQ: + jmp (UVIRQ) ; user vector for BRK/IRQ ($DF7E) -> irqcheck (default) +RESET: + ; reset routine that also has to work when copied to RAM + lda #$01 + sta BANK ; set banking to first ROM bank (kernel) + jmp reset ; jump to reset routine + + .word NMI + .word RESET + .word IRQ + +.assert CHRIN = _chrin, error, "CHRIN at wrong address" +.assert CHROUT = _chrout, error, "CHROUT at wrong address" +.assert PRINT = _print, error, "PRINT at wrong address" diff --git a/src/65c02/nmos6502/kernel.s b/src/65c02/nmos6502/kernel.s new file mode 100644 index 0000000..e21b5a9 --- /dev/null +++ b/src/65c02/nmos6502/kernel.s @@ -0,0 +1,92 @@ + +.P02 +.include "../native.inc" +.include "../native_bios.inc" +.include "../native_kernel.inc" + +.import wozstart + +.segment "CODE" +reset: + jmp start + .byte "SBC23" + +start: + cld + sei + jsr PRINT + .byte 10,"CPU features: ",0 + ; $01 NMOS, $02 CMOS, $04 BIT (RE)SET, $08 Z reg, $10 16 bit + lda CPUID + lsr + bcc :+ + jsr PRINT + .byte "NMOS ",0 +: + lsr + bcc :+ + jsr PRINT + .byte "CMOS ",0 +: + lsr + bcc :+ + jsr PRINT + .byte "BBBSR ",0 +: + lsr + bcc :+ + jsr PRINT + .byte "Z-Reg ",0 +: + lsr + bcc :+ + jsr PRINT + .byte "16bit ",0 +: + +woz: + lda #$0a ; start WozMon port + jsr CHROUT +: ; workaround for WozMon not handling RTS when executing external code + jsr wozstart + ; will be reached if own code run within WozMon exits using rts + jmp :- ; no bra here: NMOS 6502 fallback mode + +chrinuc: + ; wait for character from UART and make it uppercase + jsr CHRIN + bcs chrinuc +uppercase: + cmp #'a' + bcc :+ + cmp #'z'+1 + bcs :+ + and #$df +: + rts + +prhex16: + ; output 16 bit value in X,A + pha + txa + jsr prhex8 + pla + ; fall through +prhex8: + ; output 8 bit value in A + pha ; save A for LSD + lsr ; move MSD down to LSD + lsr + lsr + lsr + jsr prhex4 ; print MSD + pla ; restore A for LSD +prhex4: + and #$0f ; mask LSD for hex PRINT + ora #'0' ; add ascii "0" + cmp #':' ; is still decimal + bcc :+ ; yes -> output + adc #$06 ; adjust offset for letters A-F +: + jmp CHROUT + diff --git a/src/65c02/sx4/int-test.s b/src/65c02/sx4/int-test.s index 0b6f7b8..ecbe879 100644 --- a/src/65c02/sx4/int-test.s +++ b/src/65c02/sx4/int-test.s @@ -7,6 +7,8 @@ TMPVEC = $fe SIN_XR = $fc SIN_YR = $fd +D_BUF = $fb ; 3 bytes + .segment "CODE" start: ldy #VT100_SCRN_CLR @@ -54,7 +56,6 @@ done: bcs :- jmp start - jmptab: .word quit .word user @@ -64,6 +65,65 @@ jmptab: .word gensine jmpend: +dec8: ; print A as a decimal value + ldx #$00 +dec16: ; print A/X (lo/hi) as a decimal value + sta TMPVEC+0 + stx TMPVEC+1 + stz D_BUF+0 + stz D_BUF+1 + stz D_BUF+2 + ldy #$10 + sed +: + asl TMPVEC+0 + rol TMPVEC+1 + ; lda + adc is the same as asl, only in decimal mode + lda D_BUF+0 + adc D_BUF+0 + sta D_BUF+0 + lda D_BUF+1 + adc D_BUF+1 + sta D_BUF+1 + lda D_BUF+2 + adc D_BUF+2 + sta D_BUF+2 + dey + bne :- + cld + + ldx #$02 +: + lda D_BUF+0,x + jsr prhex8 + dex + bpl :- + rts + +prhex8: ; print a hex value, Y=0 -> skip leading zeros + pha + lsr + lsr + lsr + lsr + jsr :+ + pla +: + and #$0f + ora #$30 + cmp #'9'+1 + bcc :+ + adc #$06 +: + cmp #$30 + bne :+ + cpy #$00 + bne :+ + rts +: + iny + jmp CHROUT + user: jsr PRINT .byte "save vector:$",$00 @@ -165,17 +225,17 @@ vt100: @printxa: jsr PRINT - .byte 10,"terminal size $",0 + .byte 10,"terminal size ",0 pha txa - int PRHEX8 + jsr dec8 - jsr PRINT - .byte " x $",0 + lda #'x' + jsr CHROUT pla - int PRHEX8 + jsr dec8 lda #$0a jmp CHROUT diff --git a/src/65c02/sx4/wozmon2c.s b/src/65c02/sx4/wozmon2c.s index c696d6c..a4553fe 100644 --- a/src/65c02/sx4/wozmon2c.s +++ b/src/65c02/sx4/wozmon2c.s @@ -157,6 +157,7 @@ wozmon2c: .byte 10,"change: start: value value value" .byte 10,"verify: destyes, get new index dex bpl NEWOP1 ;else check next one - rts ;not found, exit with BNE + rts ;not found, exit with BNE GETINDX: lda INDX,x ;lookup index for mnemonic @@ -523,7 +524,7 @@ SCRN2: bcc RTMSKZ ;IF EVEN, USE LO H lsr lsr - lsr ;SHIFT HIGH HALF BYTE DOWN + lsr ;SHIFT HIGH HALF BYTE DOWN lsr RTMSKZ: and #$0F ;MASK 4-BITS @@ -539,7 +540,7 @@ INSDS1: ;lda (PCL,x) ;GET OPCODE lda (PCL) ;GET OPCODE INDS2: - tay ;LABLE moved down 1 + tay ;LABLE moved down 1 lsr ;EVEN/ODD TEST bcc IEVEN ror ;BIT 1 TEST @@ -565,8 +566,8 @@ GETFMT: jsr NEWOPS ;get index for new opcodes beq GOTONE ;found a new op (or no op) and #$8F ;MASK FOR 1XXX1010 TEST - tax ; SAVE IT - tya ;OPCODE TO A AGAIN + tax ; SAVE IT + tya ;OPCODE TO A AGAIN ldy #$03 cpx #$8A beq MNNDX3 @@ -577,9 +578,9 @@ MNNDX1: MNNDX2: lsr ; 1) 1XXX1010 => 00101XXX ora #$20 ; 2) XXXYYY01 => 00111XXX - dey ; 3) XXXYYY10 => 00110XXX + dey ; 3) XXXYYY10 => 00110XXX bne MNNDX2 ; 4) XXXYY100 => 00100XXX - iny ; 5) XXXXX000 => 000XXXXX + iny ; 5) XXXXX000 => 000XXXXX MNNDX3: dey bne MNNDX1 @@ -590,21 +591,20 @@ GOTONE: ;****************************************************************************** instdsp: jsr INSDS1 ;GEN FMT, LEN BYTES (sets Y=$00) - pha ;SAVE MNEMONIC TABLE INDEX + pha ;SAVE MNEMONIC TABLE INDEX PRNTOP: - ;lda (PCL),y - lda (PCL) - jsr PRBYTE + lda (PCL),y + int PRHEX8 ldx #$01 ;PRINT 2 BLANKS PRNTBL: jsr PRBL2 cpy LENGTH ;PRINT INST (1-3 BYTES) - iny ;IN A 12 CHR FIELD + iny ;IN A 12 CHR FIELD bcc PRNTOP ldx #$03 ;CHAR COUNT FOR MNEMONIC INDEX cpy #$04 bcc PRNTBL - pla ;RECOVER MNEMONIC INDEX + pla ;RECOVER MNEMONIC INDEX asl tay lda MNEM+1,y @@ -646,7 +646,7 @@ PRADR3: PRADR4: dey bmi PRADR2 - jsr PRBYTE + int PRHEX8 PRADR5: lda FORMAT cmp #$E8 ;HANDLE REL ADR MODE @@ -660,10 +660,11 @@ PRADR5: PRNTYX: tya PRNTAX: - jsr PRBYTE ;OUTPUT TARGET ADR + int PRHEX8 ;OUTPUT TARGET ADR PRNTX: - txa ; OF BRANCH AND RETURN - jmp PRBYTE + txa ; OF BRANCH AND RETURN + int PRHEX8 + rts PRBLNK: ldx #$03 ;BLANK COUNT @@ -675,17 +676,17 @@ PRBL2: rts pcadj: - sec ;0=1 BYTE, 1=2 BYTE, + sec ;0=1 BYTE, 1=2 BYTE, lda LENGTH ; 2=3 BYTE pcadj3: ldy PCH - tax ;TEST DISPLACEMENT SIGN + tax ;TEST DISPLACEMENT SIGN bpl pcadj4 ; (FOR REL BRANCH) - dey ;EXTEND NEG BY DECR PCH + dey ;EXTEND NEG BY DECR PCH pcadj4: adc PCL bcc RTS2 ;PCL+LENGTH(OR DISPL)+1 TO A - iny ; CARRY INTO Y (PCH) + iny ; CARRY INTO Y (PCH) RTS2: rts @@ -721,11 +722,17 @@ LT2: rts MOVE: -: lda (A1L),y ;MOVE (A) THRU (A2) TO (A4) sta (A4L),y jsr NXTA4 - bcc :- ;MOVE + bcc MOVE + rts + +PUT: + lda A5L + sta (A1L),y + jsr NXTA4 + bcc PUT rts VERIFY: @@ -734,13 +741,13 @@ VERIFY: beq VFYOK jsr PRA1 lda (A1L),y - jsr PRBYTE + int PRHEX8 lda #$A0 jsr cout lda #$A8 jsr cout lda (A4L),y - jsr PRBYTE + int PRHEX8 lda #$A9 jsr cout VFYOK: @@ -756,10 +763,10 @@ LIST: jsr a1pc ;MOVE A1 (2 BYTES) TO lda #$14 ; PC IF SPEC'D AND LIST2: - pha ;+DISASSEMBLE 20 INSTRUCTIONS. + pha ;+DISASSEMBLE 20 INSTRUCTIONS. jsr showinst ;+Display a line pla - dec ;+Count down + dec ;+Count down bne LIST2 rts @@ -773,7 +780,7 @@ showinst: ;****************************************************************************** a1pc: - txa ;IF USER SPECIFIED AN ADDRESS, + txa ;IF USER SPECIFIED AN ADDRESS, beq A1PCRTS ; COPY IT FROM A1 TO PC. A1PCLP: lda A1L,x ;YEP, SO COPY IT. @@ -821,13 +828,14 @@ RDSP1: .else lda ACC+5,x .endif - jsr PRBYTE + int PRHEX8 inx bne RDSP1 rts rtbl: .byte "AXYPS" + ;****************************************************************************** GETLNZ: jsr CROUT @@ -884,7 +892,7 @@ GO: ldy YREG plp - jsr @jsrindirect ; AND GO! + jsr @indirect ; AND GO! php sta A5H ;SAVE 6502 REGISTER CONTENTS @@ -899,7 +907,7 @@ GO: cld rts -@jsrindirect: +@indirect: jmp (PCL) ; BL1: @@ -957,7 +965,7 @@ DATAOUT: cpx #$07 beq :- lda (A1L) ;was: lda (A1L),y - jsr PRBYTE ;OUTPUT BYTE IN HEX + int PRHEX8 ;OUTPUT BYTE IN HEX jsr NXTA1 bcc MOD8CHK ;NOT DONE YET. GO CHECK MOD 8 rts ;DONE. @@ -978,23 +986,8 @@ ADD: lda #$BD ;PRINT '=', THEN RESULT jsr cout pla -; -PRBYTE: - pha ;PRINT BYTE AS 2 HEX DIGITA - lsr ; (DESTROYS A-REG) - lsr - lsr - lsr - jsr PRHEXZ - pla -; -PRHEX: - and #$0F ;PRINT HEX DIGIT IN A-REG -PRHEXZ: - ora #$B0 ;LSBITS ONLY. - cmp #$BA - bcc cout - adc #$06 + int PRHEX8 + rts ; cout: pha @@ -1055,7 +1048,7 @@ NXTBIT: asl rol A2L rol A2H - dex ;LEAVE X=$FF IF DIG + dex ;LEAVE X=$FF IF DIG bpl NXTBIT NXTBAS: lda MODE @@ -1110,7 +1103,7 @@ TOSUB: ZMODE: ldy #$00 ; MODE IN A-REG), sty MODE - rts ; AND 'RTS' TO THE SUBROUTINE! + rts ; AND 'RTS' TO THE SUBROUTINE! ;****************************************************************************** @@ -1190,6 +1183,7 @@ MNEM: .word $ACC6 ; $41:"TRB" .word $8A74 ; $42:"PHY" .word $8B74 ; $43:"PLY" + .word $0000 ; $44:"???" (was $FC) ;****************************************************************************** ; FMT1 BYTES: XXXXXXY0 INSTRS @@ -1355,8 +1349,7 @@ INDX: .byte $3D ;LDA (ZPAG) .byte $3E ;CMP (ZPAG) ;??? (the unknown opcode) .byte $3F ;SBC (ZPAG) - .byte $FC ;??? - .byte $00 + .byte $44 ;??? CHRTBL: @@ -1366,6 +1359,7 @@ CHRTBL: .byte $D6 ;} (SAVE) .byte $EB ;R was: $BE ;^E (OPEN AND DISPLAY REGISTERS) .byte $9A ;+! (Mini assembler) + .byte $E9 ;P (MEMORY PUT/FILL) .byte $EF ;V (MEMORY VERIFY) .byte $A6 ;'-' (SUBSTRACTION) .byte $A4 ;'+' (ADDITION) @@ -1385,6 +1379,7 @@ SUBTBL: .word SAVE-1 .word REGDSP-1 ;R was: $BE ;^E (OPEN AND DISPLAY REGISTERS) .word GETINST1-1 ;+! (Mini assembler) + .word PUT-1 ;P (MEMORY PUT/FILL) .word VERIFY-1 ;V (MEMORY VERIFY) .word SETMODE-1 ;'-' (SUBSTRACTION) .word SETMODE-1 ;'+' (ADDITION)