|
|
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: 12904 (0x3268)
Types: TextFile
Names: »PLZ.QUEU.S«
└─⟦31b8a9b6a⟧ Bits:30005199 8" Zilog MCZ/1 Floppy CR80FD_0025 ( TC 500 SEC. PROTOCOL BB V2 830407 NCJ )
└─⟦this⟧ »PLZ.QUEU.S«
;;****************************************************************************
;;*
;;* PLZ_QUEU MODULE
;;*
;;****************************************************************************
;PLZ_QUEU MODULE
*INCLUDE PLZ.MACROS
;;
;CONSTANT
; OVL := 0FFH
OVL EQU 0FFH
; NO_OVL := 0
NO_OVL EQU 0
; TRA_DEL := 2
TRA_DEL EQU 2
;
; CR80QUEU_OFFSET := 0
CR80QUEU_OFFSET EQU 0
; EMPTYQUEU_OFFSET := 20
EMPTYQUEU_OFFSET EQU 20
;;
;EXTERNAL
; SUBENQ
; SIG
; WAI
; SYSRAM
; RECI
; SUBSEN
; SRELEA
; MESADD
; SUBDEQ
; SUBXDQ
;;
;GLOBAL
EXTERNAL SUBXDQ,SUBDEQ,MESADD,SRELEA,SUBSEN,RECI,SYSRAM,WAI,SIG,SUBENQ
; RCT1CH,RCT2CH,RCT3CH,RCT4CH WORD
GLOBAL RCT4CH,RCT3CH,RCT2CH,RCT1CH
;;
;GLOBAL
RCT1CH DEFS 0002H
RCT2CH DEFS 0002H
RCT3CH DEFS 0002H
RCT4CH DEFS 0002H
;
;;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
GLOBAL GETBUF
; ENTRY
GETBUF:
PLZVAR
PLZIN QUEU_ADDRESS
PLZOUT BUF_PTR
ENT 0
; DO
DO00:
GETWORD H L,QUEU_ADDRESS
DI
PUSH IX
CALL SUBDEQ
POP IX
EI
; IF C THEN
JP NC,FI01
PUTWORD BUF_PTR, D E
; EXIT
JP OD00
; ELSE
JP FI02
FI01:
PUSH IX
CALL SRELEASE
POP IX
; FI
FI02:
; OD
JP DO00
OD00:
RTN 1
; END GETBUF
RET
;
;;
;;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
GLOBAL PUTBUF
; ENTRY
PUTBUF:
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
RET
;
; PUTPWQ PROCEDURE
GLOBAL PUTPWQ
; ENTRY
PUTPWQ:
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
RET
;
; PUTTRQ PROCEDURE
GLOBAL PUTTRQ
; ENTRY
PUTTRQ:
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
RET
;;
;;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
GLOBAL RECX
; ENTRY
RECX:
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
JP Z,FI03
BIT 0,E
; IF Z THEN
JP NZ,FI04
BIT 1,E
; IF Z THEN
JP NZ,FI05
LD (RCT4CH),A
; ELSE
JP FI06
FI05:
LD (RCT2CH),A
; FI
FI06:
; ELSE
JP FI07
FI04:
BIT 1,E
; IF Z THEN
JP NZ,FI08
LD (RCT1CH),A
; ELSE
JP FI09
FI08:
LD (RCT3CH),A
; FI
FI09:
; FI
FI07:
; FI
FI03:
;
LD B,0
; DO
DO0A:
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
JP P,FI0B
LD (SYSRAM+0E2H),HL
PUSH IX
CALL RECI
POP IX
CALL MESADD
; IF C THEN
JP NC,FI0C
PUTWORD BUF4_PTR, D E
LD B,1
; ELSE
JP FI0D
FI0C:
LD B,0
; FI
FI0D:
; ELSE
JP FI0E
FI0B:
GETBYTE A,MAKS4_DELAY
AND A
; IF NZ THEN
JP Z,FI0F
GETBYTE E,CHA4_NO
BIT 0,E
; IF Z THEN
JP NZ,FI10
BIT 1,E
; IF Z THEN
JP NZ,FI11
LD A,(RCT4CH)
; ELSE
JP FI12
FI11:
LD A,(RCT2CH)
; FI
FI12:
; ELSE
JP FI13
FI10:
BIT 1,E
; IF Z THEN
JP NZ,FI14
LD A,(RCT1CH)
; ELSE
JP FI15
FI14:
LD A,(RCT3CH)
; FI
FI15:
; FI
FI13:
AND A
; IF Z THEN
JP NZ,FI16
LD DE,00
PUTWORD BUF4_PTR,D E
LD B,1
; FI
FI16:
; FI
FI0F:
; FI
FI0E:
;
LD A,B
AND A
; IF NZ THEN
JP Z,FI17
; EXIT
JP OD0A
; ELSE
JP FI18
FI17:
PUSH BC
PUSH IX
CALL SRELEA
POP IX
POP BC
; FI
FI18:
; OD
JP DO0A
OD0A:
RTN 3
; END RECX
RET
;
;;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
GLOBAL GETMES
; ENTRY
GETMES:
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
RET
;;
;;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
GLOBAL PUTMES
; ENTRY
PUTMES:
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
RET
;;
;;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
GLOBAL WAIT
; ENTRY
WAIT:
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
RET
;;
;;ECHO \f
;;**************************************************************************
;;* PROCEDURE : SIGNAL
;;*
;;* FUNCTION : A SIGNAL IS SENT TO THE SPECIFIED SEMAPHORE
;;*
;;* INPUTS : QUEU_NO : NO.OF SEMAPHORE QUEUE
;;*
;;* OUTPUTS : NONE
;;**************************************************************************
; SIGNAL PROCEDURE
GLOBAL SIGNAL
; ENTRY
SIGNAL:
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
RET
;;
;;ECHO \f
;;**************************************************************************
;;* PROCEDURE : REST
;;*
;;* FUNCTION : THE CALLING PROCESS IS SCHEDULED
;;*
;;* INPUTS : NONE
;;*
;;* OUTPUTS : NONE
;;**************************************************************************
; REST PROCEDURE
GLOBAL REST
; ENTRY
REST:
PLZVAR
ENT 0
PUSH IX
CALL SRELEA
POP IX
RTN 0
; END REST
RET
;
;;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
GLOBAL OVLDET
; ENTRY
OVLDET:
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
JP P,FI19
LD A,NO_OVL
; ELSE
JP FI1A
FI19:
LD A,OVL
; FI
FI1A:
PUTBYTE STATUS, A
RTN 1
; END OVLDET
RET
;
;;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
GLOBAL POLOVL
; ENTRY
POLOVL:
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
JP C,FI1B
LD A,NO_OVL
; ELSE
JP FI1C
FI1B:
LD A,OVL
; FI
FI1C:
PUTBYTE STAT1,A
RTN 1
; END POLOVL
RET
;;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
GLOBAL PWQBUF
; ENTRY
PWQBUF:
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
CP 0
JR Z,BC1E
JP EC1E
BC1E:
CALL SUBDEQ
; ELSE
JP FI1D
EC1E:
CALL SUBXDQ
; FI
FI1D:
POP IX
EI
; IF NC THEN
JP C,FI1F
LD DE,00H
; FI
FI1F:
PUTWORD BUF10_PTR, D E
RTN 3
; END PWQBUF
RET
;
;
; TRQBUF PROCEDURE
GLOBAL TRQBUF
; ENTRY
TRQBUF:
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
CP 0
JR Z,BC21
JP EC21
BC21:
CALL SUBDEQ
; ELSE
JP FI20
EC21:
CALL SUBXDQ
; FI
FI20:
POP IX
EI
; IF NC THEN
JP C,FI22
LD DE,00H
; FI
FI22:
PUTWORD BUF11_PTR, D E
RTN 3
; END TRQBUF
RET
;;ECHO \f
;;****************************************************************************
;;* PROCEDURE : TDELAY
;;*
;;* FUNCTION : MAKES A 12.5 - 25.0 MSEC TRANSMISSION DELAY
;;*
;;* INPUTS : CH_NO : NUMBER OF CHANNEL
;;*
;;* OUTPUTS : NONE
;;*****************************************************************************
; TDELAY PROCEDURE
GLOBAL TDELAY
; ENTRY
TDELAY:
PLZVAR
PLZIN CHA_NO
ENT 0
GETBYTE E,CHA_NO
LD A,TRA_DEL
BIT 0,E
; IF Z THEN
JP NZ,FI23
BIT 1,E
; IF Z THEN
JP NZ,FI24
LD (RCT4CH),A
; ELSE
JP FI25
FI24:
LD (RCT2CH),A
; FI
FI25:
; ELSE
JP FI26
FI23:
BIT 1,E
; IF Z THEN
JP NZ,FI27
LD (RCT1CH),A
; ELSE
JP FI28
FI27:
LD (RCT3CH),A
; FI
FI28:
; FI
FI26:
;
; DO
DO29:
PUSH IX
CALL SRELEA
POP IX
;
GETBYTE E,CHA_NO
BIT 0,E
; IF Z THEN
JP NZ,FI2A
BIT 1,E
; IF Z THEN
JP NZ,FI2B
LD A,(RCT4CH)
; ELSE
JP FI2C
FI2B:
LD A,(RCT2CH)
; FI
FI2C:
; ELSE
JP FI2D
FI2A:
BIT 1,E
; IF Z THEN
JP NZ,FI2E
LD A,(RCT1CH)
; ELSE
JP FI2F
FI2E:
LD A,(RCT3CH)
; FI
FI2F:
; FI
FI2D:
AND A
; IF Z THEN EXIT FI
JP NZ,FI30
JP OD29
FI30:
; OD
JP DO29
OD29:
RTN 1
; END TDELAY
RET
;
;END PLZ_QUEU
END
«eof»