85DATA HOMEへ
MYCAR情報掲示板BLOGプロフィール

HOME →  懐かしのパソコンネタ

■ポケコン版リバーシ(オセロ)をBASIC+機械語で作ってみた


ポケコン(PC-G850)の搭載CPUは、懐かしのZ80です!
最後にZ80(の機械語での)プログラミングをしたのは、1987年頃だったんじゃないかな。
だとすると、27年前の事なのです。

そんなZ80を、私は憶えているのでしょうか????

 

8月3日

ポケコンでコンピュータ対戦リバーシを「BASICのみ」で作成しました。
BASICの速度では期待できないので「評価関数はテーブル参照のみであり、1手先読みだけ」です。

かなり、「弱そうな仕様」です!

まぁ、そんな低レベルな仕様なので、すんなりと完成!
BASICって簡単・便利ですね。


しかし、強さ(弱さ)は想定内でしたが、速度が想像以上に遅いのでした。

そして、このポケコンリバーシをWindows版としてポケコン風に移植したのが、次のモノ



結構、そっくりに仕上がっていて満足しています。

Windows版 ポケコン風リバーシのダウンロードは以下です。
よろしかったら、お試し下さい。

Windows版は、ポケコンBASICのソースを全て流用していますが、「1手先読み」程度の処理では瞬間的に終わります。
※方言は少し変更する必要がありました

8月9日

そして、ポケコン版リバーシの激遅ぶりは、どうにも納得が出来ません。
初手を打つのに、10秒以上かかってしまっています。
なお、2手以降(多く置ける場所があれば)初手よりも時間がかります。

(私のプログラム能力も低いのかもしれませんが、色々ソースをいじくっても大して改善しませんでした)

「こうなったら、機械語を導入しよう!」・・・・と思い立ちました。

冒頭でも書きましたが、(私が)Z80を憶えているのでしょうか?

 

当時1987年頃までは、アセンブラ(ソフト)を使用しておらず、紙にコードを書いて、ハンドアセンブルをしていたのです。

かなり、当時はバリバリと作っていましたので、Z80機械語プログラミングの後期(それが1987年頃)になるとダイレクトに16進数が頭に浮かんで来る位のレベルになっていました。


・・・・・しかし、かなり忘れてしまっていました。

(ニーモニックに対応する16進数はおろか)機械語のプログラミングのコツみたいなものも忘却の彼方です。

30年ぶりにルービックキューブをやった時と近しい感覚です。(30年ぶりのルービックキューブは、6面をそろえるのに30分・・・いや1時間くらいかかったのです)

まずは、盤情報を機械語エリアにして、石の反転判定と反転処理を機械語にしてみます。
この処理は、コンピュータが全ての置ける位置に石を置いてから評価計算を行いますので、かなり多くの時間的コストが発生するのです。

以下の処理を、まずは機械語にしてみようかと思ったわけです。

・置いた石の隣に相手の石が置いてあるか?
・その方向の次の石を探索して、相手の石ならループ、自分の石なら反転可能
・この処理を8方向行う。

 

備忘録のため、コードを書いておきます。
(Z80を)思い出すのに時間がかかってしまったので、大分、余計なコメントが書いてあります。

盤情報は0200Hからで、"番人"はFFです。
石情報としては、0:石なし  1:白    2:黒

COL1アドレスに色情報 (置く石の色)
XYアドレスに、石を置く位置  (x+y*9  ※例  盤A1に置く場合は 1+1*9 = 10) 
REVアドレスに反転処理の有無  0なら置けるかの判断のみ、1なら石を反転させる。

以上をBASICからPOKEしてあげ、CALL &H100で実行

戻り情報として
FLAGアドレス  →  0なら置けない  1なら置ける

機械語をCALL後にBASICからFLAGアドレスをPEEKすれば、置けるかどうかが分かる。

また、処理上、頻繁に盤情報を元に戻すことも必要なので、盤情報のバックアップ・リストアも機械語にしました。

CALL BAKアドレスで、バックアップ
CALL RESTアドレスで、レストアが出来ます。



「きっと無駄だらけ(のコード)なんだろうな」


0100'                      ORG 0100H      
0100'                                      
0100'   0608               LD B,08H        ;    B=8
0102'   21AF01             LD HL,COL1      ;    HL=アドレスCOL1
0105'   7E                 LD A,(HL)       ;    A=COL1
0106'   E601               AND 01H         ;    A and 01 '1なら1、2なら0
0108'   3C                 INC A           ;    A=A+1
0109'   21B001             LD HL,COL2      ;    HL=アドレスCOL2
010C'   77                 LD (HL),A       ;COL2=A   'COL1の逆
010D'   4F                 LD C,A          ;    C=COL2
010D'                                      
010E'   110002   MAIN:     LD DE,BAN1      ;    DE=アドレスBAN1
0111'   2AB301             LD HL,(XY)      ;    HL=XY
0114'   19                 ADD HL,DE       ;    HL=XY+アドレスBAN
0115'   7E                 LD A,(HL)       ;A=BAN(HL)
0116'   FE00               CP 00H          ;    Aと0を比較 (A-0)
0118'   C25201             JP NZ,MA2       ;IF A<>0 THEN MA2 '終了
011B'   22B501             LD (XY0),HL     ;XY0=HL
011E'   22B701             LD (XY1),HL     ;XY1=HL
0121'   21B901             LD HL,FLAG      ;    HL=アドレスFLAG
0124'   3600               LD (HL),00H     ;FLAG=0
0126'   21BD01             LD HL,XYP       ;    HL=アドレスXYP
0129'   22BB01             LD (XYCT),HL    ;XYCT=HL
012C'   2ABB01   MA1:      LD HL,(XYCT)    ;    HL=XYCT (XYCT自体がアドレス)
012F'   56                 LD D,(HL)       ;    D=XYCT上位8ビット
0130'   23                 INC HL         
0131'   5E                 LD E,(HL)       ;    E=XYCT上位8ビット
0132'   21BA01             LD HL,FLAG1     ;    HL=アドレスFLAG1
0135'   3600               LD (HL),00H     ;FLAG1=0
0137'   2AB701             LD HL,(XY1)     ;    HL=XY1
013A'   22B501             LD (XY0),HL     ;XY0=XY1
013D'   19                 ADD HL,DE       ;    HL=HL+XYP(*)
013E'   22B501             LD (XY0),HL     ;XY0=XY0+XYP(*)
0141'   7E                 LD A,(HL)       ;A=BAN(HL)
0142'   B9                 CP C            ;    AとCOL2を比較 (Zフラグ 一致1 非一致0)
0143'   CC5301             CALL Z,CHE01    ;IF A=COL2 THEN GOSUB CHE01
0146'   2ABB01             LD HL,(XYCT)    ;    HL=アドレスXYCT
0149'   23                 INC HL          ;    HL=HL+1
014A'   23                 INC HL          ;    HL=HL+1
014B'   22BB01             LD (XYCT),HL    ;XYCT=XYCT+2
014E'   05                 DEC B           ;    B=B-1
014F'   C22C01             JP NZ,MA1       ;IF B<>0 THEN MA1
0152'   C9       MA2:      RET             ;QUIT
0152'                                      
0153'   3ABA01   CHE01:    LD A,(FLAG1)    ;    A=FLAG1
0156'   3C                 INC A           ;    A=A+1
0157'   32BA01             LD (FLAG1),A    ;FLAG1=FLAG1+1
015A'   19                 ADD HL,DE       ;    HL=HL+XYP(A)
015B'   22B501             LD (XY0),HL     ;XY0=XY0+XYP(*)
015E'   7E                 LD A,(HL)       ;A=BAN(HL)
015F'   B9                 CP C            ;    AとCOL2を比較
0160'   CA5301             JP Z,CHE01      ;IF A=COL2 THEN GOTO CHE01
0160'                                      
0163'   E5                 PUSH HL        
0164'   21AF01             LD HL,COL1      ;    HL=アドレスCOL1
0167'   4E                 LD C,(HL)       ;    C=COL1
0168'   E1                 POP HL         
0169'   B9                 CP C            ;    AとCOL1を比較
016A'   C28D01             JP NZ,CH2       ;IF A<>COL1 THEN CH2(RETURN)
016D'   E5                 PUSH HL        
016E'   21B901             LD HL,FLAG     
0171'   3601               LD (HL),01H     ;FLAG=1
0173'   E1                 POP HL         
0174'   3AAE01             LD A,(REV)      ;A=REV
0177'   FE01               CP 01H         
0179'   C28D01             JP NZ,CH2       ;IF REV<>1 THEN CH2(RETURN)
017C'   A7       CH1:      AND A           ;    ダミー処理 → キャリーフラグを0にする
017D'   ED52               SBC HL,DE       ;    HL=HL-A - キャリーフラグ
017F'   22B501             LD (XY0),HL     ;XY0=XY0-XYP(*)
0182'   71                 LD (HL),C       ;BAN(HL)=C
0183'   3ABA01             LD A,(FLAG1)    ;    A=FLAG1
0186'   3D                 DEC A           ;    A=A-1
0187'   32BA01             LD (FLAG1),A    ;FLAG1=FLAG1-1
018A'   C27C01             JP NZ,CH1       ;IF FLAG1<>0 THEN CH1
018D'   E5       CH2:      PUSH HL        
018E'   21B001             LD HL,COL2      ;    HL=アドレスCOL2
0191'   4E                 LD C,(HL)       ;    C=COL2
0192'   E1                 POP HL         
0193'   C9                 RET            
0194'   210002   BACK:     LD HL,BAN1     
0197'   115B02             LD DE,BAN0     
019A'   0600               LD B,00H       
019C'   0E51               LD C,51H       
019E'   EDB0               LDIR           
01A0'   C9                 RET            
01A1'   215B02   REST:     LD HL,BAN0     
01A4'   110002             LD DE,BAN1     
01A7'   0600               LD B,00H       
01A9'   0E51               LD C,51H       
01AB'   EDB0               LDIR           
01AD'   C9                 RET            
01AE'   01       REV:      DB 01H         
01AF'   01       COL1:     DB 01H         
01B0'   FF       COL2:     DB FFH         
01B1'   00       CT1:      DB 00H         
01B2'   00       CT2:      DB 00H         
01B3'   2800     XY:       DB 28H,00H     
01B5'   0000     XY0:      DB 00H,00H     
01B7'   0000     XY1:      DB 00H,00H     
01B9'   00       FLAG:     DB 00H         
01BA'   00       FLAG1:    DB 00H         
01BB'   0000     XYCT:     DB 00H,00H     
01BD'   FFF6FFF7FFF8FFFF XYP:      DB FFH,F6H,FFH,F7H,FFH,F8H,FFH,FFH
01C5'   000100080009000A           DB 00H,01H,00H,08H,00H,09H,00H,0AH
0200'                       ORG 0200H      
0200'   FFFFFFFFFFFFFFFFFF BAN1:     DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH
0209'   FF0000000100000100           DB FFH,00H,00H,00H,01H,00H,00H,01H,00H
0212'   FF0001000200020000           DB FFH,00H,01H,00H,02H,00H,02H,00H,00H
021B'   FF0000020202000000           DB FFH,00H,00H,02H,02H,02H,00H,00H,00H
0224'   FF0000000000000000           DB FFH,00H,00H,00H,00H,00H,00H,00H,00H
022D'   FF0000020202000000           DB FFH,00H,00H,02H,02H,02H,00H,00H,00H
0236'   FF0002000200010000           DB FFH,00H,02H,00H,02H,00H,01H,00H,00H
023F'   FF0200000200000000           DB FFH,02H,00H,00H,02H,00H,00H,00H,00H
0248'   FF0000000200000000           DB FFH,00H,00H,00H,02H,00H,00H,00H,00H
0251'   FFFFFFFFFFFFFFFFFF           DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH
025A'   FF                 DB FFH         
025B'   FF       BAN0:     DB FFH         


ここまで、コードをさらしたのだから、ついでにBASIC部分も貼っておこう。


 


10 'Pocket Reversi V1.1B
20 '
30 DIM B0(9,9),B1(9,9),F1(7),TB(9,9),SC(64),XB(64),YB(64)
40 '
50 CLS:PRINT "SETUP"
60 FOR X=1 TO 8:FOR Y=1 TO 8:READ TB(X,Y):NEXT:NEXT
70 '
80 AG=&H0100 'CALL
90 CB=&H0194 'CALL BACKUP
100 CR=&H01A1 'CALL RESTORE
110 '
120 AC=&H01AF 'COL1 '$01B0 COL2
130 AX=&H01B3 'XY
140 AF=&H01B9 'FLAG '$01A0 FLAG1
150 AR=&H01AE 'REV
160 AB=&H0200 'BAN1
170 '
180 I=&H0100
190 *READ1
200 READ V$:IF V$<>"END" THEN A=VAL("&H"+V$):POKE I,A:I=I+1:GOTO *READ1
210 CLS
220 '
230 B1=TB(2,1):B2=TB(2,2)
240 T1=30:T2=10
250 '
260 *START
270 CLS
280 LOCATE 2,0:PRINT "Pocket Reversi V1.1B"
290 LOCATE 6,2:PRINT "1:YOU vs CPU"
300 LOCATE 6,3:PRINT "2:CPU vs YOU"
310 LOCATE 2,5:PRINT "Program By TOMOKAZU";
320 *ST1
330 GOSUB *KEYWAIT
340 IF A<49 OR A>50 THEN *ST1
350 CLS
360 'BAN CLEAR
370 FOR X=0 TO 8:A=AB+X   :POKE A,255:NEXT
380 FOR X=0 TO 9:A=AB+X+81:POKE A,255:NEXT
390 FOR Y=1 TO 8:A=AB+Y*9 :POKE A,255:FOR X=1 TO 8:POKE A+X,0:NEXT:NEXT
400 X1=4:Y1=4:POKE AB+X1+Y1*9,1:GOSUB *PRTST
410 X1=5:Y1=4:POKE AB+X1+Y1*9,2:GOSUB *PRTST
420 X1=4:Y1=5:POKE AB+X1+Y1*9,2:GOSUB *PRTST
430 X1=5:Y1=5:POKE AB+X1+Y1*9,1:GOSUB *PRTST
440 '
450 X1=1:Y1=1
460 LINE(49,0)-(49,48)
470 X=54
480 Y=25:B=2:GOSUB *PRTS2
490 Y=33:B=1:GOSUB *PRTS2
500 GOSUB *PRT
510 CL=2:PS=0 'color,pass
520 IF A=50 THEN CY=1:GOTO *M1 ELSE CY=2
530 '
540 *MAIN
550 '
560 'MAN
570 GOSUB *PSCHECK
580 IF F=0 THEN
590  PS=PS+1:IF PS>=2 THEN *QUIT
600  LOCATE 9,1:PRINT "You Pass!"
610  LOCATE 9,2:PRINT "Hit Any Key":GOSUB *KEYWAIT
620 ELSE
630  LOCATE 9,0:PRINT "You (";:GOSUB *PRTWB
640  GOSUB *INP2
650 ENDIF
660 IF S1+S2=64 THEN *QUIT
670 CL=(CL AND 01)+1
680 GOSUB *MSGCLR
690 '
700 'CPU
710 *M1
720 LOCATE 9,0:PRINT "CPU (";:GOSUB *PRTWB
730 GOSUB *CPU
740 CL=(CL AND 01)+1
750 IF S1+S2=64 THEN *QUIT
760 GOTO *MAIN
770 '
780 *QUIT
790 'S1:Black(1) S2:White(-1)
800 GOSUB *MSGCLR
810 LOCATE 9,1
820 '
830 IF S1=S2 THEN
840  PRINT "DRAW"
850 ELSE
860  IF S1>S2 THEN
870   IF CY=2 THEN PRINT "You Win"  ELSE PRINT "You Lose"
880  ELSE
890   IF CY=2 THEN PRINT "You Lose" ELSE PRINT "You Win"
900  ENDIF
910 ENDIF
920 '
930 GOSUB *KEYWAIT 'OUT A
940 GOTO *START
950 END
960 '
970 *INP
980 GOSUB *KEYWAIT 'OUT A
990 IF A= 4 AND Y1>1 THEN Y1=Y1-1
1000 IF A= 5 AND Y1<8 THEN Y1=Y1+1
1010 IF A=14 AND X1<8 THEN X1=X1+1
1020 IF A=15 AND X1>1 THEN X1=X1-1
1030 B=PEEK(AB+X1+Y1*9)
1040 IF A=13 AND B=0 THEN
1050  POKE AC,CL 'SET COLOR
1060  GOSUB *CHECK
1070  IF F>0 THEN
1080   PS=0
1090   LINE((X1-1)*6,(Y1-1)*6)-((X1-1)*6+6,(Y1-1)*6+6),R,B
1100   POKE AB+X1+Y1*9,CL:GOSUB *PRTST:GOSUB *PRT
1110   RETURN
1120  ENDIF
1130 ENDIF
1140 *INP2
1150 IF X1<>X2 OR Y1<>Y2 THEN
1160  LINE((X2-1)*6,(Y2-1)*6)-((X2-1)*6+6,(Y2-1)*6+6),R,B
1170  LINE((X1-1)*6,(Y1-1)*6)-((X1-1)*6+6,(Y1-1)*6+6),S,B
1180 ENDIF
1190 X2=X1:Y2=Y1
1200 GOTO *INP
1210 '
1220 *CPU
1230 X3=X1:Y3=Y1
1240 CALL CB 'BACKUP
1250 CT=0
1260 POKE AC,CL 'SET COLOR
1270 FOR X1=1 TO 8:FOR Y1=1 TO 8
1280  F=0:IF PEEK(AB+X1+Y1*9)=0 THEN GOSUB *CHECK
1290  IF F>0 THEN
1300   CT=CT+1
1310   POKE(AB+X1+Y1*9),CL
1320   GOSUB *CALC
1330   SC(CT)=SC
1340   XB(CT)=X1:YB(CT)=Y1
1350   CALL CR 'RESTORE
1360  ENDIF
1370 NEXT:NEXT
1380 X1=X3:Y1=Y3
1390 IF CT=0 THEN
1400  PS=PS+1:LOCATE 9,1:PRINT "CPU PASS"
1410  LINE((X1-1)*6,(Y1-1)*6)-((X1-1)*6+6,(Y1-1)*6+6),S,B
1420  X2=X1:Y2=Y1
1430  RETURN 'PASS
1440 ENDIF
1450 '
1460 PS=0:SC=-10000:J=1
1470 FOR I=1 TO CT
1480  IF SC(I)>SC THEN J=I:SC=SC(I)
1490 NEXT
1500 X1=XB(J):Y1=YB(J):POKE AC,CL:GOSUB *CHECK
1510 POKE(AB+X1+Y1*9),CL:GOSUB *PRTST
1520 GOSUB *PRT
1530 RETURN
1540 '
1550 *CALC
1560 SC=0
1570 IF PEEK(AB+1+1*9)<>0 THEN TB(2,1)=T1:TB(1,2)=T1:TB(2,2)=T2
1580 IF PEEK(AB+1+8*9)<>0 THEN TB(2,8)=T1:TB(1,7)=T1:TB(2,7)=T2
1590 IF PEEK(AB+8+1*9)<>0 THEN TB(8,2)=T1:TB(7,1)=T1:TB(7,2)=T2
1600 IF PEEK(AB+8+8*9)<>0 THEN TB(7,8)=T1:TB(8,7)=T1:TB(7,7)=T2
1610 '
1620 FOR I=1 TO 8:FOR J=1 TO 8:B=PEEK(AB+I+J*9)
1630  IF B<>0 THEN
1640   IF B=CL THEN SC=SC+TB(I,J) ELSE SC=SC-TB(I,J)
1650  ENDIF
1660 NEXT:NEXT
1670 '
1680 TB(2,1)=B1:TB(1,2)=B1:TB(2,2)=B2
1690 TB(2,8)=B1:TB(1,7)=B1:TB(2,7)=B2
1700 TB(8,2)=B1:TB(7,1)=B1:TB(7,2)=B2
1710 TB(7,8)=B1:TB(8,7)=B1:TB(7,7)=B2
1720 RETURN
1730 '
1740 *CHECK
1750 POKE AX,X1+Y1*9:CALL AG
1760 F=PEEK(AF)
1770 RETURN
1780 '
1790 *PSCHECK
1800 POKE AR,0  'NON REV
1810 POKE AC,CL 'SET COLOR
1820 X3=X1:Y3=Y1
1830 FOR C=3 TO 1 STEP -1:D=(4-C)*2
1840  FOR E=0 TO D
1850   X1=C+E  :Y1=C    :F=0:IF PEEK(AB+X1+Y1*9)=0 THEN GOSUB *CHECK:IF F>0 THEN E=9:C=0:GOTO *PS1
1860   X1=9-C  :Y1=C+E  :F=0:IF PEEK(AB+X1+Y1*9)=0 THEN GOSUB *CHECK:IF F>0 THEN E=9:C=0:GOTO *PS1
1870   X1=9-C-E:Y1=9-C  :F=0:IF PEEK(AB+X1+Y1*9)=0 THEN GOSUB *CHECK:IF F>0 THEN E=9:C=0:GOTO *PS1
1880   X1=C    :Y1=9-C-E:F=0:IF PEEK(AB+X1+Y1*9)=0 THEN GOSUB *CHECK:IF F>0 THEN E=9:C=0
1890 *PS1
1900  NEXT
1910 NEXT
1920 X1=X3:Y1=Y3
1930 POKE AR,1  'MODE REV
1940 RETURN
1950 '
1960 *PRT
1970 S1=0:S2=0
1980 FOR I=1 TO 8:X=(I-1)*6+2
1990 FOR J=1 TO 8:Y=(J-1)*6+2
2000  B=PEEK(AB+I+J*9)
2010  IF B<>0 THEN
2020   IF B=2 THEN LINE(X,Y)-(X+2,Y+2),S,BF:S1=S1+1 ELSE LINE(X,Y)-(X+2,Y+2),R,BF:S2=S2+1
2030  ENDIF
2040 NEXT
2050 NEXT
2060 LOCATE 10,3:B=S1:GOSUB *NUMPRT
2070 LOCATE 10,4:B=S2:GOSUB *NUMPRT
2080 RETURN
2090 '
2100 *PRTST
2110 'IN X1,Y1
2120 X=(X1-1)*6+1:Y=(Y1-1)*6+1:B=PEEK(AB+X1+Y1*9)'B1(X1,Y1)
2130 GOSUB *PRTS2
2140 RETURN
2150 '
2160 *PRTS2
2170 'IN X,Y,B
2180 LINE(X+1,Y)-(X+3,Y)
2190 LINE(X,Y+1)-(X,Y+3)
2200 LINE(X+4,Y+1)-(X+4,Y+3)
2210 LINE(X+1,Y+4)-(X+3,Y+4)
2220 IF B=2 THEN LINE(X+1,Y+1)-(X+3,Y+3),S,BF ELSE LINE(X+1,Y+1)-(X+3,Y+3),R,BF
2230 RETURN
2240 '
2250 *NUMPRT
2260 'IN B
2270 V$=STR$(B):V$=LEFT$("   ",2-LEN(V$))+V$:PRINT V$;
2280 RETURN
2290 '
2300 *KEYWAIT
2310 'OUT A
2320 I$=INKEY$ :IF I$="" THEN A1=0:KB=0:GOTO *KEYWAIT
2330 A= ASC (I$):IF A=A1 THEN KB=KB+1:IF KB<20 THEN GOTO *KEYWAIT
2340 A1=A
2350 RETURN
2360 '
2370 *MSGCLR
2380 LOCATE 9,1:PRINT "              ";
2390 LOCATE 9,2:PRINT "              ";
2400 RETURN
2410 '
2420 *PRTWB
2430 IF CL=1 THEN PRINT "White)"; ELSE PRINT "Black)";
2440 RETURN
2450 '
2460 'table
2470 DATA  60,-20,  0, -2, -2,  0,-20, 60
2480 DATA -20,-40, -3, -3, -3, -3,-40,-20
2490 DATA   0, -3,  0, -1, -1,  0, -3,  0
2500 DATA  -2, -3, -1, -1, -1, -1, -3, -2
2510 DATA  -2, -3, -1, -1, -1, -1, -3, -2
2520 DATA   0, -3,  0, -1, -1,  0, -3,  0
2530 DATA -20,-40, -3, -3, -3, -3,-40,-20
2540 DATA  60,-20,  0, -2, -2,  0,-20, 60
2550 '
2560 DATA 06,08,21,AF,01,7E,E6,01,3C,21,B0,01,77,4F,11,00
2570 DATA 02,2A,B3,01,19,7E,FE,00,C2,52,01,22,B5,01,22,B7
2580 DATA 01,21,B9,01,36,00,21,BD,01,22,BB,01,2A,BB,01,56
2590 DATA 23,5E,21,BA,01,36,00,2A,B7,01,22,B5,01,19,22,B5
2600 DATA 01,7E,B9,CC,53,01,2A,BB,01,23,23,22,BB,01,05,C2
2610 DATA 2C,01,C9,3A,BA,01,3C,32,BA,01,19,22,B5,01,7E,B9
2620 DATA CA,53,01,E5,21,AF,01,4E,E1,B9,C2,8D,01,E5,21,B9
2630 DATA 01,36,01,E1,3A,AE,01,FE,01,C2,8D,01,A7,ED,52,22
2640 DATA B5,01,71,3A,BA,01,3D,32,BA,01,C2,7C,01,E5,21,B0
2650 DATA 01,4E,E1,C9,21,00,02,11,5B,02,06,00,0E,51,ED,B0
2660 DATA C9,21,5B,02,11,00,02,06,00,0E,51,ED,B0,C9,01,01
2670 DATA FF,00,00,28,00,00,00,00,00,00,00,00,00,FF,F6,FF
2680 DATA F7,FF,F8,FF,FF,00,01,00,08,00,09,00,0A,END       

 

そして、実行結果です。

約3倍程度、速くなりました。
(コンピュータの処理時間をオールBASICの時と比較して)15秒かかっていたのが5秒程度になりました。
まだまだ、多くの処理はBASICであり、ごく一部分だけを機械語にしたとしても、そんなトコロでしょう。

体感的に速くなったのでヨシとします。

次は、評価関数の処理を機械語にしてみようかな??