MODUL IQNSAT; (* realizace komunikacnich funkci satelitu *) GLOBAL IQSRDS,IQSWRS,IQSHEL; ORIGIN ENTRMON= 38H; CONST (*$W$IQNCON*) TYPE (*$W$IQNTYP*) EXTERNAL VAR IQSDMA:WORD; IQSDSK,IQSTRK,IQSSEC:BYTE; TRNBUF, (* VYSILACI BUFFER KOM.BIOSU *) RECBUF:TNETBLK; (* PRIJIMACI BUFFER KOM.BIOSU *) BUFLNG:BYTE; (* MAX. DELKA PRIJIMANE ZPRAVY *) RDVAL:BYTE; (* PRAC. PROMENNA KOM. BIOSU *) (*$W$IQNSBR*) (*****************************************) FUNCTION IQSNMB:BYTE;EXTERNAL; (* CISLO SATELITU *) (******************************************) SYSTEM PROCEDURE ENTRMON;EXTERNAL; (******************************************) PROCEDURE MOVES(D,S:WORD);EXTERNAL; (******************************************) PROCEDURE BRKOON; EXTERNAL; (* potlaceni vsech preruseni s vyjimkou BREAK*) (******************************************) PROCEDURE BRKOOF; EXTERNAL; (* obnova stavu pred volanim BRKOON *) (******************************************) PROCEDURE DELAY; EXTERNAL; (* zpozdeni mezi prectenim POOL a zapisem *) (******************************************) $Z0+ FUNCTION KICO:CHAR;EXTERNAL; (******************************************) PROCEDURE WRSTR(P:WORD);EXTERNAL; (******************************************) PROCEDURE WRHEXB(B:BYTE);EXTERNAL; (******************************************) PROCEDURE WRLN;EXTERNAL; $Z0- (*****************************************) FUNCTION NETERR:BYTE; BEGIN NETERR:=RDVAL; $Z0+ IF (RDVAL<>0) THEN BEGIN WRSTR(REF('PRIJAL JSEM BLOK S CHYBOU: $')); WRHEXB(RDVAL); WRLN; WRSTR(REF('OPAKOVAT-0 IGNOROVAT-1 CHYBA-2 ?: $')); NETERR:=ORD(KICO)-ORD('0')-1; END; $Z0- END; (*****************************************) $Z0+ FUNCTION RWSERR:BYTE; BEGIN RWSERR:=2; WRSTR(REF('PRIJAL JSEM BLOK OZNACUJICI R/W CHYBU V CENTRU$')); WRLN; WRSTR(REF('OPAKOVAT-0 IGNOROVAT-1 CHYBA-2 ?: $')); RWSERR:=ORD(KICO)-ORD('0'); END; $Z0- (******************************************) PROCEDURE WAIT; LABEL 1; BEGIN RECBUF.DSTADR:=IQSNMB; REPEAT 1: BUFLNG:=SIZE(TNETBLK,INTRBLK); RDVAL:=RDNET(RECBUF,BUFLNG); $Z0+ IF NETERR=1 THEN ENTRMON; $Z0- IF NETERR=0 THEN IF EXINET THEN GOTO 1; UNTIL (RECBUF.NBT=POOLBLK) AND (NETERR =0); END; (********************************************) $Z0+ PROCEDURE BADMESS(B:BYTE); BEGIN WRSTR(REF('MISTO BLOKU RDACK PRISEL BLOK CISLO: $')); WRHEXB(B); ENTRMON; END; $Z0- (********************************************) FUNCTION IQSRDS:BYTE; LABEL 1,2; BEGIN BRKOON; IQSRDS:=255; WITH TRNBUF DO BEGIN DSTADR:=0; NBT:=RDRQBLK; (* nasledujici prirazeni jsou automaicka, viz organizace RECBUF v modulu IQNSDS WITH RDRQB DO BEGIN RDSK:=IQSDSK; RTRK:=IQSTRK; RSEC:=IQSSEC; END; *) END; 2: WAIT; 1: DELAY; WRNET(TRNBUF,SIZE(TNETBLK,RDRQBLK)); BUFLNG:=SIZE(TNETBLK,RDACKBLK); RECBUF.DSTADR:=IQSNMB; RDVAL:=RDNET(RECBUF,BUFLNG); $Z0+ IF NETERR=1 THEN ENTRMON; $Z0- IF NETERR <> 0 THEN GOTO 2; WITH RECBUF DO BEGIN CASE NBT OF RDACKBLK: BEGIN IQSRDS:=0; MOVES(IQSDMA,REF(RECBUF.RSECT)); END; POOLBLK: BEGIN $Z0+ WRSTR(REF('MISTO BLOKU RDACK PRISEL POOLING$')); WRLN; GOTO 2; (* PO ODLADENI GOTO 1 *) $Z0- GOTO 1; END; RDRJBLK: $Z0+ CASE RWSERR OF 0: GOTO 2; 1: IQSRDS:=0; OTHERWISE:; END; $Z0- OTHERWISE: $Z0+ BADMESS(ORD(NBT)); $Z0- GOTO 2; END; END; BRKOOF; ENINET; (* umozni preruseni od SIOa *) END; (********************************************) FUNCTION IQSWRS:BYTE; LABEL 1,2; BEGIN BRKOON; IQSWRS:=255; WITH TRNBUF DO BEGIN DSTADR:=0; NBT:=WRRQBLK; (* nasledujici prirazeni jsou automaticka, viz organizaci RECBUF v modulu IQNSDS WITH WRRQB DO BEGIN WDSK:=IQSDSK; WTRK:=IQSTRK; WSEC:=IQSSEC; END; *) END; MOVES(REF(TRNBUF.WRRQB.WSECT),IQSDMA); 2: WAIT; 1: DELAY; WRNET(TRNBUF,SIZE(TNETBLK,WRRQBLK)); BUFLNG:=SIZE(TNETBLK,WRACKBLK); RECBUF.DSTADR:=IQSNMB; RDVAL:=RDNET(RECBUF,BUFLNG); $Z0+ IF NETERR=1 THEN ENTRMON; $Z0- IF NETERR <> 0 THEN GOTO 2; WITH RECBUF DO BEGIN CASE NBT OF WRACKBLK:IQSWRS:=0; POOLBLK: BEGIN $Z0+ WRSTR(REF('MISTO BLOKU WRACK PRISEL POOLING$')); WRLN; GOTO 2; (* PO ODLADENI GOTO 1 *) $Z0- GOTO 1; END; WRRJBLK: $Z0+ CASE RWSERR OF 0:GOTO 2; 1:IQSWRS:=0; OTHERWISE:; END; $Z0- OTHERWISE: $Z0+ BADMESS(ORD(NBT)); $Z0- GOTO 2; END; END; BRKOOF; ENINET; (* umozni preruseni od SIOa *) END; (**********************************************) PROCEDURE IQSHEL; LABEL 1,2; BEGIN BRKOON; WITH TRNBUF DO BEGIN DSTADR:=0; NBT:=HELBLK; END; 2: WAIT; 1: DELAY; WRNET(TRNBUF,SIZE(TNETBLK,HELBLK)); BUFLNG:=SIZE(TNETBLK,CNFBLK); RECBUF.DSTADR:=IQSNMB; RDVAL:=RDNET(RECBUF,BUFLNG); $Z0+ IF NETERR=1 THEN ENTRMON; $Z0- IF NETERR <> 0 THEN GOTO 2; WITH RECBUF DO BEGIN CASE NBT OF CNFBLK:MOVES(IQSDMA,REF(RECBUF.CNFB)); POOLBLK: BEGIN $Z0+ WRSTR(REF('MISTO BLOKU CNF PRISEL POOLING$')); WRLN; GOTO 2; (* PO ODLADENI GOTO 1 *) $Z0- GOTO 1; END; REJBLK: $Z0+ BEGIN WRSTR(REF('NEPRIPUSTNA IDENTIFIKACE UZIVATELE$')); WRLN; END $Z0- ; OTHERWISE: $Z0+ BADMESS(ORD(NBT)) $Z0- ; END; END; BRKOOF; END; (********************************************) END.