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

  1. ; Micro Cornucopia Issue #49
  2. ; TSR Figure 4 - RENEGADE.ASM
  3.  
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. ;; RENEGADE.ASM                                             ;;
  6. ;; Same operation as POPUP.ASM but takes over INT 1CH and   ;;
  7. ;; invokes CHECK procedure 18.2 times per second.           ;;
  8. ;; Recaptures INT 9H and excludes other resident programs.  ;;
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10.  
  11. IVT     SEGMENT AT 0H     ;INTERRUPT TABLE SEGMENT
  12.         ORG 9H*4
  13. KEYBD   DW 2 DUP (?)      ;INT 9H VECTOR
  14.         ORG 1CH*4
  15. TIMER   DW  2 DUP (?)     ;INT 1CH 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.         DB    87H,0E9H,00H,0F0H   ;STORE INT 9H VECTOR
  24. NEWKEY  DW 2 DUP (?)              ;CURRENT INT 9H VECTOR
  25. SCREEN  DB  4000 DUP ('S')        ;STORE ORIGINAL SCREEN
  26. SHIFT   DB  0                     ;SAVE SHIFT STATUS CODE
  27. STATUS  DB  0                     ;CHECK NEW SCREEN STATUS
  28. POPUP   DB  4000 DUP ('P')        ;POP-UP SCREEN
  29. ;--------------------------------------------------------------------
  30. ;MAIN is made resident and every keystroke routed here.
  31. ;--------------------------------------------------------------------
  32. MAIN    PROC  NEAR                ;NEW INT 9H VECTOR POINTS HERE
  33.         STI                       ;ENABLE INTERRUPTS
  34.         PUSH  AX                  ;SAVE REGISTERS
  35.         PUSH  BX
  36.         PUSH  CX
  37.         PUSH  DX
  38.         PUSH  SI
  39.         PUSH  DI
  40.         PUSH  DS
  41.         PUSH  ES
  42.         PUSHF                     ;SIMULATE INTERRUPT RETURN
  43.         CALL  OLDKB               ;PROCESS OLD KEYBD ROUTINE IN ROM
  44.         MOV   AH,2                ;RETURN KEYBD FLAGS
  45.         INT   16H
  46.         MOV   SHIFT,AL            ;SAVE SHIFT STATUS
  47.         AND   AL,3
  48.         CMP   AL,3                ;BOTH SHIFT KEYS PRESSED?
  49.         JE    SAVE                ;IF YES, THEN SAVE SCREEN
  50.         MOV   AL,SHIFT            ;RESTORE SHIFT STATUS
  51.         AND   AL,9                ;ALT AND RT. SHIFT KEYS PRESSED?
  52.         CMP   AL,9
  53.         JNE   EXIT                ;IF NO, THEN EXIT HANDLER
  54.         MOV   STATUS,0            ;EXPECT NEW SCREEN
  55.         JMP   SAVE                ;GET NEW SCREEN
  56.  
  57. EXIT:   POP   ES                  ;RESTORE REGISTERS AND EXIT
  58.         POP   DS
  59.         POP   DI
  60.         POP   SI
  61.         POP   DX
  62.         POP   CX
  63.         POP   BX
  64.         POP   AX
  65.         IRET                      ;RETURN TO PARENT PROGRAM
  66.  
  67. ;--------------------------------------------------------------------
  68. ;This routine activated when both shift keys or Alt/Rt shift pressed.
  69. ;--------------------------------------------------------------------
  70. ;Save the original cursor position
  71. SAVE:   MOV   AH,3                ;READ CURSOR POSITION
  72.         MOV   BH,0                ;SELECT PAGE 0
  73.         INT   10H
  74.         PUSH  DX                  ;SAVE CURSOR POSITION
  75.         PUSH  CX                  ;SAVE CURSOR SIZE
  76.  
  77. ;Save the original screen
  78.         MOV     AX,0B800H         ;COLOR GRAPHICS MEMORY
  79.         MOV     DS,AX             ;SOURCE SEGMENT
  80.         MOV     SI,0              ;SOURCE OFFSET
  81.         PUSH    CS
  82.         POP     ES                ;DEST. SEG
  83.         MOV     DI,OFFSET SCREEN  ;DEST. OFFSET
  84.         CLD                       ;CLEAR DIRECTIONAL FLAG
  85.         MOV     CX,4000           ;MOVE 4000 BYTES
  86.         REP     MOVSB             ;FROM VIDEO TO MEMORY
  87.  
  88. ;Determine if new screen
  89.         CMP     STATUS,0FFH       ;CHECK NEW SCREEN STATUS
  90.         JE      READY             ;IF YES, THEN GOTO READY
  91.  
  92. ;Move the first pop-up screen
  93.         PUSH    CS
  94.         POP     DS                ;SOURCE SEG
  95.         PUSH    CS
  96.         POP     ES                ;DEST. SEG
  97.         MOV     SI,OFFSET SCREEN  ;SOURCE OFFSET
  98.         MOV     DI,OFFSET POPUP   ;DEST. OFFSET
  99.         MOV     CX,4000           ;MOVE 4000 BYTES
  100.         REP     MOVSB             ;FROM SCREEN TO POPUP
  101.         MOV     STATUS,0FFH       ;CHANGE STATUS AFTER FIRST RUN
  102.         JMP     POS
  103.  
  104. ;Save new pop-up screen
  105. READY:  MOV     DI,0              ;DEST. OFFSET
  106.         MOV     SI,OFFSET POPUP   ;SOURCE OFFSET
  107.         PUSH    CS
  108.         POP     DS                ;SOURCE SEG
  109.         MOV     AX,0B800H
  110.         MOV     ES,AX             ;DEST. SEG
  111.         CLD
  112.         MOV     CX,4000           ;MOVE 4000 BYTES
  113.         REP     MOVSB             ;FROM MEMORY TO VIDEO
  114.  
  115. ;Turn cursor off
  116. POS:    MOV   AH,2                ;POSITION CURSOR
  117.         MOV   BH,0
  118.         MOV   DL,0                ;FIRST COLUMN
  119.         MOV   DH,25               ;ROW OFF VIDEO DISPLAY
  120.         INT   10H
  121.  
  122. ;Wait for escape keystroke
  123. WAIT:   MOV   AH,0                ;WAIT FOR KEYSTROKE
  124.         INT   16H
  125.         CMP   AL,27               ;ESCAPE KEY?
  126.         JNZ   WAIT
  127.  
  128. ;Restore original cursor
  129.         POP     CX                ;ORIGINAL CURSOR SIZE
  130.         POP     DX                ;ORIGINAL CURSOR POSITION
  131.         MOV     BH,0
  132.         MOV     AH,2              ;SET CURSOR
  133.         INT     10H
  134.  
  135. ;Restore original screen
  136.         MOV     DI,0              ;DEST. OFFSET
  137.         MOV     SI,OFFSET SCREEN  ;SOURCE OFFSET
  138.         PUSH    CS
  139.         POP     DS                ;SOURCE SEGMENT
  140.         MOV     AX,0B800H
  141.         MOV     ES,AX             ;DEST. SEGMENT
  142.         CLD
  143.         MOV     CX,4000           ;MOVE 4000 BYTES
  144.         REP     MOVSB             ;FROM MEMORY TO VIDEO
  145.         JMP     EXIT              ;HANDLER IS DONE
  146. MAIN    ENDP
  147.  
  148. ;--------------------------------------------------------------------
  149. ;Once installed, CHECK is invoked 18.2 times/sec.
  150. ;INT 1CH vector point here.
  151. ;--------------------------------------------------------------------
  152. CHECK   PROC    NEAR
  153.         STI                       ;ENABLE INTERRUPTS
  154.         PUSH    AX                ;SAVE REGISTERS
  155.         PUSH    BX
  156.         PUSH    CX
  157.         PUSH    DX
  158.         PUSH    SI
  159.         PUSH    DI
  160.         PUSH    DS
  161.         PUSH    ES
  162.         PUSH    CS
  163.         POP     DS                ;SOURCE SEGMENT
  164. ;Determine if INT 9H vector was changed
  165.         MOV     SI,OFFSET NEWKEY  ;SOURCE OFFSET
  166.         MOV     AX,0
  167.         MOV     ES,AX             ;DEST. SEGMENT
  168.         MOV     DI,9H*4           ;DEST. OFFSET
  169.         MOV     CX,2              ;COMPARE 2 WORDS
  170.         REPE    CMPSW
  171.         JE      SKIP              ;IF MATCH, EXIT
  172. ;Reinstate INT 9H vector
  173.         MOV     AX,IVT
  174.         MOV     DS,AX
  175.         ASSUME  DS:IVT
  176.         CLI                       ;DISABLE INTERRUPTS
  177.         MOV     KEYBD,OFFSET MAIN ;REINSTATE KEYBD VECTOR
  178.         MOV     KEYBD[2],CS
  179.         STI                       ;ENABLE INTERRUPTS
  180. SKIP:   JMP     EXIT
  181. CHECK   ENDP
  182. ;--------------------------------------------------------------------
  183. ;INIT is executed once and is not made resident.
  184. ;--------------------------------------------------------------------
  185. INIT    PROC NEAR
  186.         MOV  AX,IVT               ;SET DS TO INTERRUPT VECTOR TABLE
  187.         MOV  DS,AX
  188.         ASSUME  DS:IVT
  189.         CLI                       ;DISABLE INTERRUPTS
  190.         MOV  KEYBD,OFFSET MAIN    ;INSTALL NEW VECTOR
  191.         MOV  KEYBD[2],CS
  192.         MOV  TIMER,OFFSET CHECK   ;INSTALL NEW TIMER VECTOR
  193.         MOV  TIMER[2],CS
  194.         STI                       ;ENABLE INTERRUPTS
  195.         MOV  DX,OFFSET INIT       ;SAVE TO END OF CHECK PROCEDURE
  196.         INT  27H                  ;TSR
  197. INIT    ENDP
  198. ;----------------------------------------------------------
  199. CODE    ENDS
  200.         END  BEGIN
  201.