vak: (бэсм-6)
[personal profile] vak
Переписал некоторые функции рантайм библиотеки с ассемблера на Би. К примеру, было:
    writeb: ,name,
         12 ,base,*
c
c Append one byte to output buffer.
c
 b/output:lc,block, w_count, b_shift, buffer(22)
c
    flush:  ,subp,
            ,aax, =377
            ,aex, =12       . compare to linefeed
            ,uza, flush
            ,aex, =12
c
            ,utc, w_count
            ,xts,
            ,aex, =26       . 22 words
            ,u1a, putchar
            ,ita, 13
            ,its,
            ,call, flush
            ,sti,
            ,ati, 13
c
 putchar:   ,bss,           . append byte to buffer
            ,sti,
         11 ,vtm, b/output
         11 ,wtc, 1         . b_shift
            ,asn, 64-40     . shift left
         11 ,wtc, 0         . w_count
         11 ,aox, 2         . read word from buffer
         11 ,wtc, 0         . w_count
         11 ,atx, 2         . write word to buffer
c
         11 ,xta, 1         . b_shift
            ,aex, =50
            ,uza, next_w
            ,aex, =50
            ,arx, =10       . increase shift
         11 ,atx, 1         . b_shift
         13 ,uj,
c
 next_w:    ,bss,           . advance to next word
         11 ,atx, 1         . clear b_shift
         11 ,xta, 0         . w_count
            ,arx, =1        . increment word count
         11 ,atx, 0         . w_count
         13 ,uj,
            ,end,
Стало:
/*
 * Append one byte to output buffer.
 */
writeb(b) {
    extrn out_cnt, out_shft, out_buff;
    auto p;

    b = b & 0377;
    if (b == '*n') {
        flush();
        return;
    }

    if (out_cnt == 22) {
        flush();
    }

    p = &out_buff[out_cnt];
    *p = *p | (b << (40 - out_shft));

    if (out_shft == 40) {
        /* next word */
        out_shft = 0;
        ++out_cnt;
    } else {
        /* next byte */
        out_shft = out_shft + 8;
    }
}

out_cnt;
out_shft;
out_buff[22];
Так ведь понятнее выходит, правда?

Date: 2025-04-18 19:36 (UTC)
ufm: (Default)
From: [personal profile] ufm
Я ассемблер этот не разумею, но в бишном варианте - это правильно, что символ перевода строки флушит вывод но сам по себе не выводится? Или flush() строчку переводит?

Date: 2025-04-18 19:47 (UTC)
ufm: (Default)
From: [personal profile] ufm
Вот так вот мы и пришли к сегодняшнему состоянию...
Сначала им не нравится ассемблер, потом Би, потом Си, а потом разврат, содомия, Джава и 32Г памяти - это только что-б система нормально стартанула. :))

Date: 2025-04-19 13:42 (UTC)
x86128: (Default)
From: [personal profile] x86128
Это точно, но если смотреть на новые языки типа Zig (и другие еще менее известные) то отчетливо виден тренд упрощения - отказ от макросов и ООП (либо его упрощение) тот-же Golang и Rust (2009, 2015 даты рождения соотв-но).

Date: 2025-04-19 04:47 (UTC)
x86128: (Default)
From: [personal profile] x86128
Красота. Теперь можно сделать маленькую мониторку по типу CP/M :)

Date: 2025-04-19 05:42 (UTC)
x86128: (Default)
From: [personal profile] x86128
Стаически линковать и как одиночный бинарь исполнять разве не получится?