home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / hard.hdv / HARD / FORTH / FILTER.ASS < prev    next >
Encoding:
Text File  |  1992-12-20  |  22.7 KB  |  1,056 lines  |  [04] ASCII Text (0x0000)

  1.  
  2. \ FORTH OBJECTS FOR CONTROLLING PIANO DISPLAY
  3.  
  4.  
  5. 1 ARRAY PC1
  6. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
  7.  
  8. 1 ARRAY PC2
  9. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
  10.  
  11. 1 ARRAY VOLUMES
  12. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
  13.  
  14. 1 ARRAY BRILLS
  15. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
  16.  
  17.  
  18. VARIABLE MULTI     0 MULTI !
  19. VARIABLE REVERB    0 REVERB !
  20. VARIABLE EFFECT    0 EFFECT !
  21.  
  22. VARIABLE TRANSPOSE  0 TRANSPOSE !
  23.  
  24. 0 CONSTANT FALSE   \ USED AS A VERB: EX:
  25. 1 CONSTANT TRUE    \ TRUE MULTI-TIM  FALSE LOCAL
  26.  
  27. HEX
  28. 1 ARRAY HEXCHAR
  29.    B0 C, B1 C, B2 C, B3 C, B4 C, B5 C, B6 C, B7 C,
  30.    B8 C, B9 C, C1 C, C2 C, C3 C, C4 C, C5 C, C6 C,
  31.  
  32. 3 OBJECT HEXASC
  33. \ =============
  34. \ 1 = INPUT HEX BYTE
  35. \ 2 = HI BYTE ASCII OUTPUT
  36. \ 3 = LO BYTE ASCII OUTPUT
  37. BOT LDA,
  38. 1 PARM STA, INX, INX,
  39. \ ==============
  40. OBJ-CODE
  41.          1 PARM    LDA,
  42.                    .A LSR, .A LSR, .A LSR, .A LSR,
  43.                    TAX,
  44.          0 HEXCHAR ,X LDA,
  45.          2 PARM    STA,
  46.          1 PARM    LDA,
  47.          0F        # AND,
  48.                    TAX,
  49.          0 HEXCHAR ,X LDA,
  50.          3 PARM    STA,
  51. OBJ-END 
  52.  
  53.  
  54. VARIABLE DEBUG   0 DEBUG !
  55.  
  56. 1 OBJECT MIDIOUT
  57. \ ==============
  58. \ PARM 1 = MIDI BYTE
  59. BOT LDA,
  60. 1 PARM STA, INX, INX,
  61. \ ===============
  62. OBJ-CODE
  63. BEGIN,   C0A8      LDA,
  64.          2         # AND,
  65. 0= NOT UNTIL,
  66.          1 PARM    LDA,
  67.          C0A9      STA,
  68.  
  69. \ FOR DEBUGGING:
  70.          DEBUG     LDA,
  71. 0= NOT IF,
  72.          1 PARM    LDA,
  73.          FDDA      JSR,
  74. THEN,
  75. OBJ-END
  76.  
  77.  
  78. 3 OBJECT SENDBRE
  79. \ ==============
  80. \ 1=CHANNEL
  81. \ 2= INSTRUCTION
  82. \ 3= DATA
  83. BOT      LDA,
  84. 3 PARM   STA,  INX, INX,
  85. BOT      LDA,
  86. 2 PARM   STA,  INX,  INX,
  87. BOT      LDA,
  88. 1 PARM   STA,  INX,  INX,
  89. \ =========================
  90. OBJ-CODE
  91.          F0        # LDA, 
  92.          1 'PARM MIDIOUT STA,
  93.          OBJ-CALL MIDIOUT
  94.          43        # LDA, 
  95.          1 'PARM MIDIOUT STA,
  96.          OBJ-CALL MIDIOUT
  97.          73        # LDA, 
  98.          1 'PARM MIDIOUT STA,
  99.          OBJ-CALL MIDIOUT
  100.          1A        # LDA, 
  101.          1 'PARM MIDIOUT STA,
  102.          OBJ-CALL MIDIOUT
  103.          11        # LDA, 
  104.          1 'PARM MIDIOUT STA,
  105.          OBJ-CALL MIDIOUT
  106.          1 PARM    LDA,
  107.          1 'PARM MIDIOUT STA,
  108.          OBJ-CALL MIDIOUT
  109.          2 PARM    LDA,
  110.          1 'PARM MIDIOUT STA,
  111.          OBJ-CALL MIDIOUT
  112.          3 PARM    LDA,
  113.          1 'PARM MIDIOUT STA,
  114.          OBJ-CALL MIDIOUT
  115.          F7        # LDA,
  116.          1 'PARM MIDIOUT STA,
  117.          OBJ-CALL MIDIOUT
  118. OBJ-END
  119.  
  120.  
  121. 2 OBJECT PROGCHG
  122. \ =======================
  123. \ PARMS:
  124. \ 1 = CHANNEL
  125. \ 2 = PROG #
  126. BOT      LDA,
  127. 2 PARM   STA,  INX,  INX,
  128. BOT      LDA,
  129. 1 PARM   STA,  INX,  INX,
  130. \ =========================
  131. OBJ-CODE
  132. \
  133.          1 PARM    LDX,      \ SWAP PROGRAMS
  134.          0 PC1     ,X LDA,
  135.          0 PC2     ,X STA,   \ MOVE 1ST PROG TO 2ND
  136.          2 PARM    LDA,
  137.          0 PC1     ,X STA,   \ SAVE NEW 1ST PROG
  138.  
  139. \ *** DISPLAY PROGRAMS
  140.          1 PARM    LDX,
  141.          0A        # CPX,
  142. CS NOT IF,
  143.          0 PC1     ,X LDA,
  144.   1 'PARM HEXASC   STA,
  145.          OBJ-CALL  HEXASC
  146.   2 'PARM HEXASC   LDA,      \ HI NIBBLE PROG1
  147.   3 'PARM SCREEN   STA,
  148.          1 PARM    LDA,
  149.                    .A ASL,   \ CHNL <* 6
  150.                    CLC,
  151.          1 PARM    ADC,
  152.                    .A ASL,
  153.          5         # ADC,     \ CHNL <+5
  154.   1 'PARM SCREEN   STA,
  155.          1         # LDA,
  156.   2 'PARM SCREEN   STA,
  157.          POKE      LDA,
  158.   4 'PARM SCREEN   STA,
  159.          OBJ-CALL  SCREEN    \ * PRINT HI NIBBLE
  160.   1 'PARM SCREEN   LDA,
  161.                    CLC,
  162.          1         # ADC,
  163.   1 'PARM SCREEN   STA,
  164.   3 'PARM HEXASC   LDA,      \ LO NIBBLE PROG1
  165.   3 'PARM SCREEN   STA,
  166.          OBJ-CALL  SCREEN    \ * PRINT LO NIBBLE
  167.   1 'PARM SCREEN   LDA,
  168.                    CLC,
  169.          2         # ADC,
  170.   1 'PARM SCREEN   STA,      \ ADJUST XCOORD BY 2
  171.          1 PARM    LDX,
  172.          0 PC2     ,X LDA,
  173.   1 'PARM HEXASC   STA,
  174.          OBJ-CALL  HEXASC
  175.   2 'PARM HEXASC   LDA,      \ HI NIBBLE PROG2
  176.   3 'PARM SCREEN   STA,
  177.          OBJ-CALL  SCREEN
  178.   1 'PARM SCREEN   LDA,
  179.                    CLC,
  180.          1         # ADC,
  181.   1 'PARM SCREEN   STA,
  182.   3 'PARM HEXASC   LDA,      \ LO NIBBLE PROG2
  183.   3 'PARM SCREEN   STA,
  184.          OBJ-CALL  SCREEN    \ * PRINT LO NIBBLE
  185. THEN,
  186.  
  187. \ *** SEND THE MIDI INSTRUCTION
  188.          1 PARM    LDA,
  189.          C0        # ORA,
  190.   1 'PARM MIDIOUT  STA,
  191.          OBJ-CALL  MIDIOUT
  192.          2 PARM    LDA,
  193.   1 'PARM MIDIOUT  STA,
  194.          OBJ-CALL  MIDIOUT
  195. OBJ-END
  196.  
  197.  
  198. 2 OBJECT VOLCHG
  199. \ ================
  200. \ 1 = CHANNEL  2 = NEW VOLUME
  201. BOT      LDA,
  202. 2 PARM   STA,  INX,  INX,
  203. BOT      LDA,
  204. 1 PARM   STA,  INX,  INX,
  205. \ ================
  206. OBJ-CODE
  207.          1 PARM    LDX,
  208.          0A        # CPX,
  209. CS NOT IF,
  210.          2 PARM    LDA,
  211.    0 VOLUMES       ,X STA,
  212.   1 'PARM HEXASC   STA,
  213.          OBJ-CALL  HEXASC
  214.   2 'PARM HEXASC   LDA,      \ HI NIBBLE
  215.   3 'PARM SCREEN   STA,
  216.          1 PARM    LDA,
  217.                    .A ASL,   \ CHNL <* 6
  218.                    CLC,
  219.          1 PARM    ADC,
  220.                    .A ASL,
  221.          5         # ADC,     \ CHNL <+5
  222.   1 'PARM SCREEN   STA,
  223.          2         # LDA,
  224.   2 'PARM SCREEN   STA,
  225.          POKE      LDA,
  226.   4 'PARM SCREEN   STA,
  227.          OBJ-CALL  SCREEN    \ * PRINT HI NIBBLE
  228.   1 'PARM SCREEN   LDA,
  229.                    CLC,
  230.          1         # ADC,
  231.   1 'PARM SCREEN   STA,
  232.   3 'PARM HEXASC   LDA,      \ LO NIBBLE 
  233.   3 'PARM SCREEN   STA,
  234.          OBJ-CALL  SCREEN    \ * PRINT LO NIBBLE
  235. THEN,
  236.  
  237. \ *** SEND THE MIDI INSTRUCTION
  238.          1 PARM    LDA,
  239.          B0        # ORA,
  240.   1 'PARM MIDIOUT  STA,
  241.          OBJ-CALL  MIDIOUT
  242.          7 #       LDA,
  243.   1 'PARM MIDIOUT  STA,
  244.          OBJ-CALL  MIDIOUT
  245.          2 PARM    LDA,
  246.   1 'PARM MIDIOUT  STA,
  247.          OBJ-CALL  MIDIOUT
  248. OBJ-END
  249.  
  250.  
  251. 2 OBJECT BRILLCHG
  252. \ ================
  253. \ 1 = CHANNEL  2 = NEW BRILL
  254. BOT      LDA,
  255. 2 PARM   STA,  INX,  INX,
  256. BOT      LDA,
  257. 1 PARM   STA,  INX,  INX,
  258. \ ================
  259. OBJ-CODE
  260.  
  261.          1 PARM    LDX,
  262.          0A        # CPX,
  263. CS NOT IF,
  264.          2 PARM    LDA,
  265.          0 BRILLS ,X STA,
  266.   1 'PARM HEXASC   STA,
  267.          OBJ-CALL  HEXASC
  268.   2 'PARM HEXASC   LDA,      \ HI NIBBLE
  269.   3 'PARM SCREEN   STA,
  270.          1 PARM    LDA,
  271.                    .A ASL,   \ CHNL <* 6
  272.                    CLC,
  273.          1 PARM    ADC,
  274.                    .A ASL,
  275.          8         # ADC,     \ CHNL <+8
  276.   1 'PARM SCREEN   STA,
  277.          2         # LDA,
  278.   2 'PARM SCREEN   STA,
  279.          POKE      LDA,
  280.   4 'PARM SCREEN   STA,
  281.          OBJ-CALL  SCREEN    \ * PRINT HI NIBBLE
  282.   1 'PARM SCREEN   LDA,
  283.                    CLC,
  284.          1         # ADC,
  285.   1 'PARM SCREEN   STA,
  286.   3 'PARM HEXASC   LDA,      \ LO NIBBLE 
  287.   3 'PARM SCREEN   STA,
  288.          OBJ-CALL  SCREEN    \ * PRINT LO NIBBLE
  289. THEN,
  290.  
  291. \ *** SEND THE MIDI INSTRUCTION
  292.          1 PARM    LDA,
  293.          1 'PARM SENDBRE STA,
  294.          58        # LDA,
  295.          2 'PARM SENDBRE STA,
  296.          2 PARM    LDA,
  297.          3 'PARM SENDBRE STA,
  298.          OBJ-CALL SENDBRE
  299. OBJ-END
  300.  
  301.  
  302. 1 OBJECT REVERBCHG
  303. \ ================
  304. BOT      LDA,
  305. 1 PARM   STA,  INX,  INX,
  306. \ ================
  307. OBJ-CODE
  308.          1 PARM LDA,
  309.          REVERB STA,
  310.          1 'PARM HEXASC STA,
  311.          OBJ-CALL HEXASC
  312.          3 'PARM HEXASC LDA,
  313.          3 'PARM SCREEN STA,
  314.          1 # LDA,
  315.          1 'PARM SCREEN STA,
  316.          5 # LDA,
  317.          2 'PARM SCREEN STA,
  318.          POKE # LDA,
  319.          4 'PARM SCREEN STA,
  320.          OBJ-CALL SCREEN
  321.  
  322. \ *** SEND THE MIDI INSTRUCTION
  323.          0 #       LDA,
  324.          1 'PARM SENDBRE STA,
  325.          59        # LDA,
  326.          2 'PARM SENDBRE STA,
  327.          1 PARM    LDA,
  328.          3 'PARM SENDBRE STA,
  329.          OBJ-CALL SENDBRE
  330.  
  331. OBJ-END
  332.  
  333. 1 OBJECT EFFECTCHG
  334. \ ================
  335. BOT      LDA,
  336. 1 PARM   STA,  INX,  INX,
  337. \ ================
  338. OBJ-CODE
  339.          1 PARM LDA,
  340.          EFFECT STA,
  341.          1 'PARM HEXASC STA,
  342.          OBJ-CALL HEXASC
  343.          3 'PARM HEXASC LDA,
  344.          3 'PARM SCREEN STA,
  345.          2 # LDA,
  346.          1 'PARM SCREEN STA,
  347.          5 # LDA,
  348.          2 'PARM SCREEN STA,
  349.          POKE # LDA,
  350.          4 'PARM SCREEN STA,
  351.          OBJ-CALL SCREEN
  352.  
  353. \ *** SEND THE MIDI INSTRUCTION
  354.          0 #       LDA,
  355.          1 'PARM SENDBRE STA,
  356.          5A        # LDA,
  357.          2 'PARM SENDBRE STA,
  358.          1 PARM    LDA,
  359.          3 'PARM SENDBRE STA,
  360.          OBJ-CALL SENDBRE
  361.  
  362. OBJ-END
  363.  
  364. 1 OBJECT MULTITIM
  365. \ ================
  366. BOT      LDA,
  367. 1 PARM   STA,  INX,  INX,
  368. \ ================
  369. OBJ-CODE
  370.          1 PARM LDA,
  371.          MULTI STA,
  372.          1 'PARM HEXASC STA,
  373.          OBJ-CALL HEXASC
  374.          3 'PARM HEXASC LDA,
  375.          3 'PARM SCREEN STA,
  376.          0 # LDA,
  377.          1 'PARM SCREEN STA,
  378.          5 # LDA,
  379.          2 'PARM SCREEN STA,
  380.          POKE # LDA,
  381.          4 'PARM SCREEN STA,
  382.          OBJ-CALL SCREEN
  383.  
  384.         
  385.          F0        # LDA, 
  386.          1 'PARM MIDIOUT STA,
  387.          OBJ-CALL MIDIOUT
  388.          43        # LDA, 
  389.          1 'PARM MIDIOUT STA,
  390.          OBJ-CALL MIDIOUT
  391.          73        # LDA, 
  392.          1 'PARM MIDIOUT STA,
  393.          OBJ-CALL MIDIOUT
  394.          1A        # LDA, 
  395.          1 'PARM MIDIOUT STA,
  396.          OBJ-CALL MIDIOUT
  397.          1 PARM    LDA,
  398.                    .A ASL,
  399.                    CLC,
  400.          13 #      ADC, 
  401.          1 'PARM MIDIOUT STA,
  402.          OBJ-CALL MIDIOUT 
  403.          F7        # LDA, 
  404.          1 'PARM MIDIOUT STA,
  405.          OBJ-CALL MIDIOUT
  406. OBJ-END
  407.  
  408. 2 OBJECT DAMPER
  409. \ ================
  410. \ 1 = CHNL 2 = DAMP VALUE
  411. BOT      LDA,
  412. 2 PARM   STA,  INX,  INX,
  413. BOT      LDA,
  414. 1 PARM   STA,  INX,  INX,
  415. \ ================
  416. OBJ-CODE
  417.          2 PARM LDA,
  418.          1 'PARM HEXASC STA,
  419.          OBJ-CALL HEXASC
  420.          2 'PARM HEXASC LDA,
  421.          3 'PARM SCREEN STA,
  422.          2 # LDA,
  423.          1 'PARM SCREEN STA,
  424.          6 # LDA,
  425.          2 'PARM SCREEN STA,
  426.          POKE # LDA,
  427.          4 'PARM SCREEN STA,
  428.          OBJ-CALL SCREEN
  429.  
  430.          1 PARM    LDA,
  431.          B0 #      ORA,
  432.          1 'PARM MIDIOUT STA,
  433.          OBJ-CALL MIDIOUT
  434.          40 #      LDA,
  435.          1 'PARM MIDIOUT STA,
  436.          OBJ-CALL MIDIOUT
  437.          2 PARM    LDA,
  438.          1 'PARM MIDIOUT STA,
  439.          OBJ-CALL MIDIOUT
  440.  
  441. OBJ-END
  442.  
  443. 2 OBJECT SOSTENUTO
  444. \ ================
  445. \ 1 = CHNL 2 = SWITCH
  446. BOT      LDA,
  447. 2 PARM   STA,  INX,  INX,
  448. BOT      LDA,
  449. 1 PARM   STA,  INX,  INX,
  450. \ ================
  451. OBJ-CODE
  452.          2 PARM LDA,
  453.          1 'PARM HEXASC STA,
  454.          OBJ-CALL HEXASC
  455.          2 'PARM HEXASC LDA,
  456.          3 'PARM SCREEN STA,
  457.          1 # LDA,
  458.          1 'PARM SCREEN STA,
  459.          6 # LDA,
  460.          2 'PARM SCREEN STA,
  461.          POKE # LDA,
  462.          4 'PARM SCREEN STA,
  463.          OBJ-CALL SCREEN
  464.  
  465.          1 PARM    LDA,
  466.          B0 #      ORA,
  467.          1 'PARM MIDIOUT STA,
  468.          OBJ-CALL MIDIOUT
  469.          42 #      LDA,
  470.          1 'PARM MIDIOUT STA,
  471.          OBJ-CALL MIDIOUT
  472.          2 PARM    LDA,
  473.          1 'PARM MIDIOUT STA,
  474.          OBJ-CALL MIDIOUT
  475.  
  476. OBJ-END
  477.  
  478.  
  479. 2 OBJECT SOFTPEDAL
  480. \ ================
  481. \ 1 = CHNL 2 = SWITCH
  482. BOT      LDA,
  483. 2 PARM   STA,  INX,  INX,
  484. BOT      LDA,
  485. 1 PARM   STA,  INX,  INX,
  486. \ ================
  487. OBJ-CODE
  488.          2 PARM LDA,
  489.          1 'PARM HEXASC STA,
  490.          OBJ-CALL HEXASC
  491.          2 'PARM HEXASC LDA,
  492.          3 'PARM SCREEN STA,
  493.          0 # LDA,
  494.          1 'PARM SCREEN STA,
  495.          6 # LDA,
  496.          2 'PARM SCREEN STA,
  497.          POKE # LDA,
  498.          4 'PARM SCREEN STA,
  499.          OBJ-CALL SCREEN
  500.  
  501.          1 PARM    LDA,
  502.          B0 #      ORA,
  503.          1 'PARM MIDIOUT STA,
  504.          OBJ-CALL MIDIOUT
  505.          43 #      LDA,
  506.          1 'PARM MIDIOUT STA,
  507.          OBJ-CALL MIDIOUT
  508.          2 PARM    LDA,
  509.          1 'PARM MIDIOUT STA,
  510.          OBJ-CALL MIDIOUT
  511.  
  512. OBJ-END
  513.  
  514. 3 OBJECT OTHER-CTL
  515. \ ================
  516. \ 1 = CHANNEL
  517. \ 2 = CTRL # 
  518. \ 3 = NEW VALUE
  519. BOT      LDA,               
  520. 3 PARM   STA,  INX,  INX,
  521. BOT      LDA,                
  522. 2 PARM   STA,  INX,  INX,
  523. BOT      LDA,
  524. 1 PARM   STA,  INX,  INX,
  525. \ ================
  526. OBJ-CODE
  527.          1 PARM    LDA,
  528.          B0 #      ORA,
  529.          1 'PARM MIDIOUT STA,
  530.          OBJ-CALL MIDIOUT
  531.          2 PARM    LDA,
  532.          1 'PARM MIDIOUT STA,
  533.          OBJ-CALL MIDIOUT
  534.          3 PARM    LDA,
  535.          1 'PARM MIDIOUT STA,
  536.          OBJ-CALL MIDIOUT
  537. OBJ-END
  538.  
  539. 1 OBJECT LOCAL
  540. \ =============
  541. BOT      LDA,
  542. 1 PARM   STA,  INX,  INX,
  543. \ ================
  544. OBJ-CODE
  545.          B0 #      LDA,
  546.          1 'PARM MIDIOUT STA,
  547.          OBJ-CALL MIDIOUT
  548.          7A #      LDA,
  549.          1 'PARM MIDIOUT STA,
  550.          OBJ-CALL MIDIOUT
  551.          1 PARM    LDA,
  552.          1 'PARM MIDIOUT STA,
  553.          OBJ-CALL MIDIOUT
  554. OBJ-END
  555.  
  556.  
  557. 2 OBJECT NOTEOFF
  558. \ =======================
  559. \ PARMS:
  560. \ 1 = CHANNEL
  561. \ 2 = NOTE #
  562. BOT      LDA,
  563. 2 PARM   STA,  INX,  INX,
  564. BOT      LDA,
  565. 1 PARM   STA,  INX,  INX,
  566. \ =========================
  567. OBJ-CODE
  568.  
  569. \ *** DISPLAY THE ORIGINAL CHARACTER ON THE PIANO
  570. \
  571.          2 PARM    LDA,
  572.                    CLC,   \ TRANSPOSE IT
  573.     ' TRANSPOSE    ADC,
  574.          2 PARM    STA,
  575.         
  576.  1 'PARM (PIANOXY) STA,      \ NOTE #
  577.          OBJ-CALL  (PIANOXY)
  578.  2 'PARM (PIANOXY) LDA,      \ X COORD
  579.  1 'PARM SCREEN    STA,
  580.  3 'PARM (PIANOXY) LDA,      \ Y COORD
  581.  2 'PARM SCREEN    STA,
  582.          2 PARM    LDA,
  583.                    TAX,
  584.          0 PICSAVE ,X LDA,
  585.  3 'PARM SCREEN    STA,      \ CHAR
  586.          POKE      # LDA,
  587.  4 'PARM SCREEN    STA,      \ POKE
  588.          OBJ-CALL  SCREEN
  589.  
  590. \ *** SEND THE INSTRUCTION
  591. \
  592.          1 PARM    LDA,
  593.          90        # ORA,
  594.   1 'PARM MIDIOUT  STA,
  595.          OBJ-CALL  MIDIOUT
  596.          2 PARM    LDA,
  597.   1 'PARM MIDIOUT  STA,
  598.          OBJ-CALL  MIDIOUT
  599.          0         # LDA,
  600.   1 'PARM MIDIOUT  STA,
  601.          OBJ-CALL  MIDIOUT
  602.  
  603. OBJ-END
  604.  
  605.  
  606.  
  607. 3 OBJECT NOTEON
  608. \ =======================
  609. \ PARMS:
  610. \ 1 = CHANNEL
  611. \ 2 = NOTE #
  612. \ 3 = VELOCITY
  613. BOT      LDA,
  614. 3 PARM   STA,  INX,  INX,
  615. BOT      LDA,
  616. 2 PARM   STA,  INX,  INX,
  617. BOT      LDA,
  618. 1 PARM   STA,  INX,  INX,
  619. \ =========================
  620. OBJ-CODE
  621. \
  622. \ *** DISPLAY THE CHANNEL ON THE PIANO
  623.  
  624.          2 PARM    LDA,
  625.                    CLC,   \ TRANSPOSE IT
  626.     ' TRANSPOSE    ADC,
  627.          2 PARM    STA,
  628.  
  629.  1 'PARM (PIANOXY) STA,      \ NOTE #
  630.          OBJ-CALL  (PIANOXY)
  631.  2 'PARM (PIANOXY) LDA,      \ X COORD
  632.  1 'PARM SCREEN    STA,
  633.  3 'PARM (PIANOXY) LDA,      \ Y COORD
  634.  2 'PARM SCREEN    STA,
  635.  
  636.          1 PARM    LDA,
  637. 0= IF,
  638.          5D        # LDA,      \ USE MARKER FOR CHNL 0
  639. ELSE,
  640.          0A        # CMP,
  641.   CS IF,
  642.                    CLC,
  643.          B7        # ADC,    \ ALPHA CHAR FOR A-F
  644.   ELSE,
  645.                    CLC,
  646.          B0        # ADC,    \ 0-9
  647.   THEN,
  648. THEN,
  649.  
  650.   3 'PARM SCREEN   STA,
  651.          POKE      # LDA,
  652.   4 'PARM SCREEN   STA,
  653.          OBJ-CALL  SCREEN
  654.  
  655.  
  656. \ *** SEND THE INSTRUCTION
  657. \
  658.          1 PARM    LDA,
  659.          90        # ORA,
  660.   1 'PARM MIDIOUT  STA,
  661.          OBJ-CALL  MIDIOUT
  662.          2 PARM    LDA,
  663.   1 'PARM MIDIOUT  STA,
  664.          OBJ-CALL  MIDIOUT
  665.          3 PARM    LDA,
  666.   1 'PARM MIDIOUT  STA,
  667.          OBJ-CALL  MIDIOUT
  668.  
  669. OBJ-END
  670.  
  671.  
  672.  
  673.  
  674.  
  675. 8 OBJECT FILTER
  676. \ ==================
  677. \ PARMS:
  678. \ 1 = CURRENT MIDI DATA BYTE (INPUT)
  679. \ WORK AREA:
  680. \ 2 = CURRENT CHANNEL
  681. \ 3 = CURRENT STATUS BYTE
  682. \ 4 = PHASE
  683. \ 5 = SYSEX COUNTER
  684. \ 6 = 1ST DATA BYTE
  685. \ 7 = 2ND DATA BYTE
  686. \ 8 = SYSEX FLAG
  687. \ ==================
  688. \ FORTH INTERFACE
  689. BOT      LDA,
  690. 1 PARM   STA,  INX,  INX,
  691. \ ==================
  692. OBJ-CODE
  693.          1 PARM    LDA,
  694. 0< IF,                       \ IF HI BIT IS SET
  695.  
  696.          1 PARM    LDA,
  697.          F0        # AND,
  698.          F0        # CMP,
  699.   CS NOT IF,                      \ FOR $80..$EF
  700.          1 PARM    LDA,
  701.          3 PARM    STA,      \ SAVE STATUS BYTE
  702.          0F        # AND,    \ ISOLATE CHANNEL
  703.          2 PARM    STA,
  704.   ELSE,                      \ SYSEX, COMMON, REALTIME, OR META
  705.          1 PARM    LDA,
  706.          F8        # CMP,
  707.     CS IF,
  708.          OBJ-EXIT            \ SKIP REALTIME MESSAGES
  709.     THEN,
  710.  
  711.          F0        # CMP,
  712.     0= IF,
  713.          F1        # LDA,
  714.          4 PARM    STA,      \ PHASE = F1 (SYSEX IN PROGRESS)
  715.          0         # LDA,
  716.          5 PARM    STA,      \ INIT SYSEX CTR TO 0
  717.          8 PARM    STA,      \ & SYSEX ERROR FLAG TO 0
  718.          OBJ-EXIT
  719.     THEN,
  720.          F7        # CMP,
  721.     0= IF,
  722.          F7        # LDA,
  723.          4 PARM    STA,      \ PHASE = F7 (END OF SYSEX)
  724.          OBJ-EXIT
  725.     THEN,
  726.          F2        # CMP,
  727.     0= IF,
  728.          F2        # LDA,
  729.          4 PARM    STA,      \ PHASE F2 = IGNORE NEXT 2 BYTES
  730.          OBJ-EXIT
  731.     THEN,
  732.          F3        # CMP,
  733.     0= IF,
  734.          F3        # LDA,
  735.          4 PARM    STA,      \ PHASE F3 = IGNORE NEXT BYTE
  736.          OBJ-EXIT
  737.     THEN,
  738.          OBJ-EXIT
  739.     \ ANY OTHER F- MESSAGE WILL BE IGNORED
  740.  
  741.   THEN,
  742.          1 PARM    LDA,      \ 80-E0: SET PHASE TO HI NIBBLE+1
  743.          F0        # AND,
  744.          01        # ORA,
  745.          4 PARM    STA,
  746.          OBJ-EXIT
  747.  
  748.  
  749. ELSE, \ HI BIT WASN'T SET- USE PHASE
  750.  
  751.          4 PARM    LDA,
  752.          91        # CMP,              \ *** PHASE 91 ***
  753. 0= IF,
  754.          1 PARM    LDA,   \ GET NOTE #
  755.          6 PARM    STA,      
  756.          92        # LDA,
  757.          4 PARM    STA,      \ CHG PHASE TO 92
  758.          OBJ-EXIT
  759. THEN,
  760.          92        # CMP,              \ *** PHASE 92 ***
  761. 0= IF,
  762.          1 PARM    LDA,
  763.          7 PARM    STA,      \ SAVE VELOCITY
  764.          91        # LDA,
  765.          4 PARM    STA,     \ PHASE << 91
  766.          
  767.          7 PARM    LDA,
  768.   0= IF,                     \ CALL NOTEOFF
  769.          2 PARM    LDA,
  770.    1 'PARM NOTEOFF STA,
  771.          6 PARM    LDA,
  772.    2 'PARM NOTEOFF STA,
  773.          OBJ-CALL  NOTEOFF
  774.          OBJ-EXIT
  775.   ELSE,                      \ CALL NOTEON     
  776.          2 PARM    LDA,
  777.    1 'PARM NOTEON  STA,
  778.          6 PARM    LDA,
  779.    2 'PARM NOTEON  STA,
  780.          7 PARM    LDA,
  781.    3 'PARM NOTEON  STA,
  782.          OBJ-CALL  NOTEON
  783.          OBJ-EXIT
  784.   THEN,
  785.  
  786. THEN,
  787.  
  788.          81        # CMP,              \ *** PHASE 81 ***
  789. 0= IF,
  790.          1 PARM    LDA,   \ GET NOTE #
  791.          6 PARM    STA,      
  792.          82        # LDA,
  793.          4 PARM    STA,      \ CHG PHASE TO 82
  794.          OBJ-EXIT
  795. THEN,
  796.  
  797.          82        # CMP,              \ *** PHASE 82 ***
  798. 0= IF,
  799.          81        # LDA,
  800.          4 PARM    STA,     \ PHASE << 81
  801.          2 PARM    LDA,      \ CALL NOTEOFF
  802.    1 'PARM NOTEOFF STA,
  803.          6 PARM    LDA,
  804.    2 'PARM NOTEOFF STA,
  805.          OBJ-CALL  NOTEOFF
  806.          OBJ-EXIT
  807. THEN,
  808.  
  809.          C1        # CMP,     \ *** PHASE C1 *** 
  810. 0= IF,
  811.          2 PARM    LDX,      \ GET CHANNEL
  812.   1 'PARM PROGCHG  STX,
  813.          1 PARM    LDA,
  814.   2 'PARM PROGCHG  STA,
  815.          OBJ-CALL  PROGCHG
  816.          OBJ-EXIT
  817. THEN,
  818.  
  819.  
  820.          B1        # CMP,              \ *** PHASE B1 ***
  821. 0= IF,
  822.          1 PARM    LDA,   \ GET NOTE #
  823.          6 PARM    STA,      
  824.          B2        # LDA,
  825.          4 PARM    STA,      \ CHG PHASE TO B2
  826.          OBJ-EXIT
  827. THEN,
  828.  
  829.          B2        # CMP,              \ *** PHASE B2 ***
  830. 0= IF,
  831.          B1        # LDA,
  832.          4 PARM    STA,     \ PHASE << B1
  833.          6 PARM    LDA,
  834.          7         # CMP,
  835.   0= IF,
  836.          2 PARM    LDA,
  837.    1 'PARM VOLCHG  STA,
  838.          1 PARM    LDA,
  839.    2 'PARM VOLCHG  STA,
  840.          OBJ-CALL  VOLCHG
  841.          OBJ-EXIT
  842.   THEN,
  843.          40 # CMP,
  844.   0= IF,
  845.          2 PARM    LDA,
  846.    1 'PARM DAMPER  STA,  
  847.          1 PARM    LDA,
  848.    2 'PARM DAMPER  STA,
  849.          OBJ-CALL  DAMPER
  850.          OBJ-EXIT
  851.   THEN,
  852.          42 # CMP,
  853.   0= IF,
  854.          2 PARM    LDA,
  855.    1 'PARM SOSTENUTO  STA,  
  856.          1 PARM    LDA,
  857.    2 'PARM SOSTENUTO  STA,
  858.          OBJ-CALL  SOSTENUTO
  859.          OBJ-EXIT
  860.   THEN,
  861.          43 # CMP,
  862.   0= IF,  
  863.          2 PARM    LDA,
  864.    1 'PARM SOFTPEDAL  STA,
  865.          1 PARM    LDA,
  866.    2 'PARM SOFTPEDAL  STA,
  867.          OBJ-CALL  SOFTPEDAL
  868.          OBJ-EXIT
  869.   THEN,
  870.          7A # CMP,
  871.   0= IF,  
  872.          1 PARM    LDA,
  873.    1 'PARM LOCAL   STA,
  874.          OBJ-CALL  LOCAL
  875.          OBJ-EXIT
  876.   THEN,
  877.     \ ANY OTHER CONTROL CHANGE:
  878.          2 PARM    LDA,
  879.          1 'PARM OTHER-CTL STA, 
  880.          6 PARM    LDA,
  881.          2 'PARM OTHER-CTL STA,
  882.          1 PARM    LDA,
  883.          3 'PARM OTHER-CTL STA,
  884.          OBJ-CALL OTHER-CTL
  885.          OBJ-EXIT
  886. THEN,
  887.  
  888. \ THE FOLLOWING MESSAGES ARE NOT IMPLEMENTED YET
  889. \ THEY WILL BE IGNORED.
  890.  
  891.          A1        # CMP,
  892. 0= IF,
  893.          A2        # LDA,
  894.          4 PARM    STA,      \ SET PHASE TO A2
  895.          OBJ-EXIT
  896. THEN,
  897.  
  898.          D1        # CMP,
  899. 0= IF,
  900.          OBJ-EXIT
  901. THEN,
  902.  
  903.          E1        # CMP,
  904. 0= IF,
  905.          E2        # LDA,
  906.          4 PARM    STA,      \ SET PHASE TO E2
  907.          OBJ-EXIT
  908. THEN,
  909.  
  910.  
  911.          F2        # CMP,
  912. 0= IF,                       \ *** PHASE F2- IGNORE 
  913.          F3        # LDA,
  914.          4 PARM    STA,      \ SET PHASE TO F3
  915.          OBJ-EXIT
  916. THEN,
  917.  
  918. \ ***** SYSEX HANDLER *****
  919.  
  920.          F1        # CMP,    \ *** PHASE F1- SYSEX IN PROGRESS
  921. 0= IF,
  922.          5 PARM    INC,      \ INC SYSEX CTR
  923.          5 PARM    LDA,
  924.  
  925.          1         # CMP,    \ 1ST SYSEX BYTE S/B 43 
  926.   0= IF,
  927.          1 PARM    LDA,
  928.          43        # CMP,
  929.     0= NOT IF,
  930.          1         # LDA,
  931.          8 PARM    STA,      \ SYSEX ERROR FLAG
  932.          OBJ-EXIT
  933.     THEN,
  934.   THEN,
  935.          2         # CMP,    \ 2ND SYSEX BYTE S/B 73 
  936.   0= IF,
  937.          1 PARM    LDA,
  938.          73        # CMP,
  939.     0= NOT IF,
  940.          1         # LDA,
  941.          8 PARM    STA,      \ SYSEX ERROR FLAG
  942.          OBJ-EXIT
  943.     THEN,
  944.   THEN,  
  945.          3         # CMP,    \ 3RD SYSEX BYTE S/B 01,1A OR 1B 
  946.   0= IF,
  947.          1 PARM    LDA,
  948.          01        # CMP,
  949.     0= IF,
  950.     ELSE,
  951.          1A        # CMP,
  952.       0= IF,
  953.       ELSE,
  954.          1B        # CMP,
  955.         0= IF,
  956.         ELSE,
  957.          1         # LDA,
  958.          8 PARM    STA,      \ SYSEX ERROR FLAG
  959.          OBJ-EXIT
  960.         THEN,
  961.       THEN,
  962.     THEN,
  963.   THEN,  
  964.   
  965.          4         # CMP,    \ 4TH BYTE OF SYSEX MSG FOR CLAV
  966.   0= IF,
  967.          8 PARM    LDA,      \ CHECK ERROR FLAG
  968.     0= IF,                   \ IF OK:
  969.          1 PARM    LDA,
  970.          13        # CMP,
  971.       0= IF,                 \ MULTI TIM OFF
  972.          0         # LDA,
  973.          1 'PARM MULTITIM STA,
  974.          OBJ-CALL  MULTITIM
  975.          OBJ-EXIT
  976.       THEN,
  977.          15        # CMP,    \ MULTI TIM ON
  978.       0= IF,
  979.          1         # LDA,
  980.          1 'PARM MULTITIM STA,
  981.          OBJ-CALL  MULTITIM
  982.          OBJ-EXIT
  983.       THEN,
  984.          11        # CMP,    \ BRILL REVERB EFFECT
  985.       0= IF,
  986.       ELSE,
  987.          1         # LDA,
  988.          8 PARM    STA,      \ ERROR IF NONE OF ABOVE
  989.          OBJ-EXIT
  990.       THEN,
  991.     THEN,
  992.   THEN,
  993.  
  994.          5 # CMP,
  995.   0= IF,
  996.          1 PARM LDA,
  997.          2 PARM STA,         \ SAVE CHANNEL
  998.          OBJ-EXIT
  999.   THEN,
  1000.          6 # CMP,
  1001.   0= IF,
  1002.          1 PARM LDA,
  1003.          58 # CMP,
  1004.     CS IF,
  1005.          5B # CMP,
  1006.       CS NOT IF,
  1007.          6 PARM STA,         \ SAVE BRE CMD
  1008.       ELSE,
  1009.          1         # LDA,
  1010.          8 PARM    STA,      \ ELSE ERROR 
  1011.       THEN,
  1012.     THEN,
  1013.   THEN,
  1014.  
  1015.          7 # CMP,
  1016.   0= IF,
  1017.          8 PARM LDA,         \ IF NO ERRORS
  1018.     0= IF,
  1019.          6 PARM LDA,         \ CHECK CMD
  1020.  
  1021.          58 # CMP,           \ BRILLIANCE
  1022.       0= IF,
  1023.          2 PARM LDA,
  1024.          1 'PARM BRILLCHG STA,
  1025.          1 PARM LDA,
  1026.          2 'PARM BRILLCHG STA,
  1027.          OBJ-CALL BRILLCHG
  1028.          OBJ-EXIT
  1029.       THEN,
  1030.          59 # CMP,           \ REVERB
  1031.       0= IF,
  1032.          1 PARM LDA,
  1033.          1 'PARM REVERBCHG STA,
  1034.          OBJ-CALL REVERBCHG
  1035.          OBJ-EXIT
  1036.       THEN,
  1037.          5A # CMP,           \ EFFECT
  1038.       0= IF,
  1039.          1 PARM LDA,
  1040.          1 'PARM EFFECTCHG STA,
  1041.          OBJ-CALL EFFECTCHG
  1042.          OBJ-EXIT
  1043.       THEN,
  1044.     THEN,
  1045.   THEN,
  1046.  
  1047. THEN,    \ *** END OF PHASE F1
  1048.  
  1049.  
  1050.  
  1051. \ ANY OTHER PHASE WILL DO NOTHING (DATA IGNORED)
  1052.  
  1053. THEN,
  1054.  
  1055. OBJ-END
  1056.