Compucolor.org – Virtual Media

Listing of file='MACROS.MAC;01' on disk='vmedia/taylor_5-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	MACROS - MACRO OPERATIONS (DEFINE, EXPAND, GET, PUT)
;
	TITLE	MACROS
;

	EXTRN	CO,OSTR,SAVE
	EXTRN	ABORT
	EXTRN	CI
	EXTRN	DISCTL
	EXTRN	READ
	EXTRN	SEND
	EXTRN	SETFIL

;	FCS ROUTINES

	EXTRN	EMESS,PFSPC,RESET,OPEN
	EXTRN	CLSEQO,RWSEQI,INSEQO
	EXTRN	GTBYT,PTBYT

;	OFFSETS IN FILE PARAMETER BLOCK

FOPT	EQU	0
FATR	EQU	1
FNAM	EQU	2
FTYP	EQU	8
FVER	EQU	11
FSBK	EQU	12
FSIZ	EQU	14
FLBC	EQU	16
FLAD	EQU	17
FSAD	EQU	19
FSPR	EQU	21
FDBK	EQU	22
FDEN	EQU	23
FAUX	EQU	24
FHAN	EQU	26
FFCN	EQU	28
FDRV	EQU	29
FBLK	EQU	30
FBUF	EQU	32
FXBC	EQU	34
FPTR	EQU	36

;	SPECIAL CONTROL CHARACTERS

CR	EQU	13
LF	EQU	10
FF	EQU	12
TAB	EQU	9
ESC	EQU	27

;	PARAMETERS

MACLEN	EQU	64	;MAXIMUM LENGTH OF A MACRO
NUMMAC	EQU	10	;NUMBER OF MACROS AVAILABLE


;.............................................................
;
;	CLRMAC - CLEAR THE MACROS TO ZERO
;
	ENTRY	CLRMAC

CLRMAC:	LXI	H,MACRO0
	XRA	A
	MVI	C,NUMMAC
CLRM10:	MVI	B,MACLEN
CLRM20:	MOV	M,A
	INX	H
	DCR	B
	JNZ	CLRM20
	DCR	C
	JNZ	CLRM10
	RET

;.............................................................
;
;	CONTROL-D - DEFINE MACRO
;
	ENTRY	DEFMAC

DEFMAC:	CALL	DISCTL
	CALL	MACNUM
	PUSH	H
	MVI	B,MACLEN
	XRA	A
DEF10:	MOV	M,A
	INX	H
	DCR	B
	JNZ	DEF10
	LXI	H,MACMSG
	CALL	OSTR
	LXI	H,BUFFER
	CALL	READ
	POP	H
	LXI	D,BUFFER
DEF20:	LDAX	D
	ORA	A
	JZ	DEF30
	CPI	0FFH
	JZ	DEF30
	MOV	M,A
	INX	D
	INX	H
	JMP	DEF20
DEF30:
	RET

MACRO0:	DS	MACLEN
MACRO1:	DS	MACLEN
MACRO2:	DS	MACLEN
MACRO3:	DS	MACLEN
MACRO4:	DS	MACLEN
MACRO5:	DS	MACLEN
MACRO6:	DS	MACLEN
MACRO7:	DS	MACLEN
MACRO8:	DS	MACLEN
MACRO9:	DS	MACLEN

MACNUM:	CALL	CI
	CPI	'0'
	JC	MACNUM
	CPI	'9'+1
	JNC	MACNUM
	SUI	'0'-1
MACN10:	LXI	B,MACLEN
	LXI	H,MACRO0-MACLEN
MACN20:	DAD	B
	DCR	A
	JNZ	MACN20
	RET

;.............................................................
;
;	CONTROL-X - EXPAND MACRO
;
;	   ALTERNATE ENTRY POINT IS USED TO SIMPLY PRINT A
;	MACRO, I.E. WITHOUT SENDING IT. THE ACCUM SHOULD
;	CONTAIN THE NUMBER OF THE MACRO IN THIS CASE.
;
	ENTRY	EXPMAC
	ENTRY	PRTMAC

EXPMAC:	CALL	DISCTL
	CALL	MACNUM
	XRA	A
	STA	PRT
	JMP	EXP5
PRTMAC:	ADI	1
	STA	PRT
	CALL	MACN10
EXP5:	PUSH	H
	MVI	A,CR
	CALL	CO
	MVI	A,LF
	CALL	CO
	POP	H
	MVI	B,MACLEN
EXP10:	PUSH	B
	PUSH	H
	LDA	ABORT
	ORA	A
	JZ	EXP15
	XRA	A
	STA	ABORT
	JMP	EXP30
EXP15:	MOV	A,M
	ORA	A
	JZ	EXP30
	PUSH	PSW
	CALL	CO
	LDA	PRT
	ORA	A
	JNZ	EXP20
	POP	PSW
	CALL	SEND
	JMP	EXP25
EXP20:	POP	PSW
EXP25:	POP	H
	INX	H
	POP	B
	DCR	B
	JNZ	EXP10
EXP30:	POP	H
	POP	B
	MVI	A,CR
	CALL	CO
	MVI	A,LF
	CALL	CO
	RET

PRT:	DB	0

;.............................................................
;
;	CONTROL-G - GET MACROS FROM A FILE
;
	ENTRY	GETMAC

GETMAC:	CALL	DISCTL
	LXI	B,MACTYP
	LXI	D,IOBUF
	LXI	H,FPB
	XRA	A
	CALL	SETFIL
	LXI	H,MACRO0
	PUSH	H
	MVI	C,NUMMAC
GETM10:	MVI	B,MACLEN
GETM20:	LXI	H,FPB
	CALL	GTBYT
	JC	FILERR
	POP	H
	MOV	M,A
	INX	H
	PUSH	H
	DCR	B
	JNZ	GETM20
	DCR	C
	JNZ	GETM10
	POP	H
	RET

FILERR:	JZ	EOF
	LXI	H,ERRMSG
	CALL	OSTR
	RET

EOF:	RET

;..............................................................
;
;	CONTROL-P - PUT MACROS INTO A FILE
;
	ENTRY	PUTMAC

PUTMAC:	CALL	DISCTL
	LXI	B,MACTYP
	LXI	D,IOBUF
	LXI	H,FPB
	MVI	A,1
	CALL	SETFIL
	LXI	H,MACRO0
	PUSH	H
	MVI	C,NUMMAC
PUTM10:	MVI	B,MACLEN
PUTM20:	POP	H
	MOV	A,M
	INX	H
	PUSH	H
	LXI	H,FPB
	CALL	PTBYT
	JC	FILERR
	DCR	B
	JNZ	PUTM20
	DCR	C
	JNZ	PUTM10
	CALL	CLSEQO
	JC	FILERR
	POP	H
	RET

;..............................................................
;
;	MESSAGES
;

MACMSG:	DB	13,10,6,3,'ENTER MACRO (64 CHR MAX):',6,2
	DB	13,10,239
ERRMSG:	DB	17,'*** HARDWARE ERROR ***',13,10,239

MACTYP:	DB	'ABV'		;DEFAULT FILE TYPE FOR MACROS

;..............................................................
;
;	DATA AREAS
;

	DB	0FFH
BUFFER:	DS	MACLEN	;CONSOLE INPUT BUFFER
	DB	0FFH
IOBUF:	DS	1024	;FILE I/O BUFFER

FPB:	DS	38	;FILE PARAMETER BLOCK

	END