DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦c2744face⟧ TextFile

    Length: 6811 (0x1a9b)
    Types: TextFile
    Names: »COMMAND.S«

Derivation

└─⟦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« 

TextFile

!******************************************************************************
*
*		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

!