Category : Files from Magazines
Archive   : CUJ9201.ZIP
Filename : 1001066A

 
Output of file : 1001066A contained in archive : CUJ9201.ZIP

;
; Musical Instrument Digital Interface
; Assembler routines for an OS/2 Device
; Driver written in C.
;
; Copyright Carl M. Benda 1991

EXTRN _main:near
EXTRN _DevHlp:dword
EXTRN _interrupt_handler:near
PUBLIC _STRAT
PUBLIC _INT_HNDLR
PUBLIC _SetIRQ
PUBLIC _ReadBytes
PUBLIC _WriteBytes
PUBLIC _int3
PUBLIC __acrtused

_DATA segment word public 'DATA'
_DATA ends

CONST segment word public 'CONST'
CONST ends

_BSS segment word public 'BSS'
_BSS ends

DGROUP group CONST, _BSS, _DATA

_TEXT segment word public 'CODE'

ASSUME cs:_TEXT, ds:DGROUP, es:NOTHING, ss:NOTHING




.286P

;
; C startup routine for mididrv.c
; _Strat is called by OS/2 during
; boot time.
;

_STRAT proc far
__acrtused: ;prevent startup C
push 0 ;used as the dev value
push es ;send request packet address
push bx
call _main ;call driver main function
pop bx ;restore bx
pop es ;restore es
add sp,2 ;get rid of pushed 0
retf

_STRAT endp


_INT_HNDLR proc far
pusha ;save registers
push ds
push es
call _interrupt_handler ;handle interrupts
mov al,9h ;int value ;interrupt number.
mov dl,31h ;devhlp EOI ;DevHlp End of int
call [_DevHlp] ;call DevHlp entry
pop es
pop ds
popa ;restore everything
retf ;return to C function.

_INT_HNDLR endp

;
; These next routines are used by the C code
; because these procedures need to call special
; device driver helper routines requiring
; hardware registers of specific values.
;

_SetIRQ proc near
push bp
mov bp,sp
; flag located at bp + 8
; fnc located at bp + 6
; irq irq number at + 4

mov bx,WORD PTR [bp+4] ;irq number
mov ax,WORD PTR [bp+6] ;fnc entry
mov dh,BYTE PTR [bp+8] ;share flag
mov dl,1Bh ;SetIRQ DevHlp
call [_DevHlp]
leave
ret

_SetIRQ ENDP

_ReadBytes proc near
push bp
mov bp,sp
pusha
push es
push ds

; Physical Offset = 4
; Physical Segment = 6
; Device Driver = 8
; count = 12

mov ax,WORD PTR [bp+6]
mov bx,WORD PTR [bp+4]
mov dl,15h ;PhysToVirt
mov dh,01h ;result in es:di
call [_DevHlp] ;useable addr.

lds si,DWORD PTR [bp+ 8] ;source
mov cx, WORD PTR [bp+12] ;bytes to move
rep movsb ;copy data!

mov dl,32h ;Must UnPhys!
call [_DevHlp]

pop ds
pop es
popa
leave
ret

_ReadBytes ENDP

_WriteBytes proc near
push bp
mov bp,sp
pusha
push es
push ds

; Physical Offset = 4
; Physical Segment = 6
; Device Driver = 8
; count = 12

mov ax,WORD PTR [bp+6]
mov bx,WORD PTR [bp+4]
mov dl,15h ;PhysToVirt
mov dh,00h ;result in ds:si
call [_DevHlp] ;useable addr.

les di,DWORD PTR [bp+ 8] ;source
mov cx, WORD PTR [bp+12] ;bytes to move
rep movsb ;copy data!

mov dl,32h ;Must UnPhys!
call [_DevHlp]

pop ds
pop es
popa
leave
ret

_WriteBytes ENDP

_int3 proc near
int 3
ret
_int3 endp

_TEXT ends
end