ときどきの雑記帖 RE* (新南口)
混ぜるな危険
サチる
今さら聞けない!?おじさんビジネス用語「サチる」ってどういう意味?|@DIME アットダイム
入社後の研修が終わって配属されてあまり時間が経っていないころに 出席した(させられた)会議で この「サチる」が出て面食らった記憶が(遠い目)
会議後先輩に「『サチる』ってどういう意味ですか?」 と聞きましたとも😄
新500円硬貨対応自販機
初めて目撃した (が新500円硬貨の方をまだ見ていない😄)
Firefox
「Firefox 112」を試す - 細かな改良、パスワード欄の右クリックに「パスワード開示」オプション | マイナビニュース
リフレッシュ
[Ctrl]+[Shift]+[T](macOSでは[Cmd]+[Shift]+[T])ショートカットでは、閉じたタブを復元することができる。 さらに、このショートカットで、同じセッションから再度開くための閉じたタブがなくなった場合、前のセッションが復元される
とあるんだけど、[Ctrl]+[Shift]+[T]って前から使えたよねえ?
バウアー
スポニチの一面を飾っていてびっくりした>二軍戦で初登板
MID$
領域が重なっているときに 後ろから転送するか 前から転送するか という話?
について。
そういえばMicrosoftさんはGW-BASICのソースコードをオープンにしてくれていたじゃあないか ということを思い出したので、早速github microsoft/GW-BASIC: The original source code of Microsoft GW-BASIC from 1983 に。
まずは手元にダウンロードしたものをgrep。
grep -e "MID" *.asm
ADVGRP.ASM:897: MOV MINDEL,BX ;SAVE DELTA Y IN MIDEL
BISTRS.ASM:49: PUBLIC FRE,STRLIT,STRCPY,CAT,STRLT3,MID$
BISTRS.ASM:52: PUBLIC LHSMID
BISTRS.ASM:701: SUBTTL STRING FUNCTIONS - LEFT$, RIGHT$, MID$
BISTRS.ASM:755:; MID ($,#) RETURNS STR WITH CHARS FROM # POSITION
BISTRS.ASM:757:; MID ($,#,#) RETURNS STR WITH CHARS FROM # POSITION
BISTRS.ASM:761:MID$: XCHG BX,DX ;PUT THE TEXT POINTER IN [H,L]
BISTRS.ASM:770: CALL MIDRST ;DUPLICATE OF CODE CONDITIONED OUT
BISTRS.ASM:833:;USED BY MID$ FOR PARAMETER CHECKING AND SETUP
BISTRS.ASM:973: SUBTTL STRING FUNCTIONS - LEFT HAND SIDE MID$
BISTRS.ASM:974:LHSMID: CALL SYNCHR
BISTRS.ASM:985: JB SHORT NCPMID ;IF ALREADY IN STRING SPACE
BISTRS.ASM:992: JAE SHORT NCPMID ;Yes, Don't copy!!
BISTRS.ASM:999:NCPMID: POP BX ;GET DESC. POINTER
BISTRS.ASM:1012: CALL MIDRST ;USE MID$ CODE TO EVALUATE POSIBLE THIRD ARG.
BISTRS.ASM:1072:MID$LP: MOV SI,DX
BISTRS.ASM:1082: JNZ SHORT MID$LP ;IF NOT DONE, MORE COPYING.
BISTRS.ASM:1085:MIDRST: MOV DL,LOW 255 ;IF TWO ARG GUY, TRUNCATE.
BISTRS.ASM:1087: JZ SHORT MID2 ;[E] SAYS USE ALL CHARS
BISTRS.ASM:1092:MID2: CALL SYNCHR
GIODSK.ASM:290: LODSW ;Get middle word
GWDATA.ASM:140: EXTRN RIGHT$:NEAR,MID$:NEAR,VAL:NEAR
GWDATA.ASM:237: EXTRN MIDTK:NEAR,MINUTK:NEAR
GWDATA.ASM:1481: ;[MIDDLE ORDER OF MANTISSA]
GWEVAL.ASM:254: EXTRN MIDTK:NEAR,MINUTK:NEAR
GWEVAL.ASM:1521: SUBTTL STRING FUNCTIONS - LEFT HAND SIDE MID$
GWEVAL.ASM:1523:PUBLIC ISMID$
GWEVAL.ASM:1524:ISMID$: CMP AL,LOW 126D ;FUNCTION? (FF - $END)
GWEVAL.ASM:1531: CMP AL,LOW OFFSET MIDTK ;IS IT MID?
GWEVAL.ASM:1532: EXTRN LHSMID:NEAR ;CODE IS IN BISTRS.MAC
GWEVAL.ASM:1534: JMP LHSMID
GWLIST.ASM:223: EXTRN ISMID$:NEAR
GWLIST.ASM:246: EXTRN MIDTK:NEAR,MINUTK:NEAR
GWMAIN.ASM:231: EXTRN ISMID$:NEAR
GWMAIN.ASM:258: EXTRN MIDTK:NEAR,MINUTK:NEAR
GWMAIN.ASM:1640: JMP ISMID$ ;TRY FOR LHS MID$ STATEMENT
GWMAIN.ASM:1702: JAE SHORT GISMD$ ;SEE IF LHS MID$ CASE
GWMAIN.ASM:3465: JNZ SHORT NTREMR ;IN THE MIDDLE WHICH MAY BE VIEWED AS
IBMRES.ASM:247: R MID$
IBMRES.ASM:248:PUBLIC MIDTK
IBMRES.ASM:249: MIDTK=QQ
IBMRES.ASM:432: QF MID$
IBMRES.ASM:726: NUMGFN=(2*MIDTK)-(2*ONEFUN)+1
IBMRES.ASM:919:GIIRET: RET ;MID$ OR SYNTAX ERROR
MATH1.ASM:2743: SBB AX,DX ;DO MIDDLE BYTES
お手軽に検索したのでいかにも余計なものも引っかかっているけど、 BISTRS.ASMにあるのが目的なものだろうと判断してみていくと、 今回探し求めているものは
; MID ($,#) RETURNS STR WITH CHARS FROM # POSITION
から始まるものではなく、 LHSMIDというラベルから始まるサブルーチンのようだ。
LHSMID
SUBTTL STRING FUNCTIONS - LEFT HAND SIDE MID$
LHSMID: CALL SYNCHR
DB OFFSET "(" ;MUST HAVE (
CALL PTRGET ;GET A STRING VAR
CALL CHKSTR ;MAKE SURE IT WAS A STRING
PUSH BX ;SAVE TEXT POINTER
PUSH DX ;SAVE DESC. POINTER
XCHG BX,DX ;PUT DESC. POINTER IN [H,L]
INC BX ;MOVE TO ADDRESS FIELD
MOV DX,[BX] ;GET ADDRESS OF LHS IN [D,E]
MOV BX,STREND ;SEE IF LHS STRING IS IN STRING SPACE
CMP BX,DX ;BY COMPARING IT WITH STKTOP
JB SHORT NCPMID ;IF ALREADY IN STRING SPACE
;DONT COPY.
DSEG SEGMENT PUBLIC 'DATASG'
EXTRN TXTTAB:WORD
DSEG ENDS
MOV BX,TXTTAB
CMP BX,DX ;Is this a fielded string?
JAE SHORT NCPMID ;Yes, Don't copy!!
NCP1: POP BX ;GET BACK DESC. POINTER
PUSH BX ;SAVE BACK ON STACK
CALL STRCPY ;COPY THE STRING LITERAL INTO STRING SPACE
POP BX ;GET BACK DESC. POINTER
PUSH BX ;BACK ON STACK AGAIN
CALL VMOVE ;MOVE NEW DESC. INTO OLD SLOT.
NCPMID: POP BX ;GET DESC. POINTER
POP SI ;XTHL
XCHG SI,BX
PUSH SI ;GET TEXT POINTER TO [H,L] DESC. TO STACK
CALL SYNCHR
DB OFFSET 54O ;MUST HAVE COMMA
CALL GETBYT ;GET ARG#2 (OFFSET INTO STRING)
OR AL,AL ;MAKE SURE NOT ZERO
JNZ SHORT ??L010
JMP FCERR ;BLOW HIM UP IF ZERO
??L010:
PUSH AX ;SAVE ARG#2 ON STACK
MOV AL,BYTE PTR [BX] ;RESTORE CURRENT CHAR
CALL MIDRST ;USE MID$ CODE TO EVALUATE POSIBLE THIRD ARG.
PUSH DX ;SAVE THIRD ARG ([E]) ON STACK
;MUST HAVE = SIGN
CALL FRMEQL ;EVALUATE RHS OF THING.
PUSH BX ;SAVE TEXT POINTER.
CALL FRESTR ;FREE UP TEMP RHS IF ANY.
XCHG BX,DX ;PUT RHS DESC. POINTER IN [D,E]
POP BX ;TEXT POINTER TO [H,L]
POP CX ;ARG #3 TO C.
POP AX ;ARG #2 TO A.
MOV CH,AL ;AND [B]
POP SI ;XTHL
XCHG SI,BX
PUSH SI ;GET LHS DESC. POINTER TO [H,L]
;TEXT POINTER TO STACK
PUSH BX ;SAVE TEXT POINTER
MOV BX,OFFSET POPHRT ;GET ADDR TO RETURN TO
POP SI ;XTHL
XCHG SI,BX
PUSH SI ;SAVE ON STACK & GET BACK TXT PTR.
MOV AL,CL ;GET ARG #3
OR AL,AL ;SET CC'S
JNZ SHORT $+3
RET ;IF ZERO, DO NOTHING
MOV AL,BYTE PTR [BX] ;GET LENGTH OF LHS
SUB AL,CH ;SEE HOW MANY CHARS IN EMAINDER OF STRING
JAE SHORT ??L011
JMP FCERR ;CANT ASSIGN PAST LEN(LHS)!
??L011:
INC AL ;MAKE PROPER COUNT
CMP AL,CL ;SEE IF # OF CHARS IS .GT. THIRD ARG
JB SHORT BIGLEN ;IF SO, DONT TRUNCATE
MOV AL,CL ;TRUNCATE BY USING 3RD ARG.
BIGLEN: MOV CL,CH ;GET OFFSET OF STRING IN [C]
DEC CL ;MAKE PROPER OFFSET
MOV CH,LOW 0 ;SET UP [B,C] FOR LATER DAD B.
PUSH DX ;SAVE [D,E]
INC BX ;POINTER TO ADDRESS FIELD.
MOV DL,BYTE PTR [BX] ;GET LOW BYTE IN [E]
INC BX ;BUMP POINTER
MOV BH,BYTE PTR [BX] ;GET HIGH BYTE IN [H]
MOV BL,DL ;NOW COPY LOW BYTE BACK TO [L]
ADD BX,CX ;ADD OFFSET
MOV CH,AL ;SET COUNT OF LHS IN [B]
POP DX ;RESTORE [D,E]
XCHG BX,DX ;MOVE RHS. DESC. POINTER TO [H,L]
MOV CL,BYTE PTR [BX] ;GET LEN(RHS) IN [C]
INC BX ;MOVE POINTER
MOV BX,[BX] ;GET LOW BYTE OF ADDRESS IN [A]
XCHG BX,DX ;ADDRESS OF RHS NOW IN [D,E]
MOV AL,CL ;IS RHS NULL?
OR AL,AL ;TEST
JNZ SHORT $+3
RET ;THEN ALL DONE.
とパラメーターチェックやら色々やった後で 以下のようにして転送。
; NOW ALL SET UP FOR ASSIGNMENT.
; [H,L] = LHS POINTER
; [D,E] = RHS POINTER
; C = LEN(RHS)
; B = LEN(LHS)
MID$LP: MOV SI,DX
MOV AL,[SI] ;GET BYTE FROM RHS.
MOV BYTE PTR [BX],AL ;STORE IN LHS
INC DX ;BUMP RHS POINTER
INC BX ;BUMP LHS POINTER.
DEC CL ;BUMP DOWN COUNT OF RHS.
JNZ SHORT $+3
RET ;IF ZERO, ALL DONE.
;IF LHS ENDED, ALSO DONE.
DEC CH
JNZ SHORT MID$LP ;IF NOT DONE, MORE COPYING.
RET ;BACK TO NEWSTT
ちょっと脱線するけど、そこかしこに 元は8080のコードだったことをうかがわせるものがありますな。 上記のコメントにあるH、L、D、E、B、Cとか。
さらに、このコードも808[68]のコードとしては ちょっと不思議な(無駄な)ことをしている。 レジスター間接アドレッシングに使えるのが BXとSI、DIなのでBXとSIを使うのはいいとして、 ループの中でいちいちDXレジスターから転送せんでも良いような (SIレジスターそのものをインクリメントできる)
ただまあ、公開されたときの関連記事にあったと思うのだけど 「なぞの仮想マシン用のアセンブラー」のようなもので書かれたものがベースにあって、 CPUごとにそれから変換していたということらしいので、 多少の謎(無駄)コードが入るのはしかたがないことなのかもしれない。
閑話休題。
転送のループで操作しているのがインクリメントだけなので
まああのような動作(結果が11111
)になりますわね。ということに。
ところで出自が良くわからないんだけど、 githubには brajeshwar/Microsoft-BASIC-for-6502-Original-Source-Code-1978 という6502用のBASICのソースコードもあるのだけど
MID
; MID ($,#) RETURNS STRING WITH CHARS FROM # POSITION
; ONWARD. IF # .GT. LEN ($) THEN RETURN NULL STRING.
; MID ($,#,#) RETURNS STRING WITH CHARACTERS FROM
; # POSITION FOR #2 CHARACTERS. IF #2 GOES PAST END OF STRING
; RETURN AS MUCH AS POSSIBLE.
;
MID: LDAI 255 ;DEFAULT.
STA FACLO ;SAVE FOR LATER COMPARE.
JSR CHRGOT ;GET CURRENT CHARACTER.
CMPI 41 ;IS IT A RIGHT PAREN )?
BEQ MID2 ;NO THIRD PARAM.
JSR CHKCOM ;MUST HAVE COMMA.
JSR GETBYT ;GET THE LENGTH INTO "FACLO".
MID2: JSR PREAM ;CHECK IT OUT.
BEQ GOFUC ;THERE IS NO POSTION 0
DEX ;COMPUTE OFFSET.
TXA
PHA ;PRSERVE AWHILE.
CLC
LDXI 0
SBCDY DSCPNT ;GET LENGTH OF WHAT'S LEFT.
BCS RLEFT2 ;GIVE NULL STRING.
EORI 255 ;IN SUB C WAS 0 SO JUST COMPLEMENT.
CMP FACLO ;GREATER THAN WHAT'S DESIRED?
BCC RLEFT3 ;NO, COPY THAT MUCH.
LDA FACLO ;GET LENGTH OF WHAT'S DESIRED.
BCS RLEFT3 ;COPY IT.
;
; USED BY RIGHT$, LEFT$, MID$ FOR PARAMETER CHECKING AND SETUP.
;
PREAM: JSR CHKCLS ;PARAM LIST SHOULD END.
PLA ;GET THE RETURN ADDRESS INTO
TAY ;[JMPER+1,Y]
PLA
STA JMPER+1
PLA ;GET RID OF FINGO'S JSR RET ADDR.
PLA
PLA ;GET LENGTH.
TAX
PULWD DSCPNT
LDA JMPER+1 ;PUT RETURN ADDRESS BACK ON
PHA
TYA
PHA
LDYI 0
TXA
RTS
これにはlvalueとしてのMIDはないような?
これは、 BASIC言語 MID$ステートメント 実行結果一覧.xlsx - Microsoft Excel Online によるとApple ][のApplesoft BASICでの結果はERRORなので、 なくて正解ということなのか。
Applesoft BASIC is a dialect of Microsoft BASIC, developed by Marc McDonald and Ric Weiland, supplied with the Apple II series of computers.
Applesoft BASIC was supplied by Microsoft and its name is derived from the names of both Apple Computer and Microsoft.
まあそれはさておきコードを追いかけていくと brajeshwar/Microsoft-BASIC-for-6502-Original-Source-Code-1978
RLEFT3
RLEFT3: PHA ;SAVE LENGTH.
JSR STRSPA ;GET SPACE.
LDWD DSCPNT
JSR FRETMP
PLA
TAY
PLA
CLC
ADC INDEX ;COMPUTE WHERE TO COPY.
STA INDEX
BCC PULMOR
INC INDEX+1
PULMOR: TYA
JSR MOVDO ;GO MOVE IT.
JMP PUTNEW
から brajeshwar/Microsoft-BASIC-for-6502-Original-Source-Code-1978
MOVDO: TAY
BEQ MVDONE
PHA
MOVLP: DEY
LDADY INDEX
STADY FRESPC
QMOVE: TYA
BNE MOVLP
PLA
MVDONE: CLC
ADC FRESPC
STA FRESPC
BCC MVSTRT
INC FRESPC+1
MVSTRT: RTS
という流れで転送している模様。
しかし6502にLDADY
やらSTADY
なんて命令あったっけ?
と思ったがreadmeからリンクをたどった先の
Microsoft BASIC for 6502 Original Source Code [1978] – pagetable.com
に
Like the 8080 version, the 6502 version was developed on a PDP-10, using the MACRO-10 assembler. A set of macros developed by Paul Allen allowed MACRO-10 to understand and translate 6502 assembly, albeit in a modified format to fit the syntax of macros, for example:
MOS 6502 MACRO-10 LDA #0 LDAI 0 LDA (ADDR),Y LDADY ADDR
こんな記述があった。なるほど。
ところでループ中で操作しているインデックスレジスターに対する命令を見ると
DEY
、つまりデクリメントしているんだけど
(ループを抜けるのもそれが0になったかどうかで判定)、
文字列のしっぽから頭に向かって転送していっている?
まあそれはおいといて、 この6502用のBASICが本当にMicrosoftによるものだったとして、 GW-BASICまでには数年空いているのだけど じゃあ左辺に置けるMID$はいつ頃入ったのか? という疑問が残る。 残念ながらそれを明らかにできる資料はないのだけど、 数年前に手に入れていた禁書😄 によればPC-8001用のN-BASICの時点ではすでに存在しているので、 1978年あたりか?
ANSI BASIC
起源やら初出やらは調べるのが大変そうなので、 「規格」的にはどうなのよ? という方向に行ってみる。
と言いつつもANSI(ISO以前のものだから)やら JISのドキュメントだとpay wallの向こうだよねえ… ということでまずは MOSTEK Microcomputer software Reference Manual から。
2.38 MID$
Format: MID$(<string exp1>,n[,m])=<string exp2>
where nand m are integer expressions and <string exp1> and <string exp2> are string expressions.Purpose:
To replace a portion of one string with anothe string.Remarks:
The characters in <string exp1>, beginning at position n, are replaced by the characters in <string exp2>. The optional m refers to the number of characters from <string exp2> that will be used in the replacement. If m is omitted, all of <string exp2> is used. However, regardless of whether m is omitted or included, the replacement of characters never goes beyond the original length of <string exp1>.
Example:10 A$="KANSAS CrrY, :10" 20 MIDS(AS,14)="KS" 30 PRINT AS RUN KANSAS CITY, KS
MIDS may also be used as a function that returns a substring of a given string. See Section 3.26.
右辺と左辺で同じ変数を使った場合というのは言及されてないですね。
もうひとつ THE NEW ANSI BASIC STANDARD から。
なんとこちらの場合
4 .3 . String Operations
The substring operator is not optimal . The notationA$(I : J)
denotes the substring of AS from the I-th position to the J-th position. Although this notation seems reasonable, it leads to substring expressions with strange forms.
MID$そのものがない😄 これは Full BASICへ至るものらしい。
Full BASIC
Microsoft BASIC習熟者のためのFull BASIC入門
Microsoft BASICではMID$関数を代入文の左辺に書いて文字列の置換ができますが,Full BASICでは部分文字列指定を代入文の左辺に書きます。たとえば,
MID$(s$,4,2)="xy"
に相当するFull BASICの文は
LET s$(4:5)="xy"
です。
左辺と右辺で同じ変数を使った場合にどうなるかは不明。
inc/dec
BASIC言語 MID$ステートメント 実行結果一覧.xlsx - Microsoft Excel Online
によると、結果が11234
となるものの大半はCPUMPUがモトローラ(680[09])
のもののようだ。
6502のコードにあったように、
680[09]だと「尻尾から転送」するコードの方が書きやすかったりする?
88VAやSuperMZ(M-Z2500)のBASICで11234
になるのはよくわからないけど、
Visual BASIC 2022 がそうなるのは
.NET上で動くもので文字列がimmutableだから。という気がする。
あー、TOWNS(のF-BASIC)も[34]86だけど実行結果が11234
だなあ。
既存の処理系にあわせた?
Commodore BASIC
Commodore BASIC, also known as PET BASIC or CBM-BASIC, is the dialect of the BASIC programming language used in Commodore International’s 8-bit home computer line, stretching from the PET (1977) to the Commodore 128 (1985).
The core is based on 6502 Microsoft BASIC, and as such it shares many characteristics with other 6502 BASICs of the time, such as Applesoft BASIC.
日本のメーカーのマシンでMicrosoft系でない BASICは皆目わからん😓
FORTRAN Compiler on IBM 704
や
urban hacks
カタクナなまでに自分で撮った画像は使わない😄
【提供】
— 鉃ど偏bot@新規提供者は固定ツイ見て (@tetsu_do_henken) March 26, 2023
※計算してください pic.twitter.com/9MUsWgynyY
Chat GPTにやらせた pic.twitter.com/Z2ao6rHk9y
— はるかげbotもどき (@haru_kage_train) March 26, 2023
元ツイートに対する反応にもあるけど 「平均値」は求められないような?
『イラストで学ぶ 世界を変えたコンピュータの歴史
『イラストで学ぶ 世界を変えたコンピュータの歴史』のチラシが上がってきました!
— Mai Sugimoto (@MaiSugimoto4) March 15, 2023
全頁フルカラーで、科目「情報」の参考文献にもぴったりだと思います。歴史的背景への目配りもしっかりした本です。中高生向けにぜひ。@ignotofsky pic.twitter.com/3bkN3st2cz
これは面白そうなので見かけたらチェックしよう。
peak LLM
関連: 「現在はピークLLMなのではないか」という指摘。検索エンジンの品質がSEOによって徐々に低下してきたのと同じように、LLMの品質も今後ゆるやかに低下していくであろうという仮説。理由はデータへのノイズ混入と、それを悪用しようとする人々の増加。https://t.co/jzxkPYRahL
— 新山祐介 (Yusuke Shinyama) (@mootastic) April 16, 2023
「ピークLLM」という言い回しに違和感があったので元記事に当たってみた。
Peak LLM - by Thomas Poinsot - I have thoughts
Peak LLM
We hear all the time about peak oil, the moment in history when oil production is at its peak, only to forever decline after that. What if we’re currently in peak LLM? The moment in history where ~none of the content used to train them, and to have them operate on is aware of its LLM consumers, but from now on everything will be, and the quality of LLMs will slowly decrease?
なるほど
石油ピーク(せきゆピーク、英: peak oil)とは、石油の産出量が最大となる時期・時点のこと。この時期を過ぎると、石油の産出量は減少の一途をたどる。
に掛けているのね>ピークLLM