; ; serielles Interface fuer VT27065 Lineprinter ; ; Jonny Jonas ; Ernst-Abbe-Str. 18 ; O-5091 Erfurt ; ; created: 11-Feb-91 ; last update: 26-Mar-91 ; ; Hardware: UB8830D, U2732C, MAX323 ; ; Belegung der Ports: ; ; P0 0..7 Datenleitungen zum Drucker ; P1 0..7 frei ; P2 0 RSTR zum Drucker ; 1 DEMAND vom Drucker ; 2 Zeichenwandlung in Grossbuchstaben offen=ja, Masse=nein ; 3..7 frei ; P3 0 SIO Eingang ; 1..6 frei ; 7 SIO Ausgang ; regist: equ 10h ; Speicher fuer Register buffer: equ 20h ; Beginn SIO Buffer (20h..5fh) buflen: equ 64 ; Laenge Buffer ; org 0 ; dw 0 ; P32 dw 0 ; P33 dw 0 ; P31 dw sioin ; SIO in dw 0 ; SIO out dw 0 ; T1 ; init: di srp #0 ld r8,#10h ; loeschen interne Zellen ld r9,#70h ; Anzahl zu init. Zellen init1: clr @8 ; 0 inc r8 djnz r9,init1 ld r8,#.h(initab) ; Tabelle Init Werte fuer Steueregister ld r9,#.l(initab) ld r10,#tmr ; Beginn mit TMR ld r11,#inital ; Tabellenlaenge init2: ldci @r10,@rr8 djnz r11,init2 ld tmr,#11010011b ; Laden T0 ei ; ld rp,#regist ; Registerpointer einstellen clr p2 clr p0 loop0: ld sio,#11h ; XON senden loop: call rdbuf ; Zeichen holen jr c,loop1 ; Zeichen da xor p2,#00001000b decw rr14 jr nz,loop jr loop0 ; XON zyklisch senden ; loop1: call outpio ; Zeichen ausgeben clr r14 clr r15 jr loop ; outpio: tm p2,#00000100b ; Zeichen wandeln? jr nz,outpi1 ; nein (Bruecke offen) and r0,#7fh cp r0,#60h ; alle Zeichen >=60 wandeln jr c,outpi1 and r0,#5fh outpi1: tm p2,#00000010b ; DEMAND low? jr nz,outpi1 ; nein ld p0,r0 ; Zeichen ausgeben or p2,#00000001b ; RSTR high setzen outpi2: tm p2,#00000010b ; demand high? jr z,outpi2 ; nein and p2,#11111110b ; RSTR low setzen cp r0,#0ah ; Linefeed? jr nz,outpi4 ; nein ld r0,#100 ; kurze Warteschleife outpi3: djnz r0,outpi3 outpi4: ret ; ; Zeichen aus SIO Buffer lesen ; rdbuf: di cp r3,r4 ; Zeichen im Buffer? rcf ; CY=0 kein Zeichen jr z,rdbuf1 ; Buffer leer tm r1,#00000001b ; XOFF gesendet? jr z,rdbuf2 ; nein ld r2,r3 ; Pruefen ob weniger als 10 Zeichen im Buffer sub r2,r4 and r2,#buflen-1 cp r2,#10 jr nc,rdbuf2 ; nein and r1,#11111110b ; XOFF Flag ruecksetzen ld sio,#11h ; XON senden rdbuf2: ld r5,r4 ; Lesezeiger add r5,#buffer ; + Bufferanfang ld r0,@r5 ; Zeichen aus Buffer holen inc r4 ; Lesezeiger weiterstellen and r4,#buflen-1 ; Korrektur Bufferzeiger scf ; CY=1 Zeichen in r0 rdbuf1: ei ret ; ; SIO Empfaenger Interrupt ; sioin: ld r2,sio and r2,#7fh ; Paritaetsbit loeschen ld r5,r3 inc r3 ; Schreibzeiger and r3,#buflen-1 ; Korrektur Bufferzeiger cp r3,r4 ; Buffer voll? jr z,sioin1 ; ja add r5,#buffer ; +Bufferanfang ld @r5,r2 ; Zeichen speichern tm r1,#00000001b ; XOFF gesendet? jr nz,sioin1 ; ja ld r2,r3 ; Anzahl Zeichen im Buffer ermitteln sub r2,r4 and r2,#buflen-1 cp r2,#buflen-10 ; noch 10 Bytes frei? jr c,sioin1 ; ja or r1,#00000001b ; merken XOFF gesendet ld sio,#13h ; XOFF senden sioin1: iret ; ; Init Tabelle fuer Steuerregister ; initab: db 00000000b ; TMR db 00000000b ; T1 db 00000011b ; PRE1 db 2 ; T0 9600 Baud db 3*4+1 ; PRE0 db 11110110b ; P2M Bit 0=RSTR, Bit 1=DEMAND, Bit 2=Kyrill. db 01000001b ; P3M db 00010100b ; P01M db 00010100b ; IPR db 00000000b ; IRQ db 00001000b ; IMR db 0 ; FLAGS db 0 ; RP db 0 ; SPH db 80h ; SPL inital: equ $-initab ; end