comparison 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
comparison
equal deleted inserted replaced
819:ab017fb09e77 820:cf6149b7c6e5
1 CONSOLE_PORT equ 0
2 STATUS_PORT equ 1
3 EXIT_PORT equ 2
4 org $E400
5 jp handle_call
6 ld a, (should_exit)
7 dec a
8 jr z, do_exit
9 ld a, 1
10 ld (should_exit), a
11 jp $100
12 do_exit:
13 no_impl
14 out (EXIT_PORT), a
15 should_exit:
16 dc.b 0
17
18 console_in:
19 in a, (CONSOLE_PORT)
20 ld l, a
21 ret
22 console_out:
23 ld a, e
24 out (CONSOLE_PORT), a
25 ret
26 get_iobyte:
27 ld a, (3)
28 ld l, a
29 ret
30 set_iobyte:
31 ld a, e
32 ld (3), a
33 ret
34 write_string:
35 ld c, '$'
36 jp .start
37 .continue
38 out (CONSOLE_PORT), a
39 inc de
40 .start
41 ld a, (de)
42 cp c
43 jr nz, .continue
44 ;flush output
45 out (STATUS_PORT),a
46 ret
47 read_string:
48 ld a, (de)
49 ld c, a
50 ld b, $A ;newline
51 inc c
52 inc de
53 push de
54 inc de
55 jp .start
56 .continue
57 in a, (CONSOLE_PORT)
58 cp b
59 jr z, .end
60 ld (de), a
61 inc de
62 .start
63 dec c
64 jr nz, .continue
65 ;todo: consume excess characters
66 .end
67 pop hl
68 ex de, hl
69 sbc hl, de
70 ld a, l
71 ld (de), a
72 ret
73
74 console_status:
75 in a, (STATUS_PORT)
76 ld l, a
77 ret
78
79 handle_call:
80 ld a, c
81 or a
82 jr z, do_exit
83 dec a
84 jr z, console_in
85 dec a
86 jr z, console_out
87 dec a
88 jr z, no_impl ;aux reader input
89 dec a
90 jr z, no_impl ;aux punch output
91 dec a
92 jr z, no_impl ;printer output
93 dec a
94 jr z, no_impl ;direct console IO
95 dec a
96 jr z, get_iobyte
97 dec a
98 jr z, set_iobyte
99 dec a
100 jr z, write_string
101 dec a
102 jr z, read_string
103 dec a
104 jr z, console_status
105 jp no_impl