home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / miditool / sda_ur22 / tst_usr2.asm < prev   
Assembly Source File  |  1988-04-21  |  7KB  |  400 lines

  1. page    55,96
  2. title    SDA_USR2  -  Stand-alone routines for the SDA Midicard.
  3.  
  4. .XLIST
  5. INCLUDE        DOS.MAC
  6. .LIST
  7.  
  8. ; Revisions:
  9. ;
  10. ;    01-8-88        Added dummy 'mov ax,0' instructions in _U_LOC_MC
  11. ;            to provide settle time when running in 10mh AT's
  12. ;    04-19-88    Added addr. 320 (MPU mode) support.
  13.  
  14. ; This file is a C linkable version of SDA_USR2.ASM that uses
  15. ; the segment macros in DOS.MAC.
  16.  
  17.  
  18. ;******************************************************************
  19. ;*
  20. ;* See companion file 'SDA_USER.DOC' for more information on 
  21. ;* these subroutines.
  22. ;*
  23. ;******************************************************************
  24.  
  25.  
  26.  
  27.  
  28. ;******************************************************************
  29. ;*
  30. ;* This software is intended to provide access to a Downloaded
  31. ;* Systems Design Midicard such that it may be used in UART mode.
  32. ;* In this mode the interface (Midicard) will send all data
  33. ;* received from Midi IN to the host PC, and will send all data
  34. ;* from the host out MIdi OUT.  There is no direct flow of data
  35. ;* from Midi IN to Midi OUT (Midi THRU) in the Midicard in UART mode.
  36. ;* THRU capabilities must be handled by the host in this mode.
  37. ;*
  38. ;* These routines are NOT designed to be memory resident with a
  39. ;* running Promidi system.  Routines that provide services for
  40. ;* memory co-resident software (TSR) are provided as public 
  41. ;* domain 8086 assembly source in "SDA_USER.ASM".
  42. ;*
  43. ;* The following requirments must be satisfied before data may be
  44. ;* sent and received from a Midicard:
  45. ;* 
  46. ;*    1. The Midicard must be downloaded.
  47. ;*
  48. ;*    The loader program is MLOAD.EXE and the Midicard's software
  49. ;*    is in file Z8.HEX.  Both of these programs are supplied with
  50. ;*    with every Promidi system.  Before Promidi can run, the
  51. ;*    command line "MLOAD Z8" is executed (from BATCH file SDA.BAT).
  52. ;*    Once the Midicard's program has been downloaded, it is intact
  53. ;*    until the PC is powered down.  The same "MLOAD Z8" may be used
  54. ;*    in any batch file to download the Midicard.
  55. ;*
  56. ;*
  57. ;*    2. The Midicard must be located and initialized.
  58. ;*
  59. ;*    There is a file called SDA.CFG that is in the same directory
  60. ;*    as MLOAD.EXE and Z8.HEX.  This file contains (along with other data)
  61. ;*    the switch settings set by the user at instalation time that
  62. ;*    position the card in the PC's I/O space and assign it one of
  63. ;*    four interrupt addresses.
  64. ;*
  65. ;*    The provided routine "_U_LOC_MC" is used to locate the Midicard.
  66. ;*
  67. ;*
  68. ;* After these requirments have been satisfied, the I/O routines 
  69. ;* may be called.
  70. ;*
  71. ;* Before terminating, the software should ALWAYS call _U_EXIT which
  72. ;* will reset (deactivate) the Midicard. 
  73. ;*
  74. ;******************************************************************
  75.  
  76.  
  77. ;*************************************************************************
  78. ;*
  79. ;* The source file 'TST_USR2.ASM' is provided free of charge by Systems 
  80. ;* Design Associates, Inc.  SDA does not in any way warranty this software 
  81. ;* nor is it liable for any damages resulting from its use.
  82. ;*
  83. ;*************************************************************************
  84.  
  85.     DSEG
  86.  
  87.  
  88. ; MIDICARD 8255 REG. DEFINITION
  89. ; MUST CORRESPOND TO SW. 1-4 ON MIDICARD
  90.  
  91. PTA    DW    ?
  92. PTB    DW    ?
  93. PTC    DW    ?
  94. PTCNTL    DW    ?
  95.  
  96.  
  97.  
  98. ; MIDICARD INTERRUPT INFO. 
  99. ; MUST CORRESPOND TO SW 5-8 ON MIDICARD
  100.  
  101. MI_LOC    DW    ?
  102. MI_BIT    DB    ?
  103.  
  104. FILEBUF    DB    ?,?
  105. FILESTR    DB    'SDA.CFG'
  106.     DB    0
  107.  
  108.     ENDDS
  109.  
  110.  
  111.     PSEG
  112.  
  113.  
  114. PUBLIC    _U_LOC_MC,_U_SNDB,_U_RCVB,_U_EXIT,_U_TRCV
  115. page
  116.  
  117.  
  118.  
  119. ; _U_LOC_MC
  120. ;
  121. ;      THIS ROUTINE MUST BE CALLED SUCCESSFULLY (RET = 1)
  122. ;      IN ORDER TO USE "_U_SNDB" and "_U_RCVB".
  123. ;
  124. ; If the file SDA.CFG is found in the current directory,
  125. ;  this routine fills the port and interrupt location data used
  126. ;  by the I/O routines.
  127. ;
  128. ;    Returns:    ax = 0        Error.
  129. ;            ax = 1        Completed.
  130. ;
  131. ;    Regs altered - ax,bx,cx,dx
  132.  
  133. _U_LOC_MC proc far
  134.     push    si
  135.     mov    dx,offset DGROUP:FILESTR    ; Open SDA.CFG for reading.
  136.     mov    ax,3D00H
  137.     int    21H
  138.     jnc    ULOC1
  139.     xor    ax,ax            ; Error
  140.     jmp    ULOCRET    
  141. ULOC1:
  142.     mov    si,ax            ; Save file handle in SI
  143.     mov    bx,ax            ; Read first two bytes in SDA.CFG
  144.     mov    cx,2
  145.     mov    dx,offset DGROUP:FILEBUF
  146.     mov    ax,3F00H
  147.     int    21H
  148.     jnc    ULOC2
  149.     xor    ax,ax            ; Error
  150.     jmp    ULOCRET    
  151. ULOC2:
  152.     mov    bx,si            ; Close the file
  153.     mov    ax,3E00H    
  154.     int    21H
  155.  
  156.     mov    si,offset DGROUP:FILEBUF
  157.     mov    al,[si]            ; Get 1st byte 
  158.  
  159.     mov    bx,300H
  160.     dec    al
  161.     jz    ULOC3
  162.  
  163.     mov    bx,280H
  164.     dec    al
  165.     jz    ULOC3
  166.  
  167.     mov    bx,240H
  168.     dec    al
  169.     jz    ULOC3
  170.  
  171.     mov    bx,220H
  172.     dec    al
  173.     jz    ULOC3
  174.  
  175.     mov    bx,320H            ; MPU mode
  176.     dec    al
  177.     jz    ULOC3
  178.  
  179.     xor    ax,ax            ; Error
  180.     jmp    ULOCRET    
  181. ULOC3:    
  182.     mov    PTA,bx            ; Set up port addresses
  183.     inc    bx
  184.     mov    PTB,bx
  185.     inc    bx
  186.     mov    PTC,bx
  187.     inc    bx
  188.     mov    PTCNTL,bx
  189.  
  190.     inc    si
  191.     mov    al,[si]            ; Get 2nd byte
  192.     sub    al,4
  193.  
  194.     mov    MI_LOC,(8 + 2) * 4    ; Set up interrupt address
  195.     mov    MI_BIT,04H
  196.     dec    al
  197.     jz    ULOC4
  198.  
  199.     mov    MI_LOC,(8 + 7) * 4
  200.     mov    MI_BIT,80H
  201.     dec    al
  202.     jz    ULOC4
  203.  
  204.     mov    MI_LOC,(8 + 5) * 4
  205.     mov    MI_BIT,20H
  206.     dec    al
  207.     jz    ULOC4
  208.  
  209.     mov    MI_LOC,(8 + 4) * 4
  210.     mov    MI_BIT,10H
  211.     dec    al
  212.     jz    ULOC4
  213.     xor    ax,ax            ; Error
  214.     jmp    ULOCRET    
  215. ULOC4:    
  216.     pushf
  217.     cli
  218.     mov    dx,PTC
  219.     mov    al,1            ; Midicard mode
  220.     mov    ah,0            ; wait
  221.     mov    ah,0
  222.     out    dx,al
  223.  
  224.     mov    al,0C1H
  225.     mov    ah,0            ; wait
  226.     mov    ah,0
  227.     out    dx,al
  228.  
  229.     mov    dx,PTCNTL
  230.     mov    al,0C2H
  231.     mov    ah,0            ; wait
  232.     mov    ah,0
  233.     out    dx,al
  234.  
  235.     mov    al,0FH
  236.     mov    ah,0            ; wait
  237.     mov    ah,0
  238.     out    dx,al
  239.  
  240.     mov    al,9
  241.     mov    ah,0            ; wait
  242.     mov    ah,0
  243.     out    dx,al
  244.     mov    ax,1
  245.     popf
  246.     xor    ax,ax
  247. ULOC6:
  248.     dec    ax
  249.     jnz    ULOC6
  250. ULOC5:
  251.     mov    dx,PTC
  252.     in    al,dx
  253.     test    al,80H
  254.     jz    ULOC5
  255.  
  256.     mov    dx,PTCNTL
  257.     mov    al,5
  258.     out    dx,al
  259.  
  260.     mov    dx,PTA
  261.     mov    al,35
  262.     out    dx,al
  263. ULOCRET:
  264.     pop    si
  265.     ret
  266. _U_LOC_MC endp
  267. page
  268.  
  269.  
  270.  
  271.  
  272. ; _U_RCVB  -  If a byte is present, receive a byte from the Midicard
  273. ;
  274. ;  c  call    c = u_rcvb();
  275. ;
  276. ;  asm  call    call    _u_rcvb    ; Byte or ret. code in ax.  
  277. ;    (far)
  278. ;
  279. ;    RETURNS:    byte
  280. ;            100H        No input received
  281. ;
  282. ;    Regs Altered: ax,dx
  283.  
  284. _U_RCVB    proc    far
  285.     mov    dx,PTC
  286.     in    al,dx
  287.     test    al,20H            ; Look for input
  288.     jnz    IBFULL
  289.     mov    ax,100H            ; None
  290.     jmp    URCRET
  291. IBFULL:
  292.     mov    dx,PTA            ; Get byte
  293.     in    al,dx
  294.     xor    ah,ah
  295. URCRET:
  296.     ret
  297. _U_RCVB    endp
  298. page
  299.  
  300.  
  301.  
  302.  
  303. ; _U_TRCV  -  Test if a byte is present from the Midicard
  304. ;
  305. ;  c  call    rc = u_trcv();
  306. ;
  307. ;  asm  call    call    _u_trcv  ; Ret. code in ax.  
  308. ;    (far)
  309. ;
  310. ;    RETURNS:    0        No input.
  311. ;            1        Input present.
  312. ;
  313. ;    Regs Altered: ax,dx
  314.  
  315. _U_TRCV    proc    far
  316.     mov    dx,PTC
  317.     in    al,dx
  318.     test    al,20H            ; Look for input
  319.     jnz    UTR1
  320.     xor    ax,ax
  321.     jmp    UTRRET
  322. UTR1:
  323.     mov    ax,1
  324. UTRRET:
  325.     ret
  326. _U_TRCV    endp
  327. page
  328.  
  329.  
  330.  
  331.  
  332.  
  333. ; _U_SNDB  -  Send a byte to the Midicard.
  334. ;
  335. ;  c call    u_sndb(c);
  336. ;
  337. ;  asm call    push    ax        ; Push byte on stack
  338. ;   (far)    call    _u_sndb
  339. ;        add    sp,2
  340. ;
  341. ;
  342. ;    Regs Altered: ax,cx,dx
  343.  
  344. _U_SNDB    proc    far
  345.     push    bp
  346.     mov    bp,sp
  347.     mov    cx,[bp+6]        ; Get parameter.
  348. USND1:
  349.     mov    dx,PTC
  350.     in    al,dx
  351.     test    al,80H            ; Output buffer empty ?
  352.     jz    USND1            ; No - keep trying.
  353.  
  354.     mov    dx,PTB
  355.     in    al,dx
  356.     test    al,40H            ; Can we send Midi data ?
  357.     jnz    USND1            ; No - keep trying.
  358.  
  359.     mov    dx,PTCNTL        ; Say its Midi data
  360.     mov    al,4            ;   (not a command)
  361.     out    dx,al
  362.  
  363.     mov    dx,PTA            ; Send byte.
  364.     mov    al,cl
  365.     out    dx,al
  366.  
  367.     pop    bp
  368.     ret
  369. _U_SNDB    endp
  370. page
  371.  
  372.  
  373.  
  374.  
  375.  
  376. ; _U_EXIT  -  Reset th Midicard before terminating program.
  377. ;
  378. ;  c call    u_exit();
  379. ;
  380. ;  asm call    call    _u_exit
  381. ;   (far)
  382. ;
  383. ;
  384. ;    Regs Altered: ax,cx,dx
  385.  
  386. _U_EXIT    proc    far
  387.     pushf
  388.     cli
  389.     mov    dx,PTC
  390.     mov    al,1            ; Midicard mode
  391.     out    dx,al
  392.     popf
  393.     ret
  394. _U_EXIT    endp
  395.  
  396.  
  397.     ENDPS
  398.  
  399.     END
  400.