|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks 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
!