2026-08-23

FreeBSD 15.1-RELEASEの無線LAN設定

Let's note CF-SV8RDCVSにFreeBSD/amd64 15.1-RELEASEをインストールしました。インストール中は有線でネットワークに繋ぎました。今後デスクトップ環境を入れていくつもりですが、その前に無線LANの設定を済ませておこうと思います。

 

『FreeBSD Handbook』では「7.4. Wireless Networks」として設定手順が説明されています。それに従って作業すると、次のようになります。

  1. 接続先となるSSIDとPSKを入手しておきます。
  2. 「/etc/wpa_supplicant.conf」を作成します。ひな形が示されているので、そこに入手したSSIDなどの情報を入れます。
  3. 「/etc/rc.conf」に無線LANの情報を追加します。これも示された手順のとおりです。ただし設定ファイルを直接編集せずに、「sysrc」というコマンドを使っているのを初めて知りました。
  4. 以上で設定が済んだので「service netif restart」とすれば、繋がるはずです。

 

ところが繋がりませんでした。これまではdynabook SS SX/15AのNetBSD/i386で接続できていたので、何が違うのか確認してみました。私の自宅ではステルスSSIDとしていたため、「network」の設定の中に「scan_ssid=1」を入れておく必要があるようです。これを追加したら、繋がるようになりました。しかしGeminiと相談した結果、ステルスSSIDはセキュリティ的に望ましくないという意見だったので、ステルスSSIDを止めて公開設定に変更しました。そうなると「scan_ssid=1」は不要です。

 

さらに「/etc/rc.conf」に「create_args_wlan0="country JP regdomain JAPAN"」という設定も追加しました。『FreeBSD Handbook』が英語版であるからなのか、日本特有の設定については記述がありません。これもまたGeminiとの相談の結果ですが、この設定は必須とのことでしたので、追加しました。

 

以上で無線LANが使えるようになりました。若干トラブルがありましたが、とても簡単でした。 

2026-08-21

「FreeBSD-15.1-RELEASE-amd64-memstick.img」に入っているのは「PkgBase」

最近入手したLet's note CF-SV8 RDCVSにFreeBSD/amd64 15.1-RELEASEをインストールしてみました。公式サイトから「FreeBSD-15.1-RELEASE-amd64-memstick.img」を入手し、RufusでUSBメモリに書き込みます。ハンドブックの「2.3.1. Prepare the Installation Media」に「-memstick.img: This file contains all of the files needed to install FreeBSD, its source, and the Ports Collection. 」と書かれているように、インストールに必要なファイルは全て入っています。つまりインストール中にネットワークアクセスは必要ありません。もし「-bootonly.iso」や「-mini-memstick.img」を使うと、必要なファイルをネットワーク越しに取得することになります。

 

インストール中の選択肢に「Select Installation Type」があります。これまでのFreeBSDで使われてきた「Distribution Sets」か、FreeBSD 16からデフォルトになると言われている「Packages (Tech Preview)」のどちらを使うか選ばなければなりません。PkgBaseがデフォルトになるのは次のバージョンからですので、今回は「Distribution Sets」でインストールしようと考えました。ところが、ネットワークへのアクセスは不要なはずなのに、ネットワークからファイルを取得しようとするのです。

 

ネットワークに接続せずにインストールを完了させたかったので、ネットワークへのアクセスが発生すると困ります。ここで気づきましたが、「-memstick.img」にはインストールに必要なファイルが全て入っているとは言っても、「Distribution Sets」と「Packages」の双方が入っているわけではないようです。入っているのは「Packages」の方だけで、「Distribution Sets」を選んでしまうと、ネットワーク越しに取得しにいくのでしょう。

 

案の定、「Packages (Tech Preview)」を選択したら、ネットワークへのアクセスする事なく、インストールが完了しました。インストール完了後に改めて起動させたところ、Let's note CF-SV8RDCVSでFreeBSD/amd64 15.1-RELEASEが無事に起動しました。 

2026-08-19

「LBUF EQU VTOP+0037H」が0036Hではない謎

共立出版の『マイクロコンピュータのプログラミング』に掲載された東大版Palo Alto Tiny BASICについて調査しています。アセンブラで書かれたプログラムの先頭では、以下のようにメモリ配置が定義されています。

;  MEMORY MAP
ITOP   EQU   0000H
ISIZE  EQU   0800H
LTOP   EQU   1000H
VTOP   EQU   5000H
LBUF   EQU   VTOP+0037H        ;0037H?
LBFSZ  EQU   80
MSTK   EQU   LBUF+LBFSZ
TMSTK  EQU   MSTK+30        ;30?
STACK  EQU   6000H

 

本文では「図3 メモリマップ」として説明されています。VTOPとLBUFの間は「変数エリア」になっています。Tiny BASICですから、プログラムで使える変数は「A」~「Z」と配列「@」の27個に制限されています。また変数に格納できるのは16ビット整数だけです。つまり27種類×2バイト=54バイトあれば良い計算になります。これは、16進数ならば0036Hです。

 

ところがLBUFは、「VTOP+0037H」として定義されています。何故「0036H」ではないのでしょうか。プログラムを解析してみると、ロジックの都合ではないかと思われます。

 

LBUFからLBFSZ(=80)は、「行バッファ」です。キー入力される文字列を格納する領域です。この処理は、次のようになっています。

EDITR: MVI   A,'>'
       CALL  GETL
       PUSH  D
       LXI   D,LBUF
       CALL  GINT
       CALL  SKPBL
       MOV   A,H
       ORA   L
       POP   B
       JZ    KWCPR
INSRT: DCX   D
       MOV   A,H
       STAX  D
       DCX   D
       MOV   A,L
       STAX  D

 

GETLルーチンで入力された文字列は、先頭に数字があるかをGINTルーチンで判断しています。つまり「10 PRINT A」のように入力すると、先頭の数字をバイナリに変換し、数字文字列と置き換えます。また空白も取り除くので、入力された行は、「<0A><00>PRINT A」としてメモリ上に置かれることになります。数字文字列をバイナリに変換した結果を格納しているのが、INSRTで始まる処理です。

 

このようなロジックになっているので、現代的な書き方であるインデントを使用としても、全て取り除かれてしまいます。「10         PRINT A」のように空白を入れても、内部構造は「<0A><00>PRINT A」になります。さらに当時の厳しいメモリ事情の為なのか、Tiny Trekのプログラムでわかるように、意味がとおるなら空白文字を省くことができます。つまり「10PRINT A」としてもエラーではありません。

 

ここで考えなければならないのは、数字文字列をバイナリに変換して格納している点です。バイナリは16bitなので、2バイト必要です。数字文字列が「10」であったり、例え一桁であったとしても「1 PRINT A」のように空白が入っていれば、2文字あるので、16bitのバイナリを格納することができます。ところが「1PRINT A」のような記述を認めているので、数字文字列が1文字しかない場合、16bitのバイナリを格納するには領域が不足してしまうのです。プログラムでは例外処理がありません。どうしているかというと、LBUFの直前にある「変数エリア」に踏み込んでしまうのです。これが「0036H」ではなくて「0037H」になっている理由と思われます。

 

試しに「LBUF EQU VTOP+0036H」としてアセンブルしたプログラムで実験してみました。変数「Z」に何か値を代入しておいて、「1PRINT Z」を入力すると、変数「Z」の値が変わってしまいました。やはり変数「Z」の領域を壊してしまうのです。

 

こうならないようにするため、あえて「LBUF EQU VTOP+0037H」として1バイト分ずらして領域を確保しているのですが、極めて技巧的です。 

2026-08-18

東大版Palo Alto Tiny BASICのGETIルーチンをamd64に移植するとLEA命令を使う

SDK-80のシリアルポートにASR-33が接続された環境を想定している東大版Palo Alto Tiny BASICをWSL2Ubuntu環境に移植しています。Geminiと相談しながら作業しています。BASICというものは、編集環境と実行環境が統合されているところに真髄があるのですが、まず編集環境の方から移植を進めています。数字文字列を2進数に変換するために「GETI」というルーチンがあります。これをamd64にしてみます。

 

オリジナルは次のようになっています。

GINT:  LXI   H,0000H        ;GET INTEGER
       MOV   B,H
       CALL  SKPBL
GETI1: CPI   '0'
       RC                    ;RETURN INTEGER IN HL
       CPI   '9'+1
       RNC
       MVI   A,0F0H
       ANA   H                ;IF INTEGER>#0FFF ERHOW
       JNZ   ERHOW
       INR   B
       PUSH  B
       MOV   B,H            ;HL HL+10
       MOV   C,L
       DAD   H
       DAD   H
       DAD   B
       DAD   H
       LDAX  D                ;HL HL+(DE)&#0F
       INX   D
       ANI   0FH
       ADD   L
       MOV   L,A
       MVI   A,00H
       ADC   H
       MOV   H,A
       POP   B
       LDAX  D
       JM    ERHOW
       JMP   GETI1

 

Geminiの指導を受けながらamd64に移植したら、次のようになりました。

.equ    GINT_DIGIT_MAX,        (NINE-ZERO)
.equ    GINT_MAX_BEFORE_X10,    0x0FFF
gint:    xor    eax,eax
    xor    ecx,ecx
    call    skpbl
geti1:    movzx    edx,byte ptr [rdi]
    sub    edx,ZERO
    cmp    edx,GINT_DIGIT_MAX
    ja    geti9
    cmp    ax,GINT_MAX_BEFORE_X10
    ja    erhow
    inc    cx
    # amd64の真骨頂: LEA命令による AX = (AX * 10) + DX
    lea    eax,[rax + rax*4]
    lea    eax,[rdx + rax*2]
    inc    rdi
    test    ax,ax
    js    erhow
    jmp    geti1
geti9:    ret

amd64と比べるのは卑怯かもしれませんが、i8080は命令が貧弱です。レジスタの内容を10倍するのも、簡単にはできません。一方amd64は、IMUL命令で簡単に10倍できるはずですが、Geminiが提示してきたのはLEA命令を使う方法でした。なぜIMUL命令を使わないでLEA命令なのかとGeminiに問うと、内部処理の都合上この方が速いのだそうです。ここがボトルネックという訳ではないので、微妙に速くなっても全体としては速さを意識できないと思います。しかし、いかにもamd64チューニングされているという感じにはなりました。 

2026-08-14

セキュアブートとUSB起動

Let's note CF-SV8RDCVSを中古で購入しました。Windows11が入っていたので、HWiNFOやCrystalDiskInfoなどで、情報を収集しておきます。また自宅の無線LANに接続してみて、問題ないことを確認しました。これで、ひととおり初期状態の確認が済んだので、Windows11とはお別れして、BSD系OSに入れ換えてみようと思います。

 

これまで使っていたdynabook SS SX/15AではNetBSD/i386を使っていました。せっかくなので各BSDを試してみて、気に入ったものを選ぼうと思います。まずは、FreeBSD/amd64 15.1を試してみます。公式サイトからUSBのためのIMGファイルを取得し、RufusでUSBメモリに書き込みます。これを使って起動しようとしたら、ちょっと問題が発生しました。

 

dynabookの頃には存在しませんでしたが、最近は「セキュアブート」というものがあります。これが有効になっていると、FreeBSDのインストーラが起動しません。しかもLet's noteは、USBメディアの起動順位が低いので、ただ挿しただけでは起動してくれません。

 

「セキュアブート」を無効にするには、電源投入時にF2キーを押し、設定画面に入ります。「セキュアブート」の項目を「無効」に設定して、保存すれば完了です。

 

USBメディアの起動順位を上げるのも、同様に設定画面で出来そうに見えます。しかし設定しても、USBメディアを抜くと優先順位が最下位に戻ってしまうようです。これはセキュリティ上の考慮なのかしれません。USBメディアから勝手に起動できてしまうと、不審者が勝手に操作できてしまうのを避けようとしているのかもしれません。理由は定かではありませんが、できないものは仕方ないので、USBから起動させたい場合は、いちいち設定画面に入ることになりそうです。 

2026-08-13

Let's note CF-SV8RDCVSを購入

20年ほど前に購入したdynabook SS SX/15Aは、当初Windows Vistaがインストールされていました。10年ほど前にサポート終了したので、NetBSD/i386に入れ換えて使ってきました。しかし近年、ソフトウェアの32ビット対応が無くなりつつあります。さらにハードウェア本体も劣化の傾向が見られ、電源を入れてても起動しなくなることが増えてきました。起動しなくても、揺すったり、叩いたりして、何度も電源投入を試みると起動します。いったん起動してしまえば、途中で落ちることはありません。ハードウェア的にも、ソフトウェア的にも、限界が迫ってきている気がするので、新しいPCを調達することにしました。

 

購入するのを決意したのは今春です。dynabook SS/SX15Aの後継ですから、いわゆるサブノートが候補です。Microsoft Windowsがインストールされていたとしても、それは捨てて、伝統か新興のBSDに入れ換えるのが、当初からの方向性でした。新品を購入することは考えず、中古を探そうと考えていました。ただし中古PCを店頭で探すにも、秋葉原に気軽に行ける場所に住んでいる訳ではないため、通販かオークションなどを使うしかありません。いろいろな販売店やサイトを探せば、何かしら中古サブノートPCは見つかりますが、新品を買うのと違って、中古は一期一会ですから、石橋を叩いて渡る気持ちで探しました。

 

数か月前に、通販で購入可能なショップからひとつに絞り込み、さらに機種もLet's noteに決めて、定期的に出品と値段を確認するようになりました。この時点ではLet's noteには決めたものの、CF-SV7にするか、CF-SV8かCF-SV9にするか、まだ流動的でした。出品や値段をウォッチしつつ、中古で値段が安いとは言ってもCF-SV7では性能が劣り、CF-SV9は値段が多少上がってしまうので、最終的に機種はCF-SV8に決めました。

 

ショップも決まり、機種も決まったとしても、Let's note CF-SV8は、様々な状態の中古が出品されていて、それを絞り込むのがまた一苦労です。絞り込むための条件として、次のようにしました。

  1. 中古の状態が悪いことが明記されているものは、候補から外す。
  2. 画面の状態に問題があることが明記されているものは、候補から外す。
  3. SSDが新品に換装されているものを、候補とする。
  4. ACアダプタは、純正でなくても構いませんが、純正の方を優先する。
  5. 使用時間は、5,000時間以下とする。 

 

このような条件で、先月までショップをウォッチし続け、今月に入り実際に購入するため最終確認をしたところ、候補が数件まで絞り込まれました。今週頭に、条件に合う候補をひとつに絞り、注文し、今日到着したところです。

 

Windows11 Professionalがインストールされていましたが、これは捨てて、BSDに入れ換えるつもりです。その前に、HWiNFOやCrystalDiskInfoなどを使って、ハードウェアの状態を記録しておきました。BSD系をインストールし、ハードウェア状態を知る必要が出てきた時には役立つでしょう。PC本体は中古ですが、SSDは新品に換装されていました。またACアダプタも純正でした。自前で換装したりすることは可能ですが、その手間もお金もかけずにすみました。さらにPC本体は、若干擦り傷はあるものの、基本的に綺麗で、ディスプレイもキーボードも新品同様です。またBIOSで使用時間を確認すると3,000時間でした。送料がかかりましたが、値段も安かったので、お買い得でした。

 

次は、どのBSDにするか決める必要があります。dynabook SS/SX15Aの流れを引き継いでNetBSD/amd64でも構わないのですが、FreeBSDやOpenBSDにするか、DragonFly BSDやNomadBSDにするとか、helloSystemやravynOSでも面白いかもしれません。いろいろインストールしてみて、決めていくつもりです。 

2026-08-12

東大版Palo Alto Tiny BASICをamd64環境に移植するための入力ルーチン

東大版Palo Alto Tiny BASICをamd64環境に移植してみるため、出力ルーチンが出来たので、引き続き入力ルーチンも書いてみました。WSL2のUbuntuを使っていますが、端末をRAWモードに設定する必要があります。プログラムを動かす前にsttyで設定を変えておくことにして、プログラム内部ではロジックを組みません。

 

オリジナルの入力ルーチンは次のようになっています。

GET:   IN    IFLG
       NOP
       ANI   IMSK
       RZ
       IN    ITTY
       ANI   7FH
       CPI   0FH
       JNZ   TTYI2
       LDA   OMASK
       CMA
       STA   OMASK
       JMP   GET
TTYI2: CPI   03H
       JZ    START
       RET

Geminiに教えてもらいながら、入力ルーチンを書いてみました。動作確認には、既にできている出力ルーチンを使いました。

# as get.s -o get.o
# ld get.o -o get
# stty raw -echo ; ./get ; stty sane
.intel_syntax noprefix
.global _start

.equ    CTRL_C,        0x03
.equ    CTRL_O,        0x0F
.equ    CR,        0x0D
.equ    LF,        0x0A
.equ    SYS_READ,    0
.equ    SYS_WRITE,    1
.equ    SYS_IOCTL,    16
.equ    STDIN,        0
.equ    STDOUT,        1

.equ    TC_MAGIC,    'T'
.equ    FIONREAD_CMD,    27
.equ    FIONREAD,    (TC_MAGIC << 8) | FIONREAD_CMD

.equ    OMASK_TOGGLE,    0x01

_start:    call    get
    call    put
    jmp    _start
    
done:
    # プログラム終了 (sys_exit = 60)
    mov rax, 60         # システムコール番号 (sys_exit)
    xor rdi, rdi        # 第1引数: 終了ステータスコード (0)
    syscall             # Linuxカーネル呼び出し

put:    cmp    byte ptr [rip+omask],0
    jne    ttyo0
    ret
ttyo0:    cmp    al,CR
    jne    ttyo1

    call    ttyo1
    push    rax
    mov    al,LF
    call    ttyo1
    pop    rax
    ret

ttyo1:    push    rax
    mov    rax,SYS_WRITE
    mov    rdi,STDOUT
    lea    rsi,[rsp]
    mov    rdx,1
    syscall
    pop    rax
    ret

get:    push    rbp
    mov    rbp,rsp
    sub    rsp,16

    mov    rax,SYS_IOCTL
    mov    rdi,STDIN
    mov    rsi,FIONREAD
    lea    rdx,[rbp-4]
    syscall
    test    eax,eax
    js    ttyi8
    cmp    dword ptr [rbp-4],0
    jz    ttyi8

ttyi1:    mov    rax,SYS_READ
    mov    rdi,STDIN
    lea    rsi,[rbp-5]
    mov    rdx,1
    syscall
    cmp    rax,1
    jl    ttyi8

    movzx    eax,byte ptr [rbp-5]
    cmp    al,CTRL_O
    jne    ttyi2

    xor    byte ptr [rip+omask],OMASK_TOGGLE
    mov    rsp,rbp
    pop    rbp
    jmp    get

ttyi2:    cmp    al,CTRL_C
    je    done
    jmp    ttyi9
ttyi8:    xor    eax,eax
ttyi9:    mov    rsp,rbp
    pop    rbp
    ret

.data
omask:    .byte 1        # 出力フラグ(0: 出力抑制 / 0以外: 出力許可)


東大版Palo Alto Tiny BASICをamd64環境に移植するための出力ルーチン

東大版Palo Alto Tiny BASICをamd64環境に移植してみようと思います。基本方針としては、オリジナル版の仕様を再現することに主眼をおき、C言語で書き直すとか、整数16ビットを拡張するなどはおこなわないつもりです。プログラムのデータ構造やサブルーチン構成も変更しないつもりですが、i8080とamd64の違いでやむを得ない場合は、変更します。

 

またオリジナル版は、SDK-80のシリアルポートにASR-33が接続された環境を想定していると思われます。amd64環境としては、WSL2のUbuntuとかFreeBSD/amd64などを考えていて、少なくともOSの管理下で動作するようにします。まずは入出力ルーチンを移植してみようと思います。

 

オリジナル版の出力ルーチンは、次のようになっています。

PUT:   PUSH  PSW                ;PUT CHARACTER IN A REG
       LDA   OMASK
       ORA   A
       JNZ   TTYO0
       POP   PSW
       RET
TTYO0: IN    OFLG
       ANI   OMSK
       JZ    TTYO0
       POP   PSW
       OUT   OTTY
       CPI   0DH
       RNZ
       MVI   A,0AH
       CALL  PUT
       MVI   A,0DH
       RET

 Geminiの助けを借りながら、オリジナルと同じ動きになるような出力ルーチンを書いてみました。動作確認のため「Hello World」を出力させてみましたが、うまくいっているようです。

# as put.s -o put.o
# ld put.o -o put
# ./put
.intel_syntax noprefix
.global _start

CR        =    0x0D
LF        =    0x0A
SYS_WRITE    =    1
STDOUT        =    1

_start: lea    rbx,[rip+msg]
loop:    mov    al,[rbx]
    cmp    al,0
    je    done
    call    put
    inc    rbx
    jmp    loop
    
done:
    # プログラム終了 (sys_exit = 60)
    mov rax, 60         # システムコール番号 (sys_exit)
    xor rdi, rdi        # 第1引数: 終了ステータスコード (0)
    syscall             # Linuxカーネル呼び出し

put:    cmp    byte ptr [rip+omask],0
    jne    ttyo0
    ret
ttyo0:    cmp    al,CR
    jne    ttyo1

    call    ttyo1
    push    rax
    mov    al,LF
    call    ttyo1
    pop    rax
    ret

ttyo1:    push    rax
    mov    rax,SYS_WRITE
    mov    rdi,STDOUT
    lea    rsi,[rsp]
    mov    rdx,1
    syscall
    pop    rax
    ret
    
.data
omask:    .byte 1        # 出力フラグ(0: 出力抑制 / 0以外: 出力許可)

.section .rodata
msg:    .asciz    "Hello World\r"

2026-08-09

東大版Palo Alto Tiny BASICをamd64環境に移植できるだろうか

simhのAltair 8800シミュレータ上で東大版Palo Alto Tiny BASICが動作し、Tiny Trekも動きました。ひとまず区切りがつきましたが、これを他の環境に移植してみても面白いのではないかという気がします。他の環境というのは、具体的にはつぎのようなものを思い描いています。

  • amd64環境として、WSL2のUbuntuかFreeBSD/amd64
  • PDP-11/40のUNIX v6
  • OpenVMS vax
  • OpenVMS alpha 

 

いずれの環境であっても、アセンブラで書いてみようと思います。オリジナルはOSを意識しておらず、シリアルポートの先にASR-33が接続されているのを想定しています。しかし入出力はOSのが提供する機能を利用しようと思います。それでも、行編集のような便利な機能はつかわず、ASR-33並みの原始的な行入力にしておこうと思います。

 

またオリジナルの8080版では、整数16ビットを想定しています。amd64なら整数32ビットにすることもできるかもしれませんが、そういうTiny BASICの仕様を拡張するようなことはしない方針です。できるだけオリジナルと同じ仕様にしておきつつ、動作環境が8080ではないという方向で考えています。

 

データ構造やサブルーチンなども、オリジナルの東大版Palo Alto Tiny BASICと同じようにしようと考えています。発表当時の時代背景を踏まえて、BASICソースは、メモリ上に単純に置かれています。ソフトウェア工学的には、メモリ上の持ち方を変えればスマートかもしれませんが、そういうこともしないつもりです。所詮はTiny BASICなので、大規模と言ってもTiny Trekのような高々200行弱のプログラムで十分です。何千行もあるようなプログラムになることは考えず、最適化されたアルゴリズムを採用しません。

 

いろいろな環境を考えているとはいっても、いきなり全てはできません。まずはamd64環境から始めようと思います。 

2026-08-07

東大版Palo Alto Tiny BASICでTiny Trekが動いたけど、遊び方が分からない

simhのAltair 8800シミュレータを使って東大版Palo Alto Tiny BASICが動いています。またAutoHotkeyを使って、長いBASICソースを入力させることが出来るようになりました。そしてTiny Trekを動かしてみたところ、あっさり動作しました。それは嬉しいことなのですが、遊び方が分かりません。


>RUN
DO YOU WANT A DIFFICULT GAME?  (Y OR N):N
STARDATE 3200:  YOUR MISSION IS TO DESTROY 8 KLINGONS IN 30 STARDATES.
THERE ARE 2 STARBASES.
ENTERPRISE IN Q-65 S-83
CAPTAIN:G
ENTERPRISE IN Q-65 S-83
COMPUTER DISPLAY OF GALAXY MAP

1:   0   0   0   0   0   0   0   0

2:   0   0   0   0   0   0   0   0

3:   0   0   0   0   0   0   0   0

4:   0   0   0   0   0   0   0   0

5:   0   0   0   0   0   0   0   0

6:   0   0   0   0   0   0   0   0

7:   0   0   0   0   0   0   0   0

8:   0   0   0   0   0   0   0   0
    ..  ..  ..  ..  ..  ..  ..  ..
     1   2   3   4   5   6   7   8

CAPTAIN:R
STATUS REPORT:
STARDATE      3200
TIME LEFT     30
CONDITION     GREEN
POSITION      Q-65 S-83
ENERGY        4000
TORPEDOES     10
KLINGONS LEFT  8
STARBASES     2
CAPTAIN: 

クリップボードの限界とAutoHotkey

simh上のAltair 8800シミュレータ上で東大版Palo Alto Tiny BASICが動作するようになりました。「Hello World」程度の簡単なプログラムを動かすなら何とも思いませんが、Tiny Trekのような(比較すれば)大きなプログラムを動かそうとすると、いちいちプログラムを入力するのは大変です。そもそもTiny BASICにはsaveやloadコマンドが存在しません。

 

本来のPalo Alto Tiny BASICでは、ASR-33の紙テープを使って、事前に作成済みの紙テープを使うことで、大きなプログラムを動かすことができたようです。simh上のAltair 8800シミュレータでは、紙テープのためのPTR/PTPデバイスは備えられていますが、本家も東大版も対応していません。対応できるように改造するという方法は考えられますが、まずは別の方法で対処しようと思います。

 

まず考えたのはクリップボードを利用する方法です。プログラムを事前にクリップボードに入れておけば、Altair 8800シミュレータ上で動作中の東大版Palo Alto Tiny BASICにクリップボードからコピーすれば、うまくいくと思いました。ちょっと試してみたところ、うまくいくようです。ところが、Tiny Trekのような大きなプログラムでは、クリップボードからのコピーが早すぎて、途中で文字の取りこぼしが発生してしまいました。

 

解決策を探していたら、AutoHotkeyというものが使えそうという感触を得ました。ちょっとしたスクリプトを作成することで、指定したファイルの内容を、あたかもキー入力したかのように、アプリケーションに送ることができるようです。以下に示すようなスクリプトをGeminiに作ってもらいました。試行してみたところ、うまくいったようです。

 

 #Requires AutoHotkey v2.0

waitMs := 1000
selectedFile := FileSelect(16, A_MyDocuments . "\PaloAltoTinyBASIC\Altair8800", , "BASファイル (*.bas)")
if (selectedFile == "")
    return

try {
    Loop read, selectedFile, "UTF-8"
    {
        currentLine := A_LoopReadLine
        SendText(currentLine)
        Send("{Enter}")
        Sleep(waitMs)
    }
} catch as err {
    MsgBox("処理中にエラーが発生しました: " . err.Message, "エラー", "Icon!")
}

2026-08-05

Palo ALto Tiny BASICとTiny Trek

Palo Alto Tiny BASICを開発したLi-Chen Wangは、Tiny Trekも発表しています。Tiny BASICが流行った当時、なぜかスタートレックのゲームも流行していました。 Tiny Trekは、People's Computer Company Jul. 1976、Vol. 5、No.1に掲載されています。Tiny BASICで動作するTiny Trekだからなのか、とれも短いプログラムです。

 

印刷されているものを参照して電子ファイル化しようと思いましたが、文字が潰れていて読みにくいです。頑張る気力がなかったので、ネットを調べてみたら、テキスト化されたファイルを見つけました。これがあれば、自分で文字を起こす必要がありません。

 

ただし、PCCに掲載されたものとは、若干異なっていました。Palo Alto Tiny BASICでは「PRINT」を「P.」と省略できるようなのですが、それが全て「PR.」に変更されています。どのような理由で変更したのかは不明です。

 

また、BASICは入力されたプログラムをメモリ上に置くので、それを極限まで切り詰めるためか、空白を入れるのを避けているようです。例えば「205 PR.;F.I=U-1TOU+1;F.J=V-1TOV+1;M=8*I+J-9,A=0」のようになっています。もし省略形を用いず、空白を入れるなら、「205 PRINT;FOR I=U-1 TO U+1;FOR J=V-1 TO V+1;M=8*I+J-9,A=0」のようになるでしょう。他にも「IFH-K>9PR.」のような箇所もあり、メモリが少なかった当時の努力を感じます。

2026-08-03

IMEで「いま」を現在時刻に変換できるらしい

日本語力ソフトで郵便番号から住所入力、Googleは大口事業所個別番号対応」という記事を読んだら、「例えば、「いま」と入力すると、現在時刻が変換候補に現れる(図1)。」と書かれていました。「いま」以外にも、「あす」や「ことし」なども受け付けるようです。では、受け付けてくれる候補は何があるのか、一覧はないのでしょうか。

 

Geminiに相談したら、気軽に「ここにありますよ」と答えてくれたのですが、そんなリンクはありませんでした。こういう雑な反応は、Geminiらしいところです。

 

受け付けられる文字列が分かっているなら、入力時に意識しようとも思います。しかし何が受け付けられるのかわからないのであれば、「ことし」が「2026年」に変換される機能があったとして、最初から「2026年」と入力するだろうと思います。

 

 

2026-08-01

再生鉄

ネットを見ていたら「自動車に「再生鉄」、トヨタも採用 東京製鉄トップが語る変化の兆し」という新聞記事が目に入りました。スクラップを再生した鉄を使用することでリサイクルを目指すようです。

 

どうしたことか「再生鉄」という文字を見たら、鉄道ファンの新しいジャンルかと勘違いしました。近年は、鉄道ファンという表現をすることは少なくなり、「乗り鉄」とか「撮り鉄」などと呼ばれます。それだけではなく、「座席鉄」や「顔鉄」などというニッチな表現もあるようです。「あなたは、何鉄ですか?」と問われることもあるらしいのですが、その質問自体がナンセンスというか、何故それほどまでに細分化したがるのか謎です。元々は「鉄道ファン」と呼ばれた愛好家は、「鉄道マニア」とも呼ばれ、「鉄道オタク」とも「鉄ちゃん」とも呼ばれましたが、この頃は「鉄道全般の愛好家」という意味であって、特定の一部を強調することはありませんでした。写真も撮るし、乗車して旅行もするし、模型も作るという、何でも屋でした。 

 

閑話休題。あまりにも細分化され過ぎた表現を見過ぎたせいか、「再生鉄」を見たとき、「おっ、新しい鉄道ファンのジャンルか?でも「再生」の鉄って何?」と、ズレた疑問を抱いてしまいました。