Listing 1 (mididrv.asm)

;
; 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 0S/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,00h                ;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     [_DerHlp]             ;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!
       cal1     [_DevH1p]

       pop      ds
       pop      es
       popa
       leave
       ret

_WriteBytes ENDP

_int3   proc     near
       int      3
       ret
_int3   endp

_TEXT   ends
       end

; End of File