From 367ab2d5313fc9d5d07a9c7c654772e47a5c3339 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 6 Dec 2013 20:10:27 +0100 Subject: [PATCH 1/6] add SER_ERR_NOT_OPEN status code --- asminc/ser-error.inc | 1 + include/serial.h | 1 + 2 files changed, 2 insertions(+) diff --git a/asminc/ser-error.inc b/asminc/ser-error.inc index f1592876b..ff4e2b448 100644 --- a/asminc/ser-error.inc +++ b/asminc/ser-error.inc @@ -48,6 +48,7 @@ SER_ERR_INIT_FAILED ; Initialization failed SER_ERR_INV_IOCTL ; IOCTL not supported SER_ERR_INSTALLED ; A driver is already installed + SER_ERR_NOT_OPEN ; Driver not open SER_ERR_COUNT ; Special: Number of error codes .endenum diff --git a/include/serial.h b/include/serial.h index f88ab114e..a3099893b 100644 --- a/include/serial.h +++ b/include/serial.h @@ -111,6 +111,7 @@ #define SER_ERR_INIT_FAILED 0x08 /* Initialization failed */ #define SER_ERR_INV_IOCTL 0x09 /* IOCTL not supported */ #define SER_ERR_INSTALLED 0x0A /* A driver is already installed */ +#define SER_ERR_NOT_OPEN 0x0B /* Driver is not open */ /* Struct containing parameters for the serial port */ struct ser_params { From 9124d0f0513358c08f785701e6a6f32e1304666f Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 6 Dec 2013 20:13:55 +0100 Subject: [PATCH 2/6] add SER_BAUD_56_875 --- asminc/ser-kernel.inc | 1 + include/serial.h | 1 + 2 files changed, 2 insertions(+) diff --git a/asminc/ser-kernel.inc b/asminc/ser-kernel.inc index e59501da6..3ddb7f300 100644 --- a/asminc/ser-kernel.inc +++ b/asminc/ser-kernel.inc @@ -96,6 +96,7 @@ SER_BAUD_115200 = $12 SER_BAUD_230400 = $13 SER_BAUD_31250 = $14 SER_BAUD_62500 = $15 +SER_BAUD_56_875 = $16 ; Data bit settings SER_BITS_5 = $00 diff --git a/include/serial.h b/include/serial.h index a3099893b..cecba90c5 100644 --- a/include/serial.h +++ b/include/serial.h @@ -67,6 +67,7 @@ #define SER_BAUD_230400 0x13 #define SER_BAUD_31250 0x14 #define SER_BAUD_62500 0x15 +#define SER_BAUD_56_875 0x16 /* Data bit settings */ #define SER_BITS_5 0x00 From 074136826a504b8941fb8b4673d8514a99a4f7fb Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 6 Dec 2013 20:15:12 +0100 Subject: [PATCH 3/6] add serial driver for Atari, still contains much debug code --- libsrc/atari/libref.s | 4 +- libsrc/atari/ser/atrrdev.s | 980 +++++++++++++++++++++++++++++++++++++ libsrc/atari/ser_libref.s | 28 ++ testcode/lib/ser-test.c | 27 +- 4 files changed, 1036 insertions(+), 3 deletions(-) create mode 100644 libsrc/atari/ser/atrrdev.s create mode 100644 libsrc/atari/ser_libref.s diff --git a/libsrc/atari/libref.s b/libsrc/atari/libref.s index 171bd6de6..8d96ff62d 100644 --- a/libsrc/atari/libref.s +++ b/libsrc/atari/libref.s @@ -2,11 +2,13 @@ ; Oliver Schmidt, 2013-05-31 ; - .export em_libref, joy_libref, tgi_libref + .export em_libref, joy_libref, tgi_libref, ser_libref .import _exit + .import atari_ser_libref em_libref := _exit joy_libref := _exit +ser_libref := atari_ser_libref .ifdef __ATARIXL__ .import CIO_handler tgi_libref := CIO_handler diff --git a/libsrc/atari/ser/atrrdev.s b/libsrc/atari/ser/atrrdev.s new file mode 100644 index 000000000..7dd0df3c0 --- /dev/null +++ b/libsrc/atari/ser/atrrdev.s @@ -0,0 +1,980 @@ +; +; Christian Groessler, Dec-2001 +; converted to driver interface Nov-2013 +; +; RS232 routines using the R: device (currently tested with an 850 only) +; + + .include "zeropage.inc" + .include "ser-kernel.inc" + .include "ser-error.inc" + .include "atari.inc" + +.macro pushall + php + pha + txa + pha + tya + pha +.endmacro +.macro pullall + pla + tay + pla + tax + pla + plp +.endmacro + +.ifdef __ATARIXL__ +.macro print_string text +.endmacro +.else +.macro print_string text + .local @start, @cont + jmp @cont +@start: .byte text, ATEOL +@cont: php + pha + txa + pha + tya + pha + ldx #0 ; channel 0 + lda #<@start + sta ICBAL,x ; address + lda #>@start + sta ICBAH,x + lda #<(@cont - @start) + sta ICBLL,x ; length + lda #>(@cont - @start) + sta ICBLH,x + lda #PUTCHR + sta ICCOM,x + jsr CIOV + pla + tay + pla + tax + pla + plp +.endmacro +.endif + +; ------------------------------------------------------------------------ +; Header. Includes jump table + +.segment "JUMPTABLE" + +; Driver signature + + .byte $73, $65, $72 ; "ser" + .byte SER_API_VERSION ; Serial API version number + +; Library reference + +libref: .addr $0000 + +; Jump table + + .word SER_INSTALL + .word SER_UNINSTALL + .word SER_OPEN + .word SER_CLOSE + .word SER_GET + .word SER_PUT + .word SER_STATUS + .word SER_IOCTL + .word SER_IRQ + + + .rodata + +rdev: .byte "R:", ATEOL, 0 +bauds: .byte 1 ; SER_BAUD_45_5 + .byte 2 ; SER_BAUD_50 + .byte 4 ; SER_BAUD_75 + .byte 5 ; SER_BAUD_110 + .byte 6 ; SER_BAUD_134_5 + .byte 7 ; SER_BAUD_150 + .byte 8 ; SER_BAUD_300 + .byte 9 ; SER_BAUD_600 + .byte 10 ; SER_BAUD_1200 + .byte 11 ; SER_BAUD_1800 + .byte 12 ; SER_BAUD_2400 + .byte 0 ; SER_BAUD_3600 + .byte 13 ; SER_BAUD_4800 + .byte 0 ; SER_BAUD_7200 + .byte 14 ; SER_BAUD_9600 + .byte 0 ; SER_BAUD_19200 + .byte 0 ; SER_BAUD_38400 + .byte 0 ; SER_BAUD_57600 + .byte 0 ; SER_BAUD_115200 + .byte 0 ; SER_BAUD_230400 + .byte 0 ; SER_BAUD_31250 + .byte 0 ; SER_BAUD_62500 + .byte 3 ; SER_BAUD_56_875 +num_bauds = * - bauds +databits: + .byte 48 ; SER_BITS_5 + .byte 32 ; SER_BITS_6 + .byte 16 ; SER_BITS_7 + .byte 0 ; SER_BITS_8 +num_databits = * - databits +parities: + .byte 0 ; SER_PAR_NONE + .byte 4+1 ; SER_PAR_ODD + .byte 2+8 ; SER_PAR_EVEN + ;.byte 0 ; SER_PAR_MARK + ;.byte 0 ; SER_PAR_SPACE +num_parities = * - parities + + .bss + +; receive buffer +RECVBUF_SZ = 256 +recv_buf: .res RECVBUF_SZ + +cm_run: .res 1 ; concurrent mode running? + + .data + +rshand: .word $ffff + +; jump table into main program, initialized from libref +my_newfd: + .byte $4C + .word 0 +my__close: + .byte $4C + .word 0 +my_pushax: + .byte $4C + .word 0 +my_popax: + .byte $4C + .word 0 +my_findfreeiocb: + .byte $4C + .word 0 +my___do_oserror: + .byte $4C + .word 0 +my_fddecusage: + .byte $4C + .word 0 +my_fdtoiocb: + .byte $4C + .word 0 +my___inviocb: + .byte $4C + .word 0 +my_clriocb: + .byte $4C + .word 0 +my_CIOV: + .byte $4C + .word 0 + + .code + +invbaud: + lda #SER_ERR_BAUD_UNAVAIL +openerr: + rts + + +;---------------------------------------------------------------------------- +; SER_OPEN: A pointer to a ser_params structure is passed in ptr1. +; Must return an SER_ERR_xx code in a/x. + +SER_OPEN: + jsr do_open + bne openerr + +; set line parameters + lda rshand + ldx #0 + jsr my_fdtoiocb ; get iocb index into X + bmi openerr ; shouldn't happen + tax + + ; set baud rate, word size, stop bits and ready monitoring + + ; build ICAX1 value + + jsr dump + jsr print_open_txt + jsr print_iocb_txt + jsr dump_iocb_num + jsr nl + + ldy #SER_PARAMS::BAUDRATE + lda (ptr1),y + cmp #num_bauds + bcs invbaud + + tay + lda bauds,y + beq invbaud + sta ICAX1,x + + ldy #SER_PARAMS::DATABITS + lda (ptr1),y + cmp #num_databits + bcs init_err + + tay + lda databits,y + ora ICAX1,x + sta ICAX1,x + + ldy #SER_PARAMS::STOPBITS + lda (ptr1),y + clc + ror a + ror a + ora ICAX1,x + sta ICAX1,x + + jsr dump_aux1 + + lda #36 ; xio 36, baud rate + sta ICCOM,x + lda #0 + ;ICAX2 = 0, monitor nothing + sta ICAX2,x + sta ICBLL,x + sta ICBLH,x + sta ICBAL,x + sta ICBAH,x + jsr my_CIOV + bmi cioerr + + ; check if the handshake setting is valid + ldy #SER_PARAMS::HANDSHAKE + lda (ptr1),y + cmp #SER_HS_HW ; this is all we support + bne init_err + + ; set handshake lines + lda #34 ; xio 34, set cts, dtr etc + sta ICCOM,x + lda #192+48+3 ; DTR on, RTS on, XMT on + sta ICAX1,x + jsr my_CIOV + bmi cioerr + + ; set translation and parity + ldy #SER_PARAMS::PARITY + lda (ptr1),y + cmp #num_parities + bcs init_err + + tay + lda parities,y + ora #32 ; no translation + sta ICAX1,x + + jsr dump_aux1 + + lda #38 ; xio 38, translation and parity + sta ICCOM,x + jsr my_CIOV + bmi cioerr + + lda #rdev + jsr my_newfd + tya + bcs @doopen ; C set: open needed / device not already open + + pha + jsr SER_CLOSE ;** shut down if started @@@TODO check this out!! + pla + +@doopen:tax + pha + jsr my_clriocb + pla + tax + lda #rdev + sta ICBAH,x + lda #OPEN + sta ICCOM,x + + lda #$0D ; mode in+out+concurrent + sta ICAX1,x + lda #0 + sta ICAX2,x + sta ICBLL,x ; zap buf len + sta ICBLH,x + jsr my_CIOV + bmi cioerr + + lda tmp2 ; get fd (from newfd) + sta rshand + ldx #0 + stx rshand+1 + txa + rts + +;---------------------------------------------------------------------------- +; CLOSE: Close the port, disable interrupts and flush the buffer. Called +; without parameters. Must return an error code in a/x. +; + +SER_CLOSE: + pushall + print_string "SER_CLOSE called" + pullall + lda rshand + cmp #$ff + beq @done + + pushall + print_string "SER_CLOSE do work" + pullall + + ldx rshand+1 + ;jsr my_pushax + jsr my__close + ldx #$ff + stx rshand + stx rshand+1 + inx + stx cm_run +@done: lda #SER_ERR_OK + pushall + print_string "SER_CLOSE returns" + pullall + rts + +;---------------------------------------------------------------------------- +; SER_GET: Will fetch a character from the receive buffer and store it into the +; variable pointer to by ptr1. If no data is available, SER_ERR_NO_DATA is +; return. +; + +SER_GET: + ldy rshand + cpy #$ff + bne @work ; work only if initialized + lda #SER_ERR_NOT_OPEN + bne nierr + +@work: lda rshand + ldx #0 + jsr my_fdtoiocb + tax + lda cm_run ; concurrent mode already running? + bne @go + jsr ena_cm ; turn on concurrent mode + +@go: ; check whether there is any input available + + lda #STATIS ; status request, returns bytes pending + sta ICCOM,x + jsr my_CIOV + bmi ser_error + + lda DVSTAT+1 ; get byte count pending + ora DVSTAT+2 + beq @nix_da ; no input waiting... + + ; input is available: get it! + + lda #GETCHR ; get raw bytes + sta ICCOM,x ; in command code + lda #0 + sta ICBLL,x + sta ICBLH,x + sta ICBAL,x + sta ICBAH,x + jsr my_CIOV ; go get it + bmi ser_error + + ldx #0 + sta (ptr1,x) ; return received byte + txa + rts + +@nix_da:lda #SER_ERR_NO_DATA + ldx #0 + rts + +ser_error: + lda #SER_ERR_OVERFLOW ; there is no large selection of serial error codes... :-/ + ldx #0 + rts + +nierr: ldx #0 + rts + +;---------------------------------------------------------------------------- +; SER_PUT: Output character in A. +; Must return an error code in a/x. +; + +SER_PUT: + ldy rshand + cpy #$ff + bne @work ; work only if initialized + lda #SER_ERR_NOT_OPEN + bne nierr + +@work: pha ; char to write + lda rshand + ldx #0 + jsr my_fdtoiocb + tax + + jsr print_put_txt + pla + pha + jsr dump_hex ; dump char to write + jsr print_iocb_txt + jsr dump_iocb_num + jsr nl + + lda cm_run ; concurrent mode already running? + bne @go + jsr ena_cm ; turn on concurrent mode + + ; @@@TODO: check output buffer overflow +@go: lda #PUTCHR ; put raw bytes + sta ICCOM,x ; in command code + lda #0 + sta ICBLL,x + sta ICBLH,x + sta ICBAL,x + sta ICBAH,x + pla ; get the char back + jsr my_CIOV ; go do it + bmi ser_error + lda #0 + tax + rts + +;---------------------------------------------------------------------------- +; SER_STATUS: Return the status in the variable pointed to by ptr1. +; Must return an error code in a/x. +; + +SER_STATUS: + ; fall through to SER_IOCTL + +;---------------------------------------------------------------------------- +; SER_IOCTL: Driver defined entry point. The wrapper will pass a pointer to ioctl +; specific data in ptr1, and the ioctl code in A. +; Must return an error code in a/x. +; + +SER_IOCTL: + lda #SER_ERR_INV_IOCTL + rts + +;---------------------------------------------------------------------------- +; SER_IRQ: Not used on the Atari +; + +SER_IRQ = $0000 + +;---------------------------------------------------------------------------- +; SER_INSTALL routine. Is called after the driver is loaded into memory. If +; possible, check if the hardware is present. +; Must return an SER_ERR_xx code in a/x. + +SER_INSTALL: + + ;print_string "SER_INSTALL with error" + ;brk + ;lda #42 + ;ldx #0 + ;rts + + ; check if R: device is installed + + ldy #0 +search: lda HATABS,y ; get device name + cmp #'R' + beq found + iny + iny + iny + cpy #MAXDEV + bcc search + +; R: device not found, return error + + lda #addr + sta ICBAH,x + lda #len + sta ICBLH,x + lda #PUTCHR + sta ICCOM,x + jsr CIOV +.endmacro + +.macro push_ptr1 + lda ptr1+1 + pha + lda ptr1 + pha +.endmacro + +.macro pull_ptr1 + pla + sta ptr1 + pla + sta ptr1+1 +.endmacro + +.macro push_ptr2und1 + lda ptr2+1 + pha + lda ptr2 + pha + lda ptr1+1 + pha + sta ptr2+1 + tax + lda ptr1 + pha + sta ptr2 +.endmacro + +.macro pull_ptr2und1 + pla + sta ptr1 + pla + sta ptr1+1 + pla + sta ptr2 + pla + sta ptr2+1 +.endmacro + + +nl_txt: .byte ATEOL +nl_txt_len = * - nl_txt + +nl: pushall + print_string2 nl_txt, nl_txt_len + pullall + rts + +iocb_txt: .byte " IOCB number: " +iocb_txt_len = * - iocb_txt + +print_iocb_txt: + pushall + print_string2 iocb_txt, iocb_txt_len + pullall + rts + +open_txt: .byte "OPEN" +open_txt_len = * - open_txt + +print_open_txt: + pushall + print_string2 open_txt, open_txt_len + pullall + rts + + +put_txt: .byte "PUT " +put_txt_len = * - put_txt + +print_put_txt: + pushall + print_string2 put_txt, put_txt_len + pullall + rts + +aux1_txt: .byte "AUX1: " +aux1_txt_len = * - aux1_txt + +dump_aux1: + pushall + print_string2 aux1_txt,aux1_txt_len + tsx + lda $103,x + jsr dump_hex_low + jsr nl + pullall + rts + +dump_iocb_num: + pushall + txa + jsr dump_hex_low + pullall + rts + +dump_hex: + pushall + tsx + lda $103,x + jsr dump_hex_low + pullall + rts + + +; no need to preserve regs +dump_hex_low: + tax + push_ptr1 + + lda #outbuf + sta ptr1+1 + + txa + jsr hex8 + + ldx #0 ; channel 0 + + lda #2 + sta ICBLL,x ; length + lda #0 + sta ICBLH,x + + lda #outbuf + sta ICBAH,x + lda #PUTCHR + sta ICCOM,x + jsr CIOV + + + pull_ptr1 + rts + + +; ldy #SER_PARAMS::BAUDRATE +; lda (ptr1),y + +dump: + pushall + push_ptr2und1 + +.ifndef __ATARIXL__ + tay + lda #outbuf + sta ptr1+1 + + ; ptr1 - pointer to string buffer + ; ptr2 - pointer to rs232 params + tya + jsr hex16 + lda #':' + sta (ptr1),y + iny + lda #' ' + sta (ptr1),y + iny + lda #' ' + sta (ptr1),y + lda ptr1 + clc + adc #3 + sta ptr1 + bcc @f + inc ptr1+1 +@f: + +.repeat 5 + + ldy #0 + lda (ptr2),y + jsr hex8 + lda #' ' + sta (ptr1),y + inc ptr1 + bne *+4 + inc ptr1+1 + inc ptr2 + bne *+4 + inc ptr2+1 + +.endrepeat + + lda #ATEOL + sta (ptr1),y + inc ptr1 + bne *+4 + inc ptr1+1 + + ldx #0 ; channel 0 + + lda ptr1 + sec + sbc #outbuf + sta ICBLH,x + + lda #outbuf + sta ICBAH,x + lda #PUTCHR + sta ICCOM,x + jsr CIOV +.endif + + pull_ptr2und1 + pullall + rts + + +; enable concurrent rs232 mode +; gets iocb index in X +; all registers destroyed + +.proc ena_cm + + lda #40 ; XIO 40, start concurrent IO + sta ICCOM,x + sta cm_run ; indicate concurrent mode is running + lda #0 + sta ICAX1,x + sta ICAX2,x + lda #recv_buf + sta ICBAH,x + lda #RECVBUF_SZ + sta ICBLH,x + lda #$0D ; value from 850 man, p62. must be $0D?, + sta ICAX1,x ; or any non-zero? + jmp my_CIOV + +.endproc ;ena_cm + +;***************************************************************************** +;* Unterprogramm: HEX16 * +;* Aufgabe: 16-bit Binärzahl in String wandeln (hexadezimal) * +;* Übergabe: ptr1 - Zeiger auf 4-byte Zielpuffer * +;* AX - zu wandelnde Zahl (high X, low A) * +;* Zurück: ptr1 - Zeiger hinter Hexstring * +;* Y - 0 * +;* Benutzt: HEX8 * +;* * +;* alle Register zerstört * +;***************************************************************************** + +hex16: + pha + txa + jsr hex8 + pla + ;fall into hex8 + + +;***************************************************************************** +;* Unterprogramm: HEX8 * +;* Aufgabe: 8-bit Binärzahl in String wandeln (hexadezimal) * +;* Übergabe: ptr1 - Zeiger auf 2-byte Zielpuffer * +;* A - zu wandelnde Zahl * +;* Zurück: ptr1 - Zeiger hinter Hexstring * +;* Y - 0 * +;* * +;* alle Register zerstört * +;***************************************************************************** + +hex8: + tax + lsr a + lsr a + lsr a + lsr a + cmp #10 + bcc hex_1 + clc + adc #'A'-10 + bne hex_2 + +hex_1: adc #'0' +hex_2: ldy #0 + sta (ptr1),y + inc ptr1 + bne hex_3 + inc ptr1+1 + +hex_3: txa + and #15 + + cmp #10 + bcc hex_4 + clc + adc #'A'-10 + bne hex_5 +hex_4: adc #'0' +hex_5: ldy #0 + sta (ptr1),y + inc ptr1 + bne hex_6 + inc ptr1+1 +hex_6: rts + +.data + +outbuf: .res 48 diff --git a/libsrc/atari/ser_libref.s b/libsrc/atari/ser_libref.s new file mode 100644 index 000000000..4b5c58508 --- /dev/null +++ b/libsrc/atari/ser_libref.s @@ -0,0 +1,28 @@ + + .include "atari.inc" + + .import _close, pushax, popax + .import findfreeiocb + .import __do_oserror + .import fddecusage + .import fdtoiocb + .import __inviocb + .import clriocb + .import newfd + + .export atari_ser_libref + +.rodata + +atari_ser_libref: + .word newfd + .word _close + .word pushax + .word popax + .word findfreeiocb + .word __do_oserror + .word fddecusage + .word fdtoiocb + .word __inviocb + .word clriocb + .word CIOV diff --git a/testcode/lib/ser-test.c b/testcode/lib/ser-test.c index c929189a3..79a40e545 100644 --- a/testcode/lib/ser-test.c +++ b/testcode/lib/ser-test.c @@ -17,14 +17,19 @@ #define DRIVERNAME "a2e.ssc.ser" #elif defined(__APPLE2__) #define DRIVERNAME "a2.ssc.ser" +#elif defined(__ATARIXL__) +#define DRIVERNAME "atrxrdev.ser" +#elif defined(__ATARI__) +#define DRIVERNAME "atrrdev.ser" #else #define DRIVERNAME "unknown" #error "Unknown target system" #endif +extern unsigned int getsp(void); static const struct ser_params Params = { - SER_BAUD_19200, /* Baudrate */ + SER_BAUD_9600, /* Baudrate */ SER_BITS_8, /* Number of data bits */ SER_STOP_1, /* Number of stop bits */ SER_PAR_NONE, /* Parity setting */ @@ -37,6 +42,7 @@ static void CheckError (const char* Name, unsigned char Error) { if (Error != SER_ERR_OK) { fprintf (stderr, "%s: %d\n", Name, Error); + cgetc(); exit (EXIT_FAILURE); } } @@ -46,25 +52,42 @@ int main (void) { char Res; char C; + printf("SP: $%04x\n", getsp()); + printf ("A\n"); + //cgetc(); CheckError ("ser_load_driver", ser_load_driver (DRIVERNAME)); + printf ("B\n"); + //cgetc(); + printf("params at %p\n", &Params); CheckError ("ser_open", ser_open (&Params)); + printf ("C\n"); + //cgetc(); + printf("SP 2: $%04x\n", getsp()); while (1) { if (kbhit ()) { + printf("loop 1 SP: $%04x\n", getsp()); C = cgetc (); if (C == '1') { break; } else { CheckError ("ser_put", ser_put (C)); - printf ("%c", C); + //printf ("%c", C); } } Res = ser_get (&C); if (Res != SER_ERR_NO_DATA) { + printf("loop 2 SP: $%04x\n", getsp()); CheckError ("ser_get", Res); printf ("%c", C); } } + printf ("D\n"); + printf("after loop SP: $%04x\n", getsp()); + //cgetc(); CheckError ("ser_unload", ser_unload ()); + printf ("E\n"); + cgetc(); + printf("final SP: $%04x\n", getsp()); return EXIT_SUCCESS; } From 932748e6ca7e18eb7bcaff3974a1d4040e887fe9 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 6 Dec 2013 20:49:57 +0100 Subject: [PATCH 4/6] remove debug code --- libsrc/atari/ser/atrrdev.s | 570 ++++++------------------------------- testcode/lib/ser-test.c | 21 +- 2 files changed, 86 insertions(+), 505 deletions(-) diff --git a/libsrc/atari/ser/atrrdev.s b/libsrc/atari/ser/atrrdev.s index 7dd0df3c0..71fab5cab 100644 --- a/libsrc/atari/ser/atrrdev.s +++ b/libsrc/atari/ser/atrrdev.s @@ -1,6 +1,6 @@ ; ; Christian Groessler, Dec-2001 -; converted to driver interface Nov-2013 +; converted to driver interface Dec-2013 ; ; RS232 routines using the R: device (currently tested with an 850 only) ; @@ -10,57 +10,6 @@ .include "ser-error.inc" .include "atari.inc" -.macro pushall - php - pha - txa - pha - tya - pha -.endmacro -.macro pullall - pla - tay - pla - tax - pla - plp -.endmacro - -.ifdef __ATARIXL__ -.macro print_string text -.endmacro -.else -.macro print_string text - .local @start, @cont - jmp @cont -@start: .byte text, ATEOL -@cont: php - pha - txa - pha - tya - pha - ldx #0 ; channel 0 - lda #<@start - sta ICBAL,x ; address - lda #>@start - sta ICBAH,x - lda #<(@cont - @start) - sta ICBLL,x ; length - lda #>(@cont - @start) - sta ICBLH,x - lda #PUTCHR - sta ICCOM,x - jsr CIOV - pla - tay - pla - tax - pla - plp -.endmacro -.endif ; ------------------------------------------------------------------------ ; Header. Includes jump table @@ -92,43 +41,43 @@ libref: .addr $0000 .rodata rdev: .byte "R:", ATEOL, 0 -bauds: .byte 1 ; SER_BAUD_45_5 - .byte 2 ; SER_BAUD_50 - .byte 4 ; SER_BAUD_75 - .byte 5 ; SER_BAUD_110 - .byte 6 ; SER_BAUD_134_5 - .byte 7 ; SER_BAUD_150 - .byte 8 ; SER_BAUD_300 - .byte 9 ; SER_BAUD_600 - .byte 10 ; SER_BAUD_1200 - .byte 11 ; SER_BAUD_1800 - .byte 12 ; SER_BAUD_2400 - .byte 0 ; SER_BAUD_3600 - .byte 13 ; SER_BAUD_4800 - .byte 0 ; SER_BAUD_7200 - .byte 14 ; SER_BAUD_9600 - .byte 0 ; SER_BAUD_19200 - .byte 0 ; SER_BAUD_38400 - .byte 0 ; SER_BAUD_57600 - .byte 0 ; SER_BAUD_115200 - .byte 0 ; SER_BAUD_230400 - .byte 0 ; SER_BAUD_31250 - .byte 0 ; SER_BAUD_62500 - .byte 3 ; SER_BAUD_56_875 -num_bauds = * - bauds +bauds: .byte 1 ; SER_BAUD_45_5 + .byte 2 ; SER_BAUD_50 + .byte 4 ; SER_BAUD_75 + .byte 5 ; SER_BAUD_110 + .byte 6 ; SER_BAUD_134_5 + .byte 7 ; SER_BAUD_150 + .byte 8 ; SER_BAUD_300 + .byte 9 ; SER_BAUD_600 + .byte 10 ; SER_BAUD_1200 + .byte 11 ; SER_BAUD_1800 + .byte 12 ; SER_BAUD_2400 + .byte 0 ; SER_BAUD_3600 + .byte 13 ; SER_BAUD_4800 + .byte 0 ; SER_BAUD_7200 + .byte 14 ; SER_BAUD_9600 + .byte 0 ; SER_BAUD_19200 + .byte 0 ; SER_BAUD_38400 + .byte 0 ; SER_BAUD_57600 + .byte 0 ; SER_BAUD_115200 + .byte 0 ; SER_BAUD_230400 + .byte 0 ; SER_BAUD_31250 + .byte 0 ; SER_BAUD_62500 + .byte 3 ; SER_BAUD_56_875 +num_bauds = * - bauds databits: - .byte 48 ; SER_BITS_5 - .byte 32 ; SER_BITS_6 - .byte 16 ; SER_BITS_7 - .byte 0 ; SER_BITS_8 -num_databits = * - databits + .byte 48 ; SER_BITS_5 + .byte 32 ; SER_BITS_6 + .byte 16 ; SER_BITS_7 + .byte 0 ; SER_BITS_8 +num_databits = * - databits parities: - .byte 0 ; SER_PAR_NONE - .byte 4+1 ; SER_PAR_ODD - .byte 2+8 ; SER_PAR_EVEN - ;.byte 0 ; SER_PAR_MARK - ;.byte 0 ; SER_PAR_SPACE -num_parities = * - parities + .byte 0 ; SER_PAR_NONE + .byte 4+1 ; SER_PAR_ODD + .byte 2+8 ; SER_PAR_EVEN + ;.byte 0 ; SER_PAR_MARK + ;.byte 0 ; SER_PAR_SPACE +num_parities = * - parities .bss @@ -183,7 +132,7 @@ invbaud: lda #SER_ERR_BAUD_UNAVAIL openerr: - rts + rts ;---------------------------------------------------------------------------- @@ -191,8 +140,8 @@ openerr: ; Must return an SER_ERR_xx code in a/x. SER_OPEN: - jsr do_open - bne openerr + jsr do_open + bne openerr ; set line parameters lda rshand @@ -203,49 +152,40 @@ SER_OPEN: ; set baud rate, word size, stop bits and ready monitoring - ; build ICAX1 value + ; build ICAX1 value + ldy #SER_PARAMS::BAUDRATE + lda (ptr1),y + cmp #num_bauds + bcs invbaud - jsr dump - jsr print_open_txt - jsr print_iocb_txt - jsr dump_iocb_num - jsr nl + tay + lda bauds,y + beq invbaud + sta ICAX1,x - ldy #SER_PARAMS::BAUDRATE - lda (ptr1),y - cmp #num_bauds - bcs invbaud + ldy #SER_PARAMS::DATABITS + lda (ptr1),y + cmp #num_databits + bcs init_err - tay - lda bauds,y - beq invbaud - sta ICAX1,x + tay + lda databits,y + ora ICAX1,x + sta ICAX1,x - ldy #SER_PARAMS::DATABITS - lda (ptr1),y - cmp #num_databits - bcs init_err - - tay - lda databits,y - ora ICAX1,x - sta ICAX1,x - - ldy #SER_PARAMS::STOPBITS - lda (ptr1),y - clc - ror a - ror a - ora ICAX1,x - sta ICAX1,x - - jsr dump_aux1 + ldy #SER_PARAMS::STOPBITS + lda (ptr1),y + clc + ror a + ror a + ora ICAX1,x + sta ICAX1,x lda #36 ; xio 36, baud rate sta ICCOM,x - lda #0 + lda #0 ;ICAX2 = 0, monitor nothing - sta ICAX2,x + sta ICAX2,x sta ICBLL,x sta ICBLH,x sta ICBAL,x @@ -270,16 +210,14 @@ SER_OPEN: ; set translation and parity ldy #SER_PARAMS::PARITY lda (ptr1),y - cmp #num_parities - bcs init_err + cmp #num_parities + bcs init_err - tay - lda parities,y - ora #32 ; no translation + tay + lda parities,y + ora #32 ; no translation sta ICAX1,x - jsr dump_aux1 - lda #38 ; xio 38, translation and parity sta ICCOM,x jsr my_CIOV @@ -292,7 +230,7 @@ SER_OPEN: inverr: jmp my___inviocb cioerr: - ; @@@ need to close IOCB here + ; @@@ need to close IOCB here jsr my_fddecusage ; decrement usage counter of fd as open failed init_err: @@ -351,21 +289,18 @@ do_open: ; CLOSE: Close the port, disable interrupts and flush the buffer. Called ; without parameters. Must return an error code in a/x. ; +;---------------------------------------------------------------------------- +; SER_UNINSTALL routine. Is called before the driver is removed from memory. +; Must return an SER_ERR_xx code in a/x. +; +SER_UNINSTALL: SER_CLOSE: - pushall - print_string "SER_CLOSE called" - pullall lda rshand cmp #$ff beq @done - pushall - print_string "SER_CLOSE do work" - pullall - ldx rshand+1 - ;jsr my_pushax jsr my__close ldx #$ff stx rshand @@ -374,9 +309,6 @@ SER_CLOSE: stx cm_run @done: lda #SER_ERR_OK - pushall - print_string "SER_CLOSE returns" - pullall rts ;---------------------------------------------------------------------------- @@ -388,11 +320,9 @@ SER_CLOSE: SER_GET: ldy rshand cpy #$ff - bne @work ; work only if initialized - lda #SER_ERR_NOT_OPEN - bne nierr + beq ni_err ; work only if initialized -@work: lda rshand + lda rshand ldx #0 jsr my_fdtoiocb tax @@ -433,11 +363,12 @@ SER_GET: rts ser_error: - lda #SER_ERR_OVERFLOW ; there is no large selection of serial error codes... :-/ + lda #SER_ERR_OVERFLOW ; there is no large selection of serial error codes... :-/ ldx #0 rts -nierr: ldx #0 +ni_err: lda #SER_ERR_NOT_OPEN + ldx #0 rts ;---------------------------------------------------------------------------- @@ -448,24 +379,14 @@ nierr: ldx #0 SER_PUT: ldy rshand cpy #$ff - bne @work ; work only if initialized - lda #SER_ERR_NOT_OPEN - bne nierr + beq ni_err ; work only if initialized -@work: pha ; char to write + pha ; remember char to write lda rshand ldx #0 jsr my_fdtoiocb tax - jsr print_put_txt - pla - pha - jsr dump_hex ; dump char to write - jsr print_iocb_txt - jsr dump_iocb_num - jsr nl - lda cm_run ; concurrent mode already running? bne @go jsr ena_cm ; turn on concurrent mode @@ -481,8 +402,8 @@ SER_PUT: pla ; get the char back jsr my_CIOV ; go do it bmi ser_error - lda #0 - tax + lda #0 + tax rts ;---------------------------------------------------------------------------- @@ -516,15 +437,7 @@ SER_IRQ = $0000 ; Must return an SER_ERR_xx code in a/x. SER_INSTALL: - - ;print_string "SER_INSTALL with error" - ;brk - ;lda #42 - ;ldx #0 - ;rts - ; check if R: device is installed - ldy #0 search: lda HATABS,y ; get device name cmp #'R' @@ -639,249 +552,6 @@ found: lda ptr3 tax ; A is zero rts -;---------------------------------------------------------------------------- -; SER_UNINSTALL routine. Is called before the driver is removed from memory. -; Must return an SER_ERR_xx code in a/x. - -SER_UNINSTALL: - pushall - print_string "SER_UNINSTALL called" - pullall - jmp SER_CLOSE - - -.macro print_string2 addr, len - ldx #0 ; channel 0 - lda #addr - sta ICBAH,x - lda #len - sta ICBLH,x - lda #PUTCHR - sta ICCOM,x - jsr CIOV -.endmacro - -.macro push_ptr1 - lda ptr1+1 - pha - lda ptr1 - pha -.endmacro - -.macro pull_ptr1 - pla - sta ptr1 - pla - sta ptr1+1 -.endmacro - -.macro push_ptr2und1 - lda ptr2+1 - pha - lda ptr2 - pha - lda ptr1+1 - pha - sta ptr2+1 - tax - lda ptr1 - pha - sta ptr2 -.endmacro - -.macro pull_ptr2und1 - pla - sta ptr1 - pla - sta ptr1+1 - pla - sta ptr2 - pla - sta ptr2+1 -.endmacro - - -nl_txt: .byte ATEOL -nl_txt_len = * - nl_txt - -nl: pushall - print_string2 nl_txt, nl_txt_len - pullall - rts - -iocb_txt: .byte " IOCB number: " -iocb_txt_len = * - iocb_txt - -print_iocb_txt: - pushall - print_string2 iocb_txt, iocb_txt_len - pullall - rts - -open_txt: .byte "OPEN" -open_txt_len = * - open_txt - -print_open_txt: - pushall - print_string2 open_txt, open_txt_len - pullall - rts - - -put_txt: .byte "PUT " -put_txt_len = * - put_txt - -print_put_txt: - pushall - print_string2 put_txt, put_txt_len - pullall - rts - -aux1_txt: .byte "AUX1: " -aux1_txt_len = * - aux1_txt - -dump_aux1: - pushall - print_string2 aux1_txt,aux1_txt_len - tsx - lda $103,x - jsr dump_hex_low - jsr nl - pullall - rts - -dump_iocb_num: - pushall - txa - jsr dump_hex_low - pullall - rts - -dump_hex: - pushall - tsx - lda $103,x - jsr dump_hex_low - pullall - rts - - -; no need to preserve regs -dump_hex_low: - tax - push_ptr1 - - lda #outbuf - sta ptr1+1 - - txa - jsr hex8 - - ldx #0 ; channel 0 - - lda #2 - sta ICBLL,x ; length - lda #0 - sta ICBLH,x - - lda #outbuf - sta ICBAH,x - lda #PUTCHR - sta ICCOM,x - jsr CIOV - - - pull_ptr1 - rts - - -; ldy #SER_PARAMS::BAUDRATE -; lda (ptr1),y - -dump: - pushall - push_ptr2und1 - -.ifndef __ATARIXL__ - tay - lda #outbuf - sta ptr1+1 - - ; ptr1 - pointer to string buffer - ; ptr2 - pointer to rs232 params - tya - jsr hex16 - lda #':' - sta (ptr1),y - iny - lda #' ' - sta (ptr1),y - iny - lda #' ' - sta (ptr1),y - lda ptr1 - clc - adc #3 - sta ptr1 - bcc @f - inc ptr1+1 -@f: - -.repeat 5 - - ldy #0 - lda (ptr2),y - jsr hex8 - lda #' ' - sta (ptr1),y - inc ptr1 - bne *+4 - inc ptr1+1 - inc ptr2 - bne *+4 - inc ptr2+1 - -.endrepeat - - lda #ATEOL - sta (ptr1),y - inc ptr1 - bne *+4 - inc ptr1+1 - - ldx #0 ; channel 0 - - lda ptr1 - sec - sbc #outbuf - sta ICBLH,x - - lda #outbuf - sta ICBAH,x - lda #PUTCHR - sta ICCOM,x - jsr CIOV -.endif - - pull_ptr2und1 - pullall - rts - ; enable concurrent rs232 mode ; gets iocb index in X @@ -908,73 +578,3 @@ dump: jmp my_CIOV .endproc ;ena_cm - -;***************************************************************************** -;* Unterprogramm: HEX16 * -;* Aufgabe: 16-bit Binärzahl in String wandeln (hexadezimal) * -;* Übergabe: ptr1 - Zeiger auf 4-byte Zielpuffer * -;* AX - zu wandelnde Zahl (high X, low A) * -;* Zurück: ptr1 - Zeiger hinter Hexstring * -;* Y - 0 * -;* Benutzt: HEX8 * -;* * -;* alle Register zerstört * -;***************************************************************************** - -hex16: - pha - txa - jsr hex8 - pla - ;fall into hex8 - - -;***************************************************************************** -;* Unterprogramm: HEX8 * -;* Aufgabe: 8-bit Binärzahl in String wandeln (hexadezimal) * -;* Übergabe: ptr1 - Zeiger auf 2-byte Zielpuffer * -;* A - zu wandelnde Zahl * -;* Zurück: ptr1 - Zeiger hinter Hexstring * -;* Y - 0 * -;* * -;* alle Register zerstört * -;***************************************************************************** - -hex8: - tax - lsr a - lsr a - lsr a - lsr a - cmp #10 - bcc hex_1 - clc - adc #'A'-10 - bne hex_2 - -hex_1: adc #'0' -hex_2: ldy #0 - sta (ptr1),y - inc ptr1 - bne hex_3 - inc ptr1+1 - -hex_3: txa - and #15 - - cmp #10 - bcc hex_4 - clc - adc #'A'-10 - bne hex_5 -hex_4: adc #'0' -hex_5: ldy #0 - sta (ptr1),y - inc ptr1 - bne hex_6 - inc ptr1+1 -hex_6: rts - -.data - -outbuf: .res 48 diff --git a/testcode/lib/ser-test.c b/testcode/lib/ser-test.c index 79a40e545..6e3f5fc8a 100644 --- a/testcode/lib/ser-test.c +++ b/testcode/lib/ser-test.c @@ -26,7 +26,6 @@ #error "Unknown target system" #endif -extern unsigned int getsp(void); static const struct ser_params Params = { SER_BAUD_9600, /* Baudrate */ @@ -42,7 +41,6 @@ static void CheckError (const char* Name, unsigned char Error) { if (Error != SER_ERR_OK) { fprintf (stderr, "%s: %d\n", Name, Error); - cgetc(); exit (EXIT_FAILURE); } } @@ -52,42 +50,25 @@ int main (void) { char Res; char C; - printf("SP: $%04x\n", getsp()); - printf ("A\n"); - //cgetc(); CheckError ("ser_load_driver", ser_load_driver (DRIVERNAME)); - printf ("B\n"); - //cgetc(); - printf("params at %p\n", &Params); CheckError ("ser_open", ser_open (&Params)); - printf ("C\n"); - //cgetc(); - printf("SP 2: $%04x\n", getsp()); while (1) { if (kbhit ()) { - printf("loop 1 SP: $%04x\n", getsp()); C = cgetc (); if (C == '1') { break; } else { CheckError ("ser_put", ser_put (C)); - //printf ("%c", C); + printf ("%c", C); } } Res = ser_get (&C); if (Res != SER_ERR_NO_DATA) { - printf("loop 2 SP: $%04x\n", getsp()); CheckError ("ser_get", Res); printf ("%c", C); } } - printf ("D\n"); - printf("after loop SP: $%04x\n", getsp()); - //cgetc(); CheckError ("ser_unload", ser_unload ()); - printf ("E\n"); - cgetc(); - printf("final SP: $%04x\n", getsp()); return EXIT_SUCCESS; } From 2461163f3856fe430929a57812c3a8440dd90057 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 6 Dec 2013 21:16:10 +0100 Subject: [PATCH 5/6] remove old (static) serial driver boilerplate --- libsrc/atari/rs232.s_ | 389 ------------------------------------------ 1 file changed, 389 deletions(-) delete mode 100644 libsrc/atari/rs232.s_ diff --git a/libsrc/atari/rs232.s_ b/libsrc/atari/rs232.s_ deleted file mode 100644 index 35f20ca4f..000000000 --- a/libsrc/atari/rs232.s_ +++ /dev/null @@ -1,389 +0,0 @@ -; -; Christian Groessler, Dec-2001 -; -; RS232 routines using the R: device (currently tested with an 850 only) -; -; unsigned char __fastcall__ rs232_init (char hacked); -; unsigned char __fastcall__ rs232_params (unsigned char params, unsigned char parity); -; unsigned char __fastcall__ rs232_done (void); -; unsigned char __fastcall__ rs232_get (char* B); -; unsigned char __fastcall__ rs232_put (char B); -; unsigned char __fastcall__ rs232_pause (void); [TODO] -; unsigned char __fastcall__ rs232_unpause (void); [TODO] -; unsigned char __fastcall__ rs232_status (unsigned char* status, -; unsigned char* errors); [TODO] -; - - .import findfreeiocb - .import __do_oserror - .import fddecusage - .import fdtoiocb - .import __inviocb - .import clriocb - .import newfd - .import _close, pushax, popax, popa - .importzp ptr1, tmp2, tmp3 - - .export _rs232_init, _rs232_params, _rs232_done, _rs232_get - .export _rs232_put, _rs232_pause, _rs232_unpause, _rs232_status - - .include "atari.inc" - .include "errno.inc" - .include "rs232.inc" - - .rodata - -rdev: .byte "R:", ATEOL, 0 - - .bss - -; receive buffer -RECVBUF_SZ = 256 -recv_buf: .res RECVBUF_SZ - -cm_run: .res 1 ; concurrent mode running? - - .data - -rshand: .word $ffff - - .code - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_init (char hacked); -; /* Initialize the serial port. The parameter is ignored in the Atari version. -; * return 0/-1 for OK/Error -; */ -; - -.proc _rs232_init - - jsr findfreeiocb - bne init_err - txa - tay ; move iocb # into Y - lda #3 - sta tmp3 ; name length + 1 - lda #rdev - jsr newfd - tya - bcs doopen ; C set: open needed / device not already open - - pha - jsr _rs232_done ;** shut down if started @@@TODO check this out!! - pla - -doopen: tax - pha - jsr clriocb - pla - tax - lda #rdev - sta ICBAH,x - lda #OPEN - sta ICCOM,x - - lda #$0D ; mode in+out+concurrent - sta ICAX1,x - lda #0 - sta ICAX2,x - sta ICBLL,x ; zap buf len - sta ICBLH,x - jsr CIOV - bmi cioerr1 - - lda tmp2 ; get fd - sta rshand - ldx #0 - stx rshand+1 - txa - rts - -cioerr1:jsr fddecusage ; decrement usage counter of fd as open failed - -init_err: - ldx #0 - lda #RS_ERR_INIT_FAILED - rts - -.endproc ; _rs232_init - - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_params (unsigned char params, unsigned char parity); -; -; Set communication parameters. -; -; params contains baud rate, stop bits and word size -; parity contains parity -; -; 850 manual documents restrictions on the baud rate (not > 300), when not -; using 8 bit word size. So only 8 bit is currently tested. -; - -.proc _rs232_params - - sta tmp2 - lda rshand - cmp #$ff - bne work ; work only if initialized - lda #RS_ERR_NOT_INITIALIZED - bne done -work: lda rshand - ldx #0 - jsr fdtoiocb ; get iocb index into X - bmi inverr ; shouldn't happen - tax - - ; set handshake lines - - lda #34 ; xio 34, set cts, dtr etc - sta ICCOM,x - lda #192+48+3 ; DTR on, RTS on, XMT on - sta ICAX1,x - lda #0 - sta ICBLL,x - sta ICBLH,x - sta ICBAL,x - sta ICBAH,x - sta ICAX2,x - jsr CIOV - bmi cioerr - - ; set baud rate, word size, stop bits and ready monitoring - - lda #36 ; xio 36, baud rate - sta ICCOM,x - jsr popa ; get parameter - sta ICAX1,x - ;ICAX2 = 0, monitor nothing - jsr CIOV - bmi cioerr - - ; set translation and parity - - lda #38 ; xio 38, translation and parity - sta ICCOM,x - lda tmp2 - ora #32 ; no translation - sta ICAX1,x - jsr CIOV - bmi cioerr - - lda #0 -done: ldx #0 - rts - -inverr: jmp __inviocb - -.endproc ;_rs232_params - -cioerr: jmp __do_oserror - - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_done (void); -; /* Close the port, deinstall the interrupt hander. You MUST call this function -; * before terminating the program, otherwise the machine may crash later. If -; * in doubt, install an exit handler using atexit(). The function will do -; * nothing, if it was already called. -; */ -; - -.proc _rs232_done - - lda rshand - cmp #$ff - beq done -work: ldx rshand+1 - jsr pushax - jsr _close - pha - txa - pha - ldx #$ff - stx rshand - stx rshand+1 - inx - stx cm_run - pla - tax - pla -done: rts - -.endproc ;rs232_done - - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_get (char* B); -; /* Get a character from the serial port. If no characters are available, the -; * function will return RS_ERR_NO_DATA, so this is not a fatal error. -; */ -; - -.proc _rs232_get - - ldy rshand - cpy #$ff - bne work ; work only if initialized - lda #RS_ERR_NOT_INITIALIZED - bne nierr - -work: sta ptr1 - stx ptr1+1 ; store pointer to received char - - lda rshand - ldx #0 - jsr fdtoiocb - tax - lda cm_run ; concurrent mode already running? - bne go - jsr ena_cm ; turn on concurrent mode - -go: ; check whether there is any input available - - lda #STATIS ; status request, returns bytes pending - sta ICCOM,x - jsr CIOV - bmi cioerr ; @@@ error handling - - lda DVSTAT+1 ; get byte count pending - ora DVSTAT+2 - beq nix_da ; no input waiting... - - ; input is available: get it! - - lda #GETCHR ; get raw bytes - sta ICCOM,x ; in command code - lda #0 - sta ICBLL,x - sta ICBLH,x - sta ICBAL,x - sta ICBAH,x - jsr CIOV ; go get it - bmi cioerr ; @@@ error handling - - ldx #0 - sta (ptr1,x) ; return received byte - txa - rts - -nierr: ldx #0 - rts - -nix_da: lda #RS_ERR_NO_DATA - ldx #0 - rts - -.endproc ;_rs232_get - - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_put (char B); -; /* Send a character via the serial port. There is a transmit buffer, but -; * transmitting is not done via interrupt. The function returns -; * RS_ERR_OVERFLOW if there is no space left in the transmit buffer. -; */ -; - -.proc _rs232_put - - ldy rshand - cpy #$ff - bne work ; work only if initialized - lda #RS_ERR_NOT_INITIALIZED - bne nierr - -work: pha - lda rshand - ldx #0 - jsr fdtoiocb - tax - lda cm_run ; concurrent mode already running? - bne go - jsr ena_cm ; turn on concurrent mode - - ; @@@TODO: check output buffer overflow -go: lda #PUTCHR ; put raw bytes - sta ICCOM,x ; in command code - lda #0 - sta ICBLL,x - sta ICBLH,x - sta ICBAL,x - sta ICBAH,x - pla ; get the char back - jsr CIOV ; go do it - rts - -nierr: ldx #0 - rts - -.endproc ;_rs232_put - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_pause (void); -; /* Assert flow control and disable interrupts. */ -; - -_rs232_pause: - - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_unpause (void); -; /* Re-enable interrupts and release flow control */ -; - -_rs232_unpause: - - -;---------------------------------------------------------------------------- -; -; unsigned char __fastcall__ rs232_status (unsigned char* status, -; unsigned char* errors); -; /* Return the serial port status. */ -; - -_rs232_status: - - lda #255 - tax - rts - - -; enable concurrent rs232 mode -; gets iocb index in X -; all registers destroyed - -.proc ena_cm - - lda #40 ; XIO 40, start concurrent IO - sta ICCOM,x - sta cm_run ; indicate concurrent mode is running - lda #0 - sta ICAX1,x - sta ICAX2,x - lda #recv_buf - sta ICBAH,x - lda #RECVBUF_SZ - sta ICBLH,x - lda #$0D ; value from 850 man, p62. must be 0D?, - sta ICAX1,x ; or any non-zero? - jmp CIOV - -.endproc ;ena_cm - - .end From 9e91f74297773a49cc7506abd7dbcc2f12da9e99 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Sat, 7 Dec 2013 01:24:05 +0100 Subject: [PATCH 6/6] small optimzation (found by Greg King) --- libsrc/atari/ser/atrrdev.s | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libsrc/atari/ser/atrrdev.s b/libsrc/atari/ser/atrrdev.s index 71fab5cab..7243e29e0 100644 --- a/libsrc/atari/ser/atrrdev.s +++ b/libsrc/atari/ser/atrrdev.s @@ -562,8 +562,9 @@ found: lda ptr3 lda #40 ; XIO 40, start concurrent IO sta ICCOM,x sta cm_run ; indicate concurrent mode is running + lda #$0D ; value from 850 manual, p62. must be $0D?, + sta ICAX1,x ; or any non-zero? lda #0 - sta ICAX1,x sta ICAX2,x lda #RECVBUF_SZ sta ICBLH,x - lda #$0D ; value from 850 man, p62. must be $0D?, - sta ICAX1,x ; or any non-zero? jmp my_CIOV .endproc ;ena_cm