mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
Upload
Digital Research
This commit is contained in:
150
MPM OPERATING SYSTEMS/MPM-86/MISC DRI DISKS/11/TIMER.A86
Normal file
150
MPM OPERATING SYSTEMS/MPM-86/MISC DRI DISKS/11/TIMER.A86
Normal file
@@ -0,0 +1,150 @@
|
||||
;
|
||||
; timer routines for histogram
|
||||
; 1/9/83
|
||||
;
|
||||
|
||||
cr equ 0dh
|
||||
lf equ 0ah
|
||||
|
||||
cseg
|
||||
|
||||
public inittimer
|
||||
public starttimer
|
||||
public stoptimer
|
||||
|
||||
extrn collecthist:near
|
||||
extrn printm:near
|
||||
extrn systemreset:near
|
||||
|
||||
extrn histds:word
|
||||
|
||||
port_base equ 50h
|
||||
master_base equ port_base + 0
|
||||
slave_base equ port_base + 2
|
||||
|
||||
Timer_control equ port_base + 7
|
||||
Timer_0 equ port_base + 4
|
||||
|
||||
int_base equ 29h * 4
|
||||
timer_int_off equ word ptr .int_base
|
||||
timer_int_seg equ word ptr .int_base + 2
|
||||
|
||||
tickint:
|
||||
;=======
|
||||
; Interrupt handler for tick interrupts
|
||||
|
||||
push ds
|
||||
mov ds,histds
|
||||
test intick,1
|
||||
jnz overrun
|
||||
mov intick,1
|
||||
mov userss,ss
|
||||
mov usersp,sp
|
||||
mov ss,histds
|
||||
mov sp,offset tick_tos
|
||||
push ax ! push bx
|
||||
push cx ! push dx
|
||||
push di ! push si
|
||||
push bp ! push es
|
||||
|
||||
mov es,userss
|
||||
mov si,usersp
|
||||
mov ax,es:2[si] ;get ip where int occurred
|
||||
mov bx,es:4[si] ;get cs where int occurred
|
||||
call collecthist
|
||||
|
||||
pop es ! pop bp ;restore context
|
||||
pop si ! pop di
|
||||
pop dx ! pop cx
|
||||
pop bx ! pop ax
|
||||
mov ss,userss
|
||||
mov sp,usersp
|
||||
pop ds
|
||||
|
||||
push ax
|
||||
mov al,20H
|
||||
out master_base,al ; reset the master
|
||||
out slave_base,al ; reset the slave
|
||||
pop ax
|
||||
|
||||
mov intick,0
|
||||
iret
|
||||
|
||||
intick db 0
|
||||
|
||||
overrun:
|
||||
mov dx,offset overrunerr
|
||||
call printm
|
||||
call systemreset
|
||||
|
||||
;
|
||||
; initialize timer and interrupt vector
|
||||
;
|
||||
|
||||
inittimer:
|
||||
|
||||
; setup clock timer interrupt addr
|
||||
|
||||
sub ax,ax
|
||||
mov es,ax
|
||||
mov es:word ptr .00a4h,offset tickint
|
||||
mov es:word ptr .00a6h,cs
|
||||
|
||||
;
|
||||
; set up the master PIC
|
||||
|
||||
mov al,15h! out master_base, al
|
||||
mov al,20h! out master_base + 1,al ; interupts start at interupt 20h
|
||||
|
||||
mov al,80h! out master_base + 1, al ; only IRQ 7 has a slave attached
|
||||
mov al,01h! out master_base + 1, al ; Set for 8088 mode
|
||||
|
||||
mov al,0ffh! out master_base + 1, al ; turn off all interupts for now
|
||||
|
||||
;
|
||||
; set up the slave PIC
|
||||
|
||||
mov al,015h! out slave_base, al
|
||||
mov al,028h! out slave_base + 1,al ; base of the slave vectors
|
||||
|
||||
mov al,07h! out slave_base + 1, al ; slave ID number
|
||||
mov al,01h! out slave_base + 1, al ; 8088 mode
|
||||
|
||||
mov al, 0ffh! out slave_base + 1, al ; off for now
|
||||
|
||||
;
|
||||
; now set up the timer for 16.67 milliseconds
|
||||
; timer 0, two byte rl, mode 3
|
||||
|
||||
mov al,036h! out timer_control, al ; timer control word
|
||||
|
||||
mov al,03ch! out timer_0, al ; timer 0's count
|
||||
mov al,082h! out timer_0, al
|
||||
|
||||
ret
|
||||
|
||||
|
||||
starttimer:
|
||||
|
||||
mov al,7fh! out master_base + 1, al
|
||||
mov al,0fdh! out slave_base + 1, al
|
||||
sti
|
||||
ret
|
||||
|
||||
stoptimer:
|
||||
|
||||
mov al,0ffh! out master_base + 1, al ; turn off all interupts for now
|
||||
mov al, 0ffh! out slave_base + 1, al ; off for now
|
||||
ret
|
||||
|
||||
dseg
|
||||
|
||||
rw 128
|
||||
tick_tos rw 0
|
||||
userss rw 1
|
||||
usersp rw 1
|
||||
|
||||
overrunerr db cr,lf,'Timer interrupt overrun',cr,lf,'$'
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user