|
DataMuseum.dkPresents historical artifacts from the history of: Zilog MCZ Floppy Disks |
This is an automatic "excavation" of a thematic subset of
Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6811 (0x1a9b) Types: TextFile Names: »COMMAND.S«
└─⟦a3edd706e⟧ Bits:30005202 8" Zilog MCZ/1 Floppy CR80FD_0028 ( TC 500 SEC. PROTOCOL BACK UP ! (V1) BB A1 820907 NCJ ) └─⟦this⟧ »COMMAND.S« └─⟦e12128f26⟧ Bits:30005200 8" Zilog MCZ/1 Floppy CR80FD_0026 ( TC 500 SEC. PROTOCOL BB V1 830407 NCJ ) └─⟦this⟧ »COMMAND.S«
!****************************************************************************** * * COMMAND_INTERPRETER MODULE * ******************************************************************************! COMMAND_INTERPRETER MODULE TYPE BUFFER RECORD [BUFF_HEAD ARRAY[4 WORD] STAADR ^BYTE DATA ARRAY[504 BYTE ]] REC_PTR ^BUFFER CONFIG_TABLE ARRAY [10,4 BYTE] CONFIG_TAB_PTR ^CONFIG_TABLE QUEU_HEAD ARRAY [8 BYTE] QUEU_HEAD_PTR ^QUEU_HEAD PWQ_HEAD ARRAY [8 BYTE] PWQ_PTR ^PWQ_HEAD TRQ_HEAD ARRAY [8 BYTE] TRQ_PTR ^TRQ_HEAD PARAM_TABLE RECORD [B ARRAY[20 BYTE] W QUEU_HEAD_PTR P CONFIG_TAB_PTR PWQ PWQ_PTR TRQ TRQ_PTR] DATA_PTR ^PARAM_TABLE PROCESS_TABLE RECORD [B ARRAY[4 BYTE] POLL_RATE WORD] TABLE_PTR ^PROCESS_TABLE EXTERNAL LINEDO PROCEDURE (CH_NO BYTE) LINE_MON PROCEDURE (P DATA_PTR) INSERT_CAD PROCEDURE (CAD1,CAD2 BYTE,PCT CONFIG_TAB_PTR) CHECK_CAD PROCEDURE (CAD1,CAD2 BYTE,PCT CONFIG_TAB_PTR) RETURNS (STATUS BYTE) CAD_ERROR PROCEDURE (BUF_PTR REC_PTR,P DATA_PTR) PWQBUF PROCEDURE (CAD1,CAD2 BYTE,PWQ PWQ_PTR) RETURNS (BUF_PTR REC_PTR) REM_CAD PROCEDURE (CAD1,CAD2 BYTE,PCT CONFIG_TAB_PTR) CL_TERM_STATUS_BUFFER PROCEDURE (CAD1,CAD2,COMMAND BYTE,P DATA_PTR) CHANGE PROCEDURE (CH_NO,SPEED BYTE) LHROUT PROCEDURE (BUF_PTR REC_PTR) PUTBUF PROCEDURE (QUEU_ADDRESS QUEU_HEAD_PTR,BUF_PTR REC_PTR) PUTPWQ PROCEDURE (QUEU_ADDRESS PWQ_PTR,BUF_PTR REC_PTR) ENTER_CRITICAL_SECTION PROCEDURE (P DATA_PTR) EXIT_CRITICAL_SECTION PROCEDURE (P DATA_PTR) OVLDET PROCEDURE (P DATA_PTR) RETURNS (STATUS BYTE) TRQBUF PROCEDURE (CAD1,CAD2 BYTE,TRQ TRQ_PTR) RETURNS (BUF_PTR REC_PTR) REST PROCEDURE POLOVL PROCEDURE (P DATA_PTR) RETURNS (STATUS BYTE) CONSTANT NO_ERROR := 0 CLUSTER_REMOVE := %16 EMPTY := 0 TRUE := %FF FALSE := 0 LINE_UP_COMMAND := %40 DIAL_UP_MODE := %FF NORMAL := 0 OVERLOAD := %FF LINE_DOWN_COMMAND := %80 NO_OF_CLUSTERS := 10 CLR_ERROR := %30 ! CONSTANTS REFERRING TO DATA IN INPUT_BUFFER ! CAD1_OFFSET := 8 CAD2_OFFSET := 7 L_C1_OFFSET := 26 L_C2_OFFSET := 25 ERR0_OFFSET := 23 ERR1_OFFSET := 24 ACC0_TIME_OFFSET := 41 ACC1_TIME_OFFSET := 42 ACC2_TIME_OFFSET := 43 ACC3_TIME_OFFSET := 44 BAUD_RATE_OFFSET := 7 OPCODE_OFFSET := 5 LINE_NO_OFFSET := 6 STATUS_OFFSET := 2 ! OPCODE VALUES FROM CR80 ! LINE_UP := %60 LINE_DOWN := %61 CL_ASSIGN := %65 CL_REMOVE := %59 START_ANSWER_POLL := %5B STOP_ANSWER_POLL := %5C DATA_PACK := %50 CH_SPEED := %62 ! CONSTANTS REFERRING TO OFFSET IN PARAM_TABLE ! CR80_RESP_QUEU := 0 LINE_NO := 5 CH_NO := 6 CR80_RESP := 8 CR80_COMM := 9 ! CONSTANTS REFERRING TO OFFSET IN PROCESS_TABLE ! POLL_COMMAND := 0 GLOBAL !ECHO \f ! !*********************************************************************** * PROCEDURE : COMMAND_HANDLER * * FUNCTION : THE PROCEDURE GETS A COMMAND BUFFER OR DATA PACKET * FROM CR80 AND TAKES THE CORRESPONDING ACTION * * INPUTS : BUF_PTR : POINTER TO COMMAND/DATA BUFFER * T : POINTER TO PROCESS TABLE * P : POINTER TO PARAMETER TABLE * * OUTPUTS : NONE **********************************************************************! COMMAND_HANDLER PROCEDURE (BUF_PTR REC_PTR,T TABLE_PTR,P DATA_PTR) LOCAL OPCODE,I BYTE INPUT_BUF_PTR REC_PTR ENTRY ! IF EOT-INDICATION THEN ! IF BUF_PTR^.BUFF_HEAD[STATUS_OFFSET] AND %4000 <> 0 THEN ! ORDINARY COMMAND BUFFER ! ! SAVE LINE_NO IN PARAM_TABLE ! P^.B[LINE_NO] := BUF_PTR^.DATA[LINE_NO_OFFSET] ! READ OPCODE VALUE IN BUFFER ! OPCODE := BUF_PTR^.DATA[OPCODE_OFFSET] IF OPCODE CASE LINE_UP THEN P^.B[CR80_COMM] := LINE_UP_COMMAND LINE_MON (P) CASE LINE_DOWN THEN T^.B[POLL_COMMAND]:=FALSE P^.B[CR80_COMM] := LINE_DOWN_COMMAND LINEDO (P^.B[CH_NO]) LINE_MON (P) CASE CL_ASSIGN THEN ! INSERT CLUSTER IN CONFIG_TABLE ! INSERT_CAD (BUF_PTR^.DATA[CAD1_OFFSET],BUF_PTR^.DATA[CAD2_OFFSET],P^.P) CASE CL_REMOVE THEN ! DELETE CLUSTER FROM CONFIG_TABLE ! REM_CAD (BUF_PTR^.DATA[CAD1_OFFSET], BUF_PTR^.DATA[CAD2_OFFSET], P^.P) ! REMOVE POLL WAITING BUFFERS WITH SPECIFIED CLUSTER ADDRESS ! DO INPUT_BUF_PTR := PWQBUF (BUF_PTR^.DATA[CAD1_OFFSET], BUF_PTR^.DATA[CAD2_OFFSET], P^.PWQ) IF INPUT_BUF_PTR = NIL THEN EXIT FI PUTBUF (P^.W,INPUT_BUF_PTR) OD ! REMOVE TRANSMISSION BUFFER WITH SPECIFIED CLUSTER ADDRESS ! DO INPUT_BUF_PTR := TRQBUF (BUF_PTR^.DATA[CAD1_OFFSET], BUF_PTR^.DATA[CAD2_OFFSET], P^.TRQ) IF INPUT_BUF_PTR = NIL THEN EXIT FI PUTBUF (P^.W,INPUT_BUF_PTR) OD ! SEND CLUSTER REMOVED RESPONS TO CR80 ! IF OVLDET (P) <> OVERLOAD THEN CL_TERM_STATUS_BUFFER (BUF_PTR^.DATA[CAD1_OFFSET], BUF_PTR^.DATA[CAD2_OFFSET], EMPTY,P) FI CASE START_ANSWER_POLL THEN T^.B[POLL_COMMAND] := TRUE CASE STOP_ANSWER_POLL THEN T^.B[POLL_COMMAND] := FALSE CASE DATA_PACK THEN IF BUF_PTR^.DATA[L_C1_OFFSET] = 0 ANDIF BUF_PTR^.DATA[L_C2_OFFSET] = 0 THEN CAD_ERROR (BUF_PTR,P) ELSE I := CHECK_CAD (BUF_PTR^.DATA[L_C1_OFFSET], BUF_PTR^.DATA[L_C2_OFFSET], P^.P) IF I = NO_OF_CLUSTERS THEN CAD_ERROR (BUF_PTR,P) ELSE IF POLOVL (P) <> OVERLOAD THEN ! CLEAR ERROR- AND ACCUM.TIME-FIELDS ! BUF_PTR^.DATA[ERR0_OFFSET] := CLR_ERROR BUF_PTR^.DATA[ERR1_OFFSET] := CLR_ERROR BUF_PTR^.DATA[ACC0_TIME_OFFSET] := CLR_ERROR BUF_PTR^.DATA[ACC1_TIME_OFFSET] := CLR_ERROR BUF_PTR^.DATA[ACC2_TIME_OFFSET] := CLR_ERROR BUF_PTR^.DATA[ACC3_TIME_OFFSET] := CLR_ERROR ! REFORMAT BUFFER ! LHROUT (BUF_PTR) ! ENQUE BUFFER IN POLL WAITING QUEUE ! PUTPWQ (P^.PWQ,BUF_PTR) ELSE ! RETURN BUFFER TO LHR ! CAD_ERROR (BUF_PTR,P) FI FI FI CASE CH_SPEED THEN ENTER_CRITICAL_SECTION (P) CHANGE (P^.B[CH_NO],BUF_PTR^.DATA[BAUD_RATE_OFFSET]) EXIT_CRITICAL_SECTION (P) FI IF OPCODE <> DATA_PACK THEN PUTBUF (P^.W,BUF_PTR) FI ELSE CAD_ERROR (BUF_PTR,P) FI END COMMAND_HANDLER END COMMAND_INTERPRETER !ECHO \f !