home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / microcrn / issue_49.arc / TSR-CODE.ARC / POPUP.ASM < prev    next >
Assembly Source File  |  1989-07-11  |  7KB  |  168 lines

  1. ; Micro Cornucopia Magazine Issue #49
  2. ; TSR Figure 3 - POPUP.ASM
  3.  
  4.  
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ;; POPUP.ASM                                                   ;;
  7. ;; Resident program to save screen.                            ;;
  8. ;; Press both shift keys to save first screen or to activate.  ;;
  9. ;; Press Alt/Rt. shift keys to save new screen.                ;;
  10. ;; <ESC> to exit.                                              ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13. IVT     SEGMENT AT 0H     ;INTERRUPT TABLE SEGMENT
  14.         ORG 9H*4
  15. KEYBD   DW 2 DUP (?)      ;INT 9H VECTOR
  16. IVT     ENDS
  17. ;--------------------------------------------------------------------
  18. CODE    SEGMENT PARA PUBLIC 'CODE'  ;CODE SEGMENT
  19.         ASSUME CS:CODE
  20.         ORG 100H
  21. BEGIN:  JMP  INIT                 ;GOTO INITIALIZATION ROUTINE
  22. OLDKB   LABEL DWORD               ;INT 9H ADDRESS IN ROM
  23. OLDKEY  DW 2 DUP (?)              ;STORE OLD INT 9H VECTOR
  24. SCREEN  DB  4000 DUP ('S')        ;STORE ORIGINAL SCREEN
  25. SHIFT   DB  0                     ;SAVE SHIFT STATUS CODE
  26. STATUS  DB  0                     ;CHECK NEW SCREEN STATUS
  27. POPUP   DB  4000 DUP ('P')        ;POP-UP SCREEN
  28. ;--------------------------------------------------------------------
  29. ;MAIN is made resident and every keystroke routed here.
  30. ;--------------------------------------------------------------------
  31. MAIN    PROC  NEAR                ;NEW INT 9H VECTOR POINTS HERE
  32.         STI                       ;ENABLE INTERRUPTS
  33.         PUSH  AX                  ;SAVE REGISTERS
  34.         PUSH  BX
  35.         PUSH  CX
  36.         PUSH  DX
  37.         PUSH  SI
  38.         PUSH  DI
  39.         PUSH  DS
  40.         PUSH  ES
  41.         PUSHF                     ;SIMULATE INTERRUPT RETURN
  42.         CALL  OLDKB               ;PROCESS OLD KEYBD ROUTINE IN ROM
  43.         MOV   AH,2                ;RETURN KEYBD FLAGS
  44.         INT   16H
  45.         MOV   SHIFT,AL            ;SAVE SHIFT STATUS
  46.         AND   AL,3
  47.         CMP   AL,3                ;BOTH SHIFT KEYS PRESSED?
  48.         JE    SAVE                ;IF YES, THEN SAVE SCREEN
  49.         MOV   AL,SHIFT            ;RESTORE SHIFT STATUS
  50.         AND   AL,9                ;ALT AND RT. SHIFT KEYS PRESSED?
  51.         CMP   AL,9
  52.         JNE   EXIT                ;IF NO, THEN EXIT HANDLER
  53.         MOV   STATUS,0            ;EXPECT NEW SCREEN
  54.         JMP   SAVE                ;GET NEW SCREEN
  55.  
  56. EXIT:   POP   ES                  ;RESTORE REGISTERS AND EXIT
  57.         POP   DS
  58.         POP   DI
  59.         POP   SI
  60.         POP   DX
  61.         POP   CX
  62.         POP   BX
  63.         POP   AX
  64.         IRET                      ;RETURN TO PARENT PROGRAM
  65.  
  66. ;--------------------------------------------------------------------
  67. ;This routine activated when both shift keys or Alt/Rt shift pressed.
  68. ;--------------------------------------------------------------------
  69. ;Save the original cursor position
  70. SAVE:   MOV   AH,3                ;READ CURSOR POSITION
  71.         MOV   BH,0                ;SELECT PAGE 0
  72.         INT   10H
  73.         PUSH  DX                  ;SAVE CURSOR POSITION
  74.         PUSH  CX                  ;SAVE CURSOR SIZE
  75.  
  76. ;Save the original screen
  77.         MOV     AX,0B800H         ;COLOR GRAPHICS MEMORY
  78.         MOV     DS,AX             ;SOURCE SEGMENT
  79.         MOV     SI,0              ;SOURCE OFFSET
  80.         PUSH    CS
  81.         POP     ES                ;DEST. SEG
  82.         MOV     DI,OFFSET SCREEN  ;DEST. OFFSET
  83.         CLD                       ;CLEAR DIRECTIONAL FLAG
  84.         MOV     CX,4000           ;MOVE 4000 BYTES
  85.         REP     MOVSB             ;FROM VIDEO TO MEMORY
  86.  
  87. ;Determine if new screen
  88.         CMP     STATUS,0FFH       ;CHECK NEW SCREEN STATUS
  89.         JE      READY             ;IF YES, THEN GOTO READY
  90.  
  91. ;Move the first pop-up screen
  92.         PUSH    CS
  93.         POP     DS                ;SOURCE SEG
  94.         PUSH    CS
  95.         POP     ES                ;DEST. SEG
  96.         MOV     SI,OFFSET SCREEN  ;SOURCE OFFSET
  97.         MOV     DI,OFFSET POPUP   ;DEST. OFFSET
  98.         MOV     CX,4000           ;MOVE 4000 BYTES
  99.         REP     MOVSB             ;FROM SCREEN TO POPUP
  100.         MOV     STATUS,0FFH       ;CHANGE STATUS AFTER FIRST RUN
  101.         JMP     POS
  102.  
  103. ;Save new pop-up screen
  104. READY:  MOV     DI,0              ;DEST. OFFSET
  105.         MOV     SI,OFFSET POPUP   ;SOURCE OFFSET
  106.         PUSH    CS
  107.         POP     DS                ;SOURCE SEG
  108.         MOV     AX,0B800H
  109.         MOV     ES,AX             ;DEST. SEG
  110.         CLD
  111.         MOV     CX,4000           ;MOVE 4000 BYTES
  112.         REP     MOVSB             ;FROM MEMORY TO VIDEO
  113.  
  114. ;Turn cursor off
  115. POS:    MOV   AH,2                ;POSITION CURSOR
  116.         MOV   BH,0
  117.         MOV   DL,0                ;FIRST COLUMN
  118.         MOV   DH,25               ;ROW OFF VIDEO DISPLAY
  119.         INT   10H
  120.  
  121. ;Wait for escape keystroke
  122. WAIT:   MOV   AH,0                ;WAIT FOR KEYSTROKE
  123.         INT   16H
  124.         CMP   AL,27               ;ESCAPE KEY?
  125.         JNZ   WAIT
  126.  
  127. ;Restore original cursor
  128.         POP     CX                ;ORIGINAL CURSOR SIZE
  129.         POP     DX                ;ORIGINAL CURSOR POSITION
  130.         MOV     BH,0
  131.         MOV     AH,2              ;SET CURSOR
  132.         INT     10H
  133.  
  134. ;Restore original screen
  135.         MOV     DI,0              ;DEST. OFFSET
  136.         MOV     SI,OFFSET SCREEN  ;SOURCE OFFSET
  137.         PUSH    CS
  138.         POP     DS                ;SOURCE SEGMENT
  139.         MOV     AX,0B800H
  140.         MOV     ES,AX             ;DEST. SEGMENT
  141.         CLD
  142.         MOV     CX,4000           ;MOVE 4000 BYTES
  143.         REP     MOVSB             ;FROM MEMORY TO VIDEO
  144.         JMP     EXIT              ;HANDLER IS DONE
  145. MAIN    ENDP
  146.  
  147. ;--------------------------------------------------------------------
  148. ;INIT is executed once and is not made resident.
  149. ;--------------------------------------------------------------------
  150. INIT    PROC NEAR
  151.         MOV  AX,IVT               ;SET DS TO INTERRUPT VECTOR TABLE
  152.         MOV  DS,AX
  153.         ASSUME  DS:IVT
  154.         MOV  AX,KEYBD             ;SAVE OLD INT 9H VECTOR
  155.         MOV  OLDKEY,AX
  156.         MOV  AX,KEYBD[2]
  157.         MOV  OLDKEY[2],AX
  158.         CLI                       ;DISABLE INTERRUPTS
  159.         MOV  KEYBD,OFFSET MAIN    ;INSTALL NEW VECTOR
  160.         MOV  KEYBD[2],CS
  161.         STI                       ;ENABLE INTERRUPTS
  162.         MOV  DX,OFFSET INIT       ;SAVE TO END OF MAIN PROCEDURE
  163.         INT  27H                  ;TSR
  164. INIT    ENDP
  165. ;--------------------------------------------------------------------
  166. CODE    ENDS
  167.         END  BEGIN
  168.