1;
2;       z88dk RS232 Function
3;
4;       Amstrad CPC (CPC Booster+) version
5;
6;       unsigned char rs232_params(unsigned char param, unsigned char parity)
7;
8;       Specify the serial interface parameters
9;
10;       $Id: rs232_params.asm,v 1.3 2016-06-23 20:15:37 dom Exp $
11
12		SECTION  code_clib
13                PUBLIC   rs232_params
14                PUBLIC   _rs232_params
15
16rs232_params:
17_rs232_params:
18                pop  bc		;Stackpointer
19                pop  hl		;Parity
20                pop  de		;Stopbits / Baudrate
21                push de
22                push hl
23                push bc
24
25; CPC Booster+ - settings
26;
27; Params: &FF07
28; Parity: 	Bit 6,5	- bit 6 -> parity enabled
29;		0	0	disabled
30;		1	0	even parity
31;		1	1	odd parity
32;
33; Stopbits:	Bit 4
34;		0		1 stop bit
35;		1		2 stop bits
36;
37; Data bit settings:	Bit 3, 2, 1
38;		0	0	0	5 Bit
39;		0	0	1	6 Bit
40;		0	1	0	7 Bit
41;		0	1	1	8 Bit
42;
43; Baudrate: &FF04
44		;handle parity
45		xor a
46		or l					;no parity (0x00)?
47		jr z, parityset
48
49		ld a, l
50		cp $20					;parity odd
51		jr nz, noodd
52
53		ld a, $30				;UPM1=1, UPM0=1
54		jr parityset
55
56.noodd		cp $60					;parity even
57		jr nz, noeven
58
59		ld a, $20				;UPM1=1, UPM0=0
60		jr parityset
61
62.noeven		ld hl, 1				;RS_ERR_NOT_INITIALIZED
63		ret
64
65.parityset
66                ; handle bits number
67                push af
68
69                ld   a,$60              ; mask bit numbers flags (just inverted and shiftet for the Booster+)
70                and  e
71
72		xor  $60				;invert bytes
73		rra
74		rra
75		rra
76		rra						;and shift them
77
78                ld   c,a
79                pop  af
80                or   c                  ; set bit number bits
81                                        ; we support 8 to five bit modes !!
82
83                ; handle stop bits
84                bit  7,e
85                jr   z,stop1
86                or $08				;two stop bits, set USBS=1 (Bit 4)
87stop1:
88                ld   bc,$ff07
89                out  (c),a			;set USART (parity, bits number, stop bits)
90
91
92                ; baud rate
93                ld   a,$0f			;only use lower nibble
94                and  e
95                sub   $09			;at least 4800 baud (prepare a for table offset 0x00)
96                jr   nc,avail		;>= 4800 baud
97                ld   hl,3			;RS_ERR_BAUD_NOT_AVAIL
98                ret
99avail:
100                ld   e,a
101                ld   d,0
102
103                ld   hl,tabell		;table value = hl  (table adress) + de (baudrate setting)
104                add  hl,de
105                ld   a,(hl)
106
107		ld bc, $ff04
108		out (c),a
109
110                ld   hl,0			;RS_ERR_OK
111                ret
112
113		SECTION rodata_clib
114;Baudrates for CPC Booster+ (U2X=0 -> UBRR=((11059200/Baudrate)/16)-1)
115tabell:		defb 143		;  4800 bps
116		defb 71			;  9600 bps
117		defb 35			; 19200 bps
118		defb 17			; 38400 bps
119		defb 11			; 57600 bps
120		defb 5			;115200 bps
121		defb 2			;230400 bps
122