PAGE 66 NAME ('IQNNET') ; ; Fyzicke operace na siti ; !!! posledni uprava 11.03.88 ; ; PROCEDURE ININET ; odpojeni vysilace od site ; PROCEDURE WRNET(PBUF:WORD; L:BYTE) ; vyslani zpravy PBUF^ v delce L ; FUNCTION RDNET(PBUF:WORD; VAR L:BYTE):BYTE ; cteni zpravy do PBUF^ ; pred vyvolanim PBUF^=adresa prijemce(255=vse), L= max. delka ; po navratu L=skutecna delka, RDNET=chybovy kod (0=ok) ; FUNCTION RDNETT(PBUF:WORD; VAR L:BYTE):BYTE ; dtto, chybovy kod 128=vyprseni timoutu ; FUNCTION RDNETL(PBUF:WORD; VAR L:BYTE):BYTE ; dtto, chybovy kod 128=vyprseni dlouheho timoutu ; PROCEDURE ENINET; ; inicializace pro prijem pod prerusenim do BUFNET, konci se zakazanym ; prerusenim ; RDINET ; precteni zpravy do BUFNET po preruseni prijmem prveho znaku ; po navratu A=chybovy kod, BUFNET^=skutecna delka zpravy ; HL=adresa BUFNET ; FUNCTION EXINET:BOOLEAN ; test, je-li zprava v BUFNET vyzva, jestlize ano, potvrzeni a provedeni ; PROCEDURE INTNET; ; preruseni pri prijmu prveho znaku, prepnuti na vlastni zasobnik ; nacteni pomoci RDINET, provedeni pomoci EXINET, inicializace ; pomoci ENINET ; PROCEDURE BRKOON; ; potlaceni vsech preruseni s vyjimkou BREAK s uschovou vychoziho stavu ; PROCEDURE BRKOOF; ; obnova puvodniho stavu pred volanim BRKOON ; PROCEDURE DELAY; ; zpozdeni mezi volanim RDNET a WRNET v satelitu ; ENTRY ININET,WRNET,RDNET,RDNETT,RDNETL,ENINET,RDINET,EXINET,INTNET ENTRY BRKOON,BRKOOF,DELAY ; EXTRN BUFNET ;buffer na nevyzadane zpravy EXTRN NINSP,NINHL ;SP a HL pri preruseni nevyzadanou zpravou EXTRN NINSTK ;zasobnik dtto EXTRN IQSNMB ;zjisteni cisla satelitu EXTRN INTMSV ;byte na ulozeni masky preruseni ; FALSE EQU 0 TRUE EQU NOT FALSE ; TINTRQ EQU 13 ;typ zpravy VYZVA TINTAC EQU 14 ;typ zpravy POTVRZENI VYZVY ; BRKMSK EQU 0DFH ;maska preruseni - povolen pouze BR EOI EQU 20H P590 EQU 88H P591 EQU 89H ;port 8259 pro masku preruseni ; ; Prikazy pro ovladani SIO ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR0 ; ;Pointer Bits RWR0 EQU 0 RWR1 EQU 1 RWR2 EQU 2 RWR3 EQU 3 RWR4 EQU 4 RWR5 EQU 5 RWR6 EQU 6 RWR7 EQU 7 ;Command Bits SNDABO EQU 8H ;Send Abort (SDLC) RSTEXI EQU 10H ;Reset Ext/Status Interrupts RSTCHL EQU 18H ;Channel Reset EINRXC EQU 20H ;EI on Next Rx Character RSTTXI EQU 28H ;Reset TxINT Pending RSTERR EQU 30H ;Error Reset RETI EQU 38H ;Return from Interrupt (Ch-A) ;CRC Reset Codes RSTRXC EQU 40H ;Reset Rx CRC RSTTXC EQU 80H ;Reset Tx CRC RSTTXU EQU 0C0H ;Reset Tx Underrun/EOM Latch ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR1 ; EIEXT EQU 1 ;External/Status Interrupt Enable EITXI EQU 2 ;Tx Int Enable STAVEC EQU 4 ;Status Affects Vector (Ch-B) ;Receive Int Modes EIRXFC EQU 8H ;EI Rx on First Character EIRXAP EQU 10H ;on All Chars - Par. Affects Vec. EIRXAC EQU 18H ;dtto - Parity Does Not Affect ;Wait/Ready Function Selection WTRYEN EQU 80H ;Wait/Ready Enable RDYSEL EQU 40H ;Ready Select WTRYRX EQU 20H ;Wait/Ready on Receive ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR2 ; ;Interrupt Vector (Ch-B) ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR3 ; RXEN EQU 1 ;Rx Enable SYCINH EQU 2 ;Sync Char Load Inhibit ADRSRC EQU 4 ;Address Search Mode RXCRCE EQU 8 ;Rx CRC Enable HUNTPH EQU 10H ;Enter Hunt Phase AUTOEN EQU 20H ;Auto Enables - Enable DCD(Rx) and CTS(Tx) ;Rx Bits per Character (0=5 Bits/Char) RXB6PC EQU 40H ;6 RXB7PC EQU 80H ;7 RXB8PC EQU 0C0H ;8 ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR4 ; PAREN EQU 1 ;Parity Enable PAREVN EQU 2 ;Even Parity (0=Odd) ;Stop Bits (0=Sync Modes) STPB1 EQU 4 ;1 STPB15 EQU 8 ;1.5 STPB2 EQU 0CH ;2 ;Sync Modes (0=8-bit) MOSY16 EQU 10H ;16-bit MOSDLC EQU 20H ;SDLC MOEXSY EQU 30H ;External Sync ;Clock Rate (0=1X) CLK16X EQU 40H ;16X CLK32X EQU 80H ;32X CLK64X EQU 0C0H ;64X ; ;;;;;;;;;;;;;;;;;;;;;;;; ; WR5 ; TXCRCE EQU 1 ;Tx CRC Enable RTS EQU 2 ;Request To Send (Pin is Inverted) CRC16 EQU 4 ;CRC-16 (0=CRC-SDLC) TXEN EQU 8 ;Tx Enable SBREAK EQU 10H ;Send Break ;Tx Bits/Character (0=5 Bits/Char) TX6BPC EQU 20H ;6 TX7BPC EQU 40H ;7 TX8BPC EQU 60H ;8 DTR EQU 80H ;DTR (Pin is Inverted) ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR6 ; ;SDLC - Secondary Address ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; WR7 ; ;SDLC - Flag (7EH) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RR0 ; RXCHAV EQU 1 ;Rx Character Available INTPND EQU 2 ;Interrupt Pending (Ch-A only) TXEMPT EQU 4 ;Tx Buffer Empty DCD EQU 8 ;Data Carrier Detect (Pin is Inverted) SYHUNT EQU 10H ;Sync/Hunt CTS EQU 20H ;Clear To Send TXUDRN EQU 40H ;Tx Underrun/End Of Message BRKABO EQU 80H ;Break/Abort ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; RR1 ; ALLSNT EQU 1 ;All Sent (=1 in Sync Modes) RC07 EQU 0EH ;Residue Codes PARER EQU 10H ;Parity Error RXORER EQU 20H ;Rx Overrun Error CRCER EQU 40H ;CRC/Framing error EOFRM EQU 80H ;End Of Frame (SDLC only ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; RR2 ; ; Int Vector (Ch-B only) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SIOINA EQU 40H ;SIO INTA Port SIOADT EQU 44H ;SIO A Data Port SIOACS EQU 45H ;SIO A Control/Status Port SIOBDT EQU 46H ;SIO B Data Port SIOBCS EQU 47H ;SIO B Control/Status Port ; ; ; ;************************************************************** ; ;INCLUDE IQNMCR.MCR ;@ ; SIOAWR: ;zapis posloupnosi bytu do ridiciho portu SIOACS XTHL PUSH B MOV B,M ;pocet bytu SIOWR2: INX H MOV A,M OUT SIOACS DCR B JNZ SIOWR2 INX H POP B XTHL RET ; ; ININET: ;****** CALL SIOAWR DB 10 DB RWR0 DB RWR0+RSTCHL DB RWR1 DB 0 DB RWR4 DB MOSDLC DB RWR3 DB RXB8PC+RXCRCE DB RWR7 DB 7EH IN SIOADT IN SIOADT IN SIOADT RET ; WRNET: ;****** POP H POP D ;DE = adresa bloku POP B ;C = delka bloku IN P591 PUSH PSW ;stara maska preruseni MVI A,BRKMSK OUT P591 EI CALL ININET CALL SIOAWR DB 5 DB RWR5+RSTERR DB TXCRCE+TX8BPC+RTS DB RWR5+RSTEXI DB TXCRCE+TX8BPC+TXEN+RTS DB RSTTXC LDAX D OUT SIOADT INX D DCR C MVI A,RSTTXU OUT SIOACS WRNET2: ;zapis bajtu, C:=C-1, DE:=DE+1 IN SIOACS ANI TXEMPT JZ WRNET2 LDAX D OUT SIOADT INX D DCR C JNZ WRNET2 MVI C,3 WRNET6: MVI A,RSTEXI OUT SIOACS IN SIOACS ANI TXEMPT+TXUDRN CPI TXEMPT+TXUDRN JNZ WRNET6 WRNET9: ;zapis, aby se vyprazdnil vysilac IN SIOACS ANI TXEMPT JZ WRNET9 OUT SIOADT DCR C JNZ WRNET9 MVI A,RWR5+RSTEXI OUT SIOACS ;odpojeni vysilace MVI A,TXCRCE+TX8BPC OUT SIOACS POP PSW OUT P591 IPCHL: PCHL ; ; ; RDNETL: ;cteni bloku s dlouhym timoutem MVI B,255 DB 21H ;LXI H ; RDNETT: ;cteni bloku s timoutem ;****** TOCNT EQU $+1 MVI B,40 ;pocatecni hodnota citace timoutu DB 21H ;LXI H ; RDNET: ;cteni bloku ;****** MVI B,0 RDNET1: POP H POP D ;DE = adresa bufferu XTHL ;HL = adresa citace delky IN P591 PUSH PSW ;stara maska preruseni MVI A,BRKMSK OUT P591 EI CALL ININET MVI A,RWR6 OUT SIOACS LDAX D OUT SIOACS ;adresa prijemce MOV C,M ;maximalni delka MVI M,0 ;skutecna delka MVI A,RWR3+RSTERR+RSTRXC OUT SIOACS LDAX D INR A MVI A,RXB8PC+RXCRCE+HUNTPH JZ RDNET2 ;adresa prijemce=255, prijimat vse ORI ADRSRC RDNET2: OUT SIOACS PUSH PSW MVI A,RWR3+RSTRXC OUT SIOACS POP PSW ORI RXEN OUT SIOACS RDBLK4: IN SIOACS ANI RXCHAV+BRKABO JM ABONET JPO RDBLK6 CALL TOTST MVI A,RWR1 OUT SIOACS IN SIOACS ORA A JP RDBLK4 ; ENDFRM: ANI PARER+RXORER+CRCER MOV B,A ENDFR1: DI POP PSW OUT P591 MOV A,B ;obnoveni masky preruseni RET ; ABONET: MVI B,BRKABO JMP ENDFR1 ; RDBLK5: ;!!! vzhledem k tomu, ze SIO v modu "preruseni pri prijmu prveho znaku" ; po prijmu posledniho znaku nenuluje bit RXCHAV v RR0, je treba testovat ; i RR1. Pro dosazeni dostatecne rychlosti se 2x cte a pak testuje EOFRM v RR1 IN SIOACS ANI RXCHAV JZ RDBLK7 RDBLK6: IN SIOADT ;prijaty bajt STAX D ;ulozen do buf INX D ;inkrement pointru INR M ;inkrement skutecne delky DCR C ;dekrement maximalni delky JZ RDBLK8 ;prenesen pozadovany pocet bajtu RDBLK7: IN SIOACS ANI RXCHAV+BRKABO JM ABONET JPE RDBLKB IN SIOADT STAX D INX D INR M DCR C JZ RDBLK8 RDBLKB: MVI A,RWR1+RSTEXI OUT SIOACS IN SIOACS ORA A JP RDBLK5 JMP ENDFRM ; RDBLK8: IN SIOACS ANI RXCHAV+BRKABO JM ABONET JPE RDBLK9 ;alespon jeden neocekavany znak IN SIOADT IN SIOADT MVI M,255 ;precteno vice nez pozadovana delka RDBLK9: MVI A,RWR1+RSTEXI OUT SIOACS IN SIOACS ORA A JP RDBLK8 JMP ENDFRM ; ; TOTST: ;test na vyprseni timoutu INR B DCR B RZ DCR B RNZ POP D POP PSW OUT P591 ;obniveni masky preruseni MVI A,1 ;chyba, vyprseni timoutu RET ; ENINET: ;inicializace site pro prijem pod prerusenim DI CALL ININET MVI A,RWR6 OUT SIOACS CALL IQSNMB OUT SIOACS CALL SIOAWR DB 6 DB RWR1 DB EIRXFC DB RWR3+RSTERR+RSTRXC DB RXB8PC+RXCRCE+HUNTPH+ADRSRC DB RWR3+RSTRXC DB RXB8PC+RXCRCE+HUNTPH+ADRSRC+RXEN LXI H,BUFNET MVI M,0 RET ; RDINET: ;docteni zpravy po preruseni prijmem prveho znaku ;******* LXI D,BUFNET+1 ;adresa bufferu LXI H,BUFNET ;adresa citace MVI M,1 IN SIOADT STAX D INX D ;prvni byte LXI B,254 ;neni timout, max. 255 znaku IN SIOINA ;INTA pro SIO CALL RDINX MOV C,A MVI A,RETI OUT SIOACS ;RETI PRO SIO MOV A,C RET ; RDINX: IN P591 PUSH PSW MVI A,BRKMSK OUT P591 MVI A,EOI OUT P590 EI JMP RDBLK7 ; EXINET: ;test byla-li prijata vyzva - jestlize ano, potvrzeni a provedeni ;******* LXI H,BUFNET MOV A,M CPI 3 MVI A,0 RC ;zprava kratsi nez 3 byte INX H ;adresa prijemce INX H ;typ zpravy MOV A,M CPI TINTRQ MVI A,0 RNZ ;neni vyzva INX H PUSH H LXI H,2 PUSH H LXI H,INTABL PUSH H CALL WRNET ;potvrzeni vyzvy POP H CALL IPCHL MVI A,1 RET ; INTABL: DB 0,TINTAC ;zprava potvrzeni vyzvy ; INTNET: ;standarni zpracovani preruseni prvnim znakem ;******* PUSH PSW SHLD NINHL ;prepnuti na vlastni zasobnik LXI H,0 DAD SP SHLD NINSP LXI SP,NINSTK PUSH B ;uschova registru PUSH D CALL RDINET ;precteni zpravy ORA A CZ EXINET ;zpracovani spravne prectene zpravy CALL ENINET ;inicializace prijmu dalsi zpravy POP D POP B LHLD NINSP SPHL LHLD NINHL POP PSW EI RET ; BRKOON: ;zakaz vsech preruseni s vyjimkou BREAK ;******* DI IN P591 STA INTMSV MVI A,BRKABO OUT P591 EI RET ; BRKOOF: ;obnova stavu pred volanim BRKOON ;******* DI LDA INTMSV OUT P591 EI RET ; DELAY: ;zpozdeni ;******* MVI B,30 DELAY2: DCR B RZ JMP DELAY2 ; END