メモリを増設したファミリーベーシックにrs232c経由でパソコンをつないで、
パソコンからインテルhexファイルを流し込むプログラムを作ったので、
あまりにも少ない需要であるのはわかっているのですが、せっかくなので置いておきます。
テープにセーブするなり、romのすみに焼くなりしてつかってください。
ファイルを添付する方法がよくわからないのでそのままコピペです。
そのままソースと使える状態でこぴぺできるんだろうか?
アセンブラはアークピット様のxasmを使用しましたが、まあどうにでもなるんじゃないでしょうか。
;
; fbld1.asm
; ファミリーベーシック用インテルHEXファイルローダ
; Copyright (C) 2011, PuruPoo
;
; ファミリーベーシックキーボードカセット入力(READ)は4069の9番8番ピンを経由して
; $4016のD1につながっていますが、ここにMAX232等でレベル変換したRS232C入力を接続し、
; インテルHEXファイルを読み込みます。
;
; BASICのプロンプトよりCALL &H7E00としてプログラムを実行するとデータ待ち状態に
; なりますので、パソコンなどから4800bpsでインテルHEXファイルを送信してください。
; ロードが終了すればBASICのプロンプトに戻ります。PEEKなどで$7FE1の内容を確認し、
; 0なら正常終了です。
;
; $7E00からアセンブルされていますので、最低限メモリが4キロバイト必要ですが、
; アドレスを変更してアセンブルすれば標準の2キロバイトでも動作するはずですが、
; あまり意味はないと思います。
; オススメはメモリを標準の16キロビット(2キロバイト)・32キロビット(4キロバイト)
; SRAMを256キロビット(32キロバイト)SRAMに交換して若干の配線変更・追加で8キロバイト
; として使用することです。これならばBASICで3キロバイトちょっと、機械語で4キロバイトの
; フリーエリアが確保でき、わりとバランスのよい環境といえると思います。
;
; バイナリは以下の通りで、$FFが続いている場所はだいたいパッチのための隙間です。
;
;7E00:20 40 7E 20 D0 7E 20 30 7E 60 FF FF FF FF FF FF:74
;7E10:AD 16 40 29 02 D0 F9 60 A9 0B 8D E2 7F EA EA CE:9B
;7E20:E2 7F D0 F9 60 FF FF FF FF FF FF FF FF FF FF FF:7F
;7E30:A9 90 8D 00 20 60 FF FF FF FF FF FF FF FF FF FF:3C
;7E40:A9 10 8D 00 20 60 FF FF FF FF FF FF FF FF FF FF:BC
;7E50:A9 00 8D E5 7F 20 10 7E 20 18 7E A9 08 8D E6 7F:A1
;7E60:20 18 7E 20 18 7E A9 01 8D 40 40 AD 16 40 29 02:51
;7E70:18 2A 2A 2A 2A 2A 2A 8D E7 7F AD E5 7F 18 6A 0D:A7
;7E80:E7 7F 8D E5 7F A9 00 8D 40 40 CE E6 7F D0 D1 20:01
;7E90:18 7E 20 18 7E 60 FF FF FF FF FF FF FF FF FF FF:A2
;7EA0:38 E9 30 C9 0A 90 03 38 E9 07 60 FF FF FF FF FF:3A
;7EB0:20 50 7E AD E5 7F 20 A0 7E 18 2A 2A 2A 2A 8D E9:73
;7EC0:7F 20 50 7E AD E5 7F 20 A0 7E 0D E9 7F 60 FF FF:8F
;7ED0:A9 8D 8D EC 7F A9 60 8D EF 7F 20 50 7E AD E5 7F:31
;7EE0:C9 3A D0 7C 20 B0 7E 8D EB 7F 8D F0 7F 20 B0 7E:DE
;7EF0:8D EE 7F 18 6D F0 7F 8D F0 7F 20 B0 7E 8D ED 7F:31
;7F00:18 6D F0 7F 8D F0 7F 20 B0 7E C9 01 F0 57 C9 00:18
;7F10:D0 4E 20 B0 7E 20 EC 7F 18 6D F0 7F 8D F0 7F 18:FF
;7F20:EE ED 7F 90 03 EE EE 7F CE EB 7F D0 E5 20 B0 7E:83
;7F30:8D F1 7F 18 6D F0 7F C9 00 D0 25 20 50 7E AD E5:2F
;7F40:7F C9 3A D0 F6 4C E4 7E FF FF FF FF FF FF FF FF:EE
;7F50:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF:F0
;7F60:A9 02 4C 73 7F 20 B0 7E C9 FF D0 05 A9 00 4C 73:3C
;7F70:7F A9 01 8D E1 7F 60 FF FF FF FF FF FF FF FF FF:6D
;
; 以下ソースリスト
;
org $7e00
LED equ $4040
;CNTRD equ $4044
;CNTRST equ $4045
PPUC1 equ $2000
SIN equ $4016
HALFWAIT equ 11 ;4800BPS
;HALFWAIT equ 25 ;2400BPS
;割り込み停止
jsr disint
;インテルhexロード
jsr ihx
;割り込み再開
jsr enint
rts
ifndef RUN
ds 6
endif
;=====================================================
;
;
;スタートビットを待つ(1->0になるのを待つ)
wtsb lda SIN
and #$02
bne wtsb
rts
;=====================================================
;
;
;カウンタを初期化し指定値まで待つ
wait lda #HALFWAIT
sta wcnth
waitlp1 nop
nop
dec wcnth
bne waitlp1
rts
ifndef RUN
ds 11
endif
;=====================================================
;
;割り込み再開
enint lda #$90
sta PPUC1
rts
ifndef RUN
ds 10
endif
;
;
;
;=====================================================
;
;割り込み停止
;
disint lda #$10
sta PPUC1
rts
ifndef RUN
ds 10
endif
;
;
;
;=====================================================
;
;1文字取得
get1c equ *
;
lda #0
sta sdata
jsr wtsb
jsr wait
lda #8
sta bcnt
lp5 jsr wait
jsr wait
lda #1
sta LED
lda SIN
and #$02
clc
rol a
rol a
rol a
rol a
rol a
rol a
sta ord
lda sdata
clc
ror a
ora ord
sta sdata
lda #0
sta LED
dec bcnt
bne lp5
;ストップビット待ち
jsr wait
jsr wait
rts
ifndef RUN
ds 10
endif
;
;
;=====================================================
;
;
;ASCII -> HEX (1バイト)
;
a2hh equ *
sec
sbc #$30
cmp #$a
bcc a2hhl1
sec
sbc #7
a2hhl1 equ *
rts
ifndef RUN
ds 5
endif
;
;
;=====================================================
;
;16進文字列2バイト取得して1バイトとして返す
a2h equ *
jsr get1c
lda sdata
jsr a2hh
clc
rol a
rol a
rol a
rol a
sta a2hb
jsr get1c
lda sdata
jsr a2hh
ora a2hb
rts
ifndef RUN
ds 2
endif
;=====================================================
;
;
;intelHEXデコード
;
;
;エントリ
ihx equ *
;データ格納用命令初期化
lda #$8d ;sta abs
sta addra
lda #$60 ;rts
sta addrr
;':'確認
jsr get1c
lda sdata
cmp #':'
bne ihxl1 ;':'以外のものが来たのでエラー処理に
ihxl5 equ *
;データ長取得
jsr a2h
sta dlen
sta sum ;チェックサム初期化
;アドレス取得
jsr a2h
sta addrh
clc
adc sum
sta sum
jsr a2h
sta addrl
clc
adc sum
sta sum
;レコードタイプ確認
jsr a2h
cmp #1
beq ihxl6 ;エンドレコードの処理に
cmp #0
bne ihxl1 ;知らないレコードタイプなのでエラー処理に
;データレコード処理
ihxl2 equ *
jsr a2h
jsr addra
clc
adc sum
sta sum
clc
inc addrl
bcc ihxl3
inc addrh
ihxl3 equ *
dec dlen
bne ihxl2
;チェックサム処理
jsr a2h
sta orgsum
; nop
; nop
; nop
; nop
clc
adc sum
; sta sum
cmp #0
bne ihxl1 ;チェックサムが合わなかったのでエラー処理に
;':'待ち
ihxl4 equ *
jsr get1c
lda sdata
cmp #':'
bne ihxl4
jmp ihxl5
ifndef RUN
ds 24
endif
;=====================================================
;
;
;intelHEXデコードエラー処理、エンドレコード処理
;
;
;エラー処理
ihxl1 equ *
lda #2
jmp ihxl8
;エンドレコード処理
ihxl6 equ *
jsr a2h
cmp #$ff
bne ihxl7
lda #0
jmp ihxl8
ihxl7 lda #1
ihxl8 sta ihxres
rts
;=====================================================
;
;変数
org $7fe0
adj ds 1
ihxres ds 1
wcnth ds 1
wcntl ds 1
wc ds 1
sdata ds 1
bcnt ds 1
ord ds 1
smax ds 1
a2hb ds 1
hl ds 1
dlen ds 1
addra ds 1 ;sta abs
addrl ds 1
addrh ds 1
addrr ds 1 ;rts
sum ds 1
orgsum ds 1