home *** CD-ROM | disk | FTP | other *** search
/ Chip: Special Sound & MIDI / Chip-Special_Sound-und-Midi-auf-dem-PC.bin / midiprog / tg33cc.asm < prev    next >
Assembly Source File  |  1993-06-13  |  38KB  |  1,675 lines

  1. title TG33CC - Yamaha Tone Generator 33 Control Center
  2. page 64,132
  3.  
  4. ; KEYCODE - Tastaturcodes der Sondertasten
  5.  
  6. KEY_F1         equ     59
  7. KEY_F2         equ     60
  8.  
  9. KEY_LEFT       equ     75
  10. KEY_RIGHT      equ     77
  11. KEY_UP         equ     72
  12. KEY_DOWN       equ     80
  13.  
  14. CTRL_LEFT      equ    115
  15. CTRL_RIGHT     equ    116
  16. CTRL_UP        equ    160
  17. CTRL_DOWN      equ    164
  18.  
  19. KEY_HOME       equ     71
  20. KEY_END        equ     79
  21. KEY_PGUP       equ     73
  22. KEY_PGDN       equ     81
  23.  
  24. KEY_INSERT     equ     82
  25. KEY_DELETE     equ     83
  26.  
  27.          code segment 'code'
  28.          assume cs:code,ds:code,es:code
  29.  
  30.          org 100h
  31.  
  32.  
  33. start  : jmp   anfang
  34.  
  35. ; -----
  36. ; Texte
  37.  
  38. ring_menu      db  'Para|Common|Vector|Tone|Envelope|Multi|System|Midi|Remote',0
  39. help_line      db  'F1 Hilfe|F2 Programm beenden|F3 Element Select|F4 Element on/off',0
  40.  
  41. msg_copyright  db  'YAMAHA Tone Generator Control Center'
  42.                db  ' Copyright (c) Andreas Nieden 01/92 '
  43.  
  44. msg_notimpl    db  'Dieses Feature ist leider noch nicht'
  45.                db  '     i m p l e m e n t i e r t      '
  46.  
  47. win_mpara      db  20,6
  48.                db  'PrgChg Preset 1 & 2 '
  49.                db  'Voice Vektor-X      '
  50.                db  'Voice Vektor-Y      '
  51.                db  'Modulationsrad      '
  52.                db  'Voice Volume        '
  53.                db  'Voice Sustain       '
  54.  
  55. win_mcommon    db  20,14
  56.                db  'Effect              '
  57.                db  'Effect Balance      '
  58.                db  'Effect Level        '
  59.                db  'Voice Name          '
  60.                db  'Pitch Bend Range    '
  61.                db  'After Touch Level   '
  62.                db  'After Touch PM      '
  63.                db  'After Touch AM      '
  64.                db  'Modulation Wheel PM '
  65.                db  'Modulation Wheel AM '
  66.                db  'Pitch Bias          '
  67.                db  'EG Delay Rate       '
  68.                db  'EG Attack Rate      '
  69.                db  'EG Release Rate     '
  70.  
  71. win_mvector    db  19,8
  72.                db  'Level Speed        '
  73.                db  'Detune Speed       '
  74.                db  'Level Time 1-50    '
  75.                db  'Level X-Axis 1-50  '
  76.                db  'Level Y-Axis 1-50  '
  77.                db  'Detune Time 1-50   '
  78.                db  'Detune X-Axis 1-50 '
  79.                db  'Detune Y-Axis 1-50 '
  80.  
  81. win_mtone      db  24,14
  82.                db  'Wave Type               '
  83.                db  'Fequency Shift          '
  84.                db  'After Touch Sensitivity '
  85.                db  'Velocity Sensitivity    '
  86.                db  'LFO Type                '
  87.                db  'LFO Speed               '
  88.                db  'LFO Delay               '
  89.                db  'LFO Rate                '
  90.                db  'LFO AM                  '
  91.                db  'LFO PM                  '
  92.                db  'Pan                     '
  93.                db  'Feed Back  (FM only)    '
  94.                db  'Tone Level (FM only)    '
  95.                db  'Volume                  '
  96.  
  97. win_menvelope  db  14,12
  98.                db  'Type          '
  99.                db  'Level Scaling '
  100.                db  'Rate Scaling  '
  101.                db  'Delay on/off  '
  102.                db  'Attack Rate   '
  103.                db  'Decay 1 Rate  '
  104.                db  'Decay 2 Rate  '
  105.                db  'Release Rate  '
  106.                db  'Initial Level '
  107.                db  'Attack Level  '
  108.                db  'Decay 1 Level '
  109.                db  'Decay 2 Level '
  110.  
  111. win_mmulti     db  24,16
  112.                db  'Effect Type             '
  113.                db  'Effect Balance          '
  114.                db  'Group1 Effect Send Level'
  115.                db  'Group2 Effect Send Level'
  116.                db  'Group2 Output Select    '
  117.                db  'Group1 Output Select    '
  118.                db  'Multi Name              '
  119.                db  'Assign Mode             '
  120.                db  'Voice Switch            '
  121.                db  'Send Group              '
  122.                db  'Voice Memory            '
  123.                db  'Voice Number            '
  124.                db  'Volume                  '
  125.                db  'Detune                  '
  126.                db  'Note Shift              '
  127.                db  'Pan                     '
  128.  
  129. win_msystem    db  16,3
  130.                db  'Transpose       '
  131.                db  'Master Tune     '
  132.                db  'Controller Reset'
  133.  
  134. win_mmidi      db  18,5
  135.                db  'Device Number     '
  136.                db  'Exclusive on/off  '
  137.                db  'Program Change    '
  138.                db  'Voice Recv Channel'
  139.                db  'Vector Channel    '
  140.  
  141. win_mremote    db  13,19
  142.                db  'Vector       '
  143.                db  'Cursor Left  '
  144.                db  'Cursor Right '
  145.                db  'Yes (+1)     '
  146.                db  'No (-1)      '
  147.                db  'Voice        '
  148.                db  'Multi        '
  149.                db  'Edit/Compare '
  150.                db  'Store/Copy   '
  151.                db  'Card         '
  152.                db  'Internal     '
  153.                db  'Preset       '
  154.                db  'Bank Sel. 1-8'
  155.                db  'Prg  Sel. 1-8'
  156.                db  'Demo         '
  157.                db  'Utility      '
  158.                db  'Page Up      '
  159.                db  'Page Down    '
  160.                db  'Effect Bypass'
  161.  
  162. ; -----
  163. ; TG 33 Presetliste
  164.  
  165. ALIGN 4
  166. tg33preset label byte
  167. db 'SP*Pro33 SP*Matrx SC:Groov SC*Rude  SL*Sync  ME*Vecta SE*Mount SQ:MrSeq '
  168. db 'SP*Echo  SP*Gut   SC*Airy  SC*Bellz SL*VCO   ME*NuAge SE*5.PM  SQ:It    '
  169. db 'SP*BelSt SP*Omni  SC*Solid SC*Pluck SL*Chic  PC*Hit+  SE*FlyBy SQ*Id    '
  170. db 'SP*Full  SP*Oiled SC*Sweep SC*Glass SL:Mini  ME*Glace SE*Fear  SQ*Wrapa '
  171. db 'SP*Ice   SP*Ace   SC*Drops SC*Wood  SL*Wisul ME*Astro SE:Wolvs SQ*TG809 '
  172. db 'SP*Dandy SP*Quire SC*Euro  SC*Wire  SL*Blues ME*Vger  SE*Hades SQ*Devol '
  173. db 'SP*Arkle SP*Digit SC*Decay SC*Cave  SL:Cosmo ME*Hitch SE*Neuro DR:Kit   '
  174. db 'SP*BrVec SP*Swell SC:Steel SC*Wispa SL*Super ME*Indus SE*Angel DR*EFX   '
  175. db 'EP*Arlad OR*Gospl BA*Slap  BA:Fingr BR*Power BR:FrHrn ST*Arco  CH*Modrn '
  176. db 'EP:Piano OR*Rock  BA*Atack BA*Frtls BR*Fanfr BR:Trmpt ST:Chmbr CH*Duwop '
  177. db 'EP*Malet OR*Pipe  BA*Seq   BA:Wood  BR*Class BR*Tromb ST*Full  CH*Itopy '
  178. db 'AP*ApStr OR*Perc  BA*Trad  PL*Foksy BR*Reeds WN*Sax   ST:Pizza CH*Astiz '
  179. db 'EP:DX6op KY*Squez BA:Pick  PL*12Str BR*Chill WN:Pan   ST*CelSt PC:Marim '
  180. db 'EP*Pin   KY*Hrpsi BA*Syn   PL*Mute  BR*Zeus  WN:Oboe  ST*Exel  PC:Vibes '
  181. db 'EP*NewDX KY*CelSt BA:Rezz  PL*Nylon BR*Moot  WN:Clart ST*Synth PC*Bells '
  182. db 'EP*Fosta KY:Clavi BA*Unisn PL*Dist  BR*Anlog WN:Flute ST*Eroid PC*Clang '
  183.  
  184. ; -----
  185. ; TG 33 WaveForms
  186.  
  187. ALIGN 4
  188. tg33awm label byte
  189. db 'Piano    E.Piano  Clavi    Cembalo  Celesta  P.organ  E.organ1 E.organ2 '
  190. db 'Reed     Trumpet  Mute Trp Trombone Flugel   Fr.Horn  BrasAtak SynBrass '
  191. db 'Flute    Clarinet Oboe     Sax      Gut      Steel    E.Gtr 1  E.Gtr 2  '
  192. db 'Mute Gtr Sitar    Pluck 1  Pluck 2  Wood B 1 Wood B 2 E.Bass 1 E.Bass 2 '
  193. db 'E.Bass 3 E.Bass 4 Slap     Fretless SynBass1 SynBass2 Strings  Vn.Ens.  '
  194. db 'Cello    Pizz.    Syn Str  Choir    Itopia   Ooo!     Vibes    Marimba  '
  195. db 'Bells    Timpani  Tom      E. Tom   Cuica    Whistle  Claps    Hit      '
  196. db 'Harmonic Mix      Sync     Bell Mix Styroll  DigiAtak Noise 1  Noise 2  '
  197. db 'Oh Hit   Water 1  Water 2  Stream   Coin     Crash    Bottle   Tear     '
  198. db 'Cracker  Scratch  Metal 1  Metal 2  Metal 3  Metal 4  Wood     Bamboo   '
  199. db 'Slam     Tp. Body Tb.Body  HornBody Fl.Body  Str.Body AirBlown Reverse1 '
  200. db 'Reverse2 Reverse3 EP wv    Organ wv M.tp wv  Gtr wv   Str wv1  Str wv2  '
  201. db 'Pad wv   Digital1 Digital2 Digital3 Digital4 Digital5 Saw 1    Saw 2    '
  202. db 'Saw 3    Saw 4    Square 1 Square 2 Square 3 Square 4 Pulse 1  Pulse 2  '
  203. db 'Pulse 3  Pulse 4  Pulse 5  Pulse 6  Tri      Sin8     Sin 8+4  SEQ 1    '
  204. db 'SEQ 2    SEQ 3    SEQ 4    SEQ 5    SEQ 6    SEQ 7    SEQ 8    Drum Set '
  205.  
  206. ; ---------
  207. ; Variablen
  208. ALIGN 4
  209.  
  210. win_addr       dd  0           ; Adresse des Fensters
  211.  
  212. win_firstaddr  dw  8 dup (0)   ; Legt Adressen der Fenster ab
  213. win_count      dw  0           ; Zählt Windows
  214.  
  215. win_segment    dw  0           ; Segment Bildschirmspeicher
  216.  
  217. menu_procs     dw  para,common,vector,tone,envelop,multi,system,midi,remote
  218.  
  219. procs_para     dw  prsetchg,notimpl,notimpl
  220.                dw   notimpl,notimpl,notimpl
  221.  
  222. procs_common   dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  223.                dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  224.  
  225. procs_vector   dw  notimpl,notimpl,notimpl,notimpl
  226.                dw  notimpl,notimpl,notimpl,notimpl
  227.  
  228. procs_tone     dw  awsetchg,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  229.                dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  230.  
  231. procs_envelop  dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  232.                dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  233.  
  234. procs_multi    dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  235.                dw  notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl,notimpl
  236.  
  237. procs_system   dw  notimpl,notimpl,notimpl
  238.  
  239. procs_midi     dw  notimpl,notimpl,notimpl,notimpl,notimpl
  240.  
  241. procs_remote   dw  rem_val,rem_val,rem_val,rem_val,rem_val,rem_val,rem_val,rem_val,rem_val,rem_val
  242.                dw  rem_val,rem_val,notimpl,notimpl,rem_val,rem_val,rem_val,rem_val,rem_val
  243.  
  244. menu_addr      dw  16 dup (0)  ; Menu - Bildschirmadressen
  245.  
  246. win_mcolor1    db  74h         ; Menu Farbe 1. Buchstabe
  247. win_mcolor2    db  70h         ; Menu Farbe restl. Text
  248. win_makt       db  0fh         ; Menu aktueller Punkt
  249. win_bg         db  17h         ; Hintergrundfarbe
  250. win_wcolor1    db  30h         ; Farbe für Warntafel
  251. win_wcolor2    db  4fh         ; Farbe für Fehlertafel
  252.  
  253. menu_akt       db  0           ; Aktueller Menupunkt
  254. menu_count     db  9           ; 9 Menupunkte
  255. menu_flag      db  0           ; Zeigt an, ob Cursor links oder rechts !
  256. menu_letters   db  'PCVTEMSMR',0
  257.  
  258. ; -----
  259. ; taste - löscht den Tastaturpuffer und holt eine Tastenkombination nach AX
  260.  
  261. taste  : mov   ah,1
  262.          int   16h
  263.          jz    tast100
  264.          mov   ah,0
  265.          int   16h
  266.          jmp   short taste
  267. tast100: mov   ah,0
  268.          int   16h
  269.          ret
  270.  
  271. ; -----
  272. ; wtick - Wartet für einen Timertick ...
  273.  
  274. wtick  : push  ax
  275.          push  bx
  276.          push  cx
  277.          push  dx
  278.          sti
  279.          xor   ax,ax
  280.          int   1ah
  281.          mov   bx,dx
  282. wtick10: xor   ax,ax
  283.          int   1ah
  284.          cmp   dx,bx
  285.          jz    wtick10
  286.          pop   dx
  287.          pop   cx
  288.          pop   bx
  289.          pop   ax
  290.          ret
  291.  
  292. ; -------
  293. ; waitrcv - Wait For MPU Receive Ready
  294.  
  295. waitrcv: push  ax
  296.          push  dx
  297.          mov   dx,0301h
  298.  
  299. waitr10: in    al,dx
  300.          test  al,40h
  301.          jnz   waitr10
  302.  
  303.          pop   dx
  304.          pop   ax
  305.          ret
  306.  
  307. ; --------
  308. ; put_midi - Ausgabe eines MidiBytes
  309.  
  310. put_midi:push  ax
  311.          push  dx
  312.          call  waitrcv
  313.  
  314.          mov   dx,0300h
  315.          pushf
  316.          cli
  317.          out   dx,al
  318.          popf
  319.  
  320.          pop   dx
  321.          pop   ax
  322.          ret
  323.  
  324. ; -------
  325. ; put_cmd - Ausgabe eines MPU-Kommandos
  326.  
  327. put_cmd: push  ax
  328.          push  cx
  329.          push  dx
  330.  
  331.          call  waitrcv
  332.  
  333.          pushf
  334.          cli
  335.          mov   dx,0301h
  336.          out   dx,al
  337.          mov   cx,4000h
  338.  
  339. put_c20: in    al,dx
  340.          test  al,80h
  341.          jz    put_c30
  342.          loop  put_c20
  343.  
  344.          mov   al,20h
  345.          out   20h,al
  346.          sti
  347.  
  348.          mov   ax,cs
  349.          mov   ds,ax
  350.          jmp   ende
  351.  
  352. put_c30: dec   dx
  353.          in    al,dx
  354.          inc   dx
  355.          cmp   al,0feh
  356.          jnz   put_c20
  357.  
  358. put_c90: popf
  359.          pop   dx
  360.          pop   cx
  361.          pop   ax
  362.          ret
  363.  
  364. ; -------
  365. ; resetmpu - Reset MPU
  366.  
  367. resetmpu:push  ax
  368.          push  dx
  369.          call  waitrcv
  370.  
  371.          pushf
  372.          cli
  373.          mov   dx,0301h
  374.          mov   al,0ffh
  375.          out   dx,al
  376.  
  377.          call  waitrcv
  378.          dec   dx
  379.          in    al,dx
  380.          popf
  381.  
  382.          pop   dx
  383.          pop   ax
  384.          ret
  385.  
  386. ; ---------
  387. ; send_ex - Send Exclusive Message
  388.  
  389. send_ex: call  resetmpu
  390.          mov   al,3fh
  391.          call  put_cmd
  392.  
  393. send_e10:lodsb
  394.          call  put_midi
  395.          cmp   al,0f7h
  396.          jnz   send_e10
  397.  
  398.          call  resetmpu
  399.          ret
  400.  
  401. ; ------
  402. ; scrini
  403. ; Bildschirm initialisieren
  404.  
  405. scrini : push  ds
  406.          push  es
  407.          xor   ax,ax
  408.          mov   bx,0b800h
  409.          mov   ds,ax
  410.          mov   si,0463h
  411.          lodsw
  412.          cmp   ax,03d4h
  413.          jz    scrin10
  414.  
  415.          mov   bx,0b000h
  416.          mov   word ptr cs:win_mcolor1,7070h
  417.          mov   word ptr cs:win_makt,0707h
  418.  
  419. scrin10: mov   cs:win_segment,bx
  420.  
  421.          mov   ax,cs
  422.          add   ax,1000h
  423.          mov   es,ax
  424.          mov   ax,cs:win_segment
  425.          mov   ds,ax
  426.          xor   si,si
  427.          xor   di,di
  428.          mov   cx,2000
  429.          rep   movsw
  430.          mov   ax,0300h
  431.          xor   bx,bx
  432.          int   10h
  433.          mov   ax,cx
  434.          stosw
  435.          mov   ax,dx
  436.          stosw
  437.          mov   word ptr cs:win_addr,di
  438.          mov   word ptr cs:win_addr+2,es
  439.          push  ds
  440.          pop   es
  441.  
  442.          mov   ax,0100h
  443.          xor   bx,bx
  444.          mov   cx,-1
  445.          int   10h
  446.  
  447.          xor   di,di
  448.          mov   ax,cs
  449.          mov   ds,ax
  450.  
  451.          lea   si,ring_menu
  452.          mov   dl,2
  453.          lea   bx,menu_addr
  454.  
  455. scrin12: mov   cx,80
  456.          mov   al,20h
  457.          mov   ah,win_mcolor2
  458.  
  459. scrin20: stosw
  460.          stosw
  461.          sub   cx,2
  462.  
  463. scrin30: lodsb
  464.          mov   ah,win_mcolor1
  465.          mov   [bx],di
  466.          add   bx,2
  467.          stosw
  468.          dec   cx
  469.          mov   ah,win_mcolor2
  470.  
  471. scrin40: lodsb
  472.          or    al,al
  473.          jz    scrin60         ; 0 beendet Menuzeile
  474.  
  475.          cmp   al,'|'          ; | führt zum nächsten Menupunkt
  476.          jnz   scrin50
  477.  
  478.          mov   al,' '
  479.          jmp   short scrin20
  480.  
  481. scrin50: stosw
  482.          dec   cx
  483.          jmp   short scrin40
  484.  
  485. scrin60: mov   al,' '
  486.          mov   ah,win_mcolor2
  487.          rep   stosw
  488.  
  489.          mov   di,24*160
  490.          dec   dl
  491.          jnz   scrin12
  492.  
  493.          mov   di,160
  494.          mov   ah,win_bg
  495.  
  496.          mov   al,213          ; ╒
  497.          stosw
  498.          mov   al,205          ; ═
  499.          mov   cx,78
  500.          rep   stosw
  501.          mov   al,184          ; ╕
  502.          stosw
  503.          mov   cx,21
  504.  
  505. scrin70: mov   al,179          ; │
  506.          stosw
  507.          mov   al,' '
  508.          push  cx
  509.          mov   cx,78
  510.          rep   stosw
  511.          pop   cx
  512.          mov   al,179
  513.          stosw
  514.          loop  scrin70
  515.  
  516.          mov   al,212          ; ╘
  517.          stosw
  518.          mov   al,205          ; ═
  519.          mov   cx,78
  520.          rep   stosw
  521.          mov   al,190          ; ╛
  522.          stosw
  523.  
  524.          mov   ax,062ah
  525.          mov   di,9*160+40
  526.          call  openwin
  527.  
  528.          lea   si,msg_copyright
  529.          mov   di,11*160 + 44
  530.          mov   cx,36
  531.  
  532. scrin80: movsb
  533.          inc   di
  534.          loop  scrin80
  535.  
  536.          mov   di,12*160 + 44
  537.          mov   cx,36
  538.  
  539. scrin90: movsb
  540.          inc   di
  541.          loop  scrin90
  542.  
  543.          mov   cx,90           ; 5 Sekunden warten !
  544.  
  545. scrin92: call  wtick
  546.          mov   ah,1
  547.          int   16h
  548.          jnz   scrin94
  549.          loop  scrin92
  550.  
  551. scrin94: call  closewin
  552.          pop   es
  553.          pop   ds
  554.          ret
  555.  
  556. ; -------
  557. ; notimpl - Noch nicht implementiert
  558.  
  559. notimpl: mov   al,win_mcolor2
  560.          xchg  al,win_wcolor1
  561.          mov   win_mcolor2,al
  562.          mov   ax,062ah
  563.          mov   di,9*160+40
  564.          call  openwin
  565.          push  es
  566.          mov   es,win_segment
  567.  
  568.          lea   si,msg_notimpl
  569.          mov   di,11*160 + 44
  570.          mov   cx,36
  571.  
  572. notim80: movsb
  573.          inc   di
  574.          loop  notim80
  575.  
  576.          mov   di,12*160 + 44
  577.          mov   cx,36
  578.  
  579. notim90: movsb
  580.          inc   di
  581.          loop  notim90
  582.  
  583.          mov   cx,72           ; 4 Sekunden warten !
  584.  
  585. notim92: call  wtick
  586.          mov   ah,1
  587.          int   16h
  588.          jnz   notim94
  589.          loop  notim92
  590.  
  591. notim94: call  closewin
  592.          mov   al,win_mcolor2
  593.          xchg  al,win_wcolor1
  594.          mov   win_mcolor2,al
  595.          pop   es
  596.          ret
  597.  
  598. ; --------
  599. ; prsetchg
  600.  
  601. prset_akt      dw  0
  602. prset_data     db  0b0h,0,0,0b0h,20h,22h,0c0h,0
  603.  
  604. prsetchg:mov   ax,134ch      ; 19 Zeilen 76 Spalten
  605.          mov   di,3*160+4
  606.          call  openwin
  607.          push  es
  608.          mov   es,win_segment
  609.          mov   di,4*160+8
  610.          xor   dx,dx
  611.          lea   si,tg33preset
  612.  
  613. prset100:push  di
  614.          mov   cx,72
  615.  
  616. prset120:movsb
  617.          inc   di
  618.          loop  prset120
  619.  
  620.          pop   di
  621.          add   di,160
  622.          inc   dx
  623.          cmp   dx,8
  624.          jnz   prset140
  625.  
  626.          push  di
  627.          sub   di,2
  628.          mov   al,'─'
  629.          mov   cx,74
  630.  
  631. prset130:stosb
  632.          inc   di
  633.          loop  prset130
  634.          pop   di
  635.          add   di,160
  636.  
  637. prset140:cmp   dx,16
  638.          jb    prset100
  639.  
  640.          pop   es
  641.  
  642.          stc
  643.          call  prset900
  644.  
  645. prset200:call  taste
  646.          cmp   al,27           ; ESC schließt das Fenster
  647.          jnz   prset220
  648.  
  649. prset_ex:call  closewin
  650.          ret
  651.  
  652. prset220:cmp   al,13
  653.          jnz   prset240
  654.  
  655.          mov   ax,prset_akt
  656.          mov   cl,22h
  657.          test  al,40h
  658.          jz    prset230
  659.          mov   cl,25h
  660.  
  661. prset230:mov   byte ptr prset_data+5,cl
  662.          and   al,3fh
  663.  
  664.          cbw
  665.          mov   cl,8
  666.          div   cl
  667.          shl   ah,1
  668.          shl   ah,1
  669.          shl   ah,1
  670.          add   al,ah
  671.  
  672.          mov   byte ptr prset_data+7,al
  673.  
  674.          call  resetmpu
  675.          mov   al,3fh
  676.          call  put_cmd
  677.          mov   cx,8
  678.          lea   si,prset_data
  679.  
  680. prset232:lodsb
  681.          call  put_midi
  682.          loop  prset232
  683.          call  resetmpu
  684.          jmp   short prset200
  685.  
  686. prset240:or    al,al
  687.          jnz   prset200        ; Keine Sondertaste -> weiter
  688.  
  689.          cmp   ah,KEY_LEFT
  690.          jnz   prset260
  691.  
  692.          clc
  693.          call  prset900
  694.          dec   prset_akt
  695.  
  696. prset_st:and   prset_akt,7fh
  697.          stc
  698.          call  prset900
  699.          jmp   short prset200
  700.  
  701. prset260:cmp   ah,KEY_RIGHT
  702.          jnz   prset280
  703.  
  704.          clc
  705.          call  prset900
  706.          inc   prset_akt
  707.          jmp   short prset_st
  708.  
  709. prset280:cmp   ah,KEY_UP
  710.          jnz   prset300
  711.  
  712.          clc
  713.          call  prset900
  714.          sub   prset_akt,8
  715.          jmp   short prset_st
  716.  
  717. prset300:cmp   ah,KEY_DOWN
  718.          jnz   prset320
  719.  
  720.          clc
  721.          call  prset900
  722.          add   prset_akt,8
  723.          jmp   short prset_st
  724.  
  725. prset320:cmp   ah,CTRL_LEFT
  726.          jnz   prset340
  727.  
  728.          clc
  729.          call  prset900
  730.          sub   prset_akt,4
  731.          jmp   prset_st
  732.  
  733.  
  734. prset340:cmp   ah,CTRL_RIGHT
  735.          jnz   prset360
  736.  
  737.          clc
  738.          call  prset900
  739.          add   prset_akt,4
  740.          jmp   prset_st
  741.  
  742. prset360:cmp   ah,KEY_HOME
  743.          jnz   prset380
  744.  
  745.          clc
  746.          call  prset900
  747.          and   prset_akt,0f8h
  748.          jmp   prset_st
  749.  
  750. prset380:cmp   ah,KEY_END
  751.          jnz   prset400
  752.  
  753.          clc
  754.          call  prset900
  755.          or    prset_akt,7
  756.          jmp   prset_st
  757.  
  758. prset400:cmp   ah,KEY_PGUP
  759.          jnz   prset420
  760.  
  761.          clc
  762.          call  prset900
  763.          add   prset_akt,64
  764.          jmp   prset_st
  765.  
  766. prset420:cmp   ah,KEY_PGDN
  767.          jnz   prset440
  768.  
  769.          clc
  770.          call  prset900
  771.          sub   prset_akt,64
  772.          jmp   prset_st
  773.  
  774. prset440:jmp   prset200
  775.  
  776. ; ------
  777. ; Stellt aktuelles Instrument dar
  778.  
  779. prset900:push  es
  780.          pushf
  781.          mov   es,win_segment
  782.          mov   di,4*160 + 8    ; Startadresse 1. Element in ES:DI
  783.          mov   ax,prset_akt
  784.          cmp   ax,64
  785.          jb    prset920
  786.  
  787.          add   di,160
  788.  
  789. prset920:xor   dx,dx
  790.          mov   cx,8
  791.          div   cx
  792.  
  793.          push  dx
  794.          mov   dx,160
  795.          mul   dx
  796.          add   di,ax
  797.          pop   ax
  798.  
  799.          mov   dx,18
  800.          mul   dx
  801.          add   di,ax           ; Offset sollte jetzt feststehen
  802.          mov   al,win_mcolor2  ; Normale Farbe
  803.          mov   cx,8
  804.          popf
  805.          jnb   prset940
  806.  
  807.          mov   al,win_makt
  808.  
  809. prset940:inc   di
  810.          stosb
  811.          loop  prset940
  812.  
  813.          pop   es
  814.          ret
  815.  
  816. ; --------
  817. ; awsetchg
  818.  
  819. awset_akt      dw  0
  820. awset_data     db  0b0h,0,0,0b0h,20h,22h,0c0h,0
  821.  
  822. awsetchg:mov   ax,134ch      ; 19 Zeilen 76 Spalten
  823.          mov   di,3*160+4
  824.          call  openwin
  825.          push  es
  826.          mov   es,win_segment
  827.          mov   di,4*160+8
  828.          xor   dx,dx
  829.          lea   si,tg33awm
  830.  
  831. awset100:push  di
  832.          mov   cx,72
  833.  
  834. awset120:movsb
  835.          inc   di
  836.          loop  awset120
  837.  
  838.          pop   di
  839.          add   di,160
  840.          inc   dx
  841.          cmp   dx,8
  842.          jnz   awset140
  843.  
  844.          push  di
  845.          sub   di,2
  846.          mov   al,'─'
  847.          mov   cx,74
  848.  
  849. awset130:stosb
  850.          inc   di
  851.          loop  awset130
  852.          pop   di
  853.          add   di,160
  854.  
  855. awset140:cmp   dx,16
  856.          jb    awset100
  857.  
  858.          pop   es
  859.  
  860.          stc
  861.          call  awset900
  862.  
  863. awset200:call  taste
  864.          cmp   al,27           ; ESC schließt das Fenster
  865.          jnz   awset220
  866.  
  867. awset_ex:call  closewin
  868.          ret
  869.  
  870. awset220:cmp   al,13
  871.          jnz   awset240
  872.  
  873.          mov   ax,awset_akt
  874.          mov   cl,22h
  875.          test  al,40h
  876.          jz    awset230
  877.          mov   cl,25h
  878.  
  879. awset230:mov   byte ptr awset_data+5,cl
  880.          and   al,3fh
  881.  
  882.          cbw
  883.          mov   cl,8
  884.          div   cl
  885.          shl   ah,1
  886.          shl   ah,1
  887.          shl   ah,1
  888.          add   al,ah
  889.  
  890.          mov   byte ptr awset_data+7,al
  891.  
  892.          call  resetmpu
  893.          mov   al,3fh
  894.          call  put_cmd
  895.          mov   cx,8
  896.          lea   si,awset_data
  897.  
  898. awset232:lodsb
  899.          call  put_midi
  900.          loop  awset232
  901.          call  resetmpu
  902.          jmp   short awset200
  903.  
  904. awset240:or    al,al
  905.          jnz   awset200        ; Keine Sondertaste -> weiter
  906.  
  907.          cmp   ah,KEY_LEFT
  908.          jnz   awset260
  909.  
  910.          clc
  911.          call  awset900
  912.          dec   awset_akt
  913.  
  914. awset_st:and   awset_akt,7fh
  915.          stc
  916.          call  awset900
  917.          jmp   short awset200
  918.  
  919. awset260:cmp   ah,KEY_RIGHT
  920.          jnz   awset280
  921.  
  922.          clc
  923.          call  awset900
  924.          inc   awset_akt
  925.          jmp   short awset_st
  926.  
  927. awset280:cmp   ah,KEY_UP
  928.          jnz   awset300
  929.  
  930.          clc
  931.          call  awset900
  932.          sub   awset_akt,8
  933.          jmp   short awset_st
  934.  
  935. awset300:cmp   ah,KEY_DOWN
  936.          jnz   awset320
  937.  
  938.          clc
  939.          call  awset900
  940.          add   awset_akt,8
  941.          jmp   short awset_st
  942.  
  943. awset320:cmp   ah,CTRL_LEFT
  944.          jnz   awset340
  945.  
  946.          clc
  947.          call  awset900
  948.          sub   awset_akt,4
  949.          jmp   awset_st
  950.  
  951.  
  952. awset340:cmp   ah,CTRL_RIGHT
  953.          jnz   awset360
  954.  
  955.          clc
  956.          call  awset900
  957.          add   awset_akt,4
  958.          jmp   awset_st
  959.  
  960. awset360:cmp   ah,KEY_HOME
  961.          jnz   awset380
  962.  
  963.          clc
  964.          call  awset900
  965.          and   awset_akt,0f8h
  966.          jmp   awset_st
  967.  
  968. awset380:cmp   ah,KEY_END
  969.          jnz   awset400
  970.  
  971.          clc
  972.          call  awset900
  973.          or    awset_akt,7
  974.          jmp   awset_st
  975.  
  976. awset400:cmp   ah,KEY_PGUP
  977.          jnz   awset420
  978.  
  979.          clc
  980.          call  awset900
  981.          add   awset_akt,64
  982.          jmp   awset_st
  983.  
  984. awset420:cmp   ah,KEY_PGDN
  985.          jnz   awset440
  986.  
  987.          clc
  988.          call  awset900
  989.          sub   awset_akt,64
  990.          jmp   awset_st
  991.  
  992. awset440:jmp   awset200
  993.  
  994. ; ------
  995. ; Stellt aktuelles Instrument dar
  996.  
  997. awset900:push  es
  998.          pushf
  999.          mov   es,win_segment
  1000.          mov   di,4*160 + 8    ; Startadresse 1. Element in ES:DI
  1001.          mov   ax,awset_akt
  1002.          cmp   ax,64
  1003.          jb    awset920
  1004.  
  1005.          add   di,160
  1006.  
  1007. awset920:xor   dx,dx
  1008.          mov   cx,8
  1009.          div   cx
  1010.  
  1011.          push  dx
  1012.          mov   dx,160
  1013.          mul   dx
  1014.          add   di,ax
  1015.          pop   ax
  1016.  
  1017.          mov   dx,18
  1018.          mul   dx
  1019.          add   di,ax           ; Offset sollte jetzt feststehen
  1020.          mov   al,win_mcolor2  ; Normale Farbe
  1021.          mov   cx,8
  1022.          popf
  1023.          jnb   awset940
  1024.  
  1025.          mov   al,win_makt
  1026.  
  1027. awset940:inc   di
  1028.          stosb
  1029.          loop  awset940
  1030.  
  1031.          pop   es
  1032.          ret
  1033.  
  1034. ; -------
  1035. ; setmenu
  1036.  
  1037. setmenu: push  es
  1038.          mov   es,win_segment
  1039.          mov   bl,menu_akt
  1040.          mov   bh,0
  1041.          shl   bx,1
  1042.          mov   di,menu_addr[bx]
  1043.          mov   ah,win_makt
  1044.          or    al,al
  1045.          mov   al,ah
  1046.          jnz   setm50
  1047.  
  1048. setm10 : cmp   byte ptr es:[di],' '
  1049.          jz    setm_ex
  1050.  
  1051.          inc   di
  1052.          stosb
  1053.          jmp   short setm10
  1054.  
  1055. setm50 : mov   al,win_mcolor1
  1056.          inc   di
  1057.          stosb
  1058.          mov   al,win_mcolor2
  1059.          jmp   short setm10
  1060.  
  1061. setm_ex: pop   es
  1062.          ret
  1063.  
  1064. ; -------
  1065. ; openwin
  1066.  
  1067. openwin: push  bx
  1068.          push  cx
  1069.          push  si
  1070.          push  di
  1071.          push  ds
  1072.          push  es
  1073.  
  1074.          mov   bx,ax                           ; BX = Breite und Höhe
  1075.          mov   si,di                           ; SI = X-Y Koordinaten
  1076.  
  1077.          push  di                              ; X-Y Koordinate sichern
  1078.  
  1079.          les   di,win_addr
  1080.  
  1081.          push  bx
  1082.          mov   bx,win_count
  1083.          shl   bx,1
  1084.          mov   word ptr win_firstaddr[bx],di
  1085.          pop   bx
  1086.  
  1087.          stosw                                 ; Breite und Höhe sichern
  1088.          mov   ax,si
  1089.          stosw                                 ; Und X-Y Koordinaten
  1090.          mov   ds,win_segment
  1091.          mov   dl,bh
  1092.  
  1093. openw10: push  si
  1094.          mov   cl,bl
  1095.          mov   ch,0
  1096.          rep   movsw
  1097.          pop   si
  1098.          add   si,160
  1099.          dec   dl
  1100.          jnz   openw10         ; Alten Bildschirminhalt sichern
  1101.  
  1102.          mov   word ptr cs:win_addr,di
  1103.          inc   cs:win_count
  1104.  
  1105.          pop   di
  1106.  
  1107.          mov   es,cs:win_segment
  1108.  
  1109.          mov   ah,cs:win_mcolor2
  1110.  
  1111.          mov   cl,bl           ; Breite
  1112.          sub   cl,2
  1113.  
  1114.          push  di
  1115.          mov   al,218          ; ┌
  1116.          stosw
  1117.          mov   al,196          ; ─
  1118.  
  1119. openw20: stosw
  1120.          dec   cl
  1121.          jnz   openw20
  1122.  
  1123.          mov   al,191          ; ┐
  1124.          stosw
  1125.  
  1126.          pop   di
  1127.          add   di,160
  1128.          sub   bh,2
  1129.  
  1130. openw30: push  di
  1131.          mov   al,179          ; │
  1132.          stosw
  1133.          mov   cl,bl
  1134.          sub   cl,2
  1135.          mov   ch,0
  1136.          mov   al,' '
  1137.          rep   stosw
  1138.          mov   al,179          ; │
  1139.          stosw
  1140.          pop   di
  1141.          add   di,160
  1142.          dec   bh
  1143.          jnz   openw30
  1144.  
  1145.          mov   cl,bl           ; Breite
  1146.          sub   cl,2
  1147.  
  1148.          mov   al,192          ; └
  1149.          stosw
  1150.          mov   al,196          ; ─
  1151.  
  1152. openw40: stosw
  1153.          dec   cl
  1154.          jnz   openw40
  1155.  
  1156.          mov   al,217          ; ┘
  1157.          stosw
  1158.  
  1159.          pop   es
  1160.          pop   ds
  1161.          pop   di
  1162.          pop   si
  1163.          pop   cx
  1164.          pop   bx
  1165.          ret
  1166.  
  1167. ; -------
  1168. ; closewin
  1169.  
  1170. closewin:push  ax
  1171.          push  bx
  1172.          push  ds
  1173.          push  es
  1174.          dec   win_count
  1175.          mov   bx,cs:win_count
  1176.          shl   bx,1
  1177.          mov   si,win_firstaddr[bx]
  1178.          mov   word ptr win_addr,si
  1179.          lds   si,win_addr
  1180.          mov   es,cs:win_segment
  1181.          lodsw
  1182.          mov   bx,ax           ; Breite und Höhe nach BX
  1183.          lodsw                 ; X-Y Koordinate
  1184.          mov   di,ax
  1185.  
  1186. closew10:push  di
  1187.          mov   cl,bl
  1188.          mov   ch,0
  1189.          rep   movsw
  1190.          pop   di
  1191.          add   di,160
  1192.          dec   bh
  1193.          jnz   closew10
  1194.  
  1195.          pop   es
  1196.          pop   ds
  1197.          pop   bx
  1198.          pop   ax
  1199.          ret
  1200.  
  1201. ; ------
  1202. ; putwin
  1203.  
  1204. putwin : push  bx
  1205.          push  si
  1206.          push  di
  1207.          push  es
  1208.          mov   es,win_segment
  1209.          lodsw
  1210.          add   di,162
  1211.  
  1212. putw10 : mov   bl,al
  1213.          push  di
  1214.  
  1215.          mov   bh,win_mcolor1
  1216.          mov   es:[di+1],bh
  1217.  
  1218. putw20 : movsb
  1219.          inc   di
  1220.          dec   bl
  1221.          jnz   putw20
  1222.  
  1223.          pop   di
  1224.          add   di,160
  1225.          dec   ah
  1226.          jnz   putw10
  1227.  
  1228.          pop   es
  1229.          pop   di
  1230.          pop   si
  1231.          pop   bx
  1232.          ret
  1233.  
  1234. ; ------
  1235. ; getwin - Eine Auswahl treffen aus einem Menufenster
  1236. ;          Adresse Windowtext in SI
  1237. ;          Bildschirmadresse  in DI
  1238. ;          Zeiger auf Adressen aufzurufender Prozeduren in BX
  1239. ;          Ausgang bei Cursor LEFT,RIGHT und ESC mit Tastaturcode in AL
  1240.  
  1241. getwin_xy      dw  0
  1242. getwin_akt     db  0
  1243. getwin_cols    db  0
  1244. getwin_rows    db  0
  1245.  
  1246. getwin : call  putwin
  1247.          push  es
  1248.          mov   es,win_segment
  1249.          add   di,162
  1250.          mov   getwin_xy,di
  1251.          lodsw
  1252.          mov   word ptr getwin_cols,ax
  1253.          mov   getwin_akt,0
  1254.  
  1255.          clc
  1256.          call  getw900         ; ersten Text invertiert malen
  1257.  
  1258. getw100: call  taste
  1259.          cmp   al,27           ; ESC ?
  1260.          jnz   getw120
  1261.  
  1262. getw_ex: call  closewin
  1263.          pop   es
  1264.          ret
  1265.  
  1266. getw120: cmp   al,13           ; CR ?
  1267.          jnz   getw140
  1268.  
  1269.          push  bx
  1270.          mov   al,getwin_akt
  1271.          mov   ah,0
  1272.          push  ax
  1273.          shl   ax,1
  1274.          add   bx,ax
  1275.          pop   ax
  1276.          call  [bx]
  1277.          pop   bx
  1278.  
  1279.          jmp   short getw100
  1280.  
  1281. getw140: or    al,al
  1282.          jnz   getw100
  1283.  
  1284.          mov   al,ah           ; Sondertaste nach AL
  1285.  
  1286.          cmp   al,KEY_LEFT     ; Cursor links ??
  1287.          jz    getw_ex         ; raus hier
  1288.  
  1289.          cmp   al,KEY_RIGHT    ; Cursor rechts ??
  1290.          jz    getw_ex         ; raus hier
  1291.  
  1292.          cmp   al,KEY_UP       ; Cursor nach oben ??
  1293.          jnz   getw160
  1294.  
  1295.          stc
  1296.          call  getw900
  1297.  
  1298.          cmp   getwin_akt,0    ; Bereits oben ?
  1299.          jz    getw150
  1300.  
  1301.          dec   getwin_akt
  1302.  
  1303. getw142: clc
  1304.          call  getw900
  1305.          jmp   short getw100
  1306.  
  1307. getw150: mov   al,getwin_rows
  1308.          dec   al
  1309.          mov   getwin_akt,al
  1310.          jmp   short getw142
  1311.  
  1312. getw160: cmp   al,KEY_DOWN     ; Cursor nach unten ??
  1313.          jnz   getw180
  1314.  
  1315.          stc
  1316.          call  getw900
  1317.          mov   al,getwin_akt
  1318.          inc   al
  1319.          cmp   al,getwin_rows
  1320.          jb    getw170
  1321.  
  1322.          mov   al,0
  1323.  
  1324. getw170: mov   getwin_akt,al
  1325.          jmp   short getw142
  1326.  
  1327. getw180: cmp   al,KEY_HOME
  1328.          jnz   getw200
  1329.  
  1330.          stc
  1331.          call  getw900
  1332.          mov   getwin_akt,0
  1333.          jmp   short getw142
  1334.  
  1335. getw200: cmp   al,KEY_END
  1336.          jnz   getw100
  1337.  
  1338.          stc
  1339.          call  getw900
  1340.          mov   al,getwin_rows
  1341.          dec   al
  1342.          mov   getwin_akt,al
  1343.          jmp   short getw142
  1344.  
  1345. ; -------
  1346. ; getw900 - Aktuelle Zeile darstellen (invertiert = aktuell)
  1347.  
  1348. getw900: push  bx
  1349.          pushf
  1350.          mov   al,getwin_akt
  1351.          mov   ah,160
  1352.          mul   ah
  1353.          add   ax,getwin_xy
  1354.          mov   di,ax
  1355.  
  1356.          mov   cl,getwin_cols
  1357.          mov   ch,0
  1358.  
  1359.          mov   al,win_makt
  1360.          popf
  1361.          jnb   getw920
  1362.  
  1363. getw910: mov   al,win_mcolor1
  1364.          inc   di
  1365.          stosb
  1366.          mov   al,win_mcolor2
  1367.          mov   bl,getwin_cols
  1368.          dec   cx
  1369.  
  1370. getw920: inc   di
  1371.          stosb
  1372.          loop  getw920
  1373.          pop   bx
  1374.          ret
  1375.  
  1376. ; ----
  1377. ; para
  1378.  
  1379. para   : lea   si,win_mpara
  1380.          lodsw
  1381.          add   al,2
  1382.          add   ah,2
  1383.          mov   bl,menu_akt
  1384.          mov   bh,0
  1385.          shl   bx,1
  1386.          mov   di,menu_addr[bx]
  1387.          add   di,160
  1388.          call  openwin
  1389.          lea   bx,procs_para
  1390.          lea   si,win_mpara
  1391.          jmp   getwin
  1392.  
  1393. ; ----
  1394. ; common
  1395.  
  1396. common : lea   si,win_mcommon
  1397.          lodsw
  1398.          add   al,2
  1399.          add   ah,2
  1400.          mov   bl,menu_akt
  1401.          mov   bh,0
  1402.          shl   bx,1
  1403.          mov   di,menu_addr[bx]
  1404.          add   di,160
  1405.          call  openwin
  1406.          lea   bx,procs_common
  1407.  
  1408.          lea   si,win_mcommon
  1409.          jmp   getwin
  1410.  
  1411. ; ----
  1412. ; vector
  1413.  
  1414. vector : lea   si,win_mvector
  1415.          lodsw
  1416.          add   al,2
  1417.          add   ah,2
  1418.          mov   bl,menu_akt
  1419.          mov   bh,0
  1420.          shl   bx,1
  1421.          mov   di,menu_addr[bx]
  1422.          add   di,160
  1423.          call  openwin
  1424.          lea   bx,procs_vector
  1425.  
  1426.          lea   si,win_mvector
  1427.          jmp   getwin
  1428.  
  1429. ; ----
  1430. ; tone
  1431.  
  1432. tone   : lea   si,win_mtone
  1433.          lodsw
  1434.          add   al,2
  1435.          add   ah,2
  1436.          mov   bl,menu_akt
  1437.          mov   bh,0
  1438.          shl   bx,1
  1439.          mov   di,menu_addr[bx]
  1440.          add   di,160
  1441.          call  openwin
  1442.          lea   bx,procs_tone
  1443.  
  1444.          lea   si,win_mtone
  1445.          jmp   getwin
  1446.  
  1447. ; ----
  1448. ; envelop
  1449.  
  1450. envelop: lea   si,win_menvelope
  1451.          lodsw
  1452.          add   al,2
  1453.          add   ah,2
  1454.          mov   bl,menu_akt
  1455.          mov   bh,0
  1456.          shl   bx,1
  1457.          mov   di,menu_addr[bx]
  1458.          add   di,160
  1459.          call  openwin
  1460.          lea   bx,procs_envelop
  1461.  
  1462.          lea   si,win_menvelope
  1463.          jmp   getwin
  1464.  
  1465. ; ----
  1466. ; multi
  1467.  
  1468. multi  : lea   si,win_mmulti
  1469.          lodsw
  1470.          add   al,2
  1471.          add   ah,2
  1472.          mov   bl,menu_akt
  1473.          mov   bh,0
  1474.          shl   bx,1
  1475.          mov   di,menu_addr[bx]
  1476.          add   di,160
  1477.          call  openwin
  1478.          lea   bx,procs_multi
  1479.  
  1480.          lea   si,win_mmulti
  1481.          jmp   getwin
  1482.  
  1483. ; ----
  1484. ; system
  1485.  
  1486. system : lea   si,win_msystem
  1487.          lodsw
  1488.          add   al,2
  1489.          add   ah,2
  1490.          mov   bl,menu_akt
  1491.          mov   bh,0
  1492.          shl   bx,1
  1493.          mov   di,menu_addr[bx]
  1494.          add   di,160
  1495.          call  openwin
  1496.          lea   bx,procs_system
  1497.  
  1498.          lea   si,win_msystem
  1499.          jmp   getwin
  1500.  
  1501. ; ----
  1502. ; midi
  1503.  
  1504. midi   : lea   si,win_mmidi
  1505.          lodsw
  1506.          add   al,2
  1507.          add   ah,2
  1508.          mov   bl,menu_akt
  1509.          mov   bh,0
  1510.          shl   bx,1
  1511.          mov   di,menu_addr[bx]
  1512.          add   di,160
  1513.          call  openwin
  1514.          lea   bx,procs_midi
  1515.  
  1516.          lea   si,win_mmidi
  1517.          jmp   getwin
  1518.  
  1519. ; ----
  1520. ; remote
  1521.  
  1522. remote : lea   si,win_mremote
  1523.          lodsw
  1524.          add   al,2
  1525.          add   ah,2
  1526.          mov   bl,menu_akt
  1527.          mov   bh,0
  1528.          shl   bx,1
  1529.          mov   di,menu_addr[bx]
  1530.          add   di,160
  1531.          call  openwin
  1532.          lea   bx,procs_remote
  1533.  
  1534.          lea   si,win_mremote
  1535.          jmp   getwin
  1536.  
  1537. ; -------
  1538. ; rem_val - Remote Control Value
  1539.  
  1540. remote_exclusive   db  0f0h,43h,10h,26h,7,0,0f7h
  1541. remote_ex_values   db  0,2,3,4,5,6,7,8,9,10,11,12,13,21,29,30,33,34,37
  1542.  
  1543. rem_val: push  bx
  1544.          push  si
  1545.          push  di
  1546.          mov   bx,ax
  1547.          mov   al,remote_ex_values[bx]
  1548.          mov   remote_exclusive + 5,al
  1549.          lea   si,remote_exclusive
  1550.          call  send_ex
  1551.          pop   di
  1552.          pop   si
  1553.          pop   bx
  1554.          ret
  1555.  
  1556. ; ----
  1557. ; main
  1558.  
  1559. main   : mov   al,0
  1560.          call  setmenu
  1561.  
  1562. main100: mov   menu_flag,0
  1563.          call  taste
  1564.          or    al,al
  1565.          jz    main200         ; Sondertaste !
  1566.  
  1567.          cmp   al,13           ; Wählt Fenster aus !
  1568.          jnz   main180
  1569.  
  1570. main120: mov   bl,menu_akt
  1571.          mov   bh,0
  1572.          shl   bx,1
  1573.          call  menu_procs[bx]
  1574.          mov   menu_flag,0
  1575.          cmp   al,27
  1576.          jz    main180
  1577.  
  1578.          mov   menu_flag,1
  1579.  
  1580.          cmp   al,KEY_LEFT
  1581.          jz    main_le
  1582.  
  1583.          cmp   al,KEY_RIGHT
  1584.          jz    main_ri
  1585.  
  1586. main180: jmp   short main100
  1587.  
  1588. ; -----------
  1589. ; Sondertaste
  1590.  
  1591. main200: cmp   ah,KEY_F2       ; F2 beendet !
  1592.          jnz   main220
  1593.          ret
  1594.  
  1595. main220: cmp   ah,KEY_LEFT     ; Cursor links
  1596.          jnz   main240
  1597.  
  1598. main_le: mov   al,1
  1599.          call  setmenu
  1600.          dec   menu_akt
  1601.          jns   main230
  1602.          mov   al,menu_count
  1603.          dec   al
  1604.          mov   menu_akt,al
  1605.  
  1606. main230: mov   al,0
  1607.          call  setmenu
  1608.          cmp   menu_flag,0
  1609.          jnz   main120
  1610.          jmp   main100
  1611.  
  1612. main240: cmp   ah,KEY_RIGHT    ; Cursor rechts
  1613.          jnz   main260
  1614.  
  1615. main_ri: mov   al,1
  1616.          call  setmenu
  1617.          mov   al,menu_akt
  1618.          inc   al
  1619.          cmp   al,menu_count
  1620.          jb    main250
  1621.          mov   al,0
  1622.  
  1623. main250: mov   menu_akt,al
  1624.          jmp   short main230
  1625.  
  1626. main260: cmp   ah,KEY_DOWN
  1627.          jnz   main280
  1628.          jmp   main120
  1629.  
  1630. main280: jmp   main100
  1631.  
  1632. ; ------
  1633. ; scrend
  1634.  
  1635. scrend : push  ds
  1636.          push  es
  1637.          mov   ax,cs
  1638.          add   ax,1000h
  1639.          mov   ds,ax
  1640.          xor   si,si
  1641.          mov   es,cs:win_segment
  1642.          xor   di,di
  1643.          mov   cx,2000
  1644.          rep   movsw
  1645.          lodsw
  1646.          mov   cx,ax
  1647.          mov   ah,1
  1648.          xor   bx,bx
  1649.          int   10h
  1650.          lodsw
  1651.          mov   dx,ax
  1652.          mov   ah,2
  1653.          int   10h
  1654.          pop   es
  1655.          pop   ds
  1656.          ret
  1657.  
  1658. ; ------
  1659. ; Anfang
  1660.  
  1661. anfang : cld
  1662.          call  scrini
  1663.          call  main
  1664.          call  scrend
  1665.  
  1666. ende   : mov   ah,4ch
  1667.          int   21h
  1668.  
  1669. ALIGN 16
  1670.  
  1671. p_ende         label byte
  1672.  
  1673. code     ends
  1674.          end   start
  1675.