Shimanetのブログ
Amebaでブログを始めよう!

Rakuten Hand 5G でLubuntuからワイヤレスデバッグ接続/おまけ画面のキャスト

大阪の日本橋で微妙に安く新品で買った楽天モバイルの端末 Rakuten Hand 5G ( Tinno P780 ) を Lubuntu 22.04 LTE からAndroid11以降対応のWi-Fiでワイヤレスデバッグ接続した時の方法のメモの走り書き。

※注意:このメモの内容に保証など無い。(マジ切れ)


手順 1. Install adb (Android Debug Bridge)

sudo apt install adb



手順 2. USB接続をしないでワイヤレス接続するには、adbがリビジョンVer.30以降(Android11 APIレベル30以上)のワイヤレスペア設定に対応したものが必要になる。

バージョンの確認は

adb --version

で確認が出来る。

もし表示される2行目のリビジョンのVer.が30以上であれば、これ以降の作業は不要で 手順 3. に進める。
(リビジョンの詳細は下記のリリースノート参照)

2023年6月11日時点では古いリビジョンのバージョン

Android Debug Bridge version 1.0.41
Version 28.0.2-debian

だったため問題があるので、

SDK Platform-Tools リリースノート
https://developer.android.com/studio/releases/platform-tools?hl=ja

から最新版をダウンロードして

Android Debug Bridge version 1.0.41
Version 34.0.3-10161052

などのVer30以降のワイヤレスペア設定に対応したものを

[HOME]/Android/android_sdk/platform-tools/

などのフォルダを用意して、手順 1. でインストールしたadbに被らないように展開して用意する。

このバージョンの確認は

[HOME]/Android/android_sdk/platform-tools/adb --version

で確認が出来る。

※注意:この際にパスを通すなどの高尚な作業をしてしまうと、scrcpyなどでadbの不整合が発生するので、最新版リビジョンVer.のadbにはフォルダ名を指定してadbを実行する必要がある。


手順 3. 開発者向けオプションを有効にする。

有効になってない時はデバイスで [ビルド番号] オプションを探し7 回タップする。

デバイスの開発者向けオプションを設定する
https://developer.android.com/studio/debug/dev-options?hl=ja

この時に開発者オプションを開いて[ クイック設定開発者用タイル ]の[ ワイヤレス デバッグ ]をONにしておくと、ワイヤレスデバッグの通知がされて便利になります。


手順 4. ワイヤレスデバッグの有効化。

開発者オプションを開いて[ ワイヤレス デバッグ ]をONにすと、利用中のWi-Fiネットワークからワイヤレスデバッグ を許可するか聞いてくるので許可をする。


手順 5. ワイヤレスペア設定をする。

参考情報:
パフォーマンスと品質
ワイヤレス デバッグ
https://developer.android.com/about/versions/11/features?hl=ja#wireless-adb

デバイスの[ ペア設定コードによるデバイスのペア設定 ]で、IPアドレス:ポートと接続コードを表示させ、Lubuntu側のターミナルからペア設定を実行する。

adb pair 192.168.xxx.xxx:ppppp cccccc

もしadbのリビジョンVer.が古いと adb pair が使えないので 手順 2. で用意した最新版のフォルダ名を指定して adb pair を実行する。

[HOME]/Android/android_sdk/platform-tools/adb pair 192.168.xxx.xxx:ppppp cccccc

ペア設定に成功するとデバイス側で「 ペア設定済みのデバイス 」に表示され、Lubuntu側では

Successfully paired to xxx.xxx:ppppp [guid=adb-XXXXX-YYYYY]

のように表示される。

これはAndroidデバイス側に依存する設定作業なので、Lubuntu側ではペア設定済みの再確認は出来ない。

なお一発でペア設定できるとは言っていない。

時間を置いて再実行とか adb kill-server とか 、続けて adb start-server とかチャレンジ(震え)。


手順 6. ワイヤレスデバッグ接続をする。

Androidデバイス側[ワイヤレス デバッグ] の下に表示されているIPアドレスとポート番号を使って、Lubuntu側のターミナルから接続設定を実行する。

adb connect 192.168.xxx.xxx:ppppp

もしadbのリビジョンVer.が古いと接続が出来ない事もあるので 手順 2. で用意した最新版のフォルダ名を指定して adb connect を実行する。

[HOME]/Android/android_sdk/platform-tools/adb connect 192.168.xxx.xxx:ppppp

接続設定に成功するとAndroidデバイス側で通知されます。

Lubuntu側では

connected to 192.168.xxx.xxx:ppppp

と表示され、
[ adb devices -l ]でも再確認する事が出来ます。

adb devices -l
List of devices attached
192.168.xxx.xxx:ppppp device product:P780 model:P780 device:P780 transport_id:1

のように表示される。

なお一発で接続設定できるとは言っていない。

時間を置いて再実行とか adb kill-server とか 、続けて adb start-server とかチャレンジ(たぶんペア設定までは遡らなくても大丈夫かも?震え)。


手順 7. これで scrcpy などのLubuntu側アプリでワイヤレス接続を利用したAndroidデバイスのミラーリング表示やリモートコントロールが出来るようになります。

scrcpyインストール参考

Scrcpy 2.0 is out! How to Install & Use this Android Remote Control App
https://ubuntuhandbook.org/index.php/2023/03/scrcpy-2-0-install-android-remote-control/


Install Scrcpy from the source

※先にインストールしたいフォルダを作成して移動しておく。

sudo apt install ffmpeg libsdl2-2.0-0 adb wget gcc git pkg-config meson ninja-build libsdl2-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libswresample-dev libusb-1.0-0 libusb-1.0-0-dev

git clone https://github.com/Genymobile/scrcpy

cd scrcpy && ./install_release.sh


あとは scrcpy を実行するだけ。
Ver.2.0の音声付きだと遅延が大きかも。
scrcpy --no-audio で音声なしで遅延が改善。
詳細は scrcpy --help で確認できます。

※Uninstall scrcpy
(インストールフォルダのscrcpyソースフォルダに移動してから実行)

sudo ninja -Cbuild-auto uninstall



-------------


おまけ(と言うかそもそもの本題)


Rakuten Hand 5G ( Tinno P780 ) でモニタへのワイヤレス接続での画面のキャスト


いわゆるミラーリングなどのMiracastを利用したワイヤレスディスプレイ接続。。。うっ頭が…

だいたい100回中99回以上は接続が上手く出来ず画面が表示されません(マジクソ仕様)。

どうも接続はされているのですが、その先のネゴシエーションなどの不都合などで画面表示が出来ないようです。

Androidデバイス側のアプリを使用して、DLNA接続の動画表示やAirPlay接続の画面ミラーリングは案外とすんなり成功しますし、クロームキャストはアプリ不要で画面のミラーリングが可能です(遅延がちょっと大きいけど)。

…だがMiracast機能を使ったMirascreenは上手く行かないですね、、、運よく接続が出来れば遅延も少なくて、かなり快適なのですが、、、とにかく接続が上手く行かなくて画面表示がされない…orz.。

しかし試行錯誤を重ね、何だか良く分からないけど画面表示が成功する宗教的確率向上方法を運用により導き出しました!!(ぐるぐる目)。

まずMiracast側の電源をON/OFFして再起動リセット動作してからON状態にします。

このときにAndroidデバイス側のワイヤレスデバックの設定をOFFにするのは当然ですが、ブルートゥースやGPS位置情報をONにしておくと飛躍的に画面表示確率が向上します。

…そして開発者向けオプションの[ ワイヤレス ディスプレイ認証 ]をONにするのです。

----------
※開発者向けオプションが有効になってない時はデバイスで [ビルド番号] オプションを探し7 回タップする。
☆参考:デバイスの開発者向けオプションを設定する
https://developer.android.com/studio/debug/dev-options?hl=ja
----------

開発者向けオプションの[ ワイヤレス ディスプレイ認証 ]をONにする

そして[ 接続済みデバイス ][ 接続の設定 ][ キャスト ]と進み、右上のメニューオプションの[ ワイヤレス ディスプレイの有効化 ]をON/OFFして擬似的に再起動させてからONの有効状態にして、それから[ Enable listen mode ]をONにします。

それから選択可能になったMirascreenを選択して接続します。

[ 接続済みデバイス ][ 接続の設定 ][ キャスト ]と進み、右上のメニューオプションの[ ワイヤレス ディスプレイの有効化 ]をON/OFFして擬似的に再起動させてからONの有効状態にして、それから[ Enable listen mode ]をONにします。<br /><br />それから選択可能になったMirascreenを選択して接続します。

接続情報が表示されてますが、画面表示が成功しても失敗しても表示されます。

つまり画面表示が出来るとは言っていない(ぐるぐる目)。

いろいろ接続条件を列挙しましたが、ほぼ全て宗教的理由に匹敵します。だって根拠不明確だし(震え)。

[ ワイヤレス ディスプレイの有効化 ]がONになっていてMirascreenを選択出来るのならば、他はデフォルトのままでも画面表示されます。でも、ものすごく確率は低いです。概ね30〜100回以上のチャレンジになるかな(吐血)。

しかし、この宗教的儀式を執行する事により、画面表示ができる確率は飛躍的に向上されます。多分ですが数回から10回程度のチャレンジで(震え)。

もちろん保証なしですよ、念の為。

。。。楽天だけに、信じるものは救われる…かも(ぐるぐる目)。

ファンレスPCのNP11VにLinuxを入れて艦これHTML5版を遊ぼう!!

・・・2ヶ月の苦闘の末に見事に失敗…orz.

原因:搭載VGAチップのメーカーがLinux用3Dドライバーを提供してなかった

(エラー無く動くが動作が極端に遅い。因みにWindows8/10用も提供されてない。)


以上。終了、解散、お別れ。

 

 

まぁ、そういう事で、それに至るまでの経緯を適当に書いておきます。

 

※対象のNP11Vは64bitのATOM-CPU1.6GHzにメモリが最大の1GB搭載でファンレスの小型PCです。

 

 

2022年01月18日追記: この記事はLubuntuの18.04LTSを元に記述しましたが、20.04LTSでは不都合な事が増えたので、下の方に修正記事を追加してます。

 

 

その1:インストール起動用に用意した7年くらい前のCF16GBがたまたま不良品だった

4枚余ってたコンパクトフラッシュ16GBの内の最初に手に取った1枚目だけが不良品だったのであります!。

お陰様で、手持ちのカードリーダーが悪いのか、PC側のハードやBIOS設定とかが悪いのかが、すぐに分からなかったのであります。

完全にCFカードの単体が不良品との原因が確定するまでに2週間かかりました!

・・・だいたい休日しかやらないし。(震え)

 

 

その2:内蔵LANの搭載チップがLinuxと相性が悪かった

リアルテック蟹8168とか云うLANチップが製造レビジョンでメーカー提供のLinuxドライバーの挙動が違うようなのであります!。

お陰様で、ドライバーのインストール方法が悪いのか?製作が古いドライバー(違うチップ8169との誤認識版)であれば動くのか?が、Lubuntu18.04→16.04→14.04(稼働)→openSUSE→ArchLinux、と確認に手間取り、すぐに分からなかったのであります。

最新版のドライバーじゃダメっぽい、USB接続LANを買ってくるべ、って決心するまでに2+2週間かかりました!

・・・だいたい休日しかやらないし。(震え)

 

 

その3:起動用USBの書き込み焼きソフトによりBIOSがUSB-HDDかCFカードリーダで認識が異なり起動用Linuxが動いたり動かなかったりした

その2/LAN編とその4/VGA編に大きく関わるArchLinuxの起動用USBドライブが、書き込みソフトによりPCのBIOS動作の挙動が異なってArchLinuxの読み込み途中でエラー停止してしまい、詰みかかるほど悩んだのであります。

LubuntuはUNetbootinでiso書き込みしてBIOSがCFカードリーダとして認識しても問題なく起動出来たのだが、ArchLinuxはWin32DiskImagerでiso書き込みしないとCFがUSB-HDDとBIOSが認識せず起動途中のカーネルの読み込みでエラーになってしまった。

iso書き込みをしないメモリからインストールメディアをロードするSyslinuxとRAMディスクの組み合わせでもダメで、トラブルシューティングの「USBメディアの名前をARCH_XXXXXXうんぬん」は通用しなくて、その真の原因に気が付く迄に2週間かかったのであります!

・・・だいたい休日しかやらないし。(震え)

 

(ちなみに他のPCだとBIOS起動途中のUSB認識部分で止まってしまい、カードリーダーをUSBから外さないとBIOS変更すら出来なかったりした。BIOSメーカーのAMI(○)とフェニックス(×)の違いか?)

 

 

その4:内蔵VGAの搭載チップを正常に認識するとGUIが起動出来ずに途中で停止する

もう何を言っているか分からねぇと思うが、Linuxが内蔵VGAの SiS672 Mirage3+ GPU を正しく認識してsisimediaドライバーが起動してしまうと、ドライバーのバグによりモニタを正常に認識出来ない事があり、GUIの起動途中で停止してしまってたのであります。

正しく認識???しないLubuntu18.04や14.04だと代替でvesaドライバーが動くので正常にGUIが起動するのだが、最新版のLubuntu18.10やopenSUSEでは正常???にsisimediaドライバーが動いてしまいGUI起動直前でアナログモニタの物理的な接続の相性によっては停止してしまうのであります。正確に不具合の内容を理解出来るまでに2+2+2週間かかりました!

・・・だいたい休日しかやらないし。(震え)

 

gununuさんがバグ修正版ドライバーを4年以上前に上げてくれてるのですが、現在の1年前の最新バージョンのLinux公式sisimediaドライバーにはバグが残ったままなので、下手に最新版を入れてしまうと画面真っ暗の憂き目に合うのであります。

 

gununuさんのバグ修正版ドライバーの導入方法

元記事
Ubuntu日本語フォーラム SiS M672 解像度
https://forums.ubuntulinux.jp/viewtopic.php?id=19584

ソース元
SiSグラフィック搭載機にLinuxをインストールするメモ
http://d.hatena.ne.jp/gununu/20140603/1401760427

手順参考
SiS製ドライバを利用する
https://blog.neoflow.jp/hardware/2916/

arch linux 参考資料
Arch Linux で Silicon Integrated Systems (SiS) 製のグラフィカルアダプタを動作させる方法
https://wiki.archlinux.jp/index.php/SiS

--------------------

https://github.com/gununu/xf86-video-sis-stable から xf86-video-sis-stable-master.zip を入手し /usr/local/src/ に解凍
(自分は手抜きで sudo pcmanfm でファイルマネージャーを管理者権限で立ち上げて解凍コピーしてます)

cd /usr/local/src/xf86-video-sis-stable-master

sudo apt-get install autoconf automake xorg-dev xutils-dev mesa-common-dev libdrm-dev libtool

sudo autoreconf -i

sudo ./configure --prefix=/usr --disable-static

sudo make

sudo make install

sudo nano /etc/X11/xorg.conf

(注意:nanoはテキストエディターです。他の物も使用可。)

// xorg.confファイル編集(注意:わざとvesa対応になってます)
----------------------------------------

Section "Module"
  Load  "dbe"
  Load  "i2c"
  Load  "bitmap"
  Load  "ddc"
  Load  "dri"
  Load  "extmod"
  Load  "freetype"
  Load  "glx"
  Load  "int10"
  Load  "vbe"
EndSection


Section "Device"

    Identifier    "Configured Video Device"

    Driver        "vesa"

    #Driver "sisimedia"
    #Option "EnableSisCtrl" "yes"

    Option "UseSSE" "yes"
    Option "UseFBDev" "true"

EndSection


Section "DRI"
   Mode         0666
EndSection


Section "Monitor"

    Identifier    "Configured Monitor"
        #Identifier     "DELL 2001FP"
        DisplaySize     367 275
        HorizSync       31-80
        VertRefresh     56-76
        Option          "DPMS"
        ModeLine        "1600x1200" 160.00 1600 1664 1856 2160 1200 1201 1204 1250

EndSection


Section "Screen"

    Identifier    "Default Screen"
    Monitor       "Configured Monitor"
    Device        "Configured Video Device"

    DefaultDepth 16
    #DefaultDepth 24

    Subsection "Display"

        Depth 16
        #Depth 24

        Modes       "1024x768" "800x600" "640x480" "1280x1024" "1600x1200"
        #Modes       "1600x1200" "1280x1024" "1024x768" "800x600" "640x480"

   EndSubsection

EndSection

----------------------------------------

// merge following text and save(Ctrl+o Enter) exit(Ctrl+x)
(nano テキスト書き込み Ctrl+o ファイル選択で変更無し Enter で終了は Ctrl+x)

わざとvesaドライバーになってて意味もなくDRIドライバーの設定も追加されてます。


sisimediaドライバーにするには

 

  #Driver "sisimedia"
  #Option "EnableSisCtrl" "yes"

のコメント # を削除して

  Driver "vesa"

 

の行にコメント # を追加して無効化して下さい。


モニタの設定は手持ちのDELL 2001FPにしてますので適当に変更するかコメントアウト削除して下さい。
1024x768くらいまでなら Identifier "Configured Monitor" だけでも動くかもしれません。

  DefaultDepth 16
  #DefaultDepth 24

    Depth 16
    #Depth 24

の色深度は少ない16を明示して指定した方が表示が速くなるのですが、
vesaで問題なくてもsisimediaでリフレッシュレートに問題が発生するかもしれませんので、
その場合は24にするか16の行にコメント # を追加して無効化デフォルトにして下さい。

----------------------------------------

下記は表示動作の確認の参考まで

OpenGL Version の確認方法
https://dench.flatlib.jp/opengl/linuxopengl

sudo apt-get install mesa-utils
glxinfo

version だけ抜き出す

glxinfo | grep "version string"


Xorg/ハードウェア3Dアクセラレーションガイド
https://wiki.gentoo.org/wiki/Xorg/Hardware_3D_acceleration_guide/ja

No need to load modules for your driver or agpgart, even if you compiled them as a module. They will be loaded automatically.

user $glxinfo | grep rendering
direct rendering: Yes
If it says "No", you don't have 3D acceleration.

user $glxgears
Test your frames per second (FPS) at the default size. The number should be significantly higher than before configuring DRM. Do this while the CPU is as idle as possible.

Note
FPS may be limited by your screen's refresh rate, so keep this in mind if glxgears reports only about 70-100 FPS. games-fps/ut2004-demo or other 3D games are better benchmarking tools, as they give you real-world performance results.

----------------------------------------

 

その5:内蔵VGA搭載チップのsisimediaバグ修正ドライバーより汎用vesaドライバーの方が表示が速かった

前項の xorg.conf がわざとvesa対応になってるのは安全対策だけではなくて、動作確認に使ったglxgearsのテスト結果が、vesaの方が2割位表示が速い為だったからなのであります。(なおテスト期間が長くなってしまったので細かい数字はうろ覚えだったりします。)

i686(32bit)-Lubuntu18.04-sisimedia 約60fps
i686(32bit)-Lubuntu18.04-vesa 約74fps

amd64-Lubuntu18.04-sisimedia 約72fps
amd64-Lubuntu18.04-vesa 約88fps

さらにデフォルトより色深度が少ない Depth 16 に設定したamd64-Lubuntu18.04-vesaは約110fpsまでになったので、ドライバーの設定やインストールをしなくてもモニタやGRUBの設定が正しければ1024x768程度までなら行けるしで、結局は無理してまでsisimediaドライバーを使う理由がない事に気が付くまでに2+2+2+2週間かかりました!!

・・・だいたい休日しかやらないし。(震え)

 

----------------------------------------

ちなみに一番簡単な解像度の変更方法はvesaドライバー等が動いている状態ならばGRUBの

GRUB_GFXMODE=640x480

を1024x768とかに変更しただけでちゃんと動く場合もあります。

「Grub Customizer」でGRUBの設定変更

sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer

でGRUBのGUI設定ツールがインストールできます。
(もしくは sudo nano /etc/default/grub でテキストエディターから直接編集など。)

----------------------------------------

 

その6:内蔵VGA搭載チップのDRIドライバーが無ければ高速な3D描画は出来ない

散々に苦労しましたがLinux対応のDRIドライバーが無ければ高速な3D描画が出来ないので、艦これみたいなHTML5対応アプリの動作は非常に厳しいと言う事がわかったのでありました。

最新の64bit版のFirefox64.0がインストールされてるんですけどね・・・
エラーも吐かずに音声もちゃんと再生されるんですけどねぇ・・・
一番速くに設定した16bit色のamd64-Lubuntu18.04-vesaでもですね・・・



艦これのログインから母港画面の遠征1部隊の帰港が完了するまでにですね・・・



・・・20分もかかるんですよ・・・・・・



・・・まぁ、だいたい休日にしかやらないし。(震え)

 

----------------------------------------

 

おまけ:

いろいろLinuxの種類があってArchLinuxやopenSUSEとか悩みましたが、一番とっつき易かったLubuntuの18.04LTSの64bit版に落ち着く事にしました。

それでも詰まりかかった事も結構あるんですよ、たとえばインストール時のHDDパーテーション選択画面が勝手にデカくなり過ぎましてね、縦横のウィンドウサイズが画面解像度サイズよりもデカくてね、次へボタンが押せなくなっちゃうんですよね。

マジで困りましたね・・・

Androidタブでググって「Altキー押しながらマウスの左ボタンで押えながらウィンドウ画面を移動できる」っていうのを見つけられたのは嬉しかったですね・・・


ArchLinuxはとてもドキュメントが良く出来ていて助かったんですが、基本がGUIではなくテキストCUIだったので、初心者にはMS-DOS6.2でWindows3.1をインストールするよりも難しかったですね。正直、注文の多い料理店状態を延々と続けてる感じで、完全なインストール迄には時間切れで無理だったのが残念でした。

openSUSEはLinuxに慣れてきたら良い感じに使えそうな雰囲気でしたが、VGAの問題で詰まって後回しになってしまう感じになったのが残念でしたが、時間があれば再チャレンジしたいですね。


・・・ちなみにLinuxのチャレンジは、15年ほど前にLiveCDの作成と、6年くらい前にリブレットに軽めのものをちょこっとお試しインストール(これもVGA周りで悩んだ記憶あり)と、1年前に緊急起動用ディスクを作ったくらいですかね。


あと表題の艦これHTML5版ですが、運営さんの改修が続いているおかげで、WindowsXPにFirefox52.9.0ESRで音声オンの状態でもFlash版よりちょい遅いくらいで何とか安定して動くようにはなってきましたし、昨日に試したらデフォルト32bit色から16bit色に落としたら戦闘演出がほんの気持ちだけだけど速くなるのを確認できたので、もうしばらくは艦これ専用機みたいに1GBメモリで動くWindowsXPが現役を続けられそうです。

・・・このPCじゃLinuxで艦これHTML5版は無理だったしねぇ・・・・・・

AndroidタブレットやWindows10PCでも艦これHTML5版をやってはみてるんですが、根本的な不具合の要因は少ない1〜2GB程度のメモリなどではなく、CPU/GPUの3D描画機能の使い方に問題がありそうですね。

少ないメモリは仮想メモリの手動解放とかの運用でカバーできる事もありますが、3D描画はユーザーが何とかしようもないですからねぇ。。。

 

----------------------------------------

 

追記(2022年01月02日20:45) / 再追記修正(2022年01月18日08:25) / 再々追記(2022年01月24日06:45):

全く別の手持ちの古いWindows10ノートPCがWin11に対応する事がハード的に無理っぽいので、Lubuntu20.04.3LTSをパーテイションの移動も含めて3日間ほどちまちまと勘違い失敗とかしながらインストールしてみましたが、メモリが2GBしかないんですがメッチャ艦これHTML5版がサクサク動きました(笑)。

 


艦これの画面 − AO722 : AMD C-60 APU with Radeon(tm) HD Graphics @ 1.00GHz ( Radeon HD 6290 ) / Memory 2GB / Lubuntu20.04.3LTS / Vivaldi

 

 

※パーテイション設定以外でちょこっと嵌まった事は、Lubuntuをインストールしたらサウンドボードのハードウェア側の設定がヘッドホンプラグを挿した時に内部スピーカーが自動でミュートになる設定になってしまって、Windows10側でもその設定を解除する事が出来なかったので、ヘッドホン端子をラインアウト替わりに使っているとシステムトレイのスピーカーアイコンで手動でヘッドホンからスピーカーに切り替えてもスピーカーから音を出す事が出来なくなる現象が発生しました。

何とかLubuntu側にALSAの設定アプリを入れる事により、自動ミュート機能を無効にしたらLubuntuとWindows10の双方でスピーカーから音が出るように出来ました。

…こんな感じの微妙な設定の違いが溜まってって摩訶不思議な不具合が発生して行くんだろうなぁ(白目)。

 


※ 比較参考用

AO722 : AMD C-60 APU with Radeon(tm) HD Graphics @ 1.00GHz ( Radeon HD 6290 ) / Memory 2GB

OpenGL Renderer    AMD PALM (DRM 2.50.0 / 5.11.0-46-generic, LLVM 12.0.0)
Version 3.1 Mesa 21.0.3 Direct Rendering:Yes
GPU Drawing:1308.03

$ glxinfo | grep "version string"
server glx version string: 1.4
client glx version string: 1.4
OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.0.3
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.1 Mesa 21.0.3
OpenGL shading language version string: 1.40
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 21.0.3
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10

$ glxinfo | grep rendering
direct rendering: Yes

$ glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
301 frames in 5.0 seconds = 60.177 FPS
300 frames in 5.0 seconds = 59.980 FPS
300 frames in 5.0 seconds = 59.977 FPS
300 frames in 5.0 seconds = 59.974 FPS
300 frames in 5.0 seconds = 59.949 FPS
301 frames in 5.0 seconds = 60.014 FPS
X connection to :0 broken (explicit kill or server shutdown).

※ビデオドライバーとモニターが適切だとリフレッシュレートに合わせたフレーム速度になるようです。

 

----------------------------------------

 

追記(2022年01月11日11:20) / 再追記修正(2022年01月18日08:25) / NAS対応等の追加(2022年01月24日10:15):

この記事のNP11VをLubuntu18.04からLubuntu20.04.3LTSへクリーンインストールする事にしたんだけど・・・。

まさかの上記ビデオ設定のほとんどが使えなくてワロタ!!(吐血)

それだけでなくてインストール用のパーテイションツールで設定すると途中でエラーになるから、ライブDVD側のツールでパーテイションの設定を更新しなきゃならなかったりとかで、またまた苦労しました。(前日の時は自分の環境が悪いのかと思ったら仕様だったwww)

で、しかたなく、なるべく環境に依存しないビデオ設定を再考したので、それと再インストール時に便利なメモもついでに一緒に掲載します(白目)。

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Lubuntu起動時に画面が表示されない場合
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ビデオドライバーや /etc/X11/xorg.conf を設定しても画面表示がうまく行かない場合には、
リカバリーモードや起動オプションの nomodeset などで再起動し Grub Customizer をインストールして、
その設定画面からカーネルパラメーターに ”nomodeset” を追加して、
恒常的に最小限のビデオ環境で動くよう設定するのが確実かと思われます。

( GRUB_CMDLINE_LINUX_DEFAULT="nomodeset" 相当になります )

参考資料: インストール直後の画面が砂嵐のようになる
https://ja.osdn.net/projects/linuxbean/forums/28974/35844/

参考資料: Xubuntu 14.04 LTS 64bit のインストールとカスタマイズ
https://www.fuukemn.biz/page19.html

参考資料: nomodesetとLinuxにおけるGPUドライバーの問題
https://cpplover.blogspot.com/2012/03/nomodesetlinuxgpu.html


※ 追記: nomodesetと併用して解像度等を指定する方法もあります。

設定例

1024x768  16bit色:"nomodeset vga=791" / 24bit色:"nomodeset vga=792"

640x480   16bit色:"nomodeset vga="785" / 24bit色:"nomodeset vga=786"
800x600   16bit色:"nomodeset vga="788" / 24bit色:"nomodeset vga=789"
1280x1024 16bit色:"nomodeset vga="794" / 24bit色:"nomodeset vga=795"
1600x1200 16bit色:"nomodeset vga="798" / 24bit色:"nomodeset vga=799"


参考資料: カーネルの起動オプション
http://daiad.webcrow.jp/linux/kernel.html

参考資料: VESA BIOS Extensions - Linux video mode numbers
https://en.wikipedia.org/wiki/VESA_BIOS_Extensions#Linux_video_mode_numbers


※モニターの設定で解像度の変更が必要な場合には、
xorg.confファイルの最低限のディスプレイ設定で出来るかもしれません。

// ファイル編集 /etc/X11/xorg.conf
----------------------------------------

Section "Device"
    Identifier    "Configured Video Device"
    Driver        "vesa"
EndSection

Section "Monitor"
    Identifier    "Configured Monitor"
    
    #DisplaySize   400 300
    DisplaySize   300 225
    #DisplaySize   200 150
    
    # cvt 640 480 60
    # 640x480 59.38 Hz (CVT 0.31M3) hsync: 29.69 kHz; pclk: 23.75 MHz
    #Modeline      "640x480_60.00"   23.75  640 664 720 800  480 483 487 500 -hsync +vsync
    # cvt 1024 768 60
    # 1024x768 59.92 Hz (CVT 0.79M3) hsync: 47.82 kHz; pclk: 63.50 MHz
    #Modeline      "1024x768_60.00"   63.50  1024 1072 1176 1328  768 771 775 798 -hsync +vsync
    # cvt 1600 1200 60
    # 1600x1200 59.87 Hz (CVT 1.92M3) hsync: 74.54 kHz; pclk: 161.00 MHz
    Modeline      "1600x1200_60.00"  161.00  1600 1712 1880 2160  1200 1203 1207 1245 -hsync +vsync
    
    HorizSync     28-76
    VertRefresh   60
EndSection

Section "Screen"
    Identifier    "Default Screen"
    Monitor       "Configured Monitor"
    Device        "Configured Video Device"
    
    #DefaultDepth  24
    DefaultDepth  16
    
    Subsection    "Display"
        Modes     "1024x768" "640x480" "800x600" "1280x1024" "1600x1200"
        Virtual   1600 1200
        Viewport  0 0
    EndSubsection
EndSection

----------------------------------------

大きな解像度の Virtual 1600 1200 などを指定すると Lubuntu 20.04 (SDDM) のログイン画面が
使い辛くなったりしますが、LXQtの「 モニターの設定 」で指定した最大値の範囲内で解像度が選べるようになります。

大きい解像度では正常に表示されない時には Virtual 1600 1200 を表示できる最大解像度に変更してみて下さい。
それでも無理な場合には Driver "vesa" の行をコメントアウトや削除するなどしてvesaドライバーを無効化するか、
追加した全てを削除して、上記カーネルパラメーターのみの "nomodeset vga=791" などの変更で運用してみて下さい。

表示解像度を変更してフォントサイズが小さく変わってしまって調整したい場合には、
 DisplaySize 400 300 を適当な大きさに変更して見て下さい。単位はmmですがモニタや表示解像度の縦横比に合わせて
 DisplaySize 300 225 などに調整してみて下さい。
 
システム環境や使用アプリ等によっては DefaultDepth 16 では正常に起動や描画できない事もあるので、
DefaultDepthの 16 を 24 などに変更するか DefaultDepth の行をコメントアウトや削除してみて下さい。
DefaultDepthを無効化すると上記のカーネルパラメーター vga=791 なども無視されて、
vesaドライバーのデフォルトの値が色深度になるようです。

※この環境では16bit色の方が速いので DefaultDepth 16 にしていますが、
VLCメディアプレーヤーは24bit色では動画表示できても16bit色では正常に表示できませんでした。
しかし、設定でビデオの出力モジュールをX11ビデオ出力(XCB)にしたら16bit色でも正常に動画が表示されました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
OSブート時にfsckを自動実行してファイルシステムをチェック
(含むswapパーテイションやNTFSパーテイション及びNASネットワークドライブのマウント)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

1: fstabによるfsckの自動実行チェックの有効化と無効化

事前準備

NTFSパーテイションやネットワークドライブなどをマウントするには、
先にマウント先のディレクトリ作成 /mnt/NTFS-DISK や /mnt/NAS/192.168.xxx.xxx/disk などが必要です。

cifsでネットワークドライブを使用する前に sudo apt install cifs-utils でインストールする必要があるかもです。

ネットワークドライブのマウントテストの例
sudo mount -t cifs //192.168.xxx.xxx/disk /mnt/NAS/192.168.xxx.xxx/disk -o guest,noperm,vers=1.0,nodfs

ネットワークドライブのマウント先のテスト(マウント出来てなければ 0 だけを返します)
ls -l /mnt/NAS/192.168.xxx.xxx/disk

アンマウントする時 sudo umount /mnt/NAS/192.168.xxx.xxx/disk

これらの設定は、KD21とかいうNASドライブのデフォルトの接続設定の例です。
このNASの場合、SMBプロトコルバージョンの古いバージョン指定( vers=1.0,nodfs )がないと接続が出来ませんでした。

−−−−−

2023年08月30日追記

 

cifsのセキュリティ強化で古い vers=1.0 では「 vers=1.0 is not recommended unless required for access to very old servers 」などとlogに出力されマウントされないように。(sudo dmesg でLog確認)

対策をググってみたところ「 vers=1.0,nodfs 」と nodfs オプションを付けたらエラーを回避できてマウントされました。

−−−−−

また通常は guest アカウントではなく username="xxx",password="xxx" もしくは別の資格情報ファイルを使って
パスワード等の接続情報を記述して、そのファイル名を設定に指定して接続する方法になるかと思います。

※ noperm オプションは、クライアントはパーミッション検査を行わない。
これによりファイルの作成や削除は出来ても内容の変更が出来ないなどの地獄を避ける事が出来る。かもしれない。

参考資料: CIFS 経由で NAS に接続する
https://text.baldanders.info/remark/2019/03/common-internet-file-system/

参考資料: mount.cifs — Common Internet File System (CIFS) を使用したマウント
http://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/mount.cifs.8.html


fstabの設定例

/etc/fstab の設定をテキストエディタで変更する。UUIDの確認が必要な場合は lsblk -f を実行してみて下さい。
----------------------------------------

# <file system>             <mount point>  <type>  <options>  <dump>  <pass>
UUID=96afdb16-873c-4349-8f4d-9c99164c6d65 /              ext4    defaults   0 1
UUID=8caa4737-2c6f-4aa7-af1b-205f864e43d3 swap           swap    defaults   1 2

UUID=78BC9A86BC9A3E96 /mnt/NTFS-DISK                     ntfs    defaults   0 2

//192.168.xxx.xxx/disk /mnt/NAS/192.168.xxx.xxx/disk     cifs    noauto,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=5,guest,noperm,vers=1.0,nodfs   0 0
----------------------------------------

※ネットワークドライブのオプション欄の設定によって、Windowsのネットワークドライブ相当の挙動になります。
OS起動時にNASが無効の時でもエラーにはなりませんが、マウント先のディレクトリにアクセスするとエラーになります。
あとからNASを起動してマウント先のディレクトリにアクセスすると、自動的にネットワークドライブがマウントされます。
詳しい設定内容については参考資料等で確認してみて下さい。他の方法もあるようです。

参考資料: fstab - ArchWiki
https://wiki.archlinux.jp/index.php/Fstab


OSブート時にfsckを自動実行してファイルシステムをチェックする設定は、第6パラメータ<pass>で指定します。

0: fsckのチェックなし
1: ルートファイルシステムのチェック
2: ルートファイルシステム以外のチェック

※swapやNTFSなどは指定しても下記のtune2fsで設定ができないので、自動チェックはなされないかと思います。


2: マウント回数によるfsckの自動実行チェックの設定

tune2fsというコマンドを使ってドライブごとに設定します。

回数を1にして起動時ごとにfsckで自動チェックする。

sudo tune2fs -c 1 /dev/sda2

回数に0か-1を指定するとマウント回数によるfsckの自動チェックは無視(無効化)されます。

現在の設定を確認するにはl(エル)オプションの後に対象デバイスを指定します。

tune2fs -l /dev/sda2

Mount count: 現在のマウント回数
Maximum mount count: fsck自動起動までの最大マウント回数


参考資料: 【Linux】OSブート時のfsck自動実行について
https://ac-as.net/linux-boot-fsck/

参考資料: linux スワップ(swap)領域の作成
https://kazmax.zpp.jp/linux_beginner/mkswap.html

参考資料: Ubuntu日本語フォーラム / NTFSの自動マウント
https://forums.ubuntulinux.jp/viewtopic.php?id=9487


※GRUBのカーネルパラメーター(GRUB_CMDLINE_LINUX_DEFAULT)の
"quiet splash"を削除して"loglevel=6"を追加すると、
起動時にfsckでチェックしている状況が確認できます、かも(汗)。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
日本語入力の設定
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

fcitx mozc のインストール

$ sudo apt-get update
$ sudo apt-get install fcitx-mozc

インストールの途中で確認がありましたら、「Y」で進めてください。
終わったら、ログアウト・ログインを行います。

参考資料: Lubuntu 20.04 LTS…インストールから日本語入力まで!
https://report.hot-cafe.net/lubuntu-2004-lts-10275

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
デスクトップのショートカットのアイコンからアプリやテキストファイルを起動
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

たとえばファイルマネージャーを管理者権限でデスクトップのアイコンから簡単に起動したい場合、
ランチャーからファイルマネージャーのショートカットアイコンをデスクトップへコピーして、
それをテキストエディターで開いて Exec= のある行にターミナルと"-e"オプションとsudoのコマンドを追加します。

Exec=pcmanfm-qt %U

Exec=qterminal -e sudo pcmanfm-qt %U

これでデスクトップのアイコンをクリックすれば簡単に管理者権限のファイルマネージャーが起動します。
ただし、ターミナルのウィンドウも同時に起動してしまいますが(汗)。

シェルスクリプトをキー入力待ちが必要なような対話的にデスクトップから起動したい場合には、

Exec=qterminal -e bash -i /home/ほにゃらら/なんちゃってbat.sh

のように対話型で bash を呼び出してからシェルスクリプトをMS-DOS/Windwosバッチファイルのように起動できます。

この他にも、クイック起動から特定のテキストファイルを開きたい時とか、
一旦、ランチャーからテキストエディターのショートカットアイコンをデスクトップなどにコピーして
そのアイコンをテキストエディターで開いて Exec= のある行に開きたいテキストファイルの場所を追加して、

Exec=featherpad %F

Exec=featherpad /home/ほにゃらら/ドキュメント/メモ帳.txt

このアイコンをクイック起動の所にコピーや移動をすれば、それをワンクリックでテキストファイルが開きます。

などなど、Windowsのショートカットアイコンのように簡単には作れませんが、近い使い方ができます。

※同じアプリのショートカットを複数同じ場所に置く場合には、アイコンのファイル名を変更する必要があります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ROOT権限の取得
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

$ sudo su –

※必ずroot権限からユーザー権限に戻る

# exit

参考資料: Ubuntuでrootの実行権を得るには
http://note.kurodigi.com/post-0-10/

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 
 

※おまけ: NP11VでのLubuntu20.04.3LTSのvesa環境での動作確認

 

 

NP11 : Intel(R) Atom(TM) CPU 230 @ 1.60GHz ( SiS 771/671 PCIE VGA Display Adapter ) / Memory 1GB

OpenGL Renderer    llvmpipe (LLVM 12.0.0, 128 bits)
Version 3.1 Mesa 21.0.3 Direct Rendering:Yes
GPU Drawing:936.61

$ glxinfo | grep "version string"
server glx version string: 1.4
client glx version string: 1.4
OpenGL core profile version string: 4.5 (Core Profile) Mesa 21.0.3
OpenGL core profile shading language version string: 4.50
OpenGL version string: 3.1 Mesa 21.0.3
OpenGL shading language version string: 1.40
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 21.0.3
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

$ glxinfo | grep rendering
direct rendering: Yes

DefaultDepth 16
$ glxgears
485 frames in 5.0 seconds = 96.938 FPS

DefaultDepth 24
$ glxgears
358 frames in 5.0 seconds = 71.543 FPS

 

----------------------------------------

 

サンバーのタイヤをオールシーズン対応の物に変えてみました

ものすごく久々にブログの更新でも。

 

サンバー(3AT/フルタイム4WD)のタイヤが2年ちょっと約5万キロ走行程で

溝はまだまだ残ってるけどゴムの劣化でだいぶヒビ割れしてきたので

ちょっと勿体ないかなとは思ったけど交換する事にしました。

 

せっかくなのでオールシーズン対応という名の畑や田んぼの悪路走行向けの

ごつごつしたタイプの軽トラック用のタイヤにしてみました。

 

Bridgestone バン・小型トラック用タイヤ 604V RD-604 STEEL

http://tire.bridgestone.co.jp/tb/van_lighttruck/604v/index.html

 

ネットで調べたりお店の人に聞いたりで「走行音がうるさい!」

というのが一番多かったのですが、実際に乗ってみたところ

サンバーのエンジン音の方がうるさいので無問題でした(ぐるぐる目)

 

まぁ、確かに走行音は大きくなるので長距離を走ると

耳が疲れるのが早くなる感じなのは確かかもしれませんが

なんとか大丈夫な範囲だとは思います。

 

あと40キロほど近所を走った感じでは・・・

 

エンジンブレーキの効きが良くなった感じがするので下りのカーブとか良い感じ

急加速はあまり良い感じではないけれど、ゆっくりの加速ならば前より良い感じ

燃費はそんなに前と変わるような感じではなさそう

 

なので普段走る速度の時速40~70キロの範囲であれば前の普通の街乗り用のタイヤと

そんなに大きく変わる感じではなさそうです。

 

いろいろ見聞きした感じでは街乗りではマイナスっぽい意見の方が多かったですが

案ずるより産むが易しで実際に扱ってみないと分らないもんだなと思いました。

 

もっとも自分はそんなに飛ばして走る感じではなく

最大トルク4千回転前後位までで抑えるような感じで普段は走ってるので

ゆっくり走る四駆のATサンバーにはちょうど良いのかもって感じです。

 

他に何か気が付いたらまた追記とかするかもしれません(汗)

 

 

追記

 

一番の懸案だった燃費については前と同じ1リッター12.5km前後

を維持できる感じなので助かった(笑)

 

ブレーキの効きは前と比べほんの気持ちちょっとだけ悪いかも

 

D3速から2速などのシフトダウンする時の衝撃がソフトな感じに

(逆のシフトアップはそんな変わらない感じ)

 

やっぱり加速はいまいちって言うか3速の回転数が低い時や

キツい坂道の登りで3速4千回転でもフラフラ状態のような

パワーが足りてない時がちょっと苦手なような感じ

 

逆に平地で3速4千回転で充分にパワーが出てる時は

前よりも加速力があって余裕がある感じなので

ある程度の力量が無いと上手く力が伝わらないのかもだけど

ちゃんと力量が有れば食い付きが良い分だけ力が伝わる感じなので

適切な回転数を維持するようにすれば前よりも走りは良くなる感じだけど

90キロ以上の高速などでパワーが足りなくなる5千回転以上になってしまうと

ちゃんと力が伝わらない状態になっていまいちな感じになってしまうようです

 

・・・ATパワーを入れるかシフトを1速から入れてけば良いのか(ぐるぐる目)

 

坂道の上りや下りのカーブで変な音がしておもしro

 

 

追記2

タイヤの空気圧について

 

交換時には2.5〜2.6になってたようで上記の記事は全てその状態のものです。

 

その後に2.6〜2.7にしてみた所、いまいち高過ぎな感じだったので

2.4〜2.5にしてみたら、ちょうど良い感じになりました。

 

前のタイヤと比べて0.1程度高いような感じかな。

別に2.6前後でも走りや乗り心地は悪くなかったのですが

ゴムの減りが早そうな感じだったので(汗)

 

このタイヤだと自分のサンバーには前輪2.4〜2.5/後輪2.5〜2.6くらいがちょうどよい感じのようです。

 

 

追記3

再度タイヤの空気圧について

 

さらに使い続けてみた結果のタイヤの空気圧は前輪2.6/後輪2.8とちょい高目がよい感じになりました。

たぶん最初の頃は新品のタイヤだったので色々と違和感があったようで

どうも交換時にセットされていた高目の空気圧で問題なかったようです。

 

あと普段給油してるGSさんの複数台ある空気入れの個々の表示の癖もあるので

ちょいと高目に入れるくらいが良い感じです。

 

あと登りの坂道は街乗り用のタイヤと比べて圧倒的にこのゴツいタイヤの方が良いですね。

坂道が多い土地柄なのでもう戻せない(笑)

 

それと遠乗りしてたまたま雪が積もってる所を走る機会があったのですが

やはりこの場合もこのゴツいタイヤの方が全然安心感がありました。

路面が凍ってなければ街乗りタイヤよりも全然よいですね。

 

ただ、燃費は街乗りと比べると少しだけ0.5~1km/リットル分くらい燃費が悪くなりますね(涙)

 

『 Intel 8008 』 と 『 Datapoint 2200 』

i8008はx86命令セットの元になった8ビットCPUのi8080の原型でありZ80の祖先とも言える。
DP2200はプログラム可能なインテリジェント端末で最初期のパソコンの原型でもある。

そしてi8008はDP2200の命令セットをICのシングルチップCPUで実装するために
データポイント社からインテル社に製造を委託されたものが原型である。

しかしi8008の原型のICチップはCPUとしてDP2200には使われなかった・・・

NASAの2人の技術者フィル・レイとガス・ロシュが1968年に創業した
Computer Terminal Corporation は最初の製品であるビデオ表示端末の
Datapoint 3300 を1969年に出荷し生産能力を上回る程の注文を受けた。
後の1973年には社名を製品名と同じ Datapoint Corporation に変更する。

これはテレタイプ端末の ASR-33 などの代替品として紙にデータ印字するのではなく
テレビモニタ画面にデータ表示するタイプのコンピューターターミナルで
33の100倍よい製品として3300と命名されたようだ。

だが顧客からは高価な他の会社の異なる専用端末などに
エミュレートして使える汎用端末を求める声が多く寄せられ
各種端末のエミュレータープログラムを読み込ませて実行できる
小さなコンピューターを開発する事になり
データポイントの技術者のビクター・プアーズとハリー・パイルがDP2200命令セットを設計し
それを半導体メーカーのインテルとT.I.にICのシングルチップのCPUとして
製造を委託する事になった。

しかし先に完成したT.I.のTMC1795は電源仕様に問題があって安定動作が難しく
完成が遅れたインテルの1201もデータポイントが要求した性能に届かず
結局はデータポイントの技術者のゲイリー・アスベルがDP2200命令セットをTTL回路で設計し
ジャック・フラッサニートが筐体デザインをして Datapoint 2200 VersionⅠ として
1970年4月にプロトタイプが完成した。

1971年に製品の出荷が始まったDP2200は想定外の使われ方をされるようになった。
メインメモリが最大8Kバイトしかなく外部記録装置はカセットテープデッキと
オプションのプリンターだけのシステムに顧客はアセンブラモニタを購入し
給与計算や薬価計算などのプログラムを自前で組んで使用するようになった。

しばらくしてD-RAMチップが製造・供給されるようになり、
メモリ周りを改善した Datapoint 2200 VersionⅡ が1972年に開発された。
これによって明らかに性能が劣るインテルの1201はDP2200に使われる事が無くなり
インテルはこれを改良して単独CPUチップの8008として販売する事になった。


参照資料
Datapoint.Org http://www.datapoint.org/
Datapoint Corporation History
http://www.fundinguniverse.com/company-histories/Datapoint-Corporation-Company-History.html
Vic Poor Interview http://www.computerhistory.org/collections/accession/102658337


Datapoint 2200 の仕様 (DATAPOINT 2200 REFERENCE MANUAL VersionⅠ and VersionⅡ より)


システム構成(V1/V2共通)

CRT: 7x3.5インチ・グリーンディスプレイ、80x12行960文字、94キャラクターASCⅡセット
キーボード:41+11+5 フルキーボード
カセットテープデッキ: プロセッサーからコントロール可能な2台を内蔵
電源: AC115V、60Hz、180W

その他のオプション:
RS-232などのコミュニケーションアダプタ6種、プリンタ2種、
リールテープ、2MBリムーバルディスク、80columnカードリーダ


V1:プログラムレジスタ P - 13bit
(最大8,192ワード recirculating MOS shift register drum type memory ※シリアルメモリ)

V2:プログラムレジスタ P - 14bit
(最大16,384ワード random access dynamic MOS memory ※8ビットパラレルメモリ)

V1:プッシュダウンスタック S - ハードウェア15段(※Aug71のマニュアルだと7段)
V2:プッシュダウンスタック S - ハードウェア16段


8bitレジスタ(rシンボル - rs/rd - 機能)
/ V2はαとβのレジスタ・フラグのグループセットを切り替える事が可能

A - 0(000) - アキュームレーターレジスタ
B - 1(001) - 汎用レジスタ
C - 2(010) - 汎用レジスタ
D - 3(011) - 汎用レジスタ
E - 4(100) - 汎用レジスタ
H - 5(101) - メモリデータリファレンスレジスタ(MSP)
L - 6(110) - メモリデータリファレンスレジスタ(LSP)

M - 7(111) - HLレジスタペアで示されるメモリデータレジスタ


コントロールフリップフロップ(fcシンボル - c - 機能)
/ V2はαとβのレジスタ・フラグのグループセットを切り替える事が可能

C - 0(00) - Cf キャリー(ボロー) 演算結果の9桁目にキャリーまたはボローが発生した場合にセット
Z - 1(01) - Zf ゼロ 演算結果が0の場合にセット
S - 2(10) - Sf サイン 演算結果のbit-7(8桁目/MSB)がセット
P - 3(11) - Pf パリティ 演算結果の1になったビット数が偶数個の場合にセット


命令コード MNEMONIC TIMING(V1/V2/参考8008-0.5MHz μsec.)

00 ddd 110 L(rd) imm 16/3.2/32 LOAD IMMEDIATE rd←imm (d=0-6,d=7のMレジスタはX/未定義)
11 ddd sss L(rd)(rs) 16/3.2/20 LOAD rd←rs (s/d=0-6,s/d=0-6,s=d=0はNOPで他s=dは未定義)
11 111 sss LM(rs) 520/4.8/28 LOAD M←rs (s=0-6,s=7のMレジスタはX/HALT)
11 ddd 111 L(rd)M 520/4.8/32 LOAD rd←M (d=0-6,d=7のMレジスタはX/HALT)

00 000 100 AD imm 16/4.8/32 ADD IMMEDIATE A←A+imm
10 000 sss AD(rs) 16/3.2/20 ADD A←A+rs (s=0-6)
10 000 111 ADM 520/4.8/32 ADD A←A+M

00 001 100 AC imm 16/4.8/32 ADD W/CARRY IMM A←A+imm+Cf
10 001 sss AC(rs) 16/3.2/20 ADD W/CARRY A←A+rs+Cf (s=0-6)
10 001 111 ACM 520/4.8/32 ADD W/CARRY A←A+M+Cf

00 010 100 SU imm 16/4.8/32 SUB IMMEDIATE A←A-imm
10 010 sss SU(rs) 16/3.2/20 SUB A←A-rs (s=0-6)
10 010 111 SUM 520/4.8/32 SUB A←A-M

00 011 100 SB imm 16/4.8/32 SUB W/BORROW IMM A←A-imm-Cf
10 011 sss SB(rs) 16/3.2/20 SUB W/BORROW A←A-rs-Cf (s=0-6)
10 011 111 SBM 520/4.8/32 SUB W/BORROW A←A-M-Cf

00 100 100 ND imm 16/4.8/32 AND IMMEDIATE A←A∧imm
10 100 sss ND(rs) 16/3.2/20 AND A←A∧rs (s=0-6)
10 100 111 NDM 520/4.8/32 AND A←A∧M

00 101 100 XR imm 16/4.8/32 EX-OR IMMEDIATE A←A≠imm
10 101 sss XR(rs) 16/3.2/20 EX-OR A←A≠rs (s=0-6)
10 101 111 XRM 520/4.8/32 EX-OR A←A≠M

00 110 100 OR imm 16/4.8/32 OR IMMEDIATE A←A∨imm
10 110 sss OR(rs) 16/3.2/20 OR A←A∨rs (s=0-6)
10 110 111 ORM 520/4.8/32 OR A←A∨M

00 111 100 CP imm 16/4.8/32 COMPARE IMMEDIATE A-imm
10 111 sss CP(rs) 16/3.2/20 COMPARE A-rs (s=0-6)
10 111 111 CPM 520/4.8/32 COMPARE A-M

01 000 100 JMP lsp msp ※/6.4/44 JUMP P←(msp,lsp) ※Variable
01 0cc 000 JF(c) lsp msp ※/6.4/44 JUMP IF fc=FALSE P←(msp,lsp) ※Variable
24/4.8/36 Otherwise P←P+3
01 1cc 000 JT(c) lsp msp ※/6.4/44 JUMP IF fc=TRUE P←(msp,lsp) ※Variable
24/4.8/36 Otherwise P←P+3

01 000 110 CALL lsp msp ※/6.4/44 SUBROUTINE CALL S←P+3, P←(msp,lsp) ※Variable
01 0cc 010 CF(c) lsp msp ※/6.4/44 S-CALL IF fc=FALSE S←P+3,P←(msp,lsp) ※Variable
24/4.8/36 Otherwise P←P+3
01 1cc 010 CT(c) lsp msp ※/6.4/44 S-CALL IF fc=TRUE S←P+3,P←(msp,lsp) ※Variable
24/4.8/36 Otherwise P←P+3

00 000 111 RETURN / RET ※/3.2/20 SUBROUTINE RETURN P←S ※Variable
00 0cc 011 RF(c) ※/3.2/20 SUBROUTINE RETURN IF fc=FALSE P←S ※Variable
16/3.2/12 Otherwise P←P+1
00 1cc 011 RT(c) ※/3.2/20 SUBROUTINE RETURN IF fc=TRUE P←S ※Variable
16/3.2/12 Otherwise P←P+1

00 000 010 SLC 16/3.2/20 SHIFT LEFT CIRCULAR
Cf←A7,Am+1←Am,A0←A7 (m=6-0)
00 001 010 SRC 16/3.2/20 SHIFT RIGHT CIRCULAR
A0→A7,Am→Am-1,A0→Cf (m=7-1)

11 000 000 NOP 16/3.2/20 NO OPERATION

00 000 000 HALT ??/??/16 HALT (operation resumes at P+1)
00 000 001
11 111 111

01 000 001 INPUT / IN 16/9.6/32 INPUT A←(I/O Bus)
01 xxxxx 1 EX (exp) 16/9.6/24 EXTERNAL COMMAND
01 01000 1 EX ADR C-NUMBER 1 Address
01 01001 1 EX STATUS C-NUMBER 2 Sense Status
01 01010 1 EX DATA C-NUMBER 3 Sense Data
01 01011 1 EX WRITE C-NUMBER 4 Write Strobe
01 01100 1 EX COM1 C-NUMBER 5 Command 1
01 01101 1 EX COM2 C-NUMBER 6 Command 2
01 01110 1 EX COM3 C-NUMBER 7 Command 3
01 01111 1 EX COM4 C-NUMBER 8 Command 4
01 10000 1 (Unassigned) C-NUMBER 9
01 10001 1 (Unassigned) C-NUMBER 10
01 10010 1 (Unassigned) C-NUMBER 11
01 10011 1 (Unassigned) C-NUMBER 12
01 10100 1 EX BEEP C-NUMBER 13 Beep
01 10101 1 EX CLICK C-NUMBER 14 Click
01 10110 1 EX DECK1 C-NUMBER 15 Select Deck 1
01 10111 1 EX DECK2 C-NUMBER 16 Select Deck 2
01 11000 1 EX RBK C-NUMBER 17 Read Block
01 11001 1 EX WBK C-NUMBER 18 Write Block
01 11010 1 (Unassigned) C-NUMBER 19
01 11011 1 EX BSP C-NUMBER 20 Backspace One Block
01 11100 1 EX SF C-NUMBER 21 Slew Forward
01 11101 1 EX SB C-NUMBER 22 Slew Backward
01 11110 1 EX REWIND C-NUMBER 23 Rewind
01 11111 1 EX TSTOP C-NUMBER 24 Stop Tape

※※※ i8008で拡張されたもの
00 111 110 LMI imm --/--/36 LOAD DATA IMMEDIATE M←imm
00 ddd 000 IN(rd) --/--/20 INCREMENT INDEX REGISTER (rd)←(rd)+1 (d=1-6,A及びMレジスタは不可×,Cfは不変)
00 ddd 001 DC(rd) --/--/20 DECREMENT INDEX REGISTER (rd)←(rd)-1 (d=1-6,A及びMレジスタは不可×,Cfは不変)
00 010 010 RAL --/--/20 ROTATE left through carry
Cf←A7,Am+1←Am,A0←Cf (m=6-0)
00 011 010 RAR --/--/20 ROTATE right through carry
Cf→A7,Am→Am-1,A0→Cf (m=7-1)
00 AAA 101 RST --/--/20 RESTART S←P,P←(00000000 00AAA000)
01 00M MM1 INP --/--/32 INPUT A←(Input data line) (MMM=device number)
01 RRM MM1 OUT --/--/24 OUTPUT (output data line)←A (RRMMM=device number,RR=00は×/INP)

※※※ V2で拡張されたもの
00 010 000 BETA --/3.2/-- SELECT β MODE βグループのレジスタ・フラグに切り替え
00 011 000 ALPHA --/3.2/-- SELECT α MODE αグループのレジスタ・フラグに切り替え
00 100 000 DI --/3.2/-- DISABLE INTERRUPTS
00 101 000 EI --/3.2/-- ENABLE INTERRUPTS
00 110 000 POP --/4.8/-- POP H(msp),L(lsp)←S
00 111 000 PUSH --/3.2/-- PUSH S←H(msp),L(lsp)

-----------------------------------------

なんで、このような日記と言うか備忘録みたいな何かを書いたのかと言うと
2年ほど前にmixiのコミュで
「8080互換ワイヤードロジックのTTL組立ボードキットMYCPU80を販売」
の記事を見つけ、販売元の中日電工さん http://www.alles.or.jp/~thisida/index.htm
の連載製作記事を毎日のように読むようになりました。
今現在(2012/6/1)はCP/M-80を動作させてみたり、
なんとCP/M互換オリジナルDOSまで話しが進んでいます。

(ちなみにMYCPU80は 2MHz動作 MVI A, imm( LA imm ) 3μs なので、
V1の16μsの5倍以上、V2の3.2μsよりちょっと速いようです。)

それで連載記事の勉強のために 8080のwiki http://ja.wikipedia.org/wiki/Intel_8080
半導体コレクション展示会場さん http://www.st.rim.or.jp/~nkomatsu/ICcollection.html
のページなども読むようになり
その過程で 8008 Home Page さん http://www.mars.dti.ne.jp/~mark08/index.html のページを見つけ
「では 8080 の元祖の 8008 とは?」と
8008のwiki http://ja.wikipedia.org/wiki/Intel_8008 を調べると
Datapoint2200のwiki http://ja.wikipedia.org/wiki/Datapoint_2200 に辿り着きました。

最初は「へーそうなんだ」程度で終わってしまったのですが、
何度か8080や8008の事を調べている内に8008にはINA/DCAが無いのに気付き、
そのうち命令セット自体がなにか不自然なような気がしてきたのです。
それで「元もとのDP2200って、どうなのよ?」って事で、Datapoint2200のwikiから調べ直して
Datapoint documentation http://bitsavers.org/pdf/datapoint/ から
Datapoint2200のマニュアルをDLしてみたらINA/DCAが無いどころか、
そもそもインクリメント/デクリメントの命令すら無かったのでした。
さらに調べると割込みに便利なRST命令も無いし、
RAL/RAR命令やMレジスタに即値を入れるLMIも無い事が分かりました。

Z80から遡るとこんなにシンプルになってしまうのかと、
それと同時にDP2200のV1用に書かれたアセンブラなら
固有のハードウェアに強く依存するIN/OUT命令以外は
簡単な変換だけでZ80やx86でも動いてしまう事にも驚きました。

と言う事で、DP2200のマニュアル(凄く判りやすい!)のOSソースリストの一番最後の方にあった
データ転送プログラムをちょこっと変更してZ80アセンブラと併記してみました。
転送元アドレスHLから転送先アドレスDEにCレジスタの1バイト指定1~256文字分の
データを転送する簡単なプログラムです。

★ちゃんと動くかどうかは知りませんよ、適当に書いただけだから、あしからず、不悪。★


2200だ: LC 転送バイト数 ( LD C, 転送バイト数 )
8008も: LD 転送先MSP ( LD D, 転送先MSP )
LE 転送先LSP ( LD E, 転送先LSP )
LH 転送元MSP ( LD H, 転送元MSP )
LL 転送元LSP ( LD L, 転送元LSP )

MEMMOV: LBM ( LD B, (HL) ) ; Bに転送元データを保存
LAL ( LD A, L ) ;┐
AD 1 ( ADD A, 1 ) ;│転送元LSPのLをインクリメント(+1)して ──┐
LLE ( LD L, E ) ;│EとLを交換 │HLをインクリメント(+1)して
LEA ( LD E, A ) ;┘ │HL転送先/DE転送元に交換
LAH ( LD A, H ) ;┐転送元MSPのHを │転送元のアドレスが+1に
AC 0 ( ADC A, 0 ) ;│L+1した時のCfでインクリメント(0+Cf)して┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘

LMB ( LD (HL), B ) ; 転送先アドレスにBの転送元データを入れる
LAL ( LD A, L ) ;┐
AD 1 ( ADD A, 1 ) ;│転送先LSPのLをインクリメント(+1)して ──┐
LLE ( LD L, E ) ;│EとLを交換 │HLをインクリメント(+1)して
LEA ( LD E, A ) ;┘ │HL転送元/DE転送先に交換
LAH ( LD A, H ) ;┐転送先MSPのHを │転送先のアドレスが+1に
AC 0 ( ADC A, 0 ) ;│L+1した時のCfでインクリメント(0+Cf)して┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘

LAC ( LD A, C ) ;┐
SU 1 ( SUB 1 ) ;│転送バイト数のCをデクリメント(-1)
LCA ( LD C, A ) ;┘
JFZ MEMMOV ( JP NZ, MEMMOV ) ; 転送バイト数が0以外ならば繰り返す
終了: RET ( RET ) ; おしまい


ちなみに8080(Z80)で同じものを書くと2バイトのINX/DCR命令と
(HL)以外のメモリロード命令のおかげでかなり短くなります。
Z80以降のブロック転送命令ならば転送バイト数をBCの2バイト指定にして
MEMMOV: LDIR などのように1行にする事も出来ます。


8080だ: MVI C, 転送バイト数 ( LD C, 転送バイト数 )
LXI D, 転送先 ( LD DE, 転送先 )
LXI H, 転送元 ( LD HL, 転送元 )

MEMMOV: MOV A, M ( LD A, (HL) ) ; Aに転送元データを保存
STAX DE ( LD (DE), A ) ; 転送先アドレスにAの転送元データを入れる
INX H ( INC HL ) ; 転送元HLをインクリメント(+1)
INX D ( INC DE ) ; 転送先DEをインクリメント(+1)
DCR C ( DEC C ) ; 転送バイト数Cをデクリメント(-1)
JNZ MEMMOV ( JP NZ, MEMMOV ) ; 転送バイト数が0以外ならば繰り返す
終了: RET ( RET ) ; おしまい


参考までに2バイト指定(1~65536)のプログラムも作ってみましたが・・・
8008/DP2200はメモリロード命令が(HL)経由だけなので
レジスタ不足になって悲惨な事になってます(涙)。
・・・(DE)のメモリ転送命令が有る無しだけで、だいぶ利便性が異なりますね…orz.

実はこっちの方を先に作ったんですが、あまりに判りにくいので・・・なので、あくまで参考と言う事で(汗)
・・・あと、繰り返しますが、ちゃんと動くかどうかは知りませんよ、適当に書いただけだから、あしからず、不悪。


Z80だ: LD BC, 転送バイト数
LD DE, 転送先
LD HL, 転送元
MEMMOV: LDIR ; ブロック転送命令
終了: RET ; おしまい


それを8080(Z80)で書く


8080だ: LXI B, 転送バイト数 ( LD BC, 転送バイト数 )
LXI D, 転送先 ( LD DE, 転送先 )
LXI H, 転送元 ( LD HL, 転送元 )

MEMMOV: MOV A, M ( LD A, (HL) ) ; Aに転送元データを保存
STAX DE ( LD (DE), A ) ; 転送先アドレスにAの転送元データを入れる
INX H ( INC HL ) ; 転送元HLをインクリメント(+1)
INX D ( INC DE ) ; 転送先DEをインクリメント(+1)
DCX B ( DEC BC ) ; 転送バイト数BCをデクリメント(-1)/DCXではフラグが変化しないので
MOV A, B ( LD A, B ) ; AにBをいれ
ORA C ( OR C ) ; AとCの論理和をとる(両方とも0の時だけ結果が0になる)
JNZ MEMMOV ( JP NZ, MEMMOV ) ; 0でなければ繰り返す
終了: RET ( RET ) ; おしまい


それをDP2200(Z80)で書く

※Mレジスタ(HL)経由以外のメモリ転送が出来ないため、レジスタ不足で転送先のアドレスを一時的な作業領域にしています。

※そのため、このプログラムだけ転送先と転送元の初期保存レジスタを他のプログラムと逆にしています。


2200だ: LB 転送バイト数MSP ( LD B, 転送バイト数MSP )
8008も: LC 転送バイト数LSP ( LD C, 転送バイト数LSP )
LD 転送元MSP ( LD D, 転送元MSP )
LE 転送元LSP ( LD E, 転送元LSP )
LH 転送先MSP ( LD H, 転送先MSP )
LL 転送先LSP ( LD L, 転送先LSP )

MEMMOV: LMB ( LD (HL), B ) ; レジスタが足りないので転送先HLにBの転送バイト数MSPを保存
LAL ( LD A, L ) ;┐
LLE ( LD L, E ) ;│EとLを交換 ┐
LEA ( LD E, A ) ;┘ │HL転送元/DE転送先に交換
LAH ( LD A, H ) ;┐ ┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘

LBM ( LD B, (HL) ) ; レジスタが足りないのでBに転送元HLのデータを保存
LAL ( LD A, L ) ;┐
AD 1 ( ADD A, 1 ) ;│転送元LSPのLをインクリメント(+1)して ─┐
LLE ( LD L, E ) ;│EとLを交換 │HLをインクリメント(+1)して
LEA ( LD E, A ) ;┘ │HL転送先/DE転送元に交換
LAH ( LD A, H ) ;┐転送元MSPのHを │転送元のアドレスが+1に
AC 0 ( ADC A, 0 ) ;│L+1した時のCfでインクリメント(0+Cf)して┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘

LAM ( LD A, (HL) ) ; レジスタが足りないのでAに転送先HLに保存してあった転送バイト数MSPを保存
LMB ( LD (HL), B ) ; 転送先HLにBに保存してあった転送元のデータを入れる
LBA ( LD B, A ) ; Aに保存してあった転送バイト数MSPをもとのBに戻す
LAL ( LD A, L ) ;┐ ┐
AD 1 ( ADD A, 1 ) ;│転送先LSPのLをインクリメント(+1) │転送先HLをインクリメント(+1)
LLA ( LD L, A ) ;┘ │ INR L ┐8008以降ならば
LAH ( LD A, H ) ;┐転送先MSPのHを │ JNZ NIRH │置換え可能
AC 0 ( ADC A, 0 ) ;│L+1した時のCfでインクリメント(0+Cf)│ INR H │3バイトほど
LHA ( LD H, A ) ;┘ ┘NIRH: 次の処理 ┘節約出来ます

LAC ( LD A, C ) ;┐転送バイト数LSPのCを
SU 1 ( SUB 1 ) ;│デクリメント(-1) ┐
LCA ( LD C, A ) ;┘ │転送バイト数のBCをデクリメント(-1)
LAB ( LD A, B ) ;┐転送バイト数MSPのBを ┘
SB 0 ( SBC 0 ) ;│C-1した時のCfでデクリメント(0-Cf)
LBA ( LD B, A ) ;┘
ORC ( OR C ) ; AとCの論理和をとる(両方とも0の時だけ結果が0になる)
JFZ MEMMOV ( JP NZ, MEMMOV ) ; 0でなければ繰り返す
終了: RET ( RET ) ; おしまい


むー・・・これだとメモリへの読み書きの回数が2倍になるから、
速度も2倍遅くなるので…別パターンのプログラムを・・・

※レジスタ不足のため、BC>=0100Hの場合はCまた256バイト先の転送先アドレスを一時的な作業領域にしています。



2200だ: LB 転送バイト数MSP ( LD B, 転送バイト数MSP )
8008も: LC 転送バイト数LSP ( LD C, 転送バイト数LSP )
LD 転送先MSP ( LD D, 転送先MSP )
LE 転送先LSP ( LD E, 転送先LSP )
LH 転送元MSP ( LD H, 転送元MSP )
LL 転送元LSP ( LD L, 転送元LSP )

LAC ( LD A, C ) ; AにCを入れ ┐ほぼ自爆するので
ORB ( OR B ) ; AとBの論理和をとる(両方とも0の時だけ結果が0になる)│要らないと言えば
JTZ MSTART ( JP Z, MSTART ) ; 転送バイト数BCが0だったら最終判断をスキップする ┘要らないのですが

LAB ( LD A, B ) ; AにBを入れ
ORB ( OR B ) ; AとBの論理和をとる(両方とも0の時だけ結果が0になる)
JTZ MEMMOV ( JP Z, MEMMOV ) ; 転送バイト数MSPのBが0だったら最後の転送処理にジャンプ

MSTART: CALL SWDEHL ( CALL SWDEHL ) ; HL転送先/DE転送元に交換

LAC ( LD A, C ) ; AにCを入れ
ORC ( OR C ) ; AとCの論理和をとる(両方とも0の時だけ結果が0になる)
JTZ CALMMV ( JP Z, CALMMV ) ; 転送バイト数LSPのCが0だったら2バイト指定転送ループの最初にジャンプ

LAL ( LD A, L ) ;┐
ADC ( ADD A, C ) ;│転送先LSPのLに転送バイト数LSPのCを加算 ┐
LLA ( LD L, A ) ;┘ │転送先HLを+Cにする
LAH ( LD A, H ) ;┐ ┘
AC 0 ( ADC A, 0 ) ;│転送先MSPのHを0+Cfを加算
LHA ( LD H, A ) ;┘
LMB ( LD (HL), B ) ; レジスタが足りないのでCバイト先の転送先HLにBの転送バイト数MSPを保存
LAL ( LD A, L ) ;┐
SUC ( SUB C ) ;│転送先LSPのLから転送バイト数LSPのCを減算 ┐
LLA ( LD L, A ) ;┘ │転送先HLを-Cにする
LAH ( LD A, H ) ;┐ ┘
SB 0 ( SBC 0 ) ;│転送先MSPのHから0-Cfを減算
LHA ( LD H, A ) ;┘
JMP CA2MMV ( JP CA2MMV ) ; 2バイト指定転送ループの途中にジャンプ

CALMMV: LAH ( LD A, H ) ;┐
AD 1 ( ADD A, 1 ) ;│転送先MSPのHを+1して転送先HLを+256にする
LHA ( LD H, A ) ;┘
LMB ( LD (HL), B ) ; レジスタが足りないので256バイト先の転送先HLにBの転送バイト数MSPを保存
LAH ( LD A, H ) ;┐
SU 1 ( SUB 1 ) ;│転送先MSPのHから-1して転送先HLを-256にする
LHA ( LD H, A ) ;┘

CA2MMV: CALL SWDEHL ( CALL SWDEHL ) ; HL転送元/DE転送先に交換
CALL MEMMOV ( CALL MEMMOV ) ; 転送数1バイト指定のサブルーチンの呼び出し

CALL SWDEHL ( CALL SWDEHL ) ; HL転送先/DE転送元に交換
LAM ( LD A, M ) ; AにCまた256バイト先の転送先HLに保存してあった転送バイト数MSPを入れる
SU 1 ( SUB 1 ) ; Aの転送バイト数MSPをデクリメント(-1)
LBA ( LD B, A ) ; BにAの転送バイト数MSPを戻す
JFZ CALMMV ( JP NZ, CALMMV ) ; 転送バイト数MSPが0以外だったら2バイト指定数の転送を繰り返す
CALL SWDEHL ( CALL SWDEHL ) ; HL転送元/DE転送先に交換

MEMMOV: LBM ( LD B, (HL) ) ; Bに転送元データを保存
CALL SIDEHL ( CALL SIDEHL ) ; HL転送元アドレスをインクリメント(+1)してHL転送先/DE転送元に交換

LMB ( LD (HL), B ) ; 転送先アドレスに転送元データのBを入れる
CALL SIDEHL ( CALL SIDEHL ) ; HL転送先アドレスをインクリメント(+1)してHL転送元/DE転送先に交換

LAC ( LD A, C ) ;┐
SU 1 ( SUB 1 ) ;│転送バイト数LSPのCをデクリメント(-1)
LCA ( LD C, A ) ;┘
JFZ MEMMOV ( JP NZ, MEMMOV ) ; 転送バイト数LSPが0以外ならば1バイト指定数の転送を繰り返す
終了: RET ( RET ) ; おしまい

SIDEHL: LAL ( LD A, L ) ;┐
AD 1 ( ADD A, 1 ) ;│Lをインクリメント(+1)して ───────────┐
LLE ( LD L, E ) ;│EとLを交換 │HLをインクリメント(+1)して
LEA ( LD E, A ) ;┘ │DEとHLの内容を交換
LAH ( LD A, H ) ;┐Hを │
AC 0 ( ADC A, 0 ) ;│L+1した時のCfでインクリメント(0+Cf)して┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘
終了: RET ( RET ) ; おしまい

SWDEHL: LAL ( LD A, L ) ;┐
LLE ( LD L, E ) ;│EとLを交換 ┐
LEA ( LD E, A ) ;┘ │DEとHLの内容を交換
LAH ( LD A, H ) ;┐ ┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘
終了: RET ( RET ) ; おしまい


・・・速度は改善されるけどプログラムが長くなって複雑に…orz.
あと特定のワークメモリにレジスタの値を退避する方法もあると思うけど、
たぶん同じくらい長くなるんじゃないかな・・・
下のV2の例のPUSH/POPの代わりに保存/退避用のプログラムを追加する感じかな…
最初の初期設定のPUSH部分相当が面倒そうだけど…
転送先アドレスにC、AにB、BCにHLを退避し、ワークメモリBにAを入れ、
HLにBCを戻し、Cに転送先の値を戻せば初期設定はOKかな?
後のループのPOP/PUSH部分の代わりは、AにC、BCにHLを退避し、
ワークメモリCにAを入れて転送バイト数LSPを保存して、
それからAにワークメモリBの値を入れ、転送バイト数MSPをデクリメント判定し、
ワークメモリBにその値を戻して、
Aに転送バイト数LSPを保存していたワークメモリCの値を入れて、
HLにBC、CにAの退避していた値を戻す・・・
みたいな感じでいいのかな?…いずれにしても凄く面倒ですね・・・


V2ならば転送バイト数MSPをスタックに退避させてデクリメント判定/再保存できるので、
だいぶ簡単に…


DP22V2: LB 転送バイト数MSP ( LD B, 転送バイト数MSP )
LC 転送バイト数LSP ( LD C, 転送バイト数LSP )
LD 転送先MSP ( LD D, 転送先MSP )
LE 転送先LSP ( LD E, 転送先LSP )
LH 転送元MSP ( LD H, 転送元MSP )
LL 転送元LSP ( LD L, 転送元LSP )

LAH ( LD A, H ) ;┐
LHB ( LD H, B ) ;│スタックのHにBの転送バイト数MSPを保存
CALMMV: PUSH ( PUSH HL ) ;│(スタックのLは無視)
LHA ( LD H, A ) ;┘

CALL MEMMOV ( CALL MEMMOV ) ; 転送数1バイト指定のサブルーチンの呼び出し

LBH ( LD B, H ) ; BにHの転送元MSPを退避
LAL ( LD A, L ) ; AにLの転送元LSPを退避
POP ( POP HL ) ; Hにスタックに保存していた転送バイト数MSPを入れる
LLA ( LD L, A ) ; LにAの転送元LSPを戻す
LAH ( LD A, H ) ; AにHの転送バイト数MSPを入れる
SU 1 ( SUB 1 ) ; Aの転送バイト数MSPをデクリメント(-1)
LHA ( LD H, A ) ; HにAの転送バイト数MSPを入れる
LAB ( LD A, B ) ; AにBの転送元MSPを入れる
JFZ CALMMV ( JP NZ, CALMMV ) ; 転送バイト数MSPが0以外だったら2バイト指定数の転送を繰り返す
LHA ( LD H, A ) ; HにAの転送元MSPを入れる

MEMMOV: LBM ( LD B, (HL) ) ; Bに転送元データを保存
CALL SIDEHL ( CALL SIDEHL ) ; HL転送元アドレスをインクリメント(+1)してHL転送先/DE転送元に交換

LMB ( LD (HL), B ) ; 転送先アドレスに転送元データのBを入れる
CALL SIDEHL ( CALL SIDEHL ) ; HL転送先アドレスをインクリメント(+1)してHL転送元/DE転送先に交換

LAC ( LD A, C ) ;┐
SU 1 ( SUB 1 ) ;│転送バイト数LSPのCをデクリメント(-1)
LCA ( LD C, A ) ;┘
JFZ MEMMOV ( JP NZ, MEMMOV ) ; 転送バイト数LSPが0以外ならば1バイト指定数の転送を繰り返す
終了: RET ( RET ) ; おしまい

SIDEHL: LAL ( LD A, L ) ;┐
AD 1 ( ADD A, 1 ) ;│Lをインクリメント(+1)して ───────────┐
LLE ( LD L, E ) ;│EとLを交換 │HLをインクリメント(+1)して
LEA ( LD E, A ) ;┘ │DEとHLの内容を交換
LAH ( LD A, H ) ;┐Hを │
AC 0 ( ADC A, 0 ) ;│L+1した時のCfでインクリメント(0+Cf)して┘
LHD ( LD H, D ) ;│DとHを交換
LDA ( LD D, A ) ;┘
終了: RET ( RET ) ; おしまい


・・・大事な事なので繰り返しますが、ちゃんと動くかどうかは知りませんよ、
適当に書いただけだから、あしからず、不悪。

☆元々の下書きのファイルからアメブロに書き込む時に、かなり余白とか見栄えを直してますので
間違っておかしくなってしまった所が、もしかしたらあるかもです。

-----------------------------------------

っえ!?もうブログのタイトル画像のリオちゃんや熊女将たちと全く関係ない話しだって?
そんな事はないですよ。
日本最初のパチスロ機にはZ80が使われていて、その販売に関わっていたのはネットさんですから、
遠いご先祖様のお話という事で。

コミケ80 NET SLOT LIVE!!「第3回 全日本パチスロ選手権大会」

NETさん主催のパチスロイベントに最終日だけですが参戦してきました。


$Shimanetのブログ-【第3回 全日本パチスロ選手権大会】


夏コミは暑過ぎるので敬遠してたんですが、今回は最終日だけでも行く事にしました。


とにかく暑い中の待機列だけは避けたかったので11時半過ぎにビックサイトに着くようにしました。
せっかくなのでRio絵師こうたろさんのにじいろ桜と風虎通信さんの「宇宙の傑作機No.16 プロトンロケット」
その他にpixivとかで気になった絵師さんの所などやミリタリー系の所をブラブラと廻って買い物を先に。
(じゃないと売り切れちゃう…)


1時間程で買い物は終了しNETさんのブースへ行こうとしたら西4Fまでの道のり特に階段が渋滞。
皆さん考える事は一緒のようで企業ブースへはお買い物の後回しのようで・・・


まぁ何とか1時半頃には NET SLOT LIVE!!「第3回 全日本パチスロ選手権大会」 会場に到着。
・・・大仰なタイトルですが熊酒場…じゃなかったNETさんによる単独スロットメーカーのローカルイベントです(大汗


さっそくRioグッズを購入しチャレンジ!!
イベント用のRioSpaは1/40でビックボーナスが出る特別仕様機なのですが、
5台だけでも引き強/引き弱の違いが台毎に出てました。
ちなみに1/40でも出ない時は出ないので時間切れで勝者無しなんて事もあります。


1回目のチャレンジは買い物が終わった後の並び順が悪くて、
対戦5人の最後になってしまったので良い台を選べず敗退www
だけど2回目のチャレンジで2番目に引きが強い台で打てる事になりボーナス早引き成功!!
ボーナス早引きの勝者は次の対戦にグッズ購入無しで再挑戦できるようになっていたので、
しかも最初に好きな台を選べるので、引きが一番強い台で再チャレンジしたら連勝する事が出来ました(嬉


第1回開催の時のスロットはゼットゴールドEXだったのでビックが揃う時は爆速だったのですが
今回のリオスパは爆速で揃う事は滅多に無く、リーチが来てもボーナスナビがあるので
慌てて打ってもしょうがないのですが、焦ってしまって中々揃えられず苦労しましたよ。
・・・後ろでゲストMCさんミントのラムネさん達にいろいろ言われたり励まされたりで(笑


それから勝者特典の再挑戦で3連勝目を狙ったのですが遭えなく敗退。
更に300円のHA2携帯クリーナーを買い物して引き続きチャレンジするも、またもや敗退。


・・・で、ちょっとNETさんのブースを離れてTakakoさんのブログで紹介された所に移動。
そうしたら2009/04/11の池袋の5円玉ライブの主催者の方と遭遇。
東北の方で311の津波で被災されたそうですが御無事でなによりでした。


それから水分補給して再度NETさんのブースに向かうと、
Takakoさんのライブで知り合った激熱2仲間のujiさんと遭遇して暫し談笑。
その後に4回目の早引きのチャレンジをしましたが敗退。
結局4戦1連勝3敗(でいいのかな?)の成績で、時間と混雑具合を鑑みてチャレンジ終了。


だけど微妙に時間が中途半端だったので、他の企業ブースを見て廻る事にしたのですが・・・
BLACK・LAGOONの木製葉巻入れを何故か衝動買い。しかも2種類あったので1個づつで2個!!
リオスパ湯あがり扇子を仕舞うのにちょうどいいかと思ったんだけど、
家に帰ってから試してみたら…ギリ入らねぇでやんの!!・・・終わった。




ファイナルステージで勝利した瞬間にガッツポーズをとる大会常連勝者のイチローさん

Shimanetのブログ-ファイナル戦で勝利した大会常連勝者のイチローさん

Shimanetのブログ-ティファニーの本日最多ボーナス王者の掲示板

コミケ終了間際に記念撮影

$Shimanetのブログ-終了間際に撮影中のRioアカネさんとMintラムネさん

Shimanetのブログ-ボーナス早引き上位成績者の人達の記念撮影