Начинать надо с изучения WCX Writer's Reference.
---------- Post added at 13:16 ---------- Previous post was at 13:01 ----------
Если кто-то ещё не видел родные исходники LSX - LSX.src
---------- Post added at 13:42 ---------- Previous post was at 13:16 ----------
После анализа кода bkunix у меня сложилось впечатление, что авторов подкосила "мистическая тайна терминального буфера".
В LSX терминальный буфер cfree[NCLIST] описан и реализован в файле usr/kl.c
Код:/*
* The actual structure of a clist block manipulated by
* getc and putc (mch.s)
*/
struct cblock {
struct cblock *c_next;
char info[6];
};
/* The character lists-- space for 6*NCLIST characters */
struct cblock cfree[NCLIST];
/* List head for unused character blocks. */
struct cblock *cfreelist;
/*
* Initialize clist by freeing all character blocks, then count
* number of character devices. (Once-only routine)
*/
cinit()
{
register int ccp;
register struct cblock *cp;
ccp = cfree;
for (cp=(ccp+07)&~07; cp <= &cfree[NCLIST-1]; cp++) {
cp->c_next = cfreelist;
cfreelist = cp;
}
}
В bkunix всё почти так же, но есть и небольшая "оптимизация" ( src/sys/dev/kl.c ):
Код:/*
* The actual structure of a clist block manipulated by
* getc and putc (mch.s)
*/
struct cblock {
struct cblock *c_next;
char info[6];
};
/* The character lists-- space for 6*NCLIST characters */
struct cblock cfree[NCLIST];
/* List head for unused character blocks. */
struct cblock *cfreelist;
/*
* Initialize clist by freeing all character blocks, then count
* number of character devices. (Once-only routine)
*/
void
cinit()
{
register struct cblock *cp;
for (cp=cfree; cp <= &cfree[NCLIST-1]; cp++) {
cp->c_next = cfreelist;
cfreelist = cp;
}
}
Очевидно, что оба варианта совпадают для случая, когда массив cfree[NCLIST] выровнен по 8-байтовой границе. По жестокой случайности в актуальном коде bkunix это именно так и поэтому всё работает, но поэтому же любые изменения в размере кода, нарушающие выравнивание массива cfree[NCLIST] - приводят коварным и неуловимым глюкам.

