home *** CD-ROM | disk | FTP | other *** search
- ;
- ; 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
-