折角だからN-BASIC版も

折角だからPC-8001+PCG8100のバージョンも載せときましょう。タイミングは、TICK()に相当する機能がないので、プログラム内でTCをカウントアップして、対応します。タイミングの調整は、260行で行います。Tが一段降りるタイミングなのはIchigoJamと同じ。TSが一面ごとにTを減らす値で、TEがTがそれ以下に下がらない、限界値です。

260 X=5:Y=20:T=50:TS=5:TE=10:Z$=CHR$(0)

一応、QUASI88では、こんな感じだったという値が入ってます。音楽は、PSG使ってもいのですが、さぼってます。

PC-8001にはSCROLLがないので、機械語で実装してあります。リロケータブルなので、任意のアドレスに置けます。USR0(2)で呼び出していますが、2は無視です。将来上へのスクロールは実装するかも。横はアトリビュートの処理が面倒なのでやらないでしょうね。

なるべく、ロジックが分かるように、詰め込まない形にしてあります。

100 CLEAR100,&HBFFF:DEFINTA-Z:WIDTH40,25:PRINTCHR$(12)
110 DEFFNSC(SX,SY)=PEEK(&HF300+SX*2+SY*120)
120 DATA 11,3f,fe,21,c7,fd,01,c8,0a,ed,b8,af,06,78,12,1b,10,fc,c9
130 A=&HC000:FORI=0TO18:READD$:POKEA+I,VAL("&H"+D$):NEXT:DEFUSR0=A
140 DATA f0,18,18,24,24,7e,ff,3c,7e
150 DATA f1,08,18,24,42,ff,54,0c,0e
160 DATA f2,10,10,08,08,10,10,08,08
170 DATA ff,04,3c,2f,56,6a,d6,ac,f0
180 FORI=0TO3
190 READD$:CH=VAL("&H"+D$)
200 FORJ=0TO7
210 READD$:D=VAL("&H"+D$)
220 A=CH*8+J:AL=AMOD256:AH=INT(A/256)
230 OUT0,D:OUT1,AL:OUT2,(AHOR&H10):OUT2,AH
240 NEXTJ
250 NEXTI
260 X=5:Y=20:T=50:TS=5:TE=10:Z$=CHR$(0)
270 TC=0:IFT<TETHENT=TE
280 FORC=0TO27
290 A=C/4+3:LOCATE (CMOD4)*2+(AMOD2),A:PRINT INT(RND(1)*9)+1
300 NEXTC
310 C=C+1
320 K$=INKEY$:D=(K$="h")-(K$="k")
330 IFUTHENLOCATEV,2:PRINTZ$
340 IFWTHENLOCATEQ,1:PRINTZ$
350 IFNTHENLOCATEM,N:PRINTZ$
360 IFK$=" "ANDN=0THENN=Y:M=X:BEEP1:BEEP0
370 LOCATEX,Y:PRINTZ$:X=X+D:IFX<0THENX=0ELSEIFX>9THENX=9
380 IFTC<tthen410
390 TC=0:A=USR0(2)
400 IFFNSC(1,Y)+FNSC(2,Y)+FNSC(3,Y)+FNSC(4,Y)+FNSC(5,Y)+FNSC(6,Y)+FNSC(7,Y)+FNSC(8,Y)THENLOCATE0,23:PRINT"SCR:";S;:LOCATE1,10:PRINT"GAME OVER":LOCATE0,0:END
410 IFUTHENU=U+1:IFU=8THENU=1:V=V+1:IFV>9THENU=0
420 IFUTHENLOCATEV,2:PRINTCHR$(&HF1)
430 IFWTHENW=W+1:IFW=4THENW=1:Q=Q-1:IFQ<0THENW=0
440 IFWTHENLOCATEQ,1:PRINTCHR$(&HFF)
450 IFN=0THEN540
460 N=N-1:F=FNSC(M,N)
470 IFF>48ANDF<58THEN480ELSE520
480 BEEP:S=S+F-48:LOCATEM,N:PRINTZ$:N=0:C=C-1:IFC=0THENT=T-TS:GOTO270
490 IFSMOD10=0THEN500ELSE520
500 IFUTHENIFQ=0THENQ=9:W=1
510 IFU=0THENV=0:U=1
520 IFF=&HF1THENS=S+50:LOCATEM,N:PRINTZ$:U=0:N=0:BEEPELSEIFF=&HFFTHENS=S+100:LOCATEM,N:PRINTZ$:W=0:N=0:BEEP
530 IFNTHENLOCATEM,N:PRINTCHR$(&HF2)
540 F=0:LOCATEX,Y:PRINTCHR$(&HF0)
550 LOCATE0,23:PRINT"SCR:";S;:TC=TC+1:GOTO320

ファンクションキーエリアを消さないのは、消すと、何故か、画面の左端が妙なことになるから。スクロールも、ファンクションキー領域は触らないようにしています。