Vol.801 17.Jul.2020

買い物リストが使えるメモアプリ PasooconMiniPC8001(16)〜Z80機械語のフラグ

K 買い物リストが使えるメモアプリ(Google Keep)

by fjk

 Jolteをスケジュール管理・日誌的に使っているが、買い出し時に買い物リストをさっとメモって、購入したらチェックできる機能がほしい、と思っていたところ、PlayStoreでGoogleKeepを見つけた。KeepはAndroidOSの提供先であるGoogle社が提供しているシンプルなメモアプリで、思いついたことを手書きなどで即メモできるほか、音声メモや写真も保存できる。特に便利なのが「リスト機能」で、買い物リストを記述し、購入済みの時点でチェックすると、買い忘れを防止できる。また、チェックリストは階層化することができる(右スワイプ)ので、個人別や業務別などに分けて管理することもできる。Keepの詳しい使い方はKeepサポートなどを参照。なお、Keepはiphonでも使えます。

【GoogleKeepの主な機能】
@ リマインダー:指定場所や時間になると通知。
A メモ固定:重要メモは常に画面の上位に表示。
B 色・ラベル:メモに色やラベルをつけて整理。
C 共同編集:別のKeepの利用者とメモを共有。
D チェックボックス:リスト形式でメモを管理。
F 手書き:文字や図形を描画したメモが作れる。
G 画像:カメラ撮影写真、画像データをメモに。さらに画像に文字の書き込みもできる。
H マルチプラットホーム:スマホ、タブレット、パソコン、Android ウェアラブルで動作。
Keep起動画面 リスト画面

※スマホの便利アクセサリー

1.タッチペン
画面タッチで付く指紋防止と文字入力時の誤入力防止のため、狭い範囲でタッチできるペンを百均で購入した。ペンは先端が細く、画面に優しい透明な円盤がついており、タッチ場所の確認が容易。
2.端子保護キャップ
USBとイヤホンの端子にゴミや水が入ることを防止するためシリコン製のキャップを準備。
百均のタッチペン シリコン製の保護キャップ(@35)


P PasooconMiniPC8001(16) 〜Z80機械語のフラグ

by fjk

 Z80機械語を使いこなすには、プログラムの流れを制御できるフラグが重要である。フラグは演算等を実行した結果、1か0に変化するビットで、以下のフラグレジスタとして構成されている。

bitフ ラ グ名
0:[C、Cy]キャリーフラグ(8ビット目からの桁上がり)
1:[N]減算フラグ (減算処理実行時)
2:   <未定義> (データは不定)
3:[P/V]パリティ/オーバーフローフラグ
4:   <未定義> (データは不定)
5:[H]ハーフキャリーフラグ(4ビット目からの桁上がり)
6:[Z]ゼロフラグ(データが0か)
7:[S]サインフラグ(最上位ビットが1か)

これらのフラグを使ってジャンプ(JP、JR)やコール(CALL)・リターン(RET)命令で処理を変えることができる。(一部を除く)ロード(LD)命令や16bitのINC/DEC命令はフラグが変化(影響)しないが、各命令毎のフラグへの影響をまとめると(表記以外の命令ではフラグデータは変化しない)、

命   令 SZHP/VNCコ メ ン ト
ADC A,s ADD A,s ××8-bit
SBC A,s SUB s CP s NEG ××8-bit
AND s ××8-bit
OR s XOR s ××8-bit
INC s ××8-bit のみ(16-bitは変化せず)
DEC s ××8-bit のみ(16-bitは変化せず)
ADC HL,pp ××16-bit
ADD HL,pp ADD xy,pq ×××16-bit
SBC HL,pp ××16-bit
RLA RLCA RR s RRC ××
RL s RLC s RR s RRC s
SLA s SRA s SRL s
××
RLD RRD ××
DAA ××
CPL ××
SCF ××1
CCF ×××
IN r,(C) ××
INI IND OUTI OUTD ×××××if B=0 then Z=1 else Z=0
INIR INDR OTIR OTDR ×××××
LDI LDD ××××if BC=0 then P/V=0 else P/V=1
LDIR LDDR ××××
CPI CPIR CPD CPDR ××××if A=(HL) then Z=1 else Z=0
if BC=0 then P/V=0 else P/V=1
LD A,I LD A,R ××IFF
BIT b,s ××××
★:変化する、ー:変化しない、×:不定、P/V:パリティ/オーバー、IFFは割り込みフラグ

※ Z80アセンブラの技

1.レジスタの内容の保護・一時退避 (CALL、RET命令もスタックを使うので共存に注意!)
Z80のレジスタは限られた数しかなく、直ぐに足りなくなってしまう。こんな時は、PUSH命令を使って、レジスタの値を一時的にメモリに退避させ、再び必要になればPOP命令でレジスタに戻すことができる。この時、PUSHはメモリにデータを順に格納していくが、POPで取り出すには最後に退避させたデータから読み出す必要がある(先入れ後出し)。
最後にPUSHしたデータは”EX (SP),HL”命令で(元のHLレジスタの値をスタックに退避して)HLレジスタに呼び出せるので、2バイトレジスタが1つ増えたように利用できる。
IX、IYレジスタとBC、DE、HLレジスタとの転送や交換は直接の命令がないので、PUSH/POPおよびEX命令など、スタックを利用する。
AFやBC、DE、HLレジスタを補助レジスタと入替える”EX”、”EXX”命令もあるが、どちらを使用しているか、間違えないように注意が必要。
2.1バイトの命令でAレジスタを0にする
Aレジスタの値を0にするには”LD A,0 ”であるが、機械語に直すと2バイトになる。Z80が開発された頃はメモリが高価で容量も小さく、如何に使用バイト数を少なくするかが工夫された。そこで、よく用いられたのが、”XOR A“で、1バイトでAレジスタの値を0にできる。
Aレジスタの内容を変えずに、S(サイン)、Z(ゼロ)、P/V(パリティ)を確認するには”AND A“(H=1)または”OR A“(H=0)を利用。
3.CP命令
CP命令はSUB命令と同じく減算処理を行うが、Aレジスタに減算結果を戻さない(Aレシスタの値は変化しない)。CYフラグが変化するので、一致(ゼロ)だけでなく大小も得ることができる。
4.2の乗数の乗算・除算
2進数で整数の乗除算はデータを繰り返し加減算することで実現できるが、レジスタデータを左(上位)に1ビットシフト(SLA)すると2倍、右(下位)に1ビットシフト(SRL)すると1/2倍される。これを利用すると、整数型の乗除算を簡単に行うことができる(乗算はADDでも可能)。
5.ON n GOTO/ON n GOSUBを行う【中級】(PCを変えるので、間違えると暴走する!)
データnの値によって複数の場所にジャンプ(又はcall)したいときに便利なのが、JP (HL)命令です。ジャンプしたい番地のテーブルを作り、テーブルの先頭番地にnを2倍したデータを加えたアドレスから2バイトをHLレジスタに入れる。そして”JP (HL)命令を実行する(GOTO)。Call(GOSUB)の場合は戻り番地をpush後にジャンプ。
6.命令をオペランドに埋め込む【上級】(プログラムが難読化)
下図はN-BASICを逆アセンブルした例で、3バイト命令の途中にジャンプしているようにみえる。@の命令はBCレジスタにデータを格納する命令だが、実際にはBCを使わないので無意味な命令(NOPと同じ)。しかし、AやBから実行するとEレジスタに任意のデータを格納できる。これは条件によって処理を変えたい場合、オペランドに命令を埋め込む方法の例である。難読となるが、分岐命令を使わないので、先読みロスやバイト数の節約、実行速度の向上が期待できる。
  ・・・        ・・・
 31BB: 	CAE23B  	JP   Z,3BE2H       
 ・・・    ・・・
 3BDF: 	1E02      	LD   E,02H
 3BE1: 	011E0B    	LD   BC,0B1EH  ・・@
  ( 3BE2 : 	1E0B     	LD   E,0BH )   ・・・A
 3BE4: 	011E01    	LD   BC,011EH  ・・@
  ( 3BE5 : 	1E01      	LD   E,01H )   ・・・B
 3BE7: 	011E0A    	LD   BC,0A1EH  ・・@
 ・・・    ・・・ 
  N-BASICの逆アセンブル例


買い物リストが使えるメモアプリ PasooconMiniPC8001(16)〜Z80機械語のフラグ