RESET CLD Clear decimal arithmetic mode CLI LDY #%0111.1111 Mask for DSP data direction reg STY DSP (DDR mode is assumed after reset) LDA #%1010.0111 KBD and DSP control register mask STA KBDCR Enable interrupts, set CA1, CB1 for STA DSPCR positive edge sense/output mode. NOTCR CMP #BS Backspace key? BEQ BACKSPACE Yes CMP #ESC ESC? BEQ ESCAPE Yes INY Advance text index BPL NEXTCHAR Auto ESC if line longer than 127 ESCAPE LDA #PROMPT Print prompt character JSR ECHO Output it. GETLINE LDA #CR Send CR JSR ECHO LDY #0+1 Start a new input line BACKSPACE DEY Backup text index BMI GETLINE Oops, line's empty, reinitialize NEXTCHAR LDA KBDCR Wait for key press BPL NEXTCHAR No key yet! LDA KBD Load character. B7 should be '1' STA IN,Y Add to text buffer JSR ECHO Display character CMP #CR BNE NOTCR It's not CR! LDY #-1 Reset text index LDA #0 Default mode is XAM TAX X=0 SETSTOR ASL Leaves $7B if setting STOR mode SETMODE STA MODE Set mode flags BLSKIP INY Advance text index NEXTITEM LDA IN,Y Get character CMP #CR BEQ GETLINE We're done if it's CR! CMP #"." BCC BLSKIP Ignore everything below "."! BEQ SETMODE Set BLOCK XAM mode ("." = $AE) CMP #":" BEQ SETSTOR Set STOR mode! $BA will become $7B CMP #"R" BEQ RUN Run the program! Forget the rest STX L Clear input value (X=0) STX H STY YSAV Save Y for comparison NEXTHEX LDA IN,Y Get character for hex test EOR #$B0 Map digits to 0-9 CMP #9+1 Is it a decimal digit? BCC DIG Yes! ADC #$88 Map letter "A"-"F" to $FA-FF CMP #$FA Hex letter? BCC NOTHEX No! Character not hex DIG ASL ASL Hex digit to MSD of A ASL ASL LDX #4 Shift count HEXSHIFT ASL Hex digit left, MSB to carry ROL L Rotate into LSD ROL H Rotate into MSD's DEX Done 4 shifts? BNE HEXSHIFT No, loop INY Advance text index BNE NEXTHEX Always taken NOTHEX CPY YSAV Was at least 1 hex digit given? BEQ ESCAPE No! Ignore all, start from scratch BIT MODE Test MODE byte BVC NOTSTOR B6=0 is STOR, 1 is XAM or BLOCK XAM LDA L LSD's of hex data STA (STL,X) Store current 'store index'(X=0) INC STL Increment store index. BNE NEXTITEM No carry! INC STH Add carry to 'store index' high TONEXTITEM JMP NEXTITEM Get next command item. RUN JMP (XAML) Run user's program NOTSTOR BMI XAMNEXT B7 = 0 for XAM, 1 for BLOCK XAM LDX #2 Copy 2 bytes SETADR LDA L-1,X Copy hex data to STA STL-1,X 'store index' STA XAML-1,X and to 'XAM index' DEX Next of 2 bytes BNE SETADR Loop unless X = 0 NXTPRNT BNE PRDATA NE means no address to print LDA #CR Print CR first JSR ECHO LDA XAMH Output high-order byte of address JSR PRBYTE LDA XAML Output low-order byte of address JSR PRBYTE LDA #":" Print colon JSR ECHO PRDATA LDA #" " Print space JSR ECHO LDA (XAML,X) Get data from address (X=0) JSR PRBYTE Output it in hex format XAMNEXT STX MODE 0 -> MODE (XAM mode). LDA XAML See if there's more to print CMP L LDA XAMH SBC H BCS TONEXTITEM Not less! No more data to output INC XAML Increment 'examine index' BNE MOD8CHK No carry! INC XAMH MOD8CHK LDA XAML If address MOD 8 = 0 start new line AND #%0000.0111 BPL NXTPRNT Always taken. PRBYTE PHA Save A for LSD LSR LSR LSR MSD to LSD position LSR JSR PRHEX Output hex digit PLA Restore A PRHEX AND #%0000.1111 Mask LSD for hex print ORA #"0" Add "0" CMP #"9"+1 Is it a decimal digit? BCC ECHO Yes! output it ADC #6 Add offset for letter A-F ECHO BIT DSP DA bit (B7) cleared yet? BMI ECHO No! Wait for display ready STA DSP Output character. Sets DA RTS .DA $0000 Unused, what a pity NMI_VEC .DA $0F00 NMI vector RESET_VEC .DA RESET RESET vector IRQ_VEC .DA $0000 IRQ vector