hra1129 / msx_basic_compiler

MSX-BASICコンパイラ
MIT License
22 stars 2 forks source link

コンパイラが不正なコードを生成 #19

Closed baseballcap-mio closed 4 months ago

baseballcap-mio commented 5 months ago

下のプログラムをコンパイルすると不正なコードが生成され、ZMAが通らない。 1000 'SAVE"TEST.BAS" 1010 DEFINT A-Z 1020 COLOR 15,0,0:SCREEN 5,2,0 1030 DIM S1$(15),S2$(15) 1040 GOSUB 1130:'Set palette 1050 GOSUB 1200:'Set sprite 1060 PUT SPRITE 0,( 0, 0) 1070 RESTORE 1080 GOSUB 1360:'Plot enemy 1090 'COPY (16,0)-(31,7) TO "TEST.DAT" 1100 BEEP 1110 IF INKEY$="" THEN 1110 1120 END 1130 'Set palette 1140 COLOR=( 0,0,0,0):'Transparent 1150 COLOR=( 1,7,2,0):'Orange 1160 COLOR=( 2,0,0,7):'Blue 1170 COLOR=( 3,7,7,0):'Yellow 1180 COLOR=(15,7,7,7):'White 1190 RETURN 1200 'Set sprite 1210 'FOR K=0 TO 3 1220 FOR J=0 TO 1 1230 L$="":R$="" 1240 READ D$:D=VAL("&B"+D$)16 1250 READ D$:D=D+VAL(D$) 1260 COLOR SPRITE(K2+J)=D 1270 FOR I=1 TO 16 1280 READ D$ 1290 L$=L$+CHR$(VAL("&B"+ LEFT$(D$,8))) 1300 R$=R$+CHR$(VAL("&B"+RIGHT$(D$,8))) 1310 NEXT 1320 SPRITE$(K2+J)=L$+R$ 1330 NEXT 1340 'NEXT 1350 RETURN 1360 'Plot enemy 1370 'FOR L=0 TO 3 1380 READ D$:READ C1 1390 FOR I=0 TO 15 1400 READ D$:S1$(I)=D$ 1410 NEXT 1420 READ D$:READ C2 1430 FOR I=0 TO 15 1440 READ D$:S2$(I)=D$ 1450 NEXT 1460 'FOR K=0 TO 2 1470 FOR J=0 TO 15 1480 FOR I=0 TO 15 1490 D1=VAL(MID$(S1$(J),I+1,1)) 1500 D2=VAL(MID$(S2$(J),I+1,1)) 1510 C=(D1C1 OR D2*C2) 1520 PSET(16+I, J),C 1530 NEXT 1540 NEXT 1550 'NEXT 1560 'NEXT 1570 RETURN 1580 'Enemy data 1590 'Yellow(0) 1600 DATA 0000,1 1610 DATA 0000000000000000 1620 DATA 0000000000000000 1630 DATA 0000000000000000 1640 DATA 0000000010000000 1650 DATA 0000000111000000 1660 DATA 0000001111100000 1670 DATA 0000111111111000 1680 DATA 0000111111111000 1690 DATA 0000011111110000 1700 DATA 0000001010100000 1710 DATA 0000000010000000 1720 DATA 0000000010000000 1730 DATA 0000000010000000 1740 DATA 0000000010000000 1750 DATA 0000000000000000 1760 DATA 0000000000000000 1770 'Yellow(1) 1780 DATA 0100,2 1790 DATA 0000000000000000 1800 DATA 0000000000000000 1810 DATA 0000000000000000 1820 DATA 0000000000000000 1830 DATA 0001000000000100 1840 DATA 0001000000000100 1850 DATA 0001100101001100 1860 DATA 0001111101111100 1870 DATA 0001111111111100 1880 DATA 0000111010111000 1890 DATA 0000011010110000 1900 DATA 0000001010100000 1910 DATA 0000000010000000 1920 DATA 0000000010000000 1930 DATA 0000000000000000 1940 DATA 0000000000000000 

ZMAで下のようなエラーがでる。 ERROR:Illegal operand.: test-bacon.asm(312) ERROR:Illegal operand.: test-bacon.asm(340) ERROR:Illegal operand.: test-bacon.asm(367) ERROR:Illegal operand.: test-bacon.asm(394) ERROR:Illegal operand.: test-bacon.asm(421) ERROR:Illegal expression.: test-bacon.asm(930) ERROR:Illegal operand.: test-bacon.asm(930) ERROR:Illegal expression.: test-bacon.asm(973) ERROR:Illegal operand.: test-bacon.asm(973) Found 9 error(s). Failed.

以上です。

hra1129 commented 4 months ago

1240 READ D$:D=VAL("&B"+D$)16

なにかが化けてしまって、最後 )16 になっているのですが、実際はどんな記述でしょうか? この部分だけ全角で書いて頂けると、化けないと思います。

hra1129 commented 4 months ago

試しに )*16 としてみたところ、エラーが再現しました。 これで追跡してみようと思います。

hra1129 commented 4 months ago

直しました。

(1) COLOR=() のコンパイル結果で、OR D,L を生成していたバグを修正 (2) COLOR=() のコンパイル結果で、青の色の処理を誤っていたバグを修正 (3) 最適化ルーチンにおいて、定数代入にのみ適用すべきところを、レジスタ転送でも適用してアセンブル不能なコードを生成していたバグを修正

これで期待通り動作するようになりました。 ただし、現状では SCREEN4以上の PUT SPRITE の実装が不完全で、 重ね合わせスプライトの自動追従が未実装です。 面倒な処理なのでずいぶん前から放置してますが、公知の問題なので、別 issue として挙げておきました。

baseballcap-mio commented 4 months ago

迅速な対応ありがとうございました。 スプライトの件のご説明ありがとうございます。 リストが文字化けしていたことに気づけず、すみません。 こちらも、動作を確認し、期待通りに動いたので、本イシューをクローズします。