From 8b240f0f90cd11f49947cf335a1e366bbe84b3f1 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Tue, 14 Nov 2017 11:46:31 +0100 Subject: Improvements in PIO driver, pio test rewritten in inline asm --- sw/z80/arch/include/addresses.h | 4 +- sw/z80/drivers/include/pio.h | 11 +- sw/z80/drivers/include/usart.h | 4 +- sw/z80/drivers/pio.c | 33 +++--- sw/z80/tests/pio/dis.txt | 225 ---------------------------------------- sw/z80/tests/pio/main.c | 48 +++++++-- sw/z80/tests/pio/makefile | 2 +- 7 files changed, 68 insertions(+), 259 deletions(-) delete mode 100644 sw/z80/tests/pio/dis.txt (limited to 'sw') diff --git a/sw/z80/arch/include/addresses.h b/sw/z80/arch/include/addresses.h index 07ab473..ec5eb96 100644 --- a/sw/z80/arch/include/addresses.h +++ b/sw/z80/arch/include/addresses.h @@ -4,9 +4,9 @@ #define ADDR_DEV_ROM_L 0x0000 #define ADDR_DEV_ROM_H 0x2000 -#define ADDR_DEV_USART 0x4000 +#define ADDR_DEV_PIO 0x0010 #define ADDR_DEV_CTC 0x4100 -#define ADDR_DEV_PIO 0x4200 +#define ADDR_DEV_USART 0x4200 #define ADDR_DEV_MMU diff --git a/sw/z80/drivers/include/pio.h b/sw/z80/drivers/include/pio.h index a1137e4..e234b05 100644 --- a/sw/z80/drivers/include/pio.h +++ b/sw/z80/drivers/include/pio.h @@ -4,6 +4,9 @@ #include "addresses.h" #include +// DEBUG +#define PIO_ASM_INTERFACE + // ports #define PIO_A 0 #define PIO_B 1 @@ -12,10 +15,10 @@ #define PIO_REG_DATA 0 #define PIO_REG_CTRL 2 -// #define PIO_REG_DATA_A (PIO_A + PIO_REG_PORT) -// #define PIO_REG_DATA_B 1 (PIO_B + PIO_REG_PORT) -// #define PIO_REG_CTRL_A 2 (PIO_A + PIO_REG_CTRL) -// #define PIO_REG_CTRL_B 3 (PIO_B + PIO_REG_CTRL) +#define PIO_REG_DATA_A (PIO_A | PIO_REG_PORT) +#define PIO_REG_DATA_B 1 (PIO_B | PIO_REG_PORT) +#define PIO_REG_CTRL_A 2 (PIO_A | PIO_REG_CTRL) +#define PIO_REG_CTRL_B 3 (PIO_B | PIO_REG_CTRL) #define PIO_MODE_BYTE_OUT 0 // mode 0 #define PIO_MODE_BYTE_IN 1 // mode 1 diff --git a/sw/z80/drivers/include/usart.h b/sw/z80/drivers/include/usart.h index fdc01e2..05aeb4a 100644 --- a/sw/z80/drivers/include/usart.h +++ b/sw/z80/drivers/include/usart.h @@ -6,7 +6,7 @@ #include #include -// baudrate clock divisors +// baudrate clock divisors // values from TL16C550C datasheet (table 9 for 1.8432 MHz crystal) #define USART_BAUDRATE_50 2304 #define USART_BAUDRATE_75 1536 @@ -125,7 +125,7 @@ struct MSR volatile uint data_carrier_detect :1; }; -/* this structure is only for internal usage */ +/* this structure is only for internal use */ struct _usart_device { register_t buffer; // also used as LSB for divisor latch diff --git a/sw/z80/drivers/pio.c b/sw/z80/drivers/pio.c index 272e191..f396e43 100644 --- a/sw/z80/drivers/pio.c +++ b/sw/z80/drivers/pio.c @@ -1,33 +1,34 @@ #include "pio.h" #ifdef PIO_ASM_INTERFACE -/* old inline asm implementation */ -inline void _pio_write(uint8_t reg, uint8_t data) +// TODO: set inline +void _pio_write(uint8_t reg, uint8_t data) { __asm - ;; pop function arguments + ;; pop function arguments data in h, reg in a (l) pop hl - ;; store data in A - ld a, h - ld h, #0 + ld a, l ;; add ADDR_DEV_PIO to get the device address - ld bc, #ADDR_DEV_PIO - add hl, bc + add a, #ADDR_DEV_PIO + ld c, a ;; load data - ld (hl), a + out (c), h __endasm; } -inline uint8_t _pio_read(uint8_t reg) __naked +inline uint8_t _pio_read(uint8_t reg) { + // TODO: check "dec sp" __asm ;; pop function argument - pop l - ld h, #0 + dec sp + pop hl + ld a, l ;; add ADDR_DEV_PIO to get the device address - ld bc, #ADDR_DEV_PIO - add hl, bc - ld l, (hl) + add a, #ADDR_DEV_PIO + ld c, a + ;; read data + in l, (c) ret __endasm; } @@ -68,7 +69,7 @@ void pio_set_interrupts_mask(int port, int control, uint8_t mask) { // 0x17 is a control sequence to set interrupts // AND interpret the next byte as a bitmask - _pio_write((PIO_REG_CTRL + port),(control | 0x17)); + _pio_write((PIO_REG_CTRL + port),(control | 0x97)); _pio_write((PIO_REG_CTRL + port), mask); } diff --git a/sw/z80/tests/pio/dis.txt b/sw/z80/tests/pio/dis.txt deleted file mode 100644 index 60bef8e..0000000 --- a/sw/z80/tests/pio/dis.txt +++ /dev/null @@ -1,225 +0,0 @@ -mkdir -p build - -sdcc -mz80 --allow-unsafe-read -I . -I ../../arch/include -I ../../drivers/include -DDEBUG -c main.c -o build/main.rel -sdcc -mz80 --no-std-crt0 build/crt0.rel -L ../../drivers/build -l drivers.a -pedantic build/main.rel -o build/pio_test.hex -makebin -s 8192 -yo 1 build/pio_test.hex build/pio_test.bin -#dz80 -b -n build/pio_test.bin -r2 -a z80 build/pio_test.bin -A \ --c 'afr main 0x200; \ - pd 0x10; \ - s 0x100; \ - pd 10; \ - s 0x200; \ - pd 0xa0' \ - -/ (fcn) fcn.00000000 13 -| fcn.00000000 (); -| ; XREFS: DATA 0x00000202 DATA 0x00000204 DATA 0x00000209 DATA 0x0000020c DATA 0x00000216 DATA 0x00000219 DATA 0x00000220 DATA 0x00000221 -| ; XREFS: DATA 0x00000226 DATA 0x00000256 -\ ,=< 0x00000000 c30001 jp loc.00000100 - | 0x00000003 ff rst 0x38 - | 0x00000004 ff rst 0x38 - | 0x00000005 ff rst 0x38 - | 0x00000006 ff rst 0x38 - | 0x00000007 ff rst 0x38 - | 0x00000008 ff rst 0x38 - | 0x00000009 ff rst 0x38 - | 0x0000000a ff rst 0x38 - | 0x0000000b ff rst 0x38 - | 0x0000000c ff rst 0x38 - | 0x0000000d ff rst 0x38 - | 0x0000000e ff rst 0x38 - | 0x0000000f ff rst 0x38 - | 0x00000010 ff rst 0x38 - | 0x00000011 ff rst 0x38 -|- loc.00000100 10 -| loc.00000100 (); -| ; JMP XREF from 0x00000000 (fcn.00000000) -| ; JMP XREF from 0x00000106 (loc.00000100) -| 0x00000100 31ffff ld sp, 0xffff -| 0x00000103 cd0002 call main -| ,=< 0x00000106 c30901 jp 0x0109 -| | ; JMP XREF from 0x00000106 (loc.00000100) -\ `-> 0x00000109 76 halt - 0x0000010a ff rst 0x38 - 0x0000010b ff rst 0x38 - 0x0000010c ff rst 0x38 - 0x0000010d ff rst 0x38 - 0x0000010e ff rst 0x38 - 0x0000010f ff rst 0x38 -/ (fcn) main 50 -| main (); -| ; CALL XREF from 0x00000103 (loc.00000100) -| ; CALL XREF from 0x00000200 (main) -| 0x00000200 0600 ld b, 0x00 -| 0x00000202 c5 push bc -| 0x00000203 af xor a -| 0x00000204 f5 push af -| 0x00000205 33 inc sp -| 0x00000206 210300 ld hl, 0x0003 -| 0x00000209 e5 push hl -| 0x0000020a 2e00 ld l, 0x00 -| 0x0000020c e5 push hl -| 0x0000020d cd5502 call fcn.00000255 -| 0x00000210 f1 pop af -| 0x00000211 f1 pop af -| 0x00000212 33 inc sp -| 0x00000213 210000 ld hl, 0x0000 -| 0x00000216 e5 push hl -| 0x00000217 2e00 ld l, 0x00 -| 0x00000219 e5 push hl -| 0x0000021a cd8e02 call fcn.0000028e -| 0x0000021d f1 pop af -| 0x0000021e f1 pop af -\ 0x0000021f c1 pop bc -| ; JMP XREF from 0x00000230 (main) -| .-> 0x00000220 c5 push bc -| | 0x00000221 c5 push bc -| | 0x00000222 33 inc sp -| | 0x00000223 210000 ld hl, 0x0000 -| | 0x00000226 e5 push hl -| | 0x00000227 cde002 call fcn.000002e0 -| | 0x0000022a f1 pop af -| | 0x0000022b 33 inc sp -| | 0x0000022c c1 pop bc -| | 0x0000022d 78 ld a, b -| | 0x0000022e 2f cpl -| | 0x0000022f 47 ld b, a -| `=< 0x00000230 18ee jr 0xee - 0x00000232 210200 ld hl, 0x0002 - 0x00000235 39 add hl, sp - 0x00000236 4e ld c, [hl] - 0x00000237 0600 ld b, 0x00 - 0x00000239 210042 ld hl, 0x4200 - 0x0000023c 09 add hl, bc - 0x0000023d fd210300 ld iy, 0x0003 - 0x00000241 fd39 add iy, sp - 0x00000243 fd7e00 ld a, [iy+0x00] - 0x00000246 77 ld [hl], a - 0x00000247 c9 ret - 0x00000248 210200 ld hl, 0x0002 - 0x0000024b 39 add hl, sp - 0x0000024c 4e ld c, [hl] - 0x0000024d 0600 ld b, 0x00 - 0x0000024f 210042 ld hl, 0x4200 - 0x00000252 09 add hl, bc - 0x00000253 6e ld l, [hl] - 0x00000254 c9 ret -/ (fcn) fcn.00000255 8 -| fcn.00000255 (); -| ; CALL XREF from 0x0000020d (main) -| 0x00000255 dde5 push ix -| 0x00000257 dd210000 ld ix, 0x0000 -\ 0x0000025b dd39 add ix, sp - 0x0000025d dd7e06 ld a, [ix+0x06] - 0x00000260 0f rrca - 0x00000261 0f rrca - 0x00000262 e6c0 and 0xc0 - 0x00000264 f60f or 0x0f - 0x00000266 57 ld d, a - 0x00000267 dd5e04 ld e, [ix+0x04] - 0x0000026a 1c inc e - 0x0000026b 1c inc e - 0x0000026c 6b ld l, e - 0x0000026d 2600 ld h, 0x00 - 0x0000026f 010042 ld bc, 0x4200 - 0x00000272 09 add hl, bc - 0x00000273 72 ld [hl], d - 0x00000274 dd7e06 ld a, [ix+0x06] - 0x00000277 d603 sub 0x03 - ,=< 0x00000279 2010 jr nz, 0x10 - | 0x0000027b dd7e07 ld a, [ix+0x07] - | 0x0000027e b7 or a - ,==< 0x0000027f 200a jr nz, 0x0a - || 0x00000281 dd4e08 ld c, [ix+0x08] - || 0x00000284 1600 ld d, 0x00 - || 0x00000286 210042 ld hl, 0x4200 - || 0x00000289 19 add hl, de - || 0x0000028a 71 ld [hl], c - ``-> 0x0000028b dde1 pop ix - 0x0000028d c9 ret -/ (fcn) fcn.0000028e 29 -| fcn.0000028e (); -| ; CALL XREF from 0x0000021a (main) -| 0x0000028e 210400 ld hl, 0x0004 -| 0x00000291 39 add hl, sp -| 0x00000292 7e ld a, [hl] -| 0x00000293 07 rlca -| 0x00000294 07 rlca -| 0x00000295 07 rlca -| 0x00000296 07 rlca -| 0x00000297 e6f0 and 0xf0 -| 0x00000299 f607 or 0x07 -| 0x0000029b 4f ld c, a -| 0x0000029c 210200 ld hl, 0x0002 -| 0x0000029f 39 add hl, sp -| 0x000002a0 5e ld e, [hl] -| 0x000002a1 1c inc e -| 0x000002a2 1c inc e -| 0x000002a3 1600 ld d, 0x00 -| 0x000002a5 210042 ld hl, 0x4200 -| 0x000002a8 19 add hl, de -| 0x000002a9 71 ld [hl], c -\ 0x000002aa c9 ret - 0x000002ab dde5 push ix - 0x000002ad dd210000 ld ix, 0x0000 - 0x000002b1 dd39 add ix, sp - 0x000002b3 dd7e06 ld a, [ix+0x06] - 0x000002b6 f617 or 0x17 - 0x000002b8 57 ld d, a - 0x000002b9 dd5e04 ld e, [ix+0x04] - 0x000002bc 1c inc e - 0x000002bd 1c inc e - 0x000002be 6b ld l, e - 0x000002bf 2600 ld h, 0x00 - 0x000002c1 010042 ld bc, 0x4200 - 0x000002c4 09 add hl, bc - 0x000002c5 72 ld [hl], d - 0x000002c6 dd4e08 ld c, [ix+0x08] - 0x000002c9 1600 ld d, 0x00 - 0x000002cb 210042 ld hl, 0x4200 - 0x000002ce 19 add hl, de - 0x000002cf 71 ld [hl], c - 0x000002d0 dde1 pop ix - 0x000002d2 c9 ret - 0x000002d3 210200 ld hl, 0x0002 - 0x000002d6 39 add hl, sp - 0x000002d7 4e ld c, [hl] - 0x000002d8 0600 ld b, 0x00 - 0x000002da 210042 ld hl, 0x4200 - 0x000002dd 09 add hl, bc - 0x000002de 6e ld l, [hl] - 0x000002df c9 ret -/ (fcn) fcn.000002e0 18 -| fcn.000002e0 (); -| ; CALL XREF from 0x00000227 (main) -| 0x000002e0 210400 ld hl, 0x0004 -| 0x000002e3 39 add hl, sp -| 0x000002e4 4e ld c, [hl] -| 0x000002e5 210200 ld hl, 0x0002 -| 0x000002e8 39 add hl, sp -| 0x000002e9 5e ld e, [hl] -| 0x000002ea 1600 ld d, 0x00 -| 0x000002ec 210042 ld hl, 0x4200 -| 0x000002ef 19 add hl, de -| 0x000002f0 71 ld [hl], c -\ 0x000002f1 c9 ret - 0x000002f2 ff rst 0x38 - 0x000002f3 ff rst 0x38 - 0x000002f4 ff rst 0x38 - 0x000002f5 ff rst 0x38 - 0x000002f6 ff rst 0x38 - 0x000002f7 ff rst 0x38 - 0x000002f8 ff rst 0x38 - 0x000002f9 ff rst 0x38 - 0x000002fa ff rst 0x38 - 0x000002fb ff rst 0x38 - 0x000002fc ff rst 0x38 - 0x000002fd ff rst 0x38 - 0x000002fe ff rst 0x38 - 0x000002ff ff rst 0x38 - 0x00000300 ff rst 0x38 - 0x00000301 ff rst 0x38 - 0x00000302 ff rst 0x38 - -- Change the graph block definition with graph.callblocks, graph.jmpblocks, graph.flagblocks - [0x00000200]> [0x00000200]> q [0x00000200]> q [0x00000200]> q diff --git a/sw/z80/tests/pio/main.c b/sw/z80/tests/pio/main.c index c873e20..3687f50 100644 --- a/sw/z80/tests/pio/main.c +++ b/sw/z80/tests/pio/main.c @@ -1,16 +1,46 @@ -#include "pio.h" +// #include "pio.h" #include +#define PIO_A_DATA 0x10 +#define PIO_A_CMD 0x11 +#define PIO_B_DATA 0x12 +#define PIO_B_CMD 0x13 + void main(void) { - uint8_t i = 0; + __asm + ;; output variable + ld h, #0x00 + + ;; set bit mode + ld a, #0xCF + ;; load cmd addr + ld c, #PIO_B_CMD + out (c), a + ;; set output + ld a, #0x00 + out (c), a + ;; disable interrupts + ld a, #0x0C + out (c), a + ;; load data addr + ld c, #PIO_B_DATA +loop: + out (c), h + ld a, h + cpl + ld h, a + jr loop + __endasm; + + // uint8_t i = 0; - pio_set_mode(PIO_A, PIO_MODE_BIT_IO, 0x00); - pio_set_interrupts(PIO_A, PIO_INT_DISABLE); + // pio_set_mode(PIO_A, PIO_MODE_BIT_IO, 0x00); + // pio_set_interrupts(PIO_A, PIO_INT_DISABLE); - while (1) { - pio_write(PIO_A, i); - i = ~i; - } -} + // while (1) { + // pio_write(PIO_A, i); + // i = ~i; + // } +} \ No newline at end of file diff --git a/sw/z80/tests/pio/makefile b/sw/z80/tests/pio/makefile index f7f97be..1213902 100644 --- a/sw/z80/tests/pio/makefile +++ b/sw/z80/tests/pio/makefile @@ -66,7 +66,7 @@ dis: $(BINARY) s 0x100; \ pd 10; \ s 0x200; \ - pd 0x95' + pd 0x95' | tee build/dis.txt clean: - rm -rd build -- cgit v1.2.1