home *** CD-ROM | disk | FTP | other *** search
/ Chip: Special Sound & MIDI / Chip-Special_Sound-und-Midi-auf-dem-PC.bin / midiprog / smsg.asm < prev    next >
Assembly Source File  |  1993-11-28  |  6KB  |  347 lines

  1. title Send MIDI Message HEX
  2. page 64,132
  3.  
  4. MIDI_CLOCK    equ  0f8h
  5. ACTIVE_SENSE  equ  0feh
  6.  
  7.          code segment 'code'
  8.          assume cs:code,ds:code,es:code
  9.  
  10.          org 100h
  11.  
  12. start  : jmp   anfang
  13.  
  14. msg_help       db  'Aufruf: SMSG [-f Datei] | MIDI Message (hexadezimal)'
  15.                db  13,10,0
  16.  
  17. msg_fnf        db  'SMSG: Datei nicht gefunden'
  18.                db  13,10,0
  19.  
  20. msg_fatal      db  13,10
  21.                db  'SMSG: FATAL loop in put_cmd()'
  22.                db  13,10,0
  23.  
  24. ; ---------
  25. ; Variablen
  26. ALIGN 4
  27.  
  28. faddr          dw  0
  29. smsg_flag      db  0
  30.  
  31. ; ---------
  32. ; Utilities
  33.  
  34. wstring: push  ax
  35.          push  si
  36. wstr100: lodsb
  37.          or    al,al
  38.          jz    wstr200
  39.          call  wchar
  40.          jmp   short wstr100
  41. wstr200: pop   si
  42.          pop   ax
  43.          ret
  44.  
  45. wchar  : push  ax
  46.          push  dx
  47.          mov   dl,al
  48.          mov   ah,2
  49.          int   21h
  50.          pop   dx
  51.          pop   ax
  52.          ret
  53.  
  54. toupper: cmp   al,'a'
  55.          jb    tou_ex
  56.          cmp   al,'z'
  57.          ja    tou_ex
  58.          and   al,not 32
  59. tou_ex : ret
  60.  
  61. tolower: cmp   al,'A'
  62.          jb    tol_ex
  63.          cmp   al,'Z'
  64.          ja    tol_ex
  65.          or    al,32
  66. tol_ex : ret
  67.  
  68. wsecond: push  cx
  69.          mov   ah,18
  70.          mul   ah
  71.          mov   cx,ax
  72. wsec10 : call  wtick
  73.          loop  wsec10
  74.          pop   cx
  75.          ret
  76.  
  77. ; -----
  78. ; wtick - Wartet für einen Timertick ...
  79.  
  80. wtick  : push  ax
  81.          push  bx
  82.          push  cx
  83.          push  dx
  84.          sti
  85.          xor   ax,ax
  86.          int   1ah
  87.          mov   bx,dx
  88. wtick10: xor   ax,ax
  89.          int   1ah
  90.          cmp   dx,bx
  91.          jz    wtick10
  92.          pop   dx
  93.          pop   cx
  94.          pop   bx
  95.          pop   ax
  96.          ret
  97.  
  98. ; -------
  99. ; waitrcv - Wait For MPU Receive Ready
  100.  
  101. waitrcv: push  ax
  102.          push  dx
  103.          mov   dx,0331h
  104.  
  105. waitr10: in    al,dx
  106.          test  al,40h
  107.          jnz   waitr10
  108.  
  109.          pop   dx
  110.          pop   ax
  111.          ret
  112.  
  113. ; --------
  114. ; put_midi - Ausgabe eines MidiBytes
  115.  
  116. put_midi:push  ax
  117.          push  dx
  118.          call  waitrcv
  119.  
  120.          mov   dx,0330h
  121.          out   dx,al
  122.  
  123.          pop   dx
  124.          pop   ax
  125.          ret
  126.  
  127. ; -------
  128. ; resetmpu - Reset MPU
  129.  
  130. resetmpu:push  ax
  131.          push  dx
  132.          call  waitrcv
  133.  
  134.          pushf
  135.          cli
  136.          mov   dx,0331h
  137.          mov   al,0ffh
  138.          out   dx,al
  139.  
  140.          call  waitrcv
  141.          dec   dx
  142.          in    al,dx
  143.          popf
  144.  
  145.          pop   dx
  146.          pop   ax
  147.          ret
  148.  
  149. ; -------
  150. ; put_cmd - Ausgabe eines MPU-Kommandos
  151.  
  152. put_cmd: push  ax
  153.          push  cx
  154.          push  dx
  155.  
  156.          call  waitrcv
  157.  
  158.          pushf
  159.          cli
  160.          mov   dx,0331h
  161.          out   dx,al
  162.          mov   cx,4000h
  163.  
  164. put_c20: in    al,dx
  165.          test  al,80h
  166.          jz    put_c30
  167.          loop  put_c20
  168.  
  169.          mov   al,20h
  170.          out   20h,al
  171.          sti
  172.  
  173.          lea   si,msg_fatal
  174.          call  wstring
  175.          jmp   ende
  176.  
  177. put_c30: dec   dx
  178.          in    al,dx
  179.          inc   dx
  180.          cmp   al,0feh
  181.          jnz   put_c20
  182.  
  183. put_c90: popf
  184.          pop   dx
  185.          pop   cx
  186.          pop   ax
  187.          ret
  188.  
  189. ; -----
  190. ; rmain
  191.  
  192. rmain  : call  resetmpu
  193.          mov   al,3fh
  194.          call  put_cmd
  195.  
  196.          lea   si,message
  197.  
  198. rmain100:lodsb
  199.  
  200.          cmp   al,MIDI_CLOCK
  201.          jnz   rmain110
  202.  
  203.          mov   al,1
  204.          call  wsecond
  205.          jmp   short rmain112
  206.  
  207. rmain110:call  put_midi
  208.  
  209. rmain112:loop  rmain100
  210.  
  211. rmain120:cmp   smsg_flag,0
  212.          jz    rmain130
  213.  
  214. rmain130:call  resetmpu
  215.          ret
  216.  
  217. ; -------
  218. ; parscmd - Die Kommandozeile untersuchen
  219.  
  220. parscmd: mov   si,80h
  221.          lodsw
  222.          or    al,al
  223.          jnz   pars100
  224.  
  225. helpexit:lea   si,msg_help
  226.  
  227. err_exit:call  wstring
  228.          mov   al,1
  229.          jmp   ende
  230.  
  231. pars100: call  pars500
  232.          jb    helpexit
  233.  
  234.          cmp   word ptr [si],'f-'
  235.          jnz   pars110
  236.  
  237.          jmp   pars600
  238.  
  239. pars110: lea   di,message
  240.          xor   cx,cx
  241.  
  242. pars120: lodsb
  243.          call  pars200
  244.          mov   ah,al
  245.          shl   ah,1
  246.          shl   ah,1
  247.          shl   ah,1
  248.          shl   ah,1
  249.          lodsb
  250.          call  pars200
  251.          or    ah,al
  252.          mov   al,ah
  253.          stosb
  254.          inc   cx
  255.          call  pars500
  256.          jnb   pars120
  257.          ret
  258.  
  259. pars200: call  toupper
  260.          cmp   al,'0'
  261.          jb    helpexit
  262.          cmp   al,'F'
  263.          ja    helpexit
  264.          cmp   al,'9'
  265.          jbe   pars220
  266.          cmp   al,'A'
  267.          jb    helpexit
  268.          sub   al,7
  269.  
  270. pars220: sub   al,'0'
  271.          ret
  272.  
  273. pars_ex: ret
  274.  
  275. pars500: cmp   byte ptr [si],' '
  276.          jz    pars540
  277.          cmp   byte ptr [si],9
  278.          jz    pars540
  279.          cmp   byte ptr [si],13
  280.          jnz   pars520
  281.          stc
  282.          ret
  283.  
  284. pars520: clc
  285.          ret
  286.  
  287. pars540: inc   si
  288.          jmp   short pars500
  289.  
  290.  
  291. pars600: lodsw
  292.          call  pars500
  293.          jnb   pars620
  294.          jmp   helpexit
  295.  
  296. pars620: mov   faddr,si
  297.          mov   di,si
  298.  
  299. pars640: lodsb
  300.          cmp   al,13
  301.          jz    pars660
  302.  
  303.          call  toupper
  304.          stosb
  305.          jmp   short pars640
  306.  
  307. pars660: mov   al,0
  308.          stosb
  309.  
  310.          mov   ax,3d00h
  311.          mov   dx,faddr
  312.          int   21h
  313.          jnb   pars700
  314.  
  315.          lea   si,msg_fnf
  316.          jmp   err_exit
  317.  
  318. pars700: mov   bx,ax
  319.          mov   ax,3f00h
  320.          mov   cx,0e000h
  321.          lea   dx,message
  322.          int   21h
  323.  
  324.          mov   cx,ax
  325.          mov   ax,3e00h
  326.          int   21h
  327.  
  328.          mov   smsg_flag,1
  329.          ret
  330.  
  331. ; ------
  332. ; Anfang
  333.  
  334. anfang : cld
  335.          call  parscmd
  336.          call  rmain
  337.  
  338. ende   : mov   ah,4ch
  339.          int   21h
  340.  
  341. ALIGN 16
  342.  
  343. message        label byte
  344.  
  345. code     ends
  346.          end   start
  347.