module uart BASEREG EQU #F8EF ;DLAB=0 THR EQU BASEREG+#000 ;(W)Transmit Holding Register RBR EQU BASEREG+#000 ;(R)Receive Buffer Register IER EQU BASEREG+#100 ;(RW)Interrupt Enable Register EDSSI EQU %1000 ;Enable Modem Status Interrupt ELSI EQU %0100 ;Enable Receiver Line Status Interrupt ETBEI EQU %0010 ;Enable Transmitter Holding Register Empty Interrupt ERBFI EQU %0001 ;Enable Received Data Available Interrupt FCR EQU BASEREG+#200 ;(W)FIFO Control Register IIR EQU BASEREG+#200 ;(R)Interrupt Identification Register LCR EQU BASEREG+#300 ;(RW)Line Control Register DLAB EQU %10000000 ;Divisor Latch Access Bit SETBRK EQU %01000000 ;Set Break STKPAR EQU %00100000 ;Stick Parity EPS EQU %00010000 ;Even Parity Select PEN EQU %00001000 ;Parity Enable STB EQU %00000100 ;Number of Stop Bits WLSB1 EQU %00000010 ;Word Length Select #1 WLSB0 EQU %00000001 ;Word Length Select #0 MCR EQU BASEREG+#400 ;(RW)Modem Control Register RTS EQU %10 ;Request to Send DTR EQU %01 ;Data Terminal Ready LSR EQU BASEREG+#500 ;(RW)Line Status Register FIFOE EQU %10000000 ;Error in Receiver FIFO TEMT EQU %01000000 ;Transmitter Empty THRE EQU %00100000 ;Transmitter Holding Register Empty BI EQU %00010000 ;Break Interrupt (BI) FE EQU %00001000 ;Framing Error (FE) PE EQU %00000100 ;Parity Error (PE) OE EQU %00000010 ;Overrun Error (OE) DR EQU %00000001 ;Data Ready (DR) MSR EQU BASEREG+#600 ;(RW)Modem Status Register DCD EQU %10000000 ;Data Carrier Detect RI EQU %01000000 ;Ring Indicator DSR EQU %00100000 ;Data Set Ready CTS EQU %00010000 ;Clear To Send DDCD EQU %00001000 ;Delta Data Carrier Detect TERI EQU %00000100 ;Trailing Edge Ring Indicator DDSR EQU %00000010 ;Delta Data Set Ready DCTS EQU %00000001 ;Delta Clear To Send SCR EQU BASEREG+#700 ;(RW)Scratch Register ;DLAB=1 DLL EQU BASEREG+#000 ;(RW)Divisor Latch LSB DLH EQU BASEREG+#100 ;(RW)Divisor Latch MSB ;eRS232 for ZX-Evo ERS_DR EQU #00EF ERS_SR EQU #C2EF ERS_ST EQU #C3EF ERS_CR EQU #C7EF ;set baud rate ;hl=divider SetBaud ld bc,LCR in a,(c):or DLAB:out (c),a ;set DLAB=1 ld b,high DLL out (c),l ;low inc b out (c),h ;high ld b,high LCR in a,(c):and !DLAB:out (c),a ;set DLAB=0 ld b,high ERS_CR ld a,#F1 out (c),a ld a,#07 out (c),a ret ;set line control register ;a=status SetLineControl ld bc,LCR out (c),a ret ;put char ;a=char PutChar ld bc,ERS_ST exa pc1 in f,(c):jr z,pc1 ;wait for room exa ld b,high ERS_DR out (c),a ret ;get char ;out: a=char GetChar ld bc,ERS_SR gc1 in f,(c):jr z,gc1 ;wait for data ld b,high ERS_DR in a,(c) ret ;write block ;hl=buffer addr ;bc=len Write ld d,b ld e,c ww1 ld bc,ERS_ST in c,(c) jr z,ww1 ld a,d or a jr nz,ww2 ld a,e cp c jr nc,ww2 ld c,e ww2 ex de,hl xor a ld b,a sbc hl,bc ex de,hl ld b,c ld c,low ERS_DR otir ld a,d or e jr nz,ww1 ret ;read block ;hl=buffer addr ;bc=len Read ld d,b ld e,c rr1 ld bc,ERS_SR in c,(c) jr z,rr1 ld a,d or a jr nz,rr2 ld a,e cp c jr nc,rr2 ld c,e rr2 ex de,hl xor a ld b,a sbc hl,bc ex de,hl ld b,c ld c,low ERS_DR inir cable_cancel_download ld a,0 or a jp nz,cable_cancel_download_ex ld a,d or e jr nz,rr1 ret ;;read block fast ;;hl=buffer addr ;;bc=len ;Readf push hl:exx:pop hl ; ld de,high LSR+256*high RBR ;+256 ; ; ld c,low LSR ;r0_ dup 16 ; ld b,e ; in a,(c):and DR:jr z,$-4 ;wait ; ; ld b,d:ini ; edup ; exx ; dup 16 ; dec bc ; edup ; ld a,b:or c ; exx ; jp nz,r0 ; ret endmodule