ときどきの雑記帖 RE* (新南口)
小ネタ
気がついたら一本も書かずに7月が終わろうとしているので適当に小ネタを。
TINY BASIC
ちょっと前にGW-BASICのソースコードが公開されましたが、 今回はBASICでもTINY BASICの話 (GW-BASICの方でも書きかけの記事があるのだけどそれはまたの機会に)。
ver2.0
いわゆる Palo Alto Tiny BASIC のソースコードを眺めていたら
;*************************************************************
;
; TINY BASIC FOR INTEL 8080
; VERSION 2.0
; BY LI-CHEN WANG
; MODIFIED AND TRANSLATED
; TO INTEL MNEMONICS
; BY ROGER RAUSKOLB
; 10 OCTOBER,1976
; @COPYLEFT
; ALL WRONGS RESERVED
;
; ADDED FIX FOR BUGGY CHGSGN
; UDO MUNK, 10 DECEMBER 2019
;*************************************************************
これね。
コードの最初の方はこんな感じになっている。
0000 ORG 0H
0000 310020 START: LXI SP,STACK ;*** COLD START ***
0003 3EFF MVI A,0FFH
0005 C34506 JMP INIT
;
0008 E3 XTHL ;*** TSTC OR RST 1 ***
0009 EF RST 5 ;IGNORE BLANKS AND
000A BE CMP M ;TEST CHARACTER
000B C36800 JMP TC1 ;REST OF THIS IS AT TC1
;
000E 3E0D CRLF: MVI A,CR ;*** CRLF ***
;
0010 F5 PUSH PSW ;*** OUTC OR RST 2 ***
0011 3A0008 LDA OCSW ;PRINT CHARACTER ONLY
0014 B7 ORA A ;IF OCSW SWITCH IS ON
0015 C36F06 JMP OC2 ;REST OF THIS IS AT OC2
;
0018 CD7103 CALL EXPR2 ;*** EXPR OR RST 3 ***
001B E5 PUSH H ;EVALUATE AN EXPRESSION
001C C32D03 JMP EXPR1 ;REST OF IT AT EXPR1
001F 57 DB 'W'
;
0020 7C MOV A,H ;*** COMP OR RST 4 ***
0021 BA CMP D ;COMPARE HL WITH DE
0022 C0 RNZ ;RETURN CORRECT C AND
0023 7D MOV A,L ;Z FLAGS
0024 BB CMP E ;BUT OLD A IS LOST
0025 C9 RET
0026 414E DB 'AN'
;
0028 1A SS1: LDAX D ;*** IGNBLK/RST 5 ***
0029 FE20 CPI 20H ;IGNORE BLANKS
002B C0 RNZ ;IN TEXT (WHERE DE->)
002C 13 INX D ;AND RETURN THE FIRST
002D C32800 JMP SS1 ;NON-BLANK CHAR. IN A
;
0030 F1 POP PSW ;*** FINISH/RST 6 ***
0031 CDB604 CALL FIN ;CHECK END OF COMMAND
0034 C3C904 JMP QWHAT ;PRINT "WHAT?" IF WRONG
0037 47 DB 'G'
;
0038 EF RST 5 ;*** TSTV OR RST 7 ***
0039 D640 SUI 40H ;TEST VARIABLES
003B D8 RC ;C:NOT A VARIABLE
003C C25800 JNZ TV1 ;NOT "@" ARRAY
003F 13 INX D ;IT IS THE "@" ARRAY
0040 CD1A04 CALL PARN ;@ SHOULD BE FOLLOWED
0043 29 DAD H ;BY (EXPR) AS ITS INDEX
0044 DA9F00 JC QHOW ;IS INDEX TOO BIG?
0047 D5 PUSH D ;WILL IT OVERWRITE
0048 EB XCHG ;TEXT?
0049 CD5904 CALL SIZE ;FIND SIZE OF FREE
004C E7 RST 4 ;AND CHECK THAT
004D DAF704 JC ASORRY ;IF SO, SAY "SORRY"
0050 21001F LXI H,VARBGN ;IF NOT GET ADDRESS
0053 CD7C04 CALL SUBDE ;OF @(EXPR) AND PUT IT
0056 D1 POP D ;IN HL
0057 C9 RET ;C FLAG IS CLEARED
ところどころ DB ‘W’ のように一見意味のないデータが入ってきているのが気になった。
こんな感じにアセンブリ言語のプログラムでコード中に一見無意味な バイトが挿入されるのはたとえばTINY BASICにもある
02B0 210000 REM: LXI H,0H ;*** REM ***
02B3 3E DB 3EH ;THIS IS LIKE 'IF 0'
02B4 DF IFF: RST 3 ;*** IF ***
02B5 7C MOV A,H ;IS THE EXPR.=0?
02B6 B5 ORA L
02B7 C25701 JNZ RUNSML ;NO, CONTINUE
02BA CD5905 CALL FNDSKP ;YES, SKIP REST OF LINE
02BD D25001 JNC RUNTSL ;AND RUN THE NEXT LINE
02C0 C3BA00 JMP RSTART ;IF NO NEXT, RE-START
のようにコード全体の大きさを縮めるために一部分を共有させるためというのが思い浮かぶ。
この例の場会は、ラベルREMから実行されたときには RST 3 はその前のバイト 3E との組み合わせでAレジスタへのmov命令の一部となって実行されない (その直後にAレジスタへのmov命令があるので、この命令には特段の意味はない)が、 IFFラベルから実行された場合はRST 3は実行される。
8080の命令についてはこの辺を Intel 8080A
シグネチャ?
よーくコードを見てみると、このバイト確保命令を若い番地から並べたときに
001F 57 DB 'W'
0026 414E DB 'AN'
0037 47 DB 'G'
‘WANG’ となる。 ひょっとして自分の名前を埋め込んだ?
実は ver 1.0 のコードを見ると
0000 ORG 0000H
0000 F3 START: DI ;*** START/RESTART ***
0001 310020 LXI SP,STACK ;INITIALIZE THE STACK
0004 C3BA00 JMP ST1 ;GO TO THE MAIN SECTION
0007 4C DB 'L'
;
0008 E3 XTHL ;*** TSTC OR RST 1 ***
0009 EF RST 5 ;IGNORE BLANKS AND
000A BE CMP M ;TEST CHARACTER
000B C36800 JMP TC1 ;REST OF THIS IS AT TC1
;
000E 3E0D CRLF: MVI A,CR ;*** CRLF ***
;
0010 F5 PUSH PSW ;*** OUTC OR RST 2 ***
0011 3A0008 LDA OCSW ;PRINT CHARACTER ONLY
0014 B7 ORA A ;IF OCSW SWITCH IS ON
0015 C31A07 JMP OC2 ;REST OF THIS IS AT OC2
;
0018 CD5504 CALL EXPR2 ;*** EXPR OR RST 3 ***
001B E5 PUSH H ;EVALUATE AN EXPRESSION
001C C31104 JMP EXPR1 ;REST OF IT AT EXPR1
001F 57 DB 'W'
;
0020 7C MOV A,H ;*** COMP OR RST 4 ***
0021 BA CMP D ;COMPARE HL WITH DE
0022 C0 RNZ ;RETURN CORRECT C AND
0023 7D MOV A,L ;Z FLAGS
0024 BB CMP E ;BUT OLD A IS LOST
0025 C9 RET
0026 414E DB 'AN'
;
0028 1A SS1: LDAX D ;*** IGNBLK/RST 5 ***
0029 FE20 CPI ' ' ;IGNORE BLANKS
002B C0 RNZ ;IN TEXT (WHERE DE->)
002C 13 INX D ;AND RETURN THE FIRST
002D C32800 JMP SS1 ;NON-BLANK CHAR. IN A
;
0030 F1 POP PSW ;*** FINISH/RST 6 ***
0031 CD9105 CALL FIN ;CHECK END OF COMMAND
0034 C3A405 JMP QWHAT ;PRINT "WHAT?" IF WRONG
0037 47 DB 'G'
;
先頭に ‘L’がきて LWANG となる。 L と W の間にピリオドがないのが残念だけど、より名前からもって来たっぽくなってる。
そもそもが、8番地ごとの境界にコードを置かないといけないRST のコードのための埋め草に (00 == NOPではない)意味ありげなデータを使ったという話のような気もするけど、 「遊び心」が感じられていいよね。というオハナシ。
これを書く直前に5月半ばから始まっている 復活!TINY BASIC という連載に気がついてネタ被りを心配したのだけど、 杞憂だった模様。
追記
やっぱり被ってた orz
復活!TINY BASIC 第12回 最も基本的なサブルーチン(3)
変数名 / 関数名
昔々のegrepのソースコード を読んでいたら変数名や関数名に見覚えのある人名を発見した。
regexp *rspencer;
char *pattern, *patboy;
boyermoore ( file, pattern ) /* "reach out and boyer-moore search someone" */
char *file, *pattern; /* -- soon-to-be-popular bumper sticker */
{
FILE *
mcilroy ( file ) /* open a pipe to old 'egrep' for long files, */
char *file; /* ... where regexp() might be inefficient */
{
boyer-moore はまあわからんでもないけど、 正規表現ライブラリとのやり取りに使う構造体に rspencer とは。
いやまあライブラリ関数の作者は Henry Spencer なんですけどね
max value of gawk’s NF
ふと見かけた記事 gawk で NFに入る最大値を調べてみた。 - Qiita で、惜しいところで答えにたどり着けてなかったので書いておこう。
実はマニュアル The GNU Awk User’s Guide にこの辺の制限は明記されている (バージョン5になるまではマニュアルではなくソースアーカイブ中のLIMITATIONSというファイルに記載)。
C.4 Some Limitations of the Implementation
This following table describes limits of gawk on a Unix-like system (although it is variable even then). Other systems may have different limits.
で、その内容はNF以外の諸々含めてこんな感じ。
Item Limit Characters in a character class 2^(number of bits per byte) Length of input record MAX_INT Length of output record Unlimited Length of source line Unlimited Number of fields in a record MAX_LONG Number of file redirections Unlimited Number of input records in one file MAX_LONG Number of input records total MAX_LONG Number of pipe redirections min(number of processes per user, number of open files) Numeric values Double-precision floating point (if not using MPFR) Size of a field MAX_INT Size of a literal string MAX_INT Size of a printf string MAX_INT
NF はというと、Number of fields in a record なので MAX_LONG というのが答え。
とここまで書いたことろで上記の表に引っかかるものを見つけたのだけど 時間がないので今回は書かない。
po4a
時間切れのため割愛。
Old Soldiers Never Die
Amazon.co.jp: Old Soldiers Never Die: 音楽