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

⟦edf2f8547⟧ TextFile

    Length: 9541 (0x2545)
    Types: TextFile
    Names: »STATUS.BUF.S«

Derivation

└─⟦a3edd706e⟧ Bits:30005202 8" Zilog MCZ/1 Floppy CR80FD_0028 ( TC 500 SEC. PROTOCOL BACK UP ! (V1) BB A1 820907 NCJ )
    └─ ⟦this⟧ »STATUS.BUF.S« 
└─⟦e12128f26⟧ Bits:30005200 8" Zilog MCZ/1 Floppy CR80FD_0026 ( TC 500 SEC. PROTOCOL BB V1 830407 NCJ )
    └─ ⟦this⟧ »STATUS.BUF.S« 

TextFile

!***************************************************************************
*
*		FORMAT_STATUS_BUFFER  MODULE
*
***************************************************************************!
FORMAT_STATUS_BUFFER 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
 
CONSTANT
   CLEAR_OVERLOAD        := %09
   LINE_IS_UP            := %10
   LINE_IS_DOWN          := %11
   CLUSTER_UP            := %F0
   CLUSTER_DOWN          := %80
   TERMINAL_DOWN         := %15
   CLUSTER_REMOVE        := %0
   CALL_RECEIVED         := %17
   LINE_STAT             := %18
   OVERLOAD              := %FF
   CADERROR		 := %31
   CLR_ERROR		 := %30
   ACK			 := %06
   NACK			 := %15
   LINE_UP_COMMAND	 := %40
   LINE_DOWN_COMMAND	 := %80
   LINE_UP		 := 0
   EMPTY		 := 0
 
   ! OPCODE VALUES TO CR80 !
 
   LNCLUP                := %63
   LNCLDW                := %64
   LNTMDW                := %55
   LNUP                  := %52
   LNDOWN                := %53
   LNCLRM                := %59
   CALL_DETECTED         := %58
   LNROCM                := %57
   LNLNST                := %56
 
   ! CONSTANTS REFERRING TO BUFFER_HEAD !
 
   BYTE_COUNT_OFFSET     := 1
   STATUS_OFFSET         := 2
   OK                    := %4000
 
   ! CONSTANTS REFERRING TO DATA IN BUFFER !
 
   OPCODE_OFFSET         := 0
   LINE_NO_OFFSET         := 1
   AD1_OFFSET             := 3
   AD2_OFFSET            := 2
   ERR0_OFFSET		 := 23
   ERR1_OFFSET		 := 24
 
 
   ! CONSTANTS REFERRING TO OFFSET IN PARAM_TABLE !
 
   CR80_RESP_QUEU     := 0
   SIO_OUTPUT_QUEU    := 1
   SIO_INPUT_QUEU     := 2
   RETRANS_QUEU       := 3
   MONITOR_QUEU       := 4
   LINE_NO            := 5
   CH_NO              := 6
   MONITOR_STATUS     := 7
   CR80_RESP          := 8
   CR80_COMM          := 9
 
EXTERNAL
 
   GETBUF PROCEDURE (QUEU_ADDRESS QUEU_HEAD_PTR) RETURNS (BUF_PTR REC_PTR)
   PUTMES PROCEDURE (QUEU_NO BYTE,BUF_PTR REC_PTR)
   OVLDET PROCEDURE (P DATA_PTR) RETURNS (STATUS BYTE)
   LHROUT PROCEDURE (BUF_PTR REC_PTR)
   OUTLHR PROCEDURE (BUF_PTR REC_PTR,LINE_NO BYTE)
   DLCBUF PROCEDURE (BUF_PTR REC_PTR,DLC BYTE)
   TX PROCEDURE (BUF_PTR REC_PTR,DLC BYTE,P DATA_PTR)
   LINEUP PROCEDURE (CH_NO BYTE) RETURNS (STATUS BYTE)
   PUTBUF PROCEDURE (QUEU_ADDRESS QUEU_HEAD_PTR,BUF_PTR REC_PTR)
GLOBAL
!ECHO \f

!
!***********************************************************************
* PROCEDURE	: FORMATS CLUSTER STATUS BUFFER ACCORDING TO COMMAND
*		  AND SENDS STATUS BUFFER TO CR80
*
* INPUTS	: AD1     : FIRST BYTE OF CLUSTER ADDRESS
*		  AD2     : SECOND BYTE OF CLUSTER ADDRESS
*		  COMMAND : TYPE OF STATUS BUFFER
*		  P	  : POINTER TO PARAMETER TABLE
*
* OUTPUTS	: NONE
**********************************************************************!
   CL_TERM_STATUS_BUFFER PROCEDURE (AD1,AD2,COMMAND BYTE,P DATA_PTR)
   LOCAL
      BUF_PTR REC_PTR
      OPCODE,I BYTE
   ENTRY
 
      ! GET POINTER TO EMPTY BUFFER !
 
      BUF_PTR := GETBUF (P^.W)
    
 
      IF COMMAND
      CASE CLUSTER_UP THEN OPCODE := LNCLUP
      CASE CLUSTER_DOWN THEN OPCODE := LNCLDW
      CASE CLUSTER_REMOVE THEN OPCODE := LNCLRM
      FI
 

      ! INSERT OPCODE AND LINE_NO IN BUFFER !
 
      BUF_PTR^.DATA[OPCODE_OFFSET] := OPCODE
      BUF_PTR^.DATA[AD1_OFFSET] := AD1
      BUF_PTR^.DATA[LINE_NO_OFFSET] := P^.B[LINE_NO]
      BUF_PTR^.DATA[AD2_OFFSET] := AD2
      I := 4
      DO
         BUF_PTR^.DATA[I] := 0
         I += 1
         IF I = 12 THEN EXIT FI
      OD
 
      ! UPDATE BUFFERHEAD !
 
      BUF_PTR^.BUFF_HEAD[BYTE_COUNT_OFFSET] := 12
      BUF_PTR^.BUFF_HEAD[STATUS_OFFSET] := OK
      BUF_PTR^.STAADR := #BUF_PTR^.DATA[OPCODE_OFFSET]
 
      ! SEND BUFFER TO CR80 INTERFACE QUEU !
    
      PUTMES (P^.B[CR80_RESP_QUEU],BUF_PTR)
   END CL_TERM_STATUS_BUFFER
 
 
!ECHO \f

!
!***********************************************************************
* PROCEDURE	: LINE_STATUS_BUFFER
*
* FUNCTION	: FORMATS LINE STATUS BUFFER ACCORDING TO COMMAND AND 
*		  SENDS STATUS BUFFER TO CR80
*
* INPUTS	: COMMAND : TYPE OF STATUS BUFFER
*		  P	  : POINTER TO PARAMETER TABLE
*
* OUTPUTS	: NONE
**********************************************************************!
   LINE_STATUS_BUFFER PROCEDURE (COMMAND BYTE,P DATA_PTR)
   LOCAL
      BUF_PTR REC_PTR
      OPCODE,I BYTE
   ENTRY
 
      ! GET POINTER TO EMPTY BUFFER !
 
      BUF_PTR := GETBUF (P^.W)
    

      IF COMMAND
      CASE LINE_IS_UP THEN OPCODE := LNUP
      CASE LINE_IS_DOWN THEN OPCODE := LNDOWN
      CASE CLEAR_OVERLOAD THEN OPCODE := LNROCM
      FI
 

 
      ! INSERT OPCODE AND LINE_NO IN BUFFER !
 
      BUF_PTR^.DATA[OPCODE_OFFSET] := OPCODE
      BUF_PTR^.DATA[LINE_NO_OFFSET] := P^.B[LINE_NO]
      I := 2
      DO
         BUF_PTR^.DATA[I] := 0
         I += 1
         IF I = 12 THEN EXIT FI
      OD
 
      ! UPDATE BYTE_COUNT, DATA_START_ADDRESS AND STATUS IN BUFFERHEAD !
 
      BUF_PTR^.BUFF_HEAD[BYTE_COUNT_OFFSET] := 12
      BUF_PTR^.BUFF_HEAD[STATUS_OFFSET] := OK
      BUF_PTR^.STAADR := #BUF_PTR^.DATA[OPCODE_OFFSET]
 
      ! SEND BUFFER TO CR80 INTERFACE QUEU !
 
      PUTMES (P^.B[CR80_RESP_QUEU],BUF_PTR)
 
   END LINE_STATUS_BUFFER
!ECHO \f

!
!******************************************************************************
* PROCEDURE	: CAD_ERROR
*
* FUNCTION	: THE BUFFER IS REFORMATTED TO OUTPUT_TO_CR80 FORMAT, ERROR
*		  STATUS IS SET, INDICATING ILLEGAL CLUSTER ADDRESS AND THE
*		  BUFFER IS SENT TO CR80
*
* INPUTS	: BUF_PTR : POINTER TO BUFFER
*		  P	  : POINTER TO PARAMETER TABLE
*
* OUTPUTS	: NONE
*****************************************************************************!
   CAD_ERROR PROCEDURE (BUF_PTR REC_PTR,P DATA_PTR)
 
   ENTRY
 
      IF OVLDET (P) <> OVERLOAD THEN
 
	 ! REFORMAT BUFFER TO CR80 FORMAT !
	 LHROUT (BUF_PTR)
	 OUTLHR (BUF_PTR,P^.B[LINE_NO])
 
	 BUF_PTR^.DATA[ERR0_OFFSET] := CADERROR
	 BUF_PTR^.DATA[ERR1_OFFSET] := CLR_ERROR
 
	 ! SEND BUFFER TO CR80 INTERFACE QUEUE !
	 PUTMES (P^.B[CR80_RESP_QUEU],BUF_PTR)
      ELSE
	 ! ENQUE BUFFER IN EMPTY BUFFER QUEUE !
	 PUTBUF (P^.W,BUF_PTR)
      FI
   END CAD_ERROR
!ECHO \f

!
!******************************************************************************
* PROCEDURE	: CR80BUF
*
* FUNCTION	: IF NO CR80 OVERLOAD, THE BUFFER IS REFORMATTED TO OUTPUT_TO_
*		  CR80 FORMAT AND SENT TO CR80, AND AN ACK IS TRANSMITTED ON
*		  LINE.
*		  IF CR80 OVERLOAD, A NACK IS TRANSMITTED ON LINE.
*
* INPUTS	: BUF_PTR : POINTER TO BUFFER
*		  P	  : POINTER TO PARAMETER TABLE
*
* OUTPUTS	: NONE
*****************************************************************************!
 
   CR80BUF PROCEDURE (BUF_PTR REC_PTR,P DATA_PTR)
 
   LOCAL
      OUTPUT_BUF_PTR REC_PTR
   ENTRY
 
      IF OVLDET (P) <> OVERLOAD THEN
 
	 ! REFORMAT BUFFER TO CR80 FORMAT !
	 OUTLHR (BUF_PTR,P^.B[LINE_NO])
 
	 ! SEND BUFFER TO CR80 INTERFACE QUEUE !
	 PUTMES (P^.B[CR80_RESP_QUEU],BUF_PTR)
 
	 ! ACK MESSAGE !
	 OUTPUT_BUF_PTR := GETBUF (P^.W)
	 DLCBUF (OUTPUT_BUF_PTR,ACK)
	 TX (OUTPUT_BUF_PTR,ACK,P)
      ELSE
	 ! NACK MESSAGE !
	 DLCBUF (BUF_PTR,NACK)
	 TX (BUF_PTR,NACK,P)
      FI
   END CR80BUF
!ECHO \f

!
!***********************************************************************
* PROCEDURE	: DOWN_MESS
*
* FUNCTION	: IF LTU IS NOT IN OVERLOAD, A LINE_DOWN MESSAGE IS SENT
*		  TO CR80
*
* INPUTS	: P : POINTER TO PARAMETER TABLE
*
* OUTPUTS	: NONE
**********************************************************************!
   DOWN_MESS PROCEDURE (P DATA_PTR)
   ENTRY
      IF OVLDET (P) <> OVERLOAD THEN
         P^.B[CR80_RESP] := LINE_IS_DOWN
         LINE_STATUS_BUFFER (LINE_IS_DOWN,P)
      FI
   END DOWN_MESS
!ECHO \f

!
!***********************************************************************
* PROCEDURE	: LINE_MON
*
* FUNCTION	: IF A LINE_UP COMMAND HAS BEEN GIVEN, THE LINE WILL BE
*		  SET UP. IF THE CURRENT STATE OF THE LINE HAS NOT BEEN
*		  REPORTED TO THE CR80 ALLREADY, A LINE STATUS BUFFER IS
*		  SENT
*
* INPUTS	: P : POINTER TO PARAMETER TABLE
*
* OUTPUTS	: NONE
**********************************************************************!
   LINE_MON PROCEDURE (P DATA_PTR)
   LOCAL
      LINE_STATUS,CL_NO BYTE
      CAD1,CAD2,STATUS BYTE
   ENTRY
  
      ! IF LINE_UP COMMAND FROM CR80 IS RECEIVED !
 
      IF P^.B[CR80_COMM] = LINE_UP_COMMAND THEN
        LINE_STATUS := LINEUP (P^.B[CH_NO])
   
        IF LINE_STATUS = LINE_UP THEN
   
           ! IF LAST RESPONS TO CR80 WAS LINE_DOWN !
   
           IF P^.B[CR80_RESP] = LINE_IS_DOWN ANDIF OVLDET (P) <> OVERLOAD THEN
   
              ! SEND LINE_UP RESPONS TO CR80 AND REMEMBER RESPONS !
   
              P^.B[CR80_RESP] := LINE_IS_UP
              LINE_STATUS_BUFFER (LINE_IS_UP,P)
           FI
        ELSE    ! LINE_STATUS = DOWN !
   
           ! IF LAST RESPONS TO CR80 WAS LINE_UP !
   
           IF P^.B[CR80_RESP] = LINE_IS_UP THEN
   
              ! SEND LINE_DOWN REPONS TO CR80 AND REMAEMBER RESPONS !
   
              ! AND SEND STATUS BUFFERS TO CR80 !
   
              DOWN_MESS (P)
           FI
        FI
     ELSE
        IF P^.B[CR80_RESP] = LINE_IS_UP THEN
           DOWN_MESS (P)
        FI
     FI
  END LINE_MON
END FORMAT_STATUS_BUFFER
!ECHO \f

!