1 Title TestMACRO2 :.: 2 CR EQU 0dh 3 LF = 0ah 4 INTADDR EQU 23h*4 5 EXTRN HAHA:FAR,HeeHee:FAR 6 PROC_CR MACRO ; process Carriage Return 7 CMP AL,CR ; is it Carriage Return? 8 JNE NOTCR ;..no 9 DISPCHR LF ;..yes, output LineFeed 10 MOV AL,CR ; recover AL 11 NOTCR: 12 ENDM 13 case123 MACRO argval,first,last,addjust,OKGOTO 14 LOCAL next 15 ;; Note: nothing can appear before "LOCAL" definition 16 cmp FLAG,argval 17 JNE next 18 cmp AL,first 19 JB OKGOTO 20 CMP AL,last 21 JA OKGOTO 22 ADD AL,addjust ; &first <=AL<= last 23 JMP short OKGOTO 24 next: ; Try FLAG == %(argval+1) 25 ENDM 65 Call Heehee 26 DISPCHR MACRO WHAT 66 Lea DX,Msg 27 MOV DL,WHAT 67 MOV Ah,9 28 MOV AH,2 68 Int 21h 29 INT 21h 69 MOV Ah,4ch 30 ENDM 70 Int 21h 31 Assume CS:ccc,DS:CCC,SS:stack 71 PASSword DB "54088AND08845" 32 ccc segment public 72 PWLEN EQU $ - PASSWORD 33 GOGO: CALL HaHa 73 MSG DB 10,13,"Very clever" 34 MOV AX,ccc 74 DB 7,CR,LF,"$" 35 MOV DS,AX 75 ccc ENDS 36 MOV SI, -1 76 STACK segment STACK 37 KEYIN: MOV AH,8 77 DW 128 DUP(?) 38 int 21h 78 STACK ENDS 39 INC SI 79 END GOGO 40 CMP AL,Password[SI] 41 JE OK 42 MOV SI,-1 ; reset Si 43 OK: PROC_CR 44 CMP AL,5 ; is Ctrl_E ? 45 JNE NOTCTLE ;..no 46 DISPCHR 7 ;..yes, output BELL 47 INC FLAG ;..and rotate the FLAG 48 CMP FLAG,3 ; over limit? 49 JB KeyIN ;..no ==0,1,2 50 MOV FLAG,0 ;..yes, re-cycle from 0 51 JMP KeyIN ;..and, ignore the Ctrl_E 52 FLAG DB 0 ; one byte used as a FLAG 53 NOTCTLE: ; any key except Ctrl_E 54 CASE123 0,"a","z",-32,ECHO ;UPPER case only 55 CASE123 1,"A","Z",32,ECHO ; lower case only 56 CMP FLAG,2 57 JNE KEYIN ;Impossible 58 ; +++ preserve the original ForMat (case) 59 ECHO: 60 DISPCHR AL 61 ;;; Now, check to see if we reach the last char in Password 62 CMP SI,PWLEN-1 63 JL KEYIN ;..no, get next char ... 64 EXIT: ;;;..yes, we are done