home *** CD-ROM | disk | FTP | other *** search
/ MSX Magazine 3 / MSXMAG3.iso / fsw / s-cube.lzh / s-cube.bas next >
BASIC Source File  |  2004-10-28  |  19KB  |  547 lines

  1. 1 '                                                     SAVE"s-cube.bas",A
  2. 100 SCREEN 2,,0:CLEAR 500,&HD7FF:DEFUSR=&HD800:COLOR 15,4,4:MAXFILES=2
  3. 110 '>>>>> Value initialize
  4. 120 DEFINT B-C,E-M,O-X: DEFDBL D
  5. 130 DEFSTR N,Y,Z
  6. 140 WX =  32:      ' X slice (0-31)
  7. 150 WY = 128:      ' Y slice (0-127)
  8. 160 SN =  50:      ' Max sound data
  9. 165 PN =  10:      ' Sound num for Morphing
  10. 170 X  =   0:      ' Editing number
  11. 180 M  =   0:      ' Morphing flag
  12. 181 VA = 0       : ' VCD Load offset
  13. 182 VN = &H410   : ' VCD Name offset (SCC)
  14. 183 VW = &H9B0   : ' VCD Wave offset (SCC)
  15. 190 DIM SCC(WX), UD(WX), ST(WX), MS(WX), MD(WX),VD(&H10B8/2): ' Sound data
  16. 200 DIM NA$(SN): ' Sound name
  17. 210 '--- Dimension value initialize
  18. 220 FOR I=0 TO WX
  19. 230  SCC(I)=0: UD(I)=0: ST(I)=0: NA$(I)=""
  20. 250 NEXT
  21. 251 ''--- Voice data clear (RAM)
  22. 255 'FOR I=0 TO &H10B7: POKE VA+I,0: NEXT
  23. 260 OPEN "grp:" FOR OUTPUT AS #1
  24. 300 '>>>>> Title display
  25. 310 PRESET(2,2)
  26. 320 PRINT #1,"  SCC Sound Synthesizer"
  27. 330 PRINT #1,"        S-cube version 0.2"
  28. 335 PRINT #1,"              -MuSICA edition-"
  29. 340 PRINT #1,""
  30. 350 PRINT #1,"               (c)2002-2004 Wiz."
  31. 360 PRINT #1,""
  32. 370 PRINT #1,"  Now loading..."
  33. 390 '
  34. 400 '>>>>> SCC keyboard routine load
  35. 410 FOR I=&HD800 TO &HDA2C: READ N$: POKE I,VAL("&h"+N$): NEXT
  36. 415 GOTO 800
  37. 420 DATA f3,2a,f8,f7,3a,0f,d8,5f,3e,01,cd,14,00,fb,c9,00
  38. 430 DATA dd,2a,7e,d9,3e,03,cd,41,01,e6,01,20,08,dd,6e,00
  39. 440 DATA dd,66,01,18,75,3e,03,cd,41,01,e6,08,20,08,dd,6e
  40. 450 DATA 02,dd,66,03,18,75,3e,05,cd,41,01,e6,08,20,08,dd
  41. 460 DATA 6e,04,dd,66,05,18,75,3e,03,cd,41,01,e6,10,20,08
  42. 470 DATA dd,6e,06,dd,66,07,18,75,3e,02,cd,41,01,e6,80,20
  43. 480 DATA 08,dd,6e,08,dd,66,09,18,75,3e,04,cd,41,01,e6,08
  44. 490 DATA 20,08,dd,6e,0a,dd,66,0b,18,75,3e,03,cd,41,01,e6
  45. 500 DATA 80,20,08,dd,6e,0c,dd,66,0d,18,64,3e,04,cd,41,01
  46. 510 DATA e6,04,20,08,dd,6e,0e,dd,66,0f,18,53,3e,04,cd,41
  47. 520 DATA 01,e6,01,20,08,dd,6e,10,dd,66,11,18,42,3e,02,cd
  48. 530 DATA 41,01,e6,04,20,08,dd,6e,12,dd,66,13,18,31,3e,04
  49. 540 DATA cd,41,01,e6,02,20,08,dd,6e,14,dd,66,15,18,7e,3e
  50. 550 DATA 02,cd,41,01,e6,08,20,08,dd,6e,16,dd,66,17,18,6d
  51. 560 DATA 3e,02,cd,41,01,e6,10,20,08,dd,6e,18,dd,66,19,18
  52. 570 DATA 5c,3a,7c,d9,47,3e,08,cd,41,01,e6,80,20,1f,78,e6
  53. 575 DATA 01,c0,3a,7d,d9,fe,07,c8,3c,32,7d,d9,21,18,00,eb
  54. 580 DATA 2a,7e,d9,19,22,7e,d9,3e,01,32,7c,d9,c9,78,e6,fe
  55. 590 DATA 32,7c,d9,3e,08,cd,41,01,e6,10,20,3c,78,e6,02,c0
  56. 595 DATA 3a,7d,d9,fe,01,c8,3d,32,7d,d9,21,18,00,eb,2a,7e
  57. 600 DATA d9,a7,ed,52,22,7e,d9,3e,02,32,7c,d9,c9,7d,e5,21
  58. 610 DATA 80,98,cd,07,d8,e1,7c,e5,21,81,98,cd,07,d8,e1,3e
  59. 620 DATA 0f,21,8a,98,cd,07,d8,c9,af,32,7c,d9,21,8a,98,cd
  60. 630 DATA 07,d8,c9,00,00,00,00,00,00,00,00,00,00,04,c8,d9
  61. 680 DATA 5d,0d,9c,0c,e7,0b,3c,0b,9b,0a,02,0a,73,09,eb,08
  62. 690 DATA 6b,08,f2,07,80,07,1a,07,af,06,4e,06,f4,05,9e,05
  63. 700 DATA 4e,05,01,05,ba,04,76,04,36,04,f9,03,c0,03,8a,03
  64. 710 DATA 57,03,27,03,fa,02,cf,02,a7,02,81,02,5d,02,3b,02
  65. 720 DATA 1b,02,fd,01,e0,01,c5,01,ac,01,94,01,7d,01,68,01
  66. 730 DATA 53,01,40,01,2e,01,1d,01,0d,01,fe,00,f0,00,e3,00
  67. 740 DATA d6,00,ca,00,be,00,b4,00,aa,00,a0,00,97,00,8f,00
  68. 750 DATA 87,00,7f,00,78,00,71,00,6b,00,65,00,5f,00,5a,00
  69. 760 DATA 55,00,50,00,4c,00,47,00,43,00,40,00,3c,00,39,00
  70. 770 DATA 35,00,32,00,30,00,2d,00,2a,00,28,00,26,00,24,00
  71. 780 DATA 22,00,20,00,1e,00,1c,00,1a,00,c3,10,d8
  72. 790 '
  73. 800 '>>>>> SCC initialize <<<<<
  74. 810 POKE &HD809,1                  : ' SCC slot (0-3)
  75. 820 POKE &HD80F,&H3F: A=USR(&H9000): ' BANK change
  76. 830 POKE &HD80F,&H0 : A=USR(&H988A): ' Volume set (=0)
  77. 840 POKE &HD80F,&H1 : A=USR(&H988F): ' Output on
  78. 850 '!!!!! Timer intrrupt MUST CHANGE (for Disk Access Routine) !!!!!
  79. 860 'POKE &HFDA0,&H10: POKE &HFDA1,&HD0: POKE &HFD9F,&HC3: ' Timer intrrupt
  80. 870 FOR I=0 TO 4: POKE &HDA2D+I,PEEK(&HFD9F+I)
  81. 880 POKE &HFD9F,&HC9: POKE &HFDA0,&H2A: POKE &HFDA1,&HDA: POKE &HFD9F,&HC3
  82. 890 '
  83. 900 '>>>>> Handler init
  84. 910 ON KEY GOSUB 6000,2000,3000,4000,8000,1000,7000,,9000,5000
  85. 915 ON ERROR GOTO 65300
  86. 918 ON STOP GOSUB 65400: STOP ON
  87. 920 GOSUB 45000: ' Function key interruput on
  88. 930 '
  89. 940 '>>>>> Keyboard draw
  90. 950 GOSUB 55000
  91. 999 GOTO 999
  92. 1000 '
  93. 1010 '>>>>> Save data
  94. 1020 GOSUB 40000: ' Function key interrupt off
  95. 1030 PRINT #1,"[SAVE] Input file name: ": T=0
  96. 1040 PX=24: PY=23: GOSUB 35000: ' Input string
  97. 1050 IF T<0 THEN BEEP: GOTO 1980: ' Cancel
  98. 1053 NF$=Y$
  99. 1055 GOSUB 15000: PRINT #1,"Ok? (1=y/2=n): "
  100. 1056 GOSUB 30000: PRESET(120, 184): ' Input char
  101. 1057 IF T<0 THEN BEEP: GOTO 1980: ' Cancel
  102. 1058 IF T=1 THEN PRINT #1,"y":GOTO 1060 ELSE IF T=2 THEN PRINT #1,"n":GOTO 1980
  103. 1059 GOTO 1055
  104. 1060 GOSUB 15000: PRINT #1,"Now saving..."
  105. 1069 'NF$: FileName,
  106. 1070 'BSAVE NF$+".vcd",&HBF80,&HCFFF
  107. 1071 COPY VD TO NF$+".vcd"
  108. 1980 GOSUB 45000: ' Function key interrupt on
  109. 1990 RETURN
  110. 2000 '
  111. 2010 '>>>>> Number change
  112. 2020 GOSUB 40000: ' Function key interrupt off
  113. 2030 PRINT #1,USING"Input number (0-##): ";SN-1
  114. 2040 PX=21: PY=23: GOSUB 35000: ' Input string
  115. 2050 IF T<0 THEN BEEP: GOTO 2980 ELSE T=VAL(Y$)
  116. 2060 IF T<0 OR T>=SN THEN BEEP: GOSUB 15000: GOTO 2040
  117. 2070 X=T
  118. 2970 'GOSUB 61000: ' Wave data read
  119. 2980 GOSUB 45000: ' Function key interrupt on
  120. 2990 RETURN
  121. 3000 '
  122. 3010 '>>>>> Synthesize
  123. 3020 GOSUB 40000: ' Function key interrupt off
  124. 3040 PRINT #1,"Wave synthesize"
  125. 3050 GOSUB 25000: ' Wave erase
  126. 3060 PRESET(16,8):PRINT #1,"Select wave pattern: "
  127. 3070 PRESET(16,16): PRINT #1,"1: `Sine'     wave"
  128. 3080 PRESET(16,24): PRINT #1,"2: `Square'   wave"
  129. 3090 PRESET(16,32): PRINT #1,"3: `Triangle' wave"
  130. 3100 PRESET(16,40): PRINT #1,"4: `Saw'      wave"
  131. 3110 PRESET(184,8)
  132. 3120 GOSUB 30000: ' Input char
  133. 3130 IF T<1 OR T>4 THEN BEEP: IF T<0 THEN 3980 ELSE 3120
  134. 3140 IF T=1 THEN PRINT #1,"Sine"
  135. 3150 IF T=2 THEN PRINT #1,"Square"
  136. 3160 IF T=3 THEN PRINT #1,"Triangle"
  137. 3170 IF T=4 THEN PRINT #1,"Saw"
  138. 3180 LINE(2,16)-(253,138),4,BF
  139. 3190 PT=T: ' Pattern
  140. 3200 PRESET(16,16): PRINT #1,USING"Input multiple(1-##): ";FIX(WX/4)
  141. 3210 PRESET(200,16): T=8
  142. 3220 PX=24: PY=2: GOSUB 35000: ' Input string
  143. 3230 ML=VAL(Y$)
  144. 3240 IF ML<1 OR ML>FIX(WX/4) THEN BEEP: IF T<0 THEN 3980 ELSE 3170
  145. 3250 PRESET(16,24): PRINT #1,USING"Input level(1-###): ";WY-1
  146. 3260 PRESET(176,24): T=16
  147. 3270 PX=22: PY=3: GOSUB 35000: ' Input string
  148. 3280 LV=VAL(Y$)
  149. 3290 IF T<0 THEN BEEP: GOTO 3980
  150. 3300 IF LV<1 OR LV>=WY THEN BEEP: LINE(2,24)-(253,32),4,BF: GOTO 3240
  151. 3310 GOSUB 15000: PRINT #1,"Now calculating..."
  152. 3311 GOSUB 61000: ' Wave data read
  153. 3315 GOSUB 50000: ' Wave data backup
  154. 3320 IF PT=1 THEN 3400: ' Sine wave
  155. 3330 IF PT=2 THEN 3450: ' Square wave
  156. 3340 IF PT=3 THEN 3550: ' Triangle wave
  157. 3350 IF PT=4 THEN 3740: ' Saw wave
  158. 3400 '----- Sine wave
  159. 3410 FOR I=0 TO WX-1
  160. 3420   SCC(I)=SCC(I)+FIX(LV*SIN(I*ML*3.14159/(WX/2)))
  161. 3430 NEXT
  162. 3440 GOTO 3900
  163. 3450 '----- Square wave
  164. 3460 BK=-1
  165. 3470 FOR I=0 TO WX-1
  166. 3480   T=FIX(LV*SIN(I*ML*3.14159/(WX/2)))
  167. 3490   IF T=0 THEN IF BK>=0 THEN T=-1 ELSE T=1
  168. 3500   BK=T
  169. 3510   IF T>0 THEN SIG=1 ELSE SIG=-1
  170. 3520   SCC(I)=SCC(I)+(LV*SIG)
  171. 3530 NEXT
  172. 3540 GOTO 3900
  173. 3550 '----- Triangle wave
  174. 3560 SP=0
  175. 3570 FOR I=1 TO ML
  176. 3580   EP=FIX((WX/ML)*I)-1
  177. 3585   MX=SP+FIX(((EP+1)-SP)/4): MN=SP+FIX((((EP+1)-SP)/4)*3)
  178. 3590   DW=LV/(MX-SP)
  179. 3600   FOR J=SP TO MX-1
  180. 3610     SCC(J)=SCC(J)+FIX(DW*((J-SP)+1)): ' Up to Max
  181. 3620   NEXT
  182. 3630   DW=(LV*2)/(MN-MX)
  183. 3640   FOR J=MX TO MN-1
  184. 3650     SCC(J)=SCC(J)+LV-FIX(DW*((J-MX)+1)): ' Down to Min
  185. 3660   NEXT
  186. 3670   DW=LV/((EP+1)-MN)
  187. 3680   FOR J=MN TO EP
  188. 3690     SCC(J)=SCC(J)-LV+FIX(DW*((J-MN)+1)): ' Up to Zero
  189. 3700   NEXT
  190. 3710 SP=EP+1
  191. 3720 NEXT
  192. 3730 GOTO 3900
  193. 3740 '----- Saw wave
  194. 3750 SP=0
  195. 3760 FOR I=1 TO ML
  196. 3770   EP=FIX((WX/ML)*I)-1: MP=SP+FIX(((EP+1)-SP)/2)
  197. 3780   DW=LV/(MP-SP)
  198. 3790   FOR J=SP TO MP-1
  199. 3800     SCC(J)=SCC(J)+FIX(DW*((J-SP)+1)): 'Up to Max
  200. 3810   NEXT
  201. 3820   DW=LV/(EP-MP)
  202. 3830   FOR J=MP TO EP
  203. 3840     SCC(J)=SCC(J)-FIX(DW*(EP-J)): 'Up to Zero
  204. 3850   NEXT
  205. 3860   SP=EP+1
  206. 3870 NEXT
  207. 3900 '----- Normalize
  208. 3910 T=1
  209. 3920 FOR I=0 TO WX-1
  210. 3930   IF T<ABS(SCC(I)) THEN T=ABS(SCC(I))
  211. 3940 NEXT
  212. 3950 FOR I=0 TO WX-1
  213. 3960   IF T>(WY-1) THEN SCC(I)=FIX(SCC(I)*((WY-1)/T))
  214. 3970 NEXT
  215. 3975 GOSUB 62000: ' Wave data write
  216. 3980 GOSUB 45000: ' Function key interrupt on
  217. 3990 RETURN
  218. 4000 '
  219. 4010 '>>>>> Morphing
  220. 4020 GOSUB 40000: ' Function key interrupt off
  221. 4030 GOSUB 25000: ' Wave Erase
  222. 4035 T=SN/3+1
  223. 4040 FOR I=0 TO T-1
  224. 4050   PRESET(2,I*8+2): PRINT #1,USING"##";I
  225. 4051   PRESET(20,I*8+2): PRINT #1,USING"@";NA$(I)
  226. 4055   PRESET(88,I*8+2): PRINT #1,USING"##";I+T
  227. 4056   PRESET(106,I*8+2): PRINT #1,USING"@";NA$(I+T): IF (I+1)*3>=SN THEN 4060
  228. 4057   PRESET(174,I*8+2): PRINT #1,USING"##";I+(T*2)
  229. 4058   PRESET(192,I*8+2): PRINT #1,USING"@";NA$(I+(T*2))
  230. 4060 NEXT
  231. 4070 PRESET(0,184): PRINT #1,USING"Source wave (0-##): ";SN-1
  232. 4080 PX=20: PY=23: GOSUB 35000: ' Input string
  233. 4090 IF T=-1 THEN BEEP: GOTO 4980 ELSE T=VAL(Y$)
  234. 4095 IF T<0 OR T>=SN THEN BEEP: GOSUB 15000: GOTO 4070
  235. 4100 WS=T
  236. 4110 GOSUB 15000: ' Function line erase
  237. 4120 PRESET(0,184): PRINT #1,USING"Destination wave (0-##): ";SN-1
  238. 4130 PX=25: PY=23: GOSUB 35000: ' Input string
  239. 4140 IF T=-1 THEN BEEP: GOTO 4980 ELSE T=VAL(Y$)
  240. 4145 IF T<0 OR T>=SN THEN BEEP: GOSUB 15000: GOTO 4120
  241. 4150 WD=T
  242. 4160 LINE(2,2)-(253,140),4,BF
  243. 4170 '----- Wave draw (source)
  244. 4175 PRESET(16,130): PRINT #1,USING"##: @";WS,NA$(WS)
  245. 4180 T=FIX(2/(WX/32)): IF T=0 THEN T=1
  246. 4190 FOR I=0 TO WX-1 STEP 2
  247. 4191   MS(I)  = (VD((VW+4+(WS*36)+I)/2) AND &H00FF)
  248. 4192   MS(I+1)=((VD((VW+4+(WS*36)+I)/2) AND &HFF00)/256)
  249. 4193   IF (MS(I)>&H7F) THEN MS(I)=(MS(I) OR &HFF00)
  250. 4194 NEXT
  251. 4199 FOR I=0 TO WX-1
  252. 4200  LINE(32+I*T,64)-(35+I*T,64-FIX(MS(I)/(WY/64))),14,BF
  253. 4210 NEXT
  254. 4220 LINE(16,64)-(119,64),15
  255. 4230 '----- Wave draw (destination)
  256. 4235 PRESET(144,130): PRINT #1,USING"##: @";WD,NA$(WD)
  257. 4240 FOR I=0 TO WX-1 STEP 2
  258. 4241   MD(I)  = (VD((VW+4+(WD*36)+I)/2) AND &H00FF)
  259. 4242   MD(I+1)=((VD((VW+4+(WD*36)+I)/2) AND &HFF00)/256)
  260. 4243   IF (MD(I)>&H7F) THEN MD(I)=(MD(I) OR &HFF00)
  261. 4244 NEXT
  262. 4249 FOR I=0 TO WX-1
  263. 4250  LINE(160+I*T,64)-(163+I*T,64-FIX(MD(I)/(WY/64))),14,BF
  264. 4260 NEXT
  265. 4270 LINE(144,64)-(247,64),15
  266. 4280 GOSUB 15000: ' Function line erase
  267. 4290 PRESET(0,184): PRINT #1,"Ok? (1=y/2=n): "
  268. 4300 GOSUB 30000: ' Input char
  269. 4310 IF T<1 OR T>2 THEN BEEP: IF T<0 THEN 4980 ELSE 4280
  270. 4320 IF T<>2 THEN 4350
  271. 4330 PRESET(120,184): PRINT #1,"n"
  272. 4340 GOTO 4980
  273. 4350 PRESET(120,184): PRINT #1,"y"
  274. 4360 GOSUB 15000: PRINT #1,"Now calculating..."
  275. 4365 T=X: ' Edit number backup
  276. 4370 FOR J=0 TO PN-1
  277. 4380   FOR I=0 TO WX-1
  278. 4390     DW=(MD(I)-MS(I))/(PN-1)
  279. 4400     SCC(I)=FIX(MS(I)+(DW*J))
  280. 4410   NEXT
  281. 4415   X=SN-PN+J:GOSUB 62000: ' Wave data write
  282. 4420 NEXT
  283. 4425 X=T: ' Edit number restore
  284. 4430 NA$(SN-PN)=NA$(WS): NA$(SN-1)=NA$(WD)
  285. 4435 T=(SN-PN): GOSUB 7500: T=SN-1: GOSUB 7500
  286. 4440 FOR J=1 TO PN-2
  287. 4450   NA$(SN-PN+J)="Morph"+STR$(J): K=J: T=2: ' T=Space count
  288. 4452   K=K/10: T=T-1: IF K>0 THEN 4452
  289. 4453   FOR K=1 TO T: NA$(SN-PN+J)=NA$(SN-PN+J)+" ": NEXT
  290. 4455   T=(SN-PN+J): GOSUB 7500
  291. 4460 NEXT
  292. 4980 GOSUB 45000: ' Function key interrupt on
  293. 4990 RETURN
  294. 5000 '
  295. 5010 '>>>>> Clear
  296. 5020 GOSUB 40000: ' Function key interrupt off
  297. 5040 PRINT #1,USING"Clear data ##...Ok? (1=y/2=n): ";X
  298. 5050 GOSUB 30000: ' Input char
  299. 5060 IF T<1 OR T>2 THEN BEEP: IF T<0 THEN 5980 ELSE 5050
  300. 5070 IF T<>2 THEN 5100
  301. 5080 PRESET(248,184): PRINT #1,"n"
  302. 5090 GOTO 5980
  303. 5100 PRESET(248,184): PRINT #1,"y"
  304. 5110 GOSUB 50000: ' Wave data backup
  305. 5120 FOR I=0 TO WX: SCC(I)=0: NEXT
  306. 5130 GOSUB 62000: ' Wave data write
  307. 5980 GOSUB 45000: ' Function key interrupt on
  308. 5990 RETURN
  309. 6000 '
  310. 6010 '>>>>> Load data
  311. 6020 GOSUB 40000: ' Function key interrupt off
  312. 6030 PRINT #1,"[LOAD] Input file name: ": T=0
  313. 6040 PX=24: PY=23: GOSUB 35000: ' Input string
  314. 6050 IF T<0 THEN BEEP: GOTO 6980: ' Cancel
  315. 6053 NF$=Y$
  316. 6055 GOSUB 15000: PRINT #1,"Ok? (1=y/2=n): "
  317. 6056 GOSUB 30000: PRESET(120, 184): ' Input char
  318. 6057 IF T<0 THEN BEEP: GOTO 6980: ' Cancel
  319. 6058 IF T=1 THEN PRINT #1,"y":GOTO 6060 ELSE IF T=2 THEN PRINT #1,"n":GOTO 6980
  320. 6059 GOTO 6055
  321. 6060 GOSUB 15000: PRINT #1,"Now loading..."
  322. 6070 COPY NF$+".vcd" TO VD
  323. 6075 GOSUB 7600 : ' Name read
  324. 6080 GOSUB 61000: ' Wave data read
  325. 6980 GOSUB 45000: ' Function key interrupt on
  326. 6990 RETURN
  327. 7000 '
  328. 7010 '>>>>> Name change
  329. 7020 GOSUB 40000: ' Function key interrupt off
  330. 7030 PRINT #1,"Input name: "
  331. 7060 PX=12: PY=23: GOSUB 35000: ' Input string
  332. 7070 IF T<0 THEN BEEP: GOTO 7090
  333. 7080 NA$(X)=Y$
  334. 7081 FOR J=I TO 7: NA$(X)=NA$(X)+" ": NEXT
  335. 7085 T=X: GOSUB 7500
  336. 7090 GOSUB 45000: ' Function key interrupt on
  337. 7100 RETURN
  338. 7500 '
  339. 7510 '>>>>> Name write to VD
  340. 7520 FOR I=0 TO 7 STEP 2
  341. 7521   POKE VARPTR(VD((VN+(8*T)+I)/2)),ASC(MID$(NA$(T),I+1,1))
  342. 7522   POKE VARPTR(VD((VN+(8*T)+I)/2))+1,ASC(MID$(NA$(T),I+2,1))
  343. 7540 NEXT
  344. 7550 RETURN
  345. 7600 '
  346. 7610 '>>>>> Name read from VD
  347. 7615 FOR J=0 TO SN-1
  348. 7616   NA$(J)=""
  349. 7620   FOR I=0 TO 7 STEP 2
  350. 7621     NA$(J)=NA$(J)+CHR$(PEEK(VARPTR(VD((VN+(8*J)+I)/2))))
  351. 7622     NA$(J)=NA$(J)+CHR$(PEEK(VARPTR(VD((VN+(8*J)+I)/2))+1))
  352. 7640   NEXT
  353. 7645 NEXT
  354. 7650 RETURN
  355. 8000 '
  356. 8010 '>>>>> Undo
  357. 8020 GOSUB 40000: ' Function key interrupt off
  358. 8030 PRINT #1,"Undo!"
  359. 8040 BEEP
  360. 8050 FOR I=0 TO WX-1
  361. 8060   TMP=SCC(I)
  362. 8070   SCC(I)=UD(I)
  363. 8080   UD(I)=TMP
  364. 8090 NEXT
  365. 8970 GOSUB 62000: ' Wave data write
  366. 8980 GOSUB 45000: ' Function key interrupt on
  367. 8990 RETURN
  368. 9000 '
  369. 9010 '>>>>> Disp all wave data
  370. 9020 GOSUB 40000: ' Function key interrupt off
  371. 9030 PRINT #1,"Disp all wave data"
  372. 9040 LINE(0,0)-(255,180),4,BF: 'All Erase
  373. 9041 DRAW "C15BM24,0R201F2D164G2L201H2U164E2"
  374. 9045 T=X: ' Edit number backup
  375. 9050 FOR K=1 TO FIX(SN/5)
  376. 9051   PRESET(32,16*K-8):PRINT #1,USING"##:";((K-1)*5)
  377. 9060   FOR J=0 TO 4
  378. 9070     ST=FIX(WX/32)
  379. 9075     X=(K-1)*5+J:GOSUB 61000: ' Wave data read
  380. 9080     FOR L=0 TO WX-1 STEP ST
  381. 9090       LINE(56+32*J+L,16*K-8+2)-(56+32*J+L,16*K-8-FIX(SCC(L)/(WY/8))+2),14
  382. 9100     NEXT
  383. 9110     LINE(56+32*J,16*K-8+2)-(56+32*J+(WX-1),16*K-8+2),15
  384. 9120   NEXT
  385. 9130 NEXT
  386. 9135 X=T: ' Edit number restore
  387. 9140 GOSUB 15000: PRINT #1,"Hit any key"
  388. 9150 GOSUB 30000: ' Input char
  389. 9155 LINE(0,0)-(255,180),4,BF: 'All erase
  390. 9160 GOSUB 55000: ' Keyboard draw
  391. 9980 GOSUB 45000: ' Function key interrupt on
  392. 9990 RETURN
  393. 10000 '
  394. 10010 '>>>>> Function line draw
  395. 10020 GOSUB 15000: ' Function line erase
  396. 10030 PRESET(  0,184): PRINT #1,"Ld/Sv"
  397. 10040 PRESET( 46,184): PRINT #1,"Num/Nam"
  398. 10050 PRESET(108,184): PRINT #1,"Syn"
  399. 10060 PRESET(140,184): PRINT #1,"Mor/Dsp"
  400. 10070 PRESET(200,184): PRINT #1,"Und/Clr"
  401. 10080 GOSUB 60000: ' SCC wave Write
  402. 10090 GOSUB 65000: ' Output On
  403. 14990 RETURN
  404. 15000 '
  405. 15010 '>>>>> Function line erase
  406. 15020 LINE(0,184)-(255,191),4,BF
  407. 15030 PRESET(0,184)
  408. 15040 GOSUB 65100: ' Output off
  409. 19990 RETURN
  410. 20000 '
  411. 20010 '>>>>> Wave draw
  412. 20020 GOSUB 25000: ' Wave erase
  413. 20025 GOSUB 61000: ' Wave data read
  414. 20030 T=FIX(4/(WX/32)): IF T=0 THEN T=1
  415. 20040 FOR I=0 TO WX-1
  416. 20050  LINE(64+I*T,64)-(67+I*T,64-FIX(SCC(I)/(WY/64))),14,BF
  417. 20060 NEXT
  418. 20070 LINE(48,64)-(207,64),15
  419. 20080 PRESET(16,130): PRINT #1,USING"##: @";X,NA$(X)
  420. 24990 RETURN
  421. 25000 '
  422. 25010 '>>>>> Wave erase
  423. 25020 LINE(2,1)-(253,140),4,BF
  424. 25030 PRESET(0,0)
  425. 29990 RETURN
  426. 30000 '
  427. 30010 '>>>>> Input char
  428. 30020 IF INKEY$<>"" THEN 30020
  429. 30030 Y$=INPUT$(1)
  430. 30040 IF ASC(Y$)=27 THEN T=-1 ELSE T=VAL(Y$)
  431. 34990 RETURN
  432. 35000 '
  433. 35010 '>>>>> Input string
  434. 35020 IF INKEY$<>"" THEN 35020
  435. 35030 Y$="":Z$="": PX=PX*8-8: PY=PY*8
  436. 35040 FOR I=0 TO 7
  437. 35050   PX=PX+8
  438. 35060   Z$=INPUT$(1)
  439. 35070   IF ASC(Z$)=13 THEN 39990
  440. 35080   IF ASC(Z$)=27 THEN T=-1: Y$="": GOTO 39990
  441. 35090   IF ASC(Z$)<>8 OR I<1 THEN 35120
  442. 35100   LINE(PX-8,PY)-(PX,PY+8),4,BF
  443. 35110   Y$=LEFT$(Y$,I-1): I=I-2: PX=PX-16: NEXT
  444. 35120   PRESET(PX,PY)
  445. 35130   PRINT #1,Z$
  446. 35140   Y$=Y$+Z$
  447. 35150 NEXT
  448. 39990 RETURN
  449. 40000 '
  450. 40010 '>>>>> Function key interrupt off
  451. 40020 GOSUB 15000: ' Fuction line erase
  452. 40030 FOR I=1 TO 10: KEY(I) OFF: NEXT
  453. 44990 RETURN
  454. 45000 '
  455. 45010 '>>>>> Function key interrupt on
  456. 45020 GOSUB 20000: ' Wave draw
  457. 45030 GOSUB 10000: ' Fuction line draw
  458. 45040 FOR I=1 TO 10: KEY(I) ON: NEXT
  459. 49990 RETURN
  460. 50000 '
  461. 50010 '>>>>> Wave data backup
  462. 50020 FOR I=0 TO WX-1
  463. 50030   UD(I)=SCC(I)
  464. 50040 NEXT
  465. 54990 RETURN
  466. 55000 '
  467. 55010 '>>>>> Keyboard draw
  468. 55020 LINE(24,145)-(215,180),15,BF
  469. 55030 LINE(219,164)-(251,180),15,BF
  470. 55040 FOR I=48 TO 192 STEP 24: LINE(I,145)-(I,180),1: NEXT
  471. 55050 FOR I=40 TO 64 STEP 24: LINE(I,145)-(I+16,165),1,BF: NEXT
  472. 55060 FOR I=112 TO 160 STEP 24: LINE(I,145)-(I+16,165),1,BF: NEXT
  473. 55070 PRESET(32,170),15: COLOR 1: PRINT #1,"C"
  474. 55080 PRESET(56,170),15: COLOR 1: PRINT #1,"V"
  475. 55090 PRESET(80,170),15: COLOR 1: PRINT #1,"B"
  476. 55100 PRESET(104,170),15: COLOR 1: PRINT #1,"N"
  477. 55110 PRESET(128,170),15: COLOR 1: PRINT #1,"M"
  478. 55120 PRESET(152,170),15: COLOR 1: PRINT #1,","
  479. 55130 PRESET(176,170),15: COLOR 1: PRINT #1,"."
  480. 55140 PRESET(200,170),15: COLOR 1: PRINT #1,"/"
  481. 55150 PRESET(220,172),15: COLOR 4: PRINT #1,"<-"
  482. 55160 PRESET(238,172),15: COLOR 4: PRINT #1,"->"
  483. 55170 PRESET(220,165),15: COLOR 4: PRINT #1,"Dn"
  484. 55180 PRESET(238,165),15: COLOR 4: PRINT #1,"Up"
  485. 55190 LINE(235,164)-(235,180),4
  486. 55200 PRESET(44,155),1: COLOR 15: PRINT #1,"F"
  487. 55210 PRESET(68,155),1: COLOR 15: PRINT #1,"G"
  488. 55220 PRESET(116,155),1: COLOR 15: PRINT #1,"J"
  489. 55230 PRESET(140,155),1: COLOR 15: PRINT #1,"K"
  490. 55240 PRESET(164,155),1: COLOR 15: PRINT #1,"L"
  491. 55500 '
  492. 55510 '>>>>> Border draw
  493. 55520 DRAW "C15BM2,0R251F2D138G2L251H2U138E2"
  494. 59990 RETURN
  495. 60000 '
  496. 60010 '>>>>> SCC wave data write
  497. 60020 P=0
  498. 60030 FOR I=&H9800 TO &H981F
  499. 60040   POKE &HD80F,VAL("&H"+RIGHT$(HEX$(SCC(P)),2)): A=USR(I)
  500. 60050   P=P+1
  501. 60060 NEXT
  502. 60070 RETURN
  503. 61000 '
  504. 61010 '>>>>> SCC wave data read from VD
  505. 61015 'IF X>49 THEN END
  506. 61020 FOR I=0 TO WX-1 STEP 2
  507. 61030 '  SCC(I)=VD(VW+4+(X*36)+I)
  508. 61031   SCC(I)  = (VD((VW+4+(X*36)+I)/2) AND &H00FF)
  509. 61032   SCC(I+1)=((VD((VW+4+(X*36)+I)/2) AND &HFF00)/256)
  510. 61033   IF (SCC(I)>&H7F) THEN SCC(I)=(SCC(I) OR &HFF00)
  511. 61040 NEXT
  512. 61050 RETURN
  513. 62000 '
  514. 62010 '>>>>> SCC wave data write to VD
  515. 62020 FOR I=0 TO WX-1 STEP 2
  516. 62030 '  POKE VW+4+(X*36)+I,SCC(I)
  517. 62031   VD((VW+4+(X*36)+I)/2)=((SCC(I+1)*256) AND &HFF00)+(SCC(I) AND &H00FF)
  518. 62040 NEXT
  519. 62050 RETURN
  520. 65000 '
  521. 65010 '>>>>> Output on
  522. 65020 POKE &HD80F,1: A=USR(&H988F)
  523. 65030 RETURN
  524. 65100 '
  525. 65110 '>>>>> Output off
  526. 65120 POKE &HD80F,0: A=USR(&H988F)
  527. 65130 RETURN
  528. 65300 '
  529. 65310 '>>>>> Error handler
  530. 65320 GOSUB 40000
  531. 65330 GOSUB 15000
  532. 65331 IF ERR=53 THEN PRINT #1,"File not found. Hit any key.":BEEP: GOTO 65340
  533. 65332 IF ERR=70 THEN PRINT #1,"Disk offline. Hit any key.":BEEP: GOTO 65340
  534. 65333 IF ERR=68 THEN PRINT #1,"Disk write protected. Hit any key.":BEEP: GOTO 65340
  535. 65334 IF ERR=66 THEN PRINT #1,"Disk full. Hit any key.":BEEP: GOTO 65340
  536. 65335 IF ERR=69 THEN PRINT #1,"Disk I/O error. Hit any key.":BEEP: GOTO 65340
  537. 65336 IF ERR=67 THEN PRINT #1,"Too many files. Hit any key.":BEEP: GOTO 65340
  538. 65339 PRINT #1,USING"Err ### in #####. Hit any key.";ERR;ERL:BEEP
  539. 65340 GOSUB 30000
  540. 65350 GOSUB 45000
  541. 65360 IF (ERR>=50 AND ERR<60) OR ERR=19 THEN CLOSE #2
  542. 65390 RESUME 999
  543. 65400 '
  544. 65410 '>>>>> Ctrl+Stop
  545. 65420 POKE &HFD9F,&HC9: FOR I=4 TO 0 STEP -1: POKE &HFD9F+I,PEEK(&HDA2D+I)
  546. 65430 END
  547.