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

⟦291e25dbd⟧ TextFile

    Length: 10041 (0x2739)
    Types: TextFile
    Names: »PLZ.QUEU.ASM«

Derivation

└─⟦cf416a62a⟧ Bits:30005201 8" Zilog MCZ/1 Floppy CR80FD_0027 ( TC 500 SEC. PROTOCOL BACK UP! (V2) BB SEC 821119 NCJ )
    └─ ⟦this⟧ »PLZ.QUEU.ASM« 

TextFile

;****************************************************************************
;*
;*		    PLZ_QUEU  MODULE
;*
;****************************************************************************
PLZ_QUEU MODULE
*INCLUDE PLZ.MACROS
;
CONSTANT
   OVL    := 0FFH
   NO_OVL := 0
 
   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
END PLZ_QUEU
;ECHO \f