バイトオーダーの境目でアドレスが変わる?

今日は久々に在宅勤務をした気がする。

荷物が届くのを待ってたんですよ。時間指定しにくい荷物だったのでね。

またこの話は改めてBlogに書くが、けっこう大きな買い物である。


以前、バイトオーダーの話を書いた。

バイトオーダーに悩む

新しいマイコンはリトルエンディアン、旧来からのペリフェラルはビックエンディアン、

一体どうするかという話をやっていたのだが、32bit幅のバスをビット順につなぐことで決着した。

すなわち旧来からのシステムにある共有メモリに{12 34 56 78}と並んだデータは、

4byteアクセスすると新しいマイコンでも0x12345678とリードできて、

それを自身のメモリに格納すると{78 56 34 12}となるという形である。

ハードウェア的にも作りやすく、ソフトウェアの修正も少ない見込みで、

万々歳とは思うが、うまくやるにはいろいろ工夫が必要である。


で、これは職場の人に教えてもらったのだが、この方法で1byte, 2byteアクセスに対応する場合、

境界部でアドレスを調整することでつじつまを合わせることができると言われた。

ビックエンディアンのシステムにある共有メモリの0x100番地から{12 34 56 78}というデータが格納されているとき。

ビックエンディアンのシステムで0x100から4byteリードすると0x12345678、

0x100から2byteリードすると0x1234、0x102から2byteリードすると0x5678となる。


一方でリトルエンディアンのシステムにとってみれば、

0x100から4byteリードして0x12345678と読めるメモリというのは、

2byte単位で区切って読むと、下位16bit(=0x5678), 上位16bit(=0x1234)の順でリードできるべきである。

そこでリトルエンディアンとビックエンディアンの境界部で、

2byteアクセスの場合は0x100→0x102, 0x102→0x100とアドレス変換を行う。

共有メモリから0x102から2byteリードすると0x5678、0x100からリードすると0x1234となるからつじつまが合う。

同様に1byteアクセスも0x100⇔0x103, 0x101⇔0x102と変換するとつじつまが合う。

こうするとバイトオーダーの違いを吸収できるというわけである。


すなわちビックエンディアンとリトルエンディアンをまたぐ場合、

  1. 2,4byteアクセスしたときのビット順は正しい
    4byte単位でアクセスしたときのアドレスは変わらない
    バイト順と1,2byteアクセス時のアドレスは異なる
  2. バイト順とアドレスは変わらない
    2,4byteアクセスしたときのビット順が異なる

の2つの選択肢があり、今回は1.を選択したということになる。


今回の場合、多くはこれで問題ないと考えているのだが、

4byteアクセスに統一できない1byte, 2byteアクセスも多少ありそうで、

その場合にはアドレス調整が必要になるのが課題の1つ。

そういう処理をできるだけ減らすこと。残る部分は確実に対応することが求められている。

そしてバイナリデータの転送時にバイト順が変わる問題もある。

全体としてはあまり多くないが一部に存在する。

そこはどこかでバイトスワップする処理を差し込むことになる。


なかなかこの仕組みを理解するのは難しいようで、

メンバー同士の議論でもよく振り出しに戻るということが起きている。

まぁなかなか教科書的な話とは違うなとは言っていたが。

外国で自動車通勤らしい

開発部署で外国の拠点に赴任になる人というのは、

だいたい部署ごとに赴任先というのは決まっているものである。

ただ、このたび意外な拠点に赴任になる人がいて「まさか○○以外の赴任先があるとは」との感想を言っていて、確かにそうだよなと思った。


話を聞いて驚いたのだが、赴任先で住むのは職場からかなり離れたところらしい。

そんなへんぴなところにある職場でもないし、近所に住めそうなものなのだが、

話によれば日本人が比較的多く住む街なので初めての赴任者にはよかろうと。

そういう意図があって選ばれているらしい。にしても遠いと思うのだが。


もう1つ驚いたのが、自動車通勤ということである。

自分でハンドルを握って60kmぐらい通うらしい。

前に神栖出身の人が親が水戸まで自動車通勤していたと言っていたが、それに近い。

神栖に赴任になるのに、水戸に住んで自動車通勤というイメージだな。

こう言われるとイメージしやすいな。


ただ、国をまたぐので運転免許の問題がある。

暫定的には国際運転免許証をもっていれば運転できるのだが、

1年間しか有効ではなく、当地の規定もあり入国後早々、切替手続きが必要になる。

日本でもそうで、外国から来た人が国際運転免許証などの外国の免許で運転できるのは1年間に限られる。

それ以降となれば日本の運転免許への切替手続きが必要になる。


ただ、日本の運転免許への切替について言えば、

元の運転免許の発行国によっては新規に免許を取るのとほぼ同じになってしまうこともある。

外国で取得した運転免許証を日本の運転免許証に切替えるには (警視庁)

「知識確認、技能確認を免除する国等」にリストアップされた地域からであれば、

適性検査だけで日本の運転免許への切替ができる。

ヨーロッパ諸国と、韓国・台湾・オーストラリア・ニュージーランド・カナダ、アメリカの一部の州が該当する。

インディアナ州は技能試験が免除なのでペーパーテストだけ必要、

他は実技もペーパーテストも両方必要になるということである。


新規に免許を取るのとあまり変わらないとは書いたけど、

技能確認は試験場内で行われるので、一発試験で四輪の免許を取る場合と違い、路上に出る必要はない。

限定解除審査みたいなもんですかね。

普通に運転できればOKとはいえ、細かく減点されると苦しいものである。


なお、日本の免許から外国の免許に切り替えた後、

帰国後に日本の免許に再度切り替える場合には、適性検査だけで切替できる。

これは知識確認・技能確認の目的からすれば当たり前ですが。

この観点でも外国の運転免許に切り替えるメリットはあるかもしれない。

なぜならば日本の運転免許のままだと更新できず失効させてしまう可能性があるから。

一時帰国時や出国前に更新しておけば失効させずに済む可能性もあるが、

当地で有効な運転免許が存続していて、切り替える形であれば、この間は当然日本での手続きは不要である。

そういうもんか。

河口湖ステラシアター3日押さえた

4月末、バンドリのPoppin’PartyとMyGO!!!!!の合同ライブが行われ、

これをインターネット配信で見ていたのだが、

その中でPoppin&Partyが10月に河口湖ステラシアターで単独ライブをやることが発表された。


河口湖ステラシアターは富士河口湖町の野外音楽堂である。

屋根も出せるので雨でも大丈夫ですがね。

およそ3000人収容ということで、それなりに広いとは思う。

そもそも河口湖というのが大都市から離れていることもあるのだが、

しかも駅から離れているという。イベント時はバス出るとは思うけど。

Poppin’Partyにとってはやや狭い気もするが、足が遠のく事情もあるので、

案外バランスは取れてるのだろうか? うーん。


それはそうとしてこれ3連休の3日目だったんですよね。

で、3連休の初日にはMorfonicaのライブが発表されていた。

では、その間に入るのか? というと、これはAve Mujicaだったらしい。

先週末のAve Mujica 2nd LIVE、横浜・名古屋と2公演あるが1公演目で発表されていた。

やはりAve Mujicaだったか。


Poppin’Partyについてはこの発表があってから応募券付きのCDを買って、

それで申し込んだら無事にチケットが用意された。よかった。

Ave Mujicaも映像など見ると興味はあって、応募券の付くCDを買う計画もあったので、

それならば応募してみようかと思うが、競争率はいかに。

Morfonicaは普通にチケット買えそうな気もするが、どうかね。

もし、この目論見が上手く行くと河口湖にずっと滞在して夕方にのそのそコンサートに出かけることになるのか。


ただ、河口湖ってホテルたくさんあるけど、意外と困るんだよな。

国内外の観光客が多くやってくるので需要も大きいんですよね。

そんな3連休ずっと河口湖泊とかなんぼするんだとか、そもそも取れるのかとか。

いくつか作戦は考えているが、どうなることやらと。

とはいえ、そもそも取らぬ狸の皮算用である。

Ave Mujicaのチケット次第で動きは変わるだろうと思うので、CD買って祈ると。

発電機付きの特定原付?

調べ物をしていたらこんなのを発見した。

発電機付き特定小型原付 ENNE T350 Pro

ペダルは付いているのだが、タイヤとはつながっておらず、

ペダルの横に設けられた発電機に入るという形なのだが、なぜこんなことになってるのだろうか?


特定小型原動機付自転車の道路交通法上の定義はこうなっている。

車体の大きさ及び構造が自転車道における他の車両の通行を妨げるおそれのないものであり、かつ、その運転に関し高い技能を要しないものである車として内閣府令で定める基準に該当するもの

自転車道の走行に適した操作が簡単な原付ということなのだが、走行できる自転車道は限られている。

実は歩道の自転車通行指定部分だった

それはそうとして内閣府令、道路交通法施行規則では具体的にこう規定されている。

  • 車体の大きさは長さ190cm, 幅60cm以内(普通自転車サイズ)
  • 原動機は定格出力600W以下(原付1種と同じ)の電動機を用いる
  • 20km/h以上の速度が出せないこと
  • 最高速度が複数ある場合(歩道モードを想定)は走行中に速度変更できないこと
  • クラッチの操作を要しないこと
  • 最高速度表示灯を備えること

この規定からフル電動でなければ特定原付は作れないことがわかる。


原付の中にはペダルを持ち、エンジン・モーターと人力を併用できるものがある。

GFR-02 (Glafit)

これは原付モードと自転車モードの切替が認められた初めてのバイクである。

基本的にはモーターで動かしても、ペダルで動かしても、原付にあたるが、

ここにナンバープレートにフタをすることで、モーターに電源が入らなくなる仕組みを導入し、

この状態であれば全て人力ということで自転車と全く同じであると、

道路交通法上の自転車として扱われる仕組みを作ったわけである。


しかし、こういうものは特定原付では作ることができない。

なぜならば20km/h以上を出せてしまう可能性があるからである。

一般原付は30km/h制限だが、30km/h以上出せてしまう構造であるのが通常である。

しかし、特定原付は20km/h以上出せてはいけないのである。

その上で動力はモーターに限られているのもそのためではないかと思う

これが特定原付はフル電動でなければならないといった理由である。


しかし、その電力をまかなう手段がバッテリーでなければならないというわけではない。

というので、考えられたのが足こぎ発電機を付けるという方法だったと。

バッテリーと発電機の両方からモーターに供給するわけである。

こうすることで発電機で発電した分はバッテリーを節約することができる。

バイクの実際の走行スピードとは無関係に一定ペースで漕げばよい。

発電してモーターを動かすので変速機のような役目も果たすと。


動力の一部をバッテリーが補うとみれば電動アシスト自転車にも似ているが、

電動アシスト自転車のアシスト比率は2/3を越えることができないし、

10km/h以下ではアシスト比率が下がり、20km/hでは36%である。

この発電機付き特定原付はモーターを動かす電源の比率は関係ないので、

100%バッテリーになる瞬間が存在してもよいと。

この柔軟性はあくまでも原付であるがゆえである。


この仕組みは電欠対策みたいなところはある。

できるだけバッテリーを温存して走ることが出来る仕組みというが、

バッテリーがほとんどなくても発電機を回して走ることができる。

歩道モードで6km/hでちんたら走れば、車道を走るには遅くてもなんとか。

従来のキックボードやアシスト自転車などは充電がなくなってしまえばただの重い荷物になってしまいます。

電動アシスト自転車もフル人力で動かせる点では同じだろうと思うけど。


というわけで考えたもんだなと思った。

まぁこういうよくわからん車がいろいろ出るのが黎明期っぽい気がする。

クーポンとnanacoポイント20倍

イトーヨーカドーアプリで毎月1~3日に2000円以上買うと200円引きクーポンを配布するのが恒例になっている。

お得なのでよく使うのだが、これとnanacoポイント○倍のキャンペーンとあわせて使ったときのポイント計算が不思議である。


nanacoポイントは本体価格200円あたり1ポイント付与が基本である。

食品だと税込216円あたり1ポイントってことだな。

それで20倍のポイントが付くというと、付与率は9.3%となる。

端数切り捨てとかもあるのでそう簡単ではないのだが。


それでポイント20倍対象商品を2183円(税込)、それ以外の商品を304円(税込)買って、

合計2487円に200円引きクーポンでnanacoで2287円払ったとき、

どういう風にポイントが計算されるかというとこうなる。

20P対象税抜金額 ¥2,022 200P

1P対象税抜金額 ¥119(¥97+¥22) 0P

*上記カッコ内のプラス金額は上の行からの繰越し金額です。

1P対象金額の97円って一体どこから出てきたんだ?


まず20倍対象商品の2183円(税込)というのは、本体価格になおすと2022円である。

基本は200円あたり20ポイントということで200ポイントになる。

一方で今回の実際の支払金額は2287円で、本体価格になおすと2118円である。

なのでnanacoポイント付与対象額の総計は2118円(本体)にならなければいけない。

200円あたり1ポイントの基本倍率で計算する金額は2118-2022=96円……

丸め処理の都合か97円になっているが、そういう理屈であろう。

ただ、この金額と20倍対象の端数22円を加算しても200円に満たないため、

200円あたり1ポイントで計算して付与されるポイントは0である。


もし全部が200円あたり20ポイントならば、割引後の本体価格200円あたり20ポイントとなる。

しかし、今回のように複数のポイント倍率が混在する場合は、

○倍付与は割引前の金額で計算して、合計の対象金額が割引後の金額になるよう、

基本倍率など低いポイント付与率の金額を減らすことで調整している。

これ200円引きクーポンに限らず、5%引きクーポンやハッピーデーの5%引きのときも同じような計算をしていたはず。


実はこれを狙ってポイント20倍以外の商品を少し混ぜて買ってるんだよね。

20倍以外の商品というのは200円引きクーポンの割引対象外商品でもある。

惣菜なんだが、なぜか専門店扱いになるため。

2000円以上で200円引きの「2000円以上」に含むことができないということ。

2183円(全てnanacoポイント20倍)を1983円に割引して、これとは別に304円の惣菜を買っている扱いになる。

なので、クーポンの適用だけ考えれば別会計でも同じ結果なのだが、

nanacoポイントの計算としてはかなり違っている。


正直よくわからん仕組みである。

20倍、10倍キャンペーンとクーポンの合わせ技を何度かして、

その結果としてこうなっていることに気づけたが、すぐにはわからなかったからな。

SL列車と走る砕石輸送車の頭

以前、JR旅客各社が機関車の代替の牽引車など買っている話を書いた。

機関車はやめて牽引車を買う

このときこんな話を書いている。

蒸気機関車の回送あるいは代役としての牽引車というのも出てくるかも知れない。

これ、群馬県内で今年秋以降に行われるようになるそうである。

高崎エリア管内のEL・DLが老朽化で運転終了へ SL列車の補助車両は「電気式気動車」に (鉄道コム)


現在はぐんま車両センター(高崎市)に所属する電気機関車・ディーゼル機関車が、

蒸気機関車・客車の回送、蒸気機関車の補助、蒸気機関車用の客車を引くことがあった。

これが同所所属の機関車が引退することにより、GV-E197系に代替されるという。

GV-E197系は砕石輸送用ディーゼルカーだが、牽引車部分だけ外して使うことができる。

最近、客車をけん引する試運転が行われていたらしい。

GV-E197系が12系客車をけん引 (railf.jp)

本来は牽引車+ホッパー車4両+牽引車の6両編成だが、このホッパー車部分を抜いて2両にして、

その2両セットで客車5両を引くという形で試運転を行っている。

牽引車2両はセットで使わないといけない仕組みがあるのかもしれない。

ちなみにホッパー車抜きの牽引車だけの2両編成も製造しているとか。


ただし、GV-E197系単独で客車を引く列車は営業運転にはならないそうである。

あくまでも事業用の牽引車だからということなのだろう。

そのため電気機関車・ディーゼル機関車が客車を引く「ELぐんま」「DLぐんま」シリーズは今年秋で廃止となる。

一方で、蒸気機関車の補助として営業運転に入ることはあるようだ。

そのときも2両セットなのかはよくわかりませんけどね。


機能的には機関車みたいなもんなのだが、見た目が浮くという指摘が。

頭が黄色なのは工事車両のイメージなんだろうし、車体もステンレスだし。

SL列車にこいつが付くとどうにも雰囲気に合わないんじゃないか。

回送だけならともかく、営業運転でも補助には入るわけだしね。

あくまでも本来の役目は砕石輸送と車両回送である。

その本来の役目ならそんなに悪くないデザインなのだが。


JR西日本の除雪用ディーゼルカー キヤ143形はわりと機関車っぽい見た目なので、

そういう用途で使われてもあまり浮かないかもしれない。

除雪車の夏の仕事としてSL関係の用途で使われることはありそうな気もするが……

今のところはまだディーゼル機関車が使えているので出番は無い。

ただ、老朽化問題は当然あるわけで、代替として考えているのはほぼ確かである。


電気機関車が引く客車列車って、もうこれでほぼなくなるんじゃないかな。

これが鉄道の原点!今乗れる「客車列車」10選 (東洋経済ONLINE)

現在のELぐんまシリーズを除けば、黒部峡谷鉄道と大井川鐵道井川線のアプト式区間しかない。

黒部峡谷鉄道は発電所関係の資材運搬を目的とした路線に観光客も乗れるというもの、

大井川鐵道のアプト式区間は急勾配対応の特殊な機関車を使うためである。

なお、井川線のこれ以外の区間はディーゼル機関車で引いているわけだが、

これも元は発電所の資材輸送のための路線であり、おおよそ生活路線とは言えない代物である。


JR旅客各社の中ではJR九州だけは近年もJR貨物と同仕様のディーゼル機関車を購入している。

クルーズトレイン「ななつ星 in 九州」の牽引、SL人吉の回送など、

このほかの車両回送目的でも使用されるとみられる。

ただ、それ以外の各社は新造となれば砕石輸送用ディーゼルカー、除雪用ディーゼルカー、牽引用電車など、

機関車と似たような性質はありつつ、操作方法は電車・ディーゼルカーに揃えている。


JR以外に目を向けても貨物輸送をやらないのに機関車を新造する会社はなかなかないよね。

さっきの客車列車の記事で津軽鉄道のストーブ列車が紹介されていたが、

ディーゼル機関車の老朽化により、故障時などは一般的なディーゼルカーで引かせているらしい。

というのも、ストーブ列車は特別料金がかかるため、生活利用のためにディーゼルカーを連結しているんですね。

で、それで客車を引かせればディーゼル機関車の役目を代替出来ると。

トロッコ列車はこういう形が今後増えそうな気はするな。

ディーゼルカーを改造したトロッコ列車ってのもありますからね。

JCB Webmasterからのメール

先日、みずほJCBデビットの発行を受けた話を書いた。

キャッシュカードをきれいにしたくてJCB

使ってみたところ「JCB Webmaster」からメールが届いて、

今まで時々迷惑メールの送信元で見てた名前じゃないかと思ったのだった。


クレジットカード会社になりすました迷惑メールが届くことは多い。

明らかに僕にとって関係のない楽天カードとかAmerican Expressとか、

まぁそういう送信元なら迷惑メールとすぐに気づくことが出来る。

イオンカード(?)になりすましたメールが届くことも多いのだが、

本当のイオンカードに関するメールは「イオンフィナンシャルサービス」とか「イオンスクエア」とかが差出人なので、

普段から正当なメールに見慣れていればすぐにおかしいことには気づける。


ただ、この「JCB Webmaster」からのメールはわりと精度がいい気がする。

内容もそんな変な内容が書いているわけではない。

ただ、リンク先がjcb.co.jpに見せて全然違うアドレスになっていたり、

よくよく見るとおかしなところが多々あるのだが。

それだけに本物の「JCB Webmaster」からのメールが届いたときに、

「これ本物か?」とかなり疑って見るハメになった。


明らかにおかしいとわかればさっさと除けてしまうのだけどね。

この「明らかにおかしい」という感覚を持てるかも世間的には課題だが、

そこは経験則でなんとかなるとする。

しかし、一見そこまでおかしくないとなると、

送信元のドメインとか実際のリンク先とか注意深くみないといけない。

今までJCBからメールが届くことはおおよそ考えられなかったので、

「JCB Webmaster」の時点で迷惑メールと判断がついたが、

今後はそうもいかないのでより注意深く読まないといけなさそうだ。


なかなか迷惑メール対策には妙案がないのが実情である。

ホワイトリスト方式ならよいが、それでは届くべきメールが届かなくて困る問題が大きい。

昔は質の低い迷惑メールが多かったから簡単だったんだけどね。

Cプリプロセッサとアセンブラのマクロ

レジスタの初期化を最初はCのコードで書こうと思ったのだが、

まだスタックを使えない段階でレジスタの初期化をした方がよいとなって、

そうなるとアセンブラで書いた方が安全かもしれないなと思った。

所定の値をレジスタにセットするだけなのでアセンブラで書くこと自体は難しくない。

が、条件によってセットする値が変わるのが難点である。

(その条件自体はすでにアセンブラのコードで使っているものである)


で、今どきのアセンブラというのはCのプリプロセッサが使える。

定数の定義をCとアセンブラで共通のヘッダファイルにすることもできるし、

アセンブラよりも高度なCのプリプロセッサのマクロが使えるのもある。

今回のケースはまさにこの高度なプリプロセッサが活用できるものである。

設定するパラメータがCFG1, CFG2…と複数あり、

そのパラメータのセットが SET1, SET2…と複数あるので、下記のように定義しておく。

#define CFG_SET1_CFG1 0x11111111

そしてマクロの引数にセット名を取り、トークン連結演算子##を活用して CFG_[セット名]_CFG1 という定数名を作って、

その値をパラメータCFG1にセットするという処理を書けばよいわけだ。


一方のアセンブラのマクロはlocalに列挙したラベルを重複しないように処理するなど、

アセンブラの事情に即したマクロ展開が行われる。(cf. アセンブラのマクロ)

この2つのマクロ展開を組み合わせる場合、一体どうなるのか?

確認したところCプリプロセッサの処理が先に行われ、その後にアセンブラ処理になる。

当たり前ではあるのだが、アセンブラのマクロの引数をCプリプロセッサに処理させることはできないと。

上記の定数展開はアセンブラのマクロ処理より前に完了させなければならない。


で、いろいろ考えたのだがこんな形になった。

まず、パラメータを取ってセットするアセンブラのマクロを書く。

.macro CFGSET_RAW cfg1, cfg2
      LDR R0, =cfg1
      ...

このマクロは CFGSET_RAW 0x11,0x12 のように使うことができる。

で、このマクロを使うマクロをCプリプロセッサのマクロで書く

#define CFGSET(SET) CFGSET_RAW CFG_##SET##_CFG1, CFG_##SET##_CFG2

これでCFGSET(SET1)と書くと、CFG_SET1_CFG1, CFG_SET1_CFG2 という定数が呼び出される。

これらの定数を#defineで定義しておけば、その定数を展開してを引数に並べたCFGSET_RAWマクロ呼び出しが作られる。


さらにはこのCプリプロセッサのマクロを使ってアセンブラのマクロを書く。

.macro CFG_SELECT_AND_SET
     local COND1, COND2, END
     TST R0, #1
     BEQ COND1
     TST R0, #2
     BEQ COND2
     ... COND1:
     CFGSET(SET1)
     B   END COND2:
     CFGSET(SET2)
     B   END
     ... END: .endm

これも先にCプリプロセッサで展開が行われる。

CプリプロセッサのCFGSETマクロの引数を変えると、

展開される定数の異なるアセンブラのCFGSET_RAWマクロの呼び出しが作られる。

で、アセンブラではCFG_SELECT_AND_SETマクロの中に、CFGSET_RAWマクロが入れ子になった形になる。

アセンブラのマクロにアセンブラのマクロが入れ子になっているので問題ない。


思ったよりあっさり動いてしまい拍子抜けという感じもあるのだが、

Cプリプロセッサのマクロの処理順序は時に注意が必要である。

マクロの引数はトークン連結演算子##、文字列化演算子#がない限りは、

#defineの定数置き換えがあればまず置き換えが行われる。

#define SQU(X) (X)*(X)
#define TWO 2

ここでSQU(TWO)と書くと、まず引数のTWOを2と解釈して、Xに2を当てはめるという扱いになる。

XにTWOを当てはめて(TWO)*(TWO)としてから、TWOを2に置き換えるわけではない。

この場合はどちらの順序でやっても差は見えないが、トークン連結演算子や文字列化演算子との組み合わせで問題になる。


上記の定数をCのプログラムで利用することを考えるとこんなマクロを作る可能性がある。

#define SETCFG1(SET)    cfg[1]=CFG_##SET##_CFG1
#define SETCFG2(SET) cfg[2]=CFG_##SET##_CFG2 #define SETCFGS(SET) do{ SETCFG1(SET); SETCFG2(SET); }while(0)

それでSETCFGS(SET1)としても思った通りには動いてくれない。

なぜならばSETCFGSマクロの解釈時に、まず引数のSET1を解釈しようとするから。

もしも #define SET1 100 とか定義されていたら、SETを100に置き換えて、

SETCFG1(SET)→SETCFG1(100)→cfg[1]=CFG_100_CFG1 となる。


こういう目的をもってマクロを入れ子にする場合もあるのだが……

#define STR2(X)          #X
#define STR(X)           STR2(X)
#define SAYCFG(SET,CFG)  puts( #SET "." #CFG "=" STR(CFG_##SET##_##CFG) )

SAYCFG(SET2,CFG2)と書くと SET2.CFG2=に続いて CFG_SET2_CFG2 で定義した定数がputsで出力されるマクロである。

#SETは引数SET2をそのまま文字列化して “SET2” に置き換えられる。

これはよいのだが、CFG_SET2_CFG2を定数の文字列にして表示するには、

STRマクロの引数とすると、トークン連結演算子, 文字列化演算子で使われない引数ということで解釈され、

CFG_SET2_CFG2が#defineで定義した定数(例えば0x02)に置き換えられる。

それをSTR2マクロの引数に渡すとその定数を文字列化して、”0x02″ のような文字列が得られると。

これを2段階にせず、直接STR2マクロの引数にすると “CFG_SET2_CFG2” という文字列を生成されてしまう。


こういうのはあまり一般的な話ではなく、文字列を結合させるというのは、

結合させた名前の定数の値を直接利用したいからだろうと。

一番外側のマクロで定数の値が展開されるようになっていればよいと。

ただし、その定数を他のマクロに渡す場合、引数を##や#で使っていないことが前提である。

最後に書いたような特殊なケースでは入れ子にしてあれこれする。

展開して文字列化するというのはデバッグ目的では多少あるかもしれない。

でも、今回の本題のアセンブラではまず関係ないですけどね。

8進数の使い道

マイコンのリセット要因を表示するレジスタの実験をしていたとき、

とりあえずレジスタの値を表示するために8進数を使うことを思いついた。

というのもリセット直後の値を読む都合もあり、デバッガを接続せず読み出せる必要があり、

コンソールにすぐ表示できる方法として思いついたのがそれだったと。


8進数の何がいいってビットシフトと足し算で簡単に作れることである。

2進数のデータを4bit単位で区切れば16進数、3bit単位で区切れば8進数、

この点ではどちらもあまり差はないのだが、画面に表示するにはASCIIコードにする必要がある。

16進数だと0~9とA~Fは文字コードが連続していないので、

各桁の値が9以下なら’0’の文字コード+値、10以上なら’A’の文字コード+(値-10)を出力する必要がある。

一方の8進数は各桁の値は0~7なので、単純に’0’の文字コード+値でASCIIに変換できる。

というので、他のライブラリなど使わずにサッと数値を文字にして表示するのに便利だったと。


しかし8進数というのは普段そんなに使うものではない。

歴史的な経緯もありCでは 0741 のように先頭に0を付けるだけで8進数リテラルとして扱われるなど扱いはよいが、

この機能が活用されているのはUNIXのパーミッション設定ぐらいしか見ない。

読み込み・書き込み・実行の権限を3bitで表すので3bitで1桁になる8進数が好都合と。

かなり特殊な使い方のような気がする。


歴史的に8進数の扱いがよいのは、昔のコンピュータは3の倍数のビット数をよく使っていたかららしい。

初期のコンピュータでは36bitあるいはその半分の18bitが使われることが多かったらしい。

36bitあれば10進数の10桁を格納できることが理由だったという。

ようは10桁表示の電卓のイメージである。ああいうのを作りたかったと。

符号ビットを考慮すれば最低35bitあればよく、6の倍数に切り上げて36bitと。

この時代は6bitの文字コードも使われていたという。

6bitあれば数字+アルファベットが入るから。(大文字・小文字の区別は付かないが)

だから6bitを2桁で表せる8進数のニーズがけっこうあったのだという。


ただ、その後に浮動小数点演算が導入されて、固定長整数にこだわる理由も減り、

8bitを単位とした体系に移行していったという。

4bitで10進数の1桁、8bitで2桁と二進化十進数としてもこっちの方が好都合だったのかも。

(二進化十進数は今どきはあまり使わないけど、昔はよく使われていたとか)

文字コードも7bitのASCIIコードが標準となり、残り1bitはASCIIの拡張に使われた。

8bit単位なら16進数2桁で8bit表せるのがよいとなる。

今となっては8進数も見る影もないのはこのような事情がある。


今回は横着して8進数表示にしたわけだが、その甲斐あってリセット要因レジスタの仕様が判明していった。

ちょっと不思議なレジスタで通電時にはほぼ全てのビットが立っていて、

これをクリアしておくと、次回からは発生したリセット要因が残ると。

例えばウォッチドッグでリセットした場合はウォッチドッグのビットが立つと。

なのでレジスタを読んだらゼロクリアするということを前提とすれば、

ほぼ全てのビットが立っている=パワーオンリセット、

特定のビットだけ立っている=それがリセット要因ということになる。

あまり見ないやり方だがハードウェア的には作りやすいのかも知れない。

パワーオンリセットの途上であれこれガチャガチャとリセットしても、

全部立った状態からスタートするとすれば証拠隠滅できてしまうので。

ただ、ちょっと解せない仕様もあるので要調査である。

キャッシュカードをきれいにしたくてJCB

昨日、JCBカードが新しく発行されたと書いたが、

具体的には みずほJCBデビット である。

というのも、キャンペーンでデビットカードを発行して利用すると現金プレゼントとなっていたから。

みずほ銀行のキャッシュカードも10年近く持っていると、磁気ストライプの部分がボロボロだったので、

キャッシュカード一体型で申し込んだらきれいなキャッシュカードにもなるし。

と、それぐらいの考えで申し込んだのである。


申し込んでから2週間して届いたのだが、表面は口座番号と氏名(ローマ字)、

裏面にJCBカードの番号、有効期限、サインパネルとある。

表面に口座番号・氏名とあるのは従来と同じだが、エンボスレスで氏名がかな表記からローマ字表記になっている。

表面にJCB DEBITのマークがあり、裏面にはJ-DebitとNFCのマークがある。

キャッシュカードでJ-Debitをアピールするのは従来のキャッシュカードも同様。

逆にこれはないんだなと思ったのがCirrusのような国際ATMネットワークのマークである。

確かに海外でキャッシュカードとして利用できるという記載はない。

このカードは発送元がJCBで、利用明細の確認はMyJCBで行う。

みずほ銀行はデビットカードの業務をJCBに委託しているようですね。


というわけで使ってみた。

まずはJCBカードとして、これはコカコーラの自動販売機で使った。

最近はクレジットカードのNFC決済にも対応していることは気づいていたが、実際に使うのは初めて。

こういうNFC対応のカードしか使えない加盟店というのも増えて行くのだろう。

次にQUICPay、これはみずほWalletのアプリでスマートフォンに設定する。

あらかじめGoogleウォレットのQUICPayを全部無効にして、

それからみずほWalletでメインカードを設定すればよい。

ちょうどダイソーで買い物したときに使ったのだが、反応が遅い……

デビットカードってのもあるのかもしれないが。


ということでこれでキャンペーン条件は達成となる。

今後もキャッシュカードとしては出番は多いでしょうけど、それ以外の出番はどれぐらいあるものか。


これで主要な4ブランドでタッチ決済対応のカードを手に入れたのかと。

  • VISA: スルガVISAデビット, J-WESTカード
  • Mastercard: イオンカード他
  • JCB: みずほJCBデビット
  • American Express: セゾンカードデジタル

今後、更新などで新しいカードに切り替わっていけば珍しくもなくなるだろうけど。

どうしてもVisaタッチじゃないと困るということはあるかもしれないけど、

どうしてもJCB Contactlessじゃないと困るということはそうそうないだろうし、

これコンプしたからなにかいいことがあるとはならんだろうが。

この中でタッチ決済の出番が圧倒的に多いのがイオンカードで、

これはイオンで買い物するときに「クレジットカードで」と言ってタッチしているから。

逆にそれ以外はそもそも実店舗で使うことがあまりないカードである。