home *** CD-ROM | disk | FTP | other *** search
- ; KAMELEON
-
- PRINT MACRO MESSAGE
- MOV DX,OFFSET MESSAGE
- MOV AH,9
- INT 21H
- ENDM
-
- code segment para public 'code'
- assume cs:code
-
- org 100h
-
-
- BEGIN: JMP INIT
-
- ; ═════════════════════════════════════════════════════════════
- ROUTINE09: PUSHF
- PUSH AX
- PUSH ES
- CMP CS:SWITCH,1
- JNZ KEYBOARD20
- cli
-
- XOR AX,AX ; get shift state
- MOV ES,AX
- TEST BYTE PTR ES:[417H],8
-
- JZ KEYBOARD20
-
- IN AL,60H ; read incoming key
- CMP AL,61
- JB KEYBOARD20
- CMP AL,63
- JBE WORK
-
-
- KEYBOARD20: POP ES
- POP AX
- POPF
- JUMPER2 DB 0EAH; JMP INT09 ; jump to old keyboard routine
- OLD09OFF DW ?
- OLD09SEG DW ?
- SWITCH DB 1
-
- ; =========================================================
- WORK: PUSH BX
- PUSH CX
- PUSH SI
- PUSH BP
- MOV BP,OFFSET INVERSE
- CMP AL,62
- JA WORK5
- MOV BP,OFFSET PAPER
- JZ WORK5
- MOV BP,OFFSET INK
- JZ WORK5
-
- WORK5: in al,61h ; get current control value
- mov ah,al
- or al,80h ; set high bit
- out 61h,al ; send it to port
- mov al,ah ; recover original value
- out 61h,al ; send it
- cli
- mov al,20h ; EOI ; interrupt control
- out 20h,al
- sti
- PUSH ES:[41AH] ; keyboard buffer head
- POP ES:[41Ch] ; make tail same (empty buffer)
-
- TEST BYTE PTR ES:[417H],4 ; Ctrl+Alt +key
- JZ WORK2
- MOV CS:SWITCH,0
- JMP SHORT DONE
-
- WORK2: MOV SI,0B000H
- MOV AH,0FH
- INT 10H ; get mode
- CMP AL,7
- JZ WORK10
- MOV SI,0B800H
- WORK10: MOV ES,SI
- MOV CX,2000
- MOV SI,1
- WORK20: MOV AL,ES:[SI]
- MOV AH,AL
- CALL BP
- ADD AL,AH
- MOV ES:[SI],AL
- ADD SI,2
- LOOP WORK20
-
- done: POP bp
- POP SI
- POP CX
- POP BX
- POP ES
- POP AX
-
- POPF
- IRET ; end interrupt routine
-
- INVERSE: AND AL,10001000B
- AND AH,01110111B
- ROL AH,1
- ROL AH,1
- ROL AH,1
- ROL AH,1
- RET
-
- INK: AND AL,11111000B
- INC AH
- AND AH,00000111B
- RET
-
- PAPER: AND AL,10001111B
- ADD AH, 10000B
- AND AH,01110000B
- RET
- ; ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
- ; ░░░░░░░░░░░░░░░░ PROGRAM ENDS░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
- ; ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
- ; ═══════════════════════════════════════════════════════════════
-
-
-
- ASSUME CS:CODE,DS:CODE
- ; is TSR routine already installed ?
- COPYRIGHT DB 'KAMELEON program (c) Clockwork Software 1990 UK'
- INIT:
- CHECKINS: MOV DX,CS ; remember this segment
- XOR AX,AX ; Start Search at Segment 0
- MOV ES,AX
- MOV WORD PTR CS:[100H],0FFFFH
-
- CHECKINS10: MOV SI,OFFSET BEGIN ; Point to Signature
- MOV CX,10 ; Set Signature Length
- MOV DI,SI ; Destination Offset = Source
- CLD
- REPE CMPSB ; Compare Source w/Destination
- JCXZ CHECKINS30 ; If Equal, Done
- MOV AX,ES ; Increment Segment
- INC AX
- MOV ES,AX
- CMP AX,DX ; If Less Than This Segment,
- JB CHECKINS10 ; Repeat
- JMP SHORT INIT1
-
- ; ===============================================================
- ; already resident - so find action keys, report and quit
- CHECKINS30: MOV SI,OFFSET SWITCH
- MOV BYTE PTR ES:[SI],1
- print ALREADYMSG
- PRINT INSTRUCTMSG
- MOV AH,4CH
- INT 21H
-
- ; ===============================================================
- INIT1:
- ;
- ; Get and set 09 vector
- mov aX,3509h ; get int9 vector
- int 21h
- mov old09off,bx
- mov old09SEG,es
- mov aX,2509h ; set vector
- lea dx,ROUTINE09
- int 21h
-
- ; END OF INSTALL
- ENDOFINSTALL: MOV ES,CS:[2CH] ; release memory
- MOV AH,49H
- INT 21H
- PRINT INSTALL
- PRINT INSTRUCTMSG
- MOV DX,OFFSET COPYRIGHT+1
- INT 27H
-
- INSTALL DB 'INVERSE installed',13,10,'$'
- instructmsg DB 'Press ALT_F3 to cycle ink',13,10
- DB 'Press ALT_F4 to cycle paper',13,10
- DB 'Press ALT_F5 to swap ink/paper',13,10
- DB 'Press ALT_CTRL_F3 to switch off',13,10,'$'
- ALREADYMSG DB 'INVERSE switched on',13,10,'$'
- ; ═══════════════════════════════════════════════════════
- ; END OF INSTALL
-
- code ends
- end begin