home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / hard.hdv / HARD / FORTH / DRWPIANO.WRD < prev    next >
Encoding:
Text File  |  1992-12-17  |  5.7 KB  |  308 lines  |  [04] ASCII Text (0x0000)

  1. \ FORTH WORDS FOR DRAWING PIANO DISPLAY SCREEN
  2.  
  3. DEC
  4.  
  5. : INVERSE  15 EMIT ;
  6. : NORMAL   14 EMIT ;
  7. : MOUSEON  27 EMIT ;
  8. : MOUSEOFF 24 EMIT ;
  9.  
  10. : OCTAVE-TOP
  11.    MOUSEON INVERSE
  12.    ." NZNZNNZNZNZN"
  13.    NORMAL MOUSEOFF
  14. ;
  15. : OCTAVE-BOT
  16.    MOUSEON INVERSE
  17.    ."  | |N | | |N"
  18.    NORMAL MOUSEOFF
  19. ;
  20. : TOP-C
  21.    MOUSEON INVERSE ." N" NORMAL MOUSEOFF
  22. : AB-TOP
  23.    MOUSEON INVERSE ." NZN" NORMAL MOUSEOFF
  24. ;
  25. : AB-BOT
  26.    MOUSEON INVERSE ."  |N" NORMAL MOUSEOFF
  27. ;
  28.  
  29. : CHNLLINE
  30.    ." CHNL "
  31.    10 0 DO
  32.         2 SPACES I . 2 SPACES
  33.    LOOP
  34.    2 SPACES
  35.    MOUSEON INVERSE
  36.    ."  L LN L L LN"
  37.    NORMAL MOUSEOFF
  38.    TOP-C
  39.  
  40. : PROGLINE
  41.    ." PROG "
  42.    10 0 DO
  43.         ." 00-00 "
  44.    LOOP
  45.    2 SPACES
  46.    MOUSEON
  47.    INVERSE SPACE NORMAL SPACE INVERSE SPACE NORMAL SPACE
  48.    INVERSE ." N"
  49.    INVERSE SPACE NORMAL SPACE INVERSE SPACE NORMAL SPACE
  50.    INVERSE SPACE NORMAL SPACE
  51.    INVERSE ." N"
  52.    NORMAL MOUSEOFF
  53.    TOP-C
  54. ;
  55.  
  56. : VLBRLINE   \ VOLUME & BRILLIANCE
  57.    ." VLBR "
  58.    10 0 DO
  59.         ." 00-00 "
  60.    LOOP
  61.    2 SPACES
  62.    OCTAVE-BOT
  63.    TOP-C
  64. ;
  65.  
  66.  
  67. : MRELINE1
  68.    ." MRE  "
  69.    AB-TOP
  70.    6 0 DO
  71.        OCTAVE-TOP
  72.    LOOP  
  73. ;
  74. : MRELINE2
  75.    ." 000  "
  76.    AB-TOP
  77.    6 0 DO
  78.        OCTAVE-TOP
  79.    LOOP
  80. ;
  81. : PEDLLINE
  82.    ." ---  "
  83.    AB-BOT
  84.    6 0 DO
  85.        OCTAVE-BOT
  86.    LOOP
  87. ;
  88.  
  89. : UNDERSCORES  ( N -- )   \ PRINTS N UNDERSCORES
  90.    0 DO
  91.      ASCII _ EMIT
  92.    LOOP
  93. ;
  94.  
  95.  
  96. : DRAWPIANO
  97.    CR   3 PR#
  98.    CHNLLINE
  99.    PROGLINE
  100.    VLBRLINE
  101.    5 SPACES  75 UNDERSCORES
  102.    MRELINE1
  103.    MRELINE2
  104.    PEDLLINE
  105.    80 UNDERSCORES
  106.    CR
  107.    8 34 C!   \ PROTECT TOP WINDOW
  108. ;
  109.  
  110. DRAWPIANO
  111.  
  112. \ FORTH OBJECTS FOR CONTROLLING PIANO DISPLAY
  113.  
  114. HEX
  115.  
  116. \ ==============================================================
  117. : ARRAY  ( #BYTES-PER-ELEMENT --- )  ( INDEX -- ADRS )
  118.     CREATE C, 
  119.     DOES> DUP C@     \ --- INDEX, ADRS, BYTESPERENTRY
  120.           ROT * + 1+ \ --- ADRS+ADRS*BYTES+1       
  121. ;
  122.  
  123.  
  124. \ ==============================================================
  125. : FILLARRY
  126.     7 0  DO    80 + DUP ,    LOOP  DROP
  127. ;
  128. 2 ARRAY LINEBASE
  129. 400  DUP , FILLARRY
  130. 428  DUP , FILLARRY
  131. 450  DUP , FILLARRY
  132.  
  133.  
  134. \ ==============================================================
  135. DEC
  136. : FILLPIANOX
  137.     80 5 DO   I C,   LOOP
  138.     80 67 DO  I C,   LOOP
  139. ;
  140. 1 ARRAY PIANOX
  141.     FILLPIANOX
  142.  
  143. : FILLPIANOY
  144.     6 C, 5 C, 6 C,
  145.     6 0 DO
  146.            6 C, 5 C, 6 C, 5 C, 6 C,
  147.            6 C, 5 C, 6 C, 5 C, 6 C, 5 C, 6 C,
  148.     LOOP
  149.            2 C, 1 C, 2 C, 1 C, 2 C,
  150.            2 C, 1 C, 2 C, 1 C, 2 C, 1 C, 2 C, 2 C,
  151. ;
  152. 1 ARRAY PIANOY
  153.     FILLPIANOY
  154.  
  155.  
  156.  
  157. \ ==============================================================
  158. HEX
  159. 0 CONSTANT PEEK
  160. 1 CONSTANT POKE
  161.  
  162. 4 OBJECT SCREEN
  163. \ ======================
  164. \ PARAMETERS:
  165. \   1)XCOORD    0-79
  166. \   2)YCOORD    0-23
  167. \   3)CHARACTER 0-255
  168. \   4)POKE OR PEEK   0=PEEK NONZERO=POKE
  169. \     IF PEEK, STORES BYTE IN 3RD PARM
  170. \ ========================
  171. \ FORTH INTERFACE: X Y CHAR POKE/PEEK ---
  172. BOT      LDA,
  173. 4 PARM   STA,  INX,  INX,
  174. BOT      LDA,
  175. 3 PARM   STA,  INX,  INX,
  176. BOT      LDA,
  177. 2 PARM   STA,  INX,  INX,
  178. BOT      LDA,
  179. 1 PARM   STA,  INX,  INX,
  180. \ ========================
  181. OBJ-CODE
  182.                    SEI,      \ NO INT WHEN WRITE TO 80COL
  183. C001               STA,      \ ALLOW PAGE2 TO SWITCH  MAIN/AUX
  184. 2 PARM             LDA,
  185. \
  186. DEC 24 HEX         # CMP,    \ CLIP IF 24 OR OVER
  187. CS IF,
  188.          CLI,
  189.          OBJ-EXIT
  190. ELSE,
  191. THEN,
  192.                    .A ASL,   \ YCOORD*2 = OFFSET IN LINEBASE 
  193.                    TAX,
  194. 0 LINEBASE         ,X LDA,   \ GET ADRS-LO INTO ZP PTR: N-1
  195. N 1 -              STA,
  196.                    INX,      
  197. 0 LINEBASE         ,X LDA,
  198. N                  STA,
  199. 1 PARM             LDA,      \ GET XCOORD
  200. \
  201. DEC 80 HEX         # CMP,    \ CLIP IF 80 OR OVER
  202. CS IF,
  203.          CLI,
  204.          OBJ-EXIT
  205. ELSE,
  206. THEN,
  207.                    .A LSR,   \ DIVIDE BY 2 - 
  208.                    PHP,      \ SAVE CARRY FLAG FOR LATER
  209.                    CLC,
  210.          N 1 -     ADC,
  211.          N 1 -     STA,      \ ADD XCOORD
  212.          0         # LDA,
  213.          N         ADC,
  214.          N         STA,
  215.                    PLP,      \ RESTORE CARRY FLAG
  216. CS IF,                       \ IF ODD USE MAIN, ELSE AUX
  217.          C054      STA,      \ SELECT MAIN 400-7FF
  218. ELSE,
  219.          C055      STA,
  220. THEN,
  221.          0         # LDY,
  222.          4 PARM    LDA,      \ CHECK POKE OR PEEK
  223. 0= IF,
  224.          N 1 -     )Y LDA,   \ PEEK THE BYTE
  225.          3 PARM    STA,      \ INTO THIRD PARM
  226. ELSE,
  227.          3 PARM    LDA,
  228.          N 1 -     )Y STA,   \ POKE THE BYTE
  229. THEN,
  230.          C054      STA,      \ RESELECT MAIN MEM
  231.                    CLI,      \ ENABLE INT
  232. OBJ-END
  233. \ ==============================================
  234.  
  235. 3 'PARM SCREEN CONSTANT PEEKADRS
  236.  
  237.  
  238. 3 OBJECT (PIANOXY)
  239. \ ==============
  240. \ PARAMETERS:
  241. \ 1) NOTE NUMBER (INPUT)
  242. \ 2) X COORDINATE (OUTPUT)
  243. \ 3) Y COORDINATE (OUTPUT)
  244. \ =========================
  245. \ FORTH INTERFACE: (NOTE # -- )
  246. BOT      LDA,
  247. 1 PARM   STA,  INX,  INX,
  248. \ =========================
  249. OBJ-CODE
  250.          FF        # LDA,
  251.          2 PARM    STA,      \ SET PARMS TO FF FF
  252.          3 PARM    STA,      \ WILL BE CLIPPED BY SCREEN ROUTINE
  253.          1 PARM    LDA,
  254.          DEC 21    # CMP,    \ CLIP IF <21 OR >=109
  255. CS NOT IF,
  256.          OBJ-EXIT
  257. THEN,
  258.          DEC 109   # CMP,
  259. CS IF,
  260.          OBJ-EXIT
  261. THEN, 
  262.                    SEC,
  263.          DEC 21    # SBC,
  264.                    TAX,
  265.          0 PIANOX  ,X LDA,
  266.          2 PARM    STA,
  267.          0 PIANOY  ,X LDA,
  268.          3 PARM    STA,
  269. OBJ-END
  270.  
  271.  
  272. \ ==============================================================
  273. DEC
  274. 2 'PARM (PIANOXY) CONSTANT XADRS
  275. 3 'PARM (PIANOXY) CONSTANT YADRS
  276.  
  277. : PIANOXY ( NOTE # --- X Y )
  278.     (PIANOXY)  XADRS C@ YADRS C@
  279. ;
  280.  
  281.  
  282. : SAVEPIC
  283.     128 0 DO 
  284.          I PIANOXY BL PEEK SCREEN
  285.          PEEKADRS C@
  286.          C,
  287.     LOOP
  288. ;
  289. 1 ARRAY PICSAVE
  290.  
  291. \ MUST HAVE PIANO SCREEN UP FOR THIS:
  292. SAVEPIC
  293.  
  294. HEX
  295. \ TO INITIALIZE MIDI INTERFACE:
  296. \ ============================
  297. 0 OBJECT INIT
  298. OBJ-CODE
  299.          13        # LDA,
  300.          C0A8      STA,
  301.          11        # LDA,
  302.          C0A8      STA,
  303. OBJ-END
  304.  
  305. INIT
  306.