pcs/prointrp.asm

202 lines
5.8 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; =====> PROINTRP.ASM
;***************************************
;* TIPC Scheme '84 Runtime Support *
;* Special Keyboard Handlers *
;* *
;* (C) Copyright 1984,1985 by Texas *
;* Instruments Incorporated. *
;* All rights reserved. *
;* *
;* Date Written: Feb 1988 *
;* *
;* This file is basically INTRUP.ASM *
;* modified to run in protected mode *
;* under AI Architects OSx86. *
;* *
;***************************************
.286c
page 66,132
include dos.mac
include pcmake.equ
include smmu.mac ; Protected mode Macros
DOS equ 021h ; Dos function request
EXT_ERR equ 059h ; Dos get extended error
GET_VEC equ 035h ; Dos get interrupt vector
SET_VEC equ 025h ; Dos set interrupt vector
SET_AIA_VEC equ 0E4h ; AIA set interrupt vector
TI_PBI equ 05Dh ; TI Program Break Interrupt
IBM_PBI equ 01Bh ; IBM Program Break Interrupt
ERR_INT equ 024h ; Fatal error abort address
CTRLC_INT equ 023h ; Control C exit interrupt
DSEG
extrn PC_MAKE:word
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)
;******************
public PROG_BRK
PROG_BRK proc far ; Handler for Keynoard Break Interrupt
push ax ; Save keystroke across call
call PGROUP:shft%brk ; Flag to force debugger on next VM inst
pop ax ; Restore keystroke
mov ax,0FFh ; Ignore keystroke (IBM'll ignore this)
stc ; Tell TI keyboard DSR no key was pressd
; again, IBM BIOS won't care about this.
iret ; interrupt return
PROG_BRK endp
;******************
public CTLC_INT
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)
mov ax,di ;di = err number. add 19 to form err number
add ax,19 ;you would get from Get Extended Error (59h)
iret ;just return for now
comment ~
;
; First release of AI Architect's OSx86 didn't support fatal error
; interrupts as specified by DOS. Also, couldn't issue Get Extended
; Error (Dos function 59h) from within here. Above code will have
; to suffice for now.
;
; 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
;*******************
; Reassign program break interrupt (5Dh=ti, 1Bh=ibm), and "fix" Dos's
; CTRL-C Exit int (23h)
public fix%intr
fix%intr proc far
push es ;tempsave off some regs
push dx
push bx
push ax
;
; WARNING: DS does not point to the local data segment below
;
mov ax,cs
mov ds,ax ;set ds=cs for dos calls below
; take over program break interrupt
;no need to get interrupt vector
;since AIA will clean up on exit
mov ah,SET_VEC ;ah = set interrupt vector
mov al,IBM_PBI ;al = ibm program break interrupt
cmp SS:PC_MAKE,TIPC ;if not running on a TIPC
jne short fix_010 ; then jump
mov al,TI_PBI ; else set TI program break interrupt
fix_010:
mov dx,offset PROG_BRK ;ds:ax => interrupt handler
int DOS ;take over the handler
; take over ctl-c interrupt
mov ah,SET_VEC ;ah = set interrupt vector
mov al,CTRLC_INT ;al = CTRL-C Interrupt (23H)
mov dx,offset PROG_BRK ;ds:ax => interrupt handler
int DOS ;take over the handler
; take over fatal error interrupt
mov ah,SET_VEC ;ah = set interrupt vector
mov al,ERR_INT ;al = Fatal error interrupt
mov dx,offset FAT_ERR ;ds:dx => interrupt handler
int DOS ;take over handler
mov ax,ss ;restore local data seg
mov ds,ax
;
; WARNING: DS does not point to the local data segment above
;
pop ax ;restore saved regs
pop bx
pop dx
pop es
ret ;get the heck outta here
fix%intr endp
;******************
; Restore Keyboard Mapping Interrupt (5BH)
; (DOS should take care of 23H)
public unfix%
unfix% proc far
;
; We don't do anything cuz AI Architects OSx86 will clean up upon exit.
; However, we'll leave this dummy routine here in case something pops
; up in the future
;
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
end