Skip to content

Instantly share code, notes, and snippets.

@kkismd
Created May 13, 2023 11:04
Show Gist options
  • Save kkismd/161daaa06d1e4614c12773bcd8214f9c to your computer and use it in GitHub Desktop.
Save kkismd/161daaa06d1e4614c12773bcd8214f9c to your computer and use it in GitHub Desktop.
EMUZ80-6502RAM VTLC02-GM ASCIIART Compile sample
CALL$EA00
==02000
&=0
10 F=50
20 Y=-12
30 X=-39
40 C=X*229/100
50 D=Y*416/100
60 A=C
70 B=D
80 I=0
90 Q=B/F S=B-(Q*F)
100 T=((A*A)-(B*B))/F+C
110 B=2*((A*Q)+(A*S/F))+D
120 A=T
130 P=A/F Q=B/F
140 ;=((P*P)+(Q*Q))>5 #=180
150 I=I+1 ;=I<16 #=90
160 ?=" ";
170 #=200
180 ;=I>10 I=I+7
190 $=48+I
200 ;=X<39 X=X+1 #=40
210 ?=""
220 ;=Y<12 Y=Y+1 #=30
==0400
&=0
10 G=02000 ?="source program start at $2000"
20 S=03000 ?="object code start at $3000"
30 A=S
40 P=1 ?="pass 1" ?="Line Object Source" !=100
50 A=S D=080
60 G=02000 P=2 ?="pass 2" !=100
80 ?="program size: "; ?=A-S ?=" ("; ??=S ?="-"; ??=A-1 ?=")"
90 ?="end" #=0FFFF
100 ) 1-2 PASS ROUTINE
110 O=1
200 ) TOP OF LINE
210 V=G@0+(G@1*256)
220 B=G@0 ;=B=0FF :O)=07FFF :O+1)=0EA1B @=A,04C <=A+1,0EA1B A=A+3 ]
225 ?=V ?=" "; ??=A ?=" "; ??=G ?=""
230 ;=P=1 :O)=V :O+1)=A O=O+2
240 G=G+3
300 )** TOP OF STATEMENT **
310 N=G@0 M=G@2
320 ;=N=")" #=900
330 ;=M=""" #=2300
350 ;=N="#" Q=04C #=1000
360 ;=N="!" Q=020 #=1000
370 ;=N="]" #=1100
400 ;=N="?" #=2500
410 ;=("Z">N)*(N>"A") #=5000
420 ;=N=";" #=5500
460 ;=N="$" G=G+2 Z=0FD39 #=2900
480 ;=N=" " #=700
490 ?="G="; ??=G ?=" N="; $=N ?=" "; #=20000
500 K=0 ;=G@0="0" G=G+1 #=530 ) parse num (dec or hex)
510 E=G@0-030 ;=(E<0)+(9<E) ]
520 K=K*10+E G=G+1 #=510
530 H=G@0 E=H-(030*(H<"A"))-(037*(H>"9"))
540 ;=(E<0)+(E>15) ]
550 K=K*16+E G=G+1 #=530
600 @=A,0E8 A=A+1 @=A,0E8 A=A+1 ] ) eb inx x2 ; argスタックのプッシュ
610 @=A,0CA A=A+1 @=A,0CA A=A+1 ] ) ca dex x2 ; argスタックのポップ
620 @=A,0A2 A=A+2 @=(A-1),0E0 ] ) a2e0 ldx #arg ; argスタックのポインタxを初期化
630 !=600 !=4000 !=610 ] ) パースした値を次のargに入れる
700 )** END OF STATEMENT **
710 ;=G@0=0 G=G+1 #=200
730 ;=G@0=" " G=G+1 #=710
740 #=300
900 )** REM **
910 ;=G@0=0 G=G+1 #=200
920 G=G+1 #=910
1000 G=G+2 !=1400
1010 #=700
1100 G=G+1 @=A,060 A=A+1 #=700
1400 ;=G@0="-" G=G+1 !=500 K=07FFF #=1500 ) マイナスならプログラム終了の処理
1410 !=500 ) 数値をパースしてKにセット
1500 @=A,Q A=A+3 ;=P=1 ] ) pass1ならJP/CALLをセットして終わる
1510 J=-1 { J=J+2 X=:J) }=X>K ) pass2なら飛び先アドレスをラベルテーブルから検索
1520 ??=:J+1) ?="" ) ヒットしたアドレスを表示
1530 <=(A-2),(:J+1)) ] ) 飛び先アドレスをオペランドにセットして終了
2300 G=G+2 @=A,04C A=A+1 I=2 ) 4c1e06 jmp L2
2310 Q=A+2 { C=G@(I-1) @=A+I,C I=I+1 }=C="""
2320 <=A,(A+I) G=G+I-1 A=A+I
2330 @=A,0A9 A=A+2 @=A-1,(Q&0FF) ) a902 lda #<L1
2340 @=A,085 A=A+2 @=A-1,080 ) 8580 sta $80
2350 @=A,0A9 A=A+2 @=A-1,(Q/256) ) a906 lda #>L1
2360 @=A,085 A=A+2 @=A-1,081 ) 8581 sta at+1
2370 @=A,0A2 A=A+2 @=A-1,(""") ) a200 ldx #'"'
2380 @=A,0A0 A=A+2 @=A-1,0 ) a000 ldy #0
2390 @=A,020 A=A+3 <=A-2,0EB22 ) 2022eb jsr outmsg
2400 N=G@0 ;=N=";" G=G+1 #=700
2410 @=A,0A9 A=A+2 @=A-1,13 ) a90d lda #13
2420 @=A,020 A=A+3 <=A-2,0FD39 ) 2039fd jsr outch
2430 #=700
2500 ;=G@1#"=" #=2600 ) ?のうしろが=じゃない場合次へ
2510 G=G+2 Z=0EC57 #=2900 ) 単純な10進数値出力 -> サブルーチンのアドレスをセット
2900 !=3000 ) 式のパース処理
2910 @=A,0A5 A=A+2 @=(A-1),0E0 ) a5e0 lda arg[0]
2920 @=A,020 A=A+3 <=(A-2),Z #=700 ) 20xxxx jsr xxxx
2999** EXPRESSION **
3000 !=620 ) xを初期化
3010 !=4000 ) 左辺をパースして結果をarg[x]に保存
3200 H=G@0 G=G+1 ) 演算子を取り出す
3210 ;=H="+" !=630 H=0EE3A #=3500 ) 足し算
3220 ;=H="-" !=630 H=0EE48 #=3480 ) 引き算
3230 ;=H="*" !=630 H=0EE00 #=3500 ) 掛け算
3240 ;=H="/" !=630 H=0EF0C #=3500 ) 割り算
3250 ;=(H#"<")*(H#"=")*(H#">") #=3290 ) 比較の場合
3260 C=H !=600 !=4000 !=610 ) 演算子をCに退避して右辺をパース
3270 @=A,0A9 A=A+2 @=(A-1),C ) a8xx lda #{H} 演算子をAレジスタに
3280 H=0EE88 #=3480 ) 比較のルーチンを呼ぶ
3290 G=G-1 ] ) 演算子でなかったのでポインタを戻して終了
3480 @=A,038 A=A+1 ) 38 sec ; 引き算の前にキャリークリア
3490 @=A,0CA A=A+1 ) ca dex ; 引き算等はpre-decrementが必要
3500 @=A,020 A=A+3 <=A-2,H #=3200 ) 20xxxx jsr {H}
3999 ) ** 項のパース処理 **
4000 H=G@0 G=G+1 ) 先頭から文字を1つ取り出す
4010 ;=(H>"0")*(("9")>H) #=4210 ) 数値か?
4020 ;=H=""" #=4200 ) 文字か?
4030 ;=H="-" !=500 K=0-K !=8887 #=4230 ) マイナス記号? -> 符号反転
4040 ;=(H<"A")+(H>"Z") #=4500 ) その他システム変数(記号)の処理
4060 H=2*H|128 ) 変数参照処理
4070 @=A,0A5 A=A+2 @=(A-1),H ) A5XX lda {H} ; 変数の16bit値をarg[x]にセット
4080 @=A,095 A=A+2 @=(A-1),0 ) 9500 sta 0,x
4090 @=A,0A5 A=A+2 @=(A-1),(H+1) ) A5XX lda {H}+1
4100 @=A,095 A=A+2 @=(A-1),1 ] ) 9501 sta 1,x
4200 K=G@0 G=G+2 #=4270 ) 文字→バイト値
4210 G=G-1 !=500 ) 数値をパースして結果をarg[x]にセットする
4230 @=A,0A9 A=A+2 @=(A-1),(K&255) ) a9XX lda <#K ; Aにパース結果のLSBをロード
4240 @=A,095 A=A+2 @=(A-1),0 ) 9500 sta 0,x
4250 @=A,0A9 A=A+2 @=(A-1),(K]8) ) a9XX lda >#K
4260 @=A,095 A=A+2 @=(A-1),1 ] ) 9501 sta 1,x
4270 @=A,0A5 A=A+2 @=(A-1),K ) A5XX lda {K}
4280 @=A,095 A=A+2 @=(A-1),0 ) 9500 sta 0,x
4290 @=A,074 A=A+2 @=(A-1),1 ] ) 7401 stz 1,x
4500 ;=H#"(" #=4600
4510 !=3010 ;=G@0#")" #=20000 ) 括弧の処理
4520 G=G+1 ]
4800 ;=H="#" #=-1
4890 #=20000
4999 ) ** 変数への代入処理 **
5000 Z=2*(G@0)|128 ) 変数名からアドレスを求めてZにセットする
5300 G=G+2 !=3000 ) パラメータの値をarg{0}にセット
5310 @=A,0A5 A=A+2 @=(A-1),0E0 ) a5e2 lda arg
5320 @=A,085 A=A+2 @=(A-1),Z ) 85XX sta {Z}
5330 @=A,0A5 A=A+2 @=(A-1),0E1 ) a5e3 lda arg+1
5340 @=A,085 A=A+2 @=(A-1),(Z+1) #=700 ) 85XX sta {Z}+1
5499 ) *** IF statement ***
5500 ;=G@1#"=" #=20000 ) イコールがなければエラー
5510 G=G+2 !=3000 ) ポインタを進めてパラメータをパース
5520 @=A,0B5 A=A+2 @=(A-1),0 ) b500 lda 0,x
5530 @=A,015 A=A+2 @=(A-1),1 ) 1501 ora 1,x
5540 @=A,0D0 A=A+2 @=(A-1),3 ) d003 bne next_statement
5550 Q=04C K=V+1 !=1500 #=700 ) 4cxxxx JMP xxxx ; 次の行へジャンプ
8887 ?="K="; ?$=K&255 ?=":"; ?$=K]8 ?="" ]
8888 ?="**** "; ?="O="; ?=O-2 ?=" LINE="; ?=:O-2) ?=" ADDR="; ??=:O-1) ?=" ****" ]
20000 ?="ERROR AT "; ?=!-1 #=-1
#=1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment