-
-
Save zarutian/7074f12ea3ed5a44ee2c58e8fcf6d7ae to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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