604 lines
7.7 KiB
NASM
604 lines
7.7 KiB
NASM
; Version 2.2
|
||
; AUG 89
|
||
;
|
||
; TSR for Zortech C/C++ Toolkit Assembler Module
|
||
; (c)1989 Walter Bright, written by Kevin Powis.
|
||
|
||
ifdef I8086S
|
||
|
||
public __tsrdisk,_tsr_initialize,_tsr_dta_on,_tsr_dta_off,_tsr_no_pop
|
||
public _tsr_service
|
||
public __tsr_bypass,__tsr_debug
|
||
|
||
extrn _tsr_dosseg:word
|
||
extrn _tsr_dosoff:word
|
||
extrn _tsr_running:word
|
||
extrn _tsr_reqflag:word
|
||
extrn __tsr_timeslice:word
|
||
extrn _TSR_HOTSHIFT:word
|
||
extrn _TSR_HOTSCAN:byte
|
||
|
||
dgroup group _data
|
||
_data segment word public 'DATA'
|
||
__tsrdisk db 0
|
||
db 0
|
||
__tsr_bypass dw 0
|
||
__tsr_debug dw 0 ;set this to 1 for debug & 0 for none
|
||
dtaes dw 0
|
||
dtabx dw 0
|
||
localdta db 130 dup(0)
|
||
_data ends
|
||
|
||
_text segment byte public 'CODE'
|
||
assume cs:_text,ds:dgroup
|
||
|
||
mpointer dw ?
|
||
|
||
critms db ' Critical Error',0
|
||
db ' Press a key to retry.',26
|
||
|
||
below_od db ' DOS function < 0dh',0
|
||
db ' Press a key.',26
|
||
|
||
close_std db ' Attempt to close std',0
|
||
db ' handle..press key',26
|
||
|
||
memory_fn db ' Memory allocation?',0
|
||
db ' Not inside TSR!',26
|
||
|
||
quitit db ' EXIT detected!!',0
|
||
db ' use RETURN instead',26
|
||
|
||
critbuff db 200 dup(?)
|
||
|
||
_tsr_initialize proc near
|
||
push bp
|
||
mov bp,sp
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push es
|
||
push ds
|
||
|
||
push cs
|
||
pop ds
|
||
|
||
mov ax,3513h
|
||
int 21h
|
||
mov cs:olddisk,bx
|
||
mov cs:olddisk[2],es
|
||
|
||
mov ax,3508h
|
||
int 21h
|
||
mov cs:tsrold8,bx
|
||
mov cs:tsrold8[2],es
|
||
|
||
mov ax,3509h
|
||
int 21h
|
||
mov cs:tsrold9,bx
|
||
mov cs:tsrold9[2],es
|
||
|
||
mov dx,offset cs:tsr_newint13
|
||
mov ah,25h
|
||
mov al,13h
|
||
int 21h
|
||
|
||
cli
|
||
mov dx,offset cs:tsr_newint8
|
||
mov ah,25h
|
||
mov al,08h
|
||
int 21h
|
||
sti
|
||
|
||
mov dx,offset cs:tsr_newint9
|
||
mov ah,25h
|
||
mov al,09h
|
||
int 21h
|
||
|
||
mov ah,34h
|
||
int 21h
|
||
|
||
pop ds
|
||
mov ds:_tsr_dosseg,es
|
||
mov ds:_tsr_dosoff,bx
|
||
|
||
pop es
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop bp
|
||
ret
|
||
_tsr_initialize endp
|
||
|
||
tsr_newint8 proc far
|
||
pushf
|
||
db 09ah
|
||
tsrold8 dw ?,?
|
||
|
||
push bp
|
||
push ds
|
||
push ax
|
||
pushf
|
||
|
||
mov ax,dgroup
|
||
mov ds,ax
|
||
|
||
cmp ds:_tsr_running,0
|
||
je tsrn8_0
|
||
|
||
mov ax,ds:__tsr_bypass
|
||
and ds:_tsr_reqflag,ax
|
||
jmp tsrn8_8
|
||
|
||
tsrn8_0:
|
||
cmp ds:_tsr_reqflag,0
|
||
jne tsrn8_1
|
||
|
||
cmp ds:__tsr_bypass,0
|
||
je @F
|
||
|
||
tsrn8_1:
|
||
push di
|
||
push ds
|
||
mov di,ds:_tsr_dosoff
|
||
mov ax,ds:_tsr_dosseg
|
||
mov ds,ax
|
||
mov ax,0
|
||
mov al,ds:[di]
|
||
pop ds
|
||
pop di
|
||
|
||
or al,ds:__tsrdisk
|
||
cmp al,0
|
||
je tsr_go
|
||
|
||
call _tsr_no_pop
|
||
jmp @F
|
||
|
||
tsr_go:
|
||
int 28h
|
||
|
||
@@:
|
||
mov ds:_tsr_reqflag,0
|
||
tsrn8_8:
|
||
popf
|
||
pop ax
|
||
pop ds
|
||
pop bp
|
||
iret
|
||
tsr_newint8 endp
|
||
|
||
tsr_newint9 proc
|
||
sti
|
||
pushf
|
||
db 09ah
|
||
tsrold9 dw ?,?
|
||
push ax
|
||
push ds
|
||
mov ax,dgroup
|
||
mov ds,ax
|
||
|
||
mov ah,2
|
||
int 16h
|
||
and ax,15
|
||
cmp ax,ds:_TSR_HOTSHIFT
|
||
jne @F
|
||
|
||
cmp ds:_TSR_HOTSCAN,0
|
||
je tsr_n9_req
|
||
|
||
mov ah,1
|
||
int 16h
|
||
jz @F
|
||
|
||
cmp ah,ds:_TSR_HOTSCAN
|
||
jne @F
|
||
|
||
mov ah,0
|
||
int 16h
|
||
|
||
tsr_n9_req:
|
||
mov ds:_tsr_reqflag,1
|
||
@@:
|
||
pop ds
|
||
pop ax
|
||
iret
|
||
tsr_newint9 endp
|
||
|
||
tsr_newint13 proc far
|
||
pushf
|
||
push ax
|
||
push ds
|
||
mov ax,seg __tsrdisk
|
||
mov ds,ax
|
||
mov ds:__tsrdisk,1
|
||
pop ds
|
||
pop ax
|
||
db 09ah
|
||
olddisk dw ?,?
|
||
push ax
|
||
push ds
|
||
mov ax,seg __tsrdisk
|
||
mov ds,ax
|
||
mov ds:__tsrdisk,0
|
||
pop ds
|
||
pop ax
|
||
ret 2
|
||
tsr_newint13 endp
|
||
|
||
tsr_newint21 proc
|
||
; Attempt to trap and report any functions that could
|
||
; cause problems to a TSR
|
||
; This procedure will not correct any problems, but it
|
||
; will alert the programmer.
|
||
|
||
push ax
|
||
push dx
|
||
push ds
|
||
push ax
|
||
|
||
mov ax,dgroup
|
||
mov ds,ax
|
||
mov ax,ds:__tsr_debug ;only provide this service if set
|
||
cmp ax,1
|
||
pop ax
|
||
jne tsr_old21
|
||
|
||
push cs
|
||
pop ds
|
||
|
||
cmp ah,0dh ;first NO calls below 0D allowed
|
||
ja @F
|
||
|
||
mov di,offset cs:below_OD
|
||
call winmess
|
||
jmp tsr_old21
|
||
@@:
|
||
cmp ah,3eh ;close invalid?
|
||
jne @F
|
||
cmp bx,5
|
||
jae @F
|
||
|
||
mov di,offset cs:close_std
|
||
call winmess
|
||
jmp tsr_old21
|
||
|
||
@@:
|
||
cmp ah,48h
|
||
jne @F ;now test memory allocation
|
||
|
||
mov di,offset cs:memory_fn
|
||
call winmess
|
||
jmp tsr_old21
|
||
|
||
@@:
|
||
cmp ah,4ch ;terminate?
|
||
jne @F
|
||
|
||
mov di,offset cs:quitit
|
||
call winmess
|
||
jmp tsr_old21
|
||
@@:
|
||
tsr_old21:
|
||
|
||
pop ds
|
||
pop dx
|
||
pop ax
|
||
db 0eah
|
||
dosfarip dw 0
|
||
dosfarcs dw 0
|
||
tsr_newint21 endp
|
||
|
||
tsr_newint24 proc far
|
||
jmp @F
|
||
oldcrit dw ?,?
|
||
@@:
|
||
sti
|
||
push ds
|
||
push es
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push si
|
||
push di
|
||
push bp
|
||
|
||
mov di,offset cs:critms
|
||
call winmess
|
||
mov al,1 ;retry
|
||
|
||
pop bp
|
||
pop di
|
||
pop si
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop es
|
||
pop ds
|
||
iret
|
||
tsr_newint24 endp
|
||
|
||
_tsr_dta_on proc near
|
||
push bp
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push ds
|
||
push es
|
||
|
||
mov ah,2fh
|
||
int 21h
|
||
|
||
mov ax,dgroup
|
||
mov ds,ax
|
||
mov ds:dtaes,es
|
||
mov ds:dtabx,bx
|
||
mov dx,offset ds:localdta
|
||
mov ah,1ah
|
||
int 21h
|
||
|
||
mov ax,3524h
|
||
int 21h
|
||
mov cs:oldcrit,bx
|
||
mov cs:oldcrit[2],es
|
||
|
||
push cs
|
||
pop ds
|
||
|
||
mov dx,offset cs:tsr_newint24
|
||
mov ah,25h
|
||
mov al,24h
|
||
int 21h
|
||
|
||
mov ax,3521h ;get the DOS int 21h vector
|
||
int 21h
|
||
mov cs:dosfarip,bx ;save the contents
|
||
mov cs:dosfarcs,es
|
||
|
||
push cs
|
||
pop ds
|
||
|
||
mov dx,offset tsr_newint21 ;and point the vector to our code
|
||
mov ax,2521h
|
||
int 21h
|
||
|
||
pop es
|
||
pop ds
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
pop bp
|
||
ret
|
||
_tsr_dta_on endp
|
||
|
||
_tsr_dta_off proc near
|
||
push bp
|
||
push ax
|
||
push bx
|
||
push dx
|
||
push es
|
||
push ds
|
||
|
||
mov ax,dgroup
|
||
mov ds,ax
|
||
mov ax,ds:dtaes
|
||
mov dx,ds:dtabx
|
||
mov ds,ax
|
||
mov ah,1ah
|
||
int 21h
|
||
|
||
mov dx,cs:oldcrit[2]
|
||
mov ds,dx
|
||
mov dx,cs:oldcrit
|
||
mov ax,2524h
|
||
int 21h
|
||
|
||
mov dx,cs:dosfarcs
|
||
mov ds,dx
|
||
mov dx,cs:dosfarip
|
||
mov ax,2521h
|
||
int 21h
|
||
|
||
pop ds
|
||
pop es
|
||
pop dx
|
||
pop bx
|
||
pop ax
|
||
pop bp
|
||
ret
|
||
_tsr_dta_off endp
|
||
|
||
_tsr_no_pop proc
|
||
push bp
|
||
push bx
|
||
push cx
|
||
push di
|
||
push ds
|
||
|
||
mov ax,dgroup
|
||
mov ds,ax
|
||
|
||
cmp ds:__tsr_bypass,0
|
||
jne tsr_n99
|
||
|
||
mov cx,10
|
||
mov bx,1
|
||
mov di,200
|
||
@@:
|
||
call sound
|
||
add di,10
|
||
inc bx
|
||
loop @B
|
||
|
||
tsr_n99:
|
||
pop ds
|
||
pop di
|
||
pop cx
|
||
pop bx
|
||
pop bp
|
||
ret
|
||
_tsr_no_pop endp
|
||
|
||
_tsr_service proc
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push si
|
||
push di
|
||
push ds
|
||
push es
|
||
push bp
|
||
|
||
int 28h
|
||
|
||
pop bp
|
||
pop es
|
||
pop ds
|
||
pop di
|
||
pop si
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
ret
|
||
_tsr_service endp
|
||
|
||
sound proc
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push di
|
||
mov al,0b6h
|
||
out 43h,al
|
||
mov dx,14h
|
||
mov ax,4f38h
|
||
div di
|
||
out 42h,al
|
||
mov al,ah
|
||
out 42h,al
|
||
in al,61h
|
||
mov ah,al
|
||
or al,3
|
||
out 61h,al
|
||
swait: mov cx,2801
|
||
spkron: loop spkron
|
||
dec bx
|
||
jnz swait
|
||
mov al,ah
|
||
out 61h,al
|
||
pop di
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
ret
|
||
sound endp
|
||
|
||
winmess proc
|
||
; call with cs:di pointing at message
|
||
; to be placed in window on screen
|
||
; routine will display and wait for keypress
|
||
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push ds
|
||
push si
|
||
push di
|
||
|
||
mov cs:mpointer,di
|
||
|
||
mov dx,0b800h
|
||
mov ah,0fh
|
||
int 10h
|
||
|
||
mov bx,(64*256)+' '
|
||
cmp al,7
|
||
jne @F
|
||
mov dx,0b000h
|
||
mov bx,(112*256)+' '
|
||
@@:
|
||
mov es,dx
|
||
mov si,(10*160)+48
|
||
push si
|
||
mov di,offset cs:critbuff
|
||
mov cx,4
|
||
wmess_save_row:
|
||
push cx
|
||
mov cx,24
|
||
@@:
|
||
mov ax,es:[si]
|
||
mov es:[si],bx
|
||
mov cs:[di],ax
|
||
add si,2
|
||
add di,2
|
||
loop @B
|
||
add si,160-(24*2)
|
||
pop cx
|
||
loop wmess_save_row
|
||
|
||
pop si
|
||
add si,160
|
||
push si
|
||
|
||
mov di,cs:mpointer
|
||
|
||
wmess_show_message:
|
||
mov al,cs:[di]
|
||
inc di
|
||
cmp al,26
|
||
je wmess_getkey
|
||
cmp al,0
|
||
jne @F
|
||
pop si
|
||
add si,160
|
||
push si
|
||
jmp wmess_show_message
|
||
@@:
|
||
mov es:[si],al
|
||
add si,2
|
||
jmp wmess_show_message
|
||
|
||
wmess_getkey:
|
||
pop si
|
||
mov ah,0
|
||
int 16h
|
||
|
||
mov di,(10*160)+48
|
||
mov si,offset cs:critbuff
|
||
mov cx,4
|
||
wmess_rest_row:
|
||
push cx
|
||
mov cx,24
|
||
@@:
|
||
mov ax,cs:[si]
|
||
mov es:[di],ax
|
||
add si,2
|
||
add di,2
|
||
loop @B
|
||
add di,160-48
|
||
pop cx
|
||
loop wmess_rest_row
|
||
|
||
pop di
|
||
pop si
|
||
pop ds
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
|
||
ret
|
||
|
||
winmess endp
|
||
|
||
_text ends
|
||
endif ;I8086S
|
||
end
|
||
|
||
|