home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / asmutil / extnd.iqc / EXTND.INC
Text File  |  1994-03-04  |  7KB  |  304 lines

  1. ;
  2. ;  EXTND.INC  --
  3.     .SALL                ;;DONT BORE POEPLE WITH EXPANSION
  4.         IF1                             ;;WE NEED ONLY INVOLVE PASS 1
  5. ;       WRITTEN FOR THE MICROSOFT ASSEMBLER TO DEFINE
  6. ;       THE UNIQUE INSTRUCTIONS IN NEC'S PD70108/PD70116
  7. ;       MICROPROCESSOR.  INCLUDE THIS FILE IN YOUR PROGRAM
  8. ;       WITHIN ANY SEGMENT DEFINITION BEFORE USING THE NEC
  9. ;       INSTRUCTIONS; E.G.
  10. ;
  11. ;CSEG   SEGMENT PUBLIC PARA
  12. ;       ASSUME CS:CSEG,DS:CSEG,SS:CSEG
  13. ;
  14. ;       INCLUDE EXTND.INC
  15. ;
  16. ;       ORG     100H
  17. ;START:
  18. ;       <ETC.>
  19.  
  20.  
  21. ;       WE NEED TO DEFINE SOME LABELS TO HELP US DIFERENTIATE BETWEEN
  22. ;       8 BIT REGISTER ARG.S AND 16 BIT REGISTER ARG.S TO OUR MACROS
  23. ;       AND TO GIVE THE REGISTERS VALUES WITH WHICH TO BUILD INSTRUCTIONS
  24. ;
  25.     .VAL    = 0
  26.     IRPC    Z,ACDB            ;; DEFINE THE FIRST 4 16 BIT REGGIES
  27. .&Z&X    EQU THIS WORD
  28. @&Z&X    = .VAL
  29.     .VAL = .VAL + 1
  30.     ENDM
  31.  
  32.         .VAL    = 0
  33.         IRPC    Z,ACDB                  ;; DEFINE ALL OF THE 8 BIT REGISTERS
  34. .&Z&L   EQU THIS BYTE
  35. @&Z&L    = .VAL
  36. .&Z&H   EQU THIS BYTE
  37. @&Z&H    = .VAL + 4
  38.     .VAL = .VAL + 1
  39.         ENDM
  40.  
  41. ;
  42. ;SET_TYPE -
  43. ;       GIVEN AN ARGUMENT, SETS THE VARIABLE 'TYPE_OF_ARG' TO
  44. ;               0   IF IT IS AN IMMEDIATE VALUE
  45. ;               1            A  BYTE VARIABLE REFERENCE
  46. ;               2               WORD VARIABLE
  47. ;               ...        ETC
  48. ;             101               BYTE REGISTER
  49. ;             102               WORD REGISTER
  50. ;             201               BYTE PTR TYPE REFERENCE
  51. ;             202               WORD PTR TYPE REFERENCE
  52. ;
  53. SET_TYPE MACRO ARG
  54.         IFIDN <ARG>,<BYTE>
  55.         TYPE_OF_ARG = 201H
  56.     ELSE
  57.         IFIDN <ARG>,<WORD>            TYPE_OF_ARG = 202H
  58.         ELSE
  59.             TYPE_OF_ARG = TYPE ARG
  60.             IFE TYPE_OF_ARG
  61.                 IFDEF .&ARG
  62.                     TYPE_OF_ARG = TYPE .&ARG
  63.                     IF TYPE_OF_ARG
  64.                         TYPE_OF_ARG = TYPE_OF_ARG + 100H
  65.                     ENDIF
  66.                 ENDIF
  67.             ENDIF
  68.         ENDIF
  69.     ENDIF
  70.     ENDM
  71. ;
  72. ;OK WE CAN NOW BEGIN DEFINING THE NEC UNIQUE INSTRUCTIONS
  73.  
  74. ;THE BCD INSTRUCTIONS-
  75. ;       THESE HAVE NO ARGUMENTS, SO JUST PUT THE OPCODE
  76.  
  77. ADD4S    MACRO
  78.         DB    0FH,20H
  79.     ENDM
  80.  
  81. SUB4S    MACRO
  82.         DB    0FH,22H
  83.     ENDM
  84.  
  85. CMP4S    MACRO
  86.         DB    0FH,26H
  87.     ENDM
  88.  
  89.  
  90.  
  91. ;THE BIT FIELD INSTRUCTIONS-
  92. ;       THESE ALLOW EITHER TWO ONE BYTE REGISTERS OR ELSE A BYTE REGISTER
  93. ;       AND AN IMMEDIATE BYTE VALUE.  HERE WE CAN DO ALMOST COMPLETE ERROR
  94. ;       CHECKING BECAUSE OF THE SIMPLE ARGUMENT TYPES.
  95. ;       DEFINE A TEMPLATE TO DO THAT.
  96.  
  97. BIT_FIELD MACRO OC,ARG1,ARG2
  98.  
  99.     .OK = 1
  100.     SET_TYPE ARG1            ;;CHECK ARGUMENT 1 FOR VALIDITY (REG8)
  101.     IF TYPE_OF_ARG - 101H
  102.         ARG1    ; ARGUMENT MUST BE BYTE REGISTER
  103.         .OK = 0
  104.         ENDIF
  105.  
  106.     OPCODE = OC
  107.     IF .OK
  108.         SET_TYPE ARG2        ;;NOW CHECK ARGUMENT 2 (REG8 OR IMM8)
  109.         IFE TYPE_OF_ARG
  110.             OPCODE = OPCODE + 8    ;;IMMEDIATE ARG
  111.         ELSE            IF TYPE_OF_ARG-101H    ;;CHECK FOR REG8
  112.                 ARG2    ARGUMENT MUST BE BYTE REG OR IMMED
  113.                 .OK = 0
  114.             ENDIF
  115.         ENDIF
  116.     ENDIF
  117.  
  118.     IF .OK                ;;IF ARGUMENTS OK, BUILD INSTR.
  119.         DB    0FH
  120.         DB    OPCODE
  121.         IFE TYPE_OF_ARG
  122.             DB 0C0H+@&ARG1    ;;IMMED8 TYPE SECOND ARG
  123.             DB ARG2
  124.         ELSE
  125.             DB 0C0H + (@&ARG2 SHL 3) + @&ARG1 ;;REG8 TYPE 2ND ARG
  126.         ENDIF
  127.     ENDIF
  128.     ENDM
  129.  
  130. ;INS-
  131.  
  132. INS     MACRO   ARG1,ARG2
  133.         BIT_FIELD 31H,ARG1,ARG2
  134.         ENDM
  135.  
  136. ;EXT-
  137.  
  138. EXT     MACRO   ARG1,ARG2
  139.         BIT_FIELD 33H,ARG1,ARG2
  140.         ENDM
  141.  
  142. ;NOW THE BIT INSTRUCTIONS
  143. ;       THE BIT INSTRUCTIONS HAVE A COMPLICATED STRUCTURE, ALLOWING
  144. ;       EITHER CL OR ELSE AN IMMED VALUE FOLLOWED BY ANY REGISTER OR MEMORY
  145. ;       REFERENCE (IT WAS NECESSARY TO REVERSE THE ARGUMENTS FROM NEC'S
  146. ;       DEFINITION BECAUSE OF THE COMPLESITY OF THE ADDRESSING MODES ALLOWED.
  147. ;       THIS TEMPLATE BUILDS USES THE 'INC' INSTRUCTION
  148. ;       TO BUILD THE MORE COMPLICATED ADDRESSING MODES FOR IT (THE OPCODE
  149. ;       OF THE INC INSTRUCTION IS OVERWRITTEN WITH THE PROPER CODE AFTER
  150. ;       THE ASSEMBLER GENERATES IT)
  151.  
  152. BIT    MACRO    OC,ARG1,ARG2,ARG3,ARG4
  153.     LOCAL    OPC,CONT
  154.  
  155.     OPCODE = OC
  156.     .OK = 1
  157.  
  158.     IFDIF <ARG1>,<CL>        ;;1ST ARG MUST BE CL OR IMMED
  159.         SET_TYPE ARG1
  160.         IF TYPE_OF_ARG
  161.             ARG1    ; ARGUMENT MUST BE CL OR IMMEDIATE VALUE
  162.                         .OK = 0
  163.         ELSE
  164.             OPCODE = OPCODE + 8 ;;IF NOT CL, SET CL BIT IN OPCODE
  165.         ENDIF    ENDIF
  166.  
  167.     IF .OK
  168.         SET_TYPE ARG2
  169.         IFE TYPE_OF_ARG ;;2ND ARG ANYTHING BUT IMMED
  170.             ARG2    ; ARGUMENT MAY NOT BE IMMEDIATE VALUE
  171.             .OK = 0
  172.         ENDIF
  173.         IFE (TYPE_OF_ARG-2H) MOD 100H ;;IF MEM16 OR REG16 SET W BIT IN OPCODE
  174.             OPCODE = OPCODE + 1
  175.         ENDIF
  176.         ENDIF
  177.  
  178.     IF .OK
  179.         DB    0FH
  180.         IFE (TYPE_OF_ARG-102H)    ;;FOR REG16 WE MUST BUILD INSTR
  181.             DB OPCODE
  182.             DB 0C0H+@&ARG2
  183.         ELSE
  184. OPC:            INC ARG2 ARG3 ARG4    ;;LET 'INC' BUILD THE ARGUMENT
  185. CONT:            ORG OPC
  186.             DB OPCODE        ;;NOW OVERWRITE OPCODE W/ OURS
  187.             ORG CONT
  188.         ENDIF
  189.         IFDIF <ARG1>,<CL>
  190.             DB ARG1
  191.         ENDIF
  192.     ENDIF
  193.         ENDM
  194.  
  195. ;TEST1 -
  196.  
  197. TEST1    MACRO    ARG1,ARG2,ARG3,ARG4
  198.         BIT    10H,ARG1,ARG2,ARG3,ARG4
  199.     ENDM
  200.  
  201. ;NOT1 -
  202.  
  203. NOT1    MACRO   ARG1,ARG2,ARG3,ARG4
  204.         BIT    16H,ARG1,ARG2,ARG3,ARG4
  205.     ENDM
  206.  
  207. ;CLR1 -
  208.  
  209. CLR1    MACRO   ARG1,ARG2,ARG3,ARG4
  210.         BIT    12H,ARG1,ARG2,ARG3,ARG4
  211.         ENDM
  212.  
  213. ;SET1 -
  214.  
  215. SET1    MACRO   ARG1,ARG2,ARG3,ARG4
  216.         BIT    14H,ARG1,ARG2,ARG3,ARG4
  217.     ENDM
  218.  
  219.  
  220. ;NEW STRING PREFIXES
  221. ;       NO ARGUMENTS ALLOWED HERE
  222.  
  223. REPC    MACRO
  224.         DB    65H
  225.     ENDM
  226.  
  227. REPNC    MACRO
  228.         DB    64H
  229.     ENDM
  230.  
  231.  
  232.  
  233.  
  234. ;THE BCD ROTATES
  235. ;       ONLY ONE ARGUMENT BEING ANY VALID ONE BYTE REFERENCE.  AGAIN
  236. ;       WE USE THE 'INC' INSTRUCTION TO BUILD THE PROPER ADDRESSING BYTES
  237. ;       AND THEN OVERWRITE THE OPCODE WITH OUR OWN
  238.  
  239. BCD_ROT MACRO    OPCODE,ARG1,ARG2,ARG3
  240.     LOCAL    OPC,CONT
  241.  
  242.     SET_TYPE ARG1
  243.     IF (TYPE_OF_ARG - 01H) MOD 100H
  244.         ARG1    ARG2 ARG3; ARGUMENT MUST BE A BYTE REFERENCE
  245.         ELSE
  246.         DB    0FH
  247. OPC:        INC    ARG1 ARG2 ARG3
  248. CONT:        ORG    OPC
  249.         DB    OPCODE
  250.         ORG    CONT
  251.     ENDIF
  252.         ENDM
  253.  
  254. ;ROL4-
  255.  
  256. ROL4    MACRO ARG1,ARG2,ARG3,ARG4
  257.         BCD_ROT 28H,ARG1,ARG2,ARG3
  258.     ENDM
  259.  
  260. ;ROR4-
  261.  
  262. ROR4    MACRO ARG1,ARG2,ARG3,ARG4
  263.         BCD_ROT 2AH,ARG1,ARG2,ARG3
  264.     ENDM
  265.  
  266. ;
  267. ;SEGMENT OVERRIDE
  268. ;       PROVIDE A METHOD FOR INCLUDING SEGMENT OVERRIDES
  269. ;
  270. CS_    MACRO ARG1,ARG2,ARG3,ARG4,ARG5
  271.     DB    2EH
  272.     ARG1    ARG2,ARG3,ARG4,ARG5
  273.     ENDM
  274. ES_    MACRO ARG1,ARG2,ARG3,ARG4,ARG5
  275.     DB    26H
  276.     ARG1    ARG2,ARG3,ARG4,ARG5
  277.     ENDM
  278.  
  279. SS_    MACRO ARG1,ARG2,ARG3,ARG4,ARG5
  280.     DB    36H
  281.     ARG1    ARG2,ARG3,ARG4,ARG5
  282.     ENDM
  283.  
  284. ;J_NOT_NEC <LABEL>
  285. ;       NOT STRICTLY A NEC UNIQUE INSTRUCTION, THIS MACRO TESTS
  286. ;       THE CPU TO DETERMINE IF IT IS AN INTEL 8086/88 OR NEC
  287. ;       V20/V30; IF IT IS THE 86/88 IT JUMPS TO THE LABEL ARGUMENT,
  288. ;       ELSE IT CONTINUES.  ALL REGISTERS ARE RETAINED EXCEPT CX.
  289.  
  290. J_NOT_NEC MACRO ARG
  291.     LOCAL    V_SERIES
  292.  
  293.     PUSH    CS            ;;PUSH CS IN CASE IT'S INTEL
  294.     XOR    CX,CX
  295.     SET1    0,CX            ;;INTEL WILL POP CS, NEC WILL SET BIT IN CX
  296.     OR    CX,CX            ;;IS CX STILL 0?
  297.     JNZ    V_SERIES
  298.     JMP    ARG            ;;YES -- AHA, ITS AN INTEL CHIP
  299. V_SERIES:
  300.     POP    CX            ;;NO -- ITS NEC, BUT READJUST THE STACK
  301.     ENDM
  302.  
  303.     ENDIF                ;;END OF MACRO INCLUDE FILE
  304.