プログラムリスト
SYS/EX8TECDEMO

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

'
' EXAMPLE8 
' テクニカルデモ  
'

SELMAX=12
DIM MENU$[SELMAX]
DIM SUBTI$[SELMAX]

GOSUB @SWINIT

XMODE=0
GOSUB @SCRNINIT

'--- MAIN

MSEL=0
WHILE 1
 
 SEL=MSEL
 RESTORE @MENUMAIN
 GOSUB @SELECT
 IF SEL<0 THEN CONTINUE
 
 MSEL=SEL   'BACK UP
 
 ON SEL GOSUB @TESTCNSL,@TESTGRP,@TESTBG,@TESTSP,@TESTSND,@TESTSTR,@TESTCALC,@TESTTRY,@TESTFILE,@TESTPRG,@TESTOTHER,@MINIDEMO
 
WEND

'--- CONSOLE
@TESTCNSL
WHILE 1
 
 RESTORE @MENUCNSL
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTXSCR2,@TESTXSCR4,@TESTCOLOR,@TESTLOCATE,@TESTATTR,@TESTSCROLL,@TESTFONTDEF,@TESTVISIBLE
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- SPRITE
@TESTSP
SEL=0
WHILE 1
 
 RESTORE @MENUSP
 GOSUB @SELECT
 IF SEL<0 THEN BREAK

 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTSPOFS,@TESTSPCLIP,@TESTSPROT,@TESTSPSCALE,@TESTSPCOLOR,@TESTSPCHR,@TESTSPANIM,@TESTSPCOL,@TESTSPLINK
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- GRAPHICS
@TESTGRP
SEL=0
WHILE 1
 
 RESTORE @MENUGRP
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTGPAGE,@TESTGCLIP,@TESTRGB,@TESTCIRCLE,@TESTFILL,@TESTPAINT,@TESTGCOPY,@TESTGPRIO,@TESTGSAVE
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- BG
@TESTBG
SEL=0
WHILE 1
 
 RESTORE @MENUBG
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTBGPUT,@TESTBGOFS,@TESTBGCLIP,@TESTBGROT,@TESTBGSCALE,@TESTBGANIM,@TESTBGSAVE
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- STRINGS
@TESTSTR
SEL=0
WHILE 1
 
 RESTORE @MENUSTR
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTCHR,@TESTVAL,@TESTHEX,@TESTFORMAT,@TESTLEN,@TESTINSTR,@TESTMID,@TESTSUBST
 
 GOSUB @HITANYBTN
 
WEND
RETURN

'--- CALC
@TESTCALC
SEL=0
WHILE 1
 
 RESTORE @MENUCALC
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTFLOOR,@TESTABS,@TESTSGN,@TESTMIN,@TESTRND,@TESTSQR,@TESTEXP,@TESTSORT,@TESTSHIFT
 
 GOSUB @HITANYBTN
 
WEND
RETURN

'--- FILE
@TESTFILE
SEL=0
WHILE 1
 
 RESTORE @MENUFILE
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTCHKF,@TESTFILES,@TESTSAVE
 
 GOSUB @HITANYBTN
 
WEND
RETURN

'--- PROGRAM
@TESTPRG
SEL=0
WHILE 1
 
 RESTORE @MENUPRG
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTPGET,@TESTPSET,@TESTINS,@TESTDEL
 
 GOSUB @HITANYBTN
 
WEND
RETURN

'--- SIN/COS
@TESTTRY
SEL=0
WHILE 1
 
 RESTORE @MENUSIN
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTRAD,@TESTSIN,@TESTTAN,@TESTATAN,@TESTASIN,@TESTSINH
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- SOUND
@TESTSND
SEL=0
WHILE 1
 
 RESTORE @MENUSND
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTBEEP,@TESTBGMPLAY,@TESTBGMSTOP,@TESTWAVSET,@TESTBGMSET,@TESTBGMVOL,@TESTTALK,@TESTEFC,@TESTEFC2
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- OTHER
@TESTOTHER
SEL=0
WHILE 1
 
 RESTORE @MENUOTHER
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @TESTGYRO,@ACCEL,@EXPAD,@TESTMIC,@TESTDLG,@MPTEST,@SPEEDTEST,@TESTSYSTEM
 
 GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--- MINI DEMO
@MINIDEMO
SEL=0
WHILE 1
 
 RESTORE @MENUDEMO
 GOSUB @SELECT
 IF SEL<0 THEN BREAK
 
 A$=MENU$[SEL]
 IF A$=="EXIT" THEN BREAK
 PY=0
 GOSUB @BGPRTCTR
 
 ON SEL GOSUB @DEMO1,@DEMO2,@DEMO3
 
' GOSUB @HITANYBTN
 GOSUB @SCRNINIT
 
WEND
RETURN

'--------------
'0 うえがめん(3D) & したがめん ミシヨウ
'1 うえがめん(2D) & したがめん ミシヨウ
'2 うえがめん(3D) & したがめん シヨウ
'3 うえがめん(2D) & したがめん シヨウ
'4 うえがめん(2D)+したがめん ケツゴウ
'
@TESTXSCR2

XMODE=2
GOSUB @SCRNINIT
GOSUB @BSKIPON

PY=1
A$="XSCREEN 2"
GOSUB @BGPRTCTR

PY=12
A$="3D MODE"
GOSUB @BGPRTCTR

DISP=0   'うえがめん
SPMAX=64
GOSUB @SPINITMAX
GOSUB @BGDUMMY1
GOSUB @GRPINIT

FOR SPN=0 TO SPMAX-1
 X=RND(GRW)
 Y=RND(GRH)
 Z=RND(1024+256)-256

 U=RND(32)*16
 V=RND(14)*16+32
 W=16
 H=16
 SPCHR SPN,U,V,W,H

 SPOFS SPN,X,Y,Z
NEXT

DISP=1   'したがめん
SPMAX=64
GOSUB @SPINITMAX

GOSUB @SPINIT0
GOSUB @BGDUMMY1
GOSUB @GRPINIT

FOR SPN=0 TO SPMAX-1
 X=RND(GRW)
 Y=RND(GRH)
 Z=RND(1024+256)-256

 U=RND(32)*16
 V=RND(14)*16+32
 W=16
 H=16
 SPCHR SPN,U,V,W,H
 SPOFS SPN,X,Y,Z
NEXT

X=200
X2=160
Y=120
Y2=120
Z=0
FOR I=0 TO 800
 X=X+SGN(400-I)/2
 X2=X2-SGN(400-I)/2

 DISPLAY 0   'うえがめん
 SCL=COS(RAD(I*2))+1   '0-2
 Z=1024-(SCL*1280/2)
 BGOFS BGN,X,Y,Z
 BGROT BGN,I MOD 360
 BGSCALE BGN,SCL,SCL

 GOSUB @PRTBGXYZ

 DISPLAY 1   'したがめん
 BGOFS BGN,X2,Y2,Z
 BGROT BGN,I MOD 360
 SCL=COS(RAD(I*2))+1
 BGSCALE BGN,SCL,SCL

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
NEXT

WAIT 60

XMODE=0
GOSUB @SCRNINIT

PY=1
A$="XSCREEN 0"
GOSUB @BGPRTCTR
CLS

RETURN

'---
@TESTXSCR4

XMODE=4
GOSUB @SCRNINIT
GOSUB @BSKIPON

PY=1
A$="XSCREEN 4"
GOSUB @BGPRTCTR

PY=12
A$="2D MODE"
GOSUB @BGPRTCTR

SPMAX=128
GOSUB @SPINITMAX
GOSUB @BGDUMMY1

FOR SPN=0 TO SPMAX-1
 X=RND(GRW)
 Y=RND(GRH)
 Z=RND(1024+256)-256

 U=RND(32)*16
 V=RND(14)*16+32
 W=16
 H=16
 SPCHR SPN,U,V,W,H
 SPOFS SPN,X,Y,Z
NEXT

X=160
Y=120
FOR I=0 TO 800
 BGROT BGN,I MOD 360
 SCL=COS(RAD(I*2))+1  '0-2
 Z=1024-(SCL*1280/2)
 Y=Y+SGN(400-I)
 BGOFS BGN,X,Y,Z
 BGSCALE BGN,SCL,SCL

 GOSUB @PRTBGXYZ
 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
NEXT

WAIT 60

XMODE=0
GOSUB @SCRNINIT

PY=1
A$="XSCREEN 0"
GOSUB @BGPRTCTR
CLS

RETURN

'------------
@PRTBGXYZ
LOCATE 0,10,-100
PRINT "  BG X=";FORMAT$("%4D",X)
PRINT "  BG Y=";FORMAT$("%4D",Y)
PRINT "  BG Z=";FORMAT$("%4D",Z)
RETURN

'----------
@SCRNINIT
XSCREEN XMODE
VISIBLE 1,1,1,1
GPAGE 0,0
BGMSTOP

DISP=0
GOSUB @GRPINIT
GOSUB @BGINITMSG
RETURN
'------------

@BGDUMMY1
BGN=1

@BGDUMMY
IF XMODE==4 THEN
 BGW=320/16
 BGH=480/16
ELSE
 IF DISP==0 THEN
  BGW=400/16  'うえ がめん
 ELSE
  BGW=320/16  'した がめん
 ENDIF
 BGH=240/16
ENDIF

DISPLAY DISP
BGSCREEN BGN,BGW,BGH
BGHOME BGN,BGW*16/2,BGH*16/2
BGOFS BGN,BGW*16/2,BGH*16/2

FOR Y=0 TO BGH-1
 FOR X=0 TO BGW-1
  C=99+RND(3)
  BGPUT BGN,X,Y,C
 NEXT
NEXT

RETURN

'--- 
@TESTCOLOR
FOR I=0 TO 15
 COLOR 15
 LOCATE 5,I+5,0
 PRINT "COLOR ";FORMAT$("%2D",I);

 GOSUB @ARROW

 COLOR I
 PRINT "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
NEXT

RETURN

'--- 
@TESTATTR

RESTORE @ATTRTABLE
I=0
LOCATE 0,6,0

WHILE 1
 READ ATR
 IF ATR<0 THEN BREAK
 ATTR 0
 PRINT "           ";
 PRINT "ATTR ";ATR;
 GOSUB @ARROW
 ATTR ATR
 PRINT "R"
 PRINT ""
 ATTR 0
WEND
RETURN

@ATTRTABLE
DATA 0  'TURN 0
DATA 1  'TURN 90
DATA 2  'TURN 180
DATA 3  'TURN 270
DATA 4  'FRIP H
DATA 8  'FRIP V
DATA -1

'--- 
@TESTSCROLL

RESTORE @SCRLTABLE

WHILE 1
 READ X1,Y1
 IF X1==0 AND Y1==0 THEN BREAK
 READ NUM

 A$="SCROLL "
 A$=A$+FORMAT$("%2D",X1)+","
 A$=A$+FORMAT$("%2D",Y1)
 PY=2
 GOSUB @BGPRTCTR

 FOR I=0 TO 500
  LOCATE RND(50),RND(30),0
  PRINT CHR$(&H41+RND(26));
 NEXT
 WAIT 30
 FOR I=1 TO NUM
  SCROLL X1,Y1
  VSYNC 3
  BT=STKANDBTN()
  IF BT AND 32 THEN BREAK
 NEXT
 IF BT AND 32 THEN BREAK
WEND
CLS
RETURN

@SCRLTABLE
DATA  0, 1,30
DATA  0,-1,30
DATA  1, 0,50
DATA -1, 0,50
DATA  0, 0,0

'--------------
@TESTFONTDEF

C=58090    'CHR CODE

RESTORE @FONTDATA

A$=""
FOR Y=0 TO 7
 READ D$
 FOR X=0 TO 7
  IF MID$(D$,X,1)!=" " THEN
   A$=A$+"FFFF"
  ELSE
   A$=A$+"0000"
  ENDIF
 NEXT
NEXT

LOCATE 0,5,0
PRINT "A$=";CHR$(34);A$;CHR$(34)
PRINT ""
PRINT "FONTDEF ";C;",A$"
FONTDEF C,A$

PRINT ""
PRINT "PRINT CHR$(";C;")";
GOSUB @ARROW
PRINT CHR$(C)
RETURN

@FONTDATA
DATA "        "
DATA " 1   1  "
DATA "        "
DATA "        "
DATA "1     1 "
DATA " 1   1  "
DATA "  111   "
DATA "        "

'--- LOCATE
@TESTLOCATE
FOR I=0 TO 20
 X=250/8
 Y=I+3
 Z=1024-(I*(1024+256)/20)

 LOCATE X-20,Y,Z
 COLOR 7
 PRINT "LOCATE ";
 PRINT FORMAT$("%2D",X);",";
 PRINT FORMAT$("%2D",Y);",";
 PRINT FORMAT$("%4D",Z);
 GOSUB @ARROW

 LOCATE X,Y,Z
 COLOR 15
 PRINT "A";
NEXT
RETURN

'--- VISIBLE
@TESTVISIBLE
SPN=0
SPSET SPN,0,144
SPSCALE SPN,3,3
SPHOME SPN,8,8
SPOFS SPN,200,120,-100

BGN=1
BGFILL BGN,3,4,400/16-4,240/16-4,99
BGOFS BGN,0,0,300

LOCATE 3,12,0
PRINT "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

GOSUB @BSKIPON

RESTORE @VSBLDATA

WHILE 1

 READ P1,P2,P3,P4
 IF P1==-1 THEN BREAK

 LOCATE 0,4,0
 PRINT " VISIBLE ";
 PRINT P1;",";P2;",";P3;",";P4
 GOSUB @ARROW2

 VISIBLE P1,P2,P3,P4 'TEXT,GRP,BG,SP

 FOR I=1 TO 90
  BT=STKANDBTN()
  IF BT AND 32 THEN BREAK
  VSYNC 1
 NEXT
 IF BT AND 32 THEN BREAK
WEND
VISIBLE 1,1,1,1
GOSUB @BSKIPOFF

RETURN

@VSBLDATA
DATA 1,1,1,1
DATA 1,0,0,0
DATA 1,0,0,1
DATA 1,0,1,0
DATA 1,1,0,0
DATA 1,1,1,1
DATA -1,-1,-1,-1

'--- CHR$
@TESTCHR

FOR I=0 TO 255
 X=(I MOD 16)+30
 Y=FLOOR(I/16)+7
 Z=0
 LOCATE X,Y,Z
 PRINT CHR$(I)
NEXT

COLOR 13
FOR I=0 TO 15
 LOCATE 28-3,I+7,Z
 PRINT "&H";HEX$(I);"0:"

 LOCATE I+30,5,Z
 PRINT HEX$(I)
NEXT
COLOR 15

LOCATE 0,6,Z
RESTORE @CHRTABLE
WHILE 1
 READ X
 IF X<0 THEN BREAK
 PRINT "   ";
 PRINT "CHR$(&H";FORMAT$("%-4X",X);")";
 GOSUB @ARROW
 PRINT CHR$(X)
WEND
RETURN

@CHRTABLE
DATA 33
DATA 64
DATA 65
DATA 97
DATA 12354
DATA 12355
DATA 12356
DATA 12357
DATA 12450
DATA 12451
DATA 12452
DATA 12453
DATA 8657
DATA 8658
DATA 58007
DATA 58111
DATA 57860
DATA 57861
DATA -1

'--- GPAGE
@TESTGPAGE
RESTORE @GPAGETABLE 

WHILE 1
 READ X
 IF X<0 THEN BREAK

 PY=1
 A$=" "*20
 GOSUB @BGPRTCTR

 READ A$
 A$="PAGE "+STR$(X)+":"+A$
 GOSUB @BGPRTCTR

 GCLIP 0,0,16*2,399,239
 GPAGE X,X

 FOR I=1 TO 120
  BT=STKANDBTN()
  IF BT AND 32 THEN BREAK
  VSYNC 1
 NEXT
 IF BT AND 32 THEN BREAK
WEND
RETURN

@GPAGETABLE 
DATA 0,"DEFAULT PAGE"
DATA 4,"SPRITE DATA"
DATA 5,"BG DATA"
DATA 0,"DEFAULT PAGE"
DATA -1

'--- GCLIP
@TESTGCLIP
I=96
X1=(GRW/2)-I
X2=(GRW/2)+I
Y1=(GRH/2)-I
Y2=(GRH/2)+I
GCLIP 0,X1,Y1,X2,Y2

FOR I=1 TO 50
 GOSUB @RNDCOLOR
 X1=RND(240)
 Y1=RND(240)
 X2=RND(400)
 Y2=RND(240)
 GLINE X1,Y1,X2,Y2,C
NEXT

RETURN

'--- RGB
@TESTRGB
PY=2
A$="RGB(R,G,B)"
GOSUB @BGPRTCTR

FOR I=1 TO 8
 X=3
 Y=5+I
 Z=0
 GOSUB @RNDCOLOR
 LOCATE X,Y,Z
 PRINT "RGB(";
 PRINT FORMAT$("%3D",R);",";
 PRINT FORMAT$("%3D",G);",";
 PRINT FORMAT$("%3D",B);")";

 GOSUB @ARROW

 PRINT "&H";HEX$(C)
 GFILL 260,Y*8,360,Y*8+7,C
NEXT
RETURN

'-----------
@RNDCOLOR
R=RND(256)
G=RND(256)
B=RND(256)
C=RGB(R,G,B)
RETURN

'--- GCIRCLE
@TESTCIRCLE

FOR I=1 TO 50
 GOSUB @RNDCOLOR
 X=RND(200)+100
 Y=RND(100)+60
 R=RND(50)+10
 GCIRCLE X,Y,R,C
NEXT

RETURN

'--- GFILL
@TESTFILL
PY=2
A$="GFILL    GBOX"
GOSUB @BGPRTCTR

FOR I=1 TO 50
 GOSUB @RNDCOLOR
 X1=RND(100)+50
 Y1=RND(150)+60
 X2=RND(100)+50
 Y2=RND(150)+60

 GFILL X1,Y1,X2,Y2,C
 GBOX X1+200,Y1,X2+200,Y2,C
NEXT
RETURN

'--- GPAINT
@TESTPAINT
GCLS

FOR I=1 TO 25
 GOSUB @RNDCOLOR
 X1=RND(360)+32
 Y1=RND(170)+48
 X2=RND(360)+32
 Y2=RND(170)+48
 GBOX X1,Y1,X2,Y2,C
NEXT

FOR I=1 TO 100
 GOSUB @RNDCOLOR
 X=RND(300)+48
 Y=RND(170)+48
 GPAINT X,Y,C
NEXT
RETURN

'--- GCOPY
@TESTGCOPY

X=20:Y=80
W=100:H=100
GOSUB @GRPRNDFILL

X1=X:Y1=Y:X2=X+W-1:Y2=Y+H-1
LOCATE X1/8,Y1/8-2
PRINT "コピー モト"

WAIT 30

X3=150:Y3=Y1
GCOPY 0,X1, Y1, X2,Y2, X3, Y3, 0
LOCATE X3/8,Y3/8-2
PRINT "コピー サキ MODE 0"

X3=280:Y3=Y1
GCOPY 0,X1, Y1, X2,Y2, X3, Y3, 1
LOCATE X3/8,Y3/8-2
PRINT "コピー サキ MODE 1"

RETURN

'--- GFILL
@GRPRNDFILL

X1=X:Y1=Y
X2=X+W-1:Y2=Y+H-1
GFILL X1,Y1,X2,Y2,0

FOR I=0 TO 10
 GOSUB @RNDCOLOR
 X1=RND(W)+X
 Y1=RND(H)+Y
 X2=RND(W)+X
 Y2=RND(H)+Y
 GFILL X1,Y1,X2,Y2,C
NEXT

RETURN

'--- GSAVE
@TESTGSAVE

X=20:Y=80
W=100:H=100
GOSUB @GRPRNDFILL

DIM GBUFF[W*H]

PG=0  'G PAGE
FLAG=1  'へんかん あり
'FLAG=0  'へんかん なし
X=20
Y=80
W=100
H=100

'ハイレツ ニ ホゾン
GSAVE PG,X,Y,W,H,GBUFF,FLAG

GFILL 200,0,399,239,RGB(128,128,128)

FLAG=1  'ろんりしょく
'FLAG=0  'ぶつりしょく
MODE=0 'トウメイ
'MODE=1 'くろ コピー
X=250
GLOAD X,Y,W,H,GBUFF,FLAG,MODE

RETURN

'----------
@TESTBGSAVE

GOSUB @BGDUMMY1

C=0
BGFILL BGN,13,0,BGW-1,BGH-1,C

X=0
Y=0
W=8
H=8

DIM BGBUFF[W*H]

BGSAVE BGN,X,Y,W,H,BGBUFF

WAIT 120
X=250/16
Y=3
BGLOAD BGN,X,Y,W,H,BGBUFF

RETURN

'--- GPRIO
@TESTGPRIO

SPMAX=21
GOSUB @SPINITMAX

LOCATE 0,4,-255
FOR I=0 TO SPMAX-1
 X=200
 Y=I*8+32
 Z=1024-(I*(1024+256)/20)
 IF Z>1023 THEN Z=1023
 SPOFS I,X,Y,Z
NEXT
LOCATE 0,3,-256
FOR I=0 TO SPMAX-1
 Z=1024-(I*(1024+256)/20)
 PRINT "    GPRIO ";Z
 GPRIO Z
 FOR J=1 TO 60
  BT=STKANDBTN()
  IF BT AND 32 THEN BREAK
  VSYNC 1
 NEXT
 IF BT AND 32 THEN BREAK
NEXT
WAIT 60
PRINT "    GPRIO 1024"
GPRIO 1024
RETURN

'---- SPRITE INIT
@SPINITMAX
FOR SPN=0 TO SPMAX-1
 GOSUB @SPINIT
NEXT
RETURN

@SPINIT0
SPN=0

@SPINIT
DISPLAY DISP
U=0
V=144
SPW=16
SPH=16

IF XMODE==4 THEN
 GRW=320   'WIDTH
 GRH=480   'HEIGHT
ELSE
 IF DISP==0 THEN
  GRW=400   'WIDTH
 ELSE
  GRW=320   'WIDTH
 ENDIF
 GRH=240   'HEIGHT
ENDIF

SPSET SPN,U,V,SPW,SPH
SPHOME SPN,SPW/2,SPH/2
SPOFS SPN,GRW/2,GRH/2,-100

RETURN

'-----------
@TESTBGPUT

GOSUB @BGDUMMY1
BGCLR BGN

C=96
FOR Y=0 TO 5
 FOR X=0 TO 11
  BGPUT BGN,X*2+1,Y*2+2,C
  LOCATE X*4+2,Y*4+6
  PRINT C
  C=C+1
 NEXT
NEXT

RETURN

'--------------
@TESTBGOFS

DIM BZ[4]
DIM BX[4]

FOR BGN=0 TO 3
 BGW = (400*2)/16
 BGH = 240/16
 BGSCREEN BGN,BGW,BGH
 BGHOME BGN,0,0
NEXT

FOR BGN=0 TO 3
 FOR X=0 TO BGW-1
  Y=11-(BGN*2)
  FOR I=Y TO 14
   C=609+(BGN MOD 2)*3
   IF I>Y THEN C=C+32
   BGPUT BGN,X,I,C
  NEXT
 NEXT

 MSG=BGN
 PY=BGN+1
 A$="BG LAYER "+STR$(BGN)
 GOSUB @BGPRTCTR
NEXT

GOSUB @BSKIPON

BX[0]=0
BX[1]=0
BX[2]=0
BX[3]=0

BZ[0]=-256
BZ[1]=-192
BZ[2]=0
BZ[3]=768

X1=0.5
FOR I=0 TO 10*60

 FOR BGN=0 TO 3
  X=BX[BGN]
  X=X+(4-BGN)*X1
  IF X>=400 OR X<=0 THEN X1=-X1
  BX[BGN]=X
  Y=0
  Z=BZ[BGN]
  BGOFS BGN,X,Y,Z
 NEXT

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK
 VSYNC 1
NEXT

MSG=0

FOR BGN=0 TO 3
 BGOFS BGN,0,0
NEXT
GOSUB @BSKIPOFF
RETURN

'--------------
@TESTBGCLIP

GOSUB @BGDUMMY1

I=96
X1=(BGW*16/2)-I
X2=(BGW*16/2)+I
Y1=(BGH*16/2)-I
Y2=(BGH*16/2)+I
BGCLIP BGN,X1,Y1,X2,Y2

X=200
Y=120
TM=120
BGANIM BGN,"XY",1,X,Y,-TM,X-200,Y,-TM,X,Y,0

RETURN

'-------------
@TESTBGSCALE

GOSUB @BGDUMMY1
GOSUB @BSKIPON

X=200
Y=120
Z=0
BGOFS BGN,X,Y,Z

X=1
X1=-0.002

WHILE X<2
 X=X+X1
 IF X<0.2 THEN X1=-X1
 BGSCALE BGN,X,X

 PY=2
 A$="SCALE:"+FORMAT$("%.3F",X)
 GOSUB @BGPRTCTR

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK
 VSYNC 1
WEND

WAIT 15
GOSUB @BSKIPOFF

RETURN

'--- BGROT
@TESTBGROT

GOSUB @BGDUMMY1
GOSUB @BSKIPON

X=200
Y=120
Z=0
BGOFS BGN,X,Y,Z

FOR ANG=0 TO 360
 BGROT BGN, (ANG MOD 360)

 PY=2
 A$="ANGLE:"+STR$(ANG)+" DEG."
 GOSUB @BGPRTCTR

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
NEXT

WAIT 15
GOSUB @BSKIPOFF

RETURN

'--- BGANIM
@TESTBGANIM

GOSUB @BGDUMMY1

TM=120
X=200
Y=120
BGN=1
BGANIM BGN,"XY",TM,X,Y,-TM,400,240,-TM,X,Y,999

RETURN
'--- SPOFS
@TESTSPOFS
SPMAX=21
GOSUB @SPINITMAX

FOR I=0 TO 20
 X=200
 Y=I*8+40-16
 Z=1024-(I*(1024+256)/20)

 SPOFS I,X,Y,Z

 LOCATE X/8-10,Y/8,Z
 COLOR 7
 PRINT "Z=";
 PRINT FORMAT$("%4D",Z);
 GOSUB @ARROW
NEXT
RETURN

'--- SPCLIP
@TESTSPCLIP

GOSUB @SPINIT0

I=96
X1=(GRW/2)-I
X2=(GRW/2)+I
Y1=(GRH/2)-I
Y2=(GRH/2)+I
SPCLIP X1,Y1,X2,Y2

SCL=2    'SCALE
SPSCALE SPN,SCL,SCL

TM=60    'TIME
X=200
Y=120
LPCNT=0
SPANIM SPN,"XY",TM,X,Y,-TM,X1,Y1,-TM,X2,Y2,-TM,X,Y,LPCNT

RETURN

'--- SPROT
@TESTSPROT

SPMAX=3
GOSUB @SPINITMAX

GOSUB @BSKIPON

FOR SPN=0 TO SPMAX-1

 X=SPN*120+80
 Y=120
 SPOFS SPN,X,Y
 GLINE X-32,Y,X+32,Y,RGB(255,255,0)
 GLINE X,Y-32,X,Y+32,RGB(255,255,0)

 Z=0
 SPHOME SPN,SPN*8,SPN*8
 LOCATE X/8-2,Y/8+5,Z
 PRINT "SPHOME"
 LOCATE X/8-2,Y/8+6,Z
 PRINT "X:";SPN*8
 LOCATE X/8-2,Y/8+7,Z
 PRINT "Y:";SPN*8

NEXT

FOR ANG=0 TO 360
 FOR SPN=0 TO SPMAX-1
  SCL=2
  SPSCALE SPN,SCL,SCL
  SPROT SPN,ANG
 NEXT

 PY=2
 A$="ANGLE:"+FORMAT$("%3D",ANG)+" DEG."
 GOSUB @BGPRTCTR

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
NEXT
GOSUB @BSKIPOFF

RETURN

'--- SPSCALE
@TESTSPSCALE

SPMAX=3
GOSUB @SPINITMAX

GOSUB @BSKIPON

FOR SPN=0 TO SPMAX-1

 X=SPN*120+80
 Y=120
 SPOFS SPN,X,Y
 GLINE X-32,Y,X+32,Y,RGB(255,255,0)
 GLINE X,Y-32,X,Y+32,RGB(255,255,0)

 Z=0
 SPHOME SPN,SPN*8,SPN*8
 LOCATE X/8-2,Y/8+5,Z
 PRINT "SPHOME"
 LOCATE X/8-2,Y/8+6,Z
 PRINT "X:";SPN*8
 LOCATE X/8-2,Y/8+7,Z
 PRINT "Y:";SPN*8

NEXT

SCL=1
X1=-0.004

WHILE SCL<3
 SCL = SCL+X1
 IF SCL<0.5 THEN X1=-X1

 FOR SPN=0 TO SPMAX-1
  SPSCALE SPN,SCL,SCL
 NEXT

 PY=2
 A$="SCALE:"+FORMAT$("%.3F",SCL)
 GOSUB @BGPRTCTR

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
WEND
GOSUB @BSKIPOFF

RETURN

'--------------
@SPCLRMAX
FOR SPN=0 TO SPMAX
 SPCLR SPN
NEXT
RETURN

'--------------
@TESTSPCOLOR

SPMAX=6
GOSUB @SPINITMAX

RESTORE @SPCOLORTABLE

FOR SPN=0 TO SPMAX-1
 READ ALPHA,R,G,B
 IF ALPHA<0 THEN BREAK

 IF ALPHA==255 THEN
  C=RGB(R,G,B)
 ELSE
  C=RGB(ALPHA,R,G,B)
 ENDIF

 X=100
 Y=SPN*32+40

 SCL=2   'SCALE
 SPOFS SPN,X,Y
 SPSCALE SPN,SCL,SCL
 SPCOLOR SPN,C

 LOCATE X/8+3,Y/8,0
 PRINT "RGB(";
 IF ALPHA!=255 THEN
  PRINT FORMAT$("%3D",ALPHA);",";
 ENDIF
 PRINT FORMAT$("%3D",R);",";
 PRINT FORMAT$("%3D",G);",";
 PRINT FORMAT$("%3D",B);")";
NEXT
RETURN

@SPCOLORTABLE
DATA 255,255,  0,  0
DATA 255,  0,255,  0
DATA 255,  0,  0,255
DATA  64,255,255,255
DATA 128,255,255,255
DATA 255,255,255,255
DATA -1,-1,-1,-1

RETURN
'--------------
@TESTSPCHR

SPMAX=6*3
GOSUB @SPINITMAX

FOR SPN=0 TO SPMAX-1
 SCL=2    'SCALE
 SPSCALE SPN,SCL,SCL
NEXT

FOR NUM=0 TO 2
 RESTORE @SPCHRTABLE

 FOR I=0 TO 5
  READ ATR
  IF ATR<0 THEN BREAK
  ATR=ATR OR 1  'VISIBLE

  SPN=(NUM*6)+I
  X=32+(I*64)
  Y=NUM*72+32
  U=0
  V=NUM*16+144

  Z=0
  SPOFS SPN,X,Y
  SPCHR SPN,U,V,SPW,SPH,ATR
  LOCATE X/8-3,Y/8+2,Z
  PRINT "U=";U
  LOCATE X/8-3,Y/8+3,Z
  PRINT "V=";V
  LOCATE X/8-3,Y/8+4,Z
  PRINT "ATTR=";ATR
  X=X+64
 NEXT
NEXT
RETURN

@SPCHRTABLE
DATA 0  'TURN0
DATA 2  'TURN90
DATA 4  'TURN180
DATA 6  'TURN270
DATA 8  'FRIP H
DATA 16 'FRIP V
DATA -1

'--------------
@TESTSPCOL

SPMAX=8
GOSUB @SPINITMAX

GOSUB @BSKIPON

FOR SPN=0 TO SPMAX-1
 SPCOL SPN,-SPW/2,-SPH/2,SPW,SPH,1
 X=SPN*32+64
 Y=120
 Z=0
 SPOFS SPN,X,Y
 SCL=2
 SPSCALE SPN,SCL,SCL
 IF SPN THEN LOCATE X/8,Y/8+2,Z:PRINT SPN
NEXT

ANG=0
SPN=0
FOR I=0 TO 15*60

 X=COS(RAD(ANG))*96+200
 Y=SIN(RAD(ANG*4))*48+120
 Z=0
 SPOFS SPN,X,Y,Z
 ANG=ANG+0.4
 IF ANG>=360 THEN ANG=ANG-360

 A$="SPHITSP:"
 A$=A$+FORMAT$("%3D",SPHITSP(SPN))

 PY=2
 GOSUB @BGPRTCTR

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
NEXT

CLS
RETURN

'--------------
@TESTSPANIM

SPMAX=4
GOSUB @SPINITMAX

SCL=2   'SCALE
FOR SPN=0 TO SPMAX-1
 SPSCALE SPN,SCL,SCL
NEXT

TM=120   'TIME
X=100
Y=48
Z=0
LPCNT=0    'LOOP COUNT
SPN=0
SPANIM SPN,"XY",TM,X,Y,TM,X+200,Y,LPCNT
LOCATE X/8,Y/8+2,Z
PRINT "XY ホカン ナシ"

Y=Y+48
SPN=SPN+1
SPANIM SPN,"XY",TM,X,Y,-TM,X+200,Y,LPCNT
LOCATE X/8,Y/8+2,Z
PRINT "XY ホカン アリ"

Y=Y+48
SPN=SPN+1
SPANIM SPN,"XY",TM,X,Y,-TM,X+200,Y,LPCNT
SPANIM SPN,"UV",8,U,V,8,U+16,V,8,U+32,V,LPCNT
LOCATE X/8,Y/8+2,Z
PRINT "XY ホカン アリ + UV"

Y=Y+48
SPN=SPN+1
SPANIM SPN,"XY",TM,X,Y,-TM,X+200,Y,LPCNT
SPANIM SPN,"R",TM,0,-TM,360,LPCNT
SPANIM SPN,"UV",8,U,V,8,U+16,V,8,U+32,V,LPCNT
LOCATE X/8,Y/8+2,Z
PRINT "XY ホカン アリ + UV + R ホカン アリ"

RETURN

'---------------
@TESTSPLINK

SPMAX=5
GOSUB @SPINITMAX

GOSUB @BSKIPON

FOR SPN=1 TO SPMAX-1
 X=0
 Y=16
 Z=0
 SPOFS SPN,X,Y,Z
NEXT

LOCATE 0,6,0
FOR SPN=1 TO SPMAX-1
 SPLINK SPN,SPN-1
 PRINT " SPLINK ";SPN;",";SPN-1
NEXT

FOR SPN=0 TO SPMAX-1
 FOR I=0 TO 360 STEP 4
  SPOFS SPN OUT X,Y
  X=X+COS(RAD(I))*3
  SPOFS SPN,X,Y

  LOCATE 0,SPN*2+15,0
  PRINT " SPOFS ";SPN;
  PRINT ",";
  PRINT FORMAT$("%3D",X);
  PRINT ",";
  PRINT FORMAT$("%3D",Y);

  BT=STKANDBTN()
  IF BT AND 32 THEN BREAK
  VSYNC 1
 NEXT
 IF BT AND 32 THEN BREAK
NEXT

GOSUB @BSKIPOFF

RETURN

'--- VAL
@TESTVAL
RESTORE @VALTABLE
LOCATE 0,6,0
WHILE 1
 READ A$
 IF A$=="" THEN BREAK

 PRINT "    ";
 PRINT "VAL(";CHR$(34);A$;CHR$(34);")";
 GOSUB @ARROW
 PRINT VAL(A$)
WEND
RETURN

@VALTABLE
DATA "1"
DATA "123456"
DATA "&H12"
DATA "&HFF"
DATA "ABC"
DATA "ア"
DATA ""

'--- HEX$
@TESTHEX
LOCATE 0,4
FOR I=-1 TO 20
 PRINT "        ";
 PRINT "HEX$(";FORMAT$("%2D",I);")";
 GOSUB @ARROW
 PRINT HEX$(I)
NEXT
RETURN

'--- FORMAT$
@TESTFORMAT

RESTORE @FORMATTABLE

FOR I=0 TO 99
 READ A$
 IF A$=="" THEN BREAK
 READ NUM

 Y=4+I*2
 LOCATE 4,Y
 PRINT "FORMAT$(";
 PRINT CHR$(34);A$;CHR$(34);
 PRINT ",";NUM;")";

 LOCATE 30,Y
 GOSUB @ARROW
 PRINT FORMAT$(A$,NUM)
NEXT
RETURN

@FORMATTABLE
DATA "%D",1234
DATA "%X",1234
DATA "%8D",1234
DATA "%8X",1234
DATA "%08D",1234
DATA "%-8D",1234
DATA "%+8D",1234
DATA "% 8D",1234
DATA "%F",1234.5678
DATA "%.2F",1234.5678
DATA "%6.2F",1234.5678
DATA ""

'------------------
@TESTLEN

RESTORE @LENTABLE

FOR I=0 TO 99
 READ A$
 IF A$=="" THEN BREAK

 LOCATE 5,6+I*2
 PRINT "LEN(";
 PRINT CHR$(34);A$;CHR$(34);
 PRINT ")";
 LOCATE 30,6+I*2
 GOSUB @ARROW
 PRINT LEN(A$)
NEXT
RETURN

@LENTABLE
DATA "A"
DATA "ABC"
DATA "ABCDEF"
DATA "ABCDEFGHI"
DATA ""

'------------------
@TESTINSTR
RESTORE @INSTRTABLE
LOCATE 0,6
WHILE 1
 READ A$
 IF A$=="" THEN BREAK
 READ B$

 PRINT "    INSTR(";
 PRINT CHR$(34);A$;CHR$(34);",";
 PRINT CHR$(34);B$;CHR$(34);
 PRINT ")";
 GOSUB @ARROW
 PRINT INSTR(A$,B$)
 PRINT ""
WEND
RETURN

@INSTRTABLE
DATA "ABCDEF","A"
DATA "ABCDEF","ABC"
DATA "ABCDEF","CDE"
DATA "ABCDEF","XYZ"
DATA ""

'---LEFT$/RIGHT$/MID$
@TESTMID

LOCATE 0,2
A$="ABCDE"
NUM=3
FOR I=0 TO 5
 PRINT "     MID$(";
 PRINT CHR$(34);A$;CHR$(34);",";
 PRINT I;",";NUM;")";

 GOSUB @ARROW

 PRINT MID$(A$,I,NUM)
NEXT

A$="LEFT$"
PY=5
GOSUB @BGPRTCTR
LOCATE 0,PY*2+2

FOR I=0 TO 5
 PRINT "     LEFT$(";
 PRINT CHR$(34);A$;CHR$(34);",";
 PRINT I;")";
 GOSUB @ARROW
 PRINT LEFT$(A$,I)
NEXT

A$="RIGHT$"
PY=10
GOSUB @BGPRTCTR
LOCATE 0,PY*2+2

FOR I=0 TO 5
 PRINT "     RIGHT$(";
 PRINT CHR$(34);A$;CHR$(34);",";
 PRINT I;")";

 GOSUB @ARROW

 PRINT RIGHT$(A$,I)
NEXT
RETURN

'--- SUBST
@TESTSUBST
A$="ABCDEFGHI"
LOCATE 0,6
RESTORE @SUBSTTABLE

WHILE 1
 READ I
 IF I<0 THEN BREAK
 READ NUM
 READ B$

 PRINT "  SUBST$(";
 PRINT CHR$(34);A$;CHR$(34);
 PRINT ",";I;",";NUM;",";
 PRINT CHR$(34);B$;CHR$(34);
 PRINT ")";
 GOSUB @ARROW
 PRINT SUBST$(A$,I,NUM,B$)
 PRINT ""
WEND
RETURN

@SUBSTTABLE
DATA 0,3,"XYZ"
DATA 3,3,"XYZ"
DATA 3,3,"X"
DATA 3,3,"UVWXYZ"
DATA 6,3,"XYZ"
DATA 9,3,"XYZ"
DATA -1

'--- FLOOR
@TESTFLOOR
A$="FLOOR   ROUND   CEIL"
PY=2
GOSUB @BGPRTCTR

LOCATE 0,6

FOR I=0 TO 20
 X=I/10
 PRINT " FLOOR(";
 PRINT FORMAT$("%1.1F",X);")";

 GOSUB @ARROW

 PRINT FLOOR(X);
 PRINT "   ROUND(";
 PRINT FORMAT$("%1.1F",X);")";

 GOSUB @ARROW

 PRINT ROUND(X);
 PRINT "   CEIL(";
 PRINT FORMAT$("%1.1F",X);")";

 GOSUB @ARROW

 PRINT CEIL(X)
NEXT
RETURN

'---ABS
@TESTABS

LOCATE 0,5
FOR I=-10 TO 10
 PRINT "    ABS(";
 PRINT FORMAT$("%2D",I);
 PRINT ")";

 GOSUB @ARROW

 PRINT ABS(I)
NEXT

RETURN

'---SGN
@TESTSGN

LOCATE 0,5
FOR I=-10 TO 10
 PRINT "    SGN(";
 PRINT FORMAT$("%2D",I);
 PRINT ")";

 GOSUB @ARROW

 PRINT SGN(I)
NEXT

RETURN

'---MIN
@TESTMIN

NUM=16
DIM ARRAY[NUM]

LOCATE 0,6
FOR I=0 TO NUM-1
 X=RND(1000)
 PRINT "    ARRAY[";
 PRINT FORMAT$("%2D",I);
 PRINT "] = ";
 PRINT FORMAT$("%3D",X)
 ARRAY[I]=X
NEXT

PRINT ""
PRINT "    MIN(ARRAY)";

GOSUB @ARROW

PRINT MIN(ARRAY)
PRINT ""
PRINT "    MAX(ARRAY)";

GOSUB @ARROW

PRINT MAX(ARRAY)

RETURN

'--- SORT/RSORT
@TESTSORT

NUM=16
DIM ARRAY2[NUM]

A$="        SORT    RSORT"
PY=2
GOSUB @BGPRTCTR

FOR I=0 TO NUM-1
 LOCATE 4,I+6
 X=RND(1000)
 PRINT "A[";
 PRINT FORMAT$("%2D",I);
 PRINT "] = ";
 PRINT FORMAT$("%3D",X)
 ARRAY2[I]=X
NEXT

SORT ARRAY2

FOR I=0 TO NUM-1
 LOCATE 20,I+6
 PRINT "A[";
 PRINT FORMAT$("%2D",I);
 PRINT "] : ";
 PRINT FORMAT$("%3D",ARRAY2[I])
NEXT

RSORT ARRAY2

FOR I=0 TO NUM-1
 LOCATE 35,I+6
 X=RND(1000)
 PRINT "A[";
 PRINT FORMAT$("%2D",I);
 PRINT "] : ";
 PRINT FORMAT$("%3D",ARRAY2[I])
NEXT

RETURN

'--- RND/RNDF
@TESTRND
A$="RND      RNDF"
PY=2
GOSUB @BGPRTCTR

LOCATE 0,6
NUM=16
FOR I=0 TO NUM-1
 PRINT "     RND(1000)";

 GOSUB @ARROW

 PRINT FORMAT$("%3D",RND(1000));
 PRINT "     RNDF()";

 GOSUB @ARROW

 PRINT FORMAT$("%.8F",RNDF())
NEXT

RETURN

'--- SQR/POW
@TESTSQR
A$="SQR       POW"
PY=2
GOSUB @BGPRTCTR

LOCATE 0,6
FOR I=1 TO 10
 PRINT "    ";
 PRINT "SQR(";
 PRINT FORMAT$("%2D",I);
 PRINT ")";

 GOSUB @ARROW

 T=SQR(I)
 PRINT FORMAT$("%.8F",T);
 PRINT "   ";

 PRINT "POW(";
 PRINT FORMAT$("%.8F",T);
 PRINT ",2)";

 GOSUB @ARROW

 PRINT POW(T,2)
NEXT

RETURN

'--- EXP/LOG
@TESTEXP
A$="EXP     LOG"
PY=2
GOSUB @BGPRTCTR

LOCATE 0,6
FOR I=0 TO 2
 PRINT "   ";
 PRINT "EXP(";
 PRINT FORMAT$("%1D",I);
 PRINT ")";

 GOSUB @ARROW

 T=EXP(I)
 PRINT FORMAT$("%.8F",T);
 PRINT "    ";

 PRINT "LOG(";
 PRINT FORMAT$("%.8F",T);
 PRINT ")";

 GOSUB @ARROW

 PRINT LOG(T)
NEXT
'ネイピアすうE
RETURN

'--- RAD/DEG
@TESTRAD
A$="RAD    DEG"
PY=2
GOSUB @BGPRTCTR

LOCATE 0,6
FOR I=0 TO 360 STEP 30
 PRINT "  ";
 PRINT "RAD(";
 PRINT FORMAT$("%3D",I);")";

 GOSUB @ARROW

 T=RAD(I)
 PRINT FORMAT$("%1.8F",T);
 PRINT "    ";

 PRINT "DEG(";
 PRINT FORMAT$("%1.8F",T);
 PRINT ")";

 GOSUB @ARROW

 PRINT DEG(T)
NEXT
RETURN

'--- SIN/COS
@TESTSIN
SPMAX=72
GOSUB @SPINITMAX

GOSUB @BSKIPON

FOR SPN=0 TO SPMAX-1
 U=0
 V=144
 SPCHR SPN,U,V,SPW,SPH
NEXT

SPD=0.5
R=60

FOR ISO=0 TO 360 STEP SPD
 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 Y1=0

 FOR SPN=0 TO SPMAX-1
  ANG=(SPN*5)+ISO
  IF SPN MOD 2 THEN ANG=ANG+180

  ANG=ANG MOD 360
  T=RAD(ANG)
  X=COS(T)*R+200
  Y=SIN(T)*(R/5)+32
  Z=POW((SIN(T)+1)*16,2)-256

  SPOFS SPN,X,Y+Y1,Z
  Y1=Y1+2.5
 NEXT
 VSYNC 1
NEXT
CLS
RETURN

'--- TAN
@TESTTAN
CX=GRW/2
CY=GRH/2
C=RGB(255,255,255)

FOR X=-90 TO 90 STEP 30

 GLINE (X*1.6)+CX,CY-8,(X*1.6)+CX,CY+8,C
 LOCATE X/5+25,15-1:PRINT X

NEXT
FOR Y=-3 TO 3
 GLINE CX-8,CY-Y*32,CX+8,CY-Y*32,C
 LOCATE 25+1,15-Y*4:PRINT Y
NEXT

GLINE 0,CY,399,CY,C
GLINE CX,0,CX,239,C

FOR X=-89 TO 89 STEP 0.1
 Y=TAN(RAD(X))
 GPSET CX+X*1.6,CY-Y*32,RGB(0,0,255)
NEXT

COLOR 9
LOCATE 25+9,15-4:PRINT "Y=TAN(RAD(X))"
RETURN

'--- ATAN
@TESTATAN

SPMAX=2
GOSUB @SPINITMAX

SPN=0
X1=200
Y1=64
SPOFS SPN,X1,Y1

SPN=1
X2=200
Y2=160
FOR X2=100 TO 300
 ANG=DEG(ATAN(Y2-Y1,X2-X1))
 IF ANG<0 THEN ANG=ANG+360

 LOCATE 0,19
 PRINT "  X1:";
 PRINT FORMAT$("%3D",X1)
 PRINT "  Y1:";
 PRINT FORMAT$("%3D",Y1)
 PRINT "  X2:";
 PRINT FORMAT$("%3D",X2)
 PRINT "  Y2:";
 PRINT FORMAT$("%3D",Y2)
 PRINT ""
 PRINT "  DEG(ATAN(Y2-Y1,X2-X1))";

 GOSUB @ARROW

 PRINT FORMAT$("%3.8F",ANG);

 SPOFS SPN,X2,Y2

 PY=2
 A$="ANGLE:"+FORMAT$("%3D",ANG)+" DEG."
 GOSUB @BGPRTCTR

 VSYNC 1
NEXT
R=300
GLINE X1,Y1,X1+R,Y1,RGB(255,255,0)
X3=X1+COS(RAD(ANG))*R
Y3=Y1+SIN(RAD(ANG))*R
GLINE X1,Y1,X3,Y3,RGB(255,255,0)

RETURN

'--- ASIN/ACOS
@TESTASIN
CX=GRW/2
CY=GRH/2
C=RGB(255,255,255)

FOR X=-1 TO 1
 GLINE X*80+CX,CY-8,X*80+CX,CY+8,C
 LOCATE X*10+25,15-1:PRINT X
NEXT
FOR Y=-3 TO 3
 GLINE CX-8,CY-Y*32,CX+8,CY-Y*32,C
 LOCATE 25+1,15-Y*4:PRINT Y
NEXT

GLINE 0,CY,399,CY,C
GLINE CX,0,CX,239,C

FOR X=-1 TO 1 STEP 0.01
 Y=ASIN(X)
 GPSET CX+X*80,CY-Y*32,RGB(255,0,0)

 Y=ACOS(X)
 GPSET CX+X*80,CY-Y*32,RGB(0,255,0)
NEXT

COLOR 3
LOCATE 25+9,15-9:PRINT "Y=ASIN(X)"
COLOR 5
LOCATE 25-9,15-9:PRINT "Y=ACOS(X)"

RETURN

'--- SINH/COSH
@TESTSINH
CX=GRW/2
CY=GRH/2
C=RGB(255,255,255)

FOR X=-2 TO 2
 GLINE X*32+CX,CY-8,X*32+CX,CY+8,C
 LOCATE X*4+25,15-1:PRINT X
NEXT
FOR Y=-3 TO 3
 GLINE CX-8,CY-Y*32,CX+8,CY-Y*32,C
 LOCATE 25+1,15-Y*4:PRINT Y
NEXT

GLINE 0,CY,399,CY,C
GLINE CX,0,CX,239,C

FOR X=-2 TO 2 STEP 0.01
 Y=SINH(X)
 GPSET CX+X*32,CY-Y*32,RGB(255,0,0)

 Y=COSH(X)
 GPSET CX+X*32,CY-Y*32,RGB(0,255,0)

 Y=TANH(X)
 GPSET CX+X*32,CY-Y*32,RGB(0,0,255)
NEXT

COLOR 3
LOCATE 25+9,15-9:PRINT "Y=SINH(X)"
COLOR 5
LOCATE 25-4,15-9:PRINT "Y=COSH(X)"
COLOR 9
LOCATE 25+9,15-4:PRINT "Y=TANH(X)"

RETURN

'------------
@TESTSHIFT

DIM ARRAY3[6]

FOR I=0 TO LEN(ARRAY3)-1
 ARRAY3[I]=I
NEXT
A$="----------"
GOSUB @PRTDIM

A$="UNSHIFT A,99"
UNSHIFT ARRAY3,99
GOSUB @PRTDIM

A$="R=SHIFT(A)"
RET=SHIFT(ARRAY3)
GOSUB @PRTDIM

A$="PUSH A,99"
PUSH ARRAY3,99
GOSUB @PRTDIM

A$="R=POP(A)"
RET=POP(ARRAY3)
GOSUB @PRTDIM
RETURN

'-----------------
@PRTDIM
CLS
LOCATE 5,8
PRINT A$
GOSUB @ARROW2
FOR I=0 TO LEN(ARRAY3)-1
 PRINT " "*5;
 PRINT "A[";I;"] : ";ARRAY3[I]
NEXT
WAIT 120
RETURN

'------------
@TESTCHKF
N$="TXT:TEMPTXT"
T$=""
FOR I=1 TO 512
 T$=T$+CHR$((I MOD &H40)+&H20)
NEXT

RET=CHKFILE(N$)

LOCATE 0,5
PRINT "CHKFILE(";CHR$(34);N$;CHR$(34);")";
GOSUB @ARROW
PRINT RET

RETURN

'--- 
@TESTFILES
DIM NAME$[20]

LOCATE 0,4
FILES NAME$
PRINT " FILES NAME$"
GOSUB @ARROW2

FOR I=0 TO LEN(NAME$)-1
 COLOR 7
 IF I>17 THEN
  PRINT " AND MORE..."
  BREAK
 ENDIF
 PRINT " NAME$[";I;"]:";
 COLOR 15
 PRINT NAME$[I]
NEXT
RETURN

'------------
@TESTSAVE

N$="TXT:TEMPTXT"
T$=""
FOR I=1 TO 512
 T$=T$+CHR$((I MOD &H40)+&H20)
NEXT

LOCATE 0,5
PRINT "SAVE ";CHR$(34);N$;CHR$(34)

SAVE N$,T$

PRINT "LOAD ";CHR$(34);N$;CHR$(34)
T$=""
LOAD N$ OUT T$

PRINT T$
RETURN

'--- BG PRINT SUB
@BGPRTCTR
PX=((GRW/2)/16)-(LEN(A$)/2)
@BGPRT
FOR IDX=0 TO LEN(A$)-1
 C=ASC(MID$(A$,IDX,1))
 IF C<0 THEN C=0
 IF C>=32*3 THEN C=0
 BGPUT MSG,PX+IDX,PY,C
NEXT
RETURN

'-------------
@TESTBEEP

GOSUB @BSKIPON

'TONE=0   'TONE NO. PRESET 0〜133
'PITCH=0  '-200 〜 200
'VOL=127  '0 〜 127
'PAN=0    '0:LEFT/64:CENTER/127:RIGHT
'BEEP TONE,PITCH,VOL,PAN

LOCATE 0,6,0
PRINT "    こうかおんばんごう0〜133の はんいで ランダムさいせい
PRINT ""
FOR J=0 TO 10
 TONE = RND(134)   'TONE NUMBER

 PRINT "     BEEP ";TONE
 BEEP TONE

 FOR I=1 TO 60
  BT=STKANDBTN()
  IF BT AND 32 THEN BREAK
  VSYNC 1
 NEXT
 IF BT AND 32 THEN BREAK

NEXT
GOSUB @BSKIPOFF

RETURN

'--- BGMPLAY
@TESTBGMPLAY
TRK=0  'TRACK NUM.0〜7
NUM=RND(43)  'BGM NO.PRESET 0〜42/USER 128〜255
MML$=""

LOCATE 0,6,0
PRINT "    おんがくばんごう0〜42の はんいで ランダムさいせい
PRINT ""
PRINT "    BGMPLAY ";NUM
BGMPLAY NUM
RETURN

'--- BGMSTOP
@TESTBGMSTOP
LOCATE 0,6,0
PRINT "    BGMSTOP "
BGMSTOP
RETURN

'---
@TESTWAVSET
TONE=224  'TONE NO. 224〜255
A=40 'ATTACK 0〜127
D=40 'DECAY 0〜127
S=80 'SUSTAIN 0〜127
R=60 'RELEASE 0〜127

WAV$=""
FOR I=1 TO 64
 V=SIN(RAD(I*360/16))*120
 WAV$=WAV$+RIGHT$("00"+HEX$(V),2)

 X=240+I*2
 Y=120
 GLINE X,Y,X,Y-V,RGB(0,255,0)
NEXT
GLINE 240,Y,X,Y,RGB(255,0,0)
WAVSET TONE,A,D,S,R,WAV$

LOCATE 0,8,0
PRINT "TONE NUMBER:";TONE
PRINT ""
PRINT "ATTACK :";A
PRINT "DECAY  :";D
PRINT "SUSTAIN:";S
PRINT "RELEASE:";R
X=16
Y=120
C=RGB(255,255,0)
W=50
GLINE X,Y,X+A,Y-120,C
GLINE X+A,Y-120,X+A+D,Y-S,C
GLINE X+A+D,Y-S,X+A+D+W,Y-S,C
GLINE X+A+D+W,Y-S,X+A+D+W+R,Y,C
GLINE X,Y,X+A+D+W+R,Y,RGB(255,0,0)

LOCATE 0,20
PRINT " WAVSET ";
PRINT TONE;",";A;",";D;",";S;",";R;",";
PRINT CHR$(34);WAV$;CHR$(34)

MML$="@"+STR$(TONE)+"O4CDEFGABO5C"
BGMPLAY MML$
PRINT ""
PRINT " BGMPLAY ";CHR$(34);MML$;CHR$(34);

RETURN

'--- BGMSET
@TESTBGMSET

NUM=128  'BGM NO. 128〜255
MML$="O4CDEFGABO5C"

LOCATE 0,6,0
PRINT " BGMSET ";
PRINT NUM;",";CHR$(34);MML$;CHR$(34)
BGMSET NUM,MML$

PRINT ""
NUM=128
PRINT " BGMPLAY ";NUM
BGMPLAY NUM

RETURN

'--- BGMVOL
@TESTBGMVOL

BGMPLAY 1

FOR I=0 TO 8
 VOL=127-((8-I)*16)
 IF VOL<0 THEN VOL=0
 PY=3+I
 A$="BGMVOL "+STR$(VOL)
 GOSUB @BGPRTCTR
 BGMVOL VOL
 WAIT 60
NEXT

WAIT 120
BGMSTOP
RETURN

'--- TALK
@TESTTALK

A$="アカサタナ ハマヤラワ"
TALK A$
LOCATE 5,6,0
PRINT "TALK ";
PRINT CHR$(34);A$;CHR$(34)

RETURN

'--- EFCSET
@TESTEFC
LOCATE 0,6,0
COLOR 7
PRINT " エフェクターをせってい"
MML$="@1O4CDEFGABO5C"

EFCON 'エフェクターON
TYPE=0 'エフェクターのプリセットせってい
COLOR 7
PRINT " (1)エフェクターを つかわずに BGMさいせい"
PRINT ""
COLOR 15
PRINT " EFCSET ";TYPE
EFCSET TYPE
'エフェクターの プリセットせってい
'0 = なし
'1 = リバーブ(BATHROOM)
'2 = リバーブ(CAVE)
'3 = リバーブ(SPACE)
BGMPLAY MML$
GOSUB @BGMWAIT
PRINT ""


TYPE=RND(3)+1 'エフェクターのプリセットせってい
COLOR 7
PRINT " (2)エフェクターを プリセットで せっていして BGMさいせい"
PRINT ""
COLOR 15
PRINT " EFCSET ";TYPE
EFCSET TYPE
BGMPLAY MML$
GOSUB @BGMWAIT
PRINT ""


T1=RND(2001) 'しょきはんしゃじかん(0〜2000 MSEC)
T2=RND(2001) 'ざんきょうおんディレイじかん(0〜2000 MSEC)
T3=RND(10000)+1 'ざんきょうおんげんすいじかん(1〜10000 MSEC)
F1=RND(11)/10 'ざんきょうおんフィルタけいすう1( 0.0〜1.0)
F2=RND(11)/10 'ざんきょうおんフィルタけいすう2( 0.0〜1.0)
G1=RND(11)/10 'しょきはんしゃおんゲイン( 0.0〜1.0)
G2=RND(11)/10 'ざんきょうおんゲイン( 0.0〜1.0)

COLOR 7
PRINT " (3)エフェクターをしょうさいに せっていして BGMさいせい"
PRINT " (エフェクターのパラメータは ランダム)"
PRINT "  しょきはんしゃ じかん       :";T1;" MSEC"
PRINT "  ざんきょうおん ディレイ じかん  :";T2;" MSEC"
PRINT "  ざんきょうおん げんすい じかん  :";T3;" MSEC"
PRINT "  ざんきょうおん フィルタ けいすう1:";F1
PRINT "  ざんきょうおん フィルタ けいすう2:";F2
PRINT "  しょきはんしゃおん ゲイン     :";G1
PRINT "  ざんきょうおん ゲイン       :";G2
PRINT ""
COLOR 15

EFCSET T1,T2,T3,F1,F2,G1,G2
PRINT " EFCSET ";T1;",";T2;",";T3;",";F1;",";F2;",";G1;",";G2
BGMPLAY MML$
GOSUB @BGMWAIT
PRINT ""
EFCOFF 'エフェクターOFF
RETURN

'--- EFCWET
@TESTEFC2
LOCATE 0,6,0
COLOR 7
PRINT " エフェクターの ウェットちを せってい"
PRINT ""
MML$="@1O4CDEFGABO5C"

EFCON 'エフェクターON
TYPE=1 'エフェクターのプリセットせってい
EFCSET TYPE

FOR I=0 TO 128 STEP 32
 W=I
 IF W>127 THEN W=127

 COLOR 15
 PRINT " EFCWET ";W;",";W;",";W
 EFCWET W,W,W
'BEEPウエットち 0〜127
'BGMウエットち 0〜127
'TALKウェットち 0〜127(64いじょうでON)

 BGMPLAY MML$
 GOSUB @BGMWAIT
 BEEP 6
 WAIT 30
 TALK "アイウエオ"
 WHILE TALKCHK()==TRUE
 WEND
 PRINT ""
NEXT
EFCOFF 'エフェクターOFF
RETURN
'---
@BGMWAIT
WHILE BGMCHK()==TRUE
 VSYNC 1
WEND
RETURN

'-------------
@GRPINIT
DISPLAY DISP
GPRIO 1024  '
GCLS

IF XMODE==4 THEN
 GRW=320   'WIDTH
 GRH=480   'HEIGHT
ELSE
 IF DISP==0 THEN
  GRW=400   'WIDTH
 ELSE
  GRW=320   'WIDTH
 ENDIF
 GRH=240   'HEIGHT
ENDIF

FOR I=0 TO GRW-1 STEP 8
 C=128
 IF (I MOD 16) THEN C=C/2
 GLINE I,0,I,GRH-1,RGB(0,0,C)
NEXT
FOR I=0 TO GRH-1 STEP 8
 C=128
 IF (I MOD 16) THEN C=C/2
 GLINE 0,I,GRW-1,I,RGB(0,0,C)
NEXT
RETURN

'--- PRGGET$
@TESTPGET
LOCATE 0,3,0
PRINT "PRGGET$をつかうと プログラムを よみとることができます"
PRINT
@PRGLIST
PRGNUM=1
PRGEDIT PRGNUM,1
COLOR 13
PRINT 
PRINT " "
PRINT 
COLOR 7

PRINT "SLOT ";PRGNUM;" PROGRAM LIST"
FOR I=1 TO PRGSIZE(PRGNUM)
 A$=PRGGET$()
 COLOR 11
 PRINT " (";I;"ぎょうめ) ";
 COLOR 15
 PRINT A$;
NEXT
RETURN

'--- PRGSET
@TESTPSET
LOCATE 0,3
PRINT "PRGSETをつかうと プログラムを いれかえることができます"
PRINT 
PRGNUM=1
PRGEDIT PRGNUM
A$="PRINT 1"
PRGSET A$
PRINT "PRGSET ";CHR$(34);A$;CHR$(34)
A$="PRINT 2"
PRGSET A$
PRINT "PRGSET ";CHR$(34);A$;CHR$(34)
A$="PRINT 3"
PRGSET A$
PRINT "PRGSET ";CHR$(34);A$;CHR$(34)
GOSUB @PRGLIST
RETURN

'--- PRGINS
@TESTINS
LOCATE 0,3
PRINT "PRGINSをつかうと プログラムを そうにゅうすることができます"
PRINT 
PRGNUM=1
PRGEDIT PRGNUM
A$="PRINT "+STR$(RND(100))
PRGINS A$
PRINT "PRGINS ";CHR$(34);A$;CHR$(34)
GOSUB @PRGLIST
RETURN
'--- PRGDEL
@TESTDEL
LOCATE 0,3
PRINT "PRGDELをつかうと プログラムを さくじょすることができます"
PRINT 
PRGNUM=1
PRGEDIT PRGNUM
PRGDEL
PRINT "PRGDEL"
GOSUB @PRGLIST
RETURN

'-------------
@TESTSYSTEM

LOCATE 0,5
PRINT " SYSTEM VARIABLES"
PRINT " FREEMEM:";FREEMEM
PRINT " VERSION:&H";HEX$(VERSION)
PRINT " TABSTEP:";TABSTEP
PRINT " SYSBEEP:";SYSBEEP
PRINT " ERRNUM :";ERRNUM
PRINT " ERRLINE:";ERRLINE
PRINT " ERRPRG :";ERRPRG
PRINT " MAINCNT:";MAINCNT
PRINT " TRUE   :";TRUE
PRINT " FALSE  :";FALSE
PRINT " TIME$  :";TIME$
PRINT " DATE$  :";DATE$

RETURN
'---------
@ARROW
COLOR 13
PRINT " ";CHR$(57884);" ";
COLOR 15
RETURN
'---------
@ARROW2
COLOR 13
PRINT ""
PRINT "       ";CHR$(57887)
PRINT ""
COLOR 15
RETURN

'----- BG INIT MSG
@BGINITMSG

BGCLR 0
BGCLR 1
IF XMODE==0 THEN
 BGCLR 2
 BGCLR 3
ENDIF

MSG=0
BSX=0
BSY=0
BSZ=-128

IF XMODE==4 THEN
 GRW=320  'WIDTH
ELSE 
 GRW=400  'WIDTH
ENDIF

BGW=GRW/16   'WIDTH
BGH=GRH/16   'HEIGHT
BGSCREEN MSG,BGW,BGH
BGCLR MSG
BGOFS MSG,BSX,BSY,BSZ

IF XMODE==4 THEN RETURN
BGCLIP 0,0,0,GRW-1,BGH*16-1
BGCLIP 1,0,0,GRW-1,BGH*16-1

IF XMODE==0 THEN
 BGCLIP 2,0,0,GRW-1,BGH*16-1
 BGCLIP 3,0,0,GRW-1,BGH*16-1
ENDIF
RETURN

'--- GYROA
@TESTGYRO

SPMAX=3
GOSUB @SPINITMAX

FOR I=0 TO 2
 X1=200
 Y1=60+(60*I)
 W=25
 C=RGB(255,255,255)
 GLINE X1,Y1-W,X1,Y1+W,C
 GLINE X1-W,Y1,X1+W,Y1,C
 SPOFS I,X1,Y1,0
 SPSCALE I,2,2
NEXT

XON MOTION

PY=29
A$="[B]BUTTON : EXIT"
GOSUB @TXTPRTCTR

WHILE 1
 LOCATE 0,5

 GYROA OUT Y, P, R
 SPROT 0, DEG(Y)
 SPROT 1, DEG(P)
 SPROT 2, DEG(R)

 LOCATE 3,(60+0)/8
 PRINT "YAW  =";FORMAT$("%4D",DEG(Y))
 LOCATE 3,(60+60)/8
 PRINT "PITCH=";FORMAT$("%4D",DEG(P))
 LOCATE 3,(60+120)/8
 PRINT "ROLL =";FORMAT$("%4D",DEG(R))

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
WEND

XOFF MOTION
CLS
RETURN

'--- ACCEL
@ACCEL

SPMAX=1
GOSUB @SPINITMAX

X1=200
Y1=120
W=100
C=RGB(255,255,255)
GLINE X1,Y1-W,X1,Y1+W,C
GLINE X1-W,Y1,X1+W,Y1,C
SPSCALE 0,3,3

XON MOTION

PY=29
A$="[B]BUTTON : EXIT"
GOSUB @TXTPRTCTR

WHILE 1
 ACCEL OUT AX,AY,AZ

 LOCATE 0,5
 PRINT " ACCEL X=";FORMAT$("%06.3F",AX)
 PRINT " ACCEL Y=";FORMAT$("%06.3F",AY)
 PRINT " ACCEL Z=";FORMAT$("%06.3F",AZ)

 X1=200
 Y1=120
 X2=X1+(AX*100)
 Y2=Y1+(AY*100)
 SPOFS 0, X2,Y2

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 VSYNC 1
WEND
XOFF MOTION
CLS
RETURN

'--- MIC
@TESTMIC

XON MIC

LOCATE 0,5
PRINT "XON MIC"
PRINT "READY...";
WAIT 120
PRINT "START"

'0:8BIT
'1:16BIT
BIT=0
SEC=1

'0:8180HZ
'1:10190HZ
'2:16360HZ
'3:32730HZ
MODE=1

MICSTART MODE,BIT,SEC

FOR I=1 TO 60
 LOCATE 0,8
 PRINT FLOOR(100*I/60);"%"
' PRINT MICPOS
' PRINT MICSIZE
 VSYNC 1
NEXT
MICSTOP
SZ=MICSIZE

PRINT "STOP"
PRINT "MICSIZE=";SZ

DIM ARRAY4[SZ]
MICSAVE ARRAY4

XOFF MIC

FOR I=0 TO SZ-1
 X=400*I/SZ
 Y=120+(ARRAY4[I]-128)
 GPSET X,Y,RGB(0,255,0)
NEXT

RETURN

'--- EXPAD
@EXPAD
SPMAX=1
GOSUB @SPINITMAX

X1=200
Y1=120
W=100
C=RGB(255,255,255)
GLINE X1,Y1-W,X1,Y1+W,C
GLINE X1-W,Y1,X1+W,Y1,C
SPSCALE 0,3,3

XON EXPAD
IF RESULT==FALSE THEN RETURN

PY=29
A$="[B]BUTTON : EXIT"
GOSUB @TXTPRTCTR

WHILE 1
 STICKEX OUT X,Y

 LOCATE 0,5,0
 PRINT " X=";
 PRINT FORMAT$("%06.3F",X)
 PRINT " Y=";
 PRINT FORMAT$("%06.3F",Y)

 X2=X1+X*100
 Y2=Y1-Y*100
 SPOFS 0,X2,Y2,-100

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK
 VSYNC 1
WEND

XOFF EXPAD

RETURN

'--- DIALOG
@TESTDLG

A$="DIALOG で ダイアログ を ひょうじします"
TYPE=RND(6)
' 0=りょうしょう
' 1=いいえ/はい
' 2=もどる/つぎへ
' 3=ちゅうし/けってい
' 4=ちゅうし/じっこう
' 5=つぎへ

LOCATE 0,6
PRINT "  DIALOG(";
PRINT CHR$(34);A$;CHR$(34);
PRINT ",";TYPE;")"

COLOR 7
PRINT ""
PRINT "   (けっかを したがめんに ひょうじ)"

RET=DIALOG(A$,TYPE)

GOSUB @ARROW2
PRINT "  もどりち = ";RET
'RET: -1:NO / 1:YES
RETURN

'----- MP TEST
@MPTEST
LOCATE 0,2
PRINT " ローカルつうしんテスト(ほんたいが 2だいいじょう ひつようです)"
MPMAX=4  'PLAYERS
TAG$="COM"

LOCATE 0,3
PRINT "  MPSTART";
MPSTART MPMAX,TAG$
PRINT " RESULT:";RESULT;
IF RESULT==-1 THEN
 RETURN
ENDIF

PRINT " / MPLOCAL:";MPLOCAL;
IF MPHOST<0 THEN
 RETURN
ENDIF

PY=29
A$="[B]BUTTON : EXIT"
GOSUB @TXTPRTCTR

WHILE 1
 COLOR 7
 LOCATE 0,4
 PRINT "  MPCOUNT:";MPCOUNT
 IF MPCOUNT<2 THEN
  BREAK
 ENDIF

 FOR ID=0 TO 3
  GOSUB @MPSUB
  VSYNC 1
 NEXT

 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK
WEND

GOSUB @BSKIPOFF
MPEND

RETURN

'---
@MPSUB
X=0
Y=ID*6+5

COLOR 15
LOCATE X,Y+0
PRINT "[ID:";ID;"]";
PRINT "-"*44

IF ID>=MPCOUNT THEN RETURN

IF ID==MPLOCAL THEN
 COLOR 5
 PRINT "(YOU)";
ELSE
 COLOR 13
 PRINT "     ";
ENDIF

PRINT " / ";
IF ID==MPHOST THEN
 PRINT "おやき";
ELSE
 PRINT "こき ";
ENDIF

PRINT " / なまえ:";MPNAME$(ID);
PRINT " / MPSTAT:";MPSTAT(ID)

BT=BUTTON(0,ID)
PRINT " BUTTON:";HEX$(BT,4);

STICK ID OUT SX,SY
A$=FORMAT$("%6.3F",SX)
A$=A$+","
A$=A$+FORMAT$("%6.3F",SY)
PRINT "  / STICK:(";A$;")"

TOUCH ID OUT TS,TX,TY
A$=FORMAT$("%03D",TS)
A$=A$+":"
A$=A$+FORMAT$("%03D",TX)
A$=A$+","
A$=A$+FORMAT$("%03D",TY)
PRINT " TOUCH:(";A$;")"

PRINT " DATA:";
FOR J=0 TO 8
 RET=MPGET(ID,J)
 IF J>0 THEN PRINT ",";
 PRINT HEX$(RET,4);
NEXT

RETURN


'-------
@SPEEDTEST

LOCATE 0,6
PRINT "  ないよう     : スコア(はやいほど かずが おおきい)"
PRINT " ----------:----------------------"

PRINT "  たしざん     : ";
SCORE=0
CNT=MAINCNT
I=0
WHILE ((MAINCNT-CNT)<60)
 I=I+1
 SCORE=SCORE+1
WEND
PRINT SCORE

PRINT "  PRINTぶん  : ";
X=CSRX
Y=CSRY
SCORE=0
CNT=MAINCNT
WHILE ((MAINCNT-CNT)<60)
 C=&H41-(SCORE MOD 26)
 LOCATE X,Y:PRINT CHR$(C)
 SCORE=SCORE+1
WEND
LOCATE X,Y
PRINT SCORE

PRINT "  スプライトいどう : ";
SPSET 0,2544
SCORE=0
CNT=MAINCNT
WHILE ((MAINCNT-CNT)<60)
 SPOFS 0,(SCORE MOD 400),120
 SCORE=SCORE+1
WEND
PRINT SCORE

PRINT "  ラインびょうが  : ";
SCORE=0
CNT=MAINCNT
WHILE ((MAINCNT-CNT)<60)
 GLINE RND(400),RND(240),RND(400),RND(240),RGB(0,0,128)
 SCORE=SCORE+1
WEND
PRINT SCORE

RETURN
'-------
@DEMO1

XSCREEN 0,512,4

PY=29
A$="[LEFT][RIGHT]:MOVE / [B]BUTTON:EXIT"
PX=25-(LEN(A$)/2)
LOCATE PX,PY,-250
PRINT A$;

FOR I=0 TO 240-1
 U=0
 V=I
 W=400
 H=1
 SPSET I,U,V,W,H,1
 SPHOME I,W/2,H
NEXT
L=32
ANG=0
WHILE 1
 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK
 IF BTN AND 4 THEN L=L-1
 IF BTN AND 8 THEN L=L+1
 IF L<1   THEN L=1
 IF L>200 THEN L=200
 ANG=(ANG+1) MOD 360
 A=ANG
 FOR I=0 TO 240-1
  X=SIN(RAD(A))*L
  Y=I
  Z=-I
  SPOFS I,X+200,Y,Z
  SPSCALE I,(I/120),4
  SPROT I,ANG
  A=A+1
 NEXT
 VSYNC 1
WEND
CLS
XMODE=0
GOSUB @SCRNINIT
RETURN

'-------
@DEMO2
XSCREEN 0,512,2
GCLS:CLS:SPCLR:BGCLR
SPDEF
EFCON 'エフェクターON
EFCSET 1
BGMPLAY 41
'---
GPRIO 1024
GLINE 0,240,400,0,RGB(64,64,64)
GPAINT 0,0,RGB(96,96,96)
GPAINT 399,239,RGB(160,160,160)
GLINE 0,0,400,240,RGB(64,64,64)
SX=40*4
SY=24*4
GFILL SX,SY,400-SX,240-SY,RGB(128,128,128)
GBOX  SX,SY,400-SX,240-SY,RGB(64,64,64)
'---
CMAX=5
DIM SPC[CMAX]
COPY SPC,"@CHRDATA"
@CHRDATA
DATA 1432,1435,1438,1441,1444
'---
HIS=40
ZMAX=1000+200
DIM HD[CMAX],TL[CMAX]
DIM SPX[CMAX],SPY[CMAX],SPZ[CMAX]
DIM VX[CMAX],VY[CMAX],VZ[CMAX]
DIM HX[CMAX,HIS],HY[CMAX,HIS],HZ[CMAX,HIS]
DIM STX[CMAX],STY[CMAX],STZ[CMAX]

PY=29
A$="[B]BUTTON : EXIT"
PX=25-(LEN(A$)/2)
LOCATE PX,PY,-250
PRINT A$;
'---
IX=0
FOR CI=0 TO CMAX-1
 SPX[CI]=RND(400):STX[CI]=SPX[CI]
 SPY[CI]=RND(240):STY[CI]=SPY[CI]
 SPZ[CI]=RND(200):STZ[CI]=SPZ[CI]
 SPSET IX,SPC[CI]
 SPOFS IX,SPX[CI],SPY[CI],SPZ[CI]
 SPHOME IX,16,16
 IX=IX+1
 '
 SPSET IX,0
 SPCOLOR IX,RGB(255,255,255,255)
 IX=IX+1
 '
 FOR I=0 TO HIS-1
  SPSET IX,SPC[CI]
  SPHOME IX,16,16
  IX=IX+1
 NEXT
 HD[CI]=0:TL[CI]=0
 VX[CI]=0:VY[CI]=0:VZ[CI]=0
 '
NEXT
'---
M=510-IX
IF M>20 THEN M=20
FOR I=0 TO M-1
 SPSET IX,242
 OX=((RND(400) DIV 32)*32)+32
 OY=((RND(192) DIV 32)*32)+32
 OZ=RND(ZMAX)-200
 SPOFS IX,OX,OY,OZ
 SPHOME IX,8,8
 GOSUB @CALCSC
 SPSCALE IX,SC,SC
 C=128
 SPCOLOR IX,RGB(C,255,255,255)
 IX=IX+1
NEXT
'---

WHILE 1
 BT=STKANDBTN()
 IF BT AND 32 THEN BREAK

 FOR CI=0 TO CMAX-1

  IX=CI*(HIS+2)
  T=STX[CI]:P=SPX[CI]:V=VX[CI]
  GOSUB @GETVEC
  SPX[CI]=P+V:VX[CI]=V:X=SPX[CI]
  T=STY[CI]:P=SPY[CI]:V=VY[CI]
  GOSUB @GETVEC
  SPY[CI]=P+V:VY[CI]=V:Y=SPY[CI]
  Z=SPZ[CI]:V=STZ[CI]-Z
  IF V<-8 THEN V=-8
  IF V> 8 THEN V=8
  Z=Z+V
  IF Z<-256 THEN Z=-256
  IF Z>1000 THEN Z=1000
  SPZ[CI]=Z
 '
  SPOFS IX,X,Y,Z
  OZ=Z:GOSUB @CALCSC
  SPSCALE IX,SC,SC
  C=255
  SPCOLOR IX,RGB(C,255,255,255)
  IX=IX+1
 '---
  IF ABS(STX[CI]-X)<16 THEN
   IF ABS(STY[CI]-Y)<16 THEN
    IF ABS(STZ[CI]-Z)<32 THEN
     STX[CI]=RND(400)
     STY[CI]=RND(240)
     STZ[CI]=RND(ZMAX)-200
     SPCHR IX,RND(32)
     SPHOME IX,8,8
    ENDIF
   ENDIF
  ENDIF
 '---
  SPOFS IX,STX[CI],STY[CI],STZ[CI]
  SPROT IX,ANGLE
  ANGLE=(ANGLE+1) MOD 360
  OZ=STZ[CI]:GOSUB @CALCSC
  SPSCALE IX,SC,SC
  IX=IX+1
 '---
  H=HD[CI]
  T=TL[CI]
  HX[CI,H]=X
  HY[CI,H]=Y
  HZ[CI,H]=Z
  H=(H+1) MOD HIS
  HD[CI]=H
  FOR I=0 TO HIS-1
   N=(T+I) MOD HIS
   SPOFS IX,HX[CI,N],HY[CI,N],HZ[CI,N]
   C=(255/HIS)*I
   SPCOLOR IX,RGB(C,C,C,C)
   OZ=HZ[CI,N]:GOSUB @CALCSC
   SC=((1/HIS)*I)*SC
   SPSCALE IX,SC,SC
   IX=IX+1
  NEXT
  T=(T+1) MOD HIS
  TL[CI]=T
 '
 NEXT
 '---
 VSYNC 1
WEND
EFCOFF 'エフェクターOFF
BGMSTOP
CLS
XMODE=0
GOSUB @SCRNINIT
RETURN

'---
@CALCSC
SC=0.25+(4/ZMAX)*(ZMAX-(OZ+200))
RETURN
'---
@GETVEC
S=SGN(T-P):V=V+(S*1)
IF V<-4 THEN V=-4
IF V>4 THEN V=4
RETURN
'-------
@TXTPRTCTR
PX=((GRW/2)/8)-(LEN(A$)/2)
LOCATE PX,PY,0
PRINT A$;
RETURN
'-----
@BSKIPON
PX=25-(16/2)
PY=29
LOCATE PX,PY,-256
PRINT "[B]BUTTON : SKIP";
RETURN
'--------
@BSKIPOFF
PX=25-(40/2)
PY=29
LOCATE PX,PY,-250
PRINT " "*40;
RETURN
'-------------SELECT MENU
@SELECT
LOGOSP=0
SPSET LOGOSP,4095
SPHIDE LOGOSP
SPOFS LOGOSP,348,16,-256
SPSHOW LOGOSP

CLS
BGCLR MSG

COLOR 7

PY=4

READ A$
PY=0
GOSUB @BGPRTCTR

IMAX=0
WHILE (1)
 READ A$,B$
 IF A$=="" THEN BREAK

 MENU$[IMAX]=A$
 SUBTI$[IMAX]=B$
 IMAX=IMAX+1
WEND

CX=0:CY=2
FOR I=0 TO IMAX-1
 PX=CX+1
 PY=CY+I
 A$=MENU$[I]
 GOSUB @BGPRT
 A$=SUBTI$[I]
 COLOR 13
 LOCATE 25,PY*2+1,128
 PRINT A$
NEXT

COLOR 15
A$="[UP][DOWN]:せんたく /  [A]:けってい"
PY=29
GOSUB @TXTPRTCTR

WHILE(1)
 PX=CX*2:PY=(CY+SEL)*2
 COLOR 7
 LOCATE PX+1,PY,128
 PRINT CHR$(58111)*23
 LOCATE PX+1,PY+1,128
 PRINT CHR$(58111)*23

 COLOR 15
 LOCATE PX+25,PY+1,-128
 PRINT SUBTI$[SEL]

 GOSUB @SWOFF
 GOSUB @SWON

 LOCATE PX+1,PY,800
 PRINT " "*23
 LOCATE PX+1,PY+1,800
 PRINT " "*23

 COLOR 13
 LOCATE PX+25,PY+1,128
 PRINT SUBTI$[SEL]

 IF BT AND 2+8 THEN SEL=SEL+1
 IF BT AND 1+4 THEN SEL=SEL-1
 IF BT AND 16 THEN BREAK
 IF BT AND 32 THEN SEL=-1:BREAK
 IF SEL<0    THEN SEL=IMAX-1
 IF SEL>=IMAX THEN SEL=0
WEND

BGCLR MSG
CLS
COLOR 15
SPHIDE LOGOSP
RETURN

'----------
@SWINIT
 BTBAK=0  'BACKUP(GLOBAL)
 BTCNT=0  'COUNT(GLOBAL)
RETURN

'---
DEF STKANDBTN()
' BTBAK=0  'BACKUP(GLOBAL)
' BTCNT=0  'COUNT(GLOBAL)
 SLV=0.2  'THRESHOLD
 BTN=BUTTON()
 STICK OUT SX,SY
 IF (SY>SLV)  THEN BTN=BTN OR 1
 IF (SY<-SLV) THEN BTN=BTN OR 2
 IF (SX<-SLV) THEN BTN=BTN OR 4
 IF (SX>SLV)  THEN BTN=BTN OR 8
 IF BTBAK!=BTN THEN BTCNT=0
 BTBAK=BTN
 BTCNT=BTCNT+1
 IF BTCNT==1 THEN RETURN BTN
 IF BTCNT>20 THEN BTCNT=BTCNT-3:RETURN BTN
 RETURN 0
END
'----------
@SWOFF
WHILE 1
 VSYNC 1
 IF STKANDBTN()==0 THEN BREAK
WEND

RETURN

'----------
@SWON
WHILE 1
 VSYNC 1
 BT=STKANDBTN()
 IF BT!=0 THEN BREAK
WEND
RETURN

'-------------HIT ANY BUTTON
@HITANYBTN
A$="PUSH ANY BUTTON"
PY=14
GOSUB @BGPRTCTR
VSYNC 20
GOSUB @SWOFF
GOSUB @SWON
A$="               "
PY=14
GOSUB @BGPRTCTR
RETURN

'----------
@MENUMAIN
DATA "MAIN MENU"
DATA "CONSOLE","コンソール/スクリーン めいれい"
DATA "GRAPHICS","グラフィック の めいれい"
DATA "BG","BG の めいれい"
DATA "SPRITE","スプライト の めいれい"
DATA "SOUND","サウンド の めいれい"
DATA "STRINGS","もじれつ の めいれい"
DATA "MATHEMATICS","すうがく の めいれい"
DATA "SIN/COS","さんかく かんすう"
DATA "FILE","ファイル の めいれい"
DATA "PROGRAM","プログラムせいぎょ の めいれい"
DATA "OTHER","そのた の きのう"
DATA "DEMO","ちょっとした デモ"
DATA "",""

@MENUCNSL
DATA "CONSOLE"
DATA "XSCREEN 2","がめんモード2 デモンストレーション"
DATA "XSCREEN 4","がめんモード4 デモンストレーション"
DATA "COLOR","テキスト の いろ を せってい"
DATA "LOCATE","ひょうじざひょう を せってい"
DATA "ATTR","テキスト の アトリビュート"
DATA "SCROLL","テキスト の スクロール"
DATA "FONTDEF","オリジナル の フォントていぎ"
DATA "VISIBLE","ひょうじ を ゆうこう/むこう"
DATA "EXIT","もどる"
DATA "",""

@MENUGRP
DATA "GRAPHICS"
DATA "GPAGE","グラフィック の ページ を せってい"
DATA "GCLIP","グラフィックの クリッピングりょういき せってい"
DATA "RGB","ろんり いろコード を けいさん"
DATA "GCIRCLE","えん を えがく"
DATA "GFILL","ちょうほうけい/さんかくけい を えがく"
DATA "GPAINT","りょういき を ぬりつぶす"
DATA "GCOPY","りょういき を コピー"
DATA "GPRIO","グラフィック の プライオリティ"
DATA "GSAVE","グラフィック を はいれつ に コピー"
DATA "EXIT","もどる"
DATA "",""

@MENUBG
DATA "BG"
DATA "BGPUT","BG の ひょうじ"
DATA "BGOFS","BG の ひょうじいち を せってい"
DATA "BGCLIP","BG の クリッピングりょういき せってい"
DATA "BGROT","BG の かいてん"
DATA "BGSCALE","BG の かくだいりつ/しゅくしょう"
DATA "BGANIM","BG の アニメーション"
DATA "BGSAVE","BG を はいれつ に コピー"
DATA "EXIT","もどる"
DATA "",""


@MENUSP
DATA "SPRITE"
DATA "SPOFS","スプライト の ひょうじ ざひょう"
DATA "SPCLIP","スプライト の クリッピングりょういき せってい"
DATA "SPROT","スプライト の かいてん"
DATA "SPSCALE","スプライト の かくだい/しゅくしょう"
DATA "SPCOLOR","スプライト の いろ"
DATA "SPCHR","スプライト の キャラ/サイズ/アトリビュート"
DATA "SPANIM","スプライト の アニメーション"
DATA "SPCOL","スプライト の しょうとつ はんてい"
DATA "SPLINK","スプライト を べつのスプライト に リンク"
DATA "EXIT","もどる"
DATA "",""

@MENUSND
DATA "SOUND"
DATA "BEEP","こうかおん さいせい"
DATA "BGMPLAY","BGM の さいせい"
DATA "BGMSTOP","BGM の ていし"
DATA "WAVSET","はけい の ていぎ"
DATA "BGMSET","BGM の ていぎ"
DATA "BGMVOL","BGM の おんりょう せってい"
DATA "TALK","おんせい の さいせい"
DATA "EFCSET","エフェクターを せってい"
DATA "EFCWET","エフェクターのウェットち せってい"
DATA "EXIT","もどる"
DATA "",""


@MENUSTR
DATA "STRINGS"
DATA "CHR$","キャラクターコード を もじに"
DATA "VAL","もじ を すうち に"
DATA "HEX$","すうち を 16しんすうもじ に"
DATA "FORMAT$","もじれつ フォーマット"
DATA "LEN","もじれつ の ながさ"
DATA "INSTR","もじれつ の なか を けんさく"
DATA "MID$","もじれつ を ぬきだす"
DATA "SUBST$","もじれつ の さしかえ"
DATA "EXIT","もどる"
DATA "",""

@MENUCALC
DATA "MATHMATICS"
DATA "FLOOR","きりすて/ししゃごにゅう/きりあげ"
DATA "ABS","ぜったいち"
DATA "SGN","ふごう"
DATA "MIN/MAX","さいだい/さいしょう"
DATA "RND/RNDF","らんすう"
DATA "SQR/POW","へいほうこん/べきじょう"
DATA "EXP/LOG","Eの べきじょう/しぜんたいすう"
DATA "SORT","ならべかえ"
DATA "SHIFT","はいれつの ようそをシフト"
DATA "EXIT","もどる"
DATA "",""

@MENUSIN
DATA "SIN/COS"
DATA "RAD/DEG","ラジアン/どすう"
DATA "SIN/COS","サイン/コサイン"
DATA "TAN","タンジェント"
DATA "ATAN","アークタンジェント"
DATA "ASIN/ACOS","アークサイン/アークコサイン"
DATA "SINH/COSH","そうきょくせん かんすう"
DATA "EXIT","もどる"
DATA "",""

@MENUFILE
DATA "FILE CONTROL"
DATA "CHKFILE","ファイルの そんざいをかくにん"
DATA "FILES","ファイルの いちらん"
DATA "SAVE/LOAD","ファイルのセーブロード"
DATA "EXIT","もどる"
DATA "",""

@MENUPRG
DATA "PROGRAM"
DATA "PRGGET$","プログラムを よみとる"
DATA "PRGSET","プログラムを いれかえる"
DATA "PRGINS","プログラムを そうにゅう"
DATA "PRGDEL","プログラムを さくじょ"
DATA "EXIT","もどる"
DATA "",""

@MENUOTHER
DATA "OTHER"
DATA "GYRO","ジャイロセンサーの テスト"
DATA "ACCEL","かそくどセンサーの テスト"
DATA "EXPAD","かくちょうスライドパッドの テスト"
DATA "MIC TEST","マイク にゅうりょくの テスト"
DATA "DIALOG","ダイアログを ひょうじ"
DATA "MP TEST","ローカルつうしんの テスト"
DATA "SPEED TEST","じっこうそくど テスト"
DATA "SYSTEM VAR","システムへんすう"
DATA "EXIT","もどる"
DATA "",""

@MENUDEMO
DATA "DEMO"
DATA "NAMI","スプライト を つかったデモ1"
DATA "SNAKE-DR.","スプライト を つかったデモ2"
'DATA "DEMO3",""
DATA "EXIT","もどる"
DATA "",""