投稿

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"); paus

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 SIZ

BDS C の使い方 - 目次

CP/M 上で動く、パブリックドメインの Z80用Cコンパイラ BDS C の使い方。 BDS C の使い方 - とりあえず使ってみる BDS C の使い方 - MSXで使ってみる BDS C の使い方 - マシン語とのリンク(インテルニーモニック) BDS C の使い方 - マシン語とのリンク(M80.COM を使う) BDS C の使い方 - マシン語とのリンク(ZASM.EXE を使う) BDS C の使い方 - SHARP X1 で使ってみる BDS C の制限 BDS C でコマンドライン引数を取得 BDS C で X1 turbo の DMA を使ってみる BDS C のサンプル - CP/M のバージョンと TPA のサイズを表示

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 L

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

>BDS C の使い方 - 目次 M80 編の続きです。 ZCASM の準備は M80 編をご覧ください。 必要なファイルの準備 ZASM.EXE ザイログニーモニックのソースをアセンブルするために、MS-DOS 上で動作する、川端晃史 さんの Z80アセンブラ ZASM を使用します。CP/M の ASM.COM とほとんど同じというところが、今回の用途に都合が良いです。 ダウンロードしたら、ZASM.EXE をコンパイラと同じフォルダにコピーしておきます。 MSDOS.EXE 64ビット版 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) ; にアクセスするのに必要なヘッダファイル

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

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

枝豆を収穫

イメージ
枝豆が膨らんできたので収穫して食べました。冷凍枝豆も美味しいけど、畑で採った枝豆はもっと味が濃くて美味しいです。 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.COM CASM.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

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

イメージ
>BDS C の使い方 - 目次 必要なファイルの準備 ASM.COM C 言語から使えるマシン語の関数を使用するために、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.COM BDS 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

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(VD

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

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-CCITT X^16+X^12+X^5+X^0 (1 0001 0000 0010 0001) // 0x8005 //        CRC-16-IBM X^16+X^15+X^2+X^0 (1 10

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-CCITT X^16+X^12+X^5+X^0 (1 0001 0000 0010 0001) // 0x8005 //        CRC-16-IBM X^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) ||