summary refs log tree commit diff
path: root/wozmon.s
diff options
context:
space:
mode:
Diffstat (limited to 'wozmon.s')
-rw-r--r--wozmon.s208
1 files changed, 208 insertions, 0 deletions
diff --git a/wozmon.s b/wozmon.s
new file mode 100644
index 0000000..4fd7d10
--- /dev/null
+++ b/wozmon.s
@@ -0,0 +1,208 @@
+ACIA_DATA	= $5000
+ACIA_STATUS	= $5001
+ACIA_CMD	= $5002
+ACIA_CTRL	= $5003
+
+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		= $0200			; Input buffer
+
+RESET:
+                CLD                     ; Clear decimal arithmetic mode.
+                CLI
+                LDA     #<CHRIN
+                STA     $FFFE
+                LDA     #>CHRIN
+                STA     $FFFF
+                LDA     #$1F            ; 8-N-1, 19200 bps
+                STA     ACIA_CTRL
+                LDY     #$8B            ; No parity, no echo, no interrupts.
+                STY     ACIA_CMD
+
+NOTCR:
+                CMP     #$08            ; Backspace key?
+                BEQ     BACKSPACE       ; Yes.
+                CMP     #$1B            ; ESC?
+                BEQ     ESCAPE          ; Yes.
+                INY                     ; Advance text index.
+                BPL     NEXTCHAR        ; Auto ESC if line longer than 127.
+
+ESCAPE:
+                LDA     #$5C            ; "\".
+                JSR     ECHO            ; Output it.
+
+GETLINE:
+                LDA     #$0D            ; Send CR
+                JSR     ECHO
+                LDA     #$0A            ; Send LF
+                JSR     ECHO
+
+                LDY     #$01            ; Initialize text index.
+BACKSPACE:      DEY                     ; Back up text index.
+                BMI     GETLINE         ; Beyond start of line, reinitialize.
+
+NEXTCHAR:
+                LDA     ACIA_STATUS     ; Check status.
+                AND     #$08            ; Key ready?
+                BEQ     NEXTCHAR        ; Loop until ready.
+                LDA     ACIA_DATA       ; Load character. B7 will be '0'.
+                STA     IN,Y            ; Add to text buffer.
+                JSR     ECHO            ; Display character.
+                CMP     #$0D            ; CR?
+                BNE     NOTCR           ; No.
+
+                LDY     #$FF            ; Reset text index.
+                LDA     #$00            ; For XAM mode.
+                TAX                     ; X=0.
+SETBLOCK:
+                ASL
+SETSTOR:
+                ASL                     ; Leaves $7B if setting STOR mode.
+SETMODE:
+                STA     MODE            ; $00 = XAM, $74 = STOR, $B8 = BLOK XAM.
+BLSKIP:
+                INY                     ; Advance text index.
+NEXTITEM:
+                LDA     IN,Y            ; Get character.
+                CMP     #$0D            ; CR?
+                BEQ     GETLINE         ; Yes, done this line.
+                CMP     #$2E            ; "."?
+                BCC     BLSKIP          ; Skip delimiter.
+                BEQ     SETBLOCK        ; Set BLOCK XAM mode.
+                CMP     #$3A            ; ":"?
+                BEQ     SETSTOR         ; Yes, set STOR mode.
+                CMP     #$52            ; "R"?
+                BEQ     RUNPROG         ; Yes, run user program.
+                STX     L               ; $00 -> L.
+                STX     H               ;    and H.
+                STY     YSAV            ; Save Y for comparison
+
+NEXTHEX:
+                LDA     IN,Y            ; Get character for hex test.
+                EOR     #$30            ; Map digits to $0-9.
+                CMP     #$0A            ; 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     #$04            ; 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. Check next character for hex.
+
+NOTHEX:
+                CPY     YSAV            ; Check if L, H empty (no hex digits).
+                BEQ     ESCAPE          ; Yes, generate ESC sequence.
+
+                BIT     MODE            ; Test MODE byte.
+                BVC     NOTSTOR         ; B6=0 is STOR, 1 is XAM and BLOCK XAM.
+
+                LDA     L               ; LSD's of hex data.
+                STA     (STL,X)         ; Store current 'store index'.
+                INC     STL             ; Increment store index.
+                BNE     NEXTITEM        ; Get next item (no carry).
+                INC     STH             ; Add carry to 'store index' high order.
+TONEXTITEM:     JMP     NEXTITEM        ; Get next command item.
+
+RUNPROG:
+                JMP     (XAML)          ; Run at current XAM index.
+
+NOTSTOR:
+                BMI     XAMNEXT         ; B7 = 0 for XAM, 1 for BLOCK XAM.
+
+                LDX     #$02            ; Byte count.
+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     #$0D            ; CR.
+                JSR     ECHO            ; Output it.
+                LDA     #$0A            ; LF.
+                JSR     ECHO            ; Output it.
+                LDA     XAMH            ; 'Examine index' high-order byte.
+                JSR     PRBYTE          ; Output it in hex format.
+                LDA     XAML            ; Low-order 'examine index' byte.
+                JSR     PRBYTE          ; Output it in hex format.
+                LDA     #$3A            ; ":".
+                JSR     ECHO            ; Output it.
+
+PRDATA:
+                LDA     #$20            ; Blank.
+                JSR     ECHO            ; Output it.
+                LDA     (XAML,X)        ; Get data byte at 'examine index'.
+                JSR     PRBYTE          ; Output it in hex format.
+XAMNEXT:        STX     MODE            ; 0 -> MODE (XAM mode).
+                LDA     XAML
+                CMP     L               ; Compare 'examine index' to hex data.
+                LDA     XAMH
+                SBC     H
+                BCS     TONEXTITEM      ; Not less, so no more data to output.
+
+                INC     XAML
+                BNE     MOD8CHK         ; Increment 'examine index'.
+                INC     XAMH
+
+MOD8CHK:
+                LDA     XAML            ; Check low-order 'examine index' byte
+                AND     #$07            ; For MOD 8 = 0
+                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     #$0F            ; Mask LSD for hex print.
+                ORA     #$30            ; Add "0".
+                CMP     #$3A            ; Digit?
+                BCC     ECHO            ; Yes, output it.
+                ADC     #$06            ; Add offset for letter.
+
+ECHO:
+                STA     ACIA_DATA       ; Output character.
+                PHA                     ; Save A.
+;                 LDA     #$FF            ; Initialize delay loop.
+; TXDELAY:        DEC                     ; Decrement A.
+;                 BNE     TXDELAY         ; Until A gets to 0.
+                PLA                     ; Restore A.
+                RTS                     ; Return.
+
+CHRIN:
+                RTI
+
+CHROUT:
+                pha
+                sta     ACIA_DATA
+;                 lda     #$FF
+; .txdelay:       dec
+;                 bne    .txdelay
+                pla
+                rts
+