ALIGN0 MACRO looplabel
  TMP_MACRO_1 MACRO
    looplabel:
    ENDM
  ENDM

ALIGN1 MACRO inst1:VARARG
  TMP_MACRO_2 MACRO
    inst1
    ENDM
  ENDM

ALIGN2 MACRO inst2:VARARG
  PREV_PC = $
  ALIGN 16
  CURR_PARA_BOUND = $
  ORG PREV_PC
  TMP_MACRO_2		;;inst1
  inst2			;;inst2
  CURR_PC = $
  ALIGN 16
  NEXT_PARA_BOUND = $
  ORG PREV_PC
  IF NEXT_PARA_BOUND-CURR_PC EQ 0
    ;;insts end on para bound
    FILL CURR_PARA_BOUND-PREV_PC
  ELSE
    IF NEXT_PARA_BOUND-PREV_PC GT 16
      ;;insts straddle para bound
      FILL CURR_PARA_BOUND-PREV_PC
      ENDIF
    ENDIF
  TMP_MACRO_1		;;looplabel:
  TMP_MACRO_2		;;inst1
  inst2			;;inst2
  PURGE TMP_MACRO_1
  PURGE TMP_MACRO_2
  ENDM

FILL MACRO arg
LOCAL y
  ;;The FILL macro shows several
  ;;innovative ways to do nothing.
  ;;All LEAs and MOVs used here
  ;;are one-cycle instructions.
  IF arg EQ 1
    ;;This is a 1-byte instruction
    NOP
    ENDIF
  IF arg EQ 2
    ;;This is a 2-byte instruction
    MOV AX,AX
    ENDIF
  IF arg EQ 3
    ;;This is a 3-byte instruction
    LEA BP,[BP]
    ENDIF
  IF arg EQ 4
    ;;Code for LEA DI,[DI+0000]
    db  08dh,0bdh,000h,000h
    ENDIF
  IF arg EQ 5
    ;;Code for LEA SI,[SI+0000]
    db	08dh,0b4h,000h,000h
    NOP
    ENDIF
  IF arg EQ 6
    ;;Code for LEA BX,[BX+0000]
    DB  08dh,09fh,000h,000h
    MOV AX,AX
    ENDIF
  IF arg GT 6
    JMP  SHORT y
    DB arg-2 DUP (90h)
y: EXITM
    ENDIF
  ENDM

