diff options
Diffstat (limited to '')
-rw-r--r-- | sw/z80/drivers/build/ctc.asm (renamed from sw/z80_tests/usart/build/ctc.asm) | 0 | ||||
-rw-r--r-- | sw/z80/drivers/build/ctc.lst (renamed from sw/z80_tests/usart/build/ctc.lst) | 0 | ||||
-rw-r--r-- | sw/z80/drivers/build/ctc.rel (renamed from sw/z80_tests/usart/build/ctc.rel) | 0 | ||||
-rw-r--r-- | sw/z80/drivers/build/ctc.sym (renamed from sw/z80_tests/usart/build/ctc.sym) | 0 | ||||
-rw-r--r-- | sw/z80/drivers/build/pio.asm (renamed from sw/z80_tests/usart/build/pio.asm) | 40 | ||||
-rw-r--r-- | sw/z80/drivers/build/pio.lst | 234 | ||||
-rw-r--r-- | sw/z80/drivers/build/pio.rel (renamed from sw/z80_tests/usart/build/pio.rel) | 18 | ||||
-rw-r--r-- | sw/z80/drivers/build/pio.sym (renamed from sw/z80_tests/usart/build/pio.sym) | 5 | ||||
-rw-r--r-- | sw/z80/drivers/build/usart.asm (renamed from sw/z80_tests/usart/build/usart.asm) | 29 | ||||
-rw-r--r-- | sw/z80/drivers/build/usart.lst (renamed from sw/z80_tests/usart/build/usart.lst) | 85 | ||||
-rw-r--r-- | sw/z80/drivers/build/usart.rel (renamed from sw/z80_tests/usart/build/usart.rel) | 26 | ||||
-rw-r--r-- | sw/z80/drivers/build/usart.sym (renamed from sw/z80_tests/usart/build/usart.sym) | 2 | ||||
-rw-r--r-- | sw/z80/drivers/ctc.c (renamed from sw/z80/kernel/drivers/ctc.c) | 2 | ||||
-rw-r--r-- | sw/z80/drivers/include/ctc.h (renamed from sw/z80/kernel/include/drivers/ctc.h) | 0 | ||||
-rw-r--r-- | sw/z80/drivers/include/pio.h (renamed from sw/z80/kernel/include/drivers/pio.h) | 7 | ||||
-rw-r--r-- | sw/z80/drivers/include/usart.h (renamed from sw/z80/kernel/include/drivers/usart.h) | 9 | ||||
-rw-r--r-- | sw/z80/drivers/makefile | 22 | ||||
-rw-r--r-- | sw/z80/drivers/pio.c (renamed from sw/z80/kernel/drivers/pio.c) | 14 | ||||
-rw-r--r-- | sw/z80/drivers/usart.c (renamed from sw/z80/kernel/drivers/usart.c) | 2 |
19 files changed, 410 insertions, 85 deletions
diff --git a/sw/z80_tests/usart/build/ctc.asm b/sw/z80/drivers/build/ctc.asm index 838756a..838756a 100644 --- a/sw/z80_tests/usart/build/ctc.asm +++ b/sw/z80/drivers/build/ctc.asm diff --git a/sw/z80_tests/usart/build/ctc.lst b/sw/z80/drivers/build/ctc.lst index e758d8a..e758d8a 100644 --- a/sw/z80_tests/usart/build/ctc.lst +++ b/sw/z80/drivers/build/ctc.lst diff --git a/sw/z80_tests/usart/build/ctc.rel b/sw/z80/drivers/build/ctc.rel index 50a8b42..50a8b42 100644 --- a/sw/z80_tests/usart/build/ctc.rel +++ b/sw/z80/drivers/build/ctc.rel diff --git a/sw/z80_tests/usart/build/ctc.sym b/sw/z80/drivers/build/ctc.sym index 82ca00e..82ca00e 100644 --- a/sw/z80_tests/usart/build/ctc.sym +++ b/sw/z80/drivers/build/ctc.sym diff --git a/sw/z80_tests/usart/build/pio.asm b/sw/z80/drivers/build/pio.asm index ee1fcc6..3045492 100644 --- a/sw/z80_tests/usart/build/pio.asm +++ b/sw/z80/drivers/build/pio.asm @@ -13,6 +13,8 @@ .globl _pio_set_mode .globl _pio_set_interrupts .globl _pio_set_interrupts_mask + .globl _pio_read + .globl _pio_write ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- @@ -185,6 +187,44 @@ _pio_set_interrupts_mask:: ld (hl),c ;pio.c:39: _pio_control(port, mask); ret +;pio.c:42: uint8_t pio_read(int port) +; --------------------------------- +; Function pio_read +; --------------------------------- +_pio_read:: +;pio.c:44: return *(pio_port + port); + ld hl,#2 + add hl,sp + ld iy,#_pio_port + ld a,0 (iy) + add a, (hl) + ld c,a + ld a,1 (iy) + inc hl + adc a, (hl) + ld b,a + ld a,(bc) + ld l,a + ret +;pio.c:47: void pio_write(int port, uint8_t data) +; --------------------------------- +; Function pio_write +; --------------------------------- +_pio_write:: +;pio.c:49: _pio_data(port, data); + ld hl, #4+0 + add hl, sp + ld c, (hl) + pop de + pop hl + push hl + push de +;pio.c:8: *(pio_port + port) = data; + ld de,(_pio_port) + add hl,de + ld (hl),c +;pio.c:49: _pio_data(port, data); + ret .area _CODE .area _INITIALIZER __xinit__pio_port: diff --git a/sw/z80/drivers/build/pio.lst b/sw/z80/drivers/build/pio.lst new file mode 100644 index 0000000..0b83616 --- /dev/null +++ b/sw/z80/drivers/build/pio.lst @@ -0,0 +1,234 @@ + 1 ;-------------------------------------------------------- + 2 ; File Created by SDCC : free open source ANSI-C Compiler + 3 ; Version 3.6.0 #9615 (Linux) + 4 ;-------------------------------------------------------- + 5 .module pio + 6 .optsdcc -mz80 + 7 + 8 ;-------------------------------------------------------- + 9 ; Public variables in this module + 10 ;-------------------------------------------------------- + 11 .globl __pio_data + 12 .globl __pio_control + 13 .globl _pio_set_mode + 14 .globl _pio_set_interrupts + 15 .globl _pio_set_interrupts_mask + 16 .globl _pio_read + 17 .globl _pio_write + 18 ;-------------------------------------------------------- + 19 ; special function registers + 20 ;-------------------------------------------------------- + 21 ;-------------------------------------------------------- + 22 ; ram data + 23 ;-------------------------------------------------------- + 24 .area _DATA + 25 ;-------------------------------------------------------- + 26 ; ram data + 27 ;-------------------------------------------------------- + 28 .area _INITIALIZED + 0000 29 _pio_port: + 0000 30 .ds 2 + 0002 31 _pio_ctrl: + 0002 32 .ds 2 + 33 ;-------------------------------------------------------- + 34 ; absolute external ram data + 35 ;-------------------------------------------------------- + 36 .area _DABS (ABS) + 37 ;-------------------------------------------------------- + 38 ; global & static initialisations + 39 ;-------------------------------------------------------- + 40 .area _HOME + 41 .area _GSINIT + 42 .area _GSFINAL + 43 .area _GSINIT + 44 ;-------------------------------------------------------- + 45 ; Home + 46 ;-------------------------------------------------------- + 47 .area _HOME + 48 .area _HOME + 49 ;-------------------------------------------------------- + 50 ; code + 51 ;-------------------------------------------------------- + 52 .area _CODE + 53 ;pio.c:6: inline void _pio_data(int port, uint8_t data) + 54 ; --------------------------------- + 55 ; Function _pio_data + 56 ; --------------------------------- + 0000 57 __pio_data:: + 58 ;pio.c:8: *(pio_port + port) = data; + 0000 21 02 00 [10] 59 ld hl,#2 + 0003 39 [11] 60 add hl,sp + 0004 FD 21r00r00 [14] 61 ld iy,#_pio_port + 0008 FD 7E 00 [19] 62 ld a,0 (iy) + 000B 86 [ 7] 63 add a, (hl) + 000C 4F [ 4] 64 ld c,a + 000D FD 7E 01 [19] 65 ld a,1 (iy) + 0010 23 [ 6] 66 inc hl + 0011 8E [ 7] 67 adc a, (hl) + 0012 47 [ 4] 68 ld b,a + 0013 21 04 00 [10] 69 ld hl, #4+0 + 0016 39 [11] 70 add hl, sp + 0017 7E [ 7] 71 ld a, (hl) + 0018 02 [ 7] 72 ld (bc),a + 0019 C9 [10] 73 ret + 74 ;pio.c:11: inline void _pio_control(int port, uint8_t cmd) + 75 ; --------------------------------- + 76 ; Function _pio_control + 77 ; --------------------------------- + 001A 78 __pio_control:: + 79 ;pio.c:13: *(pio_ctrl + port) = cmd; + 001A 21 02 00 [10] 80 ld hl,#2 + 001D 39 [11] 81 add hl,sp + 001E FD 21r02r00 [14] 82 ld iy,#_pio_ctrl + 0022 FD 7E 00 [19] 83 ld a,0 (iy) + 0025 86 [ 7] 84 add a, (hl) + 0026 4F [ 4] 85 ld c,a + 0027 FD 7E 01 [19] 86 ld a,1 (iy) + 002A 23 [ 6] 87 inc hl + 002B 8E [ 7] 88 adc a, (hl) + 002C 47 [ 4] 89 ld b,a + 002D 21 04 00 [10] 90 ld hl, #4+0 + 0030 39 [11] 91 add hl, sp + 0031 7E [ 7] 92 ld a, (hl) + 0032 02 [ 7] 93 ld (bc),a + 0033 C9 [10] 94 ret + 95 ;pio.c:16: void pio_set_mode(int port, int mode, uint8_t io) + 96 ; --------------------------------- + 97 ; Function pio_set_mode + 98 ; --------------------------------- + 0034 99 _pio_set_mode:: + 100 ;pio.c:19: _pio_control(port, ((mode << 6) | 0x0F)); + 0034 21 04 00 [10] 101 ld hl, #4+0 + 0037 39 [11] 102 add hl, sp + 0038 7E [ 7] 103 ld a, (hl) + 0039 0F [ 4] 104 rrca + 003A 0F [ 4] 105 rrca + 003B E6 C0 [ 7] 106 and a,#0xc0 + 003D F6 0F [ 7] 107 or a, #0x0f + 003F 4F [ 4] 108 ld c,a + 0040 D1 [10] 109 pop de + 0041 E1 [10] 110 pop hl + 0042 E5 [11] 111 push hl + 0043 D5 [11] 112 push de + 113 ;pio.c:13: *(pio_ctrl + port) = cmd; + 0044 FD 2Ar02r00 [20] 114 ld iy,(_pio_ctrl) + 0048 5D [ 4] 115 ld e, l + 0049 54 [ 4] 116 ld d, h + 004A FD 19 [15] 117 add iy, de + 004C FD 71 00 [19] 118 ld 0 (iy), c + 119 ;pio.c:23: if (mode == PIO_MODE_BIT_IO) { + 004F FD 21 04 00 [14] 120 ld iy,#4 + 0053 FD 39 [15] 121 add iy,sp + 0055 FD 7E 00 [19] 122 ld a,0 (iy) + 0058 D6 03 [ 7] 123 sub a, #0x03 + 005A C0 [11] 124 ret NZ + 005B FD 7E 01 [19] 125 ld a,1 (iy) + 005E B7 [ 4] 126 or a, a + 005F C0 [11] 127 ret NZ + 128 ;pio.c:24: _pio_control(port, io); + 0060 FD 21 06 00 [14] 129 ld iy,#6 + 0064 FD 39 [15] 130 add iy,sp + 0066 FD 4E 00 [19] 131 ld c,0 (iy) + 132 ;pio.c:13: *(pio_ctrl + port) = cmd; + 0069 ED 5Br02r00 [20] 133 ld de,(_pio_ctrl) + 006D 19 [11] 134 add hl,de + 006E 71 [ 7] 135 ld (hl),c + 136 ;pio.c:24: _pio_control(port, io); + 006F C9 [10] 137 ret + 138 ;pio.c:28: void pio_set_interrupts(int port, int control) + 139 ; --------------------------------- + 140 ; Function pio_set_interrupts + 141 ; --------------------------------- + 0070 142 _pio_set_interrupts:: + 143 ;pio.c:31: _pio_control(port, (control | 0x07)); + 0070 21 04 00 [10] 144 ld hl, #4+0 + 0073 39 [11] 145 add hl, sp + 0074 7E [ 7] 146 ld a, (hl) + 0075 F6 07 [ 7] 147 or a, #0x07 + 0077 4F [ 4] 148 ld c,a + 0078 D1 [10] 149 pop de + 0079 E1 [10] 150 pop hl + 007A E5 [11] 151 push hl + 007B D5 [11] 152 push de + 153 ;pio.c:13: *(pio_ctrl + port) = cmd; + 007C ED 5Br02r00 [20] 154 ld de,(_pio_ctrl) + 0080 19 [11] 155 add hl,de + 0081 71 [ 7] 156 ld (hl),c + 157 ;pio.c:31: _pio_control(port, (control | 0x07)); + 0082 C9 [10] 158 ret + 159 ;pio.c:34: void pio_set_interrupts_mask(int port, int control, uint8_t mask) + 160 ; --------------------------------- + 161 ; Function pio_set_interrupts_mask + 162 ; --------------------------------- + 0083 163 _pio_set_interrupts_mask:: + 164 ;pio.c:38: _pio_control(port, (control | 0x17)); + 0083 21 04 00 [10] 165 ld hl, #4+0 + 0086 39 [11] 166 add hl, sp + 0087 7E [ 7] 167 ld a, (hl) + 0088 F6 17 [ 7] 168 or a, #0x17 + 008A 4F [ 4] 169 ld c,a + 008B D1 [10] 170 pop de + 008C E1 [10] 171 pop hl + 008D E5 [11] 172 push hl + 008E D5 [11] 173 push de + 174 ;pio.c:13: *(pio_ctrl + port) = cmd; + 008F FD 2Ar02r00 [20] 175 ld iy,(_pio_ctrl) + 0093 5D [ 4] 176 ld e, l + 0094 54 [ 4] 177 ld d, h + 0095 FD 19 [15] 178 add iy, de + 0097 FD 71 00 [19] 179 ld 0 (iy), c + 180 ;pio.c:39: _pio_control(port, mask); + 009A FD 21 06 00 [14] 181 ld iy,#6 + 009E FD 39 [15] 182 add iy,sp + 00A0 FD 4E 00 [19] 183 ld c,0 (iy) + 184 ;pio.c:13: *(pio_ctrl + port) = cmd; + 00A3 ED 5Br02r00 [20] 185 ld de,(_pio_ctrl) + 00A7 19 [11] 186 add hl,de + 00A8 71 [ 7] 187 ld (hl),c + 188 ;pio.c:39: _pio_control(port, mask); + 00A9 C9 [10] 189 ret + 190 ;pio.c:42: uint8_t pio_read(int port) + 191 ; --------------------------------- + 192 ; Function pio_read + 193 ; --------------------------------- + 00AA 194 _pio_read:: + 195 ;pio.c:44: return *(pio_port + port); + 00AA 21 02 00 [10] 196 ld hl,#2 + 00AD 39 [11] 197 add hl,sp + 00AE FD 21r00r00 [14] 198 ld iy,#_pio_port + 00B2 FD 7E 00 [19] 199 ld a,0 (iy) + 00B5 86 [ 7] 200 add a, (hl) + 00B6 4F [ 4] 201 ld c,a + 00B7 FD 7E 01 [19] 202 ld a,1 (iy) + 00BA 23 [ 6] 203 inc hl + 00BB 8E [ 7] 204 adc a, (hl) + 00BC 47 [ 4] 205 ld b,a + 00BD 0A [ 7] 206 ld a,(bc) + 00BE 6F [ 4] 207 ld l,a + 00BF C9 [10] 208 ret + 209 ;pio.c:47: void pio_write(int port, uint8_t data) + 210 ; --------------------------------- + 211 ; Function pio_write + 212 ; --------------------------------- + 00C0 213 _pio_write:: + 214 ;pio.c:49: _pio_data(port, data); + 00C0 21 04 00 [10] 215 ld hl, #4+0 + 00C3 39 [11] 216 add hl, sp + 00C4 4E [ 7] 217 ld c, (hl) + 00C5 D1 [10] 218 pop de + 00C6 E1 [10] 219 pop hl + 00C7 E5 [11] 220 push hl + 00C8 D5 [11] 221 push de + 222 ;pio.c:8: *(pio_port + port) = data; + 00C9 ED 5Br00r00 [20] 223 ld de,(_pio_port) + 00CD 19 [11] 224 add hl,de + 00CE 71 [ 7] 225 ld (hl),c + 226 ;pio.c:49: _pio_data(port, data); + 00CF C9 [10] 227 ret + 228 .area _CODE + 229 .area _INITIALIZER + 0000 230 __xinit__pio_port: + 0000 00 42 231 .dw #0x4200 + 0002 232 __xinit__pio_ctrl: + 0002 02 42 233 .dw #0x4202 + 234 .area _CABS (ABS) diff --git a/sw/z80_tests/usart/build/pio.rel b/sw/z80/drivers/build/pio.rel index 90210a9..d9b1ac3 100644 --- a/sw/z80_tests/usart/build/pio.rel +++ b/sw/z80/drivers/build/pio.rel @@ -1,13 +1,15 @@ XL2 -H 9 areas 6 global symbols +H 9 areas 8 global symbols M pio O -mz80 S .__.ABS. Def0000 -A _CODE size AA flags 0 addr 0 +A _CODE size D0 flags 0 addr 0 S _pio_set_interrupts Def0070 S _pio_set_mode Def0034 S _pio_set_interrupts_mask Def0083 +S _pio_read Def00AA S __pio_control Def001A +S _pio_write Def00C0 S __pio_data Def0000 A _DATA size 0 flags 0 addr 0 A _INITIALIZED size 4 flags 0 addr 0 @@ -63,6 +65,18 @@ T 91 00 02 00 5D 54 FD 19 FD 71 00 FD 21 06 00 FD R 00 00 00 00 00 02 02 00 T 9F 00 39 FD 4E 00 ED 5B 02 00 19 71 C9 R 00 00 00 00 00 08 02 00 +T AA 00 +R 00 00 00 00 +T AA 00 21 02 00 39 FD 21 00 00 FD 7E 00 86 4F FD +R 00 00 00 00 00 08 02 00 +T B8 00 7E 01 23 8E 47 0A 6F C9 +R 00 00 00 00 +T C0 00 +R 00 00 00 00 +T C0 00 21 04 00 39 4E D1 E1 E5 D5 ED 5B 00 00 19 +R 00 00 00 00 00 0D 02 00 +T CE 00 71 C9 +R 00 00 00 00 T 00 00 R 00 00 07 00 T 00 00 00 42 diff --git a/sw/z80_tests/usart/build/pio.sym b/sw/z80/drivers/build/pio.sym index 3cf582f..52f787c 100644 --- a/sw/z80_tests/usart/build/pio.sym +++ b/sw/z80/drivers/build/pio.sym @@ -13,17 +13,18 @@ Symbol Table 7 __xinit__pio_port 0000 R 2 _pio_ctrl 0002 R 2 _pio_port 0000 R + 0 _pio_read 00AA GR 0 _pio_set_interrupts 0070 GR 0 _pio_set_interrupts_mask 0083 GR 0 _pio_set_mode 0034 GR - + 0 _pio_write 00C0 GR ASxxxx Assembler V02.00 + NoICE + SDCC mods (Zilog Z80 / Hitachi HD64180), page 2. Hexadecimal [16-Bits] Area Table - 0 _CODE size AA flags 0 + 0 _CODE size D0 flags 0 1 _DATA size 0 flags 0 2 _INITIALIZED size 4 flags 0 3 _DABS size 0 flags 8 diff --git a/sw/z80_tests/usart/build/usart.asm b/sw/z80/drivers/build/usart.asm index 58d6fdf..fb65d62 100644 --- a/sw/z80_tests/usart/build/usart.asm +++ b/sw/z80/drivers/build/usart.asm @@ -366,14 +366,14 @@ _usart_read:: ld sp,hl ;usart.c:77: uint8_t *bp = buffer; ld a,4 (ix) - ld -6 (ix),a + ld -4 (ix),a ld a,5 (ix) - ld -5 (ix),a + ld -3 (ix),a ;usart.c:80: while (count--) { ld c,6 (ix) ld b,7 (ix) - ld -4 (ix),#0x00 - ld -3 (ix),#0x00 + ld hl,#0x0000 + ex (sp), hl 00105$: ld e, c ld d, b @@ -384,12 +384,12 @@ _usart_read:: ;usart.c:81: *(bp++) = _usart->buffer; ld hl,(__usart) ld e,(hl) - pop hl - push hl + ld l,-4 (ix) + ld h,-3 (ix) ld (hl),e - inc -6 (ix) + inc -4 (ix) jr NZ,00123$ - inc -5 (ix) + inc -3 (ix) 00123$: ld de,(__usart) ;usart.c:83: if (_usart->LSR.framing_error || _usart->LSR.parity_error) { @@ -414,23 +414,22 @@ _usart_read:: jr Z,00102$ 00101$: ;usart.c:84: bp--; // delete last byte (?) - pop hl - push hl + ld l,-4 (ix) + ld h,-3 (ix) dec hl - ex (sp), hl + ld -4 (ix),l + ld -3 (ix),h jr 00105$ 00102$: ;usart.c:86: read_count++; - inc -4 (ix) + inc -6 (ix) jr NZ,00105$ - inc -3 (ix) + inc -5 (ix) jr 00105$ 00107$: ;usart.c:90: return read_count; - pop bc pop hl push hl - push bc ld sp, ix pop ix ret diff --git a/sw/z80_tests/usart/build/usart.lst b/sw/z80/drivers/build/usart.lst index 7706cff..65365fe 100644 --- a/sw/z80_tests/usart/build/usart.lst +++ b/sw/z80/drivers/build/usart.lst @@ -366,30 +366,30 @@ 01A4 F9 [ 6] 366 ld sp,hl 367 ;usart.c:77: uint8_t *bp = buffer; 01A5 DD 7E 04 [19] 368 ld a,4 (ix) - 01A8 DD 77 FA [19] 369 ld -6 (ix),a + 01A8 DD 77 FC [19] 369 ld -4 (ix),a 01AB DD 7E 05 [19] 370 ld a,5 (ix) - 01AE DD 77 FB [19] 371 ld -5 (ix),a + 01AE DD 77 FD [19] 371 ld -3 (ix),a 372 ;usart.c:80: while (count--) { 01B1 DD 4E 06 [19] 373 ld c,6 (ix) 01B4 DD 46 07 [19] 374 ld b,7 (ix) - 01B7 DD 36 FC 00 [19] 375 ld -4 (ix),#0x00 - 01BB DD 36 FD 00 [19] 376 ld -3 (ix),#0x00 - 01BF 377 00105$: - 01BF 59 [ 4] 378 ld e, c - 01C0 50 [ 4] 379 ld d, b - 01C1 0B [ 6] 380 dec bc - 01C2 7A [ 4] 381 ld a,d - 01C3 B3 [ 4] 382 or a,e - 01C4 28 48 [12] 383 jr Z,00107$ + 01B7 21 00 00 [10] 375 ld hl,#0x0000 + 01BA E3 [19] 376 ex (sp), hl + 01BB 377 00105$: + 01BB 59 [ 4] 378 ld e, c + 01BC 50 [ 4] 379 ld d, b + 01BD 0B [ 6] 380 dec bc + 01BE 7A [ 4] 381 ld a,d + 01BF B3 [ 4] 382 or a,e + 01C0 28 55 [12] 383 jr Z,00107$ 384 ;usart.c:81: *(bp++) = _usart->buffer; - 01C6 2Ar00r00 [16] 385 ld hl,(__usart) - 01C9 5E [ 7] 386 ld e,(hl) - 01CA E1 [10] 387 pop hl - 01CB E5 [11] 388 push hl + 01C2 2Ar00r00 [16] 385 ld hl,(__usart) + 01C5 5E [ 7] 386 ld e,(hl) + 01C6 DD 6E FC [19] 387 ld l,-4 (ix) + 01C9 DD 66 FD [19] 388 ld h,-3 (ix) 01CC 73 [ 7] 389 ld (hl),e - 01CD DD 34 FA [23] 390 inc -6 (ix) + 01CD DD 34 FC [23] 390 inc -4 (ix) 01D0 20 03 [12] 391 jr NZ,00123$ - 01D2 DD 34 FB [23] 392 inc -5 (ix) + 01D2 DD 34 FD [23] 392 inc -3 (ix) 01D5 393 00123$: 01D5 ED 5Br00r00 [20] 394 ld de,(__usart) 395 ;usart.c:83: if (_usart->LSR.framing_error || _usart->LSR.parity_error) { @@ -411,31 +411,30 @@ 01F8 0F [ 4] 411 rrca 01F9 0F [ 4] 412 rrca 01FA E6 01 [ 7] 413 and a,#0x01 - 01FC 28 06 [12] 414 jr Z,00102$ + 01FC 28 0F [12] 414 jr Z,00102$ 01FE 415 00101$: 416 ;usart.c:84: bp--; // delete last byte (?) - 01FE E1 [10] 417 pop hl - 01FF E5 [11] 418 push hl - 0200 2B [ 6] 419 dec hl - 0201 E3 [19] 420 ex (sp), hl - 0202 18 BB [12] 421 jr 00105$ - 0204 422 00102$: - 423 ;usart.c:86: read_count++; - 0204 DD 34 FC [23] 424 inc -4 (ix) - 0207 20 B6 [12] 425 jr NZ,00105$ - 0209 DD 34 FD [23] 426 inc -3 (ix) - 020C 18 B1 [12] 427 jr 00105$ - 020E 428 00107$: - 429 ;usart.c:90: return read_count; - 020E C1 [10] 430 pop bc - 020F E1 [10] 431 pop hl - 0210 E5 [11] 432 push hl - 0211 C5 [11] 433 push bc - 0212 DD F9 [10] 434 ld sp, ix - 0214 DD E1 [14] 435 pop ix - 0216 C9 [10] 436 ret - 437 .area _CODE - 438 .area _INITIALIZER - 0000 439 __xinit___usart: - 0000 00 40 440 .dw #0x4000 - 441 .area _CABS (ABS) + 01FE DD 6E FC [19] 417 ld l,-4 (ix) + 0201 DD 66 FD [19] 418 ld h,-3 (ix) + 0204 2B [ 6] 419 dec hl + 0205 DD 75 FC [19] 420 ld -4 (ix),l + 0208 DD 74 FD [19] 421 ld -3 (ix),h + 020B 18 AE [12] 422 jr 00105$ + 020D 423 00102$: + 424 ;usart.c:86: read_count++; + 020D DD 34 FA [23] 425 inc -6 (ix) + 0210 20 A9 [12] 426 jr NZ,00105$ + 0212 DD 34 FB [23] 427 inc -5 (ix) + 0215 18 A4 [12] 428 jr 00105$ + 0217 429 00107$: + 430 ;usart.c:90: return read_count; + 0217 E1 [10] 431 pop hl + 0218 E5 [11] 432 push hl + 0219 DD F9 [10] 433 ld sp, ix + 021B DD E1 [14] 434 pop ix + 021D C9 [10] 435 ret + 436 .area _CODE + 437 .area _INITIALIZER + 0000 438 __xinit___usart: + 0000 00 40 439 .dw #0x4000 + 440 .area _CABS (ABS) diff --git a/sw/z80_tests/usart/build/usart.rel b/sw/z80/drivers/build/usart.rel index 480c037..29ad600 100644 --- a/sw/z80_tests/usart/build/usart.rel +++ b/sw/z80/drivers/build/usart.rel @@ -3,7 +3,7 @@ H 9 areas B global symbols M usart O -mz80 S .__.ABS. Def0000 -A _CODE size 217 flags 0 addr 0 +A _CODE size 21E flags 0 addr 0 S _usart_read Def0198 S _usart_set_autoflow Def00CE S _usart_word_length Def00B5 @@ -146,15 +146,15 @@ T 98 01 R 00 00 00 00 T 98 01 DD E5 DD 21 00 00 DD 39 21 FA FF 39 F9 DD R 00 00 00 00 -T A6 01 7E 04 DD 77 FA DD 7E 05 DD 77 FB DD 4E 06 +T A6 01 7E 04 DD 77 FC DD 7E 05 DD 77 FD DD 4E 06 R 00 00 00 00 -T B4 01 DD 46 07 DD 36 FC 00 DD 36 FD 00 +T B4 01 DD 46 07 21 00 00 E3 R 00 00 00 00 -T BF 01 +T BB 01 R 00 00 00 00 -T BF 01 59 50 0B 7A B3 28 48 2A 00 00 5E E1 E5 73 +T BB 01 59 50 0B 7A B3 28 55 2A 00 00 5E DD 6E FC R 00 00 00 00 00 0A 02 00 -T CD 01 DD 34 FA 20 03 DD 34 FB +T C9 01 DD 66 FD 73 DD 34 FC 20 03 DD 34 FD R 00 00 00 00 T D5 01 R 00 00 00 00 @@ -162,19 +162,21 @@ T D5 01 ED 5B 00 00 21 0D 00 19 DD 75 FE DD 74 FF R 00 00 00 00 00 04 02 00 T E3 01 DD 6E FE DD 66 FF 7E 0F 0F 0F E6 01 20 0D R 00 00 00 00 -T F1 01 DD 6E FE DD 66 FF 7E 0F 0F E6 01 28 06 +T F1 01 DD 6E FE DD 66 FF 7E 0F 0F E6 01 28 0F R 00 00 00 00 T FE 01 R 00 00 00 00 -T FE 01 E1 E5 2B E3 18 BB +T FE 01 DD 6E FC DD 66 FD 2B DD 75 FC DD 74 FD 18 R 00 00 00 00 -T 04 02 +T 0C 02 AE R 00 00 00 00 -T 04 02 DD 34 FC 20 B6 DD 34 FD 18 B1 +T 0D 02 R 00 00 00 00 -T 0E 02 +T 0D 02 DD 34 FA 20 A9 DD 34 FB 18 A4 R 00 00 00 00 -T 0E 02 C1 E1 E5 C5 DD F9 DD E1 C9 +T 17 02 +R 00 00 00 00 +T 17 02 E1 E5 DD F9 DD E1 C9 R 00 00 00 00 T 00 00 R 00 00 07 00 diff --git a/sw/z80_tests/usart/build/usart.sym b/sw/z80/drivers/build/usart.sym index a6e3c38..71004e3 100644 --- a/sw/z80_tests/usart/build/usart.sym +++ b/sw/z80/drivers/build/usart.sym @@ -26,7 +26,7 @@ Hexadecimal [16-Bits] Area Table - 0 _CODE size 217 flags 0 + 0 _CODE size 21E flags 0 1 _DATA size 0 flags 0 2 _INITIALIZED size 2 flags 0 3 _DABS size 0 flags 8 diff --git a/sw/z80/kernel/drivers/ctc.c b/sw/z80/drivers/ctc.c index 841202a..5ac4254 100644 --- a/sw/z80/kernel/drivers/ctc.c +++ b/sw/z80/drivers/ctc.c @@ -1,4 +1,4 @@ -#include "drivers/ctc.h" +#include "ctc.h" void ctc_control() { diff --git a/sw/z80/kernel/include/drivers/ctc.h b/sw/z80/drivers/include/ctc.h index 80e8b4b..80e8b4b 100644 --- a/sw/z80/kernel/include/drivers/ctc.h +++ b/sw/z80/drivers/include/ctc.h diff --git a/sw/z80/kernel/include/drivers/pio.h b/sw/z80/drivers/include/pio.h index 0df2ed0..e91029c 100644 --- a/sw/z80/kernel/include/drivers/pio.h +++ b/sw/z80/drivers/include/pio.h @@ -1,8 +1,8 @@ #ifndef __PIO_H__ #define __PIO_H__ -#include "devices.h" -#include "types.h" +#include "addresses.h" +#include <stdint.h> #define PIO_A 0 #define PIO_B 1 @@ -20,6 +20,7 @@ inline void _pio_data(int port, uint8_t data); inline void _pio_control(int port, uint8_t cmd); +/* the last argument is needed only for IO mode */ void pio_set_mode(int port, int mode, uint8_t io); void pio_set_interrupts(int port, int control); @@ -34,4 +35,4 @@ inline void pio_write_pin(int port, uint8_t pin); // TODO: implement mode (in/out/both) and interrupt vector -#endif // __PIO_H__ +#endif /* __PIO_H__ */ diff --git a/sw/z80/kernel/include/drivers/usart.h b/sw/z80/drivers/include/usart.h index b85ee3e..bb06aab 100644 --- a/sw/z80/kernel/include/drivers/usart.h +++ b/sw/z80/drivers/include/usart.h @@ -1,10 +1,10 @@ #ifndef __USART_H__ #define __USART_H__ -#include "types.h" -#include "devices.h" +#include "addresses.h" -#include "string.h" +#include <stdint.h> +#include <string.h> // baudrate clock divisors // values from TL16C550C datasheet (table 9 for 1.8432 MHz crystal) @@ -48,6 +48,9 @@ #define USART_AUTOFLOW_CTS 2 #define USART_AUTOFLOW_OFF 0 +typedef unsigned int uint; +typedef uint8_t register_t; + /* stuctures for usart registers */ struct IER { diff --git a/sw/z80/drivers/makefile b/sw/z80/drivers/makefile new file mode 100644 index 0000000..5d6d8ee --- /dev/null +++ b/sw/z80/drivers/makefile @@ -0,0 +1,22 @@ +# Drivers library + +LIB := build/drivers.a +SOURCES := $(wildcard *.c) +OBJECTS := $(patsubst %.c,build/%.rel,$(SOURCES)) + +CC := sdcc +AR := sdar +CFLAGS := -mz80 -Iinclude -I../arch -DDEBUG + +.PHONY: dirs clean +$(LIB): $(OBJECTS) + $(AR) rcs $@ $(OBJECTS) + +$(OBJECTS): build/%.rel: %.c $(SOURCES) dirs + $(CC) $(CFLAGS) -c $< -o $@ + +dirs: + mkdir -p build + +clean: + - rm -rd build/* diff --git a/sw/z80/kernel/drivers/pio.c b/sw/z80/drivers/pio.c index 4321fb8..bdbe1c3 100644 --- a/sw/z80/kernel/drivers/pio.c +++ b/sw/z80/drivers/pio.c @@ -1,4 +1,4 @@ -#include "drivers/pio.h" +#include "pio.h" static uint8_t *pio_port = (uint8_t *) ADDR_DEV_PIO; static uint8_t *pio_ctrl = (uint8_t *) (ADDR_DEV_PIO + 2); @@ -34,7 +34,17 @@ void pio_set_interrupts(int port, int control) void pio_set_interrupts_mask(int port, int control, uint8_t mask) { // 0x17 is a control sequence to set interrupts - // and to interpret the next byte as a mask + // AND interpret the next byte as a bitmask _pio_control(port, (control | 0x17)); _pio_control(port, mask); } + +uint8_t pio_read(int port) +{ + return *(pio_port + port); +} + +void pio_write(int port, uint8_t data) +{ + _pio_data(port, data); +} diff --git a/sw/z80/kernel/drivers/usart.c b/sw/z80/drivers/usart.c index c54fe37..9ec6dbd 100644 --- a/sw/z80/kernel/drivers/usart.c +++ b/sw/z80/drivers/usart.c @@ -1,4 +1,4 @@ -#include "drivers/usart.h" +#include "usart.h" static struct _usart_device *_usart = (struct _usart_device *) ADDR_DEV_USART; |