Mercurial > hg > Members > kono > nitros9-code
comparison bootman/llio_6551.a @ 2163:2db06bc0742a
Start of BootMan
author | boisy |
---|---|
date | Tue, 20 May 2008 14:43:00 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2162:755b1b8ea019 | 2163:2db06bc0742a |
---|---|
1 NAM llio_coco3 | |
2 TTL CoCo 3 low-level I/O handler | |
3 | |
4 PSECT llio_coco3,0,0,0,0,llio | |
5 | |
6 VSECT | |
7 ENDSECT | |
8 | |
9 llio: | |
10 lbsr llinit | |
11 lbsr llread | |
12 lbsr llwrite | |
13 lbsr llterm | |
14 | |
15 ********** I/O ROUTINES ********** | |
16 | |
17 * 6551 Parameters | |
18 ADDR EQU $FF68 | |
19 | |
20 A_RXD EQU ADDR+$00 | |
21 A_TXD EQU ADDR+$00 | |
22 A_STATUS EQU ADDR+$01 | |
23 A_RESET EQU ADDR+$01 | |
24 A_CMD EQU ADDR+$02 | |
25 A_CTRL EQU ADDR+$03 | |
26 | |
27 * Baud rates | |
28 _B2400 EQU $1A 2400 bps, 8-N-1 | |
29 _B4800 EQU $1C 4800 bps, 8-N-1 | |
30 _B9600 EQU $1E 9600 bps, 8-N-1 | |
31 _B19200 EQU $1F 19200 bps, 8-N-1 | |
32 | |
33 BAUD EQU _B9600 | |
34 | |
35 * ll_init - Initialize the low-level I/O | |
36 * Exit: Carry = 0: Init success; Carry = 1; Init failed | |
37 llinit | |
38 sta A_RESET soft reset (value not important) | |
39 * Set specific modes and functions: | |
40 * - no parity, no echo, no Tx interrupt | |
41 * - no Rx interrupt, enable Tx/Rx | |
42 lda #$0B | |
43 sta A_CMD save to command register | |
44 lda #BAUD | |
45 sta A_CTRL select proper baud rate | |
46 * Read any junk rx byte that may be in the register | |
47 lda A_RXD | |
48 rts | |
49 | |
50 | |
51 * llread - Read one character from 6551 | |
52 * | |
53 * Entry: None | |
54 * Exit: A = character that was read | |
55 * | |
56 * Note, this routine currently doesn't timeout | |
57 llread | |
58 r lda A_STATUS get status byte | |
59 anda #$08 mask rx buffer status flag | |
60 beq r loop if rx buffer empty | |
61 lda A_RXD get byte from ACIA data port | |
62 rts | |
63 | |
64 * llwrite - Write one character to 6551 | |
65 * | |
66 * Entry: A = character to write | |
67 * Exit: None | |
68 llwrite | |
69 pshs a save byte to write | |
70 w lda A_STATUS get status byte | |
71 anda #$10 mask tx buffer status flag | |
72 beq w loop if tx buffer full | |
73 puls a get byte | |
74 sta A_TXD save to ACIA data port | |
75 rts | |
76 | |
77 | |
78 llterm | |
79 rts | |
80 | |
81 IFNE 0 | |
82 * llwout - Write an entire string | |
83 * llwerr - Write an entire string | |
84 llwerr | |
85 llwout | |
86 pshs a | |
87 l@ lda ,x+ | |
88 cmpa #C$CR | |
89 beq e@ | |
90 leay -1,y | |
91 beq f@ | |
92 bsr Write | |
93 bra l@ | |
94 e@ bsr Write | |
95 lda #C$LF | |
96 bsr Write | |
97 f@ ldx <buffptr | |
98 clrb | |
99 puls a,pc | |
100 | |
101 * ReadLine - Read an entire string, up to CR | |
102 * Entry: X = address to place string being read (CR terminated) | |
103 * Y = maximum number of bytes to read (including nul byte) | |
104 ReadLine | |
105 ldx <buffptr | |
106 pshs y,x,a | |
107 ldy #80 | |
108 l@ bsr Read read 1 character | |
109 cmpa #C$CR carriage return? | |
110 beq e@ branch if so... | |
111 cmpa #$08 backspace? | |
112 beq bs@ | |
113 cmpy #$0000 anymore room? | |
114 beq l@ | |
115 leay -1,y back up one char | |
116 sta ,x+ and save in input buffer | |
117 m@ bsr Write echo back out | |
118 bra l@ | |
119 e@ sta ,x | |
120 bsr Write | |
121 lda #C$LF | |
122 bsr Write | |
123 clrb | |
124 puls a,x,y,pc | |
125 bs@ cmpx 1,s are we at start | |
126 beq l@ if so, do nothing | |
127 clr ,-x else erase last byte | |
128 lbsr Write write backspace | |
129 lda #C$SPAC a space... | |
130 lbsr Write write it | |
131 leay 1,y count back up free char | |
132 lda #$08 another backspace | |
133 bra m@ | |
134 ENDC | |
135 | |
136 endsect |