2015年3月4日水曜日

CASL II のコメントに関する仕様がだいぶきもい

CASLの仕様 
オペランドありの場合に 空白以下にコメントが書ける。

 すなわち ; は仕様上は要らない。

 でもこれってきもい。

 コメントはやっぱり ; の後に書くべきだ。

 何がきもいって r1, r2形式のオペランドだとあまり問題にならないのだけど
 r, adr, x 形式のオペランドだと相当に気持ち悪い。
[, x] 部分は省略可能のため


 LD GR0, LABEL ,GR1 はどう解釈するべきなのか全然わからない。
 LD GR0, LABEL ,GR0 はどうだろう。これはイリーガルなオペランドとして解釈されるべきなのか。 


自分としては オペランドの間に空白は置けないと定義してもらうかコメントはセミコロンの後に書くかどっちかじゃないと すごくいろいろ萎える。

 実装によっては オペランド間の 空白を許容しないで、空白以下はコメントとして解釈しているものもある。

 でも普通の英文は , の後には空白は置くはずで、オペランド間の空白を悪とみなすより セミコロンの無いコメントの方を邪悪とするほうが正当な気がする。

 空白登場前の, は後ろに続く空白を読み飛ばすという仕様でもいいかもしれない。
 自分としては仕様が気に入らないので、 ここはあえて仕様不守でオペランド間の空白は許容するが、 セミコロン前にコメントは書いてはいけないという独自仕様にしようかなと思う。
この変更で不幸になる人は居ないと思う。

 ていうかこの部分は誤植なのではないだろうかという疑惑もある。

 オペランドなしの場合空白以下コメントとみなしても全然かまわないので、本来の意図はそっちじゃないのかって気がしている。

 オペランドありの場合に空白以下にコメントが書ける仕様というのは混乱するだけでひとつもいいことないのではなかろうか。

とりあえず COMET II は書いた

動くかどうかはよくわからないけど、とりあえずはモノは書いたCOMET II のシミュレータ
プロパティとして memory と register をもっているcpu オブジェクトに execute メソッド書いて、
PRの位置の指すメモリを switch(op_code){} 的な挙動をするモノ。

500行位。

まだ文法チェックも済んでなくて。
全然デバッグする気がしないのは MEMORY に バイナリを書き込まないといけなくてそれを
ハンドアセンブルで用意するの面倒だなと。

というかテストが面倒なんだけど。

とりあえずもしかしたらデバッグが容易になるかもしれないので テストする前に

CASL IIの方の仕様を漁って全体像を考え中。

2015年3月3日火曜日

CASL II のPUSHの挙動

CASL II COMET II PUSHの挙動がすごく変態的。

実効アドレスをプッシュするという意味の分からない感じ。

GR1 ~ GR7を PUSH するのはそれでも
PUSH 0,GR1
とかでできるのだが…

GR0は…指標レジスタではないため実効アドレスに喰わす事は出来ない。

命令一つで退避できない PUSHってどうだろう。

CASL II COMET II ではふつうのマルチタスクの勉強をしようとすると、
どうしても2,3個は仕様を追加しないといけないと思う。
StackPointerを設定する方法と割り込み。

CASL IIIを作る予定があれば
LDSP r
みたいなスタックにロードできる命令の追加と、割り込み時の動作の明確化が欲しいかな。

まあ、たぶん一生情報処理系試験は受けないだろうけど。

COMET II シフト関係

COMET IIで遊んでるけど
シフト演算に関しては実効アドレス指定しかないのが可笑しいなあ。

今更、よく考えるとCOMET IIには即値を指定するという概念がないのだよね。

それににしても16しか最大シフトできないので、4ビットあれば、情報としては十分な中で、
16ビットのアドレスを2語命令で指定するヘンテコさが
何ともいえない。

条件分岐と配列アクセスのメモ

<html><head>
<meta charset="UTF-8">

</head>
<body>

<script>
var Registers = function(){
    this.gr = new Uint16Array(8);
    this.gr[0]=0;
    this.gr[1]=0;
    this.gr[2]=0;
    this.gr[3]=0;
    this.gr[4]=0;
    this.gr[5]=0;
    this.gr[6]=0;
    this.gr[7]=0;
}
var Cpu = function(){
 this.regs = new Registers(); 
 this._x = [[0],this.regs.gr,this.regs.gr,this.regs.gr,this.regs.gr,this.regs.gr,this.regs.gr,this.regs.gr];
}
var a;
var cpu = new Cpu();
var i,j;
var startTime = new Date();
for (i = 0; i< 1000000 ;i++){
  for (j = 0; j< 8; j++){
    a = cpu._x[j][j];
  }
}

console.log(new Date() - startTime +"msec");
startTime = new Date();
for (i = 0; i< 1000000 ;i++){
  for (j = 0; j< 8; j++){
    a = j ===0 ? 0: cpu.regs.gr[j];
  }
}

console.log(new Date() - startTime +"msec");
</script> 
</body>
</html>
3項演算子のコストが気になって、無理やり配列のアクセスに書き換えてみた結果、ちっとも速くならなかった。
timer.html:33 108msec
timer.html:41 76msec
3項演算子以外と速いみたい。


ちなみにswitch case 文に書き換えると さらに5%くらい早くなるみたい。
startTime = new Date();
for (i = 0; i< 1000000 ;i++){
  for (j = 0; j< 8; j++){
    switch(j){
      case 0:
        a= 0;
        break;
      default:
        a= cpu.regs.gr[j];
    }
  }
}

console.log(new Date() - startTime +"msec");
timer.html:33 120msec
timer.html:41 76msec
timer.html:56 72msec


switch が一番はやい。
意外だな。


2015年3月1日日曜日

Ntt X-Store で Superfish バックドア付き製品が激安だぞ


Lenovoが大コケしている。

どうもバックドアバンドル製品を出荷してしまっていたらしい。

しかし、そのおかげで、PCがめちゃくちゃ安い。
29,800円 (w
この製品はバックドアバンドル製品確定なわけですが、

インテル® Celeron® プロセッサー N2830 プロセッサー
動作周波数 2.16GHz(インテル® バースト・テクノロジー対応、バースト周波数:2.41GHz)

はよっぽどがんばらないと不満は感じないだろう
メモリも4GB あるし、DVD-Multi Driveもついてて29800円はありえない価格だろうと思う。
バックドアは必ず消さないといけなくて消し方がさっと理解できる人であればいいかもしれない。

バックドアバンドルしてないかもしれないlenovo 製品も概ね激安になっている Core i5 製品が4万円以下(w

でもなあ、こういう事をやる会社は何度だってやると思うし、たまたま今回は問題が表面化しただけで、表面化しなかった問題もきっとあると疑ってしまう。

そもそも、Lenovoの広報はあたかもお客様の為に入れたソフトウェアに不具合があって、自分たちも被害者みたいなツラをしているんだけど。全然こいつら羊じゃない。真っ黒な意図しか感じない。

本当のところはハードを売る以外に金を儲けたい→ブラウザに広告出して広告収入得たほうが儲かるんじゃね?

ってところがスタートなわけで、良心なんて入り込む余地すら無いと思ってるし、まともな会社は今後一切この会社の製品を買うべきじゃないと思うね。

自分もこれ欲しいけど、superfish を消したとしてもやっぱり気持ち悪いよね。
Windowsを再インストールすると、必要なバンドルソフトも消えちゃいそうだし。

愛情を持って所有できる製品ではないという点で終わってるわけだけど、もともとPCにもメーカーにも愛があまりない自分にはちょっと心揺らぐ製品ではある。っていうか人柱で買おうかなあ。