diff fake_cpm.sz8 @ 820:cf6149b7c6e5

Implement a tiny bit of CPM BDOS and add a corresponding Z80 core driver so that simple CPM programs like ZEXDOC/ZEXALL can be run against my Z80 core
author Michael Pavone <pavone@retrodev.com>
date Wed, 29 Jul 2015 00:05:21 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fake_cpm.sz8	Wed Jul 29 00:05:21 2015 -0700
@@ -0,0 +1,105 @@
+CONSOLE_PORT equ 0
+STATUS_PORT  equ 1
+EXIT_PORT    equ 2
+	org $E400
+	jp handle_call
+	ld a, (should_exit)
+	dec a
+	jr z, do_exit
+	ld a, 1
+	ld (should_exit), a
+	jp $100
+do_exit:
+no_impl
+	out (EXIT_PORT), a
+should_exit:
+	dc.b 0
+	
+console_in:
+	in a, (CONSOLE_PORT)
+	ld l, a
+	ret
+console_out:
+	ld a, e
+	out (CONSOLE_PORT), a
+	ret
+get_iobyte:
+	ld a, (3)
+	ld l, a
+	ret
+set_iobyte:
+	ld a, e
+	ld (3), a
+	ret
+write_string:
+	ld c, '$'
+	jp .start
+.continue
+	out (CONSOLE_PORT), a
+	inc de
+.start
+	ld a, (de)
+	cp c
+	jr nz, .continue
+	;flush output
+	out (STATUS_PORT),a 
+	ret
+read_string:
+	ld a, (de)
+	ld c, a
+	ld b, $A ;newline
+	inc c
+	inc de
+	push de
+	inc de
+	jp .start
+.continue
+	in a, (CONSOLE_PORT)
+	cp b
+	jr z, .end
+	ld (de), a
+	inc de
+.start
+	dec c
+	jr nz, .continue
+	;todo: consume excess characters
+.end
+	pop hl
+	ex de, hl
+	sbc hl, de
+	ld a, l
+	ld (de), a
+	ret
+
+console_status:
+	in a, (STATUS_PORT)
+	ld l, a
+	ret
+
+handle_call:
+	ld a, c
+	or a
+	jr z, do_exit
+	dec a
+	jr z, console_in
+	dec a
+	jr z, console_out
+	dec a
+	jr z, no_impl ;aux reader input
+	dec a
+	jr z, no_impl ;aux punch output
+	dec a
+	jr z, no_impl ;printer output
+	dec a
+	jr z, no_impl ;direct console IO
+	dec a
+	jr z, get_iobyte
+	dec a
+	jr z, set_iobyte
+	dec a
+	jr z, write_string
+	dec a
+	jr z, read_string
+	dec a
+	jr z, console_status
+	jp no_impl
\ No newline at end of file