|
|
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: 11020 (0x2b0c)
Types: TextFile
Names: »PLZ.QUEU.ASM«
└─⟦31b8a9b6a⟧ Bits:30005199 8" Zilog MCZ/1 Floppy CR80FD_0025 ( TC 500 SEC. PROTOCOL BB V2 830407 NCJ )
└─⟦this⟧ »PLZ.QUEU.ASM«
;****************************************************************************
;*
;* PLZ_QUEU MODULE
;*
;****************************************************************************
PLZ_QUEU MODULE
*INCLUDE PLZ.MACROS
;
CONSTANT
OVL := 0FFH
NO_OVL := 0
TRA_DEL := 2
CR80QUEU_OFFSET := 0
EMPTYQUEU_OFFSET := 20
;
EXTERNAL
SUBENQ
SIG
WAI
SYSRAM
RECI
SUBSEN
SRELEA
MESADD
SUBDEQ
SUBXDQ
;
GLOBAL
RCT1CH,RCT2CH,RCT3CH,RCT4CH WORD
;
GLOBAL
;ECHO \f
;**************************************************************************
;* PROCEDURE : GETBUF
;*
;* FUNCTION : THE CALLING PROCESS IS SCHEDULED, UNTIL A BUFFER IS
;* AVAILABLE FROM THE EMPTY BUFFER QUEUE
;*
;* INPUTS : QUEU_ADDRESS : POINTER TO EMPTY BUFFER QUEUE
;*
;* OUTPUTS : BUF_PTR : POINTER TO BUFFER
;**************************************************************************
GETBUF PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU_ADDRESS
PLZOUT BUF_PTR
ENT 0
DO
GETWORD H L,QUEU_ADDRESS
DI
PUSH IX
CALL SUBDEQ
POP IX
EI
IF C THEN
PUTWORD BUF_PTR, D E
EXIT
ELSE
PUSH IX
CALL SRELEASE
POP IX
FI
OD
RTN 1
END GETBUF
;
;ECHO \f
;**************************************************************************
;* PROCEDURE(S) : PUTBUF (PUTPWQ,PUTTRQ)
;*
;* FUNCTION : ENQUES BUFFER IN SPECIFIED QUEUE
;*
;* INPUTS : QUEU_ADDRESS : POINTER TO BUFFER QUEUE
;* BUF_PTR : POINTER TO BUFFER
;*
;* OUTPUTS : NONE
;**************************************************************************
PUTBUF PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU2_ADDRESS,BUF2_PTR
ENT 0
GETWORD H L, QUEU2_ADDRESS
GETWORD D E, BUF2_PTR
DI ;BUFFER (BUF_PTR) TO
PUSH IX
CALL SUBENQ ;QUEU (QUEU_ADDRESS)
POP IX
EI
RTN 2
END PUTBUF
PUTPWQ PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU3_ADDRESS,BUF3_PTR
ENT 0
GETWORD H L, QUEU3_ADDRESS
GETWORD D E, BUF3_PTR
DI
PUSH IX
CALL SUBENQ
POP IX
EI
RTN 2
END PUTPWQ
PUTTRQ PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU9_ADDRESS,BUF9_PTR
ENT 0
GETWORD H L, QUEU9_ADDRESS
GETWORD D E, BUF9_PTR
DI
PUSH IX
CALL SUBENQ
POP IX
EI
RTN 2
END PUTTRQ
;
;ECHO \f
;**************************************************************************
;* PROCEDURE : RECX
;*
;* FUNCTION : WAIT UNTIL A MESSAGE IS SEND TO THE SPEC.SEMAPHORE
;* OR, IF DELAY IS SPECIFIED, TO THE DELAY HAS ELAPSED
;*
;* INPUTS : QUEU_NO : NUMBER OF SEMAPHORE QUEUE
;* DELAY = 0 : NO TIMEOUT FUNCTION
;* DELAY <> 0 : MAX WAIT TIME IN UNITS OF 12.5 MSEC
;* CH_NO : NUMBER OF CHANNEL
;*
;* OUTPUT : BUF_PTR = NIL IF MESSAGE NOT RECEIVED (TIMEOUT)
;* BUF_PTR <> NIL IF MESSAGE RECEIVED
;****************************************************************************
RECX PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU4_NO MAKS4_DELAY CHA4_NO
PLZOUT BUF4_PTR
ENT 0
GETBYTE A,MAKS4_DELAY
GETBYTE E,CHA4_NO
AND A
IF NZ THEN
BIT 0,E
IF Z THEN
BIT 1,E
IF Z THEN
LD (RCT4CH),A
ELSE
LD (RCT2CH),A
FI
ELSE
BIT 1,E
IF Z THEN
LD (RCT1CH),A
ELSE
LD (RCT3CH),A
FI
FI
FI
LD B,0
DO
LD DE,SYSRAM+240H
LD H,0
GETBYTE L,QUEU4_NO
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD A,(HL)
ADD A,7FH
IF M THEN
LD (SYSRAM+0E2H),HL
PUSH IX
CALL RECI
POP IX
CALL MESADD
IF C THEN
PUTWORD BUF4_PTR, D E
LD B,1
ELSE
LD B,0
FI
ELSE
GETBYTE A,MAKS4_DELAY
AND A
IF NZ THEN
GETBYTE E,CHA4_NO
BIT 0,E
IF Z THEN
BIT 1,E
IF Z THEN
LD A,(RCT4CH)
ELSE
LD A,(RCT2CH)
FI
ELSE
BIT 1,E
IF Z THEN
LD A,(RCT1CH)
ELSE
LD A,(RCT3CH)
FI
FI
AND A
IF Z THEN
LD DE,00
PUTWORD BUF4_PTR,D E
LD B,1
FI
FI
FI
LD A,B
AND A
IF NZ THEN
EXIT
ELSE
PUSH BC
PUSH IX
CALL SRELEA
POP IX
POP BC
FI
OD
RTN 3
END RECX
;ECHO \f
;**************************************************************************
;* PROCEDURE : GETMES
;*
;* FUNCTION : WAIT UNTIL A MESSAGE IS SENT TO THE SPECIFIED SEMAPHORE
;*
;* INPUTS : QUEU_NO : NO.OF SEMAPHORE QUEUE
;*
;* OUTPUTS : BUF_PTR : POINTER TO MESSAGE BUFFER
;**************************************************************************
GETMES PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU5_NO
PLZOUT BUF5_PTR
ENT 0
LD DE,SYSRAM+240H ;LOAD START OF Q.H.
LD H,0H
GETBYTE L, QUEU5_NO ;QUEU_NO * 8
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE ;ADD OF QUEU
LD (SYSRAM+0E2H),HL ;TO BE USET
PUSH IX
CALL RECI
CALL MESADD
POP IX
PUTWORD BUF5_PTR, D E ;ADD OF MESS.
RTN 1
END GETMES
;
;ECHO \f
;**************************************************************************
;* PROCEDURE : PUTMES
;*
;* FUNCTION : THE MESSAGE BUFFER IS SENT TO THE SPECIFIED SEMAPHORE
;*
;* INPUTS : QUEU_NO : NO.OF SEMAPHORE QUEUE
;* BUF_PTR : POINTER TO MESSAGE BUFFER
;*
;* OUTPUTS : NONE
;**************************************************************************
PUTMES PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU6_NO BUF6_PTR
ENT 0
LD DE,SYSRAM+240H ;LOAD START OF Q.H.
LD H,0H
GETBYTE L ,QUEU6_NO ;QUEU_NO * 8
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE ;ADD OF QUEU
GETWORD D E , BUF6_PTR ;GET BUF_PTR
PUSH IX
CALL SUBSEN
POP IX
RTN 2
END PUTMES
;
;ECHO \f
;**************************************************************************
;* PROCEDURE : WAIT
;*
;* FUNCTION : THE PROCESS IS HANGED ON THE SPECIFIED SEMAPHORE UNTIL A
;* SIGNAL IS RECEIVED
;*
;* INPUTS : QUEU_NO : NO.OF SEMAPHORE QUEUE
;*
;* OUTPUTS : NONE
;**************************************************************************
WAIT PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU7_NO
ENT 0
LD DE,SYSRAM+240H ;LOAD START OF Q.H.
LD H,0H
GETBYTE L, QUEU7_NO ;QUEU_NO * 8
ADD HL,HL ; = AKTUAL SEMAPHOR
ADD HL,HL
ADD HL,HL
ADD HL,DE ;ADD OF QUEU
LD (SYSRAM+0E4H),HL ;TO BE USET
PUSH IX
CALL WAI
POP IX
RTN 1
END WAIT
;
;ECHO \f
;**************************************************************************
;* PROCEDURE : SIGNAL
;*
;* FUNCTION : A SIGNAL IS SENT TO THE SPECIFIED SEMAPHORE
;*
;* INPUTS : QUEU_NO : NO.OF SEMAPHORE QUEUE
;*
;* OUTPUTS : NONE
;**************************************************************************
SIGNAL PROCEDURE
ENTRY
PLZVAR
PLZIN QUEU8_NO
ENT 0
LD DE,SYSRAM+240H ;LOAD START OF Q.H.
LD H,0H
GETBYTE L, QUEU8_NO ;QUEU_NO * 8
ADD HL,HL ; = AKTUAL SEMAPHOR
ADD HL,HL
ADD HL,HL
ADD HL,DE ;ADD OF QUEU
PUSH IX
CALL SIG ; TO BE USET
POP IX
RTN 1
END SIGNAL
;
;ECHO \f
;**************************************************************************
;* PROCEDURE : REST
;*
;* FUNCTION : THE CALLING PROCESS IS SCHEDULED
;*
;* INPUTS : NONE
;*
;* OUTPUTS : NONE
;**************************************************************************
REST PROCEDURE
ENTRY
PLZVAR
ENT 0
PUSH IX
CALL SRELEA
POP IX
RTN 0
END REST
;ECHO \f
;**************************************************************************
;* PROCEDURE : OVLDET
;*
;* FUNCTION : IF MORE THAN 3 BUFFERS IN SPECIFIED QUEUE, OVERLOAD
;* STATUS IS INDICATED
;*
;* INPUTS : P : POINTER TO PARAMETER TABLE
;*
;* OUTPUTS : STATUS : STATUS OF OVERLOAD CONDITION
;* STATUS = 00H : NO OVERLOAD
;* STATUS = FFH : OVERLOAD
;**************************************************************************
OVLDET PROCEDURE
ENTRY
PLZVAR
PLZIN PTAB
PLZOUT STATUS
ENT 0
GETWORD H L,PTAB
LD DE,CR80QUEU_OFFSET
ADD HL,DE
LD A,(HL)
LD L,A
LD H,0
LD DE, SYSRAM+240H
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
INC HL
LD A,(HL)
CP 03
IF M THEN
LD A,NO_OVL
ELSE
LD A,OVL
FI
PUTBYTE STATUS, A
RTN 1
END OVLDET
;ECHO \f
;**************************************************************************
;* PROCEDURE : POLOVL
;*
;* FUNCTION : IF LESS THAN 4 BUFFERS IN SPECIFIED EMPTY QUEUE, OVERLOAD
;* STATUS IS INDICATED
;*
;* INPUTS : P : POINTER TO PARAMETER TABLE
;*
;* OUTPUTS : STATUS : STATUS OF OVERLOAD CONDITION
;* STATUS = 00H : NO OVERLOAD
;* STATUS = FFH : OVERLOAD
;**************************************************************************
POLOVL PROCEDURE
ENTRY
PLZVAR
PLZIN PTAB1
PLZOUT STAT1
ENT 0
GETWORD H L,PTAB1
LD DE,EMPTYQUEU_OFFSET
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC DE
LD A,(DE)
CP 4
IF NC THEN
LD A,NO_OVL
ELSE
LD A,OVL
FI
PUTBYTE STAT1,A
RTN 1
END POLOVL
;ECHO \f
;***************************************************************************
;* PROCEDURE(S) : PWQBUF (TRQBUF)
;*
;* FUNCTION : GETS BUFFER WITH SPECIFIED CLUSTER ADDRESS FROM SPECIFIED
;* BUFFER QUEUE
;*
;* INPUTS : CAD1 : FIRST BYTE OF CLUSTER ADDRESS
;* CAD2 : SECOND BYTE OF CLUSTER ADDRESS
;* QUEU_ADDRESS : POINTER TO BUFFER QUEUE
;*
;* OUTPUTS : BUF_PTR = NIL : NO BUFFER AVAILABLE
;* BUF_PTR <> NIL : POINTER TO BUFFER
;***************************************************************************
PWQBUF PROCEDURE
ENTRY
PLZVAR
PLZIN C1,C2,QH1
PLZOUT BUF10_PTR
ENT 0
GETBYTE C,C1
GETBYTE B,C2
GETWORD H L, QH1
DI
PUSH IX
LD A,C
OR B
IF A
CASE 0 THEN
CALL SUBDEQ
ELSE
CALL SUBXDQ
FI
POP IX
EI
IF NC THEN
LD DE,00H
FI
PUTWORD BUF10_PTR, D E
RTN 3
END PWQBUF
TRQBUF PROCEDURE
ENTRY
PLZVAR
PLZIN C3,C4,QH2
PLZOUT BUF11_PTR
ENT 0
GETBYTE C,C3
GETBYTE B,C4
GETWORD H L, QH2
DI
PUSH IX
LD A,C
OR B
IF A
CASE 0 THEN
CALL SUBDEQ
ELSE
CALL SUBXDQ
FI
POP IX
EI
IF NC THEN
LD DE,00H
FI
PUTWORD BUF11_PTR, D E
RTN 3
END TRQBUF
;ECHO \f
;****************************************************************************
;* PROCEDURE : TDELAY
;*
;* FUNCTION : MAKES A 12.5 - 25.0 MSEC TRANSMISSION DELAY
;*
;* INPUTS : CH_NO : NUMBER OF CHANNEL
;*
;* OUTPUTS : NONE
;*****************************************************************************
TDELAY PROCEDURE
ENTRY
PLZVAR
PLZIN CHA_NO
ENT 0
GETBYTE E,CHA_NO
LD A,TRA_DEL
BIT 0,E
IF Z THEN
BIT 1,E
IF Z THEN
LD (RCT4CH),A
ELSE
LD (RCT2CH),A
FI
ELSE
BIT 1,E
IF Z THEN
LD (RCT1CH),A
ELSE
LD (RCT3CH),A
FI
FI
DO
PUSH IX
CALL SRELEA
POP IX
GETBYTE E,CHA_NO
BIT 0,E
IF Z THEN
BIT 1,E
IF Z THEN
LD A,(RCT4CH)
ELSE
LD A,(RCT2CH)
FI
ELSE
BIT 1,E
IF Z THEN
LD A,(RCT1CH)
ELSE
LD A,(RCT3CH)
FI
FI
AND A
IF Z THEN EXIT FI
OD
RTN 1
END TDELAY
END PLZ_QUEU
;ECHO \f