DataMuseum.dk

Presents historical artifacts from the history of:

Zilog MCZ Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦09fd81e18⟧ TextFile

    Length: 11856 (0x2e50)
    Types: TextFile
    Names: »OPESYS.S«

Derivation

└─⟦31b8a9b6a⟧ Bits:30005199 8" Zilog MCZ/1 Floppy CR80FD_0025 ( TC 500 SEC. PROTOCOL BB V2 830407 NCJ )
    └─ ⟦this⟧ »OPESYS.S« 
└─⟦cf416a62a⟧ Bits:30005201 8" Zilog MCZ/1 Floppy CR80FD_0027 ( TC 500 SEC. PROTOCOL BACK UP! (V2) BB SEC 821119 NCJ )
    └─ ⟦this⟧ »OPESYS.S« 
└─⟦f2a3f19b6⟧ Bits:30005203 8" Zilog MCZ/1 Floppy CR80FD_0030 ( BB LTU TEST BACK UP! BB VD1 821220 )
    └─ ⟦this⟧ »OPESYS.S« 

TextFile

*P 42

*I CONSTANT
SAVE	MACRO
*M OFF
	DI			;	DISABLE INTERRUPT		04
	LD	DE,(SYSRAM+0E8H);	GET EXECUTING PROCESS		20
	LD	HL,06H		;	DESCRIPTION ADDRESS		10
	ADD	HL,DE		;	CALCULATE STATUS BYTE ADDRESS	11
	LD	(SYSRAM+0E6H),SP;	STATUS BYTE			20
	LD	BC,(SYSRAM+0E6H);	GET STACK POINTER VALUE		20
	LD	(HL),C		;	DESCRIPTION			07
	INC	HL		;					06
	LD	(HL),B		;					07
	LD	SP,INISP	;LOAD STACK POINTER WITH ADDRESS OF	10
	EI			;SYSTEM STACK AND ENABLE INTERRUPT	04
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;	NUMBER OF T-CYCLES USED BY SAVE: 119
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*M ON
	ENDM
*E
PRICO	MACRO	#COA,#P
*M OFF
;THE DUTY OF PRICO IS TO CALCULATE
;THE PRIORITY OF THE PROCESS WHICH
;HAS TO BE STORED IN AN ACTIVE QUEUE,
;AND CALCULATE THE ADDRESS OF THE QUEUE
;HEAD.THE PARAMETER OF PRICO 'COA' CONTENT
;INFORMATION OF THE PROCESS DESCRIPTIONS
;ADDRESS.IF 'COA' IS OMITTED (#P<>M) THE
;ADDRESS OF THE PROCESS DESCRIPTION HAS TO
;BE PLACED IN REGISTER DE BEFORE PRICO IS
;CALLED.
;
;ENTRY POINT: ADDRESS OF PROCESS DESCRIPTION.
;
;EXIT POINT:  ADDRESS OF QUEUE HEAD WHERE THE
;             PROCESS HAS TO BE STORED PLACED
;             IN REGISTER HL.

	COND	'#P'.EQ.'M'
	LD	DE,(#COA)
	ENDC
	LD	HL,05
	ADD	HL,DE
	LD	A,(HL)
	AND	07H
	RLA
	RLA
	RLA
	LD	HL,SYSRAM
	LD	BC,00H
	LD	C,A
	ADD	HL,BC
*M ON
	ENDM
*E
	GLOBAL	SRELEASE

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;SRELEASE IS THE SUBPROCESS OF RELEASE
;WHICH RELEASE THE EXECUTING PROCESS
;AND HAND OVER THE CPU TO THE EXTENDED
;SCHEDULER.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
SRELEA	SAVE			;MACRO CALL OF SAVE		    145 / 149
PASAK	LD	HL,05H		;IF PROCESS PASSIVE
	ADD	HL,DE		;					11
	LD	A,(HL)		;					07
	RLA			;					04
	JR	C,ACT		;THEN DO				07 / 12
	LD	HL,SYSRAM+08*08H;	TRANSFER PROCESS DESCRIPTOR	10
	DI			;					04
	CALL	SUBENQ		;	TO PASSIVE QUEUE	       157
	EI			;					04
	JP	EXSCHED		;	CALL EXTENDED SCHEDULER		10
				;     END
				;ELSE DO
ACT	PRICO	D,S		;	CALCULATE PRIORITY OF PROCESS
	DI			;					04
	CALL	SUBENQ		;	TRANSFER PROCESS DESCRIPTOR    157
	EI			;					04
				;	TO ACTIVE QUEUE
	JP	EXSCHED		;	CALL EXTENDED SCHEDULER		10
				;     END
*E
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;			SUBROUTINE MODULE FOR SIGNAL AND WAIT
;
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	GLOBAL	WAI,SIG
	;''''''INISP USED BY SAVE'''''';


WAI	SAVE				;MACRO CALL OF SAVE	       119
	LD	HL,(SYSRAM+0E4H)	;IF SEMAPHORE VALUE = 0		16
	LD	A,(HL)			;THEN TRANSFERS PROCESS DESCRIP	07
	CP	0H			;TOR TO SEMAPHORE QUEUE		07
	JP	NZ,WAI1			;				10
	DI				;				04
	CALL	SUBENQ			;			       157
	EI				;				04
	JP	EXSCHED			;AND CALL EXTENDED SCHEDULER	10
WAI1	DEC	A			;ELSE DO			04
	LD	(HL),A			;	DECREMENT SEMAPHORE	07
	JP	PASAK			;	VALUE AND CALL PASAK	10
					;     END

*E
SIG	DI			;DISABLE INTERRUPT		04
	PUSH	HL		;SAVE QUEUE HEAD ADDRESS	11
	LD	A,(HL)		;IF SEMAPHORE VALUE = 00H	07
	CP	00H		;				07
	JP	NZ,SIG1		;THEN DO			10
	LD	(HL),01H	;	SET SEMAPHORE VALUE=01H	07
	INC	HL		;	IF NUMBER OF ELEMENT=00	06
	LD	A,(HL)		;				07
	DEC	HL		;				06
	CP	00H		;				07
	JP	NZ,SIG1		;	THEN RETURN		10
	POP	HL		;				10
	RET			;     END			14
SIG1	CALL	SUBDEQ		;IF NO ELEMENT IN QUEUE	       130
	JP	C,SIG2		;THEN DO			10
	POP	HL		;	RESTORE QUEUE HEAD 	10
				;	ADDRESS
	RET			;	RETURN			14
				;     END			
				;ELSE DO
SIG2	PRICO	D,S		;	CALCULATE PRIORITY
	CALL	SUBENQ		;	TRANSFER ELEMENT TO    157
	POP	HL		;	ACTIVE QUEUE		10
	LD	(HL),00H	;	SET SEMAPHORE VALUE=00	07
	RET			;     END			14
				;RETURN
*E

	GLOBAL		RECI,SUBSEN,MESADD
	EXTERNAL	SYSRAM


RECI	SAVE			;MACRO CALL OF SAVE		   145 / 149
	LD	HL,(SYSRAM+0E2H);					16
	LD	A,(HL)		;IF SEMAPHORE VALUE <> 01		07
	CP	01H		;					07
	JP	Z,RECI1		;THEN DO				10
	LD	A,-1H		;	SEMAPHORE VALUE = -01H		07
	LD	(HL),A		;					07
	DI			;					04
	CALL	SUBENQ		;	TRANSFER PROCESS DESCRIPTOR    157
	EI			;	TO SEMAPHORE QUEUE		04
	JP	EXSCHED		;	CALL EXTENDED SCHEDULER		10
				;     END
				;ELSE DO
RECI1	PUSH	DE		;	TEMPORARY SAVING OF PROCESS	11
	DI			;	DESCRIPTOR ADDRESS		04
	CALL	SUBDEQ		;	GET MESSAGE BUFFER ADDRESS     130
	EI			;	FROM SEMAPHORE QUEUE		04
	LD	HL,(SYSRAM+0E2H);	GET ADDRESS OF SEMAPHORE QUEUE	16
	INC	HL		;	IF NUMBER OF ELEMENT IN SEMA-	06
	LD	A,00H		;	PHORE QUEUE = 00H		07
	CP	(HL)		;					07
	JR	NZ,RECI2	;	THEN DO				07 / 12
	DEC	HL		;		SEMAPHORE VALUE = 00H	06
	LD	(HL),00H	;	     END			10
				;	ELSE DO
RECI2	POP	BC		;		RESTORE PROCESS DE-	10
				;		SCRIPTOR ADDRESS
	LD	HL,03H		;		TRANSFER MESSAGE BUFFER	10
	ADD	HL,BC		;		ADDRESS TO PROCESS DE-	11
	LD	(HL),E		;		SCRIPTOR		07
	INC	HL		;					06
	LD	(HL),D		;					07
	INC	HL		;		SET BUFFER VALID BIT	06
	SET	4,(HL)		;		IN STATUS BYTE		15
	LD	D,B		;					04
	LD	E,C		;					04
	PRICO	D,S		;		CALCULATE PRIORITY
				;		OF PROCESS DESCRIPTOR
	DI			;					04
	CALL	SUBENQ		;		TRANSFER PROCESS DE-   157
	EI			;		SCRIPTOR TO ACTIVE	04
				;		QUEUE
	JP	EXSCHED		;		CALL EXTENDED SCHEDULER	10
				;	     END
				;     END

*E


SUBSEN	DI			;					04
	LD	A,(HL)		;IF SEMAPHORE VALUE <> 00H		07
	CP	00H		;					07
	JP	Z,SUB1		;THEN DO				10
	CP	01H		;	IF SEMAPHORE VALUE <> 01H	07
	JP	Z,SUB2		;	THEN DO				10
	PUSH	HL		;		TEMPORARY SAVING OF	11
				;		SEMAPHORE QUEUE HEAD
				;		ADDRESS
	PUSH	DE		;		TEMPORARY SAVING OF	11
				;		MESSAGE BUFFER ADDRESS	04
	CALL	SUBDEQ		;		GET ADDRESS OF PROCESS 130
				;		DESCRIPTOR		04
	LD	HL,03H		;					10
	ADD	HL,DE		;					11
	POP	BC		;		RESTORE MESSAGE BUFFER	10
	LD	(HL),C		;		ADDRESS			07
	INC	HL		;		TRANSFER MESSAGE BUFFER	06
	LD	(HL),B		;		ADDRESS TO PROCESS	07
				;		DESCRIPTOR	
	POP	HL		;		RESTORE SEMAPHORE QUEUE	10
				;		HEAD ADDRESS
	INC	HL		;		IF NUMBER OF ELEMENT	06
	LD	A,(HL)		;		IN SEMAPHORE QUEUE = 00	07
	CP	00H		;					07
	JP	NZ,SUB3		;		THEN DO			10
	DEC	HL		;			SEMAPHORE = 00	06
	LD	(HL),A		;		     END		07
SUB3	LD	HL,05H		;		SET BUFFER AVAIBLE BIT	10
	ADD	HL,DE		;		IN STATUS BYTE (BIT 4)	11
	SET	4,(HL)		;					15
	PRICO	D,S		;		CALCULATE PRIORITY	
				;		TRANSFER PROCESS DE-	04
	CALL	SUBENQ		;		SCRIPTOR TO ACTIVE     157
				;		QUEUE			04
	RET			;				       ;10
				;	     END
				;	ELSE DO
				;		TRANSFER MESSAGE BUFFER	04
SUB2	CALL	SUBENQ		;		TO SEMAPHORE QUEUE     157
	RET			;	    ;END			10
				;     END
				;ELSE DO
SUB1	INC	(HL)		;	SEMAPHORE VALUE = 01H		11
				;	TRANSFER MESSAGE BUFFER TO	04
	CALL	SUBENQ		;	SEMAPHORE QUEUE		       157
	RET			;    END				10
*E
;**************************************************************************
;*
;*	INPUT : HL CONTAINS ADDRESS OF QUEUE 1
;*
;*	        DE CONTAINS ADDRESS OF QUEUE 2
;*
;*	OUTPUT: CARRYFLAG = 1  BUFFER HAS BEEN MOVED FROM QUEUE 1 TO QUEUE 2
;*		
;*		CARRYFLAG = 0  NO BUFFER HAS BEEN MOVED
;*
;**************************************************************************
	
	GLOBAL		SUBREC
	
SUBREC	LD	A,(HL)		;GET SEMAPHORE VALUE
	CP	01H		;IF SEMAPHORE VALUE = 01
	JP	NZ,SR2		;	
	PUSH	HL		;
	PUSH	DE		;
	CALL	SUBDEQ		;	GET BUFFER FROM SEMAPHORE QUEUE 1
	POP	HL		;
	JP	NC,SR1		;
	CALL	SUBENQ		;	TRANSFER BUFFER TO QUEUE 2
	POP	HL		;
	DEC	(HL)		;	SET SEMAPHORE = 00
	INC	HL		;
	LD	(HL),00H	;	RESET NUMBER OF ELEMENT
	RET			;RETURN FROM PROCESS
 
				;ELSE
	
SR1	POP	HL		;	NO BUFFER HAS BEEN TRANSFERED
SR2	AND	A		;	RESET CARRYFLAG
	RET			;RETURN FROM PROCESS
	
*E
MESADD	LD	DE,(SYSRAM+0E8H);GET ADDRESS OF PROCESS DESCRIPTOR	20
	LD	HL,05H		;CALCULATE STATUS BYTE ADDRESS		10
	ADD	HL,DE		;					11
	BIT	4,(HL)		;IF BUFFER VALID BIT = 1		15
	JP	Z,NOBUF1	;THEN DO				10
	RES	4,(HL)		;	RESET BUFFER VALID BIT		15
	LD	HL,03H		;	CALCULATE ADDRESS CONTAINING	10
	ADD	HL,DE		;	RECEIVED BUFFER ADDRESS		11
	LD	E,(HL)		;	GET RECEIVED BUFFER ADDRESS	07
	INC	HL		;					06
	LD	D,(HL)		;					07
	SCF			;	SET CARRY INDICATING BUFFER	04
	RET			; 	AVAIABLE			14
				;     END
				;ELSE DO
NOBUF1	AND	A		;	RESET CARRY INDICATING BUFFER	04
	RET			;	NOT AVAIABLE			14
				;     END
*E

	GLOBAL	EXSCHED



EXSCHED

EXS	LD	HL,SYSRAM		;GET ADDRESS OF FIRST PROCESS	10
;					;QUEUE
EXS1	DI				;DISABLE INTERRUPT		04
	CALL	SUBDEQ			;DO WHILE NO ELEMENT IN PROCESS 130
	EI				;QUEUE				04
	JR	C,EXS2			;				07 / 12
	LD	DE,07H			;   CALCULATE ADDRESS OF NEXT	10
	ADD	HL,DE			;   PROCESS QUEUE		11
	PUSH	HL			;   SAVE QUEUE HEAD ADDRESS	11
	LD	BC,SYSRAM+08*08H	;				10
	AND	A			;   IF ALL PROCESS QUEUES	04
	SBC	HL,BC			;				15
	POP	HL			;   (RESTORE QUEUE HEAD ADDRESS	10
	JP	NZ,EXS1			;   INVESTIGATED THEN RESTART	10
	JP	EXSCHED			;END				10
EXS2	LD	HL,05H			;IF PROCESS ACTIVE 		10
	ADD	HL,DE			;				11
	BIT	7,(HL)			;				12
	JR	Z,PASI			;THEN DO			07 / 12
	LD	(SYSRAM+0E8H),DE	;	SAVE PROCESS DESCRIPTOR	20
	INC	HL			;	ADDRESS			06
	LD	E,(HL)			;	GET STACK POINTER	07
	INC	HL			;	VALUE			06
	LD	D,(HL)			;				07
	EX	DE,HL			;				04
	DI				;	DISABLE INTERUPT	04
	LD	SP,HL			;	LOAD STACK POINTER	06
	EX	DE,HL			;	WITH NEW VALUE		04
	DEC	HL			;	CALCULATE STATUS BYTE	06
	DEC	HL			;	ADDRESS			06
	BIT	5,(HL)			;	IF INTERRUPT STATUS = 1	12
	JR	Z,DISA			;	THEN ENABLE INTERRUPT	07 / 12
	EI				;	ELSE DISABLE INTERRUPT	04
DISA	RET				;	RETURN			14
					;     END
					;ELSE DO
PASI	LD	HL,SYSRAM+08*08H	;	TRANSFERS PROCESS DE-	10
	DI				;				04
	CALL	SUBENQ			;	SCRIPTIOR TO PASSIVE   157
	EI				;				04
	JP	EXSCHED			;	QUEUE,RESTART		10
					;     END
*E

	GLOBAL	SUBENQ,SUBDEQ


SUBDEQ	INC	HL		;1
	DEC	(HL)		;1 DECREMENT NUMBER OF ELEMENT
	SCF			;2 SET QUEUE NOT EMPTY FLAG (CARRY=1)
	JP	M,DEQ1		;3 IF NUMBER OF ELEMENT > 0
	INC	HL		;3 THEN DO;
	LD	E,(HL)		;3	   REMOVE ADDRESS OF FIRST ELEMENT
	INC	HL		;3 	   TO REGISTER DE
	LD	D,(HL)		;3
	EX	DE,HL		;3 	   REMOVE SECOND ELEMENT TO NEW
	DEC	DE		;3	   FIRST ELEMENT IN QUEUE
	LDI			;3
	LDD			;3
	EX	DE,HL		;3
	RET			;3	END;
DEQ1	CCF			;4 ELSE DO;
	INC	(HL)		;4	   SET QUEUE EMPTY FLAG (CARRY=0)
				;4	   NUMBER OF ELEMENT=0
	RET			;4	END;
*E
SUBENQ	INC	HL		;1 INCREMENT NUMBER OF ELEMENT
	LD	A,(HL)		;1
	INC	(HL)		;1
	AND	A		;1
	JR	NZ,ENQ1		;2 IF NUMBER OF ELEMENT WAS = 0
	INC	HL		;2 THEN DO;
	LD	(HL),E		;3	   REMOVE NEW ELEMENT ADDRESS
	INC	HL		;3	   IN QUEUE AS FIRST ELEMENT
	LD	(HL),D		;3	   AND LAST ELEMENT
	INC	HL		;3
	LD	(HL),E		;3
	INC	HL		;3
	LD	(HL),D		;3	   RETURN
	RET			;3	END;
ENQ1	SCF			;4 ELSE DO;
	INC	HL		;4	   REMOVE NEW ELEMENT ADDRESS
	INC	HL		;4	   TO OLD LAST ELEMENT DESCRIPTION
	INC	HL		;4
	LD	C,(HL)		;4
	INC	HL		;4
	LD	B,(HL)		;4
	LD	(HL),D		;4
	DEC	HL		;4	   REMOVE NEW ELEMENT ADDRESS
	LD	(HL),E		;4	   TO NEW LAST ELEMENT IN QUEUE
	LD	L,C		;4
	LD	H,B		;4
	LD	(HL),E		;4
	INC	HL		;4
	LD	(HL),D		;4	   RETURN
	RET			;4	END;
*E
*L ON
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;SUBCREATE: SUBROUTINE MODULE FOR CREATE
;FILE:	    SUBCRE.SRC
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	GLOBAL		SUBCREATE

SUBCREATE
	LD	(IX+06H),L	;SAVE STACT POINTER START		19
	LD	(IX+07H),H	;IN PROCESS DESCRIPTOR			19
	LD	(IX+08H),E	;SAVE PROCESS START ADDRESS		19
	LD	(IX+09H),D	;IN PROCESS DESCRIPTOR			19
	SET	7,(IX+05H)	;SET PROCESS ACTIVE BIT IN STATUS BYTE	19
	RES	5,(IX+05H)	;SET INTERRUPT STATUS : DISABLE		19
	RES	4,(IX+05H)	;RESET BUFFER AVAIABLE BIT		19
	CP	01H		;IF INTERRUPT PARAMETER = 01H		07
	JP	NZ,DISCRE	;THEN DO				10
	SET	5,(IX+05H)	;	SET INTERRUPT STATUS : ENABLE	19
				;     END
DISCRE	LD	(HL),E		;LOAD PROCESS STACK WITH		07
	INC	HL		;PROCESS START ADDRESS			06
	LD	(HL),D		;					07
	PUSH	IY		;					15
	POP	HL		;GET ADDRESS OF FIRST PRIORITY QUEUE	10
	LD	A,C		;					04
	AND	A
	RLA			;					04
	RLA			;					04
	RLA			;CALCULATE ADDRESS OF ACTUAL PRIORITY	04
	LD	BC,00H		;QUEUE					10
	LD	C,A
	ADD	HL,BC		;					11
	PUSH	IX		;GET PROCESS DESCRIPTOR ADDRESS		15
	POP	DE		;					14
	DI			;TRANSFER PROCESS DESCRIPTOR TO		04
	CALL	SUBENQ		;PRIORITY QUEUE			       157
	EI			;					04
	RET			;RETURN					14
*E