home *** CD-ROM | disk | FTP | other *** search
- ; Micro Cornucopia Magazine Issue #49
- ; TSR Figure 3 - POPUP.ASM
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; POPUP.ASM ;;
- ;; Resident program to save screen. ;;
- ;; Press both shift keys to save first screen or to activate. ;;
- ;; Press Alt/Rt. shift keys to save new screen. ;;
- ;; <ESC> to exit. ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- IVT SEGMENT AT 0H ;INTERRUPT TABLE SEGMENT
- ORG 9H*4
- KEYBD DW 2 DUP (?) ;INT 9H VECTOR
- IVT ENDS
- ;--------------------------------------------------------------------
- CODE SEGMENT PARA PUBLIC 'CODE' ;CODE SEGMENT
- ASSUME CS:CODE
- ORG 100H
- BEGIN: JMP INIT ;GOTO INITIALIZATION ROUTINE
- OLDKB LABEL DWORD ;INT 9H ADDRESS IN ROM
- OLDKEY DW 2 DUP (?) ;STORE OLD INT 9H VECTOR
- SCREEN DB 4000 DUP ('S') ;STORE ORIGINAL SCREEN
- SHIFT DB 0 ;SAVE SHIFT STATUS CODE
- STATUS DB 0 ;CHECK NEW SCREEN STATUS
- POPUP DB 4000 DUP ('P') ;POP-UP SCREEN
- ;--------------------------------------------------------------------
- ;MAIN is made resident and every keystroke routed here.
- ;--------------------------------------------------------------------
- MAIN PROC NEAR ;NEW INT 9H VECTOR POINTS HERE
- STI ;ENABLE INTERRUPTS
- PUSH AX ;SAVE REGISTERS
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH DS
- PUSH ES
- PUSHF ;SIMULATE INTERRUPT RETURN
- CALL OLDKB ;PROCESS OLD KEYBD ROUTINE IN ROM
- MOV AH,2 ;RETURN KEYBD FLAGS
- INT 16H
- MOV SHIFT,AL ;SAVE SHIFT STATUS
- AND AL,3
- CMP AL,3 ;BOTH SHIFT KEYS PRESSED?
- JE SAVE ;IF YES, THEN SAVE SCREEN
- MOV AL,SHIFT ;RESTORE SHIFT STATUS
- AND AL,9 ;ALT AND RT. SHIFT KEYS PRESSED?
- CMP AL,9
- JNE EXIT ;IF NO, THEN EXIT HANDLER
- MOV STATUS,0 ;EXPECT NEW SCREEN
- JMP SAVE ;GET NEW SCREEN
-
- EXIT: POP ES ;RESTORE REGISTERS AND EXIT
- POP DS
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- IRET ;RETURN TO PARENT PROGRAM
-
- ;--------------------------------------------------------------------
- ;This routine activated when both shift keys or Alt/Rt shift pressed.
- ;--------------------------------------------------------------------
- ;Save the original cursor position
- SAVE: MOV AH,3 ;READ CURSOR POSITION
- MOV BH,0 ;SELECT PAGE 0
- INT 10H
- PUSH DX ;SAVE CURSOR POSITION
- PUSH CX ;SAVE CURSOR SIZE
-
- ;Save the original screen
- MOV AX,0B800H ;COLOR GRAPHICS MEMORY
- MOV DS,AX ;SOURCE SEGMENT
- MOV SI,0 ;SOURCE OFFSET
- PUSH CS
- POP ES ;DEST. SEG
- MOV DI,OFFSET SCREEN ;DEST. OFFSET
- CLD ;CLEAR DIRECTIONAL FLAG
- MOV CX,4000 ;MOVE 4000 BYTES
- REP MOVSB ;FROM VIDEO TO MEMORY
-
- ;Determine if new screen
- CMP STATUS,0FFH ;CHECK NEW SCREEN STATUS
- JE READY ;IF YES, THEN GOTO READY
-
- ;Move the first pop-up screen
- PUSH CS
- POP DS ;SOURCE SEG
- PUSH CS
- POP ES ;DEST. SEG
- MOV SI,OFFSET SCREEN ;SOURCE OFFSET
- MOV DI,OFFSET POPUP ;DEST. OFFSET
- MOV CX,4000 ;MOVE 4000 BYTES
- REP MOVSB ;FROM SCREEN TO POPUP
- MOV STATUS,0FFH ;CHANGE STATUS AFTER FIRST RUN
- JMP POS
-
- ;Save new pop-up screen
- READY: MOV DI,0 ;DEST. OFFSET
- MOV SI,OFFSET POPUP ;SOURCE OFFSET
- PUSH CS
- POP DS ;SOURCE SEG
- MOV AX,0B800H
- MOV ES,AX ;DEST. SEG
- CLD
- MOV CX,4000 ;MOVE 4000 BYTES
- REP MOVSB ;FROM MEMORY TO VIDEO
-
- ;Turn cursor off
- POS: MOV AH,2 ;POSITION CURSOR
- MOV BH,0
- MOV DL,0 ;FIRST COLUMN
- MOV DH,25 ;ROW OFF VIDEO DISPLAY
- INT 10H
-
- ;Wait for escape keystroke
- WAIT: MOV AH,0 ;WAIT FOR KEYSTROKE
- INT 16H
- CMP AL,27 ;ESCAPE KEY?
- JNZ WAIT
-
- ;Restore original cursor
- POP CX ;ORIGINAL CURSOR SIZE
- POP DX ;ORIGINAL CURSOR POSITION
- MOV BH,0
- MOV AH,2 ;SET CURSOR
- INT 10H
-
- ;Restore original screen
- MOV DI,0 ;DEST. OFFSET
- MOV SI,OFFSET SCREEN ;SOURCE OFFSET
- PUSH CS
- POP DS ;SOURCE SEGMENT
- MOV AX,0B800H
- MOV ES,AX ;DEST. SEGMENT
- CLD
- MOV CX,4000 ;MOVE 4000 BYTES
- REP MOVSB ;FROM MEMORY TO VIDEO
- JMP EXIT ;HANDLER IS DONE
- MAIN ENDP
-
- ;--------------------------------------------------------------------
- ;INIT is executed once and is not made resident.
- ;--------------------------------------------------------------------
- INIT PROC NEAR
- MOV AX,IVT ;SET DS TO INTERRUPT VECTOR TABLE
- MOV DS,AX
- ASSUME DS:IVT
- MOV AX,KEYBD ;SAVE OLD INT 9H VECTOR
- MOV OLDKEY,AX
- MOV AX,KEYBD[2]
- MOV OLDKEY[2],AX
- CLI ;DISABLE INTERRUPTS
- MOV KEYBD,OFFSET MAIN ;INSTALL NEW VECTOR
- MOV KEYBD[2],CS
- STI ;ENABLE INTERRUPTS
- MOV DX,OFFSET INIT ;SAVE TO END OF MAIN PROCEDURE
- INT 27H ;TSR
- INIT ENDP
- ;--------------------------------------------------------------------
- CODE ENDS
- END BEGIN