ときどきの雑記帖 RE* (新南口)
失われた伝説を求めて
歩道で電動キックボードに煽られたというのを二回ほど書いたけど、 先日はなんと歩道を歩いていたのに 自動車に正面からぶつけられそうになったでござるの巻。
銀英伝@ウルジャン
イゼルローン陥落の凶報が届いたラインハルトは、その怒りを隠せずにいた。そしてヤンの元に旧自由惑星同盟の残存勢力が集結していく【銀河英雄伝説26巻】 - 電撃オンライン
だいぶ進んだなあ。と思って最新刊に収録されている回を確認したら200回を越えていて、 月刊誌連載でその回数ならそりゃあなあ。と。
コロッケそば
最強コロッケそば大冒険! 浅草の地下街の立ち食いそば屋『文殊 浅草店』 | ガジェット通信 GetNews
遥かな昔に、mattnさんにコロッケそばをおごる約束をしたような記憶がある。 むこうも覚えてないだろうけど。
uniball one P
丸善で見かけたので買ってみた。 軸の太さはもう少し細くてもよい気もするけど悪くはない。
んが、買ってから値段に気がついて以下略。
新書
気になるテーマの本が結構あるんだけど 手を出す余裕がナッシング。
steam
Why did Prolog lose steam? : programming
https://www.kmjn.org/notes/prolog_lost_steam.html
新刊近刊
早売りしているのを見かけたのでパラパラと眺めてみたのだけどなんというかその(もごもご)。 買ってもいない本の内容をあーだこーだ言うのも行儀がよろしくないような気がする (読み込んだわけでもないし)ので ひとつだけ書いておくと、
p.25の『「char」の仕様を確認する』の英文の解釈(翻訳)が間違っているような気がする。
大規模言語モデル(ChatGPT等)についての本を岩波書店より6/20に出版します。何ができるか、課題はなにか、実現技術(自己教師あり学習、機械学習のべき乗則、本文中学習、RLHF)、言語や知識獲得の謎、今後の展望についてです。私の従来本と違い専門知識を必要とせず読んでいだけるよう書いています https://t.co/UwG6uU9zZF
— Daisuke Okanohara / 岡野原 大輔 (@hillbig) April 22, 2023
お、これは楽しみな本が。 岩波のこのシリーズなら分量的にも読みやすそう。
perl
I sometimes get asked why I use Perl so much.
Here’s what Perl does well:
- It is installed by default everywhere. I don’t need administrative privileges to deploy Perl code almost anywhere. That is extremely empowering.
- With a great amount of discipline, Perl scripts can be successfully scaled up into large, complex systems.
- I can be confident that a Perl script I write today will run unaltered 10 years from now, modulo external collaborators.
- Perl can be used nearly as a shell replacement for very quick scripting.
- Perl has a small set of core syntax and is very extensible and flexible in adopting new paradigms.
MID$
そう考えると、じゃあMID$のこの仕様()がいつから始まったのか、と考古学をやりたくなってきますね。
— Toshitaka Miura (@tdmiura) April 11, 2023
ビルゲイツのMS-BASICからなのか、いずれかのTiny-BASICからなのか、はたまたダートマスからなのか。
同じような疑問を持つ人はいるもんだなあ😄
前回の記事を書いた後もちまちま調べるのは続いていて いくつか興味深い(と自分が考える)ことがわかった ので書いておく。
まず、MID(MID$)に関しては大きく以下のように分けられる。
- MID$がない
- 同等の機能がある
- 同等の機能はない
- MID$がある
- 代入できない
- 代入できる
先のツイートではTiny BASICにも言及しているけど、 わたしの知る限りではTiny BASICに分類されるもので 文字列型を持っているものはなかったように記憶している。
BASIC interpreter - Wikipedia によると、文字列の扱いについて次のようなバリエーションがあったようだ。
Strings
The original Dartmouth BASIC, some of its immediate descendants, and Tiny BASIC implementations lacked string handling. Two competing schools of string-handling evolved, pioneered by HP and DEC, although other approaches came later. These required different strategies for implementation.
String Handling in Prominent BASIC Interpreters
Dialect of BASIC Type Substrings HP Time-Shared BASIC Fixed length Slicing DEC BASIC-PLUS Variable length Functions Dartmouth BASIC Fourth Edition Variable length Array indexing Tiny BASIC Integer array Array indexing
そしてこの後の文に
This is in sharp contrast to BASICs following the DEC pattern that use functions such as LEFT$(), MID$(), and RIGHT$() to access substrings. Later adopted by ANSI BASIC, HP’s notation can also be used on the destination side of a LET or INPUT statement to modify part of an existing string value, for example 100 A$[3,5]=“XYZ” or 120 B$[3]=“CHANGE ALL BUT FIRST TWO CHARS”, which cannot be done with early implementations of LEFT$/MID$/RIGHT$.
とあるので、どうもDECによる実装がMID$(やLEFT$、RIGHT$)の元祖であるように読める。
ただ、which cannot be done with early implementations of LEFT$/MID$/RIGHT$
ともあるので文字列の内容の書き換えに使えるバージョンについては
よくわからない。
ざっとDECのBASICについて検索して見つかった dec :: pdp11 :: rsts :: V04 :: DEC-11-ORBPA-A-D BASIC-PLUS LangMan Oct72 : Free Download, Borrow, and Streaming : Internet Archive には
5-11 MID(A$,N1%,N2%)
という項目があり、この時点(1972年10月)ですでに($
がついてないけど)存在していた模様。
ただ、これやBASIC-PLUS2のマニュアルを見た感じでは
MIDの第三引数は省略できないように思えるのだけど
これはまた別の話なので今はおいておく。
さらに VSI BASIC for OpenVMS - Wikipedia を見たりしたが、古いものでかつソースコードが公開されているような 都合の良いもは見つからず、実際のところどうなのかはよくわからない😓
MSによる実装に関しても検索して調べてみてはしたものの、 よくわからん。というところ。
Microsoft BASIC の派生品
Variants and derivatives of Microsoft BASIC
時系列も不明だしねえ。
- CBASIC - Wikipedia
- MBASIC - Wikipedia
- Create your own Version of Microsoft BASIC for 6502 – pagetable.com
- Bill Gates’ Personal Easter Eggs in 8 Bit BASIC – pagetable.com
- List of BASIC dialects - Wikipedia
- List of computers with on-board BASIC - Wikipedia
HP Time-Shared BASIC - Wikipedia
Most BASICs of the 1970s trace their history to the original Dartmouth BASIC of the 1960s, but early versions of Dartmouth did not handle string variables or offer string manipulation features. Vendors added their own solutions; HP used a system similar to Fortran and other languages with array slicing, while DEC later introduced the MID/LEFT/RIGHT functions.
Notable among the additions made to BASIC-PLUS was the introduction of string functions like MID$ and LEFT$, in addition to Dartmouth’s original all-purpose CHANGE command. In future versions of the language, notably Microsoft’s, CHANGE was removed and BASIC-PLUS’s string functions became the only ways to perform these sorts of operations. Most BASICs to this day follow this convention.
さてこのあとどう進めたもんですかねえ…
F-BASIC
ところで
BASIC言語、MID$(ステートメント)実行結果一覧 2023.4.16
のリストの中で11234
となるものをみると
FM-7/FM77 | F-BASIC V3.0 |
FM-11AD2/AD2+ | F-BASIC V5.0 |
FM-11ST/AD/EX | F-BASIC V4.0 |
FM-8 | F-BASIC V1.0 |
FM-8 | F-BASIC V2 |
FM-TOWNS | F-BASIC386 |
BASIC MASTER LEVEL 3 | LEVEL-3 BASIC V1.0 |
MB-S1 | S1 BASIC V1.0 |
Windows 2022 | Visual Basic 2022 |
PC-88VA | N88-日本語BASIC v3.1 |
MZ-2500 | BASIC-M25 (6Z002) V2.0B |
MZ-2800 | BASIC-M28 (6Z016) V1.0A |
F-BASICの系列が含まれている(のは前回も書いた)。
って、リストをよく見るとF-BASIC V6.3の結果は11111
だな?🤔
まあそれはさておき。 F-BASIC - Wikipedia によれば
F-BASIC V1.0 (FM-8)
マイクロソフト製6809用BASICをベースに開発された最初のF-BASIC。当時は「FUJITSU MICRO 8 BASIC」と称していた。
ということなので、N-BASICみたいに逆アセンブルして以下略 みたいなことをした人はいないだろうか と期待してみたもののさすがに そういうことはなく。
ただ、
昨年の年末、Grant’s 6-chip 6809 computerで6809のMicrosoft BASICが公開されていることを発見。
個人的にはGrant’s 6-chip 6809 computerのBASICを移植したいと思っている。 これはMicrosoft BASICをもとにして再現困難なハードウェア(カセットテープとかサウンドとか)の命令を取り去ったもので、 機能的には申し分なく素晴らしい。課題は次の4点。 Microsoft BASICを逆アセンブルして改造しており、Microsoftが怒るかもしれない。 とはいえGrantが配布したソースを個人的に使う分には大丈夫だと思う。知らんけど。 SBC6809用に修正したソースとバイナリの一式をBASIC9.zipの名前でOneDriveに置いておく。 https://1drv.ms/u/s!Ai3MULhG7TFUjB4q_uwqFdrrk85S
というのが見つかったので、ここから辿って見つかったソースコードなどを見てみた (残念ながらリンクがいくつか無効になっていた(なくなっていた)けど)
6809 single board computer, Basic links - Software - Retro Computing
6809/README.md at master - jefftranter/6809 ・ GitHub
These are files and programs related to a 6809-based Single Board Computer based on the design by Grant Searle found at http://searle.x10host.com/6809/Simple6809.html
I built a slightly modified version and designed a PCB layout.
It can run a version of Microsoft BASIC ported by Grant Searle, a port of the Motorola ASSIST09 monitor, or a port of the Don Peters MONDEB monitor, all included here. I recommend using the “combined” firmware which combines both Microsoft BASIC and the ASSIST09 monitor into one ROM and also includes my disassembler which adds a new monitor U command. The files will assemble with the as9 assembler found at http://home.hccnet.nl/a.w.m.van.der.horst/m6809.html
ということで、Microsoftによる6809向けのBASICとやらはどんなものかとみてみると MID$ Statement(代入先になるMID$)はしっかり存在していて、 コードとしてはこんな感じ (ラベルがいかにも逆アセンブルしたものですといったものなのはご愛敬)。
6809/combined.asm at master ・ jefftranter/6809 ・ GitHub
* MID$(OLDSTRING,POSITION,LENGTH)=REPLACEMENT
L86D6 JSR GETNCH ; GET INPUT CHAR FROM BASIC
JSR LB26A ; SYNTAX CHECK FOR '('
JSR LB357 ; * GET VARIABLE DESCRIPTOR ADDRESS AND
PSHS X ; * SAVE IT ON THE STACK
LDD $02,X ; POINT ACCD TO START OF OLDSTRING
CMPD FRETOP ; COMPARE TO START OF CLEARED SPACE
BLS L86EB ; BRANCH IF <=
SUBD MEMSIZ ; SUBTRACT OUT TOP OF CLEARED SPACE
BLS L86FD ; BRANCH IF STRING IN STRING SPACE
L86EB LDB ,X ; GET LENGTH OF OLDSTRING
JSR LB56D ; RESERVE ACCB BYTES IN STRING SPACE
PSHS X ; SAVE RESERVED SPACE STRING ADDRESS ON STACK
LDX $02,S ; POINT X TO OLDSTRING DESCRIPTOR
JSR LB643 ; MOVE OLDSTRING INTO STRING SPACE
PULS X,U ; * GET OLDSTRING DESCRIPTOR ADDRESS AND RESERVED STRING
STX $02,U ; * ADDRESS AND SAVE RESERVED ADDRESS AS OLDSTRING ADDRESS
PSHS U ; SAVE OLDSTRING DESCRIPTOR ADDRESS
L86FD JSR LB738 ; SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION
PSHS B ; SAVE POSITION PARAMETER ON STACK
TSTB ; * CHECK POSITION PARAMETER AND BRANCH
BEQ L8724 ; * IF START OF STRING
LDB #$FF ; DEFAULT REPLACEMENT LENGTH = $FF
CMPA #') ; * CHECK FOR END OF MID$ STATEMENT AND
BEQ L870E ; * BRANCH IF AT END OF STATEMENT
JSR LB738 ; SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION
L870E PSHS B ; SAVE LENGTH PARAMETER ON STACK
JSR LB267 ; SYNTAX CHECK FOR ')'
LDB #TOK_EQUALS ; TOKEN FOR =
JSR LB26F ; SYNTAX CHECK FOR '='
BSR L8748 ; EVALUATE REPLACEMENT STRING
TFR X,U ; SAVE REPLACEMENT STRING ADDRESS IN U
LDX $02,S ; POINT X TO OLOSTRING DESCRIPTOR ADDRESS
LDA ,X ; GET LENGTH OF OLDSTRING
SUBA $01,S ; SUBTRACT POSITION PARAMETER
BCC L8727 ; INSERT REPLACEMENT STRING INTO OLDSTRING
L8724 JMP LB44A ; 'FC' ERROR IF POSITION > LENGTH OF OLDSTRING
L8727 INCA ; * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT
* ; * (INCLUSIVE) OF THE POSITION PARAMETER
CMPA ,S
BCC L872E ; BRANCH IF NEW STRING WILL FIT IN OLDSTRING
STA ,S ; IF NOT, USE AS MUCH OF LENGTH PARAMETER AS WILL FIT
L872E LDA $01,S ; GET POSITION PARAMETER
EXG A,B ; ACCA=LENGTH OF REPL STRING, ACCB=POSITION PARAMETER
LDX $02,X ; POINT X TO OLDSTRING ADDRESS
DECB ; * BASIC'S POSITION PARAMETER STARTS AT 1; THIS ROUTINE
* ; * WANTS IT TO START AT ZERO
ABX ; POINT X TO POSITION IN OLDSTRING WHERE THE REPLACEMENT WILL GO
TSTA ; * IF THE LENGTH OF THE REPLACEMENT STRING IS ZERO
BEQ L8746 ; * THEN RETURN
CMPA ,S
BLS L873F ; ADJUSTED LENGTH PARAMETER, THEN BRANCH
LDA ,S ; OTHERWISE USE AS MUCH ROOM AS IS AVAILABLE
L873F TFR A,B ; SAVE NUMBER OF BYTES TO MOVE IN ACCB
EXG U,X ; SWAP SOURCE AND DESTINATION POINTERS
JSR LA59A ; MOVE (B) BYTES FROM (X) TO (U)
CPUが違うものの、確かにGW-BASIC(やN-BASIC)と同じような処理の流れに思える
(細かく比較したらまた違うかもしれないけど)。
そしてMOVE (B) BYTES FROM (X) TO (U)
の部分を見ると
6809/combined.asm at master ・ jefftranter/6809 ・ GitHub
* MOVE ACCB BYTES FROM (X) TO (U)
LA59A LDA ,X+ ; GET BYTE FROM X
STA ,U+ ; STORE IT AT U
DECB ; MOVED ALL BYTES?
BNE LA59A ; NO
LA5A1 RTS
…あれ?😓
PC-6001
もうひとつ、NECのマシンの中で 実行結果がERRORになる(未実装)のものをみると
Apple II | Applesoft BASIC (FP BASIC) |
PB-1000C | C61-BASIC |
PET 2001 | COMMODORE BASIC |
JR-100 | JR BASIC |
JR-200 | JR BASIC 5.0 |
PC-6001 | N60-BASIC |
PC-6001 | N60-拡張BASIC |
PC-6001mkII | N60m-BASIC V1.7 |
PC-8201 | N82-BASIC V1.0 |
PC-6601SR | N66SR-BASIC V1.0 |
PHC-25 | SANYO BASIC V1.1 |
SC-3000 | SEGA SC-3000 BASIC Level 3 v1.0 |
SC-3000 | SEGA HOME BASIC v1.0J |
MZ-700/1500 / LSX-Doggers v1.58 Gaku | |
MZ-2000 | SHARP |
X1 turbo | dB-BASIC V1.2 |
X68000 | X-BASIC 2.02 |
m5 | Basic-I |
m5 | Basic-G |
m5 | Basic-F |
ぴゅう太 (TP-1000) | 日本語G-BASIC |
TRS-80 CoCo/2 | Color BASIC V1.0 |
Nintendo 3DS | プチコン3号 SMILE BASIC |
ファミリーコンピュータ | NS-HUBASIC V3.0 |
(PC-8201はさておき)6001の系列があるのはなぜなのか不思議だったので、 とりあえずうぃきぺでもみるかとあたってみると
PC-6000シリーズは、日本電気 (NEC) の子会社である新日本電気(後のNECホームエレクトロニクス)が発売したパーソナルコンピュータである。 PC-6001は日本電気のテレビ事業部が開発したもので、マイクロコンピュータ事業部が開発したPC-8001系列とは全く無関係に開発された[1]。 型番からはPC-8001系列の下位機種であるかのように見えるが、開発経緯も対象セグメントも異なる製品である。
P6シリーズの最初のBASICであり、全ての基本である。 機能的にはかなり貧弱で、円を描くCIRCLE命令すらなかった。またディスクドライブも使用できなかった。 これらを扱うためには別売のROMカートリッジ、N60-拡張ベーシック(N60 EXTENDED BASIC)が必要であった。
へー。 知らなかった。 そういう経緯があったのなら BASICも別物だったのはまあ納得できる。
続く。のか?
おまけ
Microsoft、GW-BASICをオープンソース化 | スラド デベロッパー
プログラマはまず独自のアセンブラ言語で記述した共通のソースコードを用意して それを独自のISA translatorで 8088向けにアセンブラのソースコードに変換 それをビルドしていたそうです
FORTRAN Compiler on IBM 704
bar
例の論文に
6. Level Analysis
The level analysis of an arithmetic expression = Φ consists in the reeursive generation of what we shall ca partial productions It , each partial production a string of triples (of entities to be described below) formed in the following manner.
We define three integer sequences {Ni}, {Ci}, {Ai} and a sequence {Ki} of integer sequences such that, initially, N1 = 1, C1 = A1 = 0 and K1 = A. By Ki we shall mean the last teml of the sequence Ki, and it Ki = (Θ, Ki) then K~i = (Θ) (possibly null). We set the initial partial production Πi = A, and if Πi→ΠiE, then Πi+1 = ΠiE.
という記述があったので 改めて ソースコードの ARITHMETIC STATEMENTのところをみると 初期化のところで
STZ 3LBAR X 4F13464
STZ NBAR X 4F13465
STZ CBAR X 4F13466
STZ ABAR X 4F13467
STZ FSTYPE X 4F13468
LXD 1BAR,4 SET NBAR=-1 4F13469
SXD NBAR,4 X 4F13470
なんか論文の記述と対応してそうな名前のものが。
NBARが二回出てきているけど、
STZ NBAR
でワード全体をゼロクリアしておいてから
LXD 1BAR,4
とSXD NBAR,4
の組み合わせでdecrement partに-1をセットする
ということらしい。
以前見たときには
1BAR OCT 77777000000 (2**15-1)*2**18DECREMENT MASK. 4F10386
のコメントにある(2**15-1)*2**18
がよくわからなかったけど
要はこれ
pre | decr | tag | addr |
---|---|---|---|
0 | 77777 | 0 | 00000 |
で、decrement partのみall 1のワードということなのね。 論文ではNの初期値は1なのに NBARの初期値が-1なのが気になるけど 704の例のアレ(インデックスレジスターの内容の2の補数が使われる) に関係するような気もするので とりあえずは放置。
LXD 3LBAR,A LOAD LA COUNTERS 4F13774 25
LXD NBAR,B 4F13775 26
LXD ABAR,C 4F13776 27
3LBARにあたるようなもの、論文にあったかなあ…