| HOME | アマチュア無線 | パソ通 | 平群 | PC-1245 | MSX | PC-9800 | PDA | オリジナル曲 | あとがき |
トップ
- @POCKET TETRIS Ver1.1(テトリスです)
なにげにインターネットをさまよっていた所、 SC61860(PC-1245のCPUです。Hi)用の アセンブラを見つけました。 アセンブルするとCLOADM命令でそのまま読み込める WAVファイルができる優れものです。 アイデア自体は「ポケコンマシン語入門」にも載っているFM−8のクロスアセンブラそのままですが、 Winマシン(私のはオンボロ98ですが)で手軽に使えるのがうれしい。 ただしPerl を事前にインストールしておかなければならず、そこがネックですが、 全部デフォルト設定でインストールすれば問題なく使用できました(^^)v。 それで、何かを作ってみたくなり、これができました。 パッケージの取扱説明書中にダンプリストが入っていますので、 カセットインターフェースがない方でも大丈夫です。(ver1.0…14年12月)。
→キーにリピートがかかるように変更しました。(ver1.1…16年1月)
ソースが見たい方はこちら→tetris.S
- APOCKET LIFE GAME Ver1.0(ライフゲームです)
ゲーム1つではさびしいので、ライフゲームを作ってみました。 ライフゲームの詳細については検索サイトで調べてみると、 いくつか専門のサイトで解説されているのでそちらをご覧になってください。 以前(と言っても20年以上前ですが)、 何かの雑誌でBASICでライフゲームを動かすのは、 パソコンでも速度的に非常に厳しいようなことが書いてあった記憶があり、 クロックが500kHzそこそこ(しかも1命令実行するのに何クロックもかかる)のポケコンでは、 たとえマシン語で組んでも実用的な速度が出ないのではないかと 心配しましたが、作ってみたら、1世代進むのに1秒程度ということで、 結構遊べるものになったのではないかと思います。 (ver1.0…16年3月)
ソースが見たい方はこちら→life.S
- B足し算ゲーム Ver1.0
子供に足し算を覚えさせようとして作りましたが、 大人が遊んでも結構、ハマることが分かったので公開。 簡単な計算でも、時間がかかるよりは早く間違いなく計算できるようになった方が、 仕事の効率も上がるかもしれない。 そろばんで暗算の得意な人は、ひょっとしたら桁が足りなくなるもしれません。 簡単なBASICプログラムです。リスト同梱につき、カセットインタフェースは なくてもOK。(ver1.0・・・20年11月)
- CSHOOT1 Ver1.5
このプログラムは相当気合を入れて作ったシューティングゲームです。 ステージの終わりにはボスも登場いたします。 最初はなかなかボスに会えなかったり、 会えても倒せないかもしれませんが、 コツをつかめば2面には進めると思います。 「SHOOT1」と言うからには「2」があるのか?・・・お楽しみに (ver1.0・・・21年1月)
2面以降で得点計算が正しく行われていない場合があったので、 BASICプログラムを少し修正しました。根本原因が不明なので、 「とりあえず対応」です(^_^;(ver1.1…21年3月7日)
キーリピートを固定にしていましたが、低速時(1面)で自機の移動速度が 速すぎて自分の撃った弾に追いついてしまう上、当たると死ぬバグがあったので、 直しました。そのほか、ちょこちょこ修正(ver1.2…21年3月13日)
自弾の数を5→7に増やしたほか、ちょこっと修正。これによりステージ3クリアも 比較的簡単になりました(ver1.3…21年4月8日)
自弾の数を7→10に増やしたほか、ちょこっと修正(ver1.4…21年4月10日)
自弾の数を10→7に戻した。連射速度を自機の位置により変えるようにした。 少し1面の速度を速くした。これにより、多分、従来の得点は取れなくなりました。 でも、1面が退屈だったので、このくらいでちょうどよいと思います (ver1.5…21年4月17日)
※ソースはパッケージ内に同梱としました
トップ
- @BAS to WAV Ver1.1
BASICのテキストを元に、CLOAD命令で読み込めるWAVファイルを 作成するPERLスクリプトです。 yasm.plの WAV作成部分を勝手に借りました(すみません)。(ver1.0…21年2月初旬)
「SCORE」表示をよく見たら「SC OR RE」になっていたので あわてて修正(^^;(ver1.1…21年2月23日)
「大きなファイルになると、きちんとロードできない変なWAVができる」というレポートを頂いたので、修正してみたバージョン(24年1月5日)
bas2wav.pl もう私の家には、まともに動作する実機がないので、これできちんと動くかどうか確認できません。レポートください。お願いします
- Aメロディ演奏ツール ver1.1
さしあたっては「風の谷のナウシカ(オープニング)」を鳴らすだけの プログラムですが、発音ルーチン自体は汎用的に作った(積もり)なので、 他の曲もデータをセットすれば演奏することができます。(ver1.0…21年6月27日)
演奏中、BRKキーで中断できるようにしました(ver1.1…21年7月3日)
「天空の城ラピュタ(君をのせて)」も 入力してみました(メロディ以外、パッケージ内容は同じです:21年6月30日)
同様にBRKキーで中断できるよう修正済み(21年7月3日)
最近はポケコンのページもちらほらできてきて、ここ以外にも、 WAVファイルをダウンロードできるサイトがあるようです。 カセットインターフェースがないと少々辛くなってきています。 CE−124(カセットインターフェース)を入手できると一番よいのですが、 現在、入手困難と思われます。 で、適当に作ってしまおうというのがこのコーナーです。トップ
ポケコンの回路図を眺めていると、 ポケコンの左側面にあるコネクタの上から2番目にGND(マイナス)、 7番目に音声を入力すればよいようなので、 百円ショップでイヤホンを買い、コードを途中でぶった切ってポケコンに突っ込んでみましたが、 パワー不足でうまくいきません。 それで、キット のアンプを買って途中に入れてみると、 一応読み込みに成功しました。 線をポケコンのコネクタに突っ込む際は、銅線のままではうまく入らないので、 キットを組み立てる際にできるゴミ(部品の足)を利用するとよいと思います。 クリップを伸ばして使ってもよいのですが、ハンダがうまくついてくれませんでした。 「製作」とたいそうなタイトルをつけている割にはキット利用(というかキットそのもの)ですみません。
POKE命令でメモリに値を書込み、CALLでマシン語ルーチンを呼び出します。 また、メモリに入っている内容はPEEK命令で見ることができます。 BASICプログラムは$C000番地から記録されていくので、 マシン語の開始アドレスは$C100番地から始めればちょうどいいようです。 なお、PC−1245のBASICはコマンド入力か プログラム中のどちらかでしか使えない命令がほとんどですが、 POKE、PEEK、CALL等はどちらでも使用できるようです。トップ
命令 説明 使用例 POKE 指定した番地に指定した値を書き込む命令。 1バイトずつ書き込む他、行が続く限り連続して書き込むことも可能。 PC−1245では&は16進数にする働きがある。 &FFと書いても255と書いても同じ。 @POKE &C100,&79
APOKE 49409,&C4,$00
BPOKE &C400,55PEEK 指定した番地の値を読み出す命令。 POKEと違って1バイトずつしか読み出せない。 直接実行して画面に値を表示することもできるし、 入力例のように変数に代入することもできる。 @PEEK &C100
AA=PEEK 49408CALL 指定した番地からマシン語ルーチンを 実行する命令。プログラムが間違っていると暴走する。 @CALL &C100
ACALL 49408CLOADM テープやWAVファイルからマシン語プログラムを読み込む命令。 読み込む番地を指定したり、ファイル名を指定できるが、 特に指定しなくてもSAVE時の通りに読み込まれるので問題ない。 @CLOADM
ACLOADM "ABC"
BCLOADM &C100
CCLOADM "ABC";&C100CSAVEM テープにマシン語プログラムを書き出す命令だが、Winに付属のサウンドレコーダで WAVファイルにしてしまうのがお手軽。 ファイル名は省略できるが、開始アドレスと終了アドレスは省略できない。 @CSAVEM "ABC";&C100,&C106
ACSAVEM &C100,&C106
トップ
- 【1】プログラムの入力・実行の仕方
- @右上のスライドスイッチを「PRO」のポジションにする。
ABASICの場合はそのままリストを入力する。 1行入力する都度、「ENTER」を押す。押すと、 行番号の横に:がついたり、命令の前後にスペースが入るなどの編集が自動的に行われる。
Bアセンブラの場合はまず上で紹介したアセンブラを使用してダンプリストを得る。 できたダンプリストを見ながら上で説明しているPOKE命令を使用して、 番地とセットする値を入力する。カセットインターフェースを持っている場合は、 上で紹介したアセンブラでWAVファイルを作って読み込めば、自分で入力しなくてもよい。
Cプログラムの実行の際は、右上のスライドスイッチを「RUN」のポジションにして、 BASICの場合はRUN(ENTER)、マシン語の場合はCALL &○○○○(ENTER)と 入力する。- 【2】画面に任意のドットを表示する方法
- &F800番地から&F83B番地までが液晶の左12桁、 &F868番地から&F87B番地までが液晶の右4桁の VRAMになっている(右4桁については、画面の右へいくほど若番)。 そこで、例えば2桁目の左上のドットを黒くするには、 BASICで「POKE &F805,1」 を実行すればよい。書き込む値を2にすると、 上から2つめのドットが黒くなる。 書き込む値を4にすると、上から3つめのドットが黒くなる。 書き込む値を127にすると縦1列が黒くなる。 ただし、BASICの命令実行中はLCDがOFFになるため、 実際に表示を目で見る場合には、POKE命令を実行した後に、 LCDをONにするBIOSを呼び出す「CALL &11E0」を 実行する必要がある。 また、プログラムが終了してしまうと、 ユーザが表示したものを全部消して、 コマンドプロンプトが表示されてしまうため、 LCDをONにした後に別の処理を行うか、 空のループで時間稼ぎをして、 プログラムがすぐに終わってしまわないように する必要がある。 BASICの実行中はVRAMがBASICの処理のための ワークエリアとして使用されるため、 左端には意味不明なドットが表示されることがある。 あまり左端の桁は使用しない方がよい。 (全部アセンブラで組んでいる場合は別)
@BASICで2桁目から山田と表示してみるAアセンブラで2桁目から山田と表示してみる
- 10 PRINT ""
20 POKE &F805,124,64,127,64,124,127,73,127,73,127
30 CALL &11E0
40 FOR A=0 TO 99:NEXT A
ORG $C100 LIDP $F800 ;DP←$F800 LII 59 ;I←59(…5×12−1) LIA 0 ;A←0 FILD ;(DP)〜(DP+I)←A(…左12桁のクリア) LIDP $F868 ;DP←$F868 LII 19 ;I←19(…5×4−1) FILD ;(DP)〜(DP+I)←A(…右4桁のクリア) LIB $00 ;FONTのアドレスの上位(一度アセンブル後、改めて設定※) LIA $00 ;FONTのアドレスの下位(一度アセンブル後、改めて設定※) CAL $11F1 ;X←BA−1(…BIOSの機能呼出し) LIB $F8 ;B←$F8 LIA $05 ;A←$05 CAL $11F5 ;Y←BA−1(…BIOSの機能呼出し) LIA 9 ;A←9 PUSH ;スタックにAの値を入れる TRAN: IXL ;X←X+1,A←(X) IYS ;Y←Y+1,(Y)←A LOOP TRAN ;スタックの値+1回ループ CAL $11E0 ;LCDをON(…BIOSの機能呼出し) LIA $FF ;A←$FF PUSH ;スタックにAの値を入れる PUSH ;スタックにAの値を入れる WWLP: WAIT $FF ;時間待ち LOOP WWLP LOOP WWLP RTN FONT: DB 124,64,127,64,124 ;山 DB 127,73,127,73,127 ;田 ※一度アセンブルしてFONTの配置されるアドレスを確定後、改めてその値をセットし、再度アセンブルする。- 【3】音を出す方法
- BASICの場合は、例えば「BEEP 3」とか入力すれば ピーピーピーと簡単に音が出るが、音程は変えられない。 アセンブラの場合は「12 5F 61 52 DF F1 E0」で よく耳をすますと「ぷち」という音がするので、 このルーチンをループさせればよい。 ループ内に適当なWAITを入れておくと、WAITが短いときは高い音が、 WAITが長いときは低い音が出る。また、WAITの時間を適切に設定すれば、 メロディの演奏も可能である。
(音を出すプログラム)ORG $C100 LIA $FF ;A←$FF LIDP ONTEI ;DP←ONTEI LAB1: STD ;(DP)←A LIA 5 ;A←5 PUSH LAB2: LIP $5F ;P←$5F ORIM $52 ;(P)←(P)or$52 OUTC CAL $11E0 LIDP ONTEI ;DP←ONTEI LDD ;A←(DP) LP $00 ;P←Iレジスタ EXAM ;(P)←→A LIDP $4000 ;DP←$4000 FILD ;(DP)〜(DP+I)←A LOOP LAB2 LIDP ONTEI ;DP←ONTEI LDD ;A←(DP) DECA ;A←A−1 JRNZM LAB1 ;IF Z=0 THEN LAB1 RTN ONTEI: DS 1 ※低い周波数から高い周波数まで上がっていく効果音が出ます。- 【4】キースキャンする方法
- BASICの場合、INKEY$を利用できる。アセンブラの場合は、 &1F44をコールすると、その時点でキーが押されていれば、キャリーが立つとともに結果がAに入る(B、DP、K、L、P、Q、X、Mが破壊される)。 ただし、これらの方法は、同時に2つ以上のキーを押すと、何も押さなかったのと同じになってしまう。
複数キーが同時に押されていることを判別するには、スキャンしたい行を 1にして、OUTA(とOUTB)を実行し、直後にINAを実行する。 すると、押されているキーに対応するビットが1になっているので、あるキーが押されているかどうか、判別できる。この方法は、複数キーが押されても判別できるが、何のキーが押されているかは個々に調べなければ分からない。
SC61860とはPC−1245に使われているCPUの名前である。 SC61860はCPU内部に96バイトのRAMを持っており、内部RAMと呼ばれる。 アキュムレータその他の汎用レジスタは内部RAM上に配置されている (アドレスレジスタはXとYを除いて内部RAMの外に独立して存在している)。 外部RAMは64KB使えるようになっている(ただし、 若い方のアドレスにはROM領域があり、 64KBすべてをRAMにできるわけではない)。 内部RAM・外部RAMともに、それぞれ専用のアドレスレジスタを使ってアクセスする (レジスタに割り当てられている内部RAMはアドレスレジスタを使わなくてもアクセスできる)。 フラグはCとZの2つあり、演算命令で繰り上がりまたは繰り下がり(キャリー)が起こったときにCが、 ゼロになったときZが立つ。 例えばA(アキュムレータ)に255(2進数で11111111)が入っている時にINCA (Aに1加える命令)を実行すると本来256(2進数で100000000)になるべき所だが、 Aのサイズは8ビット(8桁)しかないため、結果は0になる。 このとき演算結果がゼロなのでZが立ち、繰り上がりが発生しているためCも立つ。トップ
【1】アドレスレジスタ
レジスタ名 説明 使用例 DP 外部RAMにアクセスするための16ビットのレジスタ LIDP $C100 P 内部RAMにアクセスするための7ビットのレジスタ LP $04 Q 内部RAMにアクセスするための7ビットのレジスタ LIQ $04 R 内部RAMにアクセスするための7ビットのレジスタ。 このレジスタはCALL命令やPUSH命令が使用するスタック・ポインタであるので、 ユーザが値を変更するとしばしば暴走する。 LIR $04
【2】内部RAM
アドレス レジスタ名 使われ方 00 I カウンタ 01 J カウンタ 02 A アキュムレータ 03 B アキュムレータ予備 04 X(下位) 外部RAMポインタ(読み込み用) 05 X(上位) 外部RAMポインタ(読み込み用) 06 Y(下位) 外部RAMポインタ(書き込み用) 07 Y(上位) 外部RAMポインタ(書き込み用) 08 K 汎用レジスタ 09 L 汎用レジスタ 0A M 汎用レジスタ 0B N 汎用レジスタ 0C〜 汎用RAM 〜5B システム・スタック 5C IA I/Oポート・レジスタ 5D IB I/Oポート・レジスタ 5E FO I/Oポート・レジスタ 5F OUTC コントロール・ポート・レジスタ
ポケコンを何年間も使っていると、液晶の端の方から 少しずつ黒ずんできます。 主に冬の低温下でこの症状は発生しますが、 だんだんと季節を問わず黒ずむようになり、 液晶の中央へ向かって進行していきます。 そして最終的には使用に耐えなくなってしまいます。 このようになる原因ですが、液晶が膨張・収縮を繰り返すうちに、 液晶を封じ込めている容器の容積がわずかに大きくなり、 容器の内側の圧力が下がるのが原因ではないかと考えています。 と、言いますのも、分解して偏光板をはがし、 黒ずんでいる所を指で押さえると、 押さえている間だけ黒ずみが改善するからです。 なお、偏光板を通して見なければ黒ずみは見えません。 念のため。なお、偏光板を一度はがすと、 二度と元の密着状態に貼り付けられないので、真似しないでください。
筆者の知る限り、この黒ずみを根本的に直す方法がありません。 白熱電灯の下に置いて暖める、などの方法を紹介しているサイトもありますが、 温度が下がれば元通り黒ずみますので、 何の解決にもならない上に、 液晶の劣化(容器の拡張)を早めてしまいます。 結局、劣化を食い止める最善の方法は、暑さ寒さを避けて、 20℃くらいの一定温度で保管するしかないのではないかと 思います。実行するのはなかなか難しいことですが、 安易に加熱するのだけは避けた方がよさそうです。
中学に上がってすぐの頃、「子供の科学」誌でシャープのMZ−700やNECのPC−6001の紹介があり、 欲しくてたまりませんでしたが、当時、お金がなくてとても買えませんでした。 そして中学1年の冬休みにお年玉でやっとポケットコンピュータ(以下ポケコンと略)PC−1245を買い (本当はカシオPB−100を買いに行ったのですが売り切れでシャープになりました。結果的にラッキー)、 PIO誌に掲載されたゲームを打ち込んだり、 プログラムを作って遊んだりしていました。 LCDに私の名前(山田)を表示させていたら、 某氏からどうして自分の名前は出せないんだと言われたのも今では懐かしい思い出です。 1文字5×7ドットなので名前表示は山田が限界 ・・・とか説明しても分かってもらえなかったような気がします。 その後もお金がなく、高校時代もやっぱりPC−1245を使っていました。 その頃にはポケコン界の主流は画面の大きなPC−1350に移っており、 PC−1245のプログラムはほとんど雑誌に掲載されず、 高校時代はポケコンマシン語入門という本を入手して、 マシン語プログラミングにハマっておりました。 そして自分の作ったゲームで遊んでいました。 また、水晶交換(今は原発乗っ取りというのでしょうか)で、 倍速にしたりしていましたが、むちゃな改造がたたって破損。 そんなこんなで現在使用しているPC−1245は3台目です。 なお、倍速改造は音楽(といっても単音ですが)まで速くなり(音程も高くなる)、 ゲームも速すぎて遊べなくなってしまうため、 某氏はマイクロスイッチで切り替えできるようにされていました。 今は学生時代のように時間が取れなくなってしまいましたが、 「Yagshi's SC61860 Assembler "YASM61860"」を得て、 今後もプログラミングを楽しませてくれることでしょう。ポケコンよ、永遠なれ!
→「MSXの思い出」へ続く
| HOME | アマチュア無線 | パソ通 | 平群 | PC-1245 | MSX | PC-9800 | PDA | オリジナル曲 | あとがき |