; Doug's Programming Language  -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;
	.XLIST
;
;------------------------====< DPL LANGUAGE MACROS >====-----------------------
;
PROG	MACRO	EXTNAM
	NAME	EXTNAM
	PAGE	64,131
	TITLE	DPL 8086 MACRO, VERSION 2.22
;
DATA	SEGMENT PUBLIC PARA 'DATA'
@@@DPLMAIN	EQU	0FFH	;; DECLARES A MAIN PROGRAM
;
	ENDM
;
;------------------------===============================-----------------------
;
SUBPGM	MACRO	EXTNAM
	NAME	EXTNAM
	PAGE	64,131
	TITLE	DPL 8086 MACRO'S, VERSION 2.22
;
DATA	SEGMENT PUBLIC PARA 'DATA'
@@@DPLSUB	EQU	0FFH	;; DECLARES A SUBROUTINE
	ENDM
;
;----------------
;
BEGIN	MACRO	EXTNAM
;
; DPL EXTERNAL DATA
;
	IFNDEF	@@@DPLDAT
	EXTRN	STATUS:WORD, ZERO:WORD, @CR_LF:BYTE
	EXTRN	NULL:BYTE, EJECT:BYTE, BEEP:BYTE
	EXTRN	CRTFLAG:BYTE, VIDPAGE:BYTE, @DPLVER:BYTE
	EXTRN	@@@DPLREC:WORD
	ENDIF
;
DATA	ENDS
;
	IFDEF	@@@DPLMAIN
STACK	SEGMENT	STACK 'DGROUP'
	DW	256 DUP(?)
STACKD	LABEL	WORD
STACK	ENDS
	ENDIF
;
CODE	SEGMENT	PUBLIC PARA 'CODE'
	IFDEF	@@@DPLMAIN
	ASSUME	CS:CODE,DS:DATA,SS:STACK
	ELSE
	ASSUME	CS:CODE,DS:DATA
	ENDIF
;
	IFDEF	@@@DPLMAIN
	PUBLIC	EXTNAM
EXTNAM	PROC	FAR
	EXTRN	_DPLINIT:NEAR
	CLI
	MOV	AX,OFFSET STACKD
	MOV	SP,AX
	MOV	AX,SEG DATA
	MOV	DS,AX
	STI
	CALL	_DPLINIT
	ELSE
	PUBLIC	EXTNAM
EXTNAM	PROC	NEAR
	ENDIF
	ENDM
;
;----------------
;
ENDPGM	MACRO	EXTNAM
;
EXTNAM	ENDP
CODE	ENDS
;
ZSEG	SEGMENT	PARA MEMORY
ZSEG	ENDS
	END	EXTNAM
	ENDM
;
;---------------====< DATA DECLARATIONS >====--------------
;
; B U F F E R   MACRO
;
BUFFER	MACRO	LABL,LNGTH
	LOCAL	ENDBUF
LABL	DW	ENDBUF-$-4
	DW	00
	DB	LNGTH DUP(?)
ENDBUF	DB	00
	ENDM
;
;----------------
; F I L E   MACRO
;
@FFCLA	EQU	0		; 0  (2) FILE CLASS
@FFHAN	EQU	@FFCLA+2	; 2  (2) FILE HANDLE
@FFPTRL	EQU	@FFHAN+2	; 4  (2) FILE POINTER LOW WORD
@FFPTRH	EQU	@FFPTRL+2	; 6  (2) FILE POINTER HIGH WORD
@FFBUF	EQU	@FFPTRH+2	; 8  (2) BUFFER ADDRESS
@FFBPTR EQU	@FFBUF+2	; 10 (2) BUFFER POINTER
@FFSPEN	EQU	@FFBPTR+2	; 12 (1) PENDING STATUS
@FFSTA	EQU	@FFSPEN+1	; 13 (1) STATUS OF FILE
@FFOPN	EQU	@FFSTA+1	; 14 (1) FILE OPEN STATE
@FFNAM	EQU	@FFOPN+1	; 15 (2) FILE NAME
;
@FFKYW	EQU	@FFBPTR		; 10  (2) FILE KEY INTEGER OFFSET
;
; F I L E   C L A S S   VALUES
; 
@FFASC	EQU	0	; ASCII DEVICE ACCESS
@FFASF	EQU	2	; ASCII STRING FILE ACCESS
@FFBIN	EQU	4	; BINARY/ASCII RECORD FILE ACCESS
@FFBIR	EQU	6	; RANDOM BINARY/ASCII RECORD FILE ACCESS
;
; FIOBUFFER WILL DOUBLE FOR RECORD SIZE IN 'R' FILES
;
FILE	MACRO	NAME,DES,CLASS,FIOBUFFER,FIOKEY
LOCAL	FIOBUF
	IFB	<CLASS>
NAME	LABEL	WORD
	DW	@FFASC			;; CLASS
	DW	6 DUP(00)		;; HANDLE,PTRL,PTRH
	DB	0FFH			;; OPEN STATE
	DB	DES,0			;; FILE NAME		
	ENDIF
;;
	IFIDN	<&CLASS>,<A>
NAME	LABEL	WORD
	DW	@FFASF			;; CLASS
	DW	3 DUP(00)		;; HANDLE,PTRL,PTRH
	IFB	<FIOBUFFER>
	DW	OFFSET FIOBUF		;; BUFFER OFFSET
	DW	OFFSET FIOBUF+@RDAT	;; BUFFER DATA POINTER
	ELSE
	DW	OFFSET FIOBUFFER	;; BUFFER OFFSET
	DW	OFFSET FIOBUFFER+@RDAT	;; BUFFER DATA POINTER
	ENDIF
	DW	00			;; PENDING/STATUS
	DB	0FFH			;; OPEN STATE
	DB	DES,0			;; FILE NAME		
	IFB	<FIOBUFFER>
BUFFER	FIOBUF,256
	ENDIF
	ENDIF
;;
	IFIDN	<&CLASS>,<B>
NAME	LABEL	WORD
	DW	@FFBIN			;; CLASS
	DW	3 DUP(0)		;; HANDLE,PTRL,PTRH
	IFB	<FIOBUFFER>
	DW	OFFSET FIOBUF		;; BUFFER OFFSET
	DW	OFFSET FIOBUF+@RDAT	;; BUFFER DATA POINTER
	ELSE
	DW	OFFSET FIOBUFFER	;; BUFFER OFFSET
	DW	OFFSET FIOBUFFER+@RDAT	;; BUFFER DATA POINTER
	ENDIF
	DW	00			;; PENDING/STATUS
	DB	0FFH			;; OPEN STATE
	DB	DES,0			;; FILE NAME		
	IFB	<FIOBUFFER>
BUFFER	FIOBUF,256
	ENDIF
	ENDIF
;;
	IFIDN	<&CLASS>,<R>
NAME	LABEL	WORD
	DW	@FFBIR			;; CLASS
	DW	3 DUP(0)		;; HANDLE,PTRL,PTRH
	DW	00			;; NO BUFFER
	DW	FIOBUFFER		;; KEY OFFSET
	DW	00			;; PENDING/STATUS
	DB	0FFH			;; OPEN STATE
	DB	DES,0			;; FILE NAME		
	ENDIF
;;
	ENDM
;
;----------------
;
INTEGER	MACRO	LABL
LABL	DW	00
	ENDM
;
;---------------
;
DEFINE	MACRO	LABL,STRNG
LABL	DB	STRNG
	DB	0
	ENDM
;
;---------------
;
ENDREC	MACRO	LABL
	IFB	<LABL>
	ERROR -- ENDREC requires a record name
	ELSE
	ORG	LABL+@RECSIZ+@RDAT
	ENDIF
	ENDM
;
;---------------
; RECORD MACRO
;
@RLEN	EQU	0
@RCUR	EQU	2
@RDAT	EQU	4
;
REC	MACRO	LABL,LNGTH
	LOCAL	LAB
@RECSIZ =	LNGTH
LABL	DW	LNGTH
	DW	00
	ENDM
;
;---------------
;
SET	MACRO	LABL,NUM
LABL	DW	NUM
	ENDM
;
;---------------
;
STRING	MACRO	LABL,LNGTH
	IFB	<LENGTH>
	ERROR - STRING needs a length
	ELSE
LABL	DB	LNGTH DUP(?)
	DB	0
	ENDIF
	ENDM
;
;-----------< REDEFINING MACROS >--------------
;
@FILEIO	MACRO
	EXTRN	_FILEIO:NEAR,_FWRT:NEAR,   _FREAD:NEAR, _FOPEN:NEAR
	EXTRN	_FCLOSE:NEAR,_FNOTE:NEAR, _FPOINT:NEAR
@FILEIO	MACRO
	ENDM
	ENDM
;
@CRSR	MACRO
	EXTRN	_CRSR:NEAR
@CRSR	MACRO
	ENDM
	ENDM
;
@DEC	MACRO
	EXTRN	_DEC:NEAR
@DEC	MACRO
	ENDM
	ENDM
;
@DV1616	MACRO
	EXTRN	_DV1616:NEAR
@DV1616	MACRO
	ENDM
	ENDM
;
@ENC	MACRO
	EXTRN	_ENC:NEAR
@ENC	MACRO
	ENDM
	ENDM
;
@IFSTR	MACRO
	EXTRN	_IFSEQ:NEAR,  _IFSNE:NEAR
@IFSTR	MACRO
	ENDM
	ENDM
;
@INKY	MACRO
	EXTRN	_INKY:NEAR
@INKY	MACRO
	ENDM
	ENDM
;
@ITOBS	MACRO
	EXTRN	_ITOBS:NEAR
@ITOBS	MACRO
	ENDM
	ENDM
;
@ITOHS	MACRO
	EXTRN	_ITOHS:NEAR
@ITOHS	MACRO
	ENDM
	ENDM
;
@HSTOI	MACRO
	EXTRN	_HSTOI:NEAR
@HSTOI	MACRO
	ENDM
	ENDM
;
@SCONCAT MACRO
	EXTRN	_SCONCAT:NEAR, _STREND:NEAR, _STRLEN:NEAR
@SCONCAT MACRO
	ENDM
	ENDM
;
;-----------< CODE MACROS >-----------
;
CLOSE	MACRO	FNAME
	@FILEIO
	MOV	SI,OFFSET FNAME
	CALL	_FCLOSE
	ENDM
;
;---------------
;
CURSOR	MACRO	X,Y
	@CRSR
	MOV	AX,X
	MOV	DX,Y
	CALL	_CRSR
	ENDM
;
;---------------
;
DECODE	MACRO	INTGR,STRNG
	@DEC
	MOV	SI,OFFSET STRNG
	CALL	_DEC
	MOV	INTGR,AX
	ENDM
;
;----------------
; 
ENCODE	MACRO	STRNG,INTGR
	@ENC
	MOV	AX,INTGR
	MOV	DI,OFFSET STRNG
	CALL	_ENC
	ENDM
;
;---------------
;
GOTO	MACRO	LABL
	JMP	LABL
	ENDM
;	
;---------------
;
HSTOI	MACRO	INTGR,STRNG
	@HSTOI
	MOV	SI,OFFSET STRNG
	CALL	_HSTOI
	MOV	INTGR,AX
	ENDM
;
;---------------
;
INKEY	MACRO	STRNG,PAUS
	@INKY
	IFIDN	<&PAUS>,<WAIT>
	MOV	DL,0FFH
	ELSE
	SUB	DL,DL
	ENDIF
	CALL	_INKY
	IFNB	<STRNG>
	MOV	WORD PTR [STRNG],AX
	ENDIF
	ENDM
;
;---------------
;
ITOBS	MACRO	STRNG,INTGR,LEN
	@ITOBS
	MOV	AX,INTGR
	IFNB	<LEN>
	MOV	CX,LEN
	ELSE
	ERROR -- NO LENGTH DECLARED !!!
	ENDIF
	MOV	DI,OFFSET STRNG
	CALL	_ITOBS
	ENDM
;
;---------------
;
ITOHS	MACRO	STRNG,INTGR
	@ITOHS
	MOV	BX,INTGR
	MOV	DI,OFFSET STRNG
	CALL	_ITOHS
	ENDM
;
;---------------
;
; ADD integer
@ADD	MACRO	INTGR
	ADD	AX,WORD PTR INTGR
	ENDM
;
; AND integer
@AND	MACRO	INTGR
	IFIDN	<&INTGR>,<1>
	INC	AX
	ELSE
	AND	AX,WORD PTR INTGR
	ENDIF
	ENDM
;
; LOAD integer
@LOAD	MACRO	INTGR
	MOV	AX,WORD PTR INTGR
	ENDM
;
; MULTIPLY integer
@MULT	MACRO	INTGR
	MOV	BX,WORD PTR INTGR
	IMUL	BX
	ENDM
;
; OR integer
@OR	MACRO	INTGR
	OR	AX,WORD PTR INTGR
	ENDM
;
; DIVIDE INTEGER
@DIV	MACRO	INTGR
	@DV1616
	MOV	BX,WORD PTR INTGR
	CALL	_DV1616
	ENDM
;
; MOD
@MOD	MACRO	INTGR
	@DV1616
	MOV	BX,WORD PTR INTGR
	CALL	_DV1616
	MOV	AX,DX
	ENDM
;
; SHIFT LEFT integer
@SHL	MACRO	INTGR
	MOV	CX,WORD PTR INTGR
	SHL	AX,CL
	ENDM
;
; SHIFT RIGHT integer
@SHR	MACRO	INTGR
	MOV	CX,WORD PTR INTGR
	SHR	AX,CL
	ENDM
;
; STORE	integer
@STOR	MACRO	INTGR
	MOV	WORD PTR INTGR, AX
	ENDM
;
; SUBTRACT integer
@SUB	MACRO	INTGR
	IFIDN	<&INTGR>,<1>
	DEC	AX
	ELSE
	SUB	AX,INTGR
	ENDIF
	ENDM
;
; XOR integer
@XOR	MACRO	INTGR
	XOR	AX,WORD PTR INTGR
	ENDM
;
;---------------
;
NOTE	MACRO	FNAME,PNTR
	@FILEIO
	MOV	SI,OFFSET FNAME
	MOV	DI,OFFSET PNTR
	CALL	_FNOTE
	ENDM
;
;---------------
;
OPEN	MACRO	ACC,LABL
	@FILEIO
	IFIDN	<&ACC>,<INPUT>
	MOV	AL,00
	ENDIF
	IFIDN	<&ACC>,<OUTPUT>
	MOV	AL,01
	ENDIF
	IFIDN	<&ACC>,<IO>
	MOV	AL,02
	ENDIF
	MOV	SI,OFFSET LABL
	CALL	_FOPEN
	ENDM
;
;---------------
;
POINT	MACRO	FNAME,PNTR
	@FILEIO
	MOV	SI,OFFSET FNAME
	MOV	DI,OFFSET PNTR
	CALL	_FPOINT
	ENDM
;
;---------------
;
READ	MACRO	FNAME,STRNG,BYTES
	@FILEIO
	MOV	SI,OFFSET FNAME
	MOV	DI,OFFSET STRNG
	IFB	<BYTES>
	ERROR -- NO LENGTH DECLARED !!!
	ELSE
	MOV	CX,BYTES
	ENDIF
	CALL	_FREAD
	ENDM
;
;---------------
;
READB	MACRO	FNAME,FREC
	@FILEIO
	MOV	SI,OFFSET FNAME
	MOV	DI,OFFSET FREC
	CALL	_FREAD
	ENDM
;
;---------------
;
RETURN	MACRO	X
	RET
	ENDM
;
;---------------
;
STOP	MACRO	VAL
	MOV	AH,4CH
	IFNB	<&VAL>
	MOV	AL,BYTE PTR VAL
	ELSE
	SUB	AL,AL
	ENDIF
	INT	21H
	ENDM
;
;---------------
;
; LOAD STRING & TERMINATE
@SMOV	MACRO	STRNG
	MOV	DI,OFFSET STRNG
	MOV	BYTE PTR [DI],00
	ENDM
;
; CONCATENATE SOURCE STRING
@SCNCT	MACRO	STRNG
	@SCONCAT
	MOV	SI,OFFSET STRNG
	CALL	_SCONCAT
	ENDM
;
; MOVE TO END OF STRING
@SCATSME MACRO	STRNG
	@SCONCAT
	MOV	SI,OFFSET STRNG
	CALL	_STREND
	MOV	DI,SI
	ENDM
;
;---------------
;
WRITE	MACRO	FNAME,STRNG,CRFLG
	@FILEIO
	MOV	DI,OFFSET FNAME
	IFNB	<&STRNG>
	MOV	SI,OFFSET STRNG
	ELSE
	SUB	SI,SI
	ENDIF
	IFIDN	<&CRFLG>,<CR>
	MOV	AL,0FFH
	ELSE
	SUB	AL,AL
	ENDIF
	CALL	_FWRT
	ENDM
;
;---------------
;
WRITEB	MACRO	FNAME,FREC
	@FILEIO
	MOV	DI,OFFSET FNAME
	MOV	SI,OFFSET FREC
	CALL	_FWRT
	ENDM
;
	.LIST
	.LALL
