|
|
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: 9541 (0x2545)
Types: TextFile
Names: »STATUS.BUF.S«
└─⟦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«
!***************************************************************************
*
* 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
!