投稿

9月, 2014の投稿を表示しています

ジャンク品の灯油ストーブを購入

イメージ
ジャンク品の灯油ストーブを購入しました。1,198円+送料1,944円。

今までポータブルストーブを一つしか持っていなくて、家の 1階と 2階にいちいち持って歩かなくちゃならないのが面倒だったので、前からもう一つ欲しかったのです。
ホームセンターで 7,000円くらいで買える商品ですが、中古で安く買えて良かったです。

中にゴキブリとかがいたら嫌なので、分解清掃しました。
2011年製で、天板の焼け具合からほとんど使用されていないもののようです。
たまたま、右のいままで使っていた2008年製ストーブと同じメーカーで、暖房能力も同じものでした。年式が新しくなってコンパクトになっています。

BDS C のサンプル - CP/M のバージョンと TPA のサイズを表示

イメージ
>BDS C の使い方 - 目次

/* BDS C のサンプル OSのバージョンと TPA のサイズを表示する 2014年9月29日作成 */ #include <stdio.h> main() { short *TPA; short TPASIZE; short VER; TPA=0x0006; TPASIZE=*TPA-0x00FF-1; VER=bdos(0x0C,0); printf("CP/M Version 0x%04x\n",VER); printf("TOP OF MEMORY 0x%04x\n",*TPA-1); printf("TPA SIZE 0x%04x (%u) byte / %u kbyte\n",TPASIZE,TPASIZE,TPASIZE>>10); }
CP/M エミュレーターで実行>cpm mem\mem CP/M Version 0x0122 TOP OF MEMORY 0xFDFF TPA SIZE 0xFD00 (64768) byte / 63 kbyte >
X1 で実行
MSX で実行
>BDS C の使い方 - 目次

ThinkPad E420 HDD交換

イメージ
2年半くらい、ほぼ電源入れっぱなしで使っていた ThinkPad E420 のハードディスクが壊れたので、新品のハードディスクに交換しました。
容量は 500GBくらいあれば十分なのですが、500GB が 5,000円くらい、1TB が 6,000円くらいと値段があまり変わらないので、1TB の ハードディスクを購入しました。2TB も 7,000円くらいとなかなか安かったのですが、あまり容量が多くてもバックアップに困るので、今回は 1TB です。SSD は 512GB で2万円を超えるくらいと、高価なので買えません。

Windows7 から アップグレード版の Windows8 → Windows8.1 へとOSを入れ替えて使用していたので、また Windows7 から順番にインストールしていかなきゃならないかな? と思っていたのですが、Windows8.1 までをクリーンインストールした直後のバックアップ (コントロールパネル - ファイル履歴 - (左下)システムイメージバックアップ) が残っていたので、20分くらいで Windows8.1 が使える状態まで復旧出来ました。
その後 Windows Update が終了するまで何時間もかかりましたが。

データのバックアップは毎週取っていたので、データの紛失はありませんでした。バックアップ大事。

今回はバックアップを取るのに異常に時間が掛かるようになって、なんだかおかしいなと気づいたのですが、ディスクのプロパティからエラーチェックを行ってもエラーが検出されないので、そのまま一ヶ月くらい使っていました。
イベントログを見てもエラーではなく警告レベル。
回復モードで chkdsk を実行すると不良クラスターが多発していました。
今まで使っていたハードディスク。
2年と7ヶ月で 23,023時間使って、電源投入回数 191回。平均 5日づつの連続稼働でした。

BDS C で X1 turbo の DMA を使ってみる

>BDS C の使い方 - 目次

BDS C の使い方 - SHARP X1 で使ってみる で作った IO16.CRL の out16 関数を使っています。

test.c
/* BDS C で SHARP X1 の DMA を使うテスト 2014年9月20日作成 X1 G-RAM はI/O空間 0x2000 - 0x27FF テキストアトリビュート 0x3000 - 0x37FF テキスト 0x4000 - 0x7FFF B 0x8000 - 0xBFFF R 0xC000 - 0xFFFF G */ void main() { /* グラフィックパレット初期化 */ out16(0x1000,0xAA); /* 1010 1010 */ out16(0x1100,0xCC); /* 1100 1100 */ out16(0x1200,0xF0); /* 1111 0000 */ /* GRAMクリア */ dma_rset(); dma_vfil(0x4000, 0xC000, 0xAA); dma_enbl(); puts("hit key\n"); pause(); dma_vfil(0x4000, 0xC000, 0xFF); dma_enbl(); puts("hit key\n"); pause(); dma_vfil(0x4000, 0xC000, 0x55); dma_enbl(); puts("hit key\n"); pause(); dma_vfil(0x4000, 0xC000, 0x00); dma_enbl(); puts("hit key\n"); pause(); /* GRAM Bプレーン適当書き込み*/ dma_m2v(0x0000, 0x4000, 0x4000); dma_enbl(); dma_rset(); puts("hit key\n"); pause(); d…

BDS C でコマンドライン引数を取得

>BDS C の使い方 - 目次

/* BDS C でコマンドライン引数を取得 普通のC言語と同じですね */ #include <stdio.h> main(argc, argv) int argc; char *argv[]; { short count; for(count=1; count!=argc; count++) { printf("%s ",argv[count]); } /* argv[0] (このプログラムの名前)は得られないようでした */ } >cpm cc test\argv BD Software C Compiler v1.60 (part I) 43K elbowroom BD Software C Compiler v1.60 (part II) 40K to spare >cpm clink test\argv BD Software C Linker v1.60 Last code address: 0E82 Externals start at 0E83, occupy 0006 bytes, last byte at 0E88 Top of memory: FDFF Stack space: EF77 Writing output... 51K link space remaining >cpm test\argv >cpm test\argv aaa bbb ccc aaa bbb ccc >cpm test\argv aaa bbb ccc 11 22 33 aaa bbb ccc 11 22 33 >
>BDS C の使い方 - 目次

BDS C の制限

>BDS C の使い方 - 目次

コメントは /* ~ */ 型式のみ変数の型は、char, short, int, unsigned のみunsigned short とか unsigned int と書かず、unsigned とだけ書くchar は符号無しのみで signed char に相当するものは無いlong や float は使えませんが、代わりに long の演算ライブラリが付属している。float は無し。関数名は8文字までで、大文字小文字の区別はされないC で書いた関数なら、8文字以上使うとエラーが出ますが、アセンブラで書いた関数の場合エラーが出ませんので 「func_aaa2 を呼び出そうとして func_aaa1 を呼び出してしまう」ということが起こるので注意変数名も8文字までですが、大文字小文字の区別はする配列は二次元までsizeof 演算子で配列の大きさを得られないsizeof(int) のように、sizeof 演算子に型指定子を直接与えることが出来ない(変数名を与えなければいけない)typedef が無い関数宣言時に引数の型を括弧内に書けない関数のプロトタイプ宣言ができない このくらいの制限に気をつければ、プログラムを書くのに困らないんじゃないでしょうか。現代の C言語と比べると制限が多いですが、アセンブラで書くのと比べれば天国ですよね。


サンプル/* BDS C の制限 */ #include <stdio.h> main () { /* char a=10; のように宣言時に初期化出来ない */ char c; short s; int i; unsigned u; char array[20]; c=0xFF; s=0xFFFF; i=0xFFFF; u=0xFFFF; printf("char SIZE:%d 0x%04x = %%d:%5d %%u:%5u\n",sizeof c,c,c,c); printf("int SIZE:%d 0x%04x = %%d:%5d %%u:%5u\n",sizeof i,i,i,i); …

BDS C の使い方 - 目次

BDS C の使い方 - SHARP X1 で使ってみる

イメージ
>BDS C の使い方 - 目次

BDS C で マシン語とのリンクのやり方がわかったので、SHARP X1 で I/Oポートを操作してみます。

X1 は I/O空間が16ビットなので、アドレスを16ビットで指定する入出力関数を作りました。
; FILENAME : IO16.CZM ; BDS C 用 16ビットI/O空間入出力 ; INCLUDE "BDSZASM.LIB" ; アセンブラから c.ccc (ccc.asm) ; にアクセスするのに必要なヘッダファイル FUNCTION in16 ; int in16(address) CALL ma1toh ; 1つ目の引数を HLとAレジスタに入れる PUSH BC ; BCレジスタは保存しなければいけない LD B,H LD C,L ; BC=HL IN A,(C) LD L,A LD H,0 POP BC RET ; HL が返り値になる ENDFUNC FUNCTION out16 ; void out16(address, data) CALL ma1toh ; 1つ目の引数を HLとAレジスタに入れる LD (arg1),HL ; arg1 はBDSZASM.LIBで定義されているワーク CALL ma2toh ; 2つ目の引数を HLとAレジスタに入れる ; 同じように 7番目の引数まで取り込める PUSH BC LD …

BDS C の使い方 - マシン語とのリンク(ZASM.EXE を使う)

>BDS C の使い方 - 目次

M80 編の続きです。ZCASM の準備は M80 編をご覧ください。

必要なファイルの準備
ZASM.EXEザイログニーモニックのソースをアセンブルするために、MS-DOS 上で動作する、川端晃史 さんの Z80アセンブラ ZASM を使用します。CP/M の ASM.COM とほとんど同じというところが、今回の用途に都合が良いです。
ダウンロードしたら、ZASM.EXE をコンパイラと同じフォルダにコピーしておきます。

MSDOS.EXE64ビット版 Windows のコマンドプロンプトでは、MS-DOS の(16ビット)アプリケーションが動作しませんので、Windows のコマンドプロンプトで MS-DOS のエミュレーションを行う TAKEDA, toshiya さんの MS-DOS Player for Win32-x64 を使用します。
こちらもダウンロードしたら、MSDOS.EXE をコンパイラと同じフォルダにコピーしておきます。


BDS.LIB の修正
ASM.COM と ZASM.EXE では、ソースコード記述の決まりが少し異なるので、ヘッダファイルの修正が必要です。 ZASM.EXE でアセンブルできるように、BDS.LIB 内にある

page 命令を削除if ~ endif 命令をすべて削除if not cpm ~ endif ブロックは、ブロックごと削除if cpm ~ endif ブロックは ブロック内を残す
修正をして、別名で保存します。今回は BDSZASM.LIB という名前にしました。

準備はこれで終了です。


アセンブラで関数の作成
ザイログニーモニックでアセンブラの関数を作成します。インテルニーモニックの時と同じ書き方です。
; BDS C でマシン語とのリンクのテスト ; ザイログニーモニック ; ZASM.EXE 用 INCLUDE "BDSZASM.LIB" ; アセンブラから c.ccc (ccc.asm) ; にアクセスするのに必要なヘッダファイル FUNCTION testfunc ; int test…

間引きした人参のかき揚げ丼

イメージ
今日のご飯は、間引きした人参と玉葱のかき揚げ丼。
揚げ油を新しくしたので、とても美味しかった。

枝豆を収穫

イメージ
枝豆が膨らんできたので収穫して食べました。冷凍枝豆も美味しいけど、畑で採った枝豆はもっと味が濃くて美味しいです。

6月に種を蒔いて、8月に植え替えたキャベツが大きくなってきました。初めてキャベツを蒔いてみましたが、ちゃんと育っているようです。

BDS C の使い方 - マシン語とのリンク(M80.COM を使う)

イメージ
>BDS C の使い方 - 目次

インテルニーモニック編の続きです。M80 の代わりに ZASM.EXE を使う例もご覧ください。

必要なファイルの準備
M80.COM L80.COM ザイログニーモニックのソースをアセンブルするために、CP/M で動くマイクロソフト社のアセンブラ M80.COM と、リンカ L80.COM が必要になりますので、なんとか入手してください。(windows 用の Z80 アセンブラでも試してみましたが、BDS C でうまくリンクできませんでした M80.COM L80.COM の代わりに、MS-DOS版の ZASM.EXE を使うことが出来ました。そちらもご覧ください。)
http://www.retroarchive.org/ さんの CP/M のページで M80.COM と L80.COM をダウンロードできるようになっているのですが、ライセンスについての記述を見つけることが出来ませんでした。
今回は MSX-DOS TOOLS に入っている物を使用しました。持っててよかった MSX-DOS TOOLS。
M80.COM L80.COM をコンパイラのあるフォルダにコピーしておきます。

ZCASM.COMCASM.COM のザイログニーモニック用である、ZCASM.COM のソースコードがBDS C のアーカイブに含まれているので、BDS C でコンパイルしてバイナリを作成します。

bsdc160\ZCASM.LBR        ZCASM のソースコードなどが入っているアーカイブファイル
bsdc160\LDIR.COM         .LBR ファイルの内容を表示するツール
bsdc160\LBREXT.COM       .LBR ファイルから内容を取り出すツール
extra\BDSCIO.H           BDS C 1.5 のヘッダファイル(ZCASMのコンパイルに必要)
extra\DEFF15.CRL         BDS C 1.5 のライブラリ(ZCASMのコンパイルに必要)

をコンパイラのあるフォルダにコピーします。
まず ZCASM.LBR の中にどんなファイルが入っているか見てみます。
>cpm ldir zcasm Library File = zcasm .LBR Name …

BDS C の使い方 - マシン語とのリンク(インテルニーモニック)

イメージ
>BDS C の使い方 - 目次

必要なファイルの準備
ASM.COMC 言語から使えるマシン語の関数を使用するために、CP/M 標準のアセンブラ ASM.COM が必要になります。The Unofficial CP/M Web site で入手できる、CP/M 2.2 BINARY (cpm22-b.zip) 等から ASM.COM をコンパイラのあるフォルダにコピーしておきます。
(CP/M は、現在ライセンスを保有している Lineo社 の許可を受けて "Unofficial CP/M Web Site" で配布されていますが、"Unofficial CP/M Web Site" 以外で再配布しても良いとは書かれていないようでした。)CASM.COM と CLOAD.COMBDS C 用の関数を作成する ASM.COM 用のプリプロセッサ CASM.COM と ASM.COM が出力した HEXファイルをバイナリファイルに変換する CLOAD.COM が必要なので、BDS C のアーカイブに含まれているソースコードから BDS C でコンパイルして作成します。
bdsc160\work\CASM.C
bdsc160\work\CLOAD.C
をコンパイラのあるフォルダにコピーして、windows のコマンドプロンプトで以下のようにコンパイルしました。
>cpm cc casm -e4b00 BD Software C Compiler v1.60  (part I)   20K elbowroom BD Software C Compiler v1.60 (part II)   24K to spare >cpm clink casm BD Software C Linker   v1.60 Last code address: 4AF5 Externals start at 4B00, occupy 1285 bytes, last byte at 5D84 Top of memory: FDFF Stack space: A07B Writing output...   36K link space remaining  >cpm cc cload BD Software C Compiler …

BDS C の使い方 - MSXで使ってみる

イメージ
>BDS C の使い方 - 目次

パブリックドメインの C コンパイラ、 BDS C を MSX で使ってみます。今回は画面キャプチャが容易なエミュレータを使用しましたが、実機でも同じように使用できます。
BDS C の概要は BDS C の使い方 - とりあえず使ってみる などをご覧ください。


インストール
インストールと言っても、必要なファイルをコピーするだけの簡単な作業です。
配布されている ZIPファイル (bdsc-all.zip) から、以下のファイルを MSX-DOS の起動ディスク(のルートディレクトリ)にコピーするだけです。
bdsc160\ CC.COM コンパイラ本体 CC2.COM コンパイラ本体2 CLINC.COM リンカ DEFF.CRL 標準ライブラリ DEFF2.CRL 標準ライブラリ2 C.CCC スタートアップルーチン bdsc160\work\ STDIO.H 標準ライブラリのヘッダファイル

Hello, world!
実際に Bドライブ に用意した hello.c をコンパイルしてみました。
cc b:hello コンパイル(CC2は自動的に呼び出されます) clink b:hello リンク
コンパイルとリンクが正常に終了したら、出来上がった hello.com を実行してみます。
b:hello

"Hello, world!" と表示されたら成功です。

その時の、MSXの画面の様子はこんな感じ。

BDS C には Z80 の I/Oポートを直接アクセスする関数があるので、MSX の VDP を直接操作するプログラムを作ってみます。

/* BDS C でMSXのI/Oを直接操作してVDPをいじってみる */ #define VDP 0x98 main() { char count; outp(VDP+1,0); /* VRAM アドレスセット */ outp(VDP+1,0x40); /* VRAM アドレスセット …

BDS C の使い方 - とりあえず使ってみる

イメージ
>BDS C の使い方 - 目次

Z80 のプログラムを書く用事があったんですが、アセンブラは大変なので自由に使える Cコンパイラは無いものかな?と google で検索すると、BDS C V1.6 が明確にパブリックドメイン宣言されて、BD Software さんから配布されています。
他にもいくつかあるようでしたが、BDS C には立派な PDF形式のマニュアルも同梱されていて、使い方を調べやすそうな感じがしたので、今回はこれを使うことに決めました。

シャープから X1 用として販売されていた Cコンパイラが、この BDS C (α-C) だったようですね。


ダウンロード
BD Software さんの BDS C のページ の Primary Downloads の所から 1.5MB の ZIP ファイル (bdsc-all.zip) をダウンロードします。この bdsc-all.zip に C コンパイラの動作に必要なファイルすべてと、PDF形式のマニュアルが含まれています。
Documentation のところに容量の大きなマニュアル (bdsc-guide-full.pdf) もあるのですが、表紙画像の有無だけの違いのようで、内容は同じようでした。

BDS C は CP/M 上で動作するのですが、実機より現代の PC で動作させたほうが高速ですし、普段使っているテキストエディタも使えてずっと便利なので、Windows 上で CP/M のエミュレータを使用して、その上で BDS C を実行することにします。
今回は、村上 敬司 さんの CP/M program EXEcuter (CPM.EXE) を使用します。64bit版 windows では MS-DOS汎用のプログラムは動作しないので、win32版の CP/M program EXEcutor for Win32 をダウンロードしておきます。


コンパイラを動かすのに必要なファイル
以下のファイルだけがあればコンパイラが動作できます。
bdsc160\ CC.COM コンパイラ本体 CC2.COM コンパイラ本体2 CLINC.COM リンカ DEFF.CRL 標準ライブラリ DEFF2.CRL…

CRC-16-CCITT をテーブルを使わないで計算するソースコード

ついでに、テーブルを使わないでCRCを計算する関数も作成しました。どうしても使用するプログラムメモリを削減したい場合向け。

テーブルを使って高速に計算する関数はこちら

/*
CRC-16-CCITT を計算する
// wikipediaにある実装例の通り(wikipediaの例は多項式が反転、シフトの向きが右)
// http://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB

MB8877のデータシートに
X^0+X^5+X^12+X^16 と書いてあったので、フロッピーのCRCは CRC-16-CCITT

2014年9月2日作成
*/

unsigned short crc_1byte(unsigned char in, unsigned short crc)
{
/*1byteづつCRCを計算する
wikipediaにある実装例を、テーブルを使わないように書き換えただけ。

unsigned short crc;
crc = 0xffff;// 初期値
crc = crc_1byte(0xA1, crc);
crc = crc_1byte(0xA1, crc);
crc = crc_1byte(0xA1, crc);
crc = crc_1byte(0xFE, crc);// A1 A1 A1 FE : ID ADDRESS MARK
crc = crc_1byte(0x02, crc);// C
crc = crc_1byte(0x00, crc);// H
crc = crc_1byte(0x03, crc);// R
crc = crc_1byte(0x02, crc);// N

これで crc に計算結果が入る(0x4165)
*/
#define polynomial 0x1021// 多項式 CRC-16-CCITTX^16+X^12+X^5+X^0 (1 0001 0000 0010 0001)
// 0x8005//        CRC-16-IBMX^16+X^15+X^2+X^0 (1 1000 0000 0000 0101)
unsigned char bit;
unsigned short a;

a = ((in << 8) ^ crc) & 0x…

CRC-16-CCITT を計算するソースコード

CRCを計算する用事があったので、CRCを計算する関数を作成しました。

テーブルを使わない、省メモリな関数はこちら

Visual Studio Express 2013 で動かしてみて計算が合っている様子だったので、たぶん間違っていないんじゃないかな?

/*
CRC-16-CCITT を計算する
// wikipediaにある実装例の通り(wikipediaの例は多項式が反転、シフトの向きが右)
// http://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB

MB8877のデータシートに
X^0+X^5+X^12+X^16 と書いてあったので、フロッピーのCRCは CRC-16-CCITT

2014年9月1日作成


// テーブルを作成する
void print_crctable(void)
{
#define polynomial 0x1021// 多項式 CRC-16-CCITTX^16+X^12+X^5+X^0 (1 0001 0000 0010 0001)
// 0x8005//        CRC-16-IBMX^16+X^15+X^2+X^0 (1 1000 0000 0000 0101)

unsigned int i, j;
unsigned short a;

printf("\n多項式 0x%04X\n", polynomial);

for (i = 0; i < 256; i++)
{
a = (i << 8);
for (j = 0; j < 8; j++)
{
if (0 == (a & 0x8000)) a = (a << 1);// 最上位ビットが0ならシフトのみ
else a = polynomial ^ (a << 1);// 最上位ビットが1ならシフトして多項式でXOR
}
printf("0x%04X,", a);
if (((i & 0x0F) == 0x07) || ((i & 0x0F) == 0x0F)) printf("\n");
}
printf("\n");
}
*/

const unsigne…