6bb454232a
Also, come up with a way to make parts play well together memory-wise.
82 lines
1.6 KiB
NASM
82 lines
1.6 KiB
NASM
; shell
|
|
;
|
|
; Runs a shell over an asynchronous communication interface adapter (ACIA).
|
|
; for now, this unit is tightly coupled to acia.asm, but it will eventually be
|
|
; more general than that.
|
|
|
|
; Incomplete. For now, this outputs a welcome prompt and then waits for input.
|
|
; Whenever input is CR or LF, we echo back what we've received and empty the
|
|
; input buffer. This also happen when the buffer is full.
|
|
|
|
; *** CONSTS ***
|
|
CR .equ 0x0d
|
|
LF .equ 0x0a
|
|
|
|
shellInit:
|
|
; print prompt
|
|
ld hl, d_welcome
|
|
call printstr
|
|
call printcrlf
|
|
ret
|
|
|
|
shellLoop:
|
|
call chkbuf
|
|
jr shellLoop
|
|
|
|
; print null-terminated string pointed to by HL
|
|
printstr:
|
|
ld a, (hl) ; load character to send
|
|
or a ; is it zero?
|
|
ret z ; if yes, we're finished
|
|
call aciaPutC
|
|
inc hl
|
|
jr printstr
|
|
; no ret because our only way out is ret z above
|
|
|
|
printcrlf:
|
|
ld a, CR
|
|
call aciaPutC
|
|
ld a, LF
|
|
call aciaPutC
|
|
ret
|
|
|
|
|
|
; check if the input buffer is full or ends in CR or LF. If it does, prints it
|
|
; back and empty it.
|
|
chkbuf:
|
|
call aciaBufPtr
|
|
cp 0
|
|
ret z ; BUFIDX is zero? nothing to check.
|
|
|
|
cp ACIA_BUFSIZE
|
|
jr z, .do ; if BUFIDX == BUFSIZE? do!
|
|
|
|
; our previous char is in BUFIDX - 1. Fetch this
|
|
dec hl
|
|
ld a, (hl) ; now, that's our char we have in A
|
|
inc hl ; put HL back where it was
|
|
|
|
cp CR
|
|
jr z, .do ; char is CR? do!
|
|
cp LF
|
|
jr z, .do ; char is LF? do!
|
|
|
|
; nothing matched? don't do anything
|
|
ret
|
|
|
|
.do:
|
|
; terminate our string with 0
|
|
xor a
|
|
ld (hl), a
|
|
; reset buffer index
|
|
ld (ACIA_BUFIDX), a
|
|
|
|
; alright, let's go!
|
|
ld hl, ACIA_BUF
|
|
call printstr
|
|
call printcrlf
|
|
ret
|
|
|
|
; *** DATA ***
|
|
d_welcome: .byte "Welcome to Collapse OS", 0
|