日本橋電気街徘徊日誌

いいとしのおっさんがジャンク屋で買ったものをいじったり電子工作したりします。

ファミリーベーシック改造(その5)

2011-07-08 12:38:04 | 日記


メモリを増設したファミリーベーシックに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

 

 


ファミリーベーシック改造(その4)

2011-07-06 17:52:42 | 電子工作


ファミリーベーシックV2(V2しかみたことない)はメモリが2キロバイトしかなく、
ちょっと複雑なことをしようと思うと入りきらないということがよくあるように思います。

そこで、今ごろファミリーベーシックを実機でいじろうとしているごく少数の方向けに
メモリを2キロバイトから8キロバイト(ベーシック用4キロバイト・機械語用4キロバイト)に
増設する方法についてまとめました。作業を思い出しながら書いているので間違っていた場合はこめんなさい。

V2のカセットをあけると、MB8416Aという24ピンのSRAMが基板左上に見えます。
この24ピンSRAMを比較的手に入りやすい28ピンの32キロバイトSRAM(例ではTC55257)と
置き換える上で何が共通で何が共通でないか確認すると以下のようになります。


赤で囲った部分は両者で共通のピンですのでそのまま接続できます。
共通でない以下のピンはピンをL時に下り、以下のように接続します。

 1 A14 GNDに接続します。
 2 A12 ROMにA12がありますので接続します。
23 A11 ROMにA11がありますので接続します。
26 A13 GNDに接続します。
27 RW  基板側21番ピンに接続します。
28 VDD 基板の適当なところから電源をとります。


これでハードウェア的には$6000から8キロバイト使用できますが、ファミリーベーシックは
いつもの通り2キロバイトしか認識しませんし、リセットしても初期化もされないようですが、
メモリバックアップの対象にはなっています。終了時ベーシックの保存方法を間違えて、
ベーシックのリストが消えてしまってもともと存在していない領域は初期化されないようです。

ベーシックのフリーエリアを増やす場合はベーシック起動後POKE 4,&H7Fでフリーエリアが
だいたい4キロバイトになります。$6000からの4キロバイトは機械語で使用するしかないようです。


じっさいに改造する場合のコツとしては、けちけちしないということがあります。
もともとついている24ピンのSRAMをきれいに外して、後で元に戻せるようにしたいと
考えると思いますが、なれていないと外す過程で基板を壊す可能性が高いので
けちけちせずにニッパで足を切って外すべきです。