home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MSX Magazine 3
/
MSXMAG3.iso
/
fsw
/
s-cube.lzh
/
s-cube.bas
next >
Wrap
BASIC Source File
|
2004-10-28
|
19KB
|
547 lines
1 ' SAVE"s-cube.bas",A
100 SCREEN 2,,0:CLEAR 500,&HD7FF:DEFUSR=&HD800:COLOR 15,4,4:MAXFILES=2
110 '>>>>> Value initialize
120 DEFINT B-C,E-M,O-X: DEFDBL D
130 DEFSTR N,Y,Z
140 WX = 32: ' X slice (0-31)
150 WY = 128: ' Y slice (0-127)
160 SN = 50: ' Max sound data
165 PN = 10: ' Sound num for Morphing
170 X = 0: ' Editing number
180 M = 0: ' Morphing flag
181 VA = 0 : ' VCD Load offset
182 VN = &H410 : ' VCD Name offset (SCC)
183 VW = &H9B0 : ' VCD Wave offset (SCC)
190 DIM SCC(WX), UD(WX), ST(WX), MS(WX), MD(WX),VD(&H10B8/2): ' Sound data
200 DIM NA$(SN): ' Sound name
210 '--- Dimension value initialize
220 FOR I=0 TO WX
230 SCC(I)=0: UD(I)=0: ST(I)=0: NA$(I)=""
250 NEXT
251 ''--- Voice data clear (RAM)
255 'FOR I=0 TO &H10B7: POKE VA+I,0: NEXT
260 OPEN "grp:" FOR OUTPUT AS #1
300 '>>>>> Title display
310 PRESET(2,2)
320 PRINT #1," SCC Sound Synthesizer"
330 PRINT #1," S-cube version 0.2"
335 PRINT #1," -MuSICA edition-"
340 PRINT #1,""
350 PRINT #1," (c)2002-2004 Wiz."
360 PRINT #1,""
370 PRINT #1," Now loading..."
390 '
400 '>>>>> SCC keyboard routine load
410 FOR I=&HD800 TO &HDA2C: READ N$: POKE I,VAL("&h"+N$): NEXT
415 GOTO 800
420 DATA f3,2a,f8,f7,3a,0f,d8,5f,3e,01,cd,14,00,fb,c9,00
430 DATA dd,2a,7e,d9,3e,03,cd,41,01,e6,01,20,08,dd,6e,00
440 DATA dd,66,01,18,75,3e,03,cd,41,01,e6,08,20,08,dd,6e
450 DATA 02,dd,66,03,18,75,3e,05,cd,41,01,e6,08,20,08,dd
460 DATA 6e,04,dd,66,05,18,75,3e,03,cd,41,01,e6,10,20,08
470 DATA dd,6e,06,dd,66,07,18,75,3e,02,cd,41,01,e6,80,20
480 DATA 08,dd,6e,08,dd,66,09,18,75,3e,04,cd,41,01,e6,08
490 DATA 20,08,dd,6e,0a,dd,66,0b,18,75,3e,03,cd,41,01,e6
500 DATA 80,20,08,dd,6e,0c,dd,66,0d,18,64,3e,04,cd,41,01
510 DATA e6,04,20,08,dd,6e,0e,dd,66,0f,18,53,3e,04,cd,41
520 DATA 01,e6,01,20,08,dd,6e,10,dd,66,11,18,42,3e,02,cd
530 DATA 41,01,e6,04,20,08,dd,6e,12,dd,66,13,18,31,3e,04
540 DATA cd,41,01,e6,02,20,08,dd,6e,14,dd,66,15,18,7e,3e
550 DATA 02,cd,41,01,e6,08,20,08,dd,6e,16,dd,66,17,18,6d
560 DATA 3e,02,cd,41,01,e6,10,20,08,dd,6e,18,dd,66,19,18
570 DATA 5c,3a,7c,d9,47,3e,08,cd,41,01,e6,80,20,1f,78,e6
575 DATA 01,c0,3a,7d,d9,fe,07,c8,3c,32,7d,d9,21,18,00,eb
580 DATA 2a,7e,d9,19,22,7e,d9,3e,01,32,7c,d9,c9,78,e6,fe
590 DATA 32,7c,d9,3e,08,cd,41,01,e6,10,20,3c,78,e6,02,c0
595 DATA 3a,7d,d9,fe,01,c8,3d,32,7d,d9,21,18,00,eb,2a,7e
600 DATA d9,a7,ed,52,22,7e,d9,3e,02,32,7c,d9,c9,7d,e5,21
610 DATA 80,98,cd,07,d8,e1,7c,e5,21,81,98,cd,07,d8,e1,3e
620 DATA 0f,21,8a,98,cd,07,d8,c9,af,32,7c,d9,21,8a,98,cd
630 DATA 07,d8,c9,00,00,00,00,00,00,00,00,00,00,04,c8,d9
680 DATA 5d,0d,9c,0c,e7,0b,3c,0b,9b,0a,02,0a,73,09,eb,08
690 DATA 6b,08,f2,07,80,07,1a,07,af,06,4e,06,f4,05,9e,05
700 DATA 4e,05,01,05,ba,04,76,04,36,04,f9,03,c0,03,8a,03
710 DATA 57,03,27,03,fa,02,cf,02,a7,02,81,02,5d,02,3b,02
720 DATA 1b,02,fd,01,e0,01,c5,01,ac,01,94,01,7d,01,68,01
730 DATA 53,01,40,01,2e,01,1d,01,0d,01,fe,00,f0,00,e3,00
740 DATA d6,00,ca,00,be,00,b4,00,aa,00,a0,00,97,00,8f,00
750 DATA 87,00,7f,00,78,00,71,00,6b,00,65,00,5f,00,5a,00
760 DATA 55,00,50,00,4c,00,47,00,43,00,40,00,3c,00,39,00
770 DATA 35,00,32,00,30,00,2d,00,2a,00,28,00,26,00,24,00
780 DATA 22,00,20,00,1e,00,1c,00,1a,00,c3,10,d8
790 '
800 '>>>>> SCC initialize <<<<<
810 POKE &HD809,1 : ' SCC slot (0-3)
820 POKE &HD80F,&H3F: A=USR(&H9000): ' BANK change
830 POKE &HD80F,&H0 : A=USR(&H988A): ' Volume set (=0)
840 POKE &HD80F,&H1 : A=USR(&H988F): ' Output on
850 '!!!!! Timer intrrupt MUST CHANGE (for Disk Access Routine) !!!!!
860 'POKE &HFDA0,&H10: POKE &HFDA1,&HD0: POKE &HFD9F,&HC3: ' Timer intrrupt
870 FOR I=0 TO 4: POKE &HDA2D+I,PEEK(&HFD9F+I)
880 POKE &HFD9F,&HC9: POKE &HFDA0,&H2A: POKE &HFDA1,&HDA: POKE &HFD9F,&HC3
890 '
900 '>>>>> Handler init
910 ON KEY GOSUB 6000,2000,3000,4000,8000,1000,7000,,9000,5000
915 ON ERROR GOTO 65300
918 ON STOP GOSUB 65400: STOP ON
920 GOSUB 45000: ' Function key interruput on
930 '
940 '>>>>> Keyboard draw
950 GOSUB 55000
999 GOTO 999
1000 '
1010 '>>>>> Save data
1020 GOSUB 40000: ' Function key interrupt off
1030 PRINT #1,"[SAVE] Input file name: ": T=0
1040 PX=24: PY=23: GOSUB 35000: ' Input string
1050 IF T<0 THEN BEEP: GOTO 1980: ' Cancel
1053 NF$=Y$
1055 GOSUB 15000: PRINT #1,"Ok? (1=y/2=n): "
1056 GOSUB 30000: PRESET(120, 184): ' Input char
1057 IF T<0 THEN BEEP: GOTO 1980: ' Cancel
1058 IF T=1 THEN PRINT #1,"y":GOTO 1060 ELSE IF T=2 THEN PRINT #1,"n":GOTO 1980
1059 GOTO 1055
1060 GOSUB 15000: PRINT #1,"Now saving..."
1069 'NF$: FileName,
1070 'BSAVE NF$+".vcd",&HBF80,&HCFFF
1071 COPY VD TO NF$+".vcd"
1980 GOSUB 45000: ' Function key interrupt on
1990 RETURN
2000 '
2010 '>>>>> Number change
2020 GOSUB 40000: ' Function key interrupt off
2030 PRINT #1,USING"Input number (0-##): ";SN-1
2040 PX=21: PY=23: GOSUB 35000: ' Input string
2050 IF T<0 THEN BEEP: GOTO 2980 ELSE T=VAL(Y$)
2060 IF T<0 OR T>=SN THEN BEEP: GOSUB 15000: GOTO 2040
2070 X=T
2970 'GOSUB 61000: ' Wave data read
2980 GOSUB 45000: ' Function key interrupt on
2990 RETURN
3000 '
3010 '>>>>> Synthesize
3020 GOSUB 40000: ' Function key interrupt off
3040 PRINT #1,"Wave synthesize"
3050 GOSUB 25000: ' Wave erase
3060 PRESET(16,8):PRINT #1,"Select wave pattern: "
3070 PRESET(16,16): PRINT #1,"1: `Sine' wave"
3080 PRESET(16,24): PRINT #1,"2: `Square' wave"
3090 PRESET(16,32): PRINT #1,"3: `Triangle' wave"
3100 PRESET(16,40): PRINT #1,"4: `Saw' wave"
3110 PRESET(184,8)
3120 GOSUB 30000: ' Input char
3130 IF T<1 OR T>4 THEN BEEP: IF T<0 THEN 3980 ELSE 3120
3140 IF T=1 THEN PRINT #1,"Sine"
3150 IF T=2 THEN PRINT #1,"Square"
3160 IF T=3 THEN PRINT #1,"Triangle"
3170 IF T=4 THEN PRINT #1,"Saw"
3180 LINE(2,16)-(253,138),4,BF
3190 PT=T: ' Pattern
3200 PRESET(16,16): PRINT #1,USING"Input multiple(1-##): ";FIX(WX/4)
3210 PRESET(200,16): T=8
3220 PX=24: PY=2: GOSUB 35000: ' Input string
3230 ML=VAL(Y$)
3240 IF ML<1 OR ML>FIX(WX/4) THEN BEEP: IF T<0 THEN 3980 ELSE 3170
3250 PRESET(16,24): PRINT #1,USING"Input level(1-###): ";WY-1
3260 PRESET(176,24): T=16
3270 PX=22: PY=3: GOSUB 35000: ' Input string
3280 LV=VAL(Y$)
3290 IF T<0 THEN BEEP: GOTO 3980
3300 IF LV<1 OR LV>=WY THEN BEEP: LINE(2,24)-(253,32),4,BF: GOTO 3240
3310 GOSUB 15000: PRINT #1,"Now calculating..."
3311 GOSUB 61000: ' Wave data read
3315 GOSUB 50000: ' Wave data backup
3320 IF PT=1 THEN 3400: ' Sine wave
3330 IF PT=2 THEN 3450: ' Square wave
3340 IF PT=3 THEN 3550: ' Triangle wave
3350 IF PT=4 THEN 3740: ' Saw wave
3400 '----- Sine wave
3410 FOR I=0 TO WX-1
3420 SCC(I)=SCC(I)+FIX(LV*SIN(I*ML*3.14159/(WX/2)))
3430 NEXT
3440 GOTO 3900
3450 '----- Square wave
3460 BK=-1
3470 FOR I=0 TO WX-1
3480 T=FIX(LV*SIN(I*ML*3.14159/(WX/2)))
3490 IF T=0 THEN IF BK>=0 THEN T=-1 ELSE T=1
3500 BK=T
3510 IF T>0 THEN SIG=1 ELSE SIG=-1
3520 SCC(I)=SCC(I)+(LV*SIG)
3530 NEXT
3540 GOTO 3900
3550 '----- Triangle wave
3560 SP=0
3570 FOR I=1 TO ML
3580 EP=FIX((WX/ML)*I)-1
3585 MX=SP+FIX(((EP+1)-SP)/4): MN=SP+FIX((((EP+1)-SP)/4)*3)
3590 DW=LV/(MX-SP)
3600 FOR J=SP TO MX-1
3610 SCC(J)=SCC(J)+FIX(DW*((J-SP)+1)): ' Up to Max
3620 NEXT
3630 DW=(LV*2)/(MN-MX)
3640 FOR J=MX TO MN-1
3650 SCC(J)=SCC(J)+LV-FIX(DW*((J-MX)+1)): ' Down to Min
3660 NEXT
3670 DW=LV/((EP+1)-MN)
3680 FOR J=MN TO EP
3690 SCC(J)=SCC(J)-LV+FIX(DW*((J-MN)+1)): ' Up to Zero
3700 NEXT
3710 SP=EP+1
3720 NEXT
3730 GOTO 3900
3740 '----- Saw wave
3750 SP=0
3760 FOR I=1 TO ML
3770 EP=FIX((WX/ML)*I)-1: MP=SP+FIX(((EP+1)-SP)/2)
3780 DW=LV/(MP-SP)
3790 FOR J=SP TO MP-1
3800 SCC(J)=SCC(J)+FIX(DW*((J-SP)+1)): 'Up to Max
3810 NEXT
3820 DW=LV/(EP-MP)
3830 FOR J=MP TO EP
3840 SCC(J)=SCC(J)-FIX(DW*(EP-J)): 'Up to Zero
3850 NEXT
3860 SP=EP+1
3870 NEXT
3900 '----- Normalize
3910 T=1
3920 FOR I=0 TO WX-1
3930 IF T<ABS(SCC(I)) THEN T=ABS(SCC(I))
3940 NEXT
3950 FOR I=0 TO WX-1
3960 IF T>(WY-1) THEN SCC(I)=FIX(SCC(I)*((WY-1)/T))
3970 NEXT
3975 GOSUB 62000: ' Wave data write
3980 GOSUB 45000: ' Function key interrupt on
3990 RETURN
4000 '
4010 '>>>>> Morphing
4020 GOSUB 40000: ' Function key interrupt off
4030 GOSUB 25000: ' Wave Erase
4035 T=SN/3+1
4040 FOR I=0 TO T-1
4050 PRESET(2,I*8+2): PRINT #1,USING"##";I
4051 PRESET(20,I*8+2): PRINT #1,USING"@";NA$(I)
4055 PRESET(88,I*8+2): PRINT #1,USING"##";I+T
4056 PRESET(106,I*8+2): PRINT #1,USING"@";NA$(I+T): IF (I+1)*3>=SN THEN 4060
4057 PRESET(174,I*8+2): PRINT #1,USING"##";I+(T*2)
4058 PRESET(192,I*8+2): PRINT #1,USING"@";NA$(I+(T*2))
4060 NEXT
4070 PRESET(0,184): PRINT #1,USING"Source wave (0-##): ";SN-1
4080 PX=20: PY=23: GOSUB 35000: ' Input string
4090 IF T=-1 THEN BEEP: GOTO 4980 ELSE T=VAL(Y$)
4095 IF T<0 OR T>=SN THEN BEEP: GOSUB 15000: GOTO 4070
4100 WS=T
4110 GOSUB 15000: ' Function line erase
4120 PRESET(0,184): PRINT #1,USING"Destination wave (0-##): ";SN-1
4130 PX=25: PY=23: GOSUB 35000: ' Input string
4140 IF T=-1 THEN BEEP: GOTO 4980 ELSE T=VAL(Y$)
4145 IF T<0 OR T>=SN THEN BEEP: GOSUB 15000: GOTO 4120
4150 WD=T
4160 LINE(2,2)-(253,140),4,BF
4170 '----- Wave draw (source)
4175 PRESET(16,130): PRINT #1,USING"##: @";WS,NA$(WS)
4180 T=FIX(2/(WX/32)): IF T=0 THEN T=1
4190 FOR I=0 TO WX-1 STEP 2
4191 MS(I) = (VD((VW+4+(WS*36)+I)/2) AND &H00FF)
4192 MS(I+1)=((VD((VW+4+(WS*36)+I)/2) AND &HFF00)/256)
4193 IF (MS(I)>&H7F) THEN MS(I)=(MS(I) OR &HFF00)
4194 NEXT
4199 FOR I=0 TO WX-1
4200 LINE(32+I*T,64)-(35+I*T,64-FIX(MS(I)/(WY/64))),14,BF
4210 NEXT
4220 LINE(16,64)-(119,64),15
4230 '----- Wave draw (destination)
4235 PRESET(144,130): PRINT #1,USING"##: @";WD,NA$(WD)
4240 FOR I=0 TO WX-1 STEP 2
4241 MD(I) = (VD((VW+4+(WD*36)+I)/2) AND &H00FF)
4242 MD(I+1)=((VD((VW+4+(WD*36)+I)/2) AND &HFF00)/256)
4243 IF (MD(I)>&H7F) THEN MD(I)=(MD(I) OR &HFF00)
4244 NEXT
4249 FOR I=0 TO WX-1
4250 LINE(160+I*T,64)-(163+I*T,64-FIX(MD(I)/(WY/64))),14,BF
4260 NEXT
4270 LINE(144,64)-(247,64),15
4280 GOSUB 15000: ' Function line erase
4290 PRESET(0,184): PRINT #1,"Ok? (1=y/2=n): "
4300 GOSUB 30000: ' Input char
4310 IF T<1 OR T>2 THEN BEEP: IF T<0 THEN 4980 ELSE 4280
4320 IF T<>2 THEN 4350
4330 PRESET(120,184): PRINT #1,"n"
4340 GOTO 4980
4350 PRESET(120,184): PRINT #1,"y"
4360 GOSUB 15000: PRINT #1,"Now calculating..."
4365 T=X: ' Edit number backup
4370 FOR J=0 TO PN-1
4380 FOR I=0 TO WX-1
4390 DW=(MD(I)-MS(I))/(PN-1)
4400 SCC(I)=FIX(MS(I)+(DW*J))
4410 NEXT
4415 X=SN-PN+J:GOSUB 62000: ' Wave data write
4420 NEXT
4425 X=T: ' Edit number restore
4430 NA$(SN-PN)=NA$(WS): NA$(SN-1)=NA$(WD)
4435 T=(SN-PN): GOSUB 7500: T=SN-1: GOSUB 7500
4440 FOR J=1 TO PN-2
4450 NA$(SN-PN+J)="Morph"+STR$(J): K=J: T=2: ' T=Space count
4452 K=K/10: T=T-1: IF K>0 THEN 4452
4453 FOR K=1 TO T: NA$(SN-PN+J)=NA$(SN-PN+J)+" ": NEXT
4455 T=(SN-PN+J): GOSUB 7500
4460 NEXT
4980 GOSUB 45000: ' Function key interrupt on
4990 RETURN
5000 '
5010 '>>>>> Clear
5020 GOSUB 40000: ' Function key interrupt off
5040 PRINT #1,USING"Clear data ##...Ok? (1=y/2=n): ";X
5050 GOSUB 30000: ' Input char
5060 IF T<1 OR T>2 THEN BEEP: IF T<0 THEN 5980 ELSE 5050
5070 IF T<>2 THEN 5100
5080 PRESET(248,184): PRINT #1,"n"
5090 GOTO 5980
5100 PRESET(248,184): PRINT #1,"y"
5110 GOSUB 50000: ' Wave data backup
5120 FOR I=0 TO WX: SCC(I)=0: NEXT
5130 GOSUB 62000: ' Wave data write
5980 GOSUB 45000: ' Function key interrupt on
5990 RETURN
6000 '
6010 '>>>>> Load data
6020 GOSUB 40000: ' Function key interrupt off
6030 PRINT #1,"[LOAD] Input file name: ": T=0
6040 PX=24: PY=23: GOSUB 35000: ' Input string
6050 IF T<0 THEN BEEP: GOTO 6980: ' Cancel
6053 NF$=Y$
6055 GOSUB 15000: PRINT #1,"Ok? (1=y/2=n): "
6056 GOSUB 30000: PRESET(120, 184): ' Input char
6057 IF T<0 THEN BEEP: GOTO 6980: ' Cancel
6058 IF T=1 THEN PRINT #1,"y":GOTO 6060 ELSE IF T=2 THEN PRINT #1,"n":GOTO 6980
6059 GOTO 6055
6060 GOSUB 15000: PRINT #1,"Now loading..."
6070 COPY NF$+".vcd" TO VD
6075 GOSUB 7600 : ' Name read
6080 GOSUB 61000: ' Wave data read
6980 GOSUB 45000: ' Function key interrupt on
6990 RETURN
7000 '
7010 '>>>>> Name change
7020 GOSUB 40000: ' Function key interrupt off
7030 PRINT #1,"Input name: "
7060 PX=12: PY=23: GOSUB 35000: ' Input string
7070 IF T<0 THEN BEEP: GOTO 7090
7080 NA$(X)=Y$
7081 FOR J=I TO 7: NA$(X)=NA$(X)+" ": NEXT
7085 T=X: GOSUB 7500
7090 GOSUB 45000: ' Function key interrupt on
7100 RETURN
7500 '
7510 '>>>>> Name write to VD
7520 FOR I=0 TO 7 STEP 2
7521 POKE VARPTR(VD((VN+(8*T)+I)/2)),ASC(MID$(NA$(T),I+1,1))
7522 POKE VARPTR(VD((VN+(8*T)+I)/2))+1,ASC(MID$(NA$(T),I+2,1))
7540 NEXT
7550 RETURN
7600 '
7610 '>>>>> Name read from VD
7615 FOR J=0 TO SN-1
7616 NA$(J)=""
7620 FOR I=0 TO 7 STEP 2
7621 NA$(J)=NA$(J)+CHR$(PEEK(VARPTR(VD((VN+(8*J)+I)/2))))
7622 NA$(J)=NA$(J)+CHR$(PEEK(VARPTR(VD((VN+(8*J)+I)/2))+1))
7640 NEXT
7645 NEXT
7650 RETURN
8000 '
8010 '>>>>> Undo
8020 GOSUB 40000: ' Function key interrupt off
8030 PRINT #1,"Undo!"
8040 BEEP
8050 FOR I=0 TO WX-1
8060 TMP=SCC(I)
8070 SCC(I)=UD(I)
8080 UD(I)=TMP
8090 NEXT
8970 GOSUB 62000: ' Wave data write
8980 GOSUB 45000: ' Function key interrupt on
8990 RETURN
9000 '
9010 '>>>>> Disp all wave data
9020 GOSUB 40000: ' Function key interrupt off
9030 PRINT #1,"Disp all wave data"
9040 LINE(0,0)-(255,180),4,BF: 'All Erase
9041 DRAW "C15BM24,0R201F2D164G2L201H2U164E2"
9045 T=X: ' Edit number backup
9050 FOR K=1 TO FIX(SN/5)
9051 PRESET(32,16*K-8):PRINT #1,USING"##:";((K-1)*5)
9060 FOR J=0 TO 4
9070 ST=FIX(WX/32)
9075 X=(K-1)*5+J:GOSUB 61000: ' Wave data read
9080 FOR L=0 TO WX-1 STEP ST
9090 LINE(56+32*J+L,16*K-8+2)-(56+32*J+L,16*K-8-FIX(SCC(L)/(WY/8))+2),14
9100 NEXT
9110 LINE(56+32*J,16*K-8+2)-(56+32*J+(WX-1),16*K-8+2),15
9120 NEXT
9130 NEXT
9135 X=T: ' Edit number restore
9140 GOSUB 15000: PRINT #1,"Hit any key"
9150 GOSUB 30000: ' Input char
9155 LINE(0,0)-(255,180),4,BF: 'All erase
9160 GOSUB 55000: ' Keyboard draw
9980 GOSUB 45000: ' Function key interrupt on
9990 RETURN
10000 '
10010 '>>>>> Function line draw
10020 GOSUB 15000: ' Function line erase
10030 PRESET( 0,184): PRINT #1,"Ld/Sv"
10040 PRESET( 46,184): PRINT #1,"Num/Nam"
10050 PRESET(108,184): PRINT #1,"Syn"
10060 PRESET(140,184): PRINT #1,"Mor/Dsp"
10070 PRESET(200,184): PRINT #1,"Und/Clr"
10080 GOSUB 60000: ' SCC wave Write
10090 GOSUB 65000: ' Output On
14990 RETURN
15000 '
15010 '>>>>> Function line erase
15020 LINE(0,184)-(255,191),4,BF
15030 PRESET(0,184)
15040 GOSUB 65100: ' Output off
19990 RETURN
20000 '
20010 '>>>>> Wave draw
20020 GOSUB 25000: ' Wave erase
20025 GOSUB 61000: ' Wave data read
20030 T=FIX(4/(WX/32)): IF T=0 THEN T=1
20040 FOR I=0 TO WX-1
20050 LINE(64+I*T,64)-(67+I*T,64-FIX(SCC(I)/(WY/64))),14,BF
20060 NEXT
20070 LINE(48,64)-(207,64),15
20080 PRESET(16,130): PRINT #1,USING"##: @";X,NA$(X)
24990 RETURN
25000 '
25010 '>>>>> Wave erase
25020 LINE(2,1)-(253,140),4,BF
25030 PRESET(0,0)
29990 RETURN
30000 '
30010 '>>>>> Input char
30020 IF INKEY$<>"" THEN 30020
30030 Y$=INPUT$(1)
30040 IF ASC(Y$)=27 THEN T=-1 ELSE T=VAL(Y$)
34990 RETURN
35000 '
35010 '>>>>> Input string
35020 IF INKEY$<>"" THEN 35020
35030 Y$="":Z$="": PX=PX*8-8: PY=PY*8
35040 FOR I=0 TO 7
35050 PX=PX+8
35060 Z$=INPUT$(1)
35070 IF ASC(Z$)=13 THEN 39990
35080 IF ASC(Z$)=27 THEN T=-1: Y$="": GOTO 39990
35090 IF ASC(Z$)<>8 OR I<1 THEN 35120
35100 LINE(PX-8,PY)-(PX,PY+8),4,BF
35110 Y$=LEFT$(Y$,I-1): I=I-2: PX=PX-16: NEXT
35120 PRESET(PX,PY)
35130 PRINT #1,Z$
35140 Y$=Y$+Z$
35150 NEXT
39990 RETURN
40000 '
40010 '>>>>> Function key interrupt off
40020 GOSUB 15000: ' Fuction line erase
40030 FOR I=1 TO 10: KEY(I) OFF: NEXT
44990 RETURN
45000 '
45010 '>>>>> Function key interrupt on
45020 GOSUB 20000: ' Wave draw
45030 GOSUB 10000: ' Fuction line draw
45040 FOR I=1 TO 10: KEY(I) ON: NEXT
49990 RETURN
50000 '
50010 '>>>>> Wave data backup
50020 FOR I=0 TO WX-1
50030 UD(I)=SCC(I)
50040 NEXT
54990 RETURN
55000 '
55010 '>>>>> Keyboard draw
55020 LINE(24,145)-(215,180),15,BF
55030 LINE(219,164)-(251,180),15,BF
55040 FOR I=48 TO 192 STEP 24: LINE(I,145)-(I,180),1: NEXT
55050 FOR I=40 TO 64 STEP 24: LINE(I,145)-(I+16,165),1,BF: NEXT
55060 FOR I=112 TO 160 STEP 24: LINE(I,145)-(I+16,165),1,BF: NEXT
55070 PRESET(32,170),15: COLOR 1: PRINT #1,"C"
55080 PRESET(56,170),15: COLOR 1: PRINT #1,"V"
55090 PRESET(80,170),15: COLOR 1: PRINT #1,"B"
55100 PRESET(104,170),15: COLOR 1: PRINT #1,"N"
55110 PRESET(128,170),15: COLOR 1: PRINT #1,"M"
55120 PRESET(152,170),15: COLOR 1: PRINT #1,","
55130 PRESET(176,170),15: COLOR 1: PRINT #1,"."
55140 PRESET(200,170),15: COLOR 1: PRINT #1,"/"
55150 PRESET(220,172),15: COLOR 4: PRINT #1,"<-"
55160 PRESET(238,172),15: COLOR 4: PRINT #1,"->"
55170 PRESET(220,165),15: COLOR 4: PRINT #1,"Dn"
55180 PRESET(238,165),15: COLOR 4: PRINT #1,"Up"
55190 LINE(235,164)-(235,180),4
55200 PRESET(44,155),1: COLOR 15: PRINT #1,"F"
55210 PRESET(68,155),1: COLOR 15: PRINT #1,"G"
55220 PRESET(116,155),1: COLOR 15: PRINT #1,"J"
55230 PRESET(140,155),1: COLOR 15: PRINT #1,"K"
55240 PRESET(164,155),1: COLOR 15: PRINT #1,"L"
55500 '
55510 '>>>>> Border draw
55520 DRAW "C15BM2,0R251F2D138G2L251H2U138E2"
59990 RETURN
60000 '
60010 '>>>>> SCC wave data write
60020 P=0
60030 FOR I=&H9800 TO &H981F
60040 POKE &HD80F,VAL("&H"+RIGHT$(HEX$(SCC(P)),2)): A=USR(I)
60050 P=P+1
60060 NEXT
60070 RETURN
61000 '
61010 '>>>>> SCC wave data read from VD
61015 'IF X>49 THEN END
61020 FOR I=0 TO WX-1 STEP 2
61030 ' SCC(I)=VD(VW+4+(X*36)+I)
61031 SCC(I) = (VD((VW+4+(X*36)+I)/2) AND &H00FF)
61032 SCC(I+1)=((VD((VW+4+(X*36)+I)/2) AND &HFF00)/256)
61033 IF (SCC(I)>&H7F) THEN SCC(I)=(SCC(I) OR &HFF00)
61040 NEXT
61050 RETURN
62000 '
62010 '>>>>> SCC wave data write to VD
62020 FOR I=0 TO WX-1 STEP 2
62030 ' POKE VW+4+(X*36)+I,SCC(I)
62031 VD((VW+4+(X*36)+I)/2)=((SCC(I+1)*256) AND &HFF00)+(SCC(I) AND &H00FF)
62040 NEXT
62050 RETURN
65000 '
65010 '>>>>> Output on
65020 POKE &HD80F,1: A=USR(&H988F)
65030 RETURN
65100 '
65110 '>>>>> Output off
65120 POKE &HD80F,0: A=USR(&H988F)
65130 RETURN
65300 '
65310 '>>>>> Error handler
65320 GOSUB 40000
65330 GOSUB 15000
65331 IF ERR=53 THEN PRINT #1,"File not found. Hit any key.":BEEP: GOTO 65340
65332 IF ERR=70 THEN PRINT #1,"Disk offline. Hit any key.":BEEP: GOTO 65340
65333 IF ERR=68 THEN PRINT #1,"Disk write protected. Hit any key.":BEEP: GOTO 65340
65334 IF ERR=66 THEN PRINT #1,"Disk full. Hit any key.":BEEP: GOTO 65340
65335 IF ERR=69 THEN PRINT #1,"Disk I/O error. Hit any key.":BEEP: GOTO 65340
65336 IF ERR=67 THEN PRINT #1,"Too many files. Hit any key.":BEEP: GOTO 65340
65339 PRINT #1,USING"Err ### in #####. Hit any key.";ERR;ERL:BEEP
65340 GOSUB 30000
65350 GOSUB 45000
65360 IF (ERR>=50 AND ERR<60) OR ERR=19 THEN CLOSE #2
65390 RESUME 999
65400 '
65410 '>>>>> Ctrl+Stop
65420 POKE &HFD9F,&HC9: FOR I=4 TO 0 STEP -1: POKE &HFD9F+I,PEEK(&HDA2D+I)
65430 END