; serial.a86 public serial_init public serial_inp_stat public serial_out_stat public serial_input public serial_output ; for the use of the serial CONFIGaurator only public rsmode public rscrtsh public rscrtsl public rsirtsh extrn clock_baudset:near rs232_rda equ 2 rs232_tbre equ 81h rsdata equ 5ch rsstat equ 5eh rsiostat equ 7ch baud_4800 equ 20h ; as per shell ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; serial_init: mov al,0eh ! out rsstat,al mov al,40h ! out rsstat,al tx1: in al,rsstat ! test al,1 ! jz tx1 mov al,rsmode ! out rsstat,al tx2: in al,rsstat ! test al,1 ! jz tx2 mov al,rscrtsh ! out rsstat,al mov ax,baud_4800 ! call clock_baudset mov al,rscrtsl ! out rsstat,al ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; serial_inp_stat: in al,rsstat ! and al,rs232_rda jz serial_inp_stat_notrdy ; if we are here, we have a char waiting mov al,0ffh ! ret serial_inp_stat_notrdy: mov al,00h ! ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; serial_out_stat: in al,rsstat and al,81h xor al,81h jnz not_o_rdy in al,rsiostat test al,1 jz not_o_rdy mov al,0ffh ; rdy ret not_o_rdy: mov al,0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; serial_input: in al,rsdata ; get input data push ax ; save input byte mov al,rscrtsl ; rts auf low out rsstat,al ; pop ax ; restore input byte ret ; return to caller ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; serial_output: out rsdata,al ; send output data ret ; return to caller ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dseg rsmode db 7eh ; 1 stop 8 data even 2400 rscrtsh db 37h ; rts, er, rxe, dtr, txen rscrtsl db 17h ; dito, jedoch rts low rsirtsh db 36h ; rts, er, rxe, dtr ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;