Metropoli BBS
VIEWER: ints.asm MODE: TEXT (ASCII)
; Interrupt routines....


                        .model small
                        locals

                        extrn DemoInt:near
                        extrn Sync:near

                        public SetInts,ClearInts,GetRasterLine
                        public FrameNum
.data
                        align 2

FrameNum		dd 0

.code
.386

frametimeb		dw ?
frametime		dw ?

in_int			db 0

oldint8                 dd ?

INTER                   equ 8

intti8 			proc far

                        push ax
                        push ds

                        mov ax,seg FrameNum
                        mov ds,ax

                        inc FrameNum

                        mov al,20h
                        out 20h,al
                        call Sync

                        mov al,36h
                        out 43h,al
                        mov al,byte ptr cs:frametimeb[0]
                        out 40h,al
                        mov al,byte ptr cs:frametimeb[1]
                        out 40h,al

                        test cs:in_int,1
                        jnz @@1

                        mov cs:in_int,1

                        sti
                        call DemoInt
                        mov cs:in_int,0
                        cli
@@1:
                        pop ds
                        pop ax
                        iret

intti8 			endp



SetInts 		proc near

                        cli
                        xor ax,ax
                        mov es,ax
                        mov ax,es:[INTER*4]
                        mov word ptr cs:oldint8,ax
                        mov ax,es:[INTER*4+2]
                        mov word ptr cs:oldint8[2],ax
                        mov ax,offset intti8
                        mov es:[INTER*4],ax
                        mov es:[INTER*4+2],cs
                        sti

                        call Sync

                        mov al,36h
                        out 43h,al
                        mov al,0
                        out 40h,al
                        mov al,0
                        out 40h,al

                        call Sync

                        xor al,al
                        out 43h,al
                        in al,40h
                        mov ah,al
                        in al,40h
                        xchg al,ah
                        neg ax
                        shr ax,1
                        mov cs:frametime,ax
                        mov dx,ax
                        mov al,ah
                        xor ah,ah
                        sub dx,ax
                        shl dx,1
                        mov cs:frametimeb,dx
                        mov al,36h
                        out 43h,al
                        mov al,dl
                        out 40h,al
                        mov al,dh
                        out 40h,al
                        ret

SetInts 		endp


ClearInts 		proc near

                        cli
                        xor ax,ax
                        mov es,ax
                        mov ax,WORD PTR cs:oldint8
                        mov dx,WORD PTR cs:oldint8[2]
                        mov es:[INTER*4],ax
                        mov es:[INTER*4+2],dx
                        sti

                        mov al,36h
                        out 43h,al
                        mov al,0
                        out 40h,al
                        mov al,0
                        out 40h,al
                        ret

ClearInts 		endp


GetRasterLine           proc near

                        push dx
                        push cx

                        cli
                        xor al,al
                        out 43h,al
                        in al,40h
                        mov dl,al
                        in al,40h
                        mov dh,al
                        shr dx,1
                        mov ax,cs:frametime
                        sub ax,dx
                        mov cx,400
                        mul cx
                        mov cx,cs:frametime
                        div cx
                        sti

                        pop cx
                        pop dx

                        ret

GetRasterLine           endp

                        end

[ RETURN TO DIRECTORY ]