TITLE "Program 12-1" .MODEL SMALL .STACK 200 .DATA M1 DB 13, 10,'*** MOUSE PRESENT ***' str1 db "This is a test line",'$' W1 DW 0 STR2 DB 15,16 DUP ('$') str3 DB "cORRECT",'$' .CODE MP MACRO ;Is mouse present? LOCAL M1, M2, M3 PUSH ES MOV AX, 3533H ;Read vector 33H INT 21H MOV AX, ES OR AX, BX ;Test for ES:BX= 00 JZ M2 CMP BYTE PTR[BX], 0CFH ;Test for 0CFH JZ M2 ;If not, end macro MOV AX, 0000 ;Start mouse INT 33H OR AX, AX JZ M2 ;No mouse CLC ;If mouse, Carry = 0 JMP M3 M2: PUSH DS MOV AX, CS MOV DS, AX ;DISPLAY M1 ;Show no mouse POP DS STC ;If no mouse, carry =1 M3: POP ES ENDM MON MACRO ;Enable Mouse Pointer MOV AX, 0001H INT 33H ENDM MOFF MACRO ;Disable Mouse Pointer MOV AX, 0002H INT 33H ENDM MBUT MACRO NUM ;Read Button MOV AX, 0005H ;NUM = 0 for left MOV BX, NUM ; NUM = 1 for right INT 33H ; NUM = 4 for middle ENDM MRTime MACRO NUM ;Read Mouse Status MOV AX, 0003H INT 33H ENDM .STARTUP MOV AX,0A000H ;address video RAM at segment A000 MOV DS,AX CLD ;select increment MOV AX, 12H ;Switch to mode 12H INT 10H MOV AX,@DATA MOV ES,AX mov di,OFFSET STR1 MOV SI,20 ;column 0 top1: MOV AL,ES:[DI] ;display 'A' MOV DL,3 ;cyan MOV BX,5 ;row 5 ;MOV ES:W1,AL PUSH DI push ES CALL CHAR ;display cyan 'A' POP ES POP DI ;MOV DI,W1 inc si inc di MOV AL,ES:[DI] ;display 'A' cmp AL,'$' jne top1 MP ;Test for mouse JC MAIN2 ;If no mouse MON ;Enable mouse pointer MAIN1: MBUT 1 ;Read Mouse Status on-the-fly CMP CX, 160 ;Test for left and right buttons JL MAIN1 ;If both not pressed repeat CMP CX,320 JG MAIN1 CMP DX,40 JL MAIN1 CMP DX,50 JG MAIN1 MAIN2: MOFF ;Disable mouse pointer MOV AX, 03H ;Switch to mode 3 INT 10H MOV AX,@DATA MOV DS,AX MOV AH,0AH MOV DX,OFFSET STR2 INT 21H MAIN3: MOV AH,00 INT 16H CMP AH,3BH JNE MAIN3 MOV AX, 03H ;Switch to mode 3 INT 10H MOV AH,09 MOV DX,OFFSET STR3 INT 21H mov ah,01 int 21h .EXIT CHAR PROC NEAR PUSH CX PUSH DX PUSH BX ;save row address PUSH AX ;save ASCII MOV AX,1130H ;get 8 x 8 set MOV BH,3 INT 10H ;segment is in ES POP AX ;get ASCII code MOV AH,0 SHL AX,1 ;multiply by 8 SHL AX,1 SHL AX,1 ADD BP,AX ;index character in ROM POP BX ;get row address MOV AX,80*9 ;find row address MUL BX MOV DI,AX ADD DI,SI ;add in column address MOV CX,8 ;set count to 8 rows C1: MOV DX,3CEH ;address bit mask register MOV AL,8 ;load index 8 MOV AH,ES:[BP] ;get character row INC BP ;point to next row OUT DX,AX ;modify bit mask register MOV DX,3C4H ;address map mask register MOV AX,0F02H OUT DX,AX ;select all planes INC DX MOV AL,[DI] ;read data MOV BYTE PTR [DI],0 ;write black POP AX ;get color PUSH AX OUT DX,AL ;write color MOV BYTE PTR [DI],0FFH ADD DI,80 ;address next raster row LOOP C1 ;repeat 8 times POP DX POP CX RET CHAR ENDP END