プログラムリスト
SYS/SBWAV

トップメニュー「SmileBASICでプログラムを作る」から、LOAD"SYS/SBWAV"↵でプログラムが読み込まれます。
キーボードの「EDIT」キーを押すと、このプログラムが自由に編集できます。

'
' WAVE EDITOR (C)SmileBoom
'
' 8bit/16384sample
' single wave only
'
MAXSP=256:MAXBG=2:BGZ=300:SPZ=200:GRZ=100
XSCREEN 2,MAXSP,MAXBG
VER=1:RP1=15:RP2=2
FOR I=0 TO 7:BREPEAT I,RP1,RP2:NEXT
OFFC=8:SELC=9:GC=14:WC=15
LGC=RGB(16,16,16):GGC=RGB(64,64,64)
FOR I=0 TO 1
 DISPLAY I:VISIBLE 1,1,1,1:CLS
 COLOR WC,0:GPAGE I,I:GPRIO 500
 SPPAGE 2:BGPAGE 5:SPCLR
NEXT

'=======
' reset
'=======
@WORKRESET
MAXBW=30:BWCNT=0:BWPAGE=1
_X=0:_Y=1:_W=2:_H=3:_D=4:_S=5:_MAX=6
DIM BWORK%[MAXBW,_MAX],BSUB$[MAXBW]

'--- default wavedata
WVSIZE=16384
WVC=RGB(255,255,255)
WVZ=(100/128):WEZ=(128/100)
DIM WV%[WVSIZE]
'GOSUB @FCLEAR
GOSUB @FSINWAVE
'GOSUB @FPULSEWAVE

'=========
' restart
'=========
@RESTART
BWCNT=0

'---
BNO=224 'BEEP index
'---
BIT=0   '0=8bit,1=16bit
RATE=0  '0=8180,1=10910,2=16360,3=32730
WLEN=2  'wave length(sec)
'---
NOTE=66+12 'base note 66+(6*S)
EGA=127 'eg attack
EGD=127 'eg decay
EGS=127 'eg susteen
EGR=127 'eg release

'--- HI
DISPLAY 0:VISIBLE 1,1,1,1:GPAGE 0,0:GCLS
SPCLIP 8,0,400-9,239
C=RGB(16,64,128)
GRID 8,16,400-8,240-24,32,10,C,0,0
HCY=116
GLINE 0,HCY,399,HCY,RGB(0,0,192)
GOSUB @PUTSTAT

'--- wave view sprite x2
SPW=512:SPH=200
FOR P=0 TO 1
 SPSET P,0,P*SPH,SPW,SPH,1
 SPOFS P,P*SPW+8,16,SPZ
 SPCOLOR P,RGB(128,200,200,200)
 SPSHOW P
NEXT
GOSUB @ALLWVPUT

'---
CSP=2:COFS=0:CX=0:CY=16:CW=64:CH=200
SPSET CSP,0,SPH*2,1
SPCOLOR CSP,RGB(64,255,0,0)
GOSUB @CSRPUT

'--- LO
DISPLAY 1:VISIBLE 1,1,1,1:GPAGE 1,1
GCLS RGB(32,32,48)
GFILL 240,0,319,239,RGB(32,32,32)
'
EDY=4:EDZM=1:EDST=POW(2,5+EDZM)
TBOX 0,EDY-1,34,27,0,"","",""
LCY=100+(EDY*8)
'
OLDOFS=-1:SLDX=1:SLDY=1:SLDW=38
TBOX SLDX-1,SLDY-1,SLDW+2,3,0,"","","@SLD"
'
FOR X=0 TO 31
 S$="":IF (X AND 7)==0 THEN S$=""
 C=14:IF (X DIV 8) AND 1 THEN C=12
 COLOR C
 FOR Y=0 TO (CH DIV 8)-1
  LOCATE X+1,Y+EDY:PRINT S$;
 NEXT
NEXT
COLOR 15
'
TBOX 34, 4,6,3,0,"","CUT","@CUTF"
TBOX 34, 7,6,3,0,"","CUT","@CUTB"
'
TBOX 34,11,6,6,0,""," 32","@ZM"
TBOX 34,17,6,3,0,"","REPT","@REPT"
GC=5
TBOX 34,22,6,3,0,"","PLAY","@PLAY"
GC=3
TBOX 34,27,6,3,0,"","REC","@REC"
GC=14

'---
OLDCX=-1:OLDSCRL=0

'=============
' wave change
'=============
@WVCHANGE
GOSUB @ALLWVPUT
GOSUB @CSRPUT
GOSUB @EDWAVPUT
GOSUB @PUTOFS

'===========
' main loop
'===========
@MLOOP
BRP=BUTTON(1)
SFT=BUTTON(0) AND &H300
STICK OUT STX,STY
GOSUB @STKSUB
TOUCH OUT TCS,TCX,TCY
GOSUB @TCHSUB
GOSUB @HITMAIN
GOSUB @CSRMOVE
GOSUB @CSRPUT
GOSUB @WVEDIT
'---
IF OLDZM!=EDZM THEN GOSUB @EDWAVPUT
OLDZM=EDZM
'---
FC=FC+1
VSYNC 1
'--- :PLAY
IF BRP AND &H10 THEN GOSUB @PLAYBEEP
'--- :RECORD
IF BRP AND &H20 THEN GOSUB @RECORD
'--- :FILE
IF BRP==&H80 THEN GOSUB @FILE:GOTO @RESTART
'--- :EXIT
IF BRP==&H40 THEN EXITSW=TRUE
IF EXITSW==FALSE THEN @MLOOP

'======
' EXIT
'======
DISPLAY 0:VISIBLE 1,0,0,0:CLS
PRINT "EXIT":TXLINEB
K$=GETKEY$("ARE YOU SURE?[Y/N]")
IF K$!="Y" THEN
 EXITSW=FALSE
 GOTO @RESTART
ENDIF
K$=GETKEY$("DATA SAVE[Y/N]")
IF K$=="Y" THEN GOSUB @FSAVE
'---
EXEC "SYS/SBSMILE"
END

'========
' cursor
'========
@CSRPUT
DISPLAY 0
SPOFS CSP,CX+8,CY,-256
SPSCALE CSP,EDST/16,CH/16
A=64+(MAINCNT AND 31)
SPCOLOR CSP,RGB(A,255,0,0)
RETURN

'---
@CSRMOVE
VX=SVX*(EDST)
IF VX!=0 THEN
 CX=(CX DIV EDST)*EDST
ELSE
 IF BRP AND 4 THEN VX=VX-1
 IF BRP AND 8 THEN VX=VX+1
ENDIF
'---
CX=CX+FLOOR(VX):OVX=0:MX=400-16-EDST
IF CX<0 THEN CX=0:OVX=VX
IF CX>MX THEN CX=MX:OVX=VX
'---
COFS=COFS+OVX:MX=WVSIZE-(400-16)
IF COFS<0 THEN COFS=0
IF COFS>MX THEN COFS=MX
'---
IF OLDX==COFS+CX THEN RETURN
GOSUB @MAKEWAV
OLDX=COFS+CX
'---
GOSUB @EDWAVPUT
'---
@PUTOFS
DISPLAY 0
S$=RIGHT$("     "+STR$(COFS),5)
S$=S$+"/"+RIGHT$("     "+STR$(COFS+CX),5)
S$=S$+"/"+RIGHT$(" "+STR$(EDST),3)
S$=S$+"("+STR$(WVSIZE)+")"
LOCATE 50-LEN(S$),0:PRINT S$;
RETURN

'
' GET & CONVERT WAVEDATA
'
@GETWAV
WY=WV%[IX]
IF WY<0 THEN WY=0
IF WY>255 THEN WY=255
WY=(WY-128)*WVZ
RETURN

'=============
' PUT ALLWAVE
'=============
@ALLWVPUT
OX=COFS:SX=384:C=0
GOSUB @MKWAVSUB
'--- cursor sprite x1
GPAGE 0,2
X=0:Y=SPH*2
GFILL X,Y,X+15,Y+15,RGB(255,255,255)
GPAGE 0,0
RETURN

'
' make upper wave
'
@MAKEWAV
BX=OLDOFS:SX=COFS-BX
IF SX==0 THEN RETURN
'---
IF SX>0 THEN
 C=0:OX=BX+384
ELSE
 C=0:OX=BX+SX
ENDIF
SX=ABS(SX)
'---
@MKWAVSUB
DISPLAY 0
GPAGE 0,2
IX=OX:C=RGB(64,C,C,C)
FOR I=0 TO SX-1
 X=IX AND 511
 P=(((IX DIV 512) AND 1)*SPH)
 GLINE X,P,X,P+SPH-1,C
 IF IX<WVSIZE THEN
  GOSUB @GETWAV
  GLINE X,P+100,X,P+100+WY,WVC
 ENDIF
 IX=IX+1
NEXT
GPAGE 0,0
'---
OX=COFS AND 511
PG=(COFS DIV 512) AND 1
OX=-OX
FOR I=0 TO 1
' PRINT OX;"/";PG;",";
 SPCHR I,0,PG*SPH,SPW,SPH,1
 SPOFS I,OX+8,16
 PG=(PG+1) AND 1
 OX=OX+SPW
NEXT
'---
OLDSCRL=COFS
RETURN

'
' in IX:
'
@SETLINE
DISPLAY 0
GPAGE 0,2
C=RGB(64,0,0,0)
X=IX AND 511
P=(((IX DIV 512) AND 1)*SPH)
GLINE X,P,X,P+SPH-1,C
GOSUB @GETWAV
GLINE X,P+100,X,P+100+WY,WVC
GPAGE 0,0
RETURN

'==============
' PUT EDITWAVE
'==============
@EDWAVPUT
DISPLAY 1:GCLS LGC
W=(32*8) DIV EDST
FOR I=0 TO EDST-1
 X=8+I*W:IX=COFS+CX+I
 IF IX<WVSIZE THEN
  GOSUB @GETWAV
  C=RGB(220,220,220)
  IF I AND 1 THEN C=RGB(192,192,200)
  GFILL X,LCY,X+W-1,WY+LCY,C
 ELSE
  GFILL X,LCY,X+W-1,LCY,RGB(0,0,0)
 ENDIF
NEXT
RETURN

'======
' edit
'======
@WVEDIT
IF TCS==0 THEN RETURN
'---
EX=TTX-1:EY=TCY-LCY
IF TCY<EDY*8-4 THEN RETURN
IF TCX>34*8 THEN RETURN
IF EY<-100 THEN EY=-100
IF EY> 100 THEN EY= 100
IF EX< 0 THEN EX= 0
IF EX>31 THEN EX=31
'---
EX=TCX-8:IF EX<0 THEN RETURN
W=1:IF EDST>0 THEN W=8 DIV (EDST DIV 32)
EX=EX DIV W
IF SFT THEN EX=(EX DIV 2)*2
'---
DISPLAY 1
IF EY<-100 THEN EY=-100
IF EY> 100 THEN EY= 100
GFILL EX,LCY,EX+7,EY+LCY,RGB(255,0,0)
'---
IX=COFS+CX+EX
IF IX<WVSIZE THEN
 WV%[IX]=EY*WEZ+&H80
 IF WV%[IX]<0 THEN WV%[IX]=0
 IF WV%[IX]>255 THEN WV%[IX]=255
ENDIF
'---
GOSUB @SETLINE
GOSUB @EDWAVPUT
RETURN

'=============
' side slider
'=============
@SLDTOUCH
XX=TTX-1
IF XX<0 || XX>37 THEN RETURN
IF TTY>1 THEN RETURN
COFS=XX*(WVSIZE DIV SLDW)
IF COFS>WVSIZE-400 THEN COFS=WVSIZE-400
OLDOFS=-1:GOSUB @SLDPUT
GOSUB @ALLWVPUT
RETURN
'---
@SLDPUT
DISPLAY 1
XX=COFS+CX
IF OLDOFS!=XX THEN
 LOCATE SLDX,SLDY:PRINT" "*SLDW
 XX=XX DIV (WVSIZE DIV SLDW)
 LOCATE SLDX+XX,SLDY:PRINT""
ENDIF
OLDOFS=COFS
RETURN

'======
' ZOOM
'======
@ZMPUT
FOR I=0 TO 3
 LOCATE X,Y-2+I
 C=0:S$="":IF I==EDZM THEN C=9:S$=""
 COLOR 15,C
 PRINT S$;RIGHT$(" "+STR$(POW(2,5+I)),3)
 COLOR 15,0
NEXT
RETURN
'---
@ZMTOUCH
IF TCS!=1 THEN RETURN
I=TTY-(Y+1)
IF I<0 || I>3 THEN RETURN
EDZM=I
EDST=POW(2,5+EDZM)
GOSUB @PUTOFS
RETURN

'===========
' CUT FRONT
'===========
@CUTFTOUCH
IF TCS!=1 THEN RETURN
S=COFS+CX
IF S==0 THEN RETURN
COPY WV%,0,WV%,S,WVSIZE-S
FOR I=0 TO S-1
 WV%[WVSIZE-1-I]=128
NEXT
GOSUB @ALLWVPUT
GOSUB @EDWAVPUT
RETURN

'==========
' CUT BACK
'==========
@CUTBTOUCH
IF TCS!=1 THEN RETURN
S=COFS+CX+EDST
IF S>=WVSIZE THEN RETURN
FOR I=0 TO (WVSIZE-S)-1
 WV%[S+I]=128
NEXT
GOSUB @ALLWVPUT
GOSUB @EDWAVPUT
RETURN

'=============
' REPEAT COPY
'=============
@REPTTOUCH
IF TCS!=1 THEN RETURN
S=WVSIZE DIV EDST
FOR I=1 TO S-1
 COPY WV%,I*EDST,WV%,0,EDST
NEXT
GOSUB @ALLWVPUT
GOSUB @EDWAVPUT
RETURN

'======
' PLAY
'======
@PLAYTOUCH
IF TCS!=1 THEN RETURN
WAVSETA BNO,EGA,EGD,EGS,EGR,WV%,NOTE
BGMPLAY "@224L8O3CDEFGAB<CDEFGAB<CDEFGAB"
RETURN

'===========
' BEEP PLAY
'===========
@PLAYBEEP
WAVSETA BNO,EGA,EGD,EGS,EGR,WV%,NOTE
BEEP BNO
RETURN

'========
' RECORD
'========
@RECTOUCH
IF TCS!=1 THEN RETURN
@RECORD
DISPLAY 0
VISIBLE 1,0,0,0:CLS
XON MIC '1ビョウタタナイト ロクオンデキナイ
'--- 
PRINT "RECORDING":TXLINEB
FOR I=0 TO 2
 PRINT "READY:";3-I
 WAIT 60
NEXT
'---
PRINT "RECORD START"
MICSTART RATE,BIT,WLEN
WAIT WLEN*60
MICSAVE WV%
PRINT "RECORD END"
XOFF MIC
'---
VISIBLE 1,1,1,1:CLS
GOSUB @ALLWVPUT
GOSUB @EDWAVPUT

'---
@PUTSTAT
DISPLAY 0
BW=BWCNT
TBOX 0,1,50,27,0,"","",""
LOCATE 0,29
PRINT "/=SCROLL =BEEP ";
PRINT "=FILE =EXIT";
LOCATE 0,0
PRINT "WAVE editor ";
PRINT FORMAT$("ver%.2F",VER)
BWCNT=BW
RETURN


'==========
' hit main
'==========
@HITMAIN
BVX=0:BVY=0
IF BRP AND 1 THEN BVY=BVY-1
IF BRP AND 2 THEN BVY=BVY+1
IF BRP AND 4 THEN BVX=BVX-1
IF BRP AND 8 THEN BVX=BVX+1
'
FOR IH=0 TO BWCNT-1
 
 DISPLAY 1
 GETWORK IH OUT X,Y,W,H,D,S$
 '
 J$=S$+"BUT":GOSUB @PROC
 J$=S$+"STICK":GOSUB @PROC
 '
 IF D!=0 && TCS>0 THEN
  IF TTX>=X AND TTX<X+W THEN
   IF TTY>=Y AND TTY<Y+H THEN
    J$=S$+"TOUCH":GOSUB @PROC
   ENDIF
  ENDIF
 ENDIF
 '
 X=X+1:Y=Y+3:H=H-4
 J$=S$+"PUT":GOSUB @PROC
 '
NEXT
RETURN
'
@HITINIT
FOR IH=0 TO BWCNT-1
 
 DISPLAY 1
 GETWORK IH OUT X,Y,W,H,D,S$
 '
 IF D==0 THEN CONTINUE
 IF S$=="" THEN CONTINUE
 '
 X=X+1:Y=Y+3:H=H-4
 J$=S$+"PUT":GOSUB @PROC
 '
NEXT
RETURN

'====================
' stick repeat check
'====================
@STKSUB
SVX=0:SVY=0
IF STX<-0.2 THEN SVX=-1
IF STX> 0.2 THEN SVX=1
IF STY<-0.2 THEN SVY=1
IF STY> 0.2 THEN SVY=-1
IF SVX==0 && SVY==0 THEN STC=0:RETURN
'
STC=STC+1
IF STC==1 THEN RETURN
'
I=STC-RP1
IF I>=0 && (I MOD RP2)==0 THEN RETURN
'
SVX=0:SVY=0
RETURN

'===============
' touch convert
'===============
@TCHSUB
TTX=TCX DIV 8:TTY=TCY DIV 8
RETURN

'==============
' check & call
'==============
@PROC
IF CHKLABEL(J$)==TRUE THEN GOSUB J$
RETURN

'=================
' cmd:text button
'=================
DEF TBOX X,Y,W,H,S,C$,T$,S$
 '
 BWORK%[BWCNT,0]=X
 BWORK%[BWCNT,1]=Y
 BWORK%[BWCNT,2]=W
 BWORK%[BWCNT,3]=H
 BWORK%[BWCNT,4]=DISPLAY()
 BWORK%[BWCNT,5]=(C$=="")
 BSUB$[BWCNT]=S$
 BWCNT=BWCNT+1
 '
 W=W-2:IF W<0 THEN W=0
 H=H-2:IF H<0 THEN H=0
 OX=X:OY=Y
 
 '--- window & caption
 COLOR GC,0
 LOCATE X,Y:PRINT ""+""*W+"";:Y=Y+1
 IF C$!="" THEN
  LOCATE X,Y:PRINT ""+" "*W+"";:Y=Y+1
  LOCATE X,Y:PRINT ""+""*W+"";:Y=Y+1
  COLOR WC,0
  LOCATE X+1,Y-2:PRINT C$;
  COLOR GC,0
  H=H-2:IF H<0 THEN H=0
 ENDIF
 FOR I=0 TO H-1
  LOCATE X,Y:PRINT ""+" "*W+"";:Y=Y+1
 NEXT
 LOCATE X,Y:PRINT ""+""*W+"";
 
 '--- slider
 IF S!=0 THEN
  X=X+W-1:Y=OY+2:IF C$=="" THEN Y=OY
  YY=Y
  '
  LOCATE X,Y:PRINT "";:Y=Y+1
  LOCATE X,Y:PRINT "";:Y=Y+1
  LOCATE X,Y:PRINT "";:Y=Y+1
  FOR I=0 TO H-5
   LOCATE X,Y:PRINT " ";:Y=Y+1
  NEXT
  LOCATE X,Y:PRINT "";:Y=Y+1
  LOCATE X,Y:PRINT "";:Y=Y+1
  LOCATE X,Y:PRINT "";
  '
  COLOR WC,0
  LOCATE X+1,YY+3:PRINT "";
  
 ENDIF
 
 '--- text
 COLOR WC,0
 IF T$!="" THEN
  X=OX+1:Y=OY+3:IF C$=="" THEN Y=OY+1
  LOCATE X,Y:PRINT T$;
 ENDIF
 '
END

'====================
' cmd:get text value
'====================
DEF GETWORK I OUT X,Y,W,H,D,S$
 X=BWORK%[I,0]
 Y=BWORK%[I,1]
 W=BWORK%[I,2]
 H=BWORK%[I,3]
 D=BWORK%[I,4]
 '--- caption
 IF BWORK%[I,5]==FALSE THEN
  Y=Y+2:H=H-2
 ENDIF
 S$=BSUB$[I]:IF S$=="" THEN S$="@DEF"
END

'===================
' cmd:put grid line
'===================
DEF GRID GTX,GTY,GEX,GEY,GW,GH,GC,OX,OY
 GTX=GTX-OX:GTY=GTY-OY
 FOR YY=GTY TO GEY STEP GH
  GLINE GTX,YY,GEX,YY,GC
 NEXT
 FOR XX=GTX TO GEX STEP GW
  GLINE XX,GTY,XX,GEY,GC
 NEXT
END

'========================
' cmd:touch repeat check
'========================
DEF TCHREP()
 IF TCS==1  THEN RETURN TRUE
 IF TCS<RP1 THEN RETURN FALSE
 R=(TCS-RP1) MOD RP2
 IF R==0 THEN RETURN TRUE
 RETURN FALSE
END

'==============
' FILE UTILITY
'==============
@FILE
DISPLAY 0:VISIBLE 1,0,0,0:CLS
PRINT "FILE UTILITY":TXLINEB
'
PRINT "'L'=LOAD"
PRINT "'S'=SAVE"
PRINT "'C'=CLEAR"
PRINT "'W'=SINWAVE"
PRINT "'P'=PULSEWAVE"
PRINT "'X'=EXIT"
TXLINE
'
@FUTLOOP
K$=GETKEY$("command?[L/S/C/W/X]")
J$=""
IF K$=="L" THEN J$="@FLOAD"
IF K$=="S" THEN J$="@FSAVE"
IF K$=="C" THEN J$="@FCLEAR"
IF K$=="W" THEN J$="@FSINWAVE"
IF K$=="P" THEN J$="@FPULSEWAVE"
IF K$=="X" THEN EXITSW=TRUE
'---
IF J$!="" && CHKLABEL(J$) THEN GOSUB J$
'---
@FEND
VISIBLE 1,1,1,1
GOSUB @PUTSTAT
DISPLAY 1:CLS
RETURN

'=======
' CLEAR
'=======
@FCLEAR
FOR S=0 TO WVSIZE-1
 WV%[S]=&H80 'center
NEXT
RETURN

'=========
' SINWAVE
'=========
@FSINWAVE
FOR S=0 TO WVSIZE-1
' A=SIN(RAD((360/(WVSIZE/512))*S))
 A=SIN(RAD((360/(WVSIZE/16))*S))
 A=A*((1/WVSIZE)*(WVSIZE-S))
' A=SIN(RAD(S*12))
' A=A+SIN(RAD((360/WVSIZE)*S))
' A=A*0.5
 WV%[WVTOP+S]=A*127+&H80
NEXT
RETURN

'===========
' PULSEWAVE
'===========
@FPULSEWAVE
DIM VV[2]:VV[0]=1:VV[1]=-1
AA=-1
FOR S=0 TO WVSIZE-1
 A=VV[(S DIV 16) AND 1]
 A=A*((1/WVSIZE)*(WVSIZE-S))
 WV%[S]=A*127+&H80
NEXT
RETURN

'======
' SAVE
'======
@FSAVE
PRINT "SAVE":TXLINEB
N$=GETNAME$()
IF N$!="" THEN SAVESUB N$
RETURN
'---
DEF SAVESUB NM$
 SAVE NM$,WV%
END

'======
' LOAD
'======
@FLOAD
PRINT "LOAD":TXLINEB
N$=GETNAME$()
IF N$!="" THEN LOADSUB N$
RETURN

'---
DEF LOADSUB NM$
 LOAD NM$,WV%
END

'==========
' GET NAME
'==========
DEF GETNAME$()
 LINPUT "filename?:";F$
 IF F$!="" THEN F$="DAT:WAV_"+F$
 RETURN F$
END

'=======
' ERROR
'=======
DEF ERROR T$
 BEEP:COLOR 3
 K$=GETKEY$( T$ )
 COLOR 15
END

'============
' GET NUMBER
'============
DEF GETNUM( T$,V,MIN,MAX )
'
IF V<MIN THEN V=MIN
IF V>MAX THEN V=MAX
'
PRINT T$;"(";MIN;"-";MAX;"/";V;"):";
X=CSRX:Y=CSRY
'
@GNLOOP
VSYNC 1:LOCATE X,Y:LINPUT K$
IF K$=="" THEN N=V ELSE N=VAL(K$)
LOCATE X,Y:PRINT " "*LEN(K$);
IF N<MIN || N>MAX THEN @GNLOOP
'
LOCATE X,Y:PRINT N
RETURN N
END

'=========
' GET KEY
'=========
DEF GETKEY$( T$ )
'
PRINT T$;"(";CHR$(&HE20D);"):";
X=CSRX:Y=CSRY
'
@GKLOOP
VSYNC 1:LOCATE X,Y:LINPUT K$
K$=MID$(K$,0,1)
IF K$=="" THEN @GKLOOP
'
IF K$>="a" && K$<="z" THEN
 K$=CHR$((ASC(K$)-ASC("a"))+ASC("A"))
ENDIF
'
LOCATE X,Y:PRINT K$:TXLINE
RETURN K$
END

'===========
' TEXT LINE
'===========
DEF TXLINE
COLOR 14:PRINT "-"*50:COLOR 15
END
DEF TXLINEB
COLOR 14:PRINT ""*50:COLOR 15
END