ときどきの雑記帖 RE* (新南口)
Invasion: Earth
20億のアースノイド
BS12で放映された(第7章が残ってるけど) ガンダムUCを観てたら フル・フロンタルが 「20億のアースノイド」とか言ってるのね。
逆シャアの時点で地球圏全体の人口が100億だっけ? その内訳はh劇中では示されていないと思うけど、 一年戦争開戦時点からの 総人口と地球、宇宙の人口の比率の変化がどうなってんのかちょっと気になる (まあそんなの考える人はいなさそう)
BASIC
ところで出自が良くわからないんだけど、 githubには brajeshwar/Microsoft-BASIC-for-6502-Original-Source-Code-1978 という6502用のBASICのソースコードもあるのだけど
ふと思い立って、↑のソースコードと 今回Microsoftが公開したコードを比較してみた。
- BASIC-M6502/m6502.asm at main · microsoft/BASIC-M6502
- microsoft/BASIC-M6502: Microsoft BASIC for 6502 Microprocessor - Version 1.1
その結果は…
diff -u m6502.asm M6502.MAC.txt
--- m6502.asm
+++ M6502.MAC.txt
@@ -6952,4 +6952,4 @@
IF2,<
PURGE A,X,Y>
IFNDEF START,<START==0>
- END $Z+START
\ No newline at end of file
+ END $Z+START
マジで?!
えーあい
なんか出来たっぽいので公開。Microsoft BASIC M6502 C移植版です。https://t.co/UofVhjCiCz
— あうぇっど (@Awed_Urshy) September 5, 2025
元々のアセンブラをManusで解析させて、Cに落としてもらったものをCodexでブラッシュアップしました。
一通りは動いてる模様。すげぇな。
浮動小数点数(のフォーマット)や 例のイースターエッグがどうなっているのか気になったので(ry
- YosAwed/M6502: このプロジェクトは、1976-1978年にMicrosoftが開発したBASIC M6502 Version 1.1の機能セットを現代のC言語で実装するためのものです
- Code search results
M6502/system_functions.c at main · YosAwed/M6502
// WAIT文の実装
int cmd_wait(basic_state_t* state, parser_state_t* parser_ptr) {
// WAIT address, mask [, xor]
eval_result_t addr_result = evaluate_expression(state, parser_ptr);
if (has_error(state) || addr_result.type != 0) {
set_error(state, ERR_TYPE_MISMATCH, "Numeric address expected");
return -1;
}
token_t comma1 = get_next_token(state, parser_ptr);
if (comma1.type != TOKEN_DELIMITER || comma1.value.operator != ',') {
set_error(state, ERR_SYNTAX, ", expected in WAIT");
return -1;
}
eval_result_t mask_result = evaluate_expression(state, parser_ptr);
if (has_error(state) || mask_result.type != 0) {
set_error(state, ERR_TYPE_MISMATCH, "Numeric mask expected");
return -1;
}
uint8_t xor_val = 0;
token_t comma2 = get_next_token(state, parser_ptr);
if (comma2.type == TOKEN_DELIMITER && comma2.value.operator == ',') {
eval_result_t xor_result = evaluate_expression(state, parser_ptr);
if (has_error(state) || xor_result.type != 0) {
set_error(state, ERR_TYPE_MISMATCH, "Numeric XOR value expected");
return -1;
}
xor_val = (uint8_t)numeric_to_double(xor_result.value.num);
}
uint16_t address = (uint16_t)numeric_to_double(addr_result.value.num);
uint8_t mask = (uint8_t)numeric_to_double(mask_result.value.num);
init_virtual_memory();
// WAIT条件の実装(簡略化)
// 実際の6502では指定アドレスの値がマスクとXORの条件を満たすまで待機
uint8_t value = virtual_memory[address];
if ((value ^ xor_val) & mask) {
// 条件を満たしている場合は即座に復帰
return 0;
}
// 簡易実装:短時間待機
struct timespec ts = {0, 10000000}; // 10ms
nanosleep(&ts, NULL);
return 0;
}
イースターエッグはないっぽいですね。 まあ元のソースでも条件アセンブルで 特定の条件のときにアセンブルされるものだったから、 変換対象から漏れたのかもしれない。
実際入れるとなると
M6502/parser.c at main · YosAwed/M6502
// 次のトークンを取得
token_t get_next_token(basic_state_t* state, parser_state_t* parser) {
token_t token = {0};
skip_whitespace(parser);
if (parser->current_char == '\0') {
token.type = TOKEN_EOF;
return token;
}
token.position = parser->position;
// 数値
if (isdigit(parser->current_char) || parser->current_char == '.') {
token.type = TOKEN_NUMBER;
if (!parse_number(parser, &token.value.number)) {
set_error(state, ERR_SYNTAX, "Invalid number format");
}
return token;
}
// 文字列
if (parser->current_char == '"') {
token.type = TOKEN_STRING;
if (!parse_string(parser, &token.value.string)) {
set_error(state, ERR_SYNTAX, "Unterminated string");
}
return token;
}
// 変数またはキーワード
if (isalpha(parser->current_char)) {
char word[32];
uint16_t word_len = 0;
uint16_t start_pos = parser->position;
// 単語を読み取り
while ((isalnum(parser->current_char) || parser->current_char == '$') &&
word_len < sizeof(word) - 1) {
word[word_len++] = toupper(parser->current_char);
advance_parser(parser);
}
word[word_len] = '\0';
// キーワードチェック
uint8_t keyword_id = find_keyword(word);
if (keyword_id) {
token.type = TOKEN_KEYWORD;
token.value.keyword_id = keyword_id;
} else {
token.type = TOKEN_VARIABLE;
token.value.string = (char*)malloc(strlen(word) + 1);
if (token.value.string) {
strcpy(token.value.string, word);
}
}
return token;
}
// 演算子と区切り文字
char ch = parser->current_char;
advance_parser(parser);
switch (ch) {
case '+': case '-': case '*': case '/': case '^':
case '=': case '<': case '>':
token.type = TOKEN_OPERATOR;
token.value.operator = ch;
// 複合演算子のチェック
if ((ch == '<' || ch == '>') && parser->current_char == '=') {
advance_parser(parser);
// <= または >= として処理
} else if (ch == '<' && parser->current_char == '>') {
advance_parser(parser);
// <> として処理
}
break;
case '(': case ')': case ',': case ';': case ':':
token.type = TOKEN_DELIMITER;
token.value.operator = ch;
break;
case '\n': case '\r':
token.type = TOKEN_EOL;
break;
default:
set_error(state, ERR_SYNTAX, "Unexpected character");
token.type = TOKEN_EOF;
break;
}
return token;
}
この辺とかで いろいろやる必要があるし
M6502/parser.c at main · YosAwed/M6502
// キーワードテーブル
static const keyword_t keywords[] = {
{"END", 0x80}, {"FOR", 0x81}, {"NEXT", 0x82}, {"DATA", 0x83},
{"INPUT", 0x84}, {"DIM", 0x85}, {"READ", 0x86}, {"LET", 0x87},
{"GOTO", 0x88}, {"RUN", 0x89}, {"IF", 0x8A}, {"RESTORE", 0x8B},
{"GOSUB", 0x8C}, {"RETURN", 0x8D}, {"REM", 0x8E}, {"STOP", 0x8F},
{"ON", 0x90}, {"NULL", 0x91}, {"WAIT", 0x92}, {"LOAD", 0x93},
{"SAVE", 0x94}, {"DEF", 0x95}, {"POKE", 0x96}, {"PRINT", 0x97},
{"CONT", 0x98}, {"LIST", 0x99}, {"CLEAR", 0x9A}, {"GET", 0x9B},
{"NEW", 0x9C}, {"TAB", 0x9D}, {"TO", 0x9E}, {"FN", 0x9F},
{"SPC", 0xA0}, {"THEN", 0xA1}, {"NOT", 0xA2}, {"STEP", 0xA3},
{"+", 0xA4}, {"-", 0xA5}, {"*", 0xA6}, {"/", 0xA7},
{"^", 0xA8}, {"AND", 0xA9}, {"OR", 0xAA}, {">", 0xAB},
{"=", 0xAC}, {"<", 0xAD}, {"SGN", 0xAE}, {"INT", 0xAF},
{"ABS", 0xB0}, {"USR", 0xB1}, {"FRE", 0xB2}, {"POS", 0xB3},
{"SQR", 0xB4}, {"RND", 0xB5}, {"LOG", 0xB6}, {"EXP", 0xB7},
{"COS", 0xB8}, {"SIN", 0xB9}, {"TAN", 0xBA}, {"ATN", 0xBB},
{"PEEK", 0xBC}, {"LEN", 0xBD}, {"STR$", 0xBE}, {"VAL", 0xBF},
{"ASC", 0xC0}, {"CHR$", 0xC1}, {"LEFT$", 0xC2}, {"RIGHT$", 0xC3},
{"MID$", 0xC4}, {NULL, 0}
};
あと面白いと思ったのはこの辺のコード
M6502/parser.c at main · YosAwed/M6502
// 文字列をコピー
*result = (char*)malloc(length + 1);
if (!*result) return false;
strncpy(*result, parser->text + start_pos, length);
(*result)[length] = '\0';
advance_parser(parser); // 終了の"をスキップ
return true;
そうsytncpyを使うか。
それなら自前で’\0’書かないでも、srrncpyにlength+1渡せばいいんじゃね? という気がするけど分かりづらくなるか?
6800 アドレッシングモード
Motorola MC6800 Motorola 6800 - Wikipedia
; memcpy --
; Copy a block of memory from one location to another.
CVE-2025-57052
広く使われるC言語向け軽量JSONパーサ「cJSON」に重大な欠陥が判明。細工されたJSONポインタを通じて配列境界をすり抜け、メモリ外アクセスやサービス停止、さらには特権昇格の恐れもあるという。…
— yousukezan (@yousukezan) September 8, 2025
広く使われるC言語向け軽量JSONパーサ「cJSON」に重大な欠陥が判明。細工されたJSONポインタを通じて配列境界をすり抜け、 メモリ外アクセスやサービス停止、さらには特権昇格の恐れもあるという。
問題はcJSON_Utils.c内のdecode_array_index_from_pointer関数にあり、ループ条件で本来pointer[position] を検証すべきところをpointer[0]を参照してしまう論理ミスに起因する。このため「0A」のような入力が数値10と解釈され、 要素が存在しない位置へのアクセスが発生する。報告では実際にユーザー配列を用いた最小Cプログラムで、 0や1では正常にAliceやBobが返る一方、0Aでは存在しない要素10を参照しセグメンテーションフォルトを引き起こす例が示された。
影響範囲は広く、Web API、組み込み機器、デスクトップ・サーバーアプリなど、cJSONを用いたほぼ全てのソフトが対象となる。 攻撃者はこれを利用してサービスをクラッシュさせたり、境界外のメモリにアクセスして機密情報を窃取する可能性がある。 修正は単純で、ループ条件をpointer[position] <= ‘9’と正しく書き換えるだけである。 利用者は早急にパッチ適用やライブラリ更新を行うべきである。
という解説文を読ん
0Aでは存在しない要素10を参照し
という部分が気になったので(ry
for (position = 0; (pointer[position] >= '0') && (pointer[0] <= '9'); position++)
{
parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0');
}
('A'-'0') = 10The loop incorrectly checks pointer[0] instead of pointer[position], allowing non-digit characters to be processed as part of the array index. For example, input “0A” is parsed as index 10 (0*10 + (‘A’-‘0’) = 10), which is out of bounds for a 3-element array.
ここ違わない? 試しにrubyで確かめてみると
>ruby -e "puts ('A'.ord - '0'.ord)"
17
だよねえ。 さらに cJSON/cJSON_Utils.c at master · DaveGamble/cJSON · GitHub の問題の関数から一部を切り出してこんなプログラムをCで書いて確かめても
#include <stdio.h>
#include <stdlib.h>
int
main() {
const char *pointer = "0A";
size_t parsed_index = 0;
size_t position = 0;
for (position = 0; (pointer[position] >= '0') && (pointer[0] <= '9'); position++) {
parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0');
}
printf("pointer=%s, parsed_index=%d\n", pointer, parsed_index);
}
やっぱり17(それはそう)
ところで」size_t型の変数を出力するのに%d
を使っちゃったけど
あまりよろしくない(笑
printf() > size_t型の書式指定子 > %zu #C - Qiita
icloud
Windows 11 PC上のFirefoxで iCloud にサインインしようとすると2ファクタ認証のコードを入力するウィンドウが出ないまま「本人確認を完了できませんでした。もう一度お試しください。」となってサインインできない.同じPC上でEdgeやChromeでサインインしたら成功するのだが.なぜ???
— kazushi nishimoto (@sakurahanayuki) September 5, 2025
昨日からこの状態になってしまっていたのだけど 解決したのでメモ(上記の投稿のレスポンスに解決策が提示されているものがあるけど それは見なかった)
- firefoxでweb版iCloudに… - Apple コミュニティ
- お知らせ:iCloud.comにログインできない問題(フレームが表示されて消える) Firefoxをリフレッシュしないで、icloud.comとapple.comのクッキーをクリアしてください : r/firefox
やり方:
apple.com に行き、アドレスバーの左側に南京錠のアイコンが表示されるので、それをクリックします。
次に、「クッキーとサイトデータをクリア…」をクリックします。
クッキーを丸ごとクリアするのはちょっと腰が引けたので この手順を試してみたら動くようになった。
新刊近刊
大学数学質問箱
9月下旬新刊予定
— 書泉_MATH (@rikoushonotana) September 7, 2025
『聞いて納得! 大学数学質問箱 群・環・体・ガロア理論 篇』数学セミナー編集部(日本評論社)
大学数学の各分野を勉強する際に生じる疑問点や躓きどころを、質問・回答形式でじっくり解説。… pic.twitter.com/bS7vz349bv
聞いて納得! 大学数学質問箱 群・環・体・ガロア理論 篇|日本評論社
目で視る曲線と曲面
9月下旬新刊
— 書泉_MATH (@rikoushonotana) September 7, 2025
『目で視る曲線と曲面 初等微分幾何学入門』藤森 祥一(日本評論社)
曲線と曲面の初歩的な話題をとりあげ、微分幾何学の入り口を解説した本です。さまざまな概念を「目で視て」直感的にとらえられるように工夫しています。
微分幾何学を学ぶための、最初の一冊として最適です。… pic.twitter.com/r3dGfNJUaf
GNU
gitのコミットや メーリングリストから
OSF/1
サポートから外された
Remove support for OSF/1. - gnulib.git - gnulib - GNU portability library
OSF/1 = Tru64 and IRIX are
- already marked as unsupported for a while [1],
- end-of-life for more than 11 years [2],
- proprietary OSes that existed only on non-x86 hardware and are therefore unlikely to still be in use in virtual machines.
removing support for OSF/1 and IRIX
Re: removing support for OSF/1
I think EMX is dead [1].
On DOS, it is dead, yes.
Its extension to Windows 95/NT is dead as well:
https://www.os2site.com/sw/dev/rsx/index.html
But on OS/2 it lives on with a different libc:
https://trac.netlabs.org/libc/wiki
EMX対応のコードはいろいろと参考にさせてもらったなあ
gawk darc corner
- doc/gawk.texi: obscure invented abbreviations (d.c.) and (c.e.) and mino
- Doc updates. - gawk.git - gawk
gawk minrx-c
Start on attempt to rewrite minrx.cpp into C. - gawk.git - gawk
これがC版minrxの始まりっぽい
Bison
日本人らしい名前が見えたのでちょいと読んでみたら 修正案として
[BUG] NULL pointer dereference
-%printer { fputs ($$, yyo); } <char*> +%printer { fputs ($$?$$:"<NULL>", yyo); } <char*>
というのが示されていたのだけど、
最初$$?$$
を一塊の何かと思って
bisonにそんなものがあったのかとびっくりしてしまった。
が、なんのことはない
$$ ? $$ :"<NULL>"
ということっすな。
gforth
FORTRAN Compiler on IBM 704
- The arithmetic translator-compiler of the IBM FORTRAN automatic coding system | Communications of the ACM
- Assembly listing of transcription - Software Preservation Group
- FORTRAN II
Hugoメモ
ねじ
Microsoft Teams チャンネルのねじ
— ささみ (@sasami_axis) September 6, 2025
原文は「Threads in Microsoft Teams channels」
微笑ましい誤訳だhttps://t.co/LjsU4jObH8 pic.twitter.com/VFaM6dDkIi
Thread(s)って「糸」じゃないの? と思って調べてみたら、 「ねじ山」という意味もあるらしい。 でも「ねじ山」と「ねじ」って別物じゃあ?🤔
^ ネジって英語で何ていうの?ナット・ビス・ボルト、ネジを締める・緩めるまで| Kimini英会話
Invasion: Earth
【新刊案内・再掲】
— 株式会社IEDボードゲーム広報X (@K2_PUBLISHING) September 10, 2025
『インベージョン:アース』9月27日発売!
1981年にGDWから発売された同名SFゲームの完全日本語版がついに登場。トラベラー史における帝国vs地球の戦いがテーマで、箱絵は加藤直之氏の描き下ろしです!
500個限定生産。
製品詳細https://t.co/UlxQnRYcfW pic.twitter.com/NTvuLxzNRX
プレイする場所も時間も相手もいないけど 心強く惹かれるものがあったので
を見た。 値段で沈んだ😓
まあそれくらいの値段にはなるのだろうけど、 たんに手元に置くだけのためには以下略