233 lines
8.7 KiB
NASM
233 lines
8.7 KiB
NASM
; =====> INTRUP.ASM
|
||
;***************************************
|
||
;* TIPC Scheme '84 Runtime Support *
|
||
;* Special Keyboard Handlers *
|
||
;* *
|
||
;* (C) Copyright 1984,1985 by Texas *
|
||
;* Instruments Incorporated. *
|
||
;* All rights reserved. *
|
||
;* *
|
||
;* Date Written: March 1985 *
|
||
;* Last Modification: *
|
||
;* 16 Mar 87 - tc *
|
||
;* Changed int24 fatal error int *
|
||
;* handler to pass extended error *
|
||
;* code back to originator. *
|
||
;***************************************
|
||
;
|
||
; A not-so-ingenius patch to keep PC Scheme from prematurely
|
||
; exitting to MS-DOS. CTRL-C now just echos ^C<CR><LF> trio
|
||
; and this should disappear once the READER is re-written.
|
||
;
|
||
page 66,132
|
||
include dos.mac
|
||
include pcmake.equ
|
||
|
||
DOS equ 21h
|
||
SHIFT equ 04h ; SHIFT in mode keys
|
||
META equ 02h ; ALT " " "
|
||
CNTRL equ 01h ; CTRL " " "
|
||
C_KEY equ 54h ; Scan code for 'C' key (84 decimal)
|
||
BROKEY equ 64h ; Scan code for 'PAUS/BRK' key (100 decimal)
|
||
|
||
ERR_INT equ 24h ; Fatal error abort address
|
||
EXT_ERR equ 59h ; Get Extended Error Code
|
||
TI_KMI equ 5Bh ; TIPC Keyboard Mapping Interrupt
|
||
IBM_PBI equ 1Bh ; IBM Program Break Interrupt
|
||
BIOS_BRK equ 0071h ; If CTRL-BREAK is pressed on IBM then
|
||
BRK_BIT equ 80h ; this bit is set at BIOS_BRK in BIOS data
|
||
|
||
CARY_FLG equ 01h ; Carry flag
|
||
|
||
DSEG
|
||
extrn PC_MAKE:word ; =1 for TIPC, > 0F0h for IBM-PC, =0 for ???
|
||
get_vec dw 3500h+TI_KMI
|
||
set_vec dw 2500h+TI_KMI
|
||
ENDDS
|
||
|
||
PGROUP GROUP PROG
|
||
PROG SEGMENT BYTE PUBLIC 'PROG'
|
||
ASSUME CS:PGROUP
|
||
extrn shft%brk:far
|
||
PROG ends
|
||
|
||
XGROUP GROUP PROGX
|
||
PROGX SEGMENT BYTE PUBLIC 'PROGX'
|
||
ASSUME CS:XGROUP,DS:DGROUP
|
||
|
||
; Sorry guys, but this has gotta be in CS:
|
||
kbmi_off dw ? ; Keyboard Mapping Interrupt (offset)
|
||
kbmi_seg dw ? ; Keyboard Mapping Interrupt (segment)
|
||
ferr_off dw ? ; Fatal Error Interrupt (offset)
|
||
ferr_seg dw ? ; Fatal Error Interrupt (segment)
|
||
;******************
|
||
TI_BRK proc far ; BREAK pressed by (ab)user
|
||
cmp AL,BROKEY ; PAUS/BRK key pressed?
|
||
jne TI_020
|
||
test AH,SHIFT ; SHIFT pressed with PAUS/BRK?
|
||
jz TI_020 ; if no then SHIFT-BRK not possible
|
||
test AH,META+CNTRL ; CTRL or ALT pressed with PAUS/BRK?
|
||
jnz TI_020 ; if yes then ALT or CTRL has priority
|
||
; jmp short TI_010
|
||
|
||
IBM_BRK label far ; Entry point for IBM's Keyboard Break Int.
|
||
TI_010 label near
|
||
push AX ; Save AX across call
|
||
call PGROUP:shft%brk ; Flag to force debugger on next VM instruct
|
||
pop AX ; Restore AX
|
||
mov AL,0FFh ; Ignore this keystroke (IBM'll ignore this)
|
||
|
||
TI_020 label near ; Jump here & return like nothing happened
|
||
stc ; Tell TI keyboard DSR that no key was pressd
|
||
; again, IBM BIOS won't care about this.
|
||
jmp dword ptr CS:kbmi_off ; Go off and perform task that
|
||
; may have had control of Int 5Bh before
|
||
; we did (e.g. RDClock, etc.).
|
||
TI_BRK endp
|
||
|
||
;******************
|
||
CTLC_INT proc far ; Handle detection of CTRL-C (INT 23H)
|
||
iret ; Just return like nothing happened 'cept
|
||
; that a ^C<CR><LF> trio is displayed.
|
||
CTLC_INT endp
|
||
|
||
;*******************
|
||
public FAT_ERR
|
||
FAT_ERR proc far ; Handle for fatal error interrupt (24H)
|
||
|
||
; remove ip,cs, and flags of system regs from int 24h
|
||
pop AX
|
||
pop AX
|
||
pop AX
|
||
|
||
; get extended error codes
|
||
xor BX,BX
|
||
mov AH,EXT_ERR
|
||
int DOS ; Extended Error Code returned in AX
|
||
|
||
; restore user registers at time of original function request 21h
|
||
pop BX ; Ignore old AX
|
||
pop BX
|
||
pop CX
|
||
pop DX
|
||
pop SI
|
||
pop DI
|
||
pop BP
|
||
pop DS
|
||
pop ES
|
||
|
||
; Set the carry bit in the caller's flags and return
|
||
; The original dos requestor should see that carry is set and
|
||
; that ax contains the error code
|
||
|
||
or byte ptr [BP-02], CARY_FLG
|
||
iret
|
||
FAT_ERR endp
|
||
;******************
|
||
fix%intr proc far ; Re-assign Keyboard Mapping Interrupt (5BH)
|
||
push ES ; and "fix" DOS's CTRL-C Exit Interrupt (23H)
|
||
push DX
|
||
push BX
|
||
push AX
|
||
cmp PC_MAKE,TIPC ; We running on a TIPC or (yuck) IBM?
|
||
je short fix_010 ; Jump as already setup for TIPC
|
||
mov al,IBM_PBI
|
||
mov byte ptr set_vec,al ; LSB of word in first byte
|
||
mov byte ptr get_vec,al
|
||
fix_010 label near ; NO CHANGES if you jumped to here
|
||
mov AX,get_vec ; get the interrupt vector
|
||
int DOS
|
||
;
|
||
mov word ptr CS:kbmi_seg,ES ; save it
|
||
mov word ptr CS:kbmi_off,BX
|
||
;
|
||
mov AX,set_vec ; Load AX with DOS func # and INT #
|
||
mov DX,offset TI_BRK ; for replacing vector with my own
|
||
cmp PC_MAKE,TIPC
|
||
je short fix_020 ; Jump if we're running on a TIPC
|
||
mov DX,offset IBM_BRK ; Use different entry point for IBM
|
||
|
||
fix_020 label near
|
||
push DS
|
||
mov CX,CS ; Do this now as I needed the DS
|
||
mov DS,CX ; register back at "cmp PC_MAKE,0"
|
||
int DOS
|
||
;
|
||
mov DX,offset CTLC_INT ; CTRL-C Handler Interrupt (23H)
|
||
mov AX,2523h ; This one doesn't need to be restored
|
||
int DOS ; and is the same for ALL MS-DOS machines
|
||
;**************************************************
|
||
;* Install the handler for fatal error interrupt
|
||
;**************************************************
|
||
pop DS
|
||
mov al,ERR_INT
|
||
mov AH,35H ; get the original entry
|
||
int DOS
|
||
|
||
mov word ptr CS:ferr_seg,ES ; save it
|
||
mov word ptr CS:ferr_off,BX
|
||
mov AH,25H ; set the new entry point
|
||
mov AL,ERR_INT
|
||
mov DX,offset FAT_ERR ; new address of handler
|
||
push DS
|
||
mov CX,CS
|
||
mov DS,CX
|
||
int DOS
|
||
|
||
pop DS
|
||
pop AX
|
||
pop BX
|
||
pop DX
|
||
pop ES
|
||
;
|
||
ret ; Get the heck outta here
|
||
fix%intr endp
|
||
|
||
;******************
|
||
unfix% proc far ; Restore Keyboard Mapping Interrupt (5BH)
|
||
; (DOS should take care of 23H)
|
||
push DS
|
||
push DX
|
||
;
|
||
mov AX,set_vec
|
||
lds DX,dword ptr CS:kbmi_off ; get old interrupt vector
|
||
int DOS
|
||
; Restore fatal error interrupt (24H)
|
||
mov AH,25H
|
||
mov AL,ERR_INT
|
||
lds DX,dword ptr CS:ferr_off
|
||
int DOS
|
||
;
|
||
pop DX
|
||
pop DS
|
||
;
|
||
ret ; Get the heck outta here
|
||
unfix% endp
|
||
PROGX ends
|
||
|
||
;**********************************************************************
|
||
;* Link routines *
|
||
;**********************************************************************
|
||
PROG SEGMENT BYTE PUBLIC 'PROG'
|
||
ASSUME CS:PGROUP
|
||
Public fix_intr, unfixint
|
||
|
||
fix_intr proc near
|
||
call fix%intr
|
||
ret
|
||
fix_intr endp
|
||
|
||
unfixint proc near
|
||
call unfix%
|
||
ret
|
||
unfixint endp
|
||
prog ends
|
||
end
|
||
|
||
; **NOTE**
|
||
; Let it be known to the world that this programmer
|
||
; believes that IBM stands for Immense Bowel Movement!!!
|
||
; Or possibly a law firm named Idiots, Bumblers, & Morons.
|
||
|
||
end
|
||
|