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