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

⟦0c9a04be5⟧ TextFile

    Length: 22743 (0x58d7)
    Types: TextFile
    Names: »DECODE.SRC«

Derivation

└─⟦8347abc8e⟧ Bits:30005501 8" CR80 Floppy CR80FD_0033 ( ATR Source and Abs-files )
└─⟦8347abc8e⟧ Intel_ISIS_II
    └─ ⟦this⟧ »DECODE.SRC« 

TextFile

;******************************************************************************\r
;*                                                                            *\r
;* D O R A     A P P L I C A T I O N     S / W                                *\r
;*                                                                            *\r
;* DEVICE: ATR                                                                *\r
;*                                                                            *\r
;* MODULE: MESSAGE DECODE PROCESS                                             *\r
;*                                                                            *\r
;******************************************************************************\r
\r
LINK	DEFL	0\r
SCANNR	DEFL	5\r
DCODNR	DEFL	6\r
SEARNR	DEFL	7\r
SYNCNR	DEFL	8\r
LOCKNR	DEFL	9\r
TIMGNR	DEFL	10\r
INSPNR	DEFL	11\r
STATNR	DEFL	12\r
READNR	DEFL	13\r
SEARTIM	DEFL	1\r
SYNCTIM	DEFL	2\r
LOCKTIM	DEFL	3\r
INSPTIM	DEFL	4\r
SCANTIM	DEFL	5\r
PORT1	DEFL	30H\r
PORT2	DEFL	32H\r
PORT3	DEFL	34H\r
PORT4	DEFL	31H\r
DAC	DEFL	20H\r
\r
	NLIST	S\r
PASSIVATE	MACRO	#ID,#NO\r
					;DESRIP: THE MODULE PASSIVATES\r
					;	SPECIFIED PROCES.\r
					;	IF LINK IS SET AND ACTIV\r
					;	SPECIAL PROCESS IS PASSIVATED\r
					;	THE LINK-ELEMENT IS \r
					;	DECREMENTED\r
					;DESTR:	REG F,H,L\r
	IF	'#ID'.EQ.'S'\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	IF	LINK.EQ.1\r
	BIT	7,(HL)			;\r
	JR	Z,O#$YM		;IF PROCESS WAS NOT PASSIVE THEN\r
	LD	HL,SYSRAM+0FBH	;BEGIN\r
	DEC	(HL)			;DEC LINK-ELEMENT\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;END\r
O#$YM:	ENDIF\r
	ENDIF\r
	IF	'#ID'.EQ.'N'\r
	LD	HL,SYSRAM+200H+S*10H+#NO*20H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	ENDIF\r
	RES	7,(HL)			;PASSIVATE\r
	ENDM\r
ACTIVATE	MACRO	#ID,#NO\r
					;DESRIP: THE MODULE ACTIVATES\r
					;	SPECIFIED PROCES.\r
					;	IF LINK IS SET AND PASSIV\r
					;	SPECIAL PROCESS IS ACTIVATED\r
					;	THE LINK-ELEMENT IS \r
					;	INCREMENTED\r
					;DESTR:	REG F,H,L\r
	IF	'#ID'.EQ.'S'\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	IF	LINK.EQ.1\r
	BIT	7,(HL)			;\r
	JR	NZ,O#$YM		;IF PROCESS WAS NOT ACTIVE THEN\r
	LD	HL,SYSRAM+0FBH	;BEGIN\r
	INC	(HL)			;INC LINK-ELEMENT\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;END\r
O#$YM:	ENDIF\r
	ENDIF\r
	IF	'#ID'.EQ.'N'\r
	LD	HL,SYSRAM+200H+S*10H+#NO*20H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	ENDIF\r
	SET	7,(HL)			;ACTIVATE\r
	ENDM\r
CREATE	MACRO	#ID,#NO,#NAME,#PRIO\r
				;DESCRIP: THE MODULE CREATES SPECIFIED\r
				;	PROCESS IE LOADS STARTADDRESS\r
				;	(#NAME) IN PROCESS-DESCRIPTION\r
				;	BYTE 6,7. IF NORMAL PROCESS IS\r
				;	ENCOUNTERED PRIORITY IS LOADED\r
				;	TO BYTE 5 IN PROCESS-DESCRIPTION\r
				;	AND THE PROCESS IS ENQUEUED IN\r
				;	APPROPRIATE PRIO-QUEUE.\r
				;	FINALLY THE SPECIFIED PROCESS\r
				;	IS ACTIVATED\r
				;DESTR:	IF NORMAL PROCESS\r
				;	REG. A,F,B,C,D,E,H,L\r
				;	IF SPECIAL PROCESS\r
				;	REG. F,H,L\r
	LD	HL,#NAME	;\r
	IF	'#ID'.EQ.'S'\r
	LD	(SYSRAM+200H+#NO*10H+6),HL\r
				;STARTADD TO PROCESS-DESCRIP\r
	ENDIF\r
	IF	'#ID'.EQ.'N'\r
	LD	(SYSRAM+200H+S*10H+#NO*20H+6),HL\r
				;STARTADD TO PROCESS-DESCRIP\r
	LD	HL,SYSRAM+200H+S*10H+#NO*20H+5\r
	LD	(HL),#PRIO			;PRIORTY TO PROCESS\r
	LD	HL,SYSRAM+#PRIO*8		;ADDRESS OF PRIO-QUEUE\r
	LD	DE,SYSRAM+200H+S*10H+#NO*20H	;ADDRESS OF PROCESS-DESCRIP\r
	CALL	SUBENQ\r
	ENDIF\r
	ACTIVATE	#ID,#NO			;ACTIVATE PROCESS\r
	ENDM\r
RESTART MACRO	#ID,#NO,#NAME,#PRIO\r
				;DESCRIP: THE MODULE CREATES SPECIFIED\r
				;	PROCESS IE LOADS STARTADDRESS\r
				;	(#NAME) IN PROCESS-DESCRIPTION\r
				;	BYTE 6,7. IF NORMAL PROCESS IS\r
				;	ENCOUNTERED PRIORITY IS LOADED\r
				;	TO BYTE 5 IN PROCESS-DESCRIPTION\r
				;	AND THE PROCESS IS ENQUEUED IN\r
				;	APPROPRIATE PRIO-QUEUE.\r
				;	FINALLY THE SPECIFIED PROCESS\r
				;	IS ACTIVATED\r
				;DESTR:	IF NORMAL PROCESS\r
				;	REG. A,F,B,C,D,E,H,L\r
				;	IF SPECIAL PROCESS\r
				;	REG. F,H,L\r
	LD	HL,#NAME	;\r
	IF	'#ID'.EQ.'S'\r
	LD	(SYSRAM+200H+#NO*10H+6),HL\r
				;STARTADD TO PROCESS-DESCRIP\r
	ENDIF\r
	IF	'#ID'.EQ.'N'\r
	LD	(SYSRAM+200H+S*10H+#NO*20H+6),HL\r
				;STARTADD TO PROCESS-DESCRIP\r
	LD	HL,SYSRAM+200H+S*10H+#NO*20H+5\r
	LD	(HL),#PRIO			;PRIORTY TO PROCESS\r
	LD	HL,SYSRAM+#PRIO*8		;ADDRESS OF PRIO-QUEUE\r
	LD	DE,SYSRAM+200H+S*10H+#NO*20H	;ADDRESS OF PROCESS-DESCRIP\r
	CALL	SUBENQ\r
	ENDIF\r
	ACTIVATE	#ID,#NO			;ACTIVATE PROCESS\r
	ENDM\r
\r
\r
LESTAB	MACRO	#PRNUM\r
	LD	BC,#PRNUM\r
	CALL	ESTABR\r
	ENDM\r
\r
LSUSPN	MACRO	#PRNUM\r
	LD	BC,#PRNUM\r
	CALL	SUSPND\r
	ENDM\r
\r
GESTAM	MACRO\r
	LD	HL,ONOFF\r
	LD	(HL),0FFH\r
	ENDM\r
\r
GSUSPM	MACRO\r
	LD	HL,ONOFF\r
	LD	(HL),0\r
        ENDM\r
\r
UPDATM	MACRO	#PRNUM,#NO\r
	LD	HL,DELAY+#PRNUM\r
	LD	(HL),#NO\r
	ENDM\r
\r
;>>>>>>>>>>>>>> DORCOM.MAC, VERSION 810127/CGR <<<<<<<<<<<<<<<<\r
;\r
;\r
;\r
;************************************************************************\r
;                             I G E P A 1\r
;                          VERSION 801125/CGR\r
;************************************************************************\r
;\r
;\r
IGEPA1	MACRO\r
				;DESCRIP: THE MACRO DEQUEUES AN ELEMENT FROM\r
				;	  INCOMING PACKET QUEUE IN SPECIFIED\r
				;         CHANNEL.\r
				;ENTRY: CHANNEL NO. IN A-REG.\r
				;EXIT: CY=1 IF QUEUE WAS NOT EMPTY\r
				;      CY=0 IF QUEUE WAS EMPTY\r
				;      ADDRESS OF ELEMENT IN DE\r
				;DESTROY: IF QUEUE WAS NOT EMPTY\r
				;	     REG A,F,B,C,D,E,H,L,IX\r
				;	  IF QUEUE WAS EMPTY\r
				;	     REG F,H,L\r
				;EXTERNALS REQUIRED: IGEPA\r
				;\r
;################ Igepa1 macro #####################################\r
	CALL	IGEPA		;GET BUFFER IF ANY\r
	JP	NC,A#$YM+1	;IF QUEUE WAS EMPTY THEN EXIT\r
	PUSH	DE		;\r
	POP	IX		;\r
	PUSH	DE		;\r
	LD	L,(IX+4)	;DECREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	DEC	HL		;\r
	DEC	HL		;\r
	LD	(IX+4),L	;\r
	LD	(IX+5),H	;\r
	LD	HL,8		;REFORMAT BUFFER ('SIZE OF DATABUFFER' IS DESTROYED)\r
	ADD	HL,DE		;\r
	EX	DE,HL		;\r
	LD	HL,2		;\r
	ADD	HL,DE		;\r
	LD	B,0		;\r
	LD	C,(IX+2)	;\r
	LDIR			;\r
	POP	DE		;\r
A#$YM:	SCF			;EXIT\r
;#################### End macro ################################\r
	ENDM\r
;\r
;\r
;\r
;\r
;************************************************************************\r
;                             I D E P A 1\r
;                          VERSION 801125/CGR\r
;************************************************************************\r
;\r
; DESCRIPTION:	THIS MACRO ENQUEUES THE SPECIFIED BUFFER IN THE 'INCOMING'\r
;		EMPTY BUFFER QUEUE IN THE CORRECT  DESCRIPTOR SECTION.\r
;		THE BUFFER MUST BE FORMATTED AS SPECIFIED FOR DORA INCOMING\r
;		BUFFERS. THE BYTECOUNT IN THE BUFFER IS RESET\r
;\r
; ENTRY:	ADDRESS OF BUFFER ELEMENT IN DE REGISTER.\r
;\r
; EXIT:		CY=1 IF QUEUE WAS NOT EMPTY\r
;		CY=0 IF QUEUE WAS EMPTY\r
;		ADDRESS OF BUFFER ELEMENT IN DE AND IX REGISTERS.\r
;\r
; PARAMETERS:	#EI: Y RE-ENABLES INTERRUPT\r
;		     N INTERRUPT IS DISABLED AT MACRO EXIT\r
;\r
; EXTERNALS:	IDEPA\r
;\r
; DESTROY:	REGISTERS A,F,B,C,H,L,IX\r
;\r
;\r
;\r
IDEPA1	MACRO	#EI,#BSIZE\r
;################# Idepa1 macro ##############################\r
	PUSH	DE		;\r
	POP	IX\r
	LD	(IX+8),#BSIZE	;REINSERT BUFFERSIZE (=16)\r
	LD	(IX+9),0	;\r
	LD	(IX+2),0	;RESET BYTECOUNT\r
	LD	(IX+3),0	;\r
	LD	A,(IX-2)	;GET CHANNEL NO.\r
	LD	L,(IX+4)	;INCREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	INC	HL		;\r
	INC	HL		;\r
	LD	(IX+4),L	;\r
	LD	(IX+5),H	;\r
	CALL	IDEPA			;\r
	IF	'#EI'.EQ.'Y'		;\r
	EI				;\r
	ENDIF				;\r
;################# End macro #################################\r
	ENDM\r
;\r
;\r
;************************************************************************\r
;                             O G E P A 1\r
;                          VERSION 810119/CGR\r
;************************************************************************\r
;\r
OGEPA1	MACRO	#CHAN\r
				;DESCRIP: THE MACRO DEQUEUES AN 'OUTGOING' ELE-\r
				;         MENT FROM DESCRIPTOR.\r
				;ENTRY: -\r
				;EXIT: CY=1 IF QUEUE WAS NOT EMPTY\r
				;      CY=0 IF QUEUE WAS EMPTY\r
				;      ADDRESS OF ELEMENT IN DE\r
				;DESTROY: IF QUEUE WAS NOT EMPTY\r
				;	     REG A,F,B,C,D,E,H,L,IX\r
				;	  IF QUEUE WAS EMPTY\r
				;	     REG F,H,L\r
				;PARAMETERS: #CHAN = CHANNEL NO. ('DATATYPE')\r
				;\r
				;EXTERNALS: SUBDEQ,QHEADS\r
				;\r
;###################### Ogepa1 macro ###########################\r
	LD	A,#CHAN		;FIND EMPTY QUEUE\r
	LD	H,A\r
	SLA	A\r
	SLA	A\r
	ADD	A,H\r
	LD	HL,QHEADS\r
	LD	D,0\r
	LD	E,A\r
	ADD	HL,DE\r
	CALL	SUBDEQ		;GET BUFFER\r
	JP	NC,A#$YM+3\r
	PUSH	DE\r
	POP	IX\r
	LD	L,(IX+4)	;DECREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	DEC	HL		;\r
	DEC	HL		;\r
	LD	(IX+4),L	;\r
A#$YM:	LD	(IX+5),H	;\r
;######################## End macro ##############################\r
	ENDM\r
;\r
;\r
;\r
;***********************************************************************\r
;                             O G E P A 3\r
;                          VERSION 810127/CGR\r
;***********************************************************************\r
;\r
; DESCRIPTION:		THIS MACRO DEQUEUES A BUFFER FROM THE 'OUTGOING'\r
;			EMPTY BUFFER QUEUE - IF THE I/F DEVICE IS DELEGATED - AND\r
;			INSERTS THE PANEL CODE OF THE\r
;			DELEGATED PANEL IN THE FIRST DATABYTE OF THE\r
;			BUFFER. THE BYTECOUNT IS SET = 1.\r
;\r
; ENTRY:		NONE\r
;\r
; EXIT:			CY=0 IF QUEUE WAS EMPTY OR LTUX NOT DELEGATED\r
;			CY=1 IF QUEUE WAS NOT EMPTY AND LTUX DELEGATED\r
;			Z=0  IF LTUX NOT DELEGATED\r
;			Z=1  IF LTUX IS DELEGATED\r
;			ADDRESS OF BUFFER ELEMENT IN DE AND IX REGISTERS.\r
;\r
; PARAMETERS:		#CHAN:	CHANNELNUMBER. (MUST BE 6 OR 7)\r
;\r
; EXTERNALS:		SUBDEQ, QHEADS, PANCO (AND PANCOM IF TELECINE I/F)\r
;\r
; DESTROY:		REGISTERS A,F,B,C,D,E,H,L,IX\r
;\r
OGEPA3	MACRO	#CHAN\r
;################### Ogepa3 macro ###################################\r
	NLIST	S\r
	IF	#CHAN.EQ.6\r
	LIST	S	;+++++ #CHAN = 6\r
	LD	A,(PANCO)\r
	NLIST	S\r
	ENDIF\r
	IF	#CHAN.EQ.7\r
	LIST	S	;+++++ #CHAN = 7\r
	LD	A,(PANCOM)\r
	NLIST	S\r
	ENDIF\r
	LIST	S\r
	CP	0		;TEST IF DELEGATION IS ESTABLISHED\r
	JP	Z,A#$YM		;IF YES THEN\r
	LD	A,#CHAN\r
	LD	H,A		;FIND ADDRESS OF EMPTY BUFFER QUEUE\r
	SLA	A\r
	SLA	A\r
	ADD	A,H\r
	LD	HL,QHEADS\r
	LD	D,0\r
	LD	E,A\r
	ADD	HL,DE\r
	CALL	SUBDEQ		;GET BUFFER\r
				;TEST IF QUEUE WAS EMPTY\r
	JP	NC,B#$YM	;IF NO THEN\r
	PUSH	DE\r
	POP	IX\r
	LD	(IX+2),1	;SET BYTECOUNT = 1\r
	NLIST	S\r
	IF	#CHAN.EQ.6\r
	LIST	S	;+++++ #CHAN = 6\r
	LD	A,(PANCO)\r
	NLIST	S\r
	ENDIF\r
	IF	#CHAN.EQ.7\r
	LIST	S	;+++++ #CHAN = 7\r
	LD	A,(PANCOM)\r
	NLIST	S\r
	ENDIF\r
	LIST	S\r
	LD	(IX+8),A	;LOAD DELEGATED PANEL CODE INTO FIRST DATABYTE\r
	LD	L,(IX+4)	;DECREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	DEC	HL		;\r
	DEC	HL		;\r
	LD	(IX+4),L	;\r
	LD	(IX+5),H	;\r
	CP	A		;SET Z-FLAG\r
	SCF			;SET C-FLAG\r
	JP	A#$YM+4		\r
				;ENDIF\r
				;\r
B#$YM:	CP	A		;SET Z-FLAG\r
	SCF\r
	CCF			;RESET C-FLAG\r
	JP	A#$YM+4		;\r
				;ENDIF\r
A#$YM:	CP	1		;RESET Z-FLAG\r
	SCF			;RESET C-FLAG\r
	CCF			;\r
;\r
;################### End macro #######################################\r
	ENDM\r
;\r
;\r
;************************************************************************\r
;                          O G E P A 2\r
;                       VERSION 810119/CGR\r
;************************************************************************\r
;\r
; DESCRIPTION:		THIS MACRO DEQUEUES A BUFFER FROM THE EMPTY BUFFER\r
;			QUEUE ASSIGNED TO THE DELEGATED CR80.\r
;\r
; ENTRY:		NONE\r
;\r
; EXIT:			CY=0 IF THE QUEUE WAS EMPTY\r
;			CY=1 IF THE QUEUE WAS NOT EMPTY\r
;			ADDRESS OF BUFFERELEMENT IN DE REGISTER.\r
;\r
; PARAMETERS:		NONE\r
;\r
; EXTERNALS:		CR80NO, SUBDEQ, QHEADS\r
;\r
; DESTROY:		REGISTERS A,F,B,C,D,E,H,L,IX\r
;\r
;\r
OGEPA2	MACRO\r
\r
;#################### Ogepa2 macro ###########################\r
	LD	A,(CR80NO)	;FIND ADDRESS OF EMPTY BUFFER QUEUE\r
	LD	H,A\r
	SLA	A\r
	SLA	A\r
	ADD	A,H\r
	LD	HL,QHEADS\r
	LD	D,0\r
	LD	E,A\r
	ADD	HL,DE\r
	CALL	SUBDEQ		;GET BUFFER\r
	JP	NC,A#$YM+3	;\r
	PUSH	DE\r
	POP	IX		;\r
	LD	L,(IX+4)	;DECREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	DEC	HL		;\r
	DEC	HL		;\r
	LD	(IX+4),L	;\r
A#$YM:	LD	(IX+5),H	;\r
;################## End macro ###################################\r
	ENDM\r
;\r
;\r
;\r
;\r
;\r
;************************************************************************\r
;                          O D E P A 1\r
;                       VERSION 801223/CGR\r
;************************************************************************\r
;\r
ODEPA1	MACRO	#EI,#BSIZE\r
\r
				;DESCRIP: THE MACRO ENQUEUES AN 'OUTGOING'\r
				;         ELEMENT IN THE CHANNEL QUEUE.\r
				;	  IF TRANSMISSION CANCELED FLAG IS\r
				;	  SET, THE BUFFER IS ENQUEUED IN\r
				;	  THE OUTGOING EMPTY BUFFER QUEUE.\r
				;ENTRY:	ADDRESS OF ELEMENT IN REG DE\r
				;EXIT: CY=1 IF QUEUE WAS NOT EMPTY\r
				;      CY=0 IF QUEUE WAS EMPTY\r
				;      ADDRESS OF ELEMENT IN REG DE\r
				;DESTROY: REG A,F,B,C,H,L,IX\r
				;\r
				;PARAMETERS: #BSIZE = BUFFERSIZE\r
				;	     #EI: Y RE-ENABLES INTERRUPT\r
				;	          N INTERRUPT IS DISABLED AT MACRO EXIT.\r
				;	          NOTE! INTERRUPT IS NOT AFFECTED\r
				;		  IF TRANSMISSION WAS CANCELED.\r
				;\r
				;EXTERNALS: QHEADS,SUBENQ,ECOND1\r
				;\r
;################ Odepa1 macro ####################################\r
	PUSH	DE		;\r
	PUSH	DE		;\r
	POP	IX		;\r
	LD	A,(IX+2)	;REFORMAT BUFFER\r
	ADD	A,7		;\r
	LD	L,A		;\r
	LD	H,0		;\r
	ADD	HL,DE		;\r
	EX	DE,HL		;\r
	LD	HL,2		;\r
	ADD	HL,DE		;\r
	EX	DE,HL		;\r
	LD	B,0		;\r
	LD	C,(IX+2)	;\r
	LDDR			;\r
	LD	(IX+8),#BSIZE	;RESTORE BUFFERSIZE\r
	LD	(IX+9),0	;\r
	LD	L,(IX+4)	;INCREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	INC	HL		;\r
	INC	HL		;\r
	LD	(IX+4),L	;\r
	LD	(IX+5),H	;\r
	LD	A,(IX+2)	;TEST IF BUFFER IS THE LAST IN TRANSMISSION\r
	LD	HL,ECOND1	;\r
	CP	#BSIZE\r
	JP	Z,C#$YM		;   IF YES THEN\r
	SET	7,(HL)		;      SET BIT 7 IN ECOND1\r
	JP	D#$YM		;   ELSE\r
C#$YM:	RES	7,(HL)		;      RESET BIT 7 IN ECOND1\r
				;   ENDIF\r
D#$YM:	LD	A,(HL)		;TEST IF TRANSMISSION IS CANCELED\r
	BIT	6,A\r
	JP	Z,A#$YM		;IF YES THEN\r
				;   BEGIN\r
	LD	A,(IX+2)	;      TEST IF BUFFER IS THE LAST IN TRANSMISSION\r
\r
	CP	#BSIZE\r
	JP	Z,B#$YM		;      IF YES THEN\r
	RES	6,(HL)		;	 RESET BIT 6 IN ECOND1\r
				;      ENDIF\r
B#$YM:	LD	(IX+2),0	;      RESET BYTECOUNT\r
	LD	(IX+3),0	;\r
	LD	A,(IX-2)	;      ENQUEUE BUFFER IN OUTGOINIG EMPTY BUFFER QUEUE\r
	LD	H,A\r
	SLA	A\r
	SLA	A\r
	ADD	A,H\r
	LD	HL,QHEADS\r
	LD	D,0\r
	LD	E,A\r
	ADD	HL,DE\r
	POP	DE\r
	CALL	SUBENQ		;\r
;\r
				;   END\r
				;ELSE\r
A#$YM:	LD	A,(IX-2)  	;   BEGIN\r
	POP	DE		;      ENQUEUE BUFFER IN CHANNEL QUEUE\r
	CALL	ODEPA		;\r
	IF	'#EI'.EQ.'Y'\r
	EI			;   END\r
	ENDIF			;ENDIF\r
;################# End macro #####################################\r
	\r
	ENDM\r
;\r
;\r
;\r
;\r
;\r
;\r
;************************************************************************\r
;                          O D E P A 2\r
;                       VERSION 801223/CGR\r
;************************************************************************\r
;\r
ODEPA2	MACRO	#EI,#BSIZE\r
\r
				;DESCRIP: THE MACRO ENQUEUES AN 'OUTGOING'\r
				;         ELEMENT IN THE CHANNEL QUEUE.\r
				;	  IF TRANSMISSION CANCELED FLAG IS\r
				;	  SET, THE BUFFER IS ENQUEUED IN\r
				;	  THE OUTGOING EMPTY BUFFER QUEUE.\r
				;	  FIRST, THE MACRO TESTS IF ASSIGNED\r
				;	  CR80 NO. HAS BEEN CHANGED SINCE\r
				;	  THE BUFFER WAS DEQUEUED BY OGEPA.\r
				;	  IF YES, A BUFFER FROM THE CORRECT\r
				;	  CHANNEL IS DEQUEUED AND THE BUFFER\r
				;	  CONTENTS IS TRANSFERRED - NEXT, THE\r
				;	  'OLD' BUFFER IS DELIVERED TO THE\r
				;	  APPROPRIATE EMPTY QUEUE AND FINALLY\r
				;	  THE 'NEW' BUFFER IS TRANSMITTED.\r
 				;ENTRY:	ADDRESS OF ELEMENT IN REG DE\r
				;EXIT: CY=1 IF QUEUE WAS NOT EMPTY\r
				;      CY=0 IF QUEUE WAS EMPTY\r
				;      ADDRESS OF ELEMENT IN REG DE\r
				;DESTROY: REG A,F,B,C,D,E,H,L,IX\r
				;\r
				;PARAMETERS: #BSIZE = BUFFERSIZE\r
				;	     #EI: Y RE-ENABLES INTERRUPT\r
				;	          N INTERRUPT IS DISABLED AT MACRO EXIT.\r
				;	          NOTE! INTERRUPT IS NOT AFFECTED\r
				;		  IF TRANSMISSION WAS CANCELED.\r
				;\r
				;EXTERNALS: QHEADS,SUBENQ,ECOND1,CR80NO\r
				;\r
;################ Odepa2 macro ####################################\r
	PUSH	DE		;\r
	PUSH	DE		;\r
	POP	IX		;\r
	LD	A,(IX-2)	;\r
	CP	5		;\r
	JP	P,E#$YM		;\r
	LD	HL,CR80NO	;\r
	CP	(HL)		;\r
	JP	Z,E#$YM		;\r
	LD	H,A\r
	SLA	A\r
	SLA	A\r
	ADD	A,H\r
	LD	HL,QHEADS\r
	LD	D,0\r
	LD	E,A\r
	ADD	HL,DE\r
	POP	DE\r
	PUSH	DE		;\r
	CALL	SUBENQ		;\r
	OGEPA2			;\r
	POP	HL		;\r
	PUSH	DE		;\r
	PUSH	DE		;\r
	LD	BC,#BSIZE+8	;\r
	LDIR			;\r
	POP	IX		;\r
E#$YM:	LD	A,(IX+2)	;REFORMAT BUFFER\r
	ADD	A,7		;\r
	LD	L,A		;\r
	LD	H,0		;\r
	ADD	HL,DE		;\r
	EX	DE,HL		;\r
	LD	HL,2		;\r
	ADD	HL,DE		;\r
	EX	DE,HL		;\r
	LD	B,0		;\r
	LD	C,(IX+2)	;\r
	LDDR			;\r
	LD	(IX+8),#BSIZE	;RESTORE BUFFERSIZE\r
	LD	(IX+9),0	;\r
	LD	L,(IX+4)	;INCREMENT DATABUFFER ADDRESS 2 TIMES.\r
	LD	H,(IX+5)	;\r
	INC	HL		;\r
	INC	HL		;\r
	LD	(IX+4),L	;\r
	LD	(IX+5),H	;\r
	LD	A,(IX+2)	;TEST IF BUFFER IS THE LAST IN TRANSMISSION\r
	LD	HL,ECOND1	;\r
	CP	#BSIZE\r
	JP	Z,C#$YM		;   IF YES THEN\r
	SET	7,(HL)		;      SET BIT 7 IN ECOND1\r
	JP	D#$YM		;   ELSE\r
C#$YM:	RES	7,(HL)		;      RESET BIT 7 IN ECOND1\r
				;   ENDIF\r
D#$YM:	LD	A,(HL)		;TEST IF TRANSMISSION IS CANCELED\r
	BIT	6,A\r
	JP	Z,A#$YM		;IF YES THEN\r
				;   BEGIN\r
	LD	A,(IX+2)	;      TEST IF BUFFER IS THE LAST IN TRANSMISSION\r
\r
	CP	#BSIZE\r
	JP	Z,B#$YM		;      IF YES THEN\r
	RES	6,(HL)		;	 RESET BIT 6 IN ECOND1\r
				;      ENDIF\r
B#$YM:	LD	(IX+2),0	;      RESET BYTECOUNT\r
	LD	(IX+3),0	;\r
	LD	A,(IX-2)	;      ENQUEUE BUFFER IN OUTGOINIG EMPTY BUFFER QUEUE\r
	LD	H,A\r
	SLA	A\r
	SLA	A\r
	ADD	A,H\r
	LD	HL,QHEADS\r
	LD	D,0\r
	LD	E,A\r
	ADD	HL,DE\r
	POP	DE\r
	CALL	SUBENQ		;\r
;\r
				;   END\r
				;ELSE\r
A#$YM:	LD	A,(IX-2)  	;   BEGIN\r
	POP	DE		;      ENQUEUE BUFFER IN CHANNEL QUEUE\r
	CALL	ODEPA		;\r
	IF	'#EI'.EQ.'Y'\r
	EI			;   END\r
	ENDIF			;ENDIF\r
;################# End macro #####################################\r
	ENDM\r
\r
\r
	LIST	S\r
	PUBLIC	DECODE,CASE01,CASE02,CASE03,CASE04,CASE05,CASE06\r
	PUBLIC	CASE07,CASE08,CASE09,CASE10,CASE11,CASE12,STAC06\r
	EXTRN	PQH6,TABL2,FLAG1,MESCOD,FLAG2,CODSAV,COMBYT,BFSAVE\r
	EXTRN	SEARCH,LOCK,TTCREG,MTCREG,LOCREG,PLAYREG,STOPREG\r
	EXTRN	TCSUB,TCADD,CLEARY,MTCCOD,UTCCOD,TMPCOD,SYSRAM\r
	EXTRN	ESTABR,DELAY,SUSPND,SUBDEQ,SCOMMON,CONS02,CONS09\r
	EXTRN	CPOINTS,OUTPUT,SUBENQ,MTC00,DIFREG,ADDRTC\r
	EXTRN	ID1\r
\r
	CSEG\r
DECODE:	LD	SP,STAC06	;INITIALIZE STACKPOINTER\r
	LD	A,0EFH\r
	LD	(CODSAV),A	;SET THE ATR IN STOP MODE\r
	OUT	(30H),A\r
	LD	A,13H\r
	OUT	(31H),A		;SWITCH OFF FADER CONTACT\r
PASPRO:	PASSIVATE S,DCODNR	;PASSIVATE COMMAND DECODE PROCESS\r
	CALL	SCOMMON		;SCHEDULE\r
	EI\r
\r
;-----------------------------------------------------------------------------\r
START:	LD	HL,PQH6\r
	CALL	SUBDEQ		;DEQUE FIRST ELEMENT IN COMM.DEC.PROC.QUEUE\r
	JP	NC,PASPRO\r
\r
;-----------------------------------------------------------------------------\r
	PUSH	DE\r
	POP	IX\r
	LD	A,(IX+8)\r
	LD	(MESCOD),A	;SAVE MESSAGE CODE\r
	LD	(BFSAVE),IX	;SAVE BUFFER ELEMENT ADDRESS\r
	LD	E,(IX+3)	;GET VALUE OF 2*TABL1 COUNTER\r
	LD	D,00H\r
	LD	HL,TABL2\r
	SCF\r
	CCF\r
	SBC	HL,DE		;POINTER TO STARTADDR. OF THE APPROP. ROUT.\r
	LD	E,(HL)\r
	INC	HL\r
	LD	D,(HL)\r
	EX	DE,HL\r
	JP	(HL)		;DO CASE(N) :\r
\r
\r
\r
;---------------------------------------------------------------------------\r
CASE01:	LD	HL,FLAG1\r
	SET	0,(HL)		;SET STATUS CHANGE-FLAG\r
	JP	RETBUF\r
\r
CASE02:	LD	A,0FEH		;(A) = PLAY-CODE\r
	CALL	POUTPT\r
	JP	RETBUF\r
\r
CASE03:	LD	A,0FCH		;(A) = RECORD-CODE\r
	CALL	POUTPT\r
	JP	RETBUF\r
\r
CASE04:	LD	A,0FBH		;(A) = FORWIND-CODE\r
	CALL	POUTPT\r
	JP	RETBUF\r
\r
CASE05:	LD	A,0F7H		;(A) = REWIND-CODE\r
	CALL	POUTPT\r
	JP	RETBUF\r
\r
CASE06:	LD	A,0EFH		;(A) = STOP-CODE\r
	CALL	POUTPT\r
	JP	RETBUF\r
\r
CASE07:				;SEARCH-PLAY COMMAND\r
	LD	DE,TTCREG	;\r
	LD	HL,(BFSAVE)	;\r
	LD	BC,9		;\r
	ADD	HL,BC		;\r
	LD	BC,4		;\r
	LDIR			;SAVE SPEC.TTC-VALUE IN TTC-REG.\r
	CALL	CPOINTS		;CALCULATE SEARCH-CHECKPOINTS\r
	CALL	INIT		;INITIALIZE SEARCH PROCESS\r
	JP	RETBUF		;\r
\r
\r
CASE08:				;SEARCH-STOP COMMAND\r
	CALL	TRANSF		;SAVE (SPEC.TTC-(CUE UP TIME+MTC OFFSET)) IN TTC-REG.\r
	CALL	CPOINTS		;CALCULATE SEARCH-CHECKPOINTS\r
	CALL	INIT		;INITIALIZE SEARCH PROCESS\r
	JP	RETBUF		;\r
\r
\r
CASE09:				;SEARCH-MTC SYNC-PLAY/RECORD COMMAND\r
	PUSH	IX		;\r
	POP	IY		;\r
	LD	BC,11		;\r
	ADD	IY,BC		;\r
	LD	BC,15		;\r
	ADD	IX,BC		;\r
	LD	BC,DIFREG	;\r
	CALL	TCSUB		;SAVE SPEC.MTC - SPEC.TTC IN DIF-REG.\r
\r
	LD	HL,MTCCOD	;\r
	LD	(ADDRTC),HL	;SAVE MTC ADDRESS\r
	LD	DE,MTCREG	;\r
	LD	HL,(BFSAVE)	;\r
	LD	BC,15		;\r
	ADD	HL,BC		;\r
	LD	BC,4		;\r
	LDIR			;SAVE SPEC.MTC-VALUE IN MTC-REG.\r
	CALL	TRANSF		;SAVE (SPEC.TTC-(CUE UP TIME+TTC OFFSET)) IN TTC-REG.\r
				;SAVE (SPEC.MTC-(CUE UP TIME+MTC OFFSET)) IN MTC00\r
	CALL	CPOINTS		;CALCULATE SEARCH-CHECKPOINTS\r
	CALL	INIT		;INITIALIZE SEARCH PROCESS\r
\r
	JR	RETBUF		;\r
\r
CASE10:				;PLAY TTC COMMAND\r
	LD	DE,PLAYREG	;\r
	LD	HL,(BFSAVE)	;\r
	LD	BC,9		;\r
	ADD	HL,BC		;\r
	LD	BC,4		;\r
	LDIR			;SAVE SPEC.TTC-VALUE IN PLAY-REG.\r
	LD	HL,FLAG1	;\r
	SET	6,(HL)		;SET P-T-S FLAG\r
	ACTIVATE S,TIMGNR	;ACTIVATE TIMING PROCESS\r
	JR	RETBUF\r
\r
CASE11:				;STOP MTC SYNC COMMAND\r
	LD	DE,STOPREG	;\r
	LD	HL,(BFSAVE)	;\r
	LD	BC,9		;\r
	ADD	HL,BC		;\r
	LD	BC,4		;\r
	LDIR			;SAVE SPECIFIED MTC VALUE\r
	LD	HL,FLAG1	;\r
	SET	7,(HL)		;SET S-M-S FLAG\r
	ACTIVATE S,TIMGNR	;ACTIVATE TIMING PROCESS\r
	JR	RETBUF\r
\r
CASE12:				;LOCK COMMAND\r
	LD	DE,LOCREG	;\r
	LD	HL,(BFSAVE)	;\r
	LD	BC,9		;\r
	ADD	HL,BC		;\r
	LD	BC,4		;\r
	LDIR			;SAVE SPEC.TIME CODE OFFSET IN LOCK-REG.\r
\r
	LD	DE,DIFREG	;\r
	LD	HL,LOCREG	;\r
	LD	BC,4		;\r
	LDIR			;TRANSFER TC OFFSET TO DIF-REG.\r
\r
	LD	HL,UTCCOD	;\r
	LD	(ADDRTC),HL	;SAVE UTC ADDRESS\r
	LD	HL,COMBYT	;\r
	LD	(HL),0FFH	;"CLEAR" COMMAND BYTE\r
	CALL	CLEARY		;SUSPEND ALL CONTROL PROCESSES AND FLAGS\r
	RESTART	S,LOCKNR,LOCK	;INITIALIZE LOCK PROCESS\r
	LD	HL,FLAG1	;\r
	SET	5,(HL)		;SET LOCK-FLAG\r
\r
\r
\r
;-----------------------------------------------------------------------\r
RETBUF:	LD	DE,(BFSAVE)\r
	CALL	ID1		;RETURN BUFFER TO EMPTY BUFFER QUEUE\r
	JP	START\r
\r
;-----------------------------------------------------------------------\r
\r
\r
;-----------------------------------------------------------------------\r
;                        SUBROUTINES :\r
;-----------------------------------------------------------------------\r
POUTPT:	LD	(COMBYT),A\r
	CALL	OUTPUT		;SET THE ATR IN THE DESIRED MODE OF OPER.\r
	CALL	CLEARY\r
	RET\r
\r
\r
INIT:	LD	HL,COMBYT\r
	LD	(HL),0FFH	;"CLEAR" COMMAND BYTE\r
	CALL	CLEARY\r
	RESTART	S,SEARNR,SEARCH	;INITIALIZE SEARCH PROCESS\r
	RET\r
\r
\r
TRANSF:	LD	IX,(BFSAVE)\r
        LD	IY,TMPCOD	;\r
	LD	(IY),00H	;\r
	LD	(IY+1),00H	;\r
	LD	A,(IX+9)	;\r
	LD	(IY+2),A	;\r
	LD	A,(IX+10)	;\r
	LD	(IY+3),A	;\r
\r
	LD	IX,CONS09	;\r
	LD	BC,TMPCOD	;\r
	CALL	TCADD		;CUE UP TIME + TTC OFFSET\r
\r
	LD	IX,(BFSAVE)	;\r
	LD	BC,11		;\r
	ADD	IX,BC		;\r
	LD	BC,TTCREG	;\r
	CALL	TCSUB		;SAVE (SPEC.TTC-(CUE UP TIME+TTC OFFSET))\r
	JR	NC,TR1		;IF (SPEC.TTC-(CUE UP TIME+TTC OFFS.) < 0 THEN\r
	PUSH	IX		;BEGIN\r
	POP	HL		;\r
	LD	DE,TTCREG	;  SET (TTCREG) = SPEC. TTC\r
	LD	BC,4		;\r
	LDIR			;END\r
\r
TR1:	LD	IX,(BFSAVE)	;\r
	LD	IY,TMPCOD	;\r
	LD	(IY),00H	;\r
	LD	(IY+1),00H	;\r
	LD	A,(IX+9)	;\r
	LD	(IY+2),A	;\r
	LD	A,(IX+10)	;\r
	LD	(IY+3),A	;\r
\r
	LD	IX,CONS02	;\r
	LD	BC,TMPCOD	;\r
	CALL	TCADD		;CUE UP TIME + MTC OFFSET\r
\r
	LD	IX,MTCREG	;\r
	LD	BC,MTC00	;\r
	CALL	TCSUB		;SAVE (SPEC.MTC-(CUE UP TIME+MTC OFFSET))\r
	RET	NC		;IF (SPEC.MTC-(CUE UP TIME+MTC OFFS.) < 0 THEN\r
	PUSH	IX		;BEGIN\r
	POP	HL		;\r
	LD	DE,MTC00	;  SET MTC00 = SPEC.MTC\r
	LD	BC,4		;\r
	LDIR			;END\r
	RET\r
\r
	DSEG\r
	DS	32\r
STAC06:\r
	END\r