[net.sources] V20/V30 MASM macros

john@moncol.UUCP (John Ruschmeyer) (12/04/85)

Following this little message is an include file containing macros for use
with MASM to allow you to use the new instructions in the NEC V20/V30.

I got this from a BBS, so...


Name:		John Ruschmeyer
US Mail:	Monmouth College, W. Long Branch, NJ 07764
Phone:		(201) 571-3451	*** NEW NUMBER ***
UUCP:		...!vax135!petsd!moncol!john	...!princeton!moncol!john
						   ...!pesnta!moncol!john
---------------------------- *** Cut here *** ------------------------------

;
;  EXTND.INC  --
	.SALL				;;DONT BORE POEPLE WITH EXPANSION
        IF1                             ;;WE NEED ONLY INVOLVE PASS 1
;       WRITTEN FOR THE MICROSOFT ASSEMBLER TO DEFINE
;       THE UNIQUE INSTRUCTIONS IN NEC'S PD70108/PD70116
;       MICROPROCESSOR.  INCLUDE THIS FILE IN YOUR PROGRAM
;       WITHIN ANY SEGMENT DEFINITION BEFORE USING THE NEC
;       INSTRUCTIONS; E.G.
;
;CSEG   SEGMENT PUBLIC PARA
;       ASSUME CS:CSEG,DS:CSEG,SS:CSEG
;
;       INCLUDE EXTND.INC
;
;       ORG     100H
;START:
;       <ETC.>


;       WE NEED TO DEFINE SOME LABELS TO HELP US DIFERENTIATE BETWEEN
;       8 BIT REGISTER ARG.S AND 16 BIT REGISTER ARG.S TO OUR MACROS
;       AND TO GIVE THE REGISTERS VALUES WITH WHICH TO BUILD INSTRUCTIONS
;
	.VAL	= 0
	IRPC	Z,ACDB			;; DEFINE THE FIRST 4 16 BIT REGGIES
.&Z&X	EQU THIS WORD
@&Z&X	= .VAL
	.VAL = .VAL + 1
	ENDM

        .VAL    = 0
        IRPC    Z,ACDB                  ;; DEFINE ALL OF THE 8 BIT REGISTERS
.&Z&L   EQU THIS BYTE
@&Z&L	= .VAL
.&Z&H   EQU THIS BYTE
@&Z&H	= .VAL + 4
	.VAL = .VAL + 1
        ENDM

;
;SET_TYPE -
;       GIVEN AN ARGUMENT, SETS THE VARIABLE 'TYPE_OF_ARG' TO
;               0   IF IT IS AN IMMEDIATE VALUE
;               1            A  BYTE VARIABLE REFERENCE
;               2               WORD VARIABLE
;               ...        ETC
;             101               BYTE REGISTER
;             102               WORD REGISTER
;             201               BYTE PTR TYPE REFERENCE
;             202               WORD PTR TYPE REFERENCE
;
SET_TYPE MACRO ARG
        IFIDN <ARG>,<BYTE>
		TYPE_OF_ARG = 201H
	ELSE
		IFIDN <ARG>,<WORD>			TYPE_OF_ARG = 202H
		ELSE
			TYPE_OF_ARG = TYPE ARG
			IFE TYPE_OF_ARG
				IFDEF .&ARG
					TYPE_OF_ARG = TYPE .&ARG
					IF TYPE_OF_ARG
						TYPE_OF_ARG = TYPE_OF_ARG + 100H
					ENDIF
				ENDIF
			ENDIF
		ENDIF
	ENDIF
	ENDM
;
;OK WE CAN NOW BEGIN DEFINING THE NEC UNIQUE INSTRUCTIONS

;THE BCD INSTRUCTIONS-
;       THESE HAVE NO ARGUMENTS, SO JUST PUT THE OPCODE

ADD4S	MACRO
		DB	0FH,20H
	ENDM

SUB4S	MACRO
		DB	0FH,22H
	ENDM

CMP4S	MACRO
		DB	0FH,26H
	ENDM



;THE BIT FIELD INSTRUCTIONS-
;       THESE ALLOW EITHER TWO ONE BYTE REGISTERS OR ELSE A BYTE REGISTER
;       AND AN IMMEDIATE BYTE VALUE.  HERE WE CAN DO ALMOST COMPLETE ERROR
;       CHECKING BECAUSE OF THE SIMPLE ARGUMENT TYPES.
;       DEFINE A TEMPLATE TO DO THAT.

BIT_FIELD MACRO OC,ARG1,ARG2

	.OK = 1
	SET_TYPE ARG1			;;CHECK ARGUMENT 1 FOR VALIDITY (REG8)
	IF TYPE_OF_ARG - 101H
		ARG1	; ARGUMENT MUST BE BYTE REGISTER
		.OK = 0
        ENDIF

	OPCODE = OC
	IF .OK
		SET_TYPE ARG2		;;NOW CHECK ARGUMENT 2 (REG8 OR IMM8)
		IFE TYPE_OF_ARG
			OPCODE = OPCODE + 8	;;IMMEDIATE ARG
		ELSE			IF TYPE_OF_ARG-101H	;;CHECK FOR REG8
				ARG2	ARGUMENT MUST BE BYTE REG OR IMMED
				.OK = 0
			ENDIF
		ENDIF
	ENDIF

	IF .OK				;;IF ARGUMENTS OK, BUILD INSTR.
		DB	0FH
		DB	OPCODE
		IFE TYPE_OF_ARG
			DB 0C0H+@&ARG1	;;IMMED8 TYPE SECOND ARG
			DB ARG2
		ELSE
			DB 0C0H + (@&ARG2 SHL 3) + @&ARG1 ;;REG8 TYPE 2ND ARG
		ENDIF
	ENDIF
	ENDM

;INS-

INS     MACRO   ARG1,ARG2
		BIT_FIELD 31H,ARG1,ARG2
        ENDM

;EXT-

EXT     MACRO   ARG1,ARG2
		BIT_FIELD 33H,ARG1,ARG2
        ENDM

;NOW THE BIT INSTRUCTIONS
;       THE BIT INSTRUCTIONS HAVE A COMPLICATED STRUCTURE, ALLOWING
;       EITHER CL OR ELSE AN IMMED VALUE FOLLOWED BY ANY REGISTER OR MEMORY
;       REFERENCE (IT WAS NECESSARY TO REVERSE THE ARGUMENTS FROM NEC'S
;       DEFINITION BECAUSE OF THE COMPLESITY OF THE ADDRESSING MODES ALLOWED.
;       THIS TEMPLATE BUILDS USES THE 'INC' INSTRUCTION
;       TO BUILD THE MORE COMPLICATED ADDRESSING MODES FOR IT (THE OPCODE
;       OF THE INC INSTRUCTION IS OVERWRITTEN WITH THE PROPER CODE AFTER
;       THE ASSEMBLER GENERATES IT)

BIT	MACRO	OC,ARG1,ARG2,ARG3,ARG4
	LOCAL	OPC,CONT

	OPCODE = OC
	.OK = 1

	IFDIF <ARG1>,<CL>		;;1ST ARG MUST BE CL OR IMMED
		SET_TYPE ARG1
		IF TYPE_OF_ARG
			ARG1	; ARGUMENT MUST BE CL OR IMMEDIATE VALUE
                        .OK = 0
		ELSE
			OPCODE = OPCODE + 8 ;;IF NOT CL, SET CL BIT IN OPCODE
		ENDIF	ENDIF

	IF .OK
		SET_TYPE ARG2
		IFE TYPE_OF_ARG ;;2ND ARG ANYTHING BUT IMMED
			ARG2	; ARGUMENT MAY NOT BE IMMEDIATE VALUE
			.OK = 0
		ENDIF
		IFE (TYPE_OF_ARG-2H) MOD 100H ;;IF MEM16 OR REG16 SET W BIT IN OPCODE
			OPCODE = OPCODE + 1
		ENDIF
        ENDIF

	IF .OK
		DB	0FH
		IFE (TYPE_OF_ARG-102H)	;;FOR REG16 WE MUST BUILD INSTR
			DB OPCODE
			DB 0C0H+@&ARG2
		ELSE
OPC:			INC ARG2 ARG3 ARG4	;;LET 'INC' BUILD THE ARGUMENT
CONT:			ORG OPC
			DB OPCODE		;;NOW OVERWRITE OPCODE W/ OURS
			ORG CONT
		ENDIF
		IFDIF <ARG1>,<CL>
			DB ARG1
		ENDIF
	ENDIF
        ENDM

;TEST1 -

TEST1	MACRO	ARG1,ARG2,ARG3,ARG4
		BIT	10H,ARG1,ARG2,ARG3,ARG4
	ENDM

;NOT1 -

NOT1    MACRO   ARG1,ARG2,ARG3,ARG4
		BIT	16H,ARG1,ARG2,ARG3,ARG4
	ENDM

;CLR1 -

CLR1    MACRO   ARG1,ARG2,ARG3,ARG4
		BIT	12H,ARG1,ARG2,ARG3,ARG4
        ENDM

;SET1 -

SET1    MACRO   ARG1,ARG2,ARG3,ARG4
		BIT	14H,ARG1,ARG2,ARG3,ARG4
	ENDM


;NEW STRING PREFIXES
;       NO ARGUMENTS ALLOWED HERE

REPC	MACRO
		DB	65H
	ENDM

REPNC	MACRO
		DB	64H
	ENDM




;THE BCD ROTATES
;       ONLY ONE ARGUMENT BEING ANY VALID ONE BYTE REFERENCE.  AGAIN
;       WE USE THE 'INC' INSTRUCTION TO BUILD THE PROPER ADDRESSING BYTES
;       AND THEN OVERWRITE THE OPCODE WITH OUR OWN

BCD_ROT MACRO	OPCODE,ARG1,ARG2,ARG3
	LOCAL	OPC,CONT

	SET_TYPE ARG1
	IF (TYPE_OF_ARG - 01H) MOD 100H
		ARG1	ARG2 ARG3; ARGUMENT MUST BE A BYTE REFERENCE
        ELSE
		DB	0FH
OPC:		INC	ARG1 ARG2 ARG3
CONT:		ORG	OPC
		DB	OPCODE
		ORG	CONT
	ENDIF
        ENDM

;ROL4-

ROL4    MACRO ARG1,ARG2,ARG3,ARG4
		BCD_ROT 28H,ARG1,ARG2,ARG3
	ENDM

;ROR4-

ROR4	MACRO ARG1,ARG2,ARG3,ARG4
		BCD_ROT 2AH,ARG1,ARG2,ARG3
	ENDM

;
;SEGMENT OVERRIDE
;       PROVIDE A METHOD FOR INCLUDING SEGMENT OVERRIDES
;
CS_	MACRO ARG1,ARG2,ARG3,ARG4,ARG5
	DB	2EH
	ARG1	ARG2,ARG3,ARG4,ARG5
	ENDM
ES_	MACRO ARG1,ARG2,ARG3,ARG4,ARG5
	DB	26H
	ARG1	ARG2,ARG3,ARG4,ARG5
	ENDM

SS_	MACRO ARG1,ARG2,ARG3,ARG4,ARG5
	DB	36H
	ARG1	ARG2,ARG3,ARG4,ARG5
	ENDM

;J_NOT_NEC <LABEL>
;       NOT STRICTLY A NEC UNIQUE INSTRUCTION, THIS MACRO TESTS
;       THE CPU TO DETERMINE IF IT IS AN INTEL 8086/88 OR NEC
;       V20/V30; IF IT IS THE 86/88 IT JUMPS TO THE LABEL ARGUMENT,
;       ELSE IT CONTINUES.  ALL REGISTERS ARE RETAINED EXCEPT CX.

J_NOT_NEC MACRO ARG
	LOCAL	V_SERIES

	PUSH	CS			;;PUSH CS IN CASE IT'S INTEL
	XOR	CX,CX
	SET1	0,CX			;;INTEL WILL POP CS, NEC WILL SET BIT IN CX
	OR	CX,CX			;;IS CX STILL 0?
	JNZ	V_SERIES
	JMP	ARG			;;YES -- AHA, ITS AN INTEL CHIP
V_SERIES:
	POP	CX			;;NO -- ITS NEC, BUT READJUST THE STACK
	ENDM

	ENDIF				;;END OF MACRO INCLUDE FILE