ときどきの雑記帖 RE* (新南口)
La Saison
カフェ{オレ,ラテ}
砂糖入りでないのが飲みたいのだけど あまりないんだよねえ…
ブラックばかりだと飽きる。
onetab
またおかしくなった。 今回は一部のサイトのタブだけが保存されずに残り続けてしまうというもの。 色々試したが状態が変わらなかったので データベースごと消して再初期化。
インターフェース
来月号はRust特集らしい。
瞬時符号
最近発売された
をパラパラと眺めていたら「瞬時符号」というのが出てきてなんじゃそれ。な状態に。 説明を読むと「語頭符号」として大学の講義で習ったのと同じもののような 気がしたので調べてみた。
語頭符号でない瞬時符号もある?
前の版にはなかったと思うので増えたもののひとつか>瞬時符号
FORTRAN Compiler on IBM 704
さて。 一ヶ月ちかく悩んだ例の話。 とは言えわかってしまえば なぜ気がつかなかったのかというレベルのものではあるのだけど。
REM ARITHMETIC / STATE B= 4F13441
REM 704 FORTRAN MASTER RECORD CARD / STATE B = F0180000. 4F13442
ORG 0 4F134421
PZE ORGB,,DMWR06 4F134422
PZE ENDB-1 4F134423
REM 4F13443
ORGB ORG 1824 4F13444
REM 4F13445
REM THIS IS A RECODED VERSION OF STATE B OF SECTION ONE, 704 4F13446
REM FORTRAN II. THE SCAN HAS BEEN COMPLETELY RECODED AND LEVEL 4F13447
REM ANALYSIS HAS BEEN FOLDED OVER. 4F13440
REM 4F13449
REM STATE B CONSISTS OF TWO PARTS....SCAN AND LEVEL ANALYSIS. 4F13450
REM THE SCAN IS LEFT TO RIGHT OVER THE SOURCE STATEMENT WHICH IS 4F13451
REM IN THE F REGION OF COMMON AND IS IN BCD. 4F13452
REM EACH FIXED POINT CONSTANT, FLOATING POINT CONSTANT, AND BCD 4F13453
REM ( HOLLERITH) ARGUMENT IN CALL NAME STATEMENTS ARE ENTERED IN 4F13454
REM TABLES AND GIVEN AN INTERNAL VARIABLE NAME. 4F13455
REM LEVEL ANALYSIS IS PREFORMED FOR EACH ELEMENT OF THE STATEMENT4F13456
REM WHERE AN ELEMENT IS DEFINED AS A VARIABLE, FUNCTION NAME OR (4F13457
REM AND THE OPERATOR WHICH PRECEDES IT. 4F13458
SLF 4F13459
CLA SIG1ST 4F13460
STO SIG1IX-3 4F13461
STZ ARGCTR CLEAR 4F13462
STZ CHSAVE X 4F13463
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
CAL E( SET ARERAS - E( 4F13471
SLW ARERAS X 4F13472
TSX C0190X,4 SET FWA --F AND CHCTR - 0 4F13473
CAL TXHOP SET SWITCHES FOR LEFT SCAN. 4F13474
STP MS093 X 4F13475
STP MS310 X 4F13476
STP MS321 X 4F13477
MS010 CAL ADPLUS SET OP TO ADDITION 4F13478
MS030 SLW E+1 X 4F13479
STZ FNBITS CLEAR FUNCTION NAME INDICATOR 4F13480
STZ FNCTR CLEAR FUNCTION ARG COUNTER. 4F13481
STZ G CLEAR RECEIVING CELL. 4F13482
CLS L(0) SET E = -0 4F13483
STO E X 4F13484
LXA L(6),2 SET IR2 FOR SIX CHARS. 4F13485
MS040 CAL CHSAVE CHAR IN CHSAVE, IF ANY, TO AC. 4F13486
TNZ MS041 X 4F13467
TSX C0190,4 CHSAVE EMPTY, GET NEXT CHAR. 4F13488
MS041 CAS L(9) IS CHAR. NUMERIC 4F13489
TRA MS050 N/, TAKE TRA 4F13490
MS4007 TXH CM4100,0 4F13491
TSX ROYCNV,4 X 4F13492
TRA HOLL RETURN 1, THIS WAS HOLLERITH. 4F13493
TRA LATXH THIS WAS FIXED OR FLOATING CONSTANT. 4F13494
MS050 LXA L(10),4 PREPARE TO TEST FOR PUNCTUATION. 4F13495
以下略
ARITHMETIC STATEMENTと判定されたときに呼び出されるこのサブルーチンで、 一文字読み込んでそれが数字かどうか判定している部分がある。 上記のコードでいうMS041付近がそれ。
TSX C0190,4 CHSAVE EMPTY, GET NEXT CHAR. 4F13488
MS041 CAS L(9) IS CHAR. NUMERIC 4F13489
TRA MS050 N/, TAKE TRA 4F13490
MS4007 TXH CM4100,0 4F13491
TSX ROYCNV,4 X 4F13492
TRA HOLL RETURN 1, THIS WAS HOLLERITH. 4F13493
TRA LATXH THIS WAS FIXED OR FLOATING CONSTANT. 4F13494
MS050 LXA L(10),4 PREPARE TO TEST FOR PUNCTUATION. 4F13495
なんだけど、CAS L(9)
という命令では
アキュムレーターに入っている文字が
9より大きければならTRA MS050
を実行し、
9と等しければTXH CM4100,0
を実行し、
9より小さければTSX ROYCNV,4
を実行する
という流れになる。
数字の処理をするのに、なぜ8以下と9とで違うことを? というのが最初の疑問で、 つづいてCM4100というラベルの辺りのコードを見ると
CM4100 TXI CM4101,A,-3 LA COUNTER MODIFICATION ROUTINES 4F13956
CM4101 SXD 3LBAR,A 4F13957
CM4102 SXD CBAR,B 4F13958
TXI CM4104,B,-1 4F13959
CM4104 SXD NBAR,B 4F13960
CM4105 *** MS010,0 4F13961
MS020 CAL ADSTAR 4F13962
TRA MS030 4F13963
こんなので、サブルーチンの先頭付近には戻ってきそうな雰囲気はあるものの
読んだ文字を捨ててしまっているように見える。
そしてソースコード全体を見るとCAS L(9)
をしているところは
結構あるのだけど
上記の場所ともう一か所を除くと
grep -A3 -e "CAS L(9" fort1.asm
CAS L(9) FOR NUMERIC OR NON-NUMERIC. 4F10462
C015X TXI C0151,0,** IF NON-NUMERIC, TRANSFER. 4F10463
NOP IF NUMERIC, THEN 4F10464
TSX C0180,2 * GO CONVERT TO BINARY. 4F10465
--
CAS L(9) AND IF NON-NUMERIC, THEN 4F10519
TRA 1,2 * RETURN TO CALLER. 4F10520
NOP IF NUMERIC, THEN 4F10521
STO 2G SAVE DIGIT IN 2G. 4F10522
--
SR6DC3 CAS L(9) TEST FOR NUMERIC. 4F11016
TSX DIAG,4 * IF NON-NUMERIC - GO TO DIAGNOSTIC. 4F11017
NOP NOP IF NUMERIC, 4F11018
STO SR6WRK+1 SAVE DIGIT, AND 4F11019
--
CAS L(9) COMPARE IT WITH 9. 4F11050
TXI SS0045,0 RETURN TO EXPLICIT CODING. 4F11051
NOP IF NUMERIC, 4F11052
STO FIRSTC SAVE RIGHT-ADJUSTED DIGIT, AND 4F11053
--
CAS L(9) TEST FOR NUMERIC 4F11064
TXI SS0017,0 AND IF 4F11065
CTESTX NOP CTEST-ENDMK FOUND TO BE NUMERIC 4F11066
TXH SS0012,1,0 CONTINUE BUILDING SYMBOL. BUT IF 4F11067
--
TESTH0 CAS L(9) 4F11379
TRA 1,4 * RETURN TO CALLER. 4F11380
NOP 4F11381
TSX DIAG,4 * ERROR -- GO TO DIAGNOSTIC. 4F11382
--
TESTI0 CAS L(9) 4F11384
TSX DIAG,4 * ERROR -- GO TO DIAGNOSTIC. 4F11385
TRA 1,4 * RETURN TO CALLER. 4F11386
TRA 1,4 * RETURN TO CALLER. 4F11387
--
CAS L(9) CONTINUE SCAN. 4F11694
TXI CD005,0 N 4F11695
TXI CD004,0 IS 4F11696
TXI CD004,0 A 4F11697
--
CAS L(9) AND COMPARE IT WITH 9. 4F11852
TXI C0205,0 IF NON-NUMERIC, GO COMPARE WITH (. 4F11853
NOP IF NUMERIC, THEN 4F11854
TSX C0180,2 * OBTAIN IN 1G THE BINARY EQUV BETA. 4F11855
--
MS041 CAS L(9) IS CHAR. NUMERIC 4F13489
TRA MS050 N/, TAKE TRA 4F13490
MS4007 TXH CM4100,0 4F13491
TSX ROYCNV,4 X 4F13492
--
FS030 CAS L(9) TEST FOR ILLEGAL ARGUMENT, 4F13554
TRA FS040 LEGAL, CONTINUE 4F13555
MS9002 TXH CM4200,0 4F13556
TSX DIAG,4 BEGINS NUMERIC, ERROR, 4F13557
--
CAS L(9) FOR NUMERIC OR NON-NUMERIC. 4F10462
C015X TXI C0151,0,** IF NON-NUMERIC, TRANSFER. 4F10463
NOP IF NUMERIC, THEN 4F10464
TSX C0180,2 * GO CONVERT TO BINARY. 4F10465
--
CAS L(9) AND IF NON-NUMERIC, THEN 4F10519
TRA 1,2 * RETURN TO CALLER. 4F10520
NOP IF NUMERIC, THEN 4F10521
STO 2G SAVE DIGIT IN 2G. 4F10522
--
SR6DC3 CAS L(9) TEST FOR NUMERIC. 4F11016
TSX DIAG,4 * IF NON-NUMERIC - GO TO DIAGNOSTIC. 4F11017
NOP NOP IF NUMERIC, 4F11018
STO SR6WRK+1 SAVE DIGIT, AND 4F11019
--
CAS L(9) COMPARE IT UITH 9. 4F11050
TXI SS0045,0 RETURN TO EXPLICIT CODING. 4F11051
NOP IF NUMERIC, 4F11052
STO FIRSTC SAVE RIGHT-ADJUSTED DIGIT, AND 4F11053
--
CAS L(9) TEST FOR NUMERIC. 4F11064
TXI SS0017,0 AND IF 4F11065
CTESTX NOP CTEST-ENDMK FOUND TO BE NUMERIC, 4F11066
TXH SS0012,1,0 CONTINUE BUILDING SYMBOL. BUT IF 4F11067
--
TESTH0 CAS L(9) 4F11380
TRA 1,4 * RETURN TO CALLER. 4F11381
NOP 4F11382
TSX DIAG,4 * ERROR -- GO TO DIAGNOSTIC. 4F11383
--
TESTI0 CAS L(9) 4F11385
TSX DIAG,4 * ERROR -- GO TO DIAGNOSTIC. 4F11386
TRA 1,4 * RETURN TO CALLER. 4F11387
TRA 1,4 * RETURN TO CALLER. 4F11388
--
CAS L(9) CONTINUE SCAN. 4F11694
TXI CD005,0 N 4F11695
TXI CD004,0 IS 4F11696
TXI CD004,0 A 4F11697
--
CAS L(9) AND COMPARE IT WITH 9. 4F11852
TXI C0205,0 IF NON-NUMERIC, GO COMPARE WITH (. 4F11853
NOP IF NUMERIC, THEN 4F11854
TSX C0180,2 * OBTAIN IN 1G THE BINARY EQUV BETA. 4F11855
--
MS041 CAS L(9) IS CHAR. NUMERIC. 4F13489
TRA MS050 N/, TAKE TRA 4F13490
MS4007 TXH CM4100,0 4F13491
TSX ROYCNV,4 X 4F13492
--
FS030 CAS L(9) TEST FOR ILLEGAL ARGUMENT. 4F13554
TRA FS040 LEGAL, CONTINUE 4F13555
MS9002 TXH CM4200,0 4F13556
TSX DIAG,4 BEGINS NUMERIC, ERROR. 4F13557
--
SCAN3 CAS L(9) IF NOT BLANK, COMPARE WITH NINE, DBC/073
TXI SCAN6,0 IF NON-NUMERIC, COMPARE CCTEST. DBC/074
NOP IF NUMERIC, THEN DBC/075
STO DIG CONVERT DBC/076
--
DCPT1 CAS L(9) DETERMINE THE DBC/164
TXI DCPT3,0 NUMBER, MODULO TEN, DBC/165
NOP OF DIGITS DBC/166
STO DIG IN FRACTION. DBC/167
--
SCAN3 CAS L(9) IF NOT BLANK, COMPARE WITH NINE, BDC/185
TXI SCAN6,0 IF NON-NUMERIC, COMPARE CCTEST. BDC/186
NOP IF NUMERIC, THEN BDC/187
STO DIG CONVERT BDC/188
--
DCPT1 CAS L(9) DETERMINE THE BDC/277
TXI DCPT3,0 NUMBER, MODULO TEN, BDC/278
NOP OF DIGITS BDC/279
STO DIG IN FRACTION. BDC/280
9と9未満とで同じラベルに飛んでいたり 9の部分がNOPになっていたりで特に不思議はない。 じゃあ一体8以下と9とで飛び先が違うアレはどういうことなんじゃと悩んでいたのだけど、 それは自分の思い込み(先入観)が原因だったという話。
以前ちょっと書いた話でTIXという分岐命令はインデックスレジスターに0を指定すると 無条件分岐命令(と同等のもの)になるというものがあったけど、 今回のこのTXHもそれと同じだと思っていたのね。
実はそれが大間違いで、
TXL : Nominally, TXL allows the comparison of the contents of an index register with a value specified in the decrement field. The branch will be taken if the contents of the index register are less than or equal to the specified decrement. This comparison is unsigned. Therefore, if the specified index register contains zero, the branch will always be taken. And if the index register is omitted in the instruction, the effect is the same as if an index register containing zero were specified, which makes TXL an unconditional branch, no matter what value the decrement field contains. The decrement field then becomes available to store useful constants, saved values, temporary variables, etc. That’s right, IBM 704 code commonly stores data inside branch instructions. This is horrifying to the modern programmer, but typical programming practice on early machines.
インデックスレジスターに0を指定した場合、0とdecrement partとの比較を行い その結果によって分岐するか否かが決まると。
TXH
Not indexable, Contains a decrement part. If the number in the specified index register is greater than the decrement, the calculator takes the next instruction from location Y and proceeds from there. If the number in the specified index register is less than or equal to the decrement, the calculator proceeds to the next instruction in sequence.
TXL
Not indexable, Contains a decrement part. If the number in the specified index register is less than or equal to the decrement, the calculator takes the next instruction from location Y and proceeds from there. If the number in the specified index register is greater than the decrement, the calculator proceeds to the next instruction in sequence.
問題のTXH CM4100,0
(とTXH CM4200,0
)では、
0(インデックスレジスター)と0(decrement part)を比較して
その結果は「等しい」(インデックスレジスターの方が大きい。ではない)ので
次の命令を実行するということで実質NOPと同じということになる。
ちなみに逆の判定をするTXLは無条件分岐命令になる (TXLのこの性質はこれから見ていくところで使われている)。
実際704のシミュレーターのコードを見ると
Sim704/CPU704.cs at master · rhobbie/Sim704
case 3: /*3000*/
if (splus) /* +3 : TXH */
{
DebugATD("TXH");
transferInst = true;
if (GetX() > (WA)(uint)SR.D)
{
NIC = GetYni();
doTransfer = true;
}
inst = true;
}
else /* -3 : TXL */
{
DebugATD("TXL");
transferInst = true;
if (GetX() <= (WA)(uint)SR.D)
{
NIC = GetYni();
doTransfer = true;
}
inst = true;
}
break;
Sim704/CPU704.cs at a3164c704eaf86860ecb39299e8131354da0c82a · rhobbie/Sim704
static WA GetX()
{
uint A = 0;
W3 T = SR.T;
if (0 != (T & 1))
A |= X[0];
if (0 != (T & 2))
A |= X[1];
if (0 != (T & 4))
A |= X[2];
return (WA)A;
}
インデックスレジスター指定部が0のときは0との比較になっている。
じゃあなんでそんなことをしているかというと、
MS4007 TXH CM4100,0 4F13491
や
MS9002 TXH CM4200,0 4F13556
のaddress partを「定数」として使っているんですな。 参照しているのはここで
LA0003 CLA MS9002 4F13797
STA LA4320 4F13798
PXD 0,0 4F13799
LDQ E+2 4F13800
STQ LAMBDA+11,A 4F13601
STQ LAMBDA+8,A 4F13802
STQ LAMBDA+5,A 4F13803
LGL 6 4F13804
STO FIRSTC 4F13805
SUB OPEN 4F13606
TZE LA003 4F13807
CLA MS4007 4F13808
SLT 2 4F13809
TRA LA002 4F13810
SLN 2 4F13811
CLA FINI03 4F13812
LA002 STA LA4320 4F13813
書き換え先はこう。
LA4320 TXI **,A,-9 4F13931
TXHという命令では初めてだったかもしれないけど、これまでにも見てきたのと同じパターンであったというオチでした。
いにしえの長老プログラマ
— たいにゃん (@bugnekotinyan) February 22, 2023
「やめるのじゃ、言い伝えによると、そのグローバル変数に手をつけるとおそろしいことがおこるのじゃ」
「一般人には役に立たないアルミ知識」
— Alunim🛠️ (@AluminiumMania) February 24, 2023
【爆着(ばくちゃく)】
いわゆる「金属接合」技術の一種💥💣正式には「爆発圧着」。二種類の金属を爆発力によって高速で衝突させ結合させるワイルドな接合方法。銅とアルミのクラッド材などに使われる。その爆発音はトラウマになるレベル😭 pic.twitter.com/VwBvKpiYSk
宇宙刑事の「変身」に使えそうな単語だ😄
洋書の著作権表示のあるページに、「10 9 8 7 6 5 4 3 2 1」とか「3 4 5 6 7 8 9」とかの数列が印刷されていることがありますね。「1 3 5 7 9 10 8 6 4 2」という不思議な順番の場合もあります。これ、最小の数値が「刷」を表します。たとえば→ pic.twitter.com/hD1zdHo0tW
— araki.s. (@asn5x) February 24, 2023
へー、と思って手元にあるオライリー(の原書)を何冊か確かめてみたけど それらしいのは見つからなかったでござるの巻。
Ruby 30周年記念小冊子のPDFデータを公開しました! #ruby30th https://t.co/Kb9XRWEfpv
— ruby30th (@ruby30th) February 25, 2023