home *** CD-ROM | disk | FTP | other *** search
/ PC Plus 53 / ISSUE_53_FEB_1991 / PCPLUS / WORKSHOP / WORKSHOP.EXE / KAMELEON.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-10-30  |  6.4 KB  |  191 lines

  1. ; KAMELEON
  2.  
  3. PRINT   MACRO   MESSAGE
  4.                 MOV     DX,OFFSET MESSAGE
  5.                 MOV     AH,9
  6.                 INT     21H
  7.                 ENDM
  8.  
  9.         code    segment para public 'code'
  10.         assume cs:code
  11.  
  12.         org 100h
  13.  
  14.  
  15. BEGIN:          JMP     INIT
  16.  
  17. ; ═════════════════════════════════════════════════════════════
  18. ROUTINE09:      PUSHF
  19.                 PUSH    AX
  20.                 PUSH    ES
  21.                 CMP     CS:SWITCH,1
  22.                 JNZ     KEYBOARD20
  23.                 cli
  24.  
  25.                 XOR     AX,AX           ; get shift state
  26.                 MOV     ES,AX
  27.                 TEST    BYTE PTR ES:[417H],8
  28.  
  29.                 JZ      KEYBOARD20
  30.  
  31.                 IN      AL,60H          ; read incoming key
  32.                 CMP     AL,61
  33.                 JB      KEYBOARD20
  34.                 CMP     AL,63
  35.                 JBE     WORK
  36.  
  37.  
  38. KEYBOARD20:     POP     ES
  39.                 POP     AX
  40.                 POPF
  41. JUMPER2         DB      0EAH;   JMP     INT09    ; jump to old keyboard routine
  42. OLD09OFF        DW      ?
  43. OLD09SEG        DW      ?
  44. SWITCH          DB      1
  45.  
  46. ; =========================================================
  47. WORK:           PUSH    BX
  48.                 PUSH    CX
  49.                 PUSH    SI
  50.                 PUSH    BP
  51.                 MOV     BP,OFFSET INVERSE
  52.                 CMP     AL,62
  53.                 JA      WORK5
  54.                 MOV     BP,OFFSET PAPER
  55.                 JZ      WORK5
  56.                 MOV     BP,OFFSET INK
  57.                 JZ      WORK5
  58.  
  59. WORK5:          in      al,61h                  ; get current control value
  60.                 mov     ah,al
  61.                 or      al,80h                  ; set high bit
  62.                 out     61h,al                  ; send it to port
  63.                 mov     al,ah                   ; recover original value
  64.                 out     61h,al                  ; send it
  65.                 cli
  66.                 mov     al,20h                  ; EOI ; interrupt control
  67.                 out     20h,al
  68.                 sti
  69.                 PUSH    ES:[41AH]    ; keyboard buffer head
  70.                 POP     ES:[41Ch]    ; make tail same (empty buffer)
  71.  
  72.                 TEST    BYTE PTR ES:[417H],4  ; Ctrl+Alt +key
  73.                 JZ      WORK2
  74.                 MOV     CS:SWITCH,0
  75.                 JMP     SHORT DONE
  76.  
  77. WORK2:          MOV     SI,0B000H
  78.                 MOV     AH,0FH
  79.                 INT     10H             ; get mode
  80.                 CMP     AL,7
  81.                 JZ      WORK10
  82.                 MOV     SI,0B800H
  83. WORK10:         MOV     ES,SI
  84.                 MOV     CX,2000
  85.                 MOV     SI,1
  86. WORK20:         MOV     AL,ES:[SI]
  87.                 MOV     AH,AL
  88.                 CALL    BP
  89.                 ADD     AL,AH
  90.                 MOV     ES:[SI],AL
  91.                 ADD     SI,2
  92.                 LOOP    WORK20
  93.  
  94. done:           POP     bp
  95.                 POP     SI
  96.                 POP     CX
  97.                 POP     BX
  98.                 POP     ES
  99.                 POP     AX
  100.  
  101.                 POPF
  102.                 IRET                    ; end interrupt routine
  103.  
  104. INVERSE:        AND     AL,10001000B
  105.                 AND     AH,01110111B
  106.                 ROL     AH,1
  107.                 ROL     AH,1
  108.                 ROL     AH,1
  109.                 ROL     AH,1
  110.                 RET
  111.  
  112. INK:            AND     AL,11111000B
  113.                 INC     AH
  114.                 AND     AH,00000111B
  115.                 RET
  116.  
  117. PAPER:          AND     AL,10001111B
  118.                 ADD     AH,   10000B
  119.                 AND     AH,01110000B
  120.                 RET
  121. ; ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  122. ; ░░░░░░░░░░░░░░░░ PROGRAM ENDS░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  123. ; ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  124. ; ═══════════════════════════════════════════════════════════════
  125.  
  126.  
  127.  
  128.                 ASSUME  CS:CODE,DS:CODE
  129. ; is TSR routine already installed ?
  130. COPYRIGHT       DB      'KAMELEON program (c) Clockwork Software 1990 UK'
  131. INIT:
  132. CHECKINS:       MOV     DX,CS           ; remember this segment
  133.                 XOR     AX,AX           ; Start Search at Segment 0
  134.                 MOV     ES,AX
  135.                 MOV     WORD PTR CS:[100H],0FFFFH
  136.  
  137. CHECKINS10:     MOV     SI,OFFSET BEGIN ; Point to Signature
  138.                 MOV     CX,10           ; Set Signature Length
  139.                 MOV     DI,SI           ; Destination Offset = Source
  140.                 CLD
  141.                 REPE    CMPSB           ; Compare Source w/Destination
  142.                 JCXZ    CHECKINS30      ; If Equal, Done
  143.                 MOV     AX,ES           ; Increment Segment
  144.                 INC     AX
  145.                 MOV     ES,AX
  146.                 CMP     AX,DX           ; If Less Than This Segment,
  147.                 JB      CHECKINS10      ; Repeat
  148.                 JMP     SHORT INIT1
  149.  
  150. ; ===============================================================
  151. ; already resident - so find action keys, report and quit
  152. CHECKINS30:     MOV     SI,OFFSET SWITCH
  153.                 MOV     BYTE PTR ES:[SI],1
  154.                 print   ALREADYMSG
  155.                 PRINT   INSTRUCTMSG
  156.                 MOV     AH,4CH
  157.                 INT     21H
  158.  
  159. ; ===============================================================
  160. INIT1:
  161. ;
  162. ; Get and set 09 vector
  163.                 mov     aX,3509h                ; get int9 vector
  164.                 int     21h
  165.                 mov     old09off,bx
  166.                 mov     old09SEG,es
  167.                 mov     aX,2509h                  ; set vector
  168.                 lea     dx,ROUTINE09
  169.                 int     21h
  170.  
  171. ; END OF INSTALL
  172. ENDOFINSTALL:   MOV     ES,CS:[2CH]     ; release memory
  173.                 MOV     AH,49H
  174.                 INT     21H
  175.                 PRINT   INSTALL
  176.                 PRINT   INSTRUCTMSG
  177.                 MOV     DX,OFFSET COPYRIGHT+1
  178.                 INT     27H
  179.  
  180. INSTALL         DB      'INVERSE installed',13,10,'$'
  181. instructmsg     DB      'Press ALT_F3 to cycle ink',13,10
  182.                 DB      'Press ALT_F4 to cycle paper',13,10
  183.                 DB      'Press ALT_F5 to swap ink/paper',13,10
  184.                 DB      'Press ALT_CTRL_F3 to switch off',13,10,'$'
  185. ALREADYMSG      DB      'INVERSE switched on',13,10,'$'
  186. ; ═══════════════════════════════════════════════════════
  187. ; END OF INSTALL
  188.  
  189. code    ends
  190.         end     begin
  191.