Skip to content

Instantly share code, notes, and snippets.

@zarutian
Forked from beneater/wozmon.s
Last active August 24, 2023 15:49
Show Gist options
  • Save zarutian/7074f12ea3ed5a44ee2c58e8fcf6d7ae to your computer and use it in GitHub Desktop.
Save zarutian/7074f12ea3ed5a44ee2c58e8fcf6d7ae to your computer and use it in GitHub Desktop.
; This version is meant for Commander X16 ( https://www.commanderx16.com )
; and uses its KERNAL (yes it is spelled this way) API
; ( https://github.com/X16Community/x16-docs/blob/master/X16%20Reference%20-%2004%20-%20KERNAL.md )
; it is mostly an programming excercise for me. -Zarutian
.inc "cmdrX16_kernal.inc" ; Not sure what it is called
.org $C000
.ascii "CX16"
.org $C004
XAML = $24 ; Last "opened" location Low
XAMH = $25 ; Last "opened" location High
STL = $26 ; Store address Low
STH = $27 ; Store address High
L = $28 ; Hex value parsing Low
H = $29 ; Hex value parsing High
YSAV = $2A ; Used to see if hex value is given
MODE = $2B ; $00=XAM, $7F=STOR, $AE=BLOCK XAM
IN = $0400 ; Input buffer
RESET: ; ADDR
LDA #$22 ; 0xC004 $A922 Need to copy the code to WRAM due to bank switching
STA XAML ; 0xC006 $8524
LDA #$C0 ; 0xC008 $A9C0
STA XAMH ; 0xC00A $8525
LDA #$00 ; 0xC00C $A900
STA STL ; 0xC00E $8526
LDA #$05 ; 0xC010 $A905
STA STH ; 0xC012 $8527
LDY #$00 ; 0xC014 $A000
RESET_L0: LDA (XAML),Y ; 0xC016 $B124
STA (STL),Y ; 0xC018 $9126
INY ; 0xC01A $C8
CPY #$FF ; 0xC01B $C0FF
BNE RESET_L0 ; 0xC01D $D0F7
JMP $0500 ; 0xC01F $200005
.org $0500 ; 0xC022 aliases to
LDA #$00 ; 0x0500 $A900 Set ROM bank to $00 KERNAL
STA $01 ; 0x0502 $8501
JSR console_init ; 0x0504 $20DBFE
LDA #$1B ; 0x0507 $A91B Begin with escape.
NOTCR:
CMP #$08 ; 0x0509 $C908 Backspace key?
BEQ BACKSPACE ; 0x050B $F013 Yes.
CMP #$1B ; 0x050D $C91B ESC?
BEQ ESCAPE ; 0x050F $F003 Yes.
INY ; 0x0511 $C8 Advance text index.
BPL NEXTCHAR ; 0x0512 $100E Auto ESC if line longer than 127.
ESCAPE:
LDA #$5C ; 0x0514 $A95C "\".
JSR ECHO ; 0x0516 $20EB05 Output it.
GETLINE:
LDA #$0D ; 0x0519 $A90D Send CR
JSR ECHO ; 0x051B $20EB05
LDY #$01 ; 0x051E $A001 Initialize text index.
BACKSPACE: DEY ; 0x0520 $88 Back up text index.
BMI GETLINE ; 0x0521 $30 Beyond start of line, reinitialize.
NEXTCHAR: PHX ; 0x0522 $DA
PHY ; 0x0523 $5A
NEXTCHAR_L0: JSR GETIN ; 0x0524 $20E4FF Kernal GETIN
CMP #$00 ; 0x0527 $C900 Key ready?
BEQ NEXTCHAR_L0 ; 0x0529 $F0F9 Loop until ready.
PLY ; 0x052B $7A
PLX ; 0x052C $FA
STA IN,Y ; 0x052D $990004 Add to text buffer.
JSR ECHO ; 0x0530 $20EB05 Display character.
CMP #$0D ; 0x0533 $C90D CR?
BNE NOTCR ; 0x0535 $D0D3 No.
LDY #$FF ; 0x0537 $A0FF Reset text index.
LDA #$00 ; 0x0539 $A900 For XAM mode.
TAX ; 0x053B $AA X=0.
SETBLOCK:
ASL ; 0x053C $0A
SETSTOR:
ASL ; 0x053D $0A Leaves $7B if setting STOR mode.
STA MODE ; 0x053E $852B $00 = XAM, $74 = STOR, $B8 = BLOK XAM.
BLSKIP:
INY ; 0x0540 $C8 Advance text index.
NEXTITEM:
LDA IN,Y ; 0x0541 $B90004 Get character.
CMP #$0D ; 0x0544 $C90D CR?
BEQ GETLINE ; 0x0546 $F0D1
Yes, done this line.
CMP #$2E ; 0x0548 $C92E "."?
BCC BLSKIP ; 0x054A $90F4 Skip delimiter.
BEQ SETBLOCK ; 0x054C $F0EF Set BLOCK XAM mode.
CMP #$3A ; 0x054E $C93A ":"?
BEQ SETSTOR ; 0x0550 $F0EB Yes, set STOR mode.
CMP #$52 ; 0x0552 $C952 "R"?
BEQ RUN ; 0x0554 $F03A Yes, run user program.
STX L ; 0x0556 $8628 $00 -> L.
STX H ; 0x0558 $8629 and H.
STY YSAV ; 0x055A $842A Save Y for comparison
NEXTHEX:
LDA IN,Y ; 0x055C $B90004 Get character for hex test.
EOR #$30 ; 0x055F $4930 Map digits to $0-9.
CMP #$0A ; 0x0561 $C90A Digit?
BCC DIG ; 0x0563 $9006 Yes.
ADC #$88 ; 0x0565 $6988 Map letter "A"-"F" to $FA-FF.
CMP #$FA ; 0x0567 $C9FA Hex letter?
BCC NOTHEX ; 0x0569 $9011 No, character not hex.
DIG:
ASL ; 0x056B $0A
ASL ; 0x056C $0A Hex digit to MSD of A.
ASL ; 0x056D $0A
ASL ; 0x056E $0A
LDX #$04 ; 0x056F $A204 Shift count.
HEXSHIFT:
ASL ; 0x0571 $0A Hex digit left, MSB to carry.
ROL L ; 0x0572 $2628 Rotate into LSD.
ROL H ; 0x0574 $2629 Rotate into MSD's.
DEX ; 0x0576 $CA Done 4 shifts?
BNE HEXSHIFT ; 0x0577 $D0F8 No, loop.
INY ; 0x0579 $C8 Advance text index.
BRA NEXTHEX ; 0x057A $80E0 Check next character for hex.
NOTHEX:
CPY YSAV ; 0x057C $C42A Check if L, H empty (no hex digits).
BEQ ESCAPE ; 0x057E $F0__ Yes, generate ESC sequence.
BIT MODE ; 0x0580 $242B Test MODE byte.
BVC NOTSTOR ; 0x0582 $500F B6=0 is STOR, 1 is XAM and BLOCK XAM.
LDA L ; 0x0584 $A528 LSD's of hex data.
STA (STL,X) ; 0x0586 $8126 Store current 'store index'.
INC STL ; 0x0588 $E626 Increment store index.
BNE NEXTITEM ; 0x058A $D0__ Get next item (no carry).
INC STH ; 0x058C $E627 Add carry to 'store index' high order.
TONEXTITEM: BRA NEXTITEM ; 0x058E $80__ Get next command item.
RUN:
JMP (XAML) ; 0x0590 $6C2400 Run at current XAM index.
NOTSTOR:
BMI XAMNEXT ; 0x0593 $303B B7 = 0 for XAM, 1 for BLOCK XAM.
LDX #$02 ; 0x0595 $A202 Byte count.
SETADR: LDA L-1,X ; 0x0597 $B527 Copy hex data to
STA STL-1,X ; 0x0599 $9525 'store index'.
STA XAML-1,X ; 0x059B $9523 And to 'XAM index'.
DEX ; 0x059D $CA Next of 2 bytes.
BNE SETADR ; 0x059E $D0F7 Loop unless X = 0.
NXTPRNT:
BNE PRDATA ; 0x05A0 $D014 NE means no address to print.
LDA #$0D ; 0x05A2 $A90D CR.
JSR ECHO ; 0x05A4 $20EB05 Output it.
LDA XAMH ; 0x05A7 $A525 'Examine index' high-order byte.
JSR PRBYTE ; 0x05A9 $20D805 Output it in hex format.
LDA XAML ; 0x05AC $A524 Low-order 'examine index' byte.
JSR PRBYTE ; 0x05AE $20D805 Output it in hex format.
LDA #$3A ; 0x05B1 $A93A ":".
JSR ECHO ; 0x05B3 $20EB05 Output it.
PRDATA:
LDA #$20 ; 0x05B6 $A920 Blank.
JSR ECHO ; 0x05B8 $20EB05 Output it.
LDA (XAML,X) ; 0x05BB $A124 Get data byte at 'examine index'.
JSR PRBYTE ; 0x05BD $20D805 Output it in hex format.
XAMNEXT: STX MODE ; 0x05C0 $862B 0 -> MODE (XAM mode).
LDA XAML ; 0x05C2 $A524
CMP L ; 0x05C4 $C528 Compare 'examine index' to hex data.
LDA XAMH ; 0x05C6 $A525
SBC H ; 0x05C8 $E529
BCS TONEXTITEM ; 0x05CA $B080 Not less, so no more data to output.
INC XAML ; 0x05CC $E624
BNE MOD8CHK ; 0x05CE $D002 Increment 'examine index'.
INC XAMH ; 0x05D0 $E625
MOD8CHK:
LDA XAML ; 0x05D2 $A524 Check low-order 'examine index' byte
AND #$07 ; 0x05D4 $2907 For MOD 8 = 0
BPL NXTPRNT ; 0x05D6 $10__ Always taken.
PRBYTE:
PHA ; 0x05D8 $48 Save A for LSD.
LSR ; 0x05D9 $4A
LSR ; 0x05DA $4A
LSR ; 0x05DB $4A MSD to LSD position.
LSR ; 0x05DC $4A
JSR PRHEX ; 0x05DD $20E105 Output hex digit.
PLA ; 0x05E0 $68 Restore A.
PRHEX:
AND #$0F ; 0x05E1 $290F Mask LSD for hex print.
ORA #$30 ; 0x05E3 $0930 Add "0".
CMP #$3A ; 0x05E5 $C93A Digit?
BCC ECHO ; 0x05E7 $9002 Yes, output it.
ADC #$06 ; 0x05E9 $6906 Add offset for letter.
ECHO:
PHA ; 0x05EB $48 Save A.
PHP ; 0x05EC $08 Save Status
CLC ; 0x05ED $18 CLear Carry status flag
JSR console_put_char ; 0x05EE $20DEFE Output character.
PLP ; 0x05F1 $28 Restore Status
PLA ; 0x05F2 $48 Restore A.
RTS ; 0x05F3 $60 Return.
.ascii "CX16 WOZMON!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment