; MASM /DVERSION=x /DTEXTE=y MACROS
; mit x=1,2,3,4 und y=1,2,3
; .lall ; Makroexpansion im Listing (Default)
; .sall ; Keine Makroexpansion im Listing
IF VERSION EQ 1
OUTCHAR MACRO
MOV AH,2
INT 21h
ENDM
INCHAR MACRO
MOV AH,1
INT 21h
ENDM
ENDIF
IF VERSION EQ 2
OUTCHAR MACRO
PUSH AX
MOV AH,2
INT 21h
POP AX
ENDM
INCHAR MACRO
PUSH BX
MOV BH,AH
MOV AH,1
INT 21h
MOV AH,BH
POP BX
ENDM
ENDIF
IF VERSION EQ 3
OUTCHAR MACRO CHAR
PUSH AX
PUSH DX
MOV AH,2
; Problem falls AH an CHAR uebergeben wird
MOV DL,CHAR
INT 21h
POP DX
POP AX
ENDM
INCHAR MACRO CHAR
PUSH AX
MOV AH,1
INT 21h
MOV CHAR,AL
POP AX
; Problem falls AL oder AH an CHAR uebergeben wird
ENDM
ENDIF
IF VERSION EQ 4
OUTCHAR MACRO CHAR
PUSH AX
PUSH DX
MOV DL,CHAR
MOV AH,2
INT 21h
POP DX
POP AX
ENDM
INCHAR MACRO CHAR
IF ("&CHAR&" NE "AL") AND ("&CHAR&" NE "AH")
PUSH AX
MOV AH,1
INT 21h
MOV CHAR,AL
POP AX
ELSE
PUSH BX
PUSH AX
MOV AH,1
INT 21h
MOV BL,AL
POP AX
MOV CHAR,BL
POP BX
ENDIF
ENDM
ENDIF
OUTSTR MACRO STR
PUSH DS
PUSH AX
PUSH DX
MOV AX,SEG STR
MOV DS,AX
MOV DX,OFFSET STR
MOV AH,9
INT 21h
POP DX
POP AX
POP DS
ENDM
OUTCSTR MACRO STR
LOCAL CSTR,_CSTR
PUSH DS
PUSH AX
PUSH DX
PUSH CS
POP DS
MOV DX,OFFSET CSTR
MOV AH,9
INT 21h
POP DX
POP AX
POP DS
JMP _CSTR
CSTR DB ">>&STR&<<$"
_CSTR:
ENDM
REGSAVE MACRO
IRP REGS,<AX,BX,CX,DX,SI,DI>
PUSH REGS
ENDM
ENDM
REGREST MACRO
IRP REGS,<DI,SI,DX,CX,BX,AX>
POP REGS
ENDM
ENDM
CRLF MACRO
REGSAVE
MOV AH,2
MOV DL,13
INT 21h
MOV DL,10
INT 21h
REGREST
ENDM
STOP MACRO
MOV AX,4C00h
INT 21h
ENDM
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
MAIN PROC
MOV AX,DSEG
MOV DS,AX
IF (VERSION EQ 1) OR (VERSION EQ 2)
INCHAR
MOV DL,AL
OUTCHAR
ENDIF
IF VERSION EQ 3
OUTCHAR '>'
INCHAR BL
OUTCHAR BL
OUTCHAR '<'
ENDIF
IF VERSION EQ 4
OUTCHAR '>'
INCHAR AH
OUTCHAR AH
INCHAR AL
OUTCHAR AL
OUTCHAR '<'
ENDIF
IF TEXTE EQ 1
CRLF
MOV AH,9
MOV DX,OFFSET TAF
INT 21h
ENDIF
IF TEXTE EQ 2
CRLF
OUTSTR TAF
ENDIF
IF TEXTE EQ 3
CRLF
OUTCSTR <Moin Moin>
CRLF
OUTSTR TAF
CRLF
OUTCSTR <Really :-)>
ENDIF
STOP
MAIN ENDP
CSEG ENDS
DSEG SEGMENT
TAF DB "Thats all folks$"
DSEG ENDS
SSEG SEGMENT STACK
DW 128 DUP (?)
SSEG ENDS
END MAIN