mieki256's diary



2022/10/01() [n年前の日記]

#1 [python] Skybox用のテクスチャを作成

blenderでパノラマ画像生成用に地形モデルを作ろうとしていたけれど、難しくて断念してしまった。そこで、ネットから入手できるHDRIのパノラマ画像を、Skybox? Cubemap? で使える形に変換できないか試してみることにした。

HDRIの入手。 :

HDRI(High Dynamic Range Images)は、Poly Haven から入手させてもらった。ありがたや。

_Poly Haven
_Alps Field HDRI - Poly Haven
_Bell Park Dawn HDRI - Poly Haven
_Montorfano HDRI - Poly Haven

RGB各8bitに変換。 :

HDRIを、RGB各8bitのpng画像に変換したい。Luminance HDR 2.6.0 x64 を利用させてもらう。

_Luminance HDR
_HDR合成ができるフリーソフト、Luminance HDR - ぼくんちのTV 別館
_Luminance HDRの使い方2: HDR処理の方法 - ぼくんちのTV 別館

トーンマッピングなのかLDR最適化マッピングなのか分からんけれど…。
  1. 右のほうに並んだマッピング種類の中から良さそうなものを選ぶ。
  2. 左下の設定ウインドウ内で、出力画像サイズ(Result Size)を変更。
  3. 「Update Preview」をクリックして更新。
  4. pngとして保存。

hdri2cubemap_ss01.png

Skybox用画像に変換。 :

Panorama To Cubemap Converter 2.0 x64を利用して、パノラマ画像をSkybox(Cubemap)用画像に変換。

_PanoramaToCubemapConverter - ge56@web

hdri2cubemap_ss02.png

今回は、4096 x 2048 のパノラマ画像から、512 x 512 x 6枚のpng画像を生成。

変換後の画像は、Panorama To Cubemap Converter のインストールフォルダ/output/ 以下に保存される。6枚の画像が生成された。

並び替える。 :

GIMP 2.10.32 x64 Portable samj版を使って、512 x 512 x 6枚の画像を、2048 x 2048 x 1枚の画像に並べた。ガイドを作成するか、グリッドを設定・表示して、ガイド(or グリッド)吸着を有効にして配置すると楽に作業できる。

hdri2cubemap_ss03.png

_均等にガイド(Grid of guides)

Shadeを使って試してみた。 :

3DCGソフト Sahde にも、キューブマップを出力するためのレンダリング設定があるらしい。6枚の画像が縦一列に並んだ状態で出力される模様。

_パノラマ画像からキューブマップを作成し、立方体にテクスチャマッピング - Shade3D Knowledge Base

Shade 12 Standard を使って、この方法も試してみた。
  • 表示 → 色補正、で色補正ウインドウを表示しておく。
  • 背景ウインドウに .hdr をドラッグアンドドロップで渡す。
  • 色補正ウインドウで、ガンマを2.2に変更。
  • レンダリング → レンダリング設定 → 効果 → パノラマをキューブマップに。
  • レンダリング設定 → イメージ → 幅と高さが1:6になるように指定。画像1枚あたりを 512 x 512 にしたければ、512 x 3072 になる。
  • レンダリング設定 → 基本設定 → アンチエイリアシング、のチェックを外して無効に。
  • レンダリング開始。

色補正がちょっと難しい感じもしたけれど、このやり方でも出力できないことはないなと…。

レンダリング設定でアンチエイリアスを有効にしてレンダリングしてしまうと、各画像の境界に、1ドットの幅で変な色が混ざってしまう。アンチエイリアスは無効にした状態で出力するしかないようだなと。

ちなみに、Shade 12 Standard はレンダリングサイズが 4000 x 4000 までに制限されてるので、1024 x 6144 を指定したかったけどできなかった。

2022/10/02() [n年前の日記]

#1 [python] PyOpenGLでSkyboxを実験中

PyOpenGL を使って Skybox を表示できるか実験中。箱の境界に黒い線が入ってしまって、どうすれば解決するのか試してるところ。

箱の頂点座標をちょっと大き目にしてやれば解決するかなと思って弄ってみたけど、それでは解決せず。どうやらテクスチャ座標をちょっとだけ弄ったほうが良さそうかも…。テクスチャ上の、境界の隣のドットを拾ってきて、しかしそこには何もないから黒い線が出てるような気がする…。

2022/10/03(月) [n年前の日記]

#1 [python] PyOpenGLでSkyboxを描画

Windows10 x64 21H2 + Python 3.9.13 64bit + PyOpenGL 3.1.6 で、Skybox を描画できるかテスト。

以下のような見た目になった。マウスカーソルの位置に応じてカメラ角度が変わるようにしてみた。それっぽい感じになったような気がする。

ソース。 :

ソースは以下。

_01_draw_skybox.py
import sys
import math
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image

IMG_NAME = "montorfano_cubemap.png"
# IMG_NAME = "alps_field_cubemap.png"
# IMG_NAME = "bell_park_cubemap.png"

# SCRW, SCRH = 1600, 900
SCRW, SCRH = 512, 512
FPS = 60
BOXW = 16

scr_w, scr_h = SCRW, SCRH
window = 0

mouse_x = 0
mouse_y = 0
cam_rot_x = 0.0
cam_rot_y = 0.0
cam_pos = (0, 0, 0)

texture = 0


def load_texture():
    global texture

    # load image by using PIL
    im = Image.open(IMG_NAME)
    w, h = im.size
    print("Image: %d x %d, %s" % (w, h, im.mode))

    if im.mode == "RGB":
        # RGB convert to RGBA
        im.putalpha(alpha=255)
    elif im.mode == "L" or im.mode == "P":
        # Grayscale, Index Color convert to RGBA
        im = im.convert("RGBA")

    raw_image = im.tobytes()

    ttype = GL_RGBA
    if im.mode == "RGB":
        ttype = GL_RGB
        print("Set GL_RGB")
    elif im.mode == "RGBA":
        ttype = GL_RGBA
        print("Set GL_RGBA")

    glBindTexture(GL_TEXTURE_2D, glGenTextures(1))

    # glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4)

    # set texture
    glTexImage2D(
        GL_TEXTURE_2D,      # target
        0,                  # MIPMAP level
        ttype,              # texture type (RGB, RGBA)
        w,                  # texture image width
        h,                  # texture image height
        0,                  # border width
        ttype,              # texture type (RGB, RGBA)
        GL_UNSIGNED_BYTE,   # data is unsigne char
        raw_image,          # texture data pointer
    )

    glClearColor(0, 0, 0, 0)
    glShadeModel(GL_SMOOTH)

    # set texture repeat
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)

    # set texture filter
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
    # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
    # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)


def draw_skybox():
    glEnable(GL_BLEND)
    glEnable(GL_TEXTURE_2D)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glColor4f(1.0, 1.0, 1.0, 1.0)
    glDisable(GL_ALPHA_TEST)

    w = BOXW

    glPushMatrix()

    m = glGetDoublev(GL_MODELVIEW_MATRIX)
    m[3][0] = m[3][1] = m[3][2] = 0.0
    glLoadMatrixd(m)

    va = 0.0005
    # va = 0.0

    pntlist = [
        # x, y, z
        [-1, +1, -1],  # 0
        [+1, +1, -1],  # 1
        [+1, +1, +1],  # 2
        [-1, +1, +1],  # 3
        [-1, -1, -1],  # 4
        [+1, -1, -1],  # 5
        [+1, -1, +1],  # 6
        [-1, -1, +1],  # 7
    ]

    pos = [
        [
            # index, u, v
            [0, 0.25, 0.50 + va],
            [1, 0.50, 0.50 + va],
            [5, 0.50, 0.75 - va],
            [4, 0.25, 0.75 - va],
        ],
        [
            [1, 0.50, 0.50 + va],
            [2, 0.75, 0.50 + va],
            [6, 0.75, 0.75 - va],
            [5, 0.50, 0.75 - va],
        ],
        [
            [2, 0.75, 0.50 + va],
            [3, 1.00, 0.50 + va],
            [7, 1.00, 0.75 - va],
            [6, 0.75, 0.75 - va],
        ],
        [
            [3, 0.00, 0.50 + va],
            [0, 0.25, 0.50 + va],
            [4, 0.25, 0.75 - va],
            [7, 0.00, 0.75 - va],
        ],
        [
            [3, 0.25 + va, 0.25 + va],
            [2, 0.50 - va, 0.25 + va],
            [1, 0.50 - va, 0.50 - va],
            [0, 0.25 + va, 0.50 - va],
        ],
        [
            [4, 0.25 + va, 0.75 + va],
            [5, 0.50 - va, 0.75 + va],
            [6, 0.50 - va, 1.00 - va],
            [7, 0.25 + va, 1.00 - va],
        ],
    ]

    for poly in pos:
        glBegin(GL_QUADS)
        for idx, u, v in poly:
            x, y, z = pntlist[idx]
            glTexCoord2f(u, v)  # set u, v
            glVertex3f(w * x, w * y, w * z)
        glEnd()

    glPopMatrix()


def draw_gl():
    global cam_rot_x, cam_rot_y, cam_pos

    glClearColor(0.2, 0.4, 0.8, 0.0)  # background color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glLoadIdentity()  # Reset The View

    # move camera
    r = 8.0
    rr = r * math.cos(math.radians(cam_rot_x))
    ey = r * math.sin(math.radians(cam_rot_x))
    ex = rr * math.cos(math.radians(cam_rot_y + 90.0))
    ez = rr * math.sin(math.radians(cam_rot_y + 90.0))
    tx, ty, tz = 0.0, 0.0, 0.0
    gluLookAt(ex, ey, ez, tx, ty, tz, 0, 1, 0)
    cam_pos = (ex, ey, ez)

    draw_skybox()

    glDisable(GL_TEXTURE_2D)
    glDisable(GL_ALPHA_TEST)

    glutSwapBuffers()


def init_viewport_and_pers(width, height):
    global scr_w, scr_h
    # Prevent A Divide By Zero If The Window Is Too Small
    if height == 0:
        height = 1

    scr_w, scr_h = width, height

    # Reset The Current Viewport And Perspective Transformation
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()  # Reset The Projection Matrix

    # Calculate The Aspect Ratio Of The Window
    # gluPerspective(fovy, aspect, zNear, zFar )
    gluPerspective(60.0, float(width) / float(height), 0.1, 100.0)
    glMatrixMode(GL_MODELVIEW)


def InitGL(width, height):
    glClearColor(0.2, 0.4, 0.8, 0.0)  # background color
    glClearDepth(1.0)  # Enables Clearing Of The Depth Buffer
    glEnable(GL_DEPTH_TEST)  # Enables Depth Testing
    glDepthFunc(GL_LESS)  # The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH)  # Enables Smooth Color Shading

    init_viewport_and_pers(width, height)


def resize_gl(width, height):
    init_viewport_and_pers(width, height)


def on_timer(value):
    global cam_rot_x, cam_rot_y
    # cam_rot_y += 0.25
    glutPostRedisplay()
    glutTimerFunc(int(1000 / FPS), on_timer, 0)


def key_pressed(key, x, y):
    # If escape is pressed, kill everything.
    ESCAPE = b"\x1b"
    if key == ESCAPE or key == b'q':
        if glutLeaveMainLoop:
            glutLeaveMainLoop()
        else:
            sys.exit()


def mouse_move(x, y):
    global mouse_x, mouse_y, cam_rot_x, cam_rot_y, scr_w, scr_h

    dw = scr_w / 2
    dh = scr_h / 2
    mouse_x = (x - dw) / dh
    mouse_y = (y - dh) / dh

    cam_rot_x = 90.0 * mouse_y
    cam_rot_y = 180.0 * mouse_x


def main():
    global window

    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)

    glutInitWindowSize(SCRW, SCRH)
    # glutInitWindowPosition(0, 0)

    window = glutCreateWindow(b"Draw Skybox")

    glutDisplayFunc(draw_gl)
    glutReshapeFunc(resize_gl)
    glutKeyboardFunc(key_pressed)
    glutPassiveMotionFunc(mouse_move)
    # glutFullScreen()

    # glutIdleFunc(draw_gl)
    glutTimerFunc(int(1000 / FPS), on_timer, 0)

    InitGL(SCRW, SCRH)

    load_texture()

    glutMainLoop()


if __name__ == "__main__":
    print("Hit ESC key to quit.")
    main()


使用画像は以下。512 x 512 x 6枚の画像を 2048 x 2048 x 1枚に収めている。

_montorfano_cubemap.png (2.93MB)
_alps_field_cubemap.png (3.41MB)
_bell_park_cubemap.png (3.06MB)


実行は以下。
python 01_draw_skybox.py


ちなみに、画像は、Poly Haven でCC0で公開されている、正距円筒図法のHDRIを元にして作成した。ありがたや。

_Poly Haven
_正距円筒図法
_(Equirectangular projection)

作り方は以下でメモしてある。

_Skybox用のテクスチャを作成

覚書。 :

Skyboxは、カメラを取り囲むような大きな箱を表示して、その箱に遠景相当のテクスチャを貼ることで実現するけれど。カメラが移動して箱との位置関係が変わってしまうとちょっと困る。

そのあたりは、箱を描画する前に設定する変換行列に対して、平行移動成分のみを 0.0 にすることで対処する。これで、カメラの角度は反映されるけど、位置関係は常時変わらない状態になる。

OpenGL (PyOpenGL) + GLUT で、マウスカーソルが移動したことを検出するには、glutPassiveMotionFunc() を使う。指定した関数には x と y の引数が渡されるけど、この x, y には、ウインドウ内におけるマウスカーソルの座標値が入ってる。

箱の境界部分に黒い線が入ってしまって悩んだけれど、テクスチャの座標指定値をほんの少し弄ってみたら消えてくれた。draw_skybox() 内の va = 0.0005 が弄ってる量。本当にこういう対処でいいのかどうか分からんけど…。ちなみに、以下が黒い線が入ってしまっている状態。

ss_01_draw_skybox_nogood.png

2022/10/04(火) [n年前の日記]

#1 [windows][prog] CP/Mエミュレータ YAZE-AGを試用

随分前に、CP/Mエミュレータを少し試用したことがあったのだけど。

_CP/Mエミュレータを試用 - 2019/05/08
_Altair 8800 simulator を試用 - 2019/05/10

YAZE-AG というCP/Mエミュレータのバージョンが上がっていたので、触ってみようかなと。以前試したときは 2.40.5 だったけど、現行版は 2.51.2 になっているらしい。

環境は、Windows10 x64 21H2。CPU は AMD Ryzen 5 5600X。

以下の解説ページが参考になった。

_ソフトウェアー基礎コース (Tiny BASIC Lesson 1:Z80 エミュレーター YAZE)

入手とインストール。 :

入手は以下。今回は 2.51.2 64bit版を試用してみた。

_YAZE-AG - Yet Another Z80 Emulator by AG V 2.51.2 (Windows binaries)

以前のバージョン、2.40.5 は、バイナリがCPU別に用意されてたようだけど、現行版 2.51.2 は一種類だけのバイナリを提供する状態になった模様。

yaze-ag-2.51.2-x86_64bit-generic.exe をDL。実行するとインストーラが起動して、指定した場所にファイルが展開される。今回、手元の環境では、D:\Dev\yaze-ag-2.51.2-64Bit\ にインストールしてみた。

インストールすると、デスクトップにアイコン(ショートカットファイル)が作成される。ダブルクリックすると、mintty.exe が起動して CP/M が使えるようになる。

ショートカットファイルのプロパティを確認したら以下のような記述になっていた。
D:\Dev\yaze-ag-2.51.2-64Bit\bin\mintty.exe --config .\.minttyrc --exec .\yaze_bin.exe

ちなみに、そのままだと CP/M 3.1 が起動するけれど、CP/M 2.2 を使いたい場合、以下を指定することになるのだろう…。以前はそうだったはず。
D:\Dev\yaze-ag-2.51.2-64Bit\bin\mintty.exe --config .\.minttyrc --exec .\yaze_bin.exe -l -1 -b yaze.boot
要するに、最後に、「-l -1 -b yaze.boot」を追加することになるらしい。

Cドライブの設定が少し変わってた。 :

YAZE-AG 2.51.2 は、以前の版、2.40.5 と少し違うようで、bin/disksort/ が C: に割り当てられていなかった。

以下を打ち込めば C: に ./disksort/ が割り当てられる。
sys mount c ./disksort

Windows側から ./disksort/ フォルダ内にファイルをコピーしておけば、YAZE-AG 側も C: に ./disksort/ をマウントすることでそれらのファイルを読み取れるようになる。

Mbasicで動作確認。 :

CP/M用 Microsoft BASIC Interpreter v5.21、Mbasic.com を入手して、./disksort/ にコピーしておく。

_CP/M Programming Languages and Tools

以下を実行したら Microsoft Basic が動いてくれた。
C:
mbasic

簡単なプログラムを打ち込んで動作確認。
10 for i=0 to 5
20 print i*i
30 next

list
10 FOR I=0 TO 5
20 PRINT I*I
30 NEXT
Ok

run
0
1
4
9
16
25
Ok

Mbasic の終了は、system と打つ。
system

ちなみに、YAZE-AG の終了は以下。
sys
quit
もしくは、E.COM を実行しても終了できる。e と打って Enter。

Backspaceキーが効かない問題。 :

Backspaceキーを叩いたら変な文字が挿入された。

YAZE-AG の画面出力を担当している、mintty の設定で変更できる模様。ウインドウの左上のアイコンをクリック → Options → Keys → Backarrow sends ^H にチェックを入れる。

wsの使い方が分からない。 :

YAZE-AG の起動直後、「ws profile.sub と打って編集すれば各ドライブを有効にできる」とメッセージが表示されていた。

A>; The following ydsk-files can be mounted by deleting  the ';' at the begin of
A>; the line bevore the sys command. To editing the file  use "ws profile.sub".
A>;
A>;sys mount c ./disksort              ; source of the  Disksort program (DIR)
A>;sys mount d disks/disksort.ydsk     ; submit examples  to compile Disksort
A>;sys mount f disks/zinc.ydsk           ; CP/M Utilities  of the ZINC projekt
A>;sys mount g disks/test-utils-1.10.ydsk    ;  Testutilities with ZEXALL.COM
A>;sys mount h disks/hi-c-z280-compiler.ydsk ; Hitech  Z80/Z280 C-Compiler
A>;sys mount i disks/unixlike.ydsk           : Unixlike  utilites for CP/M
A>;sys mount j disks/mmu-utils.ydsk    ; testprograms  when I develope the MMU
A>;sys mount k disks/kermit_szrz.ydsk  ; comunication  programm for serial line
A>;sys mount l disks/spl.ydsk          ; programming  language "SPL"
A>;sys mount m disks/turbo-modula-2.ydsk  ; Borlands  Turbo-Modula-2 environment
A>;sys mount n disks/testdsk.ydsk      ; Testdisk
A>;sys mount o disks/zsm4-source.ydsk ; Source of ZSM4  V4.4 Macro Assembler
A>;sys mount p disks/bios3-zsm4.ydsk  ; sources CP/M 3.1  BIOS (ZSM4)
A>;
A>pause

どうやら ws というのは、WordStar という、当時のワープロソフトだったらしい。

_WordStar - Wikipedia
_ASCII.jp:業界に痕跡を残して消えたメーカー ワープロソフトWordStarで分裂したMicroPro (1/3)

ws profile.sub と打ってみたところ、たしかにエディタっぽい画面になった。

しかし、終了のさせ方が分からない…。

とりあえず、ESCキーや Ctrl + J (^Jと表記) を押したらヘルプメッセージっぽいものが出てきた。

少しググってみた。ショートカットキーの一覧は、以下が参考になるのだろうか。

_cpm:wordstar []
_WordStar Command Summary - wordstar-command-summary.pdf

とりあえず、保存と終了だけでもメモ。
  • Ctrl + K の後に D を叩けば、保存してからファイルを閉じる。
  • Ctrl + K の後に Q を叩けば、保存しないままファイルを閉じる。
  • その後、X を叩けば ws を終了できる模様。

PIPの在り処。 :

PIP.COM というのは、おそらくファイルコピーをするプログラムだろうと思うけど、YAZE-AG 2.51.2 では、PIP.COM は B: にあるらしい。

使い方としては、以下のような感じだろうか。これは、C: から A: にファイルコピーしている例。
B:PIP A:HELLO.ASM=C:HELLO.ASM

コンパイルやアセンブル。 :

YAZE-AG には、Cコンパイラやアセンブラも同梱されている。以下を参考にして動作確認。

_ソフトウェアー基礎コース (Tiny BASIC Lesson 2: CP/M によるコンパイル・アセンブル)

とりあえず、CP/M 2.2 上で HELLO.C をコンパイルしたり、HELLO.ASM をアセンブルしたりすることはできた。

コンパイルの例。
sys mount c ./disksort
sys mount h disks/hi-c-z280-compiler.ydsk
H:
c C:HELLO.C

HELLO

era HELLO.COM
  • C: と H: をマウント。
  • カレントドライブを H: ドライブに変更。
  • C: ドライブの HELLO.C というファイルを、H: ドライブの C.COM というコンパイラでコンパイル。H: ドライブ内に HELLO.COM が生成される。
  • H: ドライブ内の HELLO.COM を実行。
  • 動作確認できたので、eraコマンドを使って、HELLO.COM を削除。

アセンブルの例。
A:
B:PIP A:HELLO.ASM=C:HELLO.ASM
B:PIP A:LOAD.COM=C:LOAD.COM
B:MAC HELLO
LOAD HELLO

HELLO

era HELLO.ASM
era HELLO.PRN
era HELLO.HEX
era HELLO.SYM
era HELLO.COM
  • C: ドライブの HELLO.ASM を A: ドライブにコピー。
  • B:MAC.COM や A:LOAD.COM を使ってアセンブルして、A:HELLO.COM を生成している。

C:はリードオンリー。 :

ところで、C: (./disksort) は、YAZE-AG側からは Read Only 扱いの模様。ファイルが書き込めなくて、変だなーおかしいなーと結構悩んでしまった…。

以下は起動時のメッセージ。おそらく、「r/w」が読み書きできるドライブで、「r/o」がRea Onlyなのではあるまいか。

The following disks and directory are defined in .yazerc  and PROFILE.SUB:

A: r/w  BOOT_UTILS      BOOT disk with CCP.COM and some  utilies (.yazerc)
B: r/w  CPM3_SYSdsk     Disk with all CP/M 3.1 system  utilities (.yazerc)
                          A section "YAZE-AG" is added in  the help file.
C: r/o  ./disksort/     Connected to the (unix-)directory  ./disksort/ (SOURCE)
D: r/w  disksort.dsk    Submit examples of the DISKSORT  project
F: r/w  zinc.ydsk       System Utilies of the ZINC  project from John Elliott
G: r/w  test-utils-1.10 Test Utilities of the old version  yaze-1.10
H: r/w  hi-c-z280-compiler   A Copy of the C Compiler  from HI Tech Soft
I: r/w  unixlike.ydsk   UNIX like utilities
J: r/w  mmu-utils       Testfiles for the Memory  Management Unit (MMU).
K: r/w  kermit_szrz.ydsk Kermit and SZ/RZ (Zmodem)
L: r/w  spl.ydsk        SPL development environment to  compile .SPL files
M: r/w  turbo-modula-2  Modula 2 Compiler of Borland
N: r/w  testdsk.ydsk    testdisk
O: r/w  zsm4.4-source   ZSM4 v4.4 Macro Assembler for  Z80/Z180/Z280 (source)
P: r/w  bios3-zsm4      sources of the BIOS3 for YAZE-AG  (look 0-README.1ST)

On every disk is a file named 0-README.1ST. This file  describes the 
contents of the disk. You can use the a:S.COM (NSWEEP)  utility to read it.

2022/10/05(水) [n年前の日記]

#1 [ubuntu] YAZE-AGをUbuntu Linux上で動かしてみた

CP/Mエミュレータ、YAZE-AG 2.51.3 を Ubuntu Linux 20.04 LTS 上で動かしてみた。ちなみに、Ubuntu を動かしてるPCは、CPU が AMD A8-3850 (4core, 2.9GHz, TDP100W)。

_YAZE-AG - Yet Another Z80 Emulator by AG (final release 2.51.3)

インストール手順。 :

パッケージが無いかなと検索してみたけど、公式リポジトリには入ってないようだなと…。Linux上で使うためにはソースからビルドしないといけない模様。

公式サイトから yaze-ag-2.51.3.tar.gz を入手して解凍。
wget https://www.mathematik.uni-ulm.de/users/ag/yaze-ag/devel/yaze-ag-2.51.3.tar.gz
tar zxvf yaze-ag-2.51.3.tar.gz
cd yaze-ag-2.51.3

Makefile をコピーして作らないといかんのだけど、OS や CPU別で色々用意してあった。
$ ls Makefile*
Makefile                                     Makefile_first
Makefile_Orange_Pi_Plus2_ARMv7               Makefile_freebsd
Makefile_Raspberry_Pi_1                      Makefile_linux_32_i586
Makefile_Raspberry_Pi_2_Model_B              Makefile_linux_64_amd_athlon64
Makefile_Raspberry_Pi_3_Model_B_ARMv7_32Bit  Makefile_linux_64_intel_corei7
Makefile_Raspberry_Pi_3_Model_B_ARMv8_64Bit  Makefile_linux_64_intel_nocona
Makefile_Raspberry_Pi_4_Model_B_ARMv7_32Bit  Makefile_linux_64_intel_skylake
Makefile_Raspberry_Pi_4_Model_B_ARMv8_64Bit  Makefile_linux_64_intel_tigerlake
Makefile_bananapim3_BPI-M3                   Makefile_radxa_Rock_RockPro_RockLite
Makefile_cygwin_32                           Makefile_solaris_cc-sparcv9
Makefile_cygwin_64_core2duo                  Makefile_solaris_cc-x86_64
Makefile_cygwin_64_corei7                    Makefile_solaris_gcc-sparcv9
Makefile_cygwin_64_generic                   Makefile_solaris_gcc-x86_64

今回は AMD A8-3850 上で動かしているので、Makefile_linux_64_amd_athlon64 が使えるのではなかろうか。Makefile としてコピーする。
cp Makefile_linux_64_amd_athlon64 Makefile

ビルドしてインストール。
make
sudo make install

/usr/local/bin/ に、yaze がコピーされた。また、ユーザのホームディレクトリに cpm というフォルダ(~/cpm)が作られて、その中に色々なファイルやフォルダが入っていた。

動作確認。 :

~/cpm をカレントディレクトリにしてから、yaze を実行。
cd ~/cpm
yaze

Windows版と同様に、起動時に色々メッセージが表示された。

終了は、E.COM を実行。e と打って Enter。もしくは、sys を打ってから quit でもいい。
sys
quit

Microsoft Basic が動くのか確認してみた。

_CP/M Programming Languages and Tools

  1. Mbasic.com を入手。~/cpm/disksort/ にコピー。
  2. yaze を実行。
  3. sys mount c ./disksort で、./disksort ディレクトリを C: として割り当てる。
  4. C:MBASIC を実行。
動いてくれた。Microsoft Basic の終了は system と打つ。

問題点。 :

MobaXterm から ssh で Ubuntu にアクセスして yaze を利用した際、Backspaceキーが機能してくれなかった。変な文字が打ち込まれる…。

Ubuntu のデスクトップ上で端末を開いて、そこで yaze を動かす分には、Backspaceキーも機能する。また、Windows10 x64 21H2 + PuTTY 0.74-ranvis からアクセスした場合も、Backspaceキーは機能した。

#2 [pc][windows] PT1機にBS新チャンネルを追加しようとして四苦八苦

BS放送に、3つの新チャンネルが ―― BS松竹東急、BSJapanext、BSよしもとが増えてしばらく経ったけれど。

手元のPT1搭載機上で追加設定をしてなかったので、いい加減そろそろ設定しないといかんなと作業をし始めた。ただ、PT1の設定作業をしたのは随分昔の話なので、何をどうすればいいのかすっかり忘れていて…。

とりあえず、以下の解説ページを眺めながら、色々試してみた。

_2022年のBS新規局開局への対応(TVRock+TVTest)
_2022年BS新チャンネル開局に伴うTVTest、TvRock設定変更の覚え書き(BS松竹東急、BSJAPANEXT、BSよしもと) - 密やかに伸びやかに
_2021年BS帯域再編・トランスポンダ移動に伴うTVTest、TvRock設定変更の覚え書き(BS釣りビジョン、日本映画専門チャンネル) - 密やかに伸びやかに
_BonDriver_PT3-ST/BonDriver_PT3-S.ChSet.txt at master ・ epgdatacapbon/BonDriver_PT3-ST
_BS・CSのトランスポンダ番号一覧表
_衛星放送(BS) - 一般社団法人放送サービス高度化推進協会(A-PAB)

とりあえず、分かった範囲でメモ。

TVTestを使ってチャンネルスキャン。 :

TVTest.exe (0.7.23 x86) が入ってるフォルダ (自分の環境の場合、C:\TVTest\ ) に、BonDriver_PT-S.ChSet.txt というファイルがあるので、これをエディタで開いて、現行のBS放送割り当て状態に沿うように修正してみた。内容は以下。記述が間違ってるかもしれんけど…。

_BonDriver_PT-S.ChSet.txt

上記ファイルを修正後、TVTest でチャンネルスキャンをする。
  1. TVTest を起動。
  2. 左下のチューナー選択部分で、BonDriver_PT-S に切り替える。
  3. 画面を右クリック → 設定 → チャンネルスキャン。
  4. 「サービスを検索する」にチェックを入れた状態で、「スキャン開始」。

これで、BonDriver_PT-S.ch2 というファイルが、現在のBSチャンネル割り当てが反映された状態で更新された。

_BonDriver_PT-S.ch2

Spinel に反映。 :

自分の環境の場合、LAN内の他のPCからPT1機にアクセスしてTV映像が見れるように、Spinel というソフトをインストールしてある。その Spinel の設定もしないといけない。

まずは Spinel を終了。タスクトレイのアイコンを右クリックして終了を選ぶ。

Spinel は、TVTest がインストールされているフォルダとは別フォルダにインストールされていた。Spinel インストールフォルダ (自分の環境の場合、C:\Spinel3\) を開く。

BonDriver というフォルダがあって、その中に BonDriver 関係のファイルが入ってる。先ほど更新した、BonDriver_PT-S.ch2 と BonDriver_PT-S.ChSet.txt をコピーしてくる。

Spinel を起動してから、TVTest を起動。

  1. チューナー選択部分で、BonDriver_Spinel_PT1_0_S0 を選択。
  2. 画面を右クリック → 設定 → チャンネルスキャン。
  3. 「サービスを検索する」にチェックを入れた状態で、「スキャン開始」。
これで、BonDriver_Spinel_PT1_0_S0.ch2 が更新された。

_BonDriver_Spinel_PT1_0_S0.ch2

同様に、BonDriver_Spinel_PT1_0_S1 を選択してチャンネルスキャン。これで、BonDriver_Spinel_PT1_0_S1.ch2 も更新された。

別PC上の TVTest を起動して、同様にチャンネルスキャンをしてみたが、こちらもそれらしくスキャンされて、.ch2 が更新された。

TVRockの設定変更。 :

録画用のソフト、TVRock の設定も行う。以下が参考になった。

_TVRock2022新BSチャンネル録画設定を丁寧に解説!! | 疑問解決.com

上記ページによると、以下の作業をするらしい。
  • チャンネルエディタに新チャンネル3つを追加。
  • TVRockチューナー設定で追加したチャンネルにチャンネル番号とサービスIDを設定。
  • (TVTestインストールフォルダ)\Plugins\TVRockOnTVTest.ini に周波数設定を3つ追加。

_TvRockOnTVTest.ini


加えて、(TVTestインストールフォルダ)\RecTask.ini も、TVRockOnTVTest.ini と同様に周波数設定を加えてみた。

_RecTask.ini


更に、TVRock作業フォルダ内の ch-bs.txt も修正してみた。TVRock作業フォルダの場所は、TvRock設定 → システム設定 → TvRock作業フォルダ、で指定されている。自分の環境の場合、C:\Users\(USERNAME)\Documents\tvrock\ になっていた。

ch-bs.txt は、以下で生成したものを一部修正して利用した。

_TvTestの.ch2からTvRockの何かを作るやつ

いくつかのチャンネルの値が「NaN」になってしまうので、前述のページや、以下のページを参考にして、しかるべき数値を入れた。

_TVRock2022新BSチャンネル録画設定を丁寧に解説!! | 疑問解決.com
_BS帯域再編再び: まんぼうのつれづれ日記

今現在の手元の ch-bs.txt の内容は以下。記述が間違ってるかもしれんけど…。

_ch-bs.txt

TVRock を終了・再起動。

タスクトレイ上の TVRock のアイコンを右クリックして、チューナーアプリ起動、を選択。TVTest が起動した。TVRock のアイコンを右クリック → チャンネル → BS、で、各チャンネルを選んでみて、TVTest もチャンネルが切り替わるか確認。

TVRock のアイコンを右クリック → インテリジェント → 番組情報取得、を選択。追加したチャンネルの情報が取得できるか確認。

ただ、ブラウザで表示しても、番組表が更新されない…。TVRock作業フォルダ内の .prg 等を一部削除したりして何度か番組情報取得を繰り返してみたら、一応、番組表上でも新チャンネルが反映された状態になった。これで様子見してみよう…。

2022/10/06(木) [n年前の日記]

#1 [ubuntu] サブPCをUbuntu 22.04 LTSにアップグレードした

サブPC、A8-3850機のOSを、Ubuntu Linux 20.04 LTS から Ubuntu Linux 22.04 LTS にアップグレードしてみた。

本体構成は以下、だった気がする…。
デスクトップ環境は xubuntu-desktop。

ちなみに、アップグレード前の Ubuntu 20.04 LTS は、Ubuntu 18.04 LTS からアップグレードした環境…だったような気がする。

すんなりアップグレードできなかった。 :

デスクトップ上で「ソフトウェアの更新」を選んでアップグレード作業をしようとしたら、リポジトリを書き換えた直後ぐらいにアップグレード用のツール(update-manager?)のウインドウが何も言わずに落ちた…。ここからどうしろと…。

ググってみたら、Ubuntu標準以外のデスクトップ環境はアンインストールしてあるほうがいいとか、余計なパッケージは極力アンインストールしておくべきとか、そういった話を見かけた。

一旦ログアウトして、標準デスクトップでログインし直してから、インストールしてあった xubuntu-desktop や ubuntu-mate-desktop、x11vnc、virtualbox 等々、思いつく限りダメ元でアンインストール。

_Ubuntu 20.04: デスクトップ環境のXfceをインストールする - Narrow Escape
_Ubuntu 20.04: デスクトップ環境のMATEをインストールする - Narrow Escape

sudo apt remove -y xubuntu-desktop xfdesktop4 xfce4-* libxfce4*
sudo apt remove -y ubuntu-mate-desktop mate-* ubuntu-mate-* plymouth-theme-ubuntu-mate-*
sudo apt remove x11vnc
sudo apt remove virtualbox*

リポジトリが書き換えられてしまったけれど、どうせおそらくパッケージのダウンロードで時間がかかるだろうから、先に関連パッケージだけでもダウンロードしておくことにした。sudo apt に -d をつければダウンロード処理のみが行われる。

sudo apt update
sudo apt upgrade -y -d

その後、デスクトップ上で「ソフトウェアの更新」を実行したら、今度は処理が先に進んだ。

途中で何度か、「設定ファイルを上書きするか、これまでの設定ファイルをそのまま使うか」を尋ねてくるので、処理が終わるまで張り付いてないといけない…。

なんだかんだで5時間ぐらいかかった…。

端末から以下を打ったほうが良かったのかも…。いや、コレもやっぱり途中でアレコレ尋ねてくるだろうから、結局は張り付いてないといかんのだろうけど。どの処理でエラーが出て止まったのか、それぐらいのヒントは得られたかもしれない。
sudo do-release-upgrade -d
sudo do-release-upgrade

openmpi-bin でエラー。 :

openmpi-bin 関連パッケージが正常にインストールできなかったようで、apt を使うとずらずらとエラーが表示されてしまった。

_mpi - OpenMPI-bin error after update (K)Ubuntu 18.04 to 20.04 - Stack Overflow

sudo rm -f /etc/aternatives/mpi* /var/lib/dpkg/alternatives/mpi*
sudo apt install openmpi-bin

上記の作業でエラーが解決した。

libdvd-pkg でエラー。 :

apt を使うたびに、libdvd-pkg が壊れてる云々とエラーが出てくる状態になってしまった。一旦アンインストールしてから再インストール。

sudo apt remove libdvd-pkg
sudo apt install libdvd-pkg

しかし、「上手く行かなかったから dpkg-reconfgiure をしろ」とメッセージが表示されている…。

sudo dpkg-reconfigure libdvd-pkg

何かをDLしてビルド処理が始まった。おそらくインストールできた模様。

xubuntu-desktop や x11vncをインストール。 :

Ubuntu の標準デスクトップはなんだか嫌なので、Xubuntuのデスクトップ(Xfce4)を使えるようにしておきたい。
sudo apt install xubuntu-desktop
sudo apt install ubuntu-mate-desktop
sudo apt install x11vnc

X11vncを自動起動サービスとして登録しておいた。これで、他のPCから VNC Viewer を使って、LAN経由でデスクトップ画面を操作できる。

_mieki256's diary - X11vncを自動起動するようにしてみた - 2020/02/18

sudo systemctl daemon-reload
sudo systemctl disable x11vnc
sudo systemctl enable x11vnc
sudo systemctl start x11vnc
sudo systemctl status x11vnc

一応、メインPC (Windows10 x64 21H2) + VNC Viewer 6.21.920 (r45849) x64 (RealVNC) から、サブPC (Ubuntu 22.04 LTS) にアクセスして、デスクトップ画面を表示することができた。

ちなみに、Ubuntu 22.04 LTS の x11vnc は 0.9.16 に見えた。0.9.13 はバグがあって落ちてしまうけど、0.9.16 なら修正されているという話があったような気がする。

_mieki256's diary - Ubuntu 18.04 LTS上の X11vnc をビルドしてアップデート - 2020/02/17

VirtualBox と VMware Player の動作確認。 :

VirtualBox をインストール。
sudo apt install virtualbox virtualbox-ext-pack virtualbox-guest-additions-iso

VirtualBox 6.1.38_Ubuntu r153438 は、Ubuntu 22.04 LTS上で動いてくれた。

しかし、VMware Player 15.5.2 は動いてくれなかった。実行してみると端末が開くけど、何のメッセージも表示されず、しばらくすると端末が閉じてそれっきり。

ググったところ、VMware Player 16.2.3-19376536 は、2022/06 の時点で、Ubuntu 22.04 LTS のカーネル (5.15.0) に対応してない、という話を見かけた。

_Ubuntu LinuxでVMware Workstation pro/playerを使うときの注意 - kashiの日記

まして、16.2.3 より古い 15.5.2 では…これは動かないだろうな…。

今回、Ubuntu 22.04 LTS にアップグレードしたこのPCは、CPU が AMD A8-3850 と結構古い。VMware 16.x.x は AMD Phenom 世代も含めて古いCPUは非対応になってしまったので…。このPCはCPUが古過ぎて最新版の VMware は動かない。故に、15.5.2 を試用していたのだけど…。

_mieki256's diary - Kubuntu Linux 21.10を少しだけ試用

動かないのでは仕方ない。とりあえず、アンインストールしておいた。

sudo bash VMware-Player-15.5.2-15785246.x86_64.bundle --uninstall-component=vmware-player


vmware-host-modules とやらをビルドしてどうにかする方法もありそうだけど…。

_mkubecek/vmware-host-modules: Patches needed to build VMware (Player and Workstation) host modules against recent kernels

wget https://github.com/mkubecek/vmware-host-modules/archive/player-15.5.2.tar.gz
tar zxvf player-15.5.2.tar.gz
cd vmware-host-modules-player-15.5.2
make

ビルド時にエラーが出てしまう。うーん。

まあ、仮想PCを使いたい時はメインPCを使うことにしよう…。そもそもサブPCは動作が遅いし…。

#2 [anime][neta] 美少女ロボットと暴走設定

思考メモ。

BS松竹東急で、「プラスティック・メモリーズ」というアニメが再放送されているのだけど。その映像を眺めながらなんとなく疑問が湧いた。

どうしてアニメに登場する美少女ロボットは、えてして暴走設定が付加されてしまうのだろう…。先日放送が終わった「プリマドール」もそうだし、「Vivy」もそうだし…。

例えば「To Heart」に登場するマルチに暴走設定がついてたら、あそこまで人気が出なかったのではないかと想像したりもするわけで。殺人鬼と化して主人公を襲ってくるマルチとか、ソレちょっと違うよな…。勘弁してよって感じだよな…。

そう考えると、暴走設定を付加しなければもっと人気を博した作品も実はあったのではないかと思えてくる。いやまあ、「プラメモ」がそうだったなと思うのだけど。「あの設定要らねえよ」「アレで全部台無しだよ」という感想を結構見かけた記憶もあるわけで。

と、ここまで書いて気が付いた。ひょっとして、これもまた「ブレードランナー」の影響なのではないか。日本の漫画やアニメは、とにかくあの映画から影響受けまくりだけど、こういうところでも影響を受けまくったのではないか。「人間型のロボットなら当然暴走しないとね」というテンプレは、実はブレランによって刷り込まれてしまったのかもしれない。

と思ったりもしたけれど、そもそも「鉄腕アトム」からして暴走してたような気もしてきた…。いや、アレは暴走というより、人間達に対して反旗を翻すソレかな…。

いや待て。反乱云々という捉え方まで行ってしまうと、そもそもロボットというワードが出てきた作品にまで辿り着くのでは…。

_R.U.R. - Wikipedia

ロボットである以上、人間に反旗を翻さないといけない。それがロボットの宿命、なのだろうか?

設定開示のタイミング。 :

それはさておき。今になって考えると、「Vivy」の設定開示のタイミングは実に上手かった気がする。

他作品は、ロボットの暴走設定を結構途中まで隠してしまったりするので…。序盤のアットホームなやり取りを見て、視聴者が「このロボット少女可愛いなあ」「これからもこういうのが見られるんだろうな」と期待してたら、そのうちロボット少女が悪魔に変貌しちゃって、見ていてガッカリしてしまう。そして「暴走設定なんて要らなかったよなあ」と言い出したりもする。

序盤で、本来の路線とは違う路線をしっかり期待させちゃって、しかしそれが裏切られるから、当然ながら作品全体に対してあまりいい印象を持たれない。そりゃ不人気作品になりますな…。

しかし「Vivy」は、1話目からして「こいつらそのうち暴走するんでなんとかしてちょーだい」とヒロインに説明するところから話が始まる。だから、その後どんなに可愛いロボットが出てきても、視聴者達は、「こんなに可愛いのに…でもそのうち悪魔になっちゃうのね…」とある種の覚悟を持った上で視聴を続けるので、何ら裏切られた気持ちにはならないわけで。

そのあたり、本家本元であろう「ブレードランナー」との共通点を感じる。最初から「こいつらイケメン美女だけど暴走するんで捕まえてくれや」と説明してある。いや。ちょっと待て。「ブレラン」ってそうだったっけ? アレも隠してなかった? どうだったっけ? 大昔に見てそれっきりだから、そのへんどうなってたかちょっと記憶が怪しい…。

何にせよ、ロボットの暴走設定を付加すること自体は特に問題無いのだけど、その設定は最初から開示しておいたほうがいいでしょう、そんなもん後生大事に隠しておいても良い結果に繋がりませんぞ、という話になりそうだなと…。

そういえば、エヴァもそういうところがあるような気がしてきた。いきなり2話で暴走してたから、そこからずっと視聴者側はある種の覚悟ができていた。

アレがもし、ずっと暴走しない清らかな(?)姿のまま話が進んで、最後のあたりでいきなり暴走を始めたら、自分達は一体どんな印象を受けていただろうか…?

暴走するする詐欺。 :

暴走するなら最初に設定を開示しておいたほうがいいのでは、と思えてきたわけだけど。それを逆手にとって、コイツラ暴走するよー、とずっと言われてるのに暴走しなかったらどんな印象になるのかな、と疑問が湧いた。

周囲のロボットキャラがどんどん暴走していくのに、最後まで暴走しないで正気を保って主人公に尽くすロボット少女とか。一見暴走しているようでいて、実は正常に動いていて、常に主人公を助けるべく振舞っていたロボット少女とか。そういうの、どうよ?

おそらく、視聴者側は、「このロボット少女、偉いなあ。健気だなあ」と好印象を持つのではあるまいか。たぶん。悪い方向で期待を裏切るのではなく、良い方向で期待を裏切ってくれる、とでもいうか…。

と書いたところで気が付いた。それってあのアニメじゃん。 *1 なるほど、それが泣かせるためのテクニックの一つだったのね…。健気さを感じさせるところがポイントなのだな…。そして、視聴者側が健気だなと感じてたキャラが、あんなことになるという…。なるほどねえ…。

思考メモです。オチは無いです。

*1: 先日まで放送されてた、Keyブランドのアニメ。

2022/10/07(金) [n年前の日記]

#1 [ubuntu] xfce4 Keyboard LEDs plugin を Ubuntu 22.04 LTS上でビルドしてインストール

Ubuntu Linux 22.04 LTS + Xubuntu-desktop (Xfce4) のパネル上に、キーボードの NumLockその他の状態を表示してくれるアイテム、Keyboard LEDs plugin を追加したい。

_projects:panel-plugins:xfce4-kbdleds-plugin [Xfce Goodies]

_mieki256's diary - Xfce4 Keyboard LEDs plugin を Ubuntu 18.04 上でビルドしてインストールしてみた

Ubuntu 18.04 LTS の時点で削除されてしまったアイテムらしいけど、当時はビルドしてインストールすれば一応使えたので、Ubuntu 22.04 LTS でも同じように導入できないものかなと…。

必要なパッケージをインストール。 :

必要なパッケージをインストール。
sudo apt install git build-essential
sudo apt install xfce4-dev-tools libxfce4util-dev
sudo apt install libxfce4ui-2-dev
sudo apt install libxfce4panel-2.0-dev

Ubuntu 18.04 LTS と Ubuntu 22.04 LTS では、パッケージ名が一部違っていた。
  • libxfce4ui-1-dev は libxfce4ui-2-dev になった模様。
  • xfce4-panel-dev は見当たらなかった。
  • libxfce4panel-2.0-dev というパッケージのインストールも必要な模様。

ソースの入手とビルド。 :

以前は、https://github.com/xfce-mirror/xfce4-kbdleds-plugin にソースがあったらしいけど、検索してみたら 404 になってた。ただ、以下のURLで残してくれてる方が居るようで。使わせてもらおう…。

_oco2000/xfce4-kbdleds-plugin: This is a keyboard leds plugin for the Xfce panel

git clone https://github.com/oco2000/xfce4-kbdleds-plugin.git
cd xfce4-kbdleds-plugin
./autogen.sh

パッケージが足りないと警告が出てきた。
*** The required package libxfce4panel-2.0 was not found on your system.
*** Please install libxfce4panel-2.0 (atleast version 4.12.0) or adjust
*** the PKG_CONFIG_PATH environment variable if you
*** installed the package in a nonstandard prefix so that
*** pkg-config is able to find it.

足りてなかったパッケージをインストールしつつ、再度ビルド。
sudo apt install libxfce4panel-2.0-dev

./autogen.sh
./configure --prefix=/usr
make
sudo make install

./autogen.sh や ./configure --prefix=/usr で Makefile を作成・調整して、make でビルドする。ビルドができたら、sudo make install でしかるべき場所に実行バイナリ等をコピーしてインストールする。

Xfce4のパネルを右クリックして、パネル → 新しいアイテムを追加する、を選ぶと、追加できるアイテムの一覧が表示される。その中に、kbdleds Plugin というアイテムがあるので選んで追加。

これで Keyboard LEDs plugin が使えるようになった。と思う。たぶん。一応、NumLockキーを叩いたら反応してるし…。

2022/10/08() [n年前の日記]

#1 [windows] 無料で使えるOCRをいくつか試用

Windows10 x64 21H2 上で、無料で使えるOCRをいくつか試用してみた。いやまあ、以前も試用したことはあるのだけど…。

_mieki256's diary - Tesseract OCRを試用

QuickOCRを試用。 :

Windowsに標準で入っている OCR 機能を使って処理するソフトらしい。日本語と英語の読み取りに対応している。読み取り結果はウインドウ内に表示される。

_QuickOCR
_QuickOCR - k本的に無料ソフト・フリーソフト

QuickOCR-v1.04.zip を入手して解凍。今回は、C:\Prog\QuickOCR\ に置いておいた。

QuickOCR.exe を実行するとウインドウが開く。「範囲選択」ボタンをクリックしてから、デスクトップ上の任意の場所をマウスドラッグで選択すると、 ウインドウ上に読み取り結果が表示される。

NormCapを試用。 :

オープンソースのOCRエンジン、Tesseract を利用して、読み取り処理を行うソフト。Windows、Linux、Mac に対応しているらしい。読み取り結果はクリップボードに入る。

_NormCap
_tesseract-ocr/tessdata_best at 4.1.0
_NormCap のダウンロードと使い方 - k本的に無料ソフト・フリーソフト

NormCap-0.3.12-x86_64-Windows.msi を入手して実行。インストール場所の指定はできないようで、以下の場所に問答無用(?)でインストールされた。
C:\Users\(USERNAME)\AppData\Local\Programs\dynobo\NormCap\

日本語の読み取りにも対応させたい時は、 _tessdata のページ から、jpn.traineddata、jpn_vert.traineddata を入手して、以下の場所にコピーしてやる。
C:\Users\(USERNAME)\AppData\Local\normcap\tessdata\
ちなみに、*_vert は、縦書きの読み取りに対応させるためのデータ。

実行すると、デスクトップの任意の領域を指定するキャプチャ状態で起動する。読み取った部分は、クリップボードにテキストとして記録されるので、エディタ等を開いて貼付けしてやれば読み取り結果を利用できる。

一度起動すると、タスクトレイにアイコンが表示されて常駐状態になる模様。

タスクトレイのアイコンを右クリック → Capture を選ぶことで、再度キャプチャと読み取りをすることができる。

設定は、キャプチャモード状態の、右上の歯車アイコンをクリック。Languages の select を選んで、jpn にチェックを入れれば、日本語にも対応する。

日本語の読み取り結果は、何故か一文字ずつ半角空白が入ってしまう。エディタ等で空白を除去するように置換処理をする必要がありそう。

gImageReaderを試用。 :

オープンソースのOCRエンジン、Tesseract は、コマンドラインで利用できるツールだけど、それでは使う際に不便だろうということで、GUIで操作できるフロントエンドツールがいくつか公開されている。

_GUIs and Other Projects using Tesseract OCR | tessdoc

前述の NormCap もその一つだけど、gImageReader というソフトも気になったので試用。Windows と Linux に対応してる。

_manisandro/gImageReader: A Gtk/Qt front-end to tesseract-ocr.

今回は、ポータブル版、gImageReader_3.4.0_qt5_x86_64_portable.zip を入手。解凍して、D:\Prog\gImageReader_portable\ に置いてみた。

bin\gimagereader-qt5.exe を実行するとウインドウが開く。メニュー等は最初から日本語化されていた。

ウインドウの一番右に設定アイコンがあるのでクリック。言語を管理、をクリックすると、日本語用のデータをインストールすることができる。以下にチェックを入れて「適用」をクリックすれば、日本語用のデータをダウンロードして、日本語の読み取りにも対応した状態になる。
日本語 [jpn]
日本語 縦書き [jpn_vert]
Japanese [スクリプト]
Japanese_vert [スクリプト]

ウインドウの左のほうにアイコンが並んでいて、その中のカメラアイコンをクリックすると、デスクトップ全体のスクリーンショットを撮ることができる。

読み取りたい部分をマウスドラッグで指定して、上のほうの読み取りアイコンをクリックすれば、ウインドウの右側に読み取り結果が表示される。

読み取りアイコンの右側の旗っぽいアイコンをクリックすれば、どの言語で読み取るかを指定できる。

Tesseract-OCRを試用。 :

せっかくだから、コマンドラインで利用できる、Tesseract-OCR もインストールしておいた。

_Home - UB-Mannheim/tesseract Wiki

tesseract-ocr-w32-setup-v5.2.0.20220712.exe を入手して実行。インストーラが起動する。今回は、D:\Prog\Tesseract-OCR_x86\ に入れておいた。

インストールの途中で、どの言語データをインストールするのかも尋ねてくるので、jpn、jpn_vert、japanese、japanese_vert 等にチェックを入れてインストールする。ちなみに、*_vert は、縦書き用データ。

使い方は以下。入力画像ファイル名(INPUT.png)、出力ファイル名(OUTPUT_FILE)、利用言語(-l eng or -l jpn)を指定する。
tesseract.exe INPUT.png OUTPUT_FILE -l eng
tesseract.exe INPUT.png OUTPUT_FILE -l jpn

#2 [basic] Tiny Basic for Windowsを試用

CP/Mエミュレータを試用しているうちに、ふとなんとなく、Tiny Basic について興味が湧いてきた。ググってみたら、Tiny Basic for Windows というBASICがあるらしいと知ったので、少し触ってみることにした。環境は Windows10 x64 21H2。

_tbasic

tbw151set.zip をDLして解凍。任意のフォルダに置く。今回は、D:\home\prg\basic\TBasic\ に置いておいた。

TBasic.exe を実行すると、編集ウインドウと実行画面ウインドウが開いた。

この時点で、なんだか妙だなとようやく気が付いた。一般的に、Tiny Basic と言ったら、小さいバイナリサイズでそこそこ動く BASIC の類ではなかったか…。こんなにゴージャス(?)な画面が出てくるのは、おかしい…。リッチ過ぎる…。これは本当に Tiny Basic なのだろうか…?

ヘルプファイルを開いて眺めてみたら、謎が解けた。これは一般的な Tiny Basic ではなくて、N88BASIC の Tiny 版と言う意味で Tiny Basic を名乗っていたらしい。自分が期待していた Tiny Basic ではなかった…。

実は,Tiny Basic と言うと,コンピュータの歴史の中では特別な意味を持ちます。 1970年代の初期のマイクロコンピュータ(現在ではパーソナルコンピュータ)では, RAM が数キロバイトしかありませんでした。このコンピュータ上で BASIC を動かすために,当時既に,大型機上で動作していた BASIC のサブセットを極めて小さなメモリーで動かすことが考えられ,2〜3Kのメモリーで動作する BASIC が開発され,それを Tiny BASIC と呼びました。

この Tiny Basic は 1975年,Dr. Li-Chen Wang が Palo Alto マイクロコンピュータ用に,元々書いたものといわれています。これは Dennis Allison によって,Altair 8800 用に移植され,そのソースは1976年公開されました。以後,この ソースを基にした多くのコンピュータへの移植版が作られ,それらは Tiny BASIC 或いは Tiny BASIC 系言語といわれています。

このように,Tiny BASIC はコンピュータの歴史においては特定の意味を持つ名前ですが,この Tiny Basic for Windows は,これらの Tiny BASIC 系言語とは,実は関係はありません。

元々はこの Tiny Basic for Windows は DOS 版としての Tiny Basic からスタートしましたが,ここでの Tiny は当時標準的に使われていた,N88BASIC のサブセットとして,作成され,N88BASIC に比べて Tiny であるという意味から,Tiny Basic と言う名前をつけました。ですから,この当時の Tiny Basic は正確には A Tiny N88BASIC と言うものです。

それはさておき、せっかくだから少し触ってみたけれど、プログラミング学習用としてはたしかにイイ感じだなと。

もっとも、学習用なら Microsoft Small Basic なども選択肢として良さそうな気もする。

_「Microsoft Small Basic」初心者向けプログラミング言語の開発・実行環境 - 窓の杜

ただ、Microsoft Small Basic は、自分の手元の環境では 1.2 は動いたけど最終版の1.3が動かなかったりしたので、そういうところで躓くようでは学習用環境として論外かもしれないと思ったりもする。動く環境もあれば、動かない環境もあるというのがなんとも…。「どうしても使いたかったらWindowsを再インストールしろ」なんて回答されちゃうようではダメだよな…。

_mieki256's diary - Microsoft Small Basic が起動しない
_small basic 1.3 が起動しません - Microsoft コミュニティ
_SMALL BASIC 1.3 does not appear on the screen ... - Microsoft Q&A

2022/10/09() [n年前の日記]

#1 [basic][z80] CP/Mエミュレーター上でTiny Basicをアセンブル

Windows10 x64 21H2 + CP/Mエミュレータ YAZE-AG 2.51.2 上で、Tiny Basic をアセンブルできそうか試してみた。以下のページが参考になった。

_ソフトウェアー基礎コース (Tiny BASIC Lesson 2: CP/M によるコンパイル・アセンブル)
_古典電脳物語-80系プログラムの開発

上記解説ページを参考にしてそのまま作業してみた。TBCPM.zip をDLして解凍。中には以下のファイルが入ってる。
TBCPM.ASM がソースファイル。Windows側の操作で、YAZE-AGインストールフォルダ/bin/disksort/ 以下にコピーしておく。

YAZE-AG 2.51.2 CP/M 3.1 を実行。./disksort/ を C: に割り当ててから、Aドライブに .asm をコピー。
sys mount c ./disksort
PIP A:TBCPM.ASM=C:TBCPM.ASM

アセンブルして実行ファイル .COM を作成。
B:MAC TBCPM.ASM
LOAD TBCPM.ASM

YAZE-AG 2.51.2 CP/M 3.1 を終了して、YAZE-AG 2.51.2 CP/M 2.2 を実行し直し。というのも、CP/M 2.2 じゃないと、Tiny Basic の 終了コマンド、system が正常に動作しないらしい。

tbcpm と打って実行。それらしく動くか確認する。

system と打って終了。

YAZE-AG自体の終了は、sys と打ってから quit を打つか、あるいは E.COM を実行(e と打って Enter)。

2022/10/10(月) [n年前の日記]

#1 [basic][z80] Altair 8800 simulator を試用してTiny Basicをアセンブルできるか確認

Windows10 x64 21H2 + Altair 8800 simulator で、Tiny Basic をアセンブルできるのか試してみた。以下の記事を参考にして作業。ありがたや。

_海谷の凧: CP/M2.2とTINY BASIC

Altair 8800 simulator というのは、Altair 8800 というレトロPCをエミュレーションできるソフト。らしい。

_Altair 8800 - Wikipedia

CP/M を動かして、当時のアレコレを利用することができる。

たしか以前も少し触ったような記憶が…。

_mieki256's diary - Altair 8800 simulator を試用

Altair 8800 simulatorをインストール。 :

入手ページは以下。

_Altair Introduction
_Altair Programming Languages

altairz80.zip、cpm2.zip、bdsc.zip を入手。解凍して、中に入っているファイルをどこか任意の場所にコピーする。全ファイルを1つのフォルダの中に入れておいた状態にする。

Tiny Basicのソースを入手。 :

Tiny Basic のソースファイルを入手。

_8bit CPUのBASIC 処理系 | たけおか ぼちぼち日記

pbas.asm を入手して、Altair 8800 simulator のインストール場所にコピーしておく。

ただ、pbas.asm のリンク先が ftp なので、今現在のWebブラウザではDLできない。今のWebブラウザは、しばらく前に軒並みftp非対応になってしまった。昔は対応していたのだけどな…。一応、IE11ならftpにも対応しているので、IE11が動くなら、ソレを使って pbas.asm を入手できる。

アセンブル。 :

Altair 8800 simulator を起動。bdsc を指定して、CP/M 2 と BDS-Cコンパイラが使える状態で起動させる。
altairz80.exe bdsc

B: に BDS-C関係のファイル(CC.COM や CLINK.COM)が入ってる。B: と打って、カレントドライブを B: に変更。
 B:

R.COM を使って、Windows側で管理しているファイルの中から、pbas.asm を、CP/M側のカレントドライブにコピーする。
 R PBAS.ASM
 DIR B:PBAS.*
B>DIR B:PBAS.*
B: PBAS     ASM

ASM と LOAD を使って、PBAS.COM を生成する。
 ASM PBAS
 LOAD PBAS

Tiny Basic の実行形式ファイル、PBAS.COM が生成された。

Tiny Basicの動作確認。 :

実行して、Tiny Basic らしく動くのか確認。
 PBAS

コマンドその他は大文字しか受け付けないので注意。

簡単なプログラムを打ってみよう…。
10 FOR I=0 TO 5
20 PRINT I, "  Hello World!!"
30 NEXT I

 LIST
 RUN
>LIST
  10 FOR I=0 TO 5
  20 PRINT I, "  Hello World!!"
  30 NEXT I

 OK
>RUN
     0  Hello World!!
     1  Hello World!!
     2  Hello World!!
     3  Hello World!!
     4  Hello World!!
     5  Hello World!!

 OK

PBAS の終了は、SYSTEM と打つ。
 SYSTEM

Altair 8800 simulator 自体の終了は以下。
 halt
 quit

YAZE-AGでも試してみた。 :

YAZE-AG 2.51.2 上でもアセンブルできるか試してみた。ASM を使うところを B:MAC に置き換えただけで、同様にアセンブルできた。
 B:MAC PBAS
 LOAD PBAS

R.COM と W.COM。 :

YAZE-AG もそうだけど、R.COM と W.COM というのが入っていて、一体コレは何だろう、何に使うのだろうと不思議だったけど。どうやら、Windows (もしくは Linux)側で管理しているファイルにアクセスするためのプログラムだったらしい。

  • R.COM : Windows側が管理するファイルを、CP/M側のカレントドライブに読み込む(ファイルをコピーする)。
  • W.COM : CP/M側が管理するファイルを、Windows側のカレントディレクトリに書き出す(ファイルをコピーする)。

こういうプログラムがあるなら、Windows側でエディタを使ってファイル編集してから、そのファイルを CP/Mエミュレータ側にコピー、といった流れで作業できそうだなと…。CP/M側で無理矢理どうにかファイル編集をしなくても済みそう。

2022/10/11(火) [n年前の日記]

#1 [nitijyou] 体調がよろしくない

一昨日ぐらいから喉が痛い…。熱は無いのだけど…。ここ数日急に寒くなったので風邪でも引いたのだろうか。まさかコロナ…。とりあえず横になっておこう…。

#2 [pc][mz][z80] S-OS SWORDが気になる

CP/M関係についてググってるうちに、S-OS についてもググり始めてしまった。

S-OSというのは、大昔に、Oh!MZ, Oh!X というPC雑誌上で展開されていたソフトのシリーズ、という説明でいいのだろうか。Z80 CPUが載ったPC上で、各サブルーチンを呼び出すためのアドレスを統一しておくことで、機種が異なってもアプリケーションのバイナリ自体は同じものを利用できるようにする、BIOSに近いレベルのOSで…。発想としては、CP/M や MS-DOS に少し近いのだろうか。

ただ、S-OS上で動くアプリのバイナリは今でもネットから入手できるものの、肝心の、各機種毎のS-OSのバイナリ自体が配布されてないようで。

S-OS上で動く、Fuzzy Basic なる Basic の仕様が気になるのだよな…。ググってみても命令表すら見つからないので正体不明で…。何にせよ、S-OS が無いのでは、Fuzzy Basic も動かせないわけだけど…。

余談。「CP/M 自作」でググったら、自作のZ80ボードの記事がいくつか出てきて、世の中には凄い人達が居るもんだなと。でも、どれもデカい。今なら1チップにできたりしないのだろうか。それとも、既存の手のひらサイズのボードでエミュレーションしちゃうほうが現実的なのだろうか…。

著作権保護期間が70年なのは良くないと思う。 :

思考メモ。

レトロPCのハードウェアは工業製品として分類されるから、20〜25年ぐらいで権利は切れるらしいのだけど。そのレトロPC上で動いていたOSやアプリはソフトウェアとして分類されるから困るのだよな…。

ソフトウェアは、おそらく最低でも発売されてから70年経過しないと権利が切れないのだろうし。あるいは、ソフトウェアの作者が誰なのか分かっていて、しかもずっと御存命だったら、死後70年は保護しましょうという話になってしまうだろうし…。どのみち勝手に配布するわけにはいかない。エミュレータがあって、アプリのバイナリが入手可能でも、その両者を繋いでくれるOSだのBASICだのが入手できないから、当時の操作感覚を試すことすらできない。

そのソフトウェアに思い入れを持っていて、「これは後世に残しておきたい」と思った人達も、著作権が切れて「さあ、配布できますよ」となった頃には死んじゃってる可能性が高く…。何ら思い入れの無い人達が、それらを後世に残すべく努力してくれるとも思えない。つまり、膨大な数の、歴史的価値を持つ著作物が、後世にちゃんと残せる形で保護されない状態に置かれて、消えていくのは間違いないよなと…。

例えば CP/Mは、「これもう商業的価値が無いソフトウェアだから学習用その他の用途で使ってもええよ」ということで、著作者は権利を手放していないけど配布はされていて、誰でも当時のPCの操作感覚を味わうことができるわけだけど。日本でもそういう流れを作れないものか…。X68K関係の一部のソフトウェアはソレに近いことができてた時期があるらしいので、条件が整えば不可能ではないのだろうけど。

レトロPC上で動いてたソフトウェアに商業的価値があるなら今も販売されてるはずだけど、そういう話はほとんど聞かないし。しかし、商業的価値が無いからこんなもんは消滅しても構わないのだと決めつけられてしまうのもおかしい話のような気がする。

現状の法律は、著作物を保護しますと言いつつ、逆に結構な数の著作物を保護できない状態に追い込んでる気がする。特定の条件に合致してしまう著作物は例外としてコレコレこういう扱いも可能にしましょう、そうすることで消滅だけは回避できるでしょう、みたいな何かが欲しい気もする…。

まあ、何もかも国会図書館あたりに入れといて、時期が来たらネット上に粛々と開放されます、とかでもいいんだけど。

2022/10/12(水) [n年前の日記]

#1 [pc][windows][mz][z80] X1エミュレータでS-OSを動かしてみたい

S-OSについてググってたら、当時は標準的な環境として X1 や MZ-2000 を想定していた、という話を見かけた。

_THE SENTINEL

X1/MZ-2000は横80文字が表示できるけど、MZ-80K/C/1200/700/1500 は横40文字しか表示できないので、後者は標準環境とは言い難い、という状況だったらしい。

であれば、X1エミュレータを使ってS-OSやS-OSアプリを動かしてみたほうが、本来のS-OSの操作感覚を体験できるのかなと。幸い、X1用のS-OSであれば、高速版なるものが前述のページで配布されているようだし…。

そんなわけで、X1エミュレータについて少し調べてみた。

環境は Windows10 x64 21H2。

X1エミュレータを導入。 :

ググって辿り着いたのは、以下のエミュレータ。

_eX1 / eX1twin / eX1turbo / eX1turboZ / ePCEngine 謎WIPページ
_Common Source Code Project
_X millennium 0.60a
_X millennium 0.26d
_X millennium T-tune + ikaTune

以下でも、色々なエミュレータが紹介されていた。

_Sharp X1 emulators - Emulation General Wiki

しかし、Common Source Code Project (binary.zip) の eX1 (binay_win10/x1.exe) を実行してみたら、画面が真っ暗なまま。

以下に引用するけれど、実機の IPL ROM、フォントROMが必要になるらしい。
  • IPLROM.X1 / IPL.ROM X1 IPL ROM 4KB ($0000-$0FFF)
  • FNT0808.X1 / ANK8.ROM 8x8 ANK Font ROM
  • FNT0816.X1 / ANK16.ROM 8x16 ANK Font ROM
  • FNT1616.X1 / KANJI.ROM 16x16 Kanji Font ROM
  • SUBROM.X1 X1 Sub CPU Internal ROM
  • KBDROM.X1 X1 Keyboard CPU Internal ROM
  • IPLROM.X1T / IPL.ROM X1turbo IPL ROM 4KB ($0000-$0FFF)
  • SUBROM.X1T X1turbo/X1G Sub CPU Internal ROM (*)
  • KBDROM.X1T X1turbo Keyboard CPU Internal ROM

結局実機が必要になるのね…。

ただ、X1用の互換IPL ROM、互換フォントが公開されているようで。ありがたや。

_meister68k/X1_compatible_rom: SHARP X1 (CZ-800 series) compatible free IPL ROM.
_meister68k/X1_compatible_font: SHARP X1 (CZ-800 series) compatible free font ROM, comes from Misaki Font.

互換IPL ROM の X1_compatible_rom.bin を IPLROM.X1 にリネーム。互換フォントROM、FNT0808.X1 と一緒に、x1.exe と同じ場所に置く。

ちなみに、X millennium 系はROMファイルが無くても動作するらしい。ありがたや。

更に、X millennium 0.60a を実行すると、フォルダ内に FNT0816.TMP、FNT1616.TMP というファイルが作成される。この2つを、FNT0816.X1、FNT1616.X1 にリネームして、eX1 のフォルダに入れれば、eX1 でも 8x16、16x16 のフォントが使えるようになるらしい。

S-OSをロード。 :

以下のページから、「X1/C/D/Cs/Ck/F/G/Twin(高速版)」のD88イメージ(SWXCV110.d88)を入手。X1エミュレータと同じ場所に置く。

_THE SENTINEL

.d88 って何だろう…。おそらくだけど、ディスクイメージなのかな。

X1エミュレータを実行して、メニューのFD0を選択。SWXCV110.d88 を指定。

画面上で、どのドライブからシステムを読み込むのかメニューが表示されているので、0キーを叩いてFD0から読み込み。

S-OS が読み込まれて入力待ちになった。

しかし…。S-OSのアプリは .obj というファイル形式で配布されているようで…。これ、どうやって読み込んだらいいんだ…。.d88 に変換しないとダメなのかな…。

#2 [windows] Sモードの罠

親父さんの御友人からPCトラブル相談。 PM06:00頃、ノートPCとプリンタ(Canon TS6330)を、わざわざこちらまで持ってきてくれた。

CanonのサイトからドライバをDLして実行してみたら、たしかに見たことがない警告画面が…。「インストールしようとしているアプリは、Microsoft 検証済みアプリではありません」と表示されてしまう。

_富士通Q&A - [Windows 11] 「インストールしようとしているアプリは、Microsoft 検証済みアプリではありません」と表示されます。 - FMVサポート : 富士通パソコン

本来であれば、スタート → 設定 → アプリ → アプリの詳細設定 → アプリと機能 → 「アプリを入手する場所の選択」、で、「場所を選ばない」に変更すれば解決するはずなのだけど。なぜか、「アプリを入手する場所の選択」という項目自体が存在しない…。

管理者権限のアカウントじゃないと項目が表示されない、標準ユーザーでは出てこない、という話も見かけたけれど、サインインしてるアカウントは、しっかり管理者権限で…。

設定画面内を少し探した程度では項目が見つからず、これはかなりググってみないと対処方法が分からないな、と…。ひとまず、ノートPCとプリンタを置いていってもらって、印刷可能な状態になるまで自分が試行錯誤してみます、という話になった。

その後も色々ググってたら、Windows11 のSモードなる情報に辿り着いた。

_Sモードの解除方法【Window 11】 - パソコン市場サポート
_富士通Q&A - Windows 10 / Windows 11のS モードを解除する方法を教えてください。 - FMVサポート : 富士通パソコン

コレか。コレじゃないのか。システム情報を確認してみたら、しっかり「Sモード」と表示されていた…。

Sモードの解除は、設定 → システム → ライセンス認証 → Sモード → Microsoft Store を開く。Microsoft Store 上で「Sモードから切り替える」→「入手」をクリック。

ただ、Sモードを解除すると、元には戻せないそうで。しかし、プリンタ印刷すらできない状態では話にならないわけで、これは解除する以外無いよなと…。

Sモードを解除したら、プリンタドライバもすんなりインストールできたし、テストページも印刷できた。印刷できるようになったことを相手の方に連絡。PM09:00頃にお渡しした。一時は途方に暮れてしまったけど、解決できて良かった。

こういうモードがあったのだな…。情報をチラチラ見かけていた気もするけど、すっかり失念していた。勉強になった。メーカ製のPCだから、おそらくセキュリティ的に最も安全な状態で出荷しているのだろう。そして、「ここから先は自己責任でどうぞ」ということだろうな…。

2022/10/13(木) [n年前の日記]

#1 [pc][windows][mz][z80] S-OSアプリをX1エミュレータで動かすための下準備

かつて、Z80 CPU を搭載していた日本製レトロPC上で、共通のバイナリを動かせる、S-OS という仕組みがあったわけだけど。X1エミュレータを利用して、その操作感覚を体験してみたいなと。

環境は Windows10 x64 21H2。

念のために書いておくけど、X1 というのは SHARP が販売していた 8bit PC。

_X1 (コンピュータ) - Wikipedia
_SHARP X1シリーズ | ひみつの屋根裏部屋

S-OSアプリの入手先。 :

S-OSのアプリのバイナリは以下で入手できる模様。ありがたや。

_THE SENTINEL
_S-OS

前者では .obj ファイルがDLできる。後者では .mzt ファイルがDLできる。

.objファイルとはなんぞや。 :

まず、.mzt ファイルについて。これは、カセットテープに入っている1ファイル分を模したファイル形式。例えば MZ-700エミュレータで、カセットテープから何かのファイルを読み込んで…といった流れで操作する場合は .mzt が利用できる。

対して、.obj ファイルは…。これはどうやら UNIX or Windows用のS-OS SWORD で利用するためのファイル形式、らしい。たぶん。

一応念のために書いておくけれど。ここでいう .obj は、前述のページで入手できるファイルに限定した話で…。.obj という拡張子は、色々な場面で、色々なアプリが、全く異なるフォーマットで生成したり利用したりしているので、「.obj = S-OS関連ファイル」と思い込まないでほしいなと…。

さておき。ここでいう.obj ファイルは、アプリの本体バイナリの前 ―― ファイルの先頭に、18 byte (16進数なら 0x12 byte) のヘッダ部分がついているらしい。ヘッダ部分 + 本体バイナリ = .objファイル、ということかなと。

_古籏氏のサイトのファイルと、Oh!石氏のサイトのS-OS用のファイルのMZT化
_S-OS "SWORD"
_S-OS SWORD最強伝説

このヘッダ部分には、おそらく以下のフォーマットで、ロードアドレス(そのファイルを配置してほしいメモリ領域の先頭アドレス)や実行アドレス等々の情報が入っている、ように見えた。

AddressSizeDescription
0x00-0x034byteいわゆるシグネチャ相当。"_SOS" のASCIIコード。おそらく、S-OS関係のファイルであることを示している。
0x041byte区切り文字。0x20 (スペースのASCIIコード)が入っている。
0x05-0x062byteおそらくファイル種類。ASCIIコードで記述。"01"が S-OS用バイナリファイル。"02"がFuzzyBasicの.BASファイル等。他にも種類がありそう。
0x071byte区切り文字 (0x20)。
0x08-0x0b4byteロードアドレス。ASCIIコードで記述されてる。指定可能な範囲は 0x0000 - 0xffff。
0x0c1byte区切り文字 (0x20)。
0x0d-0x104byte実行アドレス。ASCIIコードで記述されている。指定可能な範囲は 0x0000 - 0xffff。
0x111byte終端文字。0x0a (ASCIIコードで LF)が入ってる。

バイナリエディタで開いた状態も載せてみる。なんとなく分かるだろうか…。

obj_header.png

ちなみに、前述のページから入手できる FuzzyBASIC (FUZZYBASIC.LZH) の中には、FUZZYBASIC、FZ_DRG.BAS の2つのファイルが入っていたけれど、どちらも拡張子として .obj がついてないものの、先頭部分に前述のヘッダ部分があった。全部確認したわけではないけれど、件のページで配布されてるファイルは、どれもヘッダ部分がついているのかもしれない。

.objのヘッダ部分を分離。 :

とりあえず、ヘッダ部分も一緒になっていると、X1エミュレータ + S-OS SWORD で読み込めないのではないかと思えてきたので…。試しに、バイナリエディタ FavBinEdit 1.2.5 を使って、前述のページから入手した INVADER.obj のヘッダ部分と本体バイナリを分離してみた。

_バイナリエディタ | FavBinEdit

INVADER.obj を開いて、先頭から18 byte (0x12 Byte) を選択。

split_hed_bin_ss01.png


右クリックして「切り取り」。

split_hed_bin_ss02.png


ツールバー上の「新規作成」をクリック。空のウインドウが開く。

split_hed_bin_ss03.png


右クリックして「貼付け」。

split_hed_bin_ss04.png


これで、ヘッダ部分と本体バイナリを分離できた。

split_hed_bin_ss05.png


  • ヘッダ部分は、INVADER.obj.HED として保存した。
  • 本体バイナリは、INVADER.obj.BIN として保存した。

ちなみに、INVADER.obj のロードアドレス、実行アドレスは、共に 0x3000 だった。この情報は後で必要になるので覚えておかないといけない。

と言っても、.HED を開いて確認すれば済む話だけど。ヘッダ部分(.HED) は全てASCIIコードで記述されているので、普通のテキストエディタで開いても内容が確認できる。

.d88ファイルとはなんぞや。 :

X1エミュレータにファイルを読み込ませるためには、拡張子が .d88 になってるファイルを経由する必要があるらしい。

.d88 って何だろうとググってみたら、どうやらフロッピーディスクのイメージファイルの模様。NEC PC-8801等のエミュレータで使われているイメージファイルフォーマット、なのだとか。

フロッピーディスクの容量としては、2D (両面倍密度、320KByte)を想定していることが多いように見えた。

_フロッピーディスク - Wikipedia
_D88形式フォーマット | HuDisk
_.D88形式のフロッピーディスクイメージフォーマット - (仮)
_wii88/FORMAT.TXT at master - jpzm/wii88

.d88にS-OSアプリのバイナリを含めてみる。 :

X1エミュレータで S-OSのアプリを動かすためには、S-OSのアプリバイナリを、この .d88 なる形式のファイルに収めてやらないといけない。さて、何をどうしたらいいのやら。

何か良いツールは無いものかとググっていたら、以下のページが参考になった。

_SONY SMC-777でS-OS SWORDを動かしました。 - tunozemichanの日記 / tunozemichan's diary

l3diskex というツールがあるらしい。ググってみたら、以下に遭遇。

_トップページ - 日立 ベーシックマスター レベル3 マーク5 / S1

L3 Disk Explorer (l3diskex) が正式名称で、日立ベーシックマスターのエミュレータ用に作られたツールらしい。コレを利用すればどうにかなりそう。ありがたや。

l3diskex_win32_060.zip を入手して解凍。l3diskex.exe を実行するとウインドウが開いた。

少し触ってたら、なんとなくやり方が見えてきたので、一応手順をメモ。

まず、新規ディスクを作成。ツールバー上の「新規」アイコンをクリック。

d88_impor_ss01.png


「ディスクの新規作成」ダイアログが開く。
  • 「カテゴリー」は「シャープ X1 Hu-BASIC」を選択。
  • 「ディスク名」は…今回は「GAME01」にしてみた。おそらく、大文字の英数字だけにしておいたほうが問題が起きにくい予感。

d88_impor_ss02.png

ここでちょっと疑問が湧くかもしれない。「S-OSから扱うディスクなのに、Hu-BASICなんか選んじゃっていいの…?」

むしろ、Hu-BASIC を選んだほうがいいらしい。と言うのも、S-OS のディスクフォーマットは Hu-BASICと同じにしてあるそうなので…。

_S-OS Sword Ver2.0 (J)(1986-02)(Oh!mz) [mz80K][type-in].txt
ディスクフォーマット

ディスクのフォーマットはHuBASICと同じにしました。
つまり、S-BASICと比べるとディスクの表裏が逆、記録されるデータはビットが反転しています。
これは、現在S-OSを移植中のマシンとの関係も合わでて、こちらのほうが一般的かつ合理的であると判断したからです。


さておき。GAME01 というディスクが新規作成された。

d88_impor_ss03.png


この「GAME01」をクリックすると、「FATがおかしいよ」と言ってくる。フォーマットが必要なのだろう…。

d88_impor_ss04.png


右クリックして「BASIC用にフォーマット」を選ぶ。

d88_impor_ss05.png


BASICの種類を選択する。「X1 Hu-BASIC (3インチ/5インチ2D)」を選択。あらかじめこうして用意してあるなんて、本当にありがたい…。

d88_impor_ss06.png


「中身が全部消えるけどいいのか?」と尋ねてくるので「いいですよ」と。

d88_impor_ss07.png


これでフォーマットはできたはず。S-OSのアプリバイナリを含めてみる。ツールバー上の「インポート」をクリック。

d88_impor_ss08.png


先ほどヘッダ部分と本体バイナリを分離した、INVADER.obj.BIN を選択。今回はコレを入れてみる。

d88_impor_ss09.png


ファイルをインポートするウインドウが表示される。
  • 「ディスクイメージ内のファイル名」を指定。ここもおそらく、大文字の英数字にしておいたほうが問題が起きにくい予感。
  • 「ファイル種類」は「Bin」にしておく。
  • 「ロードアドレス」「実行アドレス」を指定。INVADER.obj.HED には「3000」と書かれてたので、それに従って入力。
  • 一応、「全ての日付を無視する」にチェックを入れておいた。
d88_impor_ss10.png

ちょっと注意点。もしかすると、上記のウインドウとは違うウインドウが出てくる時があるかもしれない…。ディスクの新規作成から続けて作業した時は、大体このウインドウになるのだけど…。違うウインドウが出てくる時の条件は、まだ分かってない。

さておき。これで、S-OSのアプリバイナリを、ディスクイメージに含めることができた。

保存アイコンをクリックして、ディスクイメージを保存する。

d88_impor_ss11.png


「GAME01.d88」というファイル名で保存してみることにした。

d88_impor_ss12.png


今日はここで時間切れ。X1エミュレータ + S-OS SWORD で、この .d88 から読み込む手順は明日メモする。

2022/10/14(金) [n年前の日記]

#1 [pc][windows][mz][z80] S-OSアプリをX1エミュレータで動かす

S-OS SWORD を X1エミュレータ上で動かして、S-OSアプリを実行する手順を把握したい。環境は Windows10 x64 21H2。

S-OSアプリのバイナリ(.obj)を、ヘッダ部分と本体バイナリに分離して、本体バイナリを .d88 イメージファイルに含めるところまでは昨日メモした。

_S-OSアプリをX1エミュレータで動かすための下準備

実際に操作してる様子は以下。

X1エミュレータを起動。 :

今回は、X1エミュレータとして X millennium 0.60a を利用させてもらった。IPL ROM やフォントROMが無くても動作するエミュレータらしい。ありがたや。

_X millennium

xmil060a.zip を入手して解凍。Xmillennium.exe を実行。

S-OS SWORDを入手してロード。 :

以下のページで公開されてる、「X1/C/D/Cs/Ck/F/G/Twin(高速版)」のD88イメージを入手する。

_THE SENTINEL

SWXCV110.zip を入手。解凍すると、中に SWXCV110.d88 が入ってる。コレを X1エミュレータのインストール場所にコピー。

X1エミュレータのメニュー → FDD-0 → Open、を選択。SWXCV110.d88 を開く。

X1エミュレータのメニュー → Emulate → IPL Reset。エミュレータのリセットがかかって、FDD-0 にセットした SWXCV110.d88 から S-OS SWORD が読み込まれて実行される。

S-OSアプリをロードして実行。 :

FDD-0 → Eject してから、FDD-0 → Open。昨日作成した GAME01.d88 を開く。

S-OSの画面上で、D と打つ。カレントドライブのフロッピーディスク(GAME01.d88)、の中に入ってるファイルの一覧が表示される。
#D
$4C Clusters Free
Bin  A:INVADER     .BIN:3000:430B:3000
INVADER.BIN というファイルだけが入ってることが分かる。その後に続く数値は、ロードアドレス、終了アドレス、実行アドレス、だろうか。

「L ファイル名」でロードができる。
#L INVADER.BIN
Loading INVADER     .BIN

実行アドレスが 0x3000 なので、「J アドレス」で、ロードしたバイナリを実行できる。
#J 3000

その他のコマンドは以下が参考になる。ありがたや。

_S-OS Sword Ver2.0 (J)(1986-02)(Oh!mz) [mz80K][type-in].txt

余談。INVADER.obj の遊び方。
  • 4キーと6キーで砲台の左右移動。
  • スペースキーで弾を撃つ。
  • ゲーム開始は、タイトル画面表示中にスペースキー押し。
  • 終了は、『ゲームプレイ中』に BREAKキー、らしい。Windows + X1エミュレータの場合、Shiftキーを押しながら Pauseキー、だろうか…?

FuzzyBASICを実行してみる。 :

S-OS上で動作する整数BASIC、FuzzyBASIC というアプリがあるらしい。動かしてみたい。

_THE SENTINEL

FUZZYBASIC.LZH を入手して解凍。FUZZYBASIC、FZ_DRG.BAS の2つのファイルが得られる。

ファイル名に .obj はついてないけど、どちらもヘッダ部分(ファイル先頭から18byte分)を含んでいるので、バイナリエディタの類で、ヘッダ部分と本体バイナリを、FUZZYBASIC.HED と FUZZYBASIC.BIN として分けて別ファイルにする。

L3 Disk Explorer を使って、FUZZYBASIC.BIN を d88イメージファイルに含める。
  1. ディスクを新規作成。「カテゴリー」は「シャープ X1 Hu-BASIC」を選択。「ディスク名」は「BASIC」にしてみた。
  2. 「BASIC」を右クリックして「BASIC用にフォーマット」。BASICの種類は「X1 Hu-BASIC (3インチ/5インチ2D)」を選択。
  3. 「インポート」をクリックして、FUZZYBASIC.BIN を選択。
  4. 「ディスクイメージ内のファイル名」は「FUZZYBASIC.BIN」にしてみた。ファイル種類は「Bin」を選択。
  5. ロードアドレスと実行アドレスは「3000」を入力。
  6. BASIC.d88 として、ディスクイメージを保存。

X1エミュレータのインストール場所に、BASIC.d88 をコピーして、 X1エミュレータを起動。S-OS SWORD を FDD-0 にセットしてロード。

FDD-0 に BASIC.d88 をセットし直して、「D」「L FUZZEYBASIC.BIN」「J 3000」で FuzzyBASIC を実行。
#D
$4A Clusters Free
Bin  A:FUZZYBASIC   .BIN:3000:69FF:3000

#L FUZZYBASIC.BIN
Loading FUZZYBASIC   .BIN

#J 3000

FuzzyBASICが起動すると、以下のメッセージが表示される。
* Fuzzy BASIC Interpreter ver 1.0 *
38397 bytes free
ready

フロッピー内のファイル一覧は…。思い付く単語を手当たり次第に打ってみたら、どうやら「files」で表示できるらしい。
files
$4A Clusters Free
Bin  A:FUZZYBASIC   .BIN:3000:69FF:3000
ready

Fuzzy BASIC の終了は「bye」でいい模様。S-OS SWORD に戻ってくる。

もう一度「J 3000」と打つと、再度 FuzzyBASIC が起動する。

簡単なプログラムを打ってみる。
10 FOR I=0 TO 5
20 PRINT I
30 PRINT "  Hello World!!"
40 PRINT
50 NEXT I

list で、ソースリストが表示される。
list
   10 FOR I=0 TO 5
   20 PRINT I
   30 PRINT "  Hello World!!"
   40 PRINT
   50 NEXT I
ready

run で実行。
run
0  Hello World!!
1  Hello World!!
2  Hello World!!
3  Hello World!!
4  Hello World!!
5  Hello World!!
ready

打ち込んだソースをフロッピーに保存する。saveコマンドを使う。注意点として、ファイル名は「"〜"」で囲んでやらないといけない。もし「"〜"」で囲まないと、頓珍漢なファイル名で保存されてしまう…。
save "TEST01.BAS"
Writing TEST01       .BAS
ready

files でファイル一覧を出して、保存できたのか確認する。
files
$49 Clusters Free
Bin  A:FUZZYBASIC   .BIN:3000:69FF:3000
Bas  A:TEST01       .BAS:6A00:6A33:30C1
ready
バイナリ(Bin)ではなく、BASICファイル(Bas)として保存されてることが分かる。また、ロードアドレスは 0x6A00、実行アドレスが 0x30C1 になっている。

「bye」「J 3000」で、FuzzyBASIC を再起動してから、先ほど保存した "TEST01.BAS" を、load "TEST01.BAS" でロードしてみる。
bye

#J 3000
load "TEST01.BAS"
Loading TEST01     .BAS
ready

list と打てば、ロードし直したことが確認できる。
list
   10 FOR I=0 TO 5
   20 PRINT I
   30 PRINT "  Hello World!!"
   40 PRINT
   50 NEXT I
ready

問題点。 :

FUZZYBASIC.LZH には、FZ_DRG.BAS という、おそらくはサンプルプログラムも同梱されているように見えたのだけど。これを BASIC.d88 にインクルードして、ロードと実行をしてみたら、FuzzyBASIC が落ちて S-OS に戻ってしまった…。

一応、そのあたりの作業手順をメモ。
  • FZ_DRG.BAS にもヘッダ部分がついているので、ヘッダ部分と本体バイナリに分割して、本体バイナリだけを BASIC.d88 にインクルードする。
  • 一旦、ファイル種類を「Bin」にしてインクルードしないと、ロードアドレス(0x6A00)と実行アドレス(0x30C1)が指定できない。
  • インクルードしてから、ファイルを右クリック → プロパティ → ファイル種類を「Bas」に切り替える。

ちなみに、list と打ってソースがずらずらと表示されていく途中で ESCキーを叩くと、リスト表示をそこで止めることができる模様。

FZ_DRG.BAS の内容は以下のように見える。おそらく、LINE文を使って何かを描画するプログラムなのではあるまいか…。

fz_drg_bas_ss01.png

fz_drg_bas_ss02.png


FuzzyBASICが落ちてしまう原因は…何だろう…?
  • X1実機の IPL ROM が無いと動かないプログラムなのだろうか?
  • オリジナルの S-OS SWORD のバイナリが無いと動かないプログラムなのか?
  • LINE文を使うには、何か他にも必要になるのだろうか? 例えばグラフィックパッケージの MAGIC とか…。
  • FuzzyBASIC の LINE文は、実はX1には非対応だったりして…? これが MZ-2000 ならすんなり動いたりする?
  • X1エミュレータの再現度の問題だろうか。しかし、X millennium ではなくて、eX1 を使っても、同様に落ちてしまう…。

ちなみに、FuzzyBASICが落ちて、S-OS に戻ってきた状態で、「J 3000」と打ってみたけど、FuzzyBASIC は再起動してくれなかった。「Can't do it.」と表示されて、コマンド入力待ちになってしまう。メモリ上の FuzzyBASIC が破壊された状態になるのかな…?

2022/10/15追記。 :

FuzzyBASIC の関連情報についてググっていたらいくつか分かってきたので、 _2022/10/15の日記 でメモ。

2022/10/15() [n年前の日記]

#1 [pc][mz][z80] S-OS上で動くFuzzyBASICについてのメモ

S-OS上で動く FuzzyBASIC を起動して、FZ_DRG.BAS というサンプル(?)を実行したら、FuzzyBASIC自体が落ちて S-OS の画面に戻ってしまった件について、原因が分かったのでメモ。

環境は、Windows10 x64 21H2 + X1エミュレータ eX1 + S-OS SWORD X1/C/D/Cs/Ck/F/G/Twin(高速版)。

どうやら、FZ_DRG.BAS を実行するには、グラフィックパッケージ MAGIC が必要だった模様。X1エミュレータ上で S-OS 起動後、あらかじめ MAGIC X1版 と MGINIT-X1 をメモリ上にロードしてから、FuzzyBASIC をロードして起動して、その状態で FZ_DRG.BAS を load, run すれば、画面に再帰っぽい図形が表示された。

S-OS関連バイナリは以下から入手。ありがたや。X1用の MAGIC も、.d88イメージファイルの形で入手できる。

_THE SENTINEL

空白を含むファイル名の扱いが分からない。 :

S-OS上で MAGIC を、MAGIC-X1.d88 からロードしようとしたら、ファイル名に空白文字が含まれていて困ってしまった。「L MAGIC X1」も、「L "MAGIC X1"」も、「File not Found」と言われてしまう。どうすれば…。

とりあえず、L3 Disk Explorer を使って、"MAGIC X1" を "MAGIC-X1" にリネームしてみた。この状態なら「L MAGIC-X1」でロードできた。

本来 S-OS は、どうやって空白入りのファイル名を扱うのだろう…?

FuzzyBASICはグラフィック機能が無い。 :

FuzzyBASIC の関連情報をググっていたら、気になる解説文を目にした。どうやら、元々の FuzzyBASIC にグラフィック関連機能は無かったらしい。

_Fuzzy BASIC
グラフィック関係の機能はありませんが

Fuzzy BASIC より


しかし、後に拡張機能としてグラフィック機能が追加された版が存在していたようで…。

_Fuzzy BASICコンパイラ
最初に公開されたものは、グラフィック命令のサポートが無かったのですが、後に拡張という形でサポートされました。 こちらは、通称”石上”版と呼ばれている。

Fuzzy BASICコンパイラ より


FZ_DRG.BAS の中には LINE文が書かれていたので、これはグラフィック機能が無い FuzzyBASIC 用のサンプルではないのだなと。

前述のページで入手できる FuzzyBASIC は、おそらく拡張機能を ―― グラフィック機能を追加してある版のバイナリなのだろう。たぶん。

元々のダンプリストの入手について。 :

S-OS "SWORD" は Oh!MZ という雑誌に掲載されていたわけだけど、どの号をゲットすればダンプリストが手に入るのか調べていたら…。

_Oh! MZ / Oh! X 記事リスト 1986年
_Oh! MZ / Oh! X 記事リスト 1987年

Oh!MZには「ごめんなさいのコーナー」なるものがあって、以前の号で間違えて掲載していた部分の訂正情報が書かれていたっぽい。S-OS "SWORD" も例外ではないようで、掲載された号だけではなく、その後も複数の号に渡って訂正情報が載っていた模様。

特定の号だけ入手すれば使える状態になるのかなと思ってたけど、そういうわけでもなさそうだなと。レトロPC界隈って、そういうところは不便だ…。

ところで、これはメモしていいのかどうか分からんけど…。海外の某有名サイトに、大昔のPC雑誌のアーカイブが存在していたりもするらしい。おそらくアメリカのフェアユース云々のソレでアーカイブされてるのかなと思うけど、日本もそういう概念を持ち込めないものだろうか…。

2022/10/16() [n年前の日記]

#1 [pc][mz][z80] Program List OCRを試用

大昔のPC雑誌には、プログラムがダンプリストの形で掲載されていたわけだけど。とある雑誌の誌面を眺めていたら、そこに掲載されてるプログラムが気になってきた。ちょっと動作確認してみたい。しかし、今時ダンプリストを手打ちするなんて、あまりにもナンセンスだよな…。

ちなみに、ダンプリストと言うのは、16進数の文字列がずらずらと並んだリストのこと。1行に、アドレス、データ(8byte や 16byteが多い)、チェックサムが並んでいるもの。

さておき、ダンプリスト入力を OCRでどうにかしてる事例はないのだろうかとググったところ、Program List OCR というOCRソフトの存在を知った。

_ダウンロードのページ: 808 Midway
_eighttails/ProgramListOCR: OCR suite specialized for printed program listing (BASIC and HEX)
_Program List OCR 1.0.0リリース!: 808 Midway
_Program List OCRができるまで: 808 Midway
_雑誌掲載リストの打ち込みを攻略? - レトロゲーム攻略
_OCRソフトでダンプリストを読み取る

オープンソースのOCRエンジン Tesseract と、GUIラッパー gImageReader、加えて、ダンプリストの文字認識に特化した学習データで作られているらしい。なんだか良さそう。興味が湧いたので試用してみた。環境は Windows10 x64 21H2。

ProgramListOCRSetup-64bit-1.7.2.exe を入手。実行してインストール。今回は D:\Prog\ProgramListOCR\ にインストールしてみた。


かなり高い精度で読み取ってくれた。素晴らしい…。もちろん、元画像が曲がっていたり、変形しちゃったりしていると、読み取りに失敗するけれど、ダンプリストを手打ちするより圧倒的に楽だなと…。

DumpListEditorを試用。 :

得られたダンプリスト相当のテキストに対して、チェックサムと照らし合わせて読み取りに失敗した部分を探したい。

前述の Program List OCR と組み合わせて、DumpListEditor というツールが利用されてる場合が多いらしいので、これも試用してみた。

_ダンプリスト入力用のツール(DumpListEditor) - PC-8001を懐かしむページ

DumpListEditorVer058.zip を入手して解凍。DumpListEditor.exe を実行すると起動する。

上のほうでレトロPCの機種名を選んで、「マシン語入力」タブで、ダンプリストの形式を選ぶ。昔は雑誌毎にダンプリストのフォーマットが違っていたのだけど、そのあたりも網羅してるらしい。

「マシン語入力」タブのエディタウインドウ内に、ダンプリスト相当のテキストを貼り付けて、左上の「チェック」ボタンをクリック。チェックサムと合ってない部分が色付け表示された。これは圧倒的に分かりやすい…。

MZ-700エミュレータ等で使える .mzt を出力することもできる模様。至れり尽くせり。素晴らしい。

動作確認。 :

前述のツール群を使って、とあるプログラムのダンプリストをバイナリにして、エミュレータで動かせるところまで持っていけるか試してみた。

出力した .mzt を、MZ-700エミュレータ EmuZ-700 に読み込ませて、画面が出るところまでは確認できた。カセットテープを利用することが前提なら、大丈夫そうだなと…。

しかし、X1エミュレータや、EmuZ-2200 で動かすことができない。ロードが終わると画面がピンク色になったり、フリーズした感じになる。もしかすると、BASICやS-OS上からプログラムをロードする場合と違って、電源ON直後からいきなりバイナリを読み込んで動かすためには、実機と一緒についてきた何かが必要になるのかもしれない。一応自分も、大昔、X1turboを使ってた身ではあるのだけど、当時のことはほとんど忘れてしまっている…。

2022/10/17(月) [n年前の日記]

#1 [pc][mz][z80] MZ-700 ROMモニタコマンドについてメモ

EmuZ-700 + 1Z-009A で、メモリ内容をテープ相当に保存する方法が分からなくて悩んでしまった。普段、Lコマンドしか使ってないから…。

そんなわけで、1Z-009A で使えるコマンドについて、ググって少し調べたので、せっかくだからメモ。

以下が多少参考になる。ROMの型番は違うし、機能も違うけど…。

_MZ-700 - Monitor 1Z-013A - Sharp MZ


MZ-700エミュレータの場合、MZ-700 の BREAKキー は、Windows側の Backspaceキーに割り当てられているので、SHIFT + BREAK を入力したいなら、Shift + Backspace を叩けば良い。

以下は例。

MZ-700のマニュアルも眺めてみた。 :

他にも多少コマンドがあるはずだけど、機能がよく分からなかったので、結局、MZ-700 OWNER'S MANUAL を発掘して眺めてみた。せっかくだから、テキストファイル(UTF-8)としてメモ。

_mz700_1z009a_commands.md

#2 [pc][mz][z80] X1について分かったことをメモ

X1エミュレータで、Oh!MZ 1987-03, 1987-04 に載っていた S-OS SWORD を動かそうとしても動かなくて悩んでたのだけど。ググっているうちになんとなく分かってきたことがあるのでメモ。

X1用のS-OSを動かすためには、どうやら Huモニタ(Hu-Monitor?)なるものが必要らしい。たぶん。おそらく、0x0000 - 0x14FF あたりに配置されるサブルーチン群なのかなと想像してるのだけど…。ググっても詳細が一切分からないので完全に想像だけど。

_THE SENTINEL で入手できる S-OS SWORD X1/C/D/Cs/Ck/F/G/Twin(高速版) ならエミュレータ上でも動くけれど。よく読んでみたら「Huモニタを使用せず」と書いてあった。標準版 S-OS は Huモニタを必要として、高速版 S-OS は必要としないから、標準版は動かないのだろうなと…。

その Huモニタとやらはどこにあるのか。ROMに入ってたりしないのかと思ったけれど、おそらくBASICの中に入っていて、フロッピーディスクだのテープだのにそこだけ保存されるのかもしれないなと。

例えば MZ-700 の Hu-BASIC は、mon と打ち込むとモニタモードになってマシン語の入力ができるけど。X1上でそういった処理を担当するのが Huモニタ、なのではあるまいか。考えてみれば、似たような機能を実装してるのに、ROMとBASICの両方で持っているのも無駄だよなと。BASIC側で持ってるならそっち使えばいいじゃん、MZシリーズと違って後方互換性なんて気にしなくていい新しいシリーズなんだし、となりそうな気もする。

X1用 BASIC を持っていれば、その Huモニタとやらも使えるのではないか…。やはり、実機+同梱ソフトウェアを持ってないと当時のアレコレは動かせないということになりそう。X1turboを不燃ゴミとして捨ててしまったのは失敗だった…。

2022/10/18(火) [n年前の日記]

#1 [mz][z80] X1やMZ-2000のモニタについて調べてる

X1エミュレータ上で、標準版 S-OS SWORD のバイナリが起動しない件についてまだ調べている。Huモニタなるものが無いと起動しないのではないか、というところまでは分かってきたけど、それって本当なのかなと気になったので…。

S-OS SWORD の前身となった S-OS MACE ではどうだったのだろうとググっていたら、MZ-2000版 S-OS MACE について気になる一文を見かけた。

_S-OS "MACE"
IPL起動は出来ず、MZ-1Z001Mが必要だった。

S-OS "MACE" より


MZ-1Z001M、とな…。それは一体なんですか?

_MZ型番考
MZ-1Z001 MZ-2000/2200 BASIC
MZ-1Z001M MZ-2000/2200 モニタ
MZ-1Z002 MZ-2000/2200 カラーBASIC
MZ-1Z003 MZ-2000/2200 倍精度BASIC

MZ型番考 より


MZ-1Z001M は「モニタ」と呼ばれるプログラムらしい。

モニタって…何? ディスプレイのことを _モニター って言ったりするけれど、それとは関係ありますか?

MZ-1Z009A MZ-700 ROMモニタ
MZ-1Z009B MZ-1500 ROMモニタ

MZ型番考 より


例えば、MZ-700の電源をONにした時に立ち上がってくる 1Z-009A というプログラムがあるけれど、それは「ROMモニタ」と呼ばれていたらしい。ROMに入ってるから、ROMモニタ。つまり、「モニタ」とは「ROMに入ってないモニタ」のことだろうなと。

ROMに入ってないなら、どこに入ってるんだよ? やっぱり、ストレージの類、カセットテープやフロッピーディスク(以下FDと記述)の中に入ってたんじゃないかな…。他に入れられそうなブツは無いし…。

MZ-700 のROMモニタでどんなことができるのかを思い浮かべると、おそらくここでモニタと呼ばれているものは…。 そういうことができるプログラム、なのだろう…。

要するに…。「当時、PCで、『対話的に』マシン語/機械語を扱える状態にするためのプログラムが、モニタと呼ばれいてた」 ―― ということじゃないかなと。たぶん。おそらく。

ところで、最初のあたりで「IPL」という単語が出てきたけれど、それって一体なんだろう? モニタとは違うものなの?

_MZ-2000 - Wikipedia
MZ-80Bの同様、MZ-2000ではInitial Program LoaderのみがROMに書き込まれており、CMT、FD、特定のメモリからの起動をサポートする。

MZ-2000 - Wikipedia より


IPL は、Initial Program Loader の略だったららしい。

つまり…。
では、MZ-2000 のモニタプログラム、MZ-1Z001M は、どうやって入手していたのだろう。単体販売されていたのかな?

システムソフトウェア

型番のハイフンの次が1で始まるものはカセットテープ、2で始まるものはフロッピーディスクによる供給である。 その多くが、モニタMZ-1Z001Mを含み、標準から拡張されている部分はBASIC本体で直接サポートされるため、データレコーダなしでバイナリを取り扱うことには制限があった。

MZ-2000 - Wikipedia より


BASIC や PASCAL などの、システムソフトウェアと呼ばれるジャンルのプログラム群に含まれていた、とある。

_S-BASIC (MZ-1Z001) Reference Manual
MON : 機械語モニタ(メモリを直接いじれる簡易エディタ あるいは 超機能限定版デバッガ のようなもの。 昔のパソコンには大抵ついていた。)に入る。モニタからBASICに戻るには J コマンドで $1300 にジャンプ。

S-BASIC (MZ-1Z001) Reference Manual より


BASIC をロードすると、モニタ MZ-1Z001M も一緒にロードされた状態になっていたらしい。そして、mon と打つと、モニタに切り替わる。更に、$1300 にジャンプすれば BASIC に戻れた、とある。となると、そのモニタとやらは、$1300 より前のメモリ領域に格納されていた可能性が高そうだなと…。

MZ-80B/2000/2200版 S-OS SWORD のメモリマップを確認してみたけれど、SWORD自体は $1300 から格納される模様。となると、モニタ MZ-1Z001M は、$0000 - $12FFH に入ってたプログラムなのだろう…。

X1についても調べてみた。

_X1 (コンピュータ) - Wikipedia
電源投入直後、最初にIPL (Initial Program Loader) が起動し、FDD、拡張ROMボード、CMTの順にブートを試みる。

X1 (コンピュータ) - Wikipedia より


ここでも IPL と言ってるから、MZ-2000 と同様の仕組みらしい。

_X1型番考
CZ-8CB01 : テープBASIC
CZ-8FB01 : ディスクBASIC, 5インチ、BASICそのものの型番でもある
CZ-8FB02 : turbo BASIC
CZ-8FB03 : Z-BASIC
CZ-8RB : ROM BASIC
CZ-8W301 : ディスクBASIC, 3インチ
CZ-8WB51 : X1ターボBASIC

CZ-112SF : NEW BASIC, カセット版
CZ-113SF : 3インチ版、当初5インチ版も同梱の予定だったらしい
CZ-124SF : NEW BASIC, 5インチ版

X1型番考 より


おそらくだけど、Huモニタと呼ばれるものは、これらのBASICに含まれていたのだろう。そして、mon と打ち込むとモニタモードに切り替わる。更に、例えば X1用の S-OS SWORD は $1500 から始まっているから、Huモニタとやらは $0000 - $14FF に入っているのではあるまいか。

つまり、標準版の X1用S-OS、MZ-2000用S-OS は…。
  1. 一旦BASICをロードして、
  2. mon と打ってモニタ(Huモニタや MZ-1Z001M)に切り替えて、
  3. そこでようやく S-OS SWORD をロードすることで、S-OS が起動する。
そんな操作手順で使ってたのかなと。あくまで想像だけど。実際どうだったのかは分からんけど。いや、自分もX1turboユーザだったのだから、当時触ってたはずなんだけど、完全に何もかも忘れているわけで…。

ということで、「X1 や MZ-2000 で標準版の S-OS を使いたかったら BASIC が必要ですよ」「BASIC の中に入ってるモニタを利用しますので」ということで間違いなさそう。

MZ-700 は ROMにモニタが入ってるんで、いきなり S-OS を読み込んで使うことができたのだな。しかし、X1 や MZ-2000 はそうじゃないよ、ROM に IPL は入ってるけど、それだけじゃ足りないよ、別途モニタが必要だよ、と…。

そして、そのモニタとやらは、今となっては正規に入手する術がない。CP/Mあたりと比べると、日本のレトロPCって不自由…。

2022/10/19追記。 :

上記が分かった上でググってみたら、そもそも S-OS SWORD のドキュメント(?)に、このあたりちゃんと書いてあることに気づいた…。

_S-OS Sword Ver2.0 (J)(1986-02)(Oh!mz) [mz80K][type-in].txt
S-OS“SWORD"は、
X1では BASIC CZ-8CB01/8FB01のモニタ、
MZ-80B/2000/2200/2500ではモニタSB-1520またはMZ-1Z001M、
MZ-80K/C/1200/700/1500ではROMモニタ上で動作します。
それぞれのマシン語モニタから入力してください。

最後のあたりに書いてあったから気づかなかった…。

2022/10/19(水) [n年前の日記]

#1 [z80] MZやX1のBASICについて調べてる

MZ-2000、あるいは X1 で使われていたBASICについて調べてる。それぞれ、モニタと呼ばれるプログラムが含まれているらしいけど、それらの互換プログラムって無いのかなと。まあ、ググった感じでは存在してないみたいだけど…。

各サブルーチンのアドレス一覧や機能一覧は無いのかなとググってみたけど、それも見当たらず。MZ-2000 にはマニュアルが2つあって、OWNER'S MANUAL は見かけたのだけど、もう一つのマニュアルは見かけなかった。その、見つからないもう一つのほうに BASIC やモニタの情報が載っているらしい。

2022/10/20(木) [n年前の日記]

#1 [nitijyou] 体調がよろしくない

体調が悪くて一日中寝てた。喉が痛い…。幸い、熱は出てないようだけど…。

#2 [anime] 「機動戦士ガンダム 水星の魔女」3話まで視聴

録画してたソレを視聴。プロローグ、1、2、3話を視聴。

いい…。これは良い…。

個人的には、主人公が女性キャラという点が実に良い。と言うのも、自分、ン十年前に友人達と「そろそろ美少女キャラが主人公のガンダムが出てきてもいいのでは」「ナウシカがあるんだからガンダムでそういうのやってもいいはずだ」みたいな妄想を話し合ってた記憶があって。しかしン十年経ってもそんなガンダム作品は出てこなくて…。だけどこうしてようやく夢が叶った(?)わけで。この基本設定だけで自分は大満足。これは全肯定するしかない…。

加えて、「少女革命ウテナ」小説版で小説家としてデビュー、かつ、∀ガンダムでアニメ脚本家としてデビューした大河内さんが、こういった内容の新作ガンダムのメインライターを務めているあたり、なんだかちょっと感慨深い(?)ものがあるなと…。

OP曲制作のために書かれたという、Webで公開された短編小説にも目を通したけれど、こういう試みはとても良いなと。ああいった形での情報開示・設定開示は、視聴者側の想像を膨らませることに繋がっていく気がする。

ところで、件の小説を読んで、もしかすると主人公が人間ではない作品もアリなのかなと思えてきたのだけど…。もっとも、主人公が蜘蛛とか剣とかスライムとか骸骨とかそういうのは既にあるし、今の時代なら何でもアリかな…。

2022/10/21(金) [n年前の日記]

#1 [z80] CP/Mについて少し調べてる

CP/Mについて少し調べてる。

X1エミュレータ上でS-OS関連が動作するか調べてたけど、資料は少ないし、動かすためのBASICが入手できないしで、実機その他を持ってるならともかく、そうでないならこれはなかなか厳しいなあ、という印象になってきて…。 *1

文字しか表示できない等々、やれることが少ない割に、今では動作させることすら厳しいS-OSを触るぐらいなら、まだCP/Mでも触ってみたほうがいいんじゃないのと思えてきた。CP/Mなら S-OSと違って、色々なソフトウェアをWebから入手できるわけだし…。

などと思って CP/M 関連をまた少し調べ始めたのだけど、例えばカーソル位置の指定はできるのだろうかと疑問が湧いた。ググった感じでは、エスケープシーケンスなるものを利用すればどうにかなるっぽいのだけど…。ただ、エミュレータによっては、というより、エミュレータの動作結果を表示してるDOS窓では、エスケープシーケンスが働かないそうで…。

MZ-80シリーズのBASIC ―― SP-5030, S-BASIC, Hu-BASIC なら、cursor や locate といった、カーソル位置指定の命令があったから、Microsoft BASIC (BASIC-80) もそういう命令があるのではと命令表をググって探してみたけど、カーソル位置指定の命令は無いみたいだなと…。当時の CP/M + BASICは、画面内の任意の場所に文字を表示することを考えてなかったのだろうか。そこまで制限が厳しいとは…。

CP/M上で動作する、WordMaster (WM.COM) なるエディタは、エスケープシーケンスでカーソル位置の変更をしてるそうで。しかし、エスケープシーケンスを機能させるために、VT100互換の端末ソフトが必要になるらしい。

_懐かしのワードマスターをCP/Mシミュレータで使う | ある計算機屋さんの手帳

Putty 0.77-ranvis2上でカーソルキーを打ったら変な文字が表示されたので、Tera Term 4.106 Portable をインストールして動作確認してみたけれど、そちらも変な文字が表示されて悩んでしまった。ただ、そもそも、WordMaster上でカーソルキーは機能しないのかもしれない…。Ctrl + (E|S|D|X) ならカーソル移動ができてるので、これで正常動作しているのかも…。

さておき。WordMaster のショートカットキーがよく分からない。前述のページにキー一覧は書いてあるのだけど、覚えられる自信がない…。
*1: いやまあ、X1/C/D/Cs/Ck/F/G/Twin(高速版) の .d88 を入手すれば、X1エミュレータ上で S-OS SWORD を動かせるのだけど。

2022/10/22() [n年前の日記]

#1 [z80] Word Master を試用中

CP/M上で動作するスクリーンエディタ、Word Master を少し触ってる。操作方法がさっぱり分からなかったので、多少は使い方を知っておきたいなと…。以下を参考にして勉強(?)中。

_懐かしのワードマスターをCP/Mシミュレータで使う | ある計算機屋さんの手帳

とりあえず、起動は wm HOGE.TXT みたいな感じでいいらしい。

vi と同様に、モードが2種類あるらしい。ビデオモードとコマンドモード。



2022/10/23() [n年前の日記]

#1 [z80] CP/Mエミュレータ上で画面クリアの方法が分からない

CP/Mエミュレータ + CP/M + Mbasic 5.21 (Microsoft BASIC, BASIC-80)で、画面クリアをする方法が分からなくて悩んでる。

Microsoft BASIC のマニュアル(Page 3-4)には、「CHR$(7) でベルが鳴り、CHR$(12) で画面クリアができる」と書いてあるのだけど。

_BASIC-80 (MBASIC) Reference Manual - BASIC-80_MBASIC_Reference_Manual_text.pdf

PRINT CHR$(12) を試しても、画面クリアができない…。ちなみに、PRINT CHR$(7) と打ったら、たしかにベル音が鳴った。

環境は、Windows10 x64 21H2。以下のCP/Mエミュレータで動作確認。
_YAZE-AG - Yet Another Z80 Emulator by AG (final release 2.51.3)
_ソフトウェアー基礎コース (Tiny BASIC Lesson 1:Z80 エミュレーター YAZE)
_Altair Introduction
_懐かしいCP/MをSIMHシミュレータで実行 | ある計算機屋さんの手帳
_CP/M Player for Win32 謎WIPページ
_CP/M program EXEcutor for Win32の詳細情報 : Vector ソフトを探す!

ConEmu、cmd.exe、Windowsターミナル 1.15.2874.0 を使って確認してみたけど、どの環境でも変化無し。画面クリアにはならない…。

以下のページによると、 CHR$(12)、0x0C、^L の制御文字は、FF(Form Feed) になっているらしい。

_制御文字 - Wikipedia
プリンタでは、次のページを給紙する。多くのプログラミング言語では空白として扱われ、コードの論理的区分の分け目として使用される。いくつかの端末エミュレータでは、画面をクリアする。

制御文字 - Wikipedia より


Linux上で動かしたら違う結果になるのではないかと思えてきたので、Ubuntu Linux 20.04 LTS 上で、YAZE-AG 2.51.3 をビルドしたり、altairz80l64 をDLして実行してみた。しかし、そちらも CHR$(12) で画面クリアはできなかった。それだけではなく、CHR$(7) でベル音も鳴らなかった。

どういう環境なら画面がクリアされるのか…。

2022/10/24(月) [n年前の日記]

#1 [z80] CP/Mエミュレータ上で画面クリア

_昨日、 CP/Mエミュレータ + Mbasic 5.21 (Microsoft BASIC CP/M版、BASIC-80)で画面クリアの方法が分からなくて悩んでいたけれど、エスケープシーケンスなるものを使えば実現できそうと分かってきたのでメモ。

環境は以下。
画面クリアは、PRINT CHR$(&H1B);"[2J" で実現できるらしい。以下が参考になった。

_エスケープシーケンス
_エスケープシーケンス - Wikipedia
_ワンボードマイコンを作ろう!(8080、Z80マシン語からBASICまでこれ1台でこなせます)


ちなみに、Mbasic のマニュアルに書いてあった、「CHR$(12) で画面クリアできるよ」という話は、どの CP/Mエミュレータ上でも動いてくれなかった。

_BASIC-80 (MBASIC) Reference Manual - BASIC-80_MBASIC_Reference_Manual_text.pdf

実機なら動くのだろうか…? それとも、特定のレトロPCに限った話なのだろうか…?

以下で紹介されてる方法も試してみたけど、どれもダメだった…。これらも実機なら違う動作になるんだろうか…。

_Clear screen command in CP/M BASIC?

カーソル位置を指定。 :

Mbasic上で、エスケープシーケンスとやらを使ってカーソル位置の指定ができそうかどうか試してみた。

ファイル名 : ESCSEQ.BAS
10 PRINT CHR$(&H1B);"[2J";
20 FOR Y=1 TO 10
30 X=Y*4
40 Y$=RIGHT$(STR$(Y), LEN(STR$(Y))-1)
50 X$=RIGHT$(STR$(X), LEN(STR$(X))-1)
60 C$="["+Y$+";"+X$+"H"
70 PRINT CHR$(&H1B);C$;C$
80 NEXT Y
  • 10行目で画面クリア。
  • 10回ループして、文字列の表示位置を変えている。
  • 「ESC[y;xH」を出力すれば、(x, y) にカーソル位置を変更することができるらしい。上記ソースでは、C$ の中に「[y;xH」を格納している。
  • STR$(y) で、数値が入った変数 y の値を、文字列に変換することができる。
  • STR$(y) は、先頭に空白が入った文字列を返してしまうので、RIGHT$() と LEN() を使って先頭の空白を除去している。
  • RIGHT$() は、指定された文字数分、右から数えて文字列を返す。
  • LEN() は、与えられた文字列の文字数を返す。

STR$() で先頭に空白が入る問題については、以下が参考になった。

_N88互換BASIC

y=15
Ok

print str$(y)
 15
Ok

print right$(str$(y), len(str$(y))-1)
15
Ok

さておき。前述のプログラムを、run で実行。以下のような見た目になった。

ss_esc_seq_bas.png

たしかに表示位置を変更することができた。しかし、毎回こんなの書いてられないよなあ…。cursor や locate 文が欲しくなる。

指定する値は、左上が (1, 1) のように見えるのだけど…。(0, 0) ではないの…?

2022/10/25(火) [n年前の日記]

#1 [z80] Form Feed は動かない

制御コードの 0x0c (Form Feed, FF) についてまだ調べているところ。コレは本当に、画面クリアとして機能しないものなのだろうかと。

_制御文字 - Wikipedia
_改ページとは (form feed, FF) かいページ: - IT用語辞典バイナリ

VT100 関係の資料についてググっていたら、「FF は LF で置き換えられる」と記述されてることに気が付いた。

_ANSI Control Functions Summary
Form feed : FF 0/12 : Treated as LF.

ANSI Control Functions Summary より


_ctlseqs(ms)
FF : Form Feed or New Page (NP). (FF is Ctrl-L). FF is treated the same as LF.

ctlseqs(ms) より


_対応制御シーケンス
0x0c : FF : LFと同じ

対応制御シーケンス より


VT100互換相当の Tera Term も、Mintty も、0x0c が画面クリアとしては働かずに改行になってしまったけれど、仕様通りの動作だったのだな…。やはり、ESC [2J を送って画面クリアするのが妥当らしい…。

_c - Form feed does not clear the screen - Stack Overflow

#2 [nitijyou] 日記をアップロード

2022/09/19を最後に日記をアップロードしてなかったのでアップロード。

2022/10/26(水) [n年前の日記]

#1 [game] 延々走るドライブゲーム

ネット上のニュースを眺めていたら、気になる話を見かけた。

_禅リラックス無限ドライブ『Slow Roads』PCブラウザ向けに無料公開。のどかな丘から火星まで無心で走る - AUTOMATON
_slow roads

これは…良い…。自動走行モードにして、ついついずっと眺めてしまった…。

パーリンノイズで地形を生成してから、その上に道路を自動生成しているらしいけど、稀に、湖の上に橋がかかったりして、そこを走っていく時が気持ちいい…。

木や草の生え方にムラがあるのが実に良い。以前自分も、 _道路の自動生成に挑戦 したことがあるけれど、一定の間隔で木を生やしてしまったせいか変化が無くてつまらないソレになったわけで…。やはり風景には変化が無いと…。

「TURBO FreeWay」を連想。 :


2022/10/27(木) [n年前の日記]

#1 [lua] Windows版のluarocksについて調べてる

プログラミング言語のLua言語には、インターネット経由でライブラリをインストールできる luarocks というツールがある。その luarocks を Windows上でインストールする方法がちょっとよく分からなくなってきたので調べているところ。

環境はWindows10 x64 21H2。

以前は、hererocks (HereRocks)というツールを使うことで、Windows上でも Lua + luarocks をビルドして、簡単にインストールできていたっぽい…。

_mieki256's diary - luarocksをWindows10上で使おうとしてハマった

hererocks は、Python上で動作するツール。他に、git と gcc (MinGW)が必要になる。
> python -VV
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)]

> git --version
git version 2.30.2.windows.1

> gcc --version
gcc (MinGW.org GCC Build-2) 9.2.0

とりあえず、以下の環境で hererocks が使えることは確認できた。
hererocks のインストールの仕方や使い方は、以下を参考に。

_luarocks/hererocks: Python script for installing Lua/LuaJIT and LuaRocks into a local directory
_Windows環境にluarocksをインストールするにはhererocksが便利 | Birth, Gaming, Gaming, Death
_HereRocksなるものがあるらしい - Qiita

ただ、ビルドした luarocks を使って、Luaのスクリプトソースの整合性をチェックする luacheck をインストールしてみたものの、MinGW を有効にしてある状態じゃないと luacheck が動作しない…。
> luacheck hello.lua
C:\tools\lua_alt\lua51\bin\lua.exe: error loading module 'lfs' from file 'c:\tools\lua_alt\lua51\/lib/lua/5.1/lfs.dll':
        指定されたモジュールが見つかりません。

stack traceback:
        [C]: ?
        [C]: in function 'require'
        ...:\tools\lua_alt\lua51\/share/lua/5.1/luacheck\fs.lua:3: in main chunk
        [C]: in function 'require'
        ...ools\lua_alt\lua51\/share/lua/5.1/luacheck\cache.lua:1: in main chunk
        [C]: in function 'require'
        ...tools\lua_alt\lua51\/share/lua/5.1/luacheck\main.lua:2: in main chunk
        [C]: in function 'require'
        ...lib\luarocks\rocks-5.1\luacheck\1.0.0-1\bin\luacheck:2: in main chunk
        [C]: ?

lfs.dll とやらが見つからないか、もしくは見つかっても動作しないようだなと。

MinGW が有効なら動作する。
> mingw
MinGW enable. Add path [D:\MinGW\bin;D:\MinGW\\msys\1.0\bin]

> luacheck hello.lua
Checking hello.lua                                OK

Total: 0 warnings / 0 errors in 1 file

2022/10/28追記。 :

lfs.dll を、Dependencies x64 1.11.1.0 に読み込んで調べてみたところ、libgcc_s_dw2-1.dll が見つからなくて動かなかった模様。

_lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.

この Dependencies というツールを使えば、.exe や .dll が要求するファイルを確認することができる。

lfs.dll と libgcc_s_dw2-1.dll を、lua.exe が置いてあるディレクトリにコピーしたところ、MinGW を有効にしてない状態でも luacheck が動くようになった。

ちなみに、それぞれ、以下のディレクトリに入ってた。
  • Lua51インストールディレクトリ\lib\lua\5.1\lfs.dll
  • MinGWインストールディレクトリ\bin\libgcc_s_dw2-1.dll

2022/10/28(金) [n年前の日記]

#1 [javascript] 夜の道路を延々と走るデモに遭遇

ググってたら、夜の道路を延々走り続けるデモプログラム?に遭遇。ブラウザ上で動作する。JavaScriptによる実装。

_いにしえのweb系エンジニア / Twitter
_James Stanley - Nightdrive
_Nightdrive

良い…。いやまあ、車が透明なのであちら側が見えてしまってちょっとアレな感じはするけれど、雰囲気はあるというか。

嘘でもいいから、夜空+満天の星が見えてたら、更にイイ感じになりそう。空を飛んでいる飛行機の点滅は入ってるっぽいけど…。

2022/10/29() [n年前の日記]

#1 [tic80] TIC-80の動作確認

TIC-80 のバージョンが 1.0.2164 になってたのでDLして動作確認。環境は Windows10 x64 21H2。今まで手元にあったのは、TIC-80 0.90.1723 だった模様。

TIC-80 というのは、2Dゲームを作るための仮想ゲーム機とでもいうか…。Fantasy Computer、あるいは Fantasy Console と呼ばれるジャンルのソフト。テキストエディタ、ドットエディタ、マップエディタ、サウンドエディタ、ミュージックエディタが全部入ってるので、1つの .exeファイルをダウンロードして実行するだけで、ファミコンライクな2Dゲームをすぐに作り始めることができる。

さておき。以前書いたプログラムをいくつか動かしてみたけれど、SCN() を使ったラスタースクロール処理がちょっと妙な動作になった。以下のプログラムを動かせば画面下半分が上下反転するはずだけど、反転してくれない…。

_mieki256's diary - TIC-80でラスタースクロール処理その2

フォルダを指定する記述について。 :

昔の tic80.exe (0.70.6 だった頃) は、「tic80 .」と指定するとカレントフォルダをシステムフォルダとして使うことができていたけど。現行版 1.0.2164 は「tic80 --fs=.」と指定しないといかんらしい。

2022/10/30() [n年前の日記]

#1 [tic80] TIC-80 1.0.2164の変更点をメモ

Fantasy Computer (Fantasy Console)、TIC-80 1.0.2164 の動作確認中。環境はWindows10 x64 21H2。

_TIC-80 tiny computer
_nesbox/TIC-80: TIC-80 is a fantasy computer for making, playing and sharing tiny games.
_Home - nesbox/TIC-80 Wiki

以前の版(0.70.6 / 0.90.1723)と比べて、いくつか仕様が変更されたり、機能が追加されていた模様。気づいた範囲でメモ。

ユーザディレクトリの指定について。 :

以前の版では、「tic80.exe .」を指定して起動すると、カレントディレクトリをユーザディレクトリにすることができたけれど、TIC-80 1.0.2164 (正確には 0.90 以降)では以下の指定に変わった。
tic80.exe --fs=.
tic80 --fs=.

_Command Line Arguments - nesbox/TIC-80 Wiki

例えば、カレントディレクトリに hoge というディレクトリがあって、その中でロードやセーブをしたいなら、以下の指定になる。
tic80.exe --fs=hoge

表示拡大率の指定。 :

表示ウインドウのサイズが大き過ぎる時は、--scale=x で表示拡大率を指定できる。
tic80.exe --scale=2
tic80.exe --scale=1

_Command Line Arguments - nesbox/TIC-80 Wiki

SCN()は非推奨になった。 :

以前の版の TIC-80 には、ウインドウ内の横1ライン分を描画する直前に呼ばれる関数として SCN() という関数が用意されていた。昔のゲーム機で言えば、水平帰線期間(HBlank)割り込み処理に相当する関数。

その SCN() は、0.90 から非推奨になっていた。代わりに BDR() を使え、とのこと。

_BDR (0.90) - nesbox/TIC-80 Wiki
_SCN - nesbox/TIC-80 Wiki

ただし、SCN() に入ってくる値と、BDR() に入ってくる値は若干違う。BDR() には、SCN() に渡されていた値 + 4 (これから描画しようとしているy座標 + 4)が入ってくる。
  • BDR(4) は SCN(0) と同じ。
  • BDR(139) は SCN(135) と同じ。
BDR(0)
TOP BORDER
BDR(1)
TOP BORDER
BDR(2)
TOP BORDER
BDR(3)
TOP BORDER
BDR(4)SCN(0)y=0 のラインが描画される直前に呼ばれる
BDR(n)SCN(n-4)y=(n-4) のラインが描画される直前に呼ばれる
BDR(139)SCN(135)y=135 のラインが描画される直前に呼ばれる
BDR(140)
BOTTOM BORDER
BDR(141)
BOTTOM BORDER
BDR(142)
BOTTOM BORDER
BDR(143)
BOTTOM BORDER

SCREEN OFFSET値は正負が反転してる。 :

BDR() 内で Screen Offset値が格納されてるアドレス、0x3FF9、0x3FFA に値を書き込むとラスタースクロールっぽいことができるのだけど。

_RAM - nesbox/TIC-80 Wiki
_TIC-80でラスタースクロール処理
_TIC-80でラスタースクロール処理その2

その、Screen Offset に書き込む値は、以前の版と +/- が逆になっていた。ただ、変更履歴にそのあたりの記述が無いので、もしかすると単にバグかもしれない…。

_Releases - nesbox/TIC-80

仕様なのかバグなのか分からないけど、何にせよ、TIC-80 1.0.2164 においては、Screen Offset に指定する値が以前の版とは違っているので注意。なんだか変な結果になるなと思ったら、試しに正負を反転した値を書き込んでみれば改善されるかもしれない。

テキストファイルで保存する機能は制限あり。 :

以前は、ソースコードや画像リソース等を .tic で保存する代わりに、テキストファイル(.lua)で保存することもできていたらしいのだけど。TIC-80 1.0.2164 はPro版じゃないとその機能を使えなくなった模様。無料版はソースコードを直接テキストで保存することはできない。たぶん。

では、どうすればソースコードを取り出せるのか…。TIC-80上では、F1キーを押すとコードエディタになるけれど。Ctrl+A でソースを全選択してから Ctrl+C でコピーすれば、クリップボードにソースコードをコピーできるので、それを別のエディタ上で貼付けしてやれば、無料版でもソースコードをテキストとして取り出せなくもない。

ちなみに、github上では、「お金が無い人のために、Pro版のビルドもしやすくしておいたよ」との一文があった。ビルド環境を用意できそうな人は試してみてもいいかもしれない。

For users who can't spend the money, we made it easy to build the pro version from the source code: (cmake .. -DBUILD_PRO=On)

nesbox/TIC-80 より

OVR()内では色番号0番は必ず透明。 :

OVR()という関数を使うことで、一番最後に描画させる処理を別途記述することができるけど。OVR()内でスプライトの描画指定をすると、何故か色番号0番が必ず透明になる。

_everything drawn in OVR with color 0 is transparent - Issue #1897 - nesbox/TIC-80

0番にはえてして黒色が設定されていたりするので、OVR()内で描画指定するものについては黒色が使えない、ということになりそうだなと…。

回避策はあるらしいのだけど、眺めてもよく分からなかった…。

Rubyをサポート。 :

TIC-80用のスクリプトは色々な言語で書けるのだけど、Ruby (mruby) もサポートされたらしい。

_Ruby scripting support by remi6397 - Pull Request #1726 - nesbox/TIC-80

以下のサンプルは、Ruby (mruby) で書かれた事例。ESCキー → CLOSE GAME → F1キーでソースが見れるけど、たしかに Ruby で記述されてる。

_Games > RUBY PONG - TIC-80 1.0.2164 (b09c50c)

mruby って詳しくないけど、もしかして class も使えるのだろうか。だとしたら、Lua で書くより楽かも…。Lua でクラスを書くのは少し面倒臭いから…。

#2 [nitijyou] 県知事選の投票をしてきた

福島県知事選の投票をしてきた。AM08:30頃、近所の集会所まで電動自転車で。帰りに、ザ・ビッグによって買い物。

2022/10/31(月) [n年前の日記]

#1 [tic80] TIC-80 1.0.2164でラスタースクロール

TIC-80 1.0.2164 + Windows10 x64 21H2で、ラスタースクロールができるか試してみた。以前もやってみたことがあるのだけど、TIC-80の仕様が微妙に変わったので、ソースをちょっと修正して再度試してみた次第。

_TIC-80でラスタースクロール処理
_TIC-80でラスタースクロール処理その2

BDR関数についての簡単な説明。 :

TIC-80 0.90 以降には、BDR() という関数が用意されてる。

_BDR - nesbox/TIC-80 Wiki

この関数は、ウインドウの横1ライン分を描画する直前に呼ばれる関数。描画しようとしているy座標 + 4 の値が入った状態で呼ばれる。

要するに、昔のゲーム機で言えば、水平帰線期間(HBlank)割込みに相当する。この BDR() の中で、Screen Offset値を書き換えてやれば、1ライン毎に表示位置を変えられるから、ラスタースクロールもできる。

ちなみに、TIC-80 0.90 より前の版(0.70.6 や 0.80.1344)では、BDR() ではなくて SCN() という関数名だった。

_SCN - nesbox/TIC-80 Wiki

また、SCN() に渡される値と、BDR() に渡される値も、若干違っている。
  • SCN(n) : n = 描画するラインのy座標。0 - 135 の値が入る。
  • BDR(m) : m = 描画するラインのy座標 + 4。0 - 143 の値が入る。0 - 3 は TOP BORDER。140 - 143 は BOTTOM BORDER になっている。

Screen Offsetを書き換えてラスタースクロール。 :

まずは、BDR() の中で、Screen Offset にsin値やcos値を書き込んでみる。

tic80_1_0_2164_raster_ss1.gif

_raster1.zip (raster1.tic, tiles3.png, map3.map)

ローカル環境で動かしたい場合は、以下で実行できる。
tic80.exe raster1.tic

画像(tiles3.png)やマップデータ(map3.map)を利用したい時は、TIC-80 のコンソール上からインポートできる。
tic80.exe --fs=.
import tiles tiles3.png
import map map3.map

ソースは以下。

_raster1.lua
t=0
x=96
y=24

function TIC()
 cls(13)
 map(0,0)
 local col=0
 local scale=3
 spr(1+t%60//30*2,x,y,col,scale,0,0,2,2)
 col=12
 print("HELLO WORLD!",84,84,col)
 t=t+1
end

--function SCN(row)
function BDR(row)
 local rx,ry
 rx=8*math.cos(math.rad(3*t+4*row))
 ry=6*math.sin(math.rad(2*t+4*row))
 poke(0x3FF9,rx)
 poke(0x3FF9+1,ry)
end
  • function BDR(row) - end の中が、ラスタースクロール処理。
  • poke(0x3FF9,rx) で、Screen Offset の x値を書き換え。
  • poke(0x3FF9+1,ry) で、Screen Offset の y値を書き換え。今気づいたけど、poke(0x3FFA,ry) と書いたほうが良かったかも…。
  • Lua で sin,cos を使う時は、math.sin(), math.cos() を使う。
  • sin, cos関数に渡される値はラジアン単位。math.rad() を使って、度からラジアンに変換できる。

OVR()を使う。 :

前述のラスタースクロール処理を行うと、ウインドウ内の全体の見た目が変わってしまう。背景はラスタースクロールさせるけど、手前のスプライト相当はラスタースクロールをかけないようにしたい。

そんな時は OVR() 関数を使う。OVR()関数は、BDR() が描画処理を終えた後、一番最後に呼ばれるので、その中で描画処理をすれば、BDR() の処理が影響しない状態の描画ができる。

_OVR - nesbox/TIC-80 Wiki

tic80_1_0_2164_raster_ss2.gif

_raster2.zip (raster2.tic)

_raster2.lua
t=0
x=96
y=24

function TIC()
 local spd=2
 if btn(0) then y=y-spd end
 if btn(1) then y=y+spd end
 if btn(2) then x=x-spd end
 if btn(3) then x=x+spd end

 cls(13)
 map(0,0)
 t=t+1
end

--function SCN(row)
function BDR(row)
 local rx,ry
 local sx,sy=x/10,y/5
 rx=sx*math.cos(math.rad(3*t+4*row))
 ry=sy*math.sin(math.rad(2*t+4*row))
 poke(0x3FF9,rx) -- Screen Offset x
 poke(0x3FFA,ry) -- Screen Offset y
end

function OVR()
 local col=0
 local scale=2
 spr(257+t%60//30*2,
     x,y,col,scale,0,0,2,2)
 col=12
 print("HELLO WORLD!",84,84,col)
end

OVR() の中で、スプライト(コンピュータみたいなキャラクタ)の描画と、文字描画("HELLO WORLD!")をしているので、背景はラスタースクロールしているけれど、スプライトと文字はラスタースクロールしていない状態になっている。

注意点。TIC-80 1.0以降では、OVR() の中で描画指定をすると、パレットの0番色が必ず透明色として扱われてしまう。

上記の例では、0番色を透明色、それ以外を不透明色扱いにしてドット絵を描いてあるので、問題無さそうに見えてるけれど。TIC-80 のデフォルトのパレットデータでは、0番色 = 黒色なので、黒色を使ったドット絵を描いて OVR() の中で描画してしまうと、黒い部分が透明になってしまう。

以下のやり取りによると、任意の色番号を透明色として扱うように指定することも可能らしいけど、やり方がよく分からなかった…。何にせよ、その場合もどこか1色は透明になってしまうので、OVR() の中で描画する何かしらは15色しか使えないと思っておいたほうが良さそう。

_everything drawn in OVR with color 0 is transparent - Issue #1897 - nesbox/TIC-80

水面があるような処理。 :

そこに水面があるような見た目を、ラスタースクロールを使って実現してみる。

tic80_1_0_2164_raster_ss3.gif

_raster3.zip (raster3.tic)

_raster3.lua
t=0
x=64
y=32
sy=0

function TIC()
 local spd=2
 if btn(0) then y=y-spd end
 if btn(1) then y=y+spd end
 if btn(2) then x=x-spd end
 if btn(3) then x=x+spd end

 cls(0)
 map(0,0)
 local col=0
 local scale=2
 spr(1+t%60//30*2,x,y,col,scale,0,0,2,2)
 col=12
 print("HELLO WORLD!",84,28,col)
 t=t+1
 sy=math.floor((136*0.7)+16*math.sin(math.rad(t)))

 -- reset palette
 sync(1<<5)
end

--function SCN(row)
function BDR(row)
 local rx,ry=0,0
 
 if row==sy then
  -- palette change
  local PAL_ADDR=0x3FC0
  for i=PAL_ADDR,PAL_ADDR+16*3-1 do
   poke(i,peek(i)*0.5)
  end
 end
 
 if row<sy then
  rx=0
  ry=0
 else
  local dy=row-sy
  rx=1.5*math.cos(math.rad(4*t+55*dy))
  -- ry=-dy*2 -- TIC-80 0.70.6
  ry=dy*2 -- TIC-80 1.0.2164
 end
 
 local SCROFSX=0x3FF9
 local SCROFSY=0x3FFA
 poke(SCROFSX,rx)
 poke(SCROFSY,ry)
end

まず、BDR() に渡された値(y座標 + 4)と、値が上下に揺れるグローバル変数 sy を比較して、もし同じ値なら、そのタイミングでパレットデータを少し暗めな値に書き換えている。これで、水面相当がちょっと暗い感じの色になってくれる。

ただ、このままだと次のフレームを描画する時に、暗くなったパレットデータを使って描画してしまうので、TIC() の中の最後のあたりで sync(1<<5) を呼ぶことでパレットデータを初期化してる。

BDR() の中では、グローバル変数 sy より下を描画するときだけ、ラスタースクロールをかけている。 Screen Offset のy値を書き換えて、縦方向の表示位置を変化することで、上下反転した見た目にしている。

ただ…。TIC-80 0.70.6 / 0.80.1344 / 0.90.1723 と、TIC-80 1.0.2164 では、Screen Offset値の正負が逆なようで…。以前の版で書き込んでいた値の正負を反転して利用しないと、期待していた見た目にはならなかった。このあたりは別記事でまとめておく。

#2 [tic80] TIC-80 1.0のScreen Offset値について

TIC-80 1.0.2164 の Screen Offset値は、以前の TIC-80 とは正負が逆転している模様。

検証用のサンプルを書いてみた。環境は Windows10 x64 21H2。

_raster4.zip (raster4.tic)

_raster4.lua
t=0
x,y=96,24

function TIC()
 cls(13)
 map(0,0)
 spr(1+t%60//30*2,x,y,0,3,0,0,2,2)
 print("HELLO WORLD!",84,84,12)
 t=t+1
end

function BDR(v)
 -- TIC-80 0.90 later
 local y=v-4
 if y<0 or y>135 then return end
 my_bdr(y)
end

function SCN(v)
 -- TIC-80 0.70.6
 my_bdr(v)
end

function my_bdr(y)
 poke(0x3FF9,y) -- Screen offset x
 poke(0x3FFA,0) -- Screen offset y
end

以下は、TIC-80 1.0.2164 で動作確認した結果。

scrofsx_tic80_1_0_2164_ss.gif


以下は、TIC-80 0.70.6 / 0.80.1344 / 0.90.1723 で動作確認した結果。一部の画像はパレットがめちゃくちゃになってるけれど、昔のTIC-80と現行版TIC-80ではデフォルトパレットデータが異なってるせいなので、そこは無視してほしいなと…。

scrofsx_tic80_0_70_6_ss.gif

scrofsx_tic80_0_80_1344_ss.gif

scrofsx_tic80_0_90_1723_ss.gif

以前の版と、現行版 1.0.2164 で、逆方向に表示がずれていることが分かる。

縦方向も逆になってる。 :

縦方向も試してみた。

_raster5.zip (raster5.tic)

_raster5.lua
t=0
x,y=96,24

function TIC()
 cls(13)
 map(0,0)
 spr(1+t%60//30*2,x,y,0,3,0,0,2,2)
 print("HELLO WORLD!",84,84,12)
 t=t+1
end

function BDR(v)
 -- TIC-80 0.90 later
 local y=v-4
 if y<0 or y>135 then return end
 my_bdr(y)
end

function SCN(v)
 -- TIC-80 0.70.6
 my_bdr(v)
end

function my_bdr(y)
 poke(0x3FF9,0)     -- screen offset x
 poke(0x3FFA,y*0.5) -- screen offset y
end

以下は、TIC-80 1.0.2164。

scrofsy_tic80_1_0_2164_ss.gif


以下は、TIC-80 0.70.6、0.90.1723。

scrofsy_tic80_0_70_6_ss.gif

scrofsy_tic80_0_90_1723_ss.gif

これも、ずれる方向が逆になっている。

以上、31 日分です。

過去ログ表示

Prev - 2022/10 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project