Операционная система ShaOS

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

Взял исходник от лета 1998, переписал все комменты по английски и выложил на гитхаб а летом 2018 переложил на гитлаб:

https://gitlab.com/shaos/shaos/blob/master/SHAOS.A

P.S. Линки на старые архивы:
http://www.nedopc.org/nedopc/shaos/s004_v0.zip (20K) - оригинальные исходники для RASM (1998)
http://www.nedopc.org/nedopc/shaos/s004_v0_.zip (13K) - перетранслированные в 2006 году исходники для ZMAC плюс TAP-файл:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

По решётке выполнилась вот такая тест-программа:

Code: Select all

TEST_EM:
        PUSH_H
        LXI_H,  TEST_S
        CALL    WST
        CALL    NLN

        LXI_D,  300
        MVI_A,  #AA
        CALL    MMR
        CALL    WHL
        CALL    NLN

        LXI_D,  100
        MVI_A,  #BB
        CALL    MMR
        CALL    WHL
        CALL    NLN
        PUSH_H

        LXI_D,  512
        MVI_A,  #CC
        CALL    MMR
        CALL    WHL
        CALL    NLN

        POP_H
        CALL    MMF
        CALL    HEX
        CALL    NLN

        POP_H
        RET

TEST_S  DB      "SHABARSHIN A.A.",0
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

Shaos wrote:Снова выложил описание операционки SHAOS от 1998 года:

http://nedopc.org/nedopc/shaos/shaos.htm

Думаю при реанимировании упаковать вектор вызовов системных подпрограмм покомпактнее, чтобы было без дырок, тогда в область #CCxx влезет 256/3=85.33 переходов на подпрограммы...
Основная идея вектора переходов в ОЗУ была в том, что можно было на лету подменять любую из системных подпрограмм, а также выстраивать цепочки драйверов (по аналогии с обработчиками софтовых прерываний в DOS) скажем для поддержки операций с файлами на разных носителях.

P.S. Может быть перенастройку вывода в файл или на принтер делать точно также? Просто подменяя адрес перехода? т.е. команда

ECHO SOMETHING >FILE

будет выполнена путём подмены адреса перехода на функцию печати символа, выполнения ECHO и восстановления адреса перехода на функцию печати символа...

P.P.S. Вобщем в новой реинкарнации ShaOS надо перетасовать системные функции так, чтобы вначале шли зависящие от конкретного железа (или в конце), а не в перемешку, как сейчас...

P.P.P.S. А может и ненадо...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re:

Post by Shaos »

Shaos wrote:Формат квазидисков операционки ShaOS:

Cтруктура аналогична ордосу - у каждого файла есть 16-байтовый заголовок (есть возможность иметь 32-байтовый - с меткой времени), среди файлов могут попадаться подкаталоги. Формат простого заголовка:

Code: Select all

struct HEADER
{
   char name[8];
   BYTE ext;
   UINT len;
   UINT adr;
   BYTE atr;
   UINT kc;
};
где
name - имя файла или каталога
ext - однобайтовое представление расширения файла (есть стандартная таблица перекодировки), для имени подкаталога оно 00
len - длина файла в параграфах (т.е. кратно 16 байтам), для подкаталога - 0000 (используется при пробегании по файлам для поиска следующего файла)
adr - адрес загрузки файла, для подкаталога - FFFF
atr - атрибуты файла
kc - контрольная сумма для файла, а для подкаталога это является указателем в параграфах (т.е. кратно 16 байтам) внутри образа диска на цепочку файлов-подкаталогов этого подкаталога

также описатель может быть не только файлом или каталогом, но и так называемым "ответвителем", когда цепочка файлов-подкаталогов прерывается и перескакивает в другое место ром-диска...
Вместо ответвителя я наверное просто файлы-пустышки сделаю - это файлы у которых имя начинается с нуля. С другой стороны как-то надо отличать друг от друга стёртые файлы и файлы закрывающие собой битые части ПЗУ...

Вот "осовремененный" список стандартных расширений ShaOS (добавил специфические для ZX форматы в конец и SHJ):
0 - (три пробела) будет означать имя директория (точка при этом не печатается);
1 - .BAT для пакетных файлов;
2 - .SYS для перемещаемых "системных" программ (точность перемещения 1 байт, могут быть перенесены после загрузки);
3 - .COM для неперемещаемых программ, оттранслированных для какого-то конкретного адреса;
4 - .EXE для перемещаемых программ (точность перемещения 256 байт, не могут быть перенесены после загрузки);
6 - .OVL для оверлеев, оттранслированных в какой-то конкретный адрес (загружаются из COM);
6 - .DLL для перемещаемых библиотек (точность перемещения 256 байт, не могут быть перенесены после загрузки);
7 - .BAS для программ на языке Бейсик (не ZX);
8 - .INI для текстовых файлов конфигураций в интуитивно-понятном формате INI;
9 - .INC для включаемых ассемблерных файлов (не RASM);
A - .ASM для ассемблерных файлов (не RASM);
B - .BIN для бинарных данных, не привязанных к конкретным адресам;
C - .CPP для программ на Си++ (так было задумано в 1996 году)
D - .DAT для произвольных данных, которые могут быть перемещаемы по памяти;
E - .TXT для обычных досовских текстовых файлов в альтернативной кодировке;
F - .TMP для временных файлов;
Потом можно ещё 16 кодов добавить - от #10 до #1F:
#10 - .SCR для ZX-экранов (включая таймекс);
#11 - .ATR для ZX-атрибутов;
#12 - .IMG для ZX-экранов в формате Gigascreen;
#13 - .SNA для ZX-образов;
#14 - .Z80 для ZX-образов;
#15 - .SZX для ZX-образов;
#16 - .TAP для ZX-лент;
#17 - .TRD для обрезанных образов TR-DOS;
...

Кроме того если код расширения файла представляет из себя код печатного символа (#20...#7E), то он будет считаться однобуквенным расширением - примеры:
.A - текст программы для RASM;
.B - бейсик программа ZX;
.C - код для ZX;
.D - данные для ZX;
.L - файл статической библиотеки (для будущих версий nedoPC SDK);
.O - объектный файл (для будущих версий nedoPC SDK);
.R - текст программы на языке Robby (для nedoPC SDK);
.N - скрипт для nedoPC SDK (бывший SHJ).
В будущем могут быть .c и .h (для программ на языке Си), но пока ограничимся только большими буквами...

P.S. Атрибуты файла (по состоянию на 1996 год):
бит 0 - R (только для чтения);
бит 1 - H (скрытый);
бит 2 - C (закодирован?);
бит 3 - P (находитя на своём месте в памяти?);
бит 4 - F (фрагментирован?);
бит 5 - L (файл имеет расширенный заголовок в 32 байта вместо 16);
биты 6 и 7 - C0,C1 (совместимость кода - 00 для 8080, 01 для 8085, 10 для Z80, 11 - см.расширенный заголовок).
Расширенный заголовок с датой и временем создания файла пока не предполагается...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

По поводу исполняемых файлов ShaOS:

COM и OVL по сути одно и тоже, за тем лишь исключением, что OVL нельзя запустить из командной строки - после возврата управления из точки входа (которая совпадает с началом файла) и COM, и OVL автоматически выгружаются (хотя наверное OVL можно оставлять на тот случай, если вдруг опять следом вызовут функцию из того же самого оверлея).

EXE и DLL отличаются тем, что у EXE только одна точка входа (может быть где угодно по ходу файла) и он выгружается при возврате, а у DLL точек входа много и такой файл остаётся в памяти пока его не выгрузят программно.

SYS лепятся друг за другом в конец свободной памяти и остаются там пока их не выгрузят поимённо через специальный API.

P.S. Для EXE и DLL поле adr вместо адреса будет содержать смещение до перемещаемого кода от начала тела файла. Перед перемещаемым кодом будет располагаться таблица перемещений размером в 1/8 от размера кода. Файл EXE или DLL будет грузиться в конец свободной области памяти (с шагом 256 байт) далее по таблице перемещений код будет модифицироваться и после этого таблица вместе с заголовком будет затёрта. Где-то в памяти будет висеть "фейковый" 16-байтовый заголовок, для того чтобы было понятно что это за код и каков его размер - расширение файла в заголовке всё также будет EXE или DLL, однако в поле adr теперь будет реальный адрес начала кода и в атрибутах будет взведён бит P (на своём месте).
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Операционная система ShaOS

Post by petrenko »

(IMHO) у файлов должны быть такие аттрибуты :
{заархивированный/закодированный}
{фрагментированный/длинное_имя} -от удлинителя имени часть "отгрызть" для указателя на следующий фрагмент.*
{скрытый/системный}
{}
{разрешено_чтение}
{разрешена_запись}
{разрешено_выполнение}
|\_и на каком цпу оно разрешено, а 11 пусть будет "не_разрешено"
{разрешено_выполнение}|/

*_То есть с этим флагом имя может выглядет как то так :
" |файл_с_длинным_и|[frag№]#{адр.след.фраг.}менем.TXT| "
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

Неее - никаких длинных имён :)

А по поводу фрагментированности - это я так планировал дырки заделывать, освободившиеся от удалённых файлов если новый файл больше, чем старая дырка - в этом случае вместо файла записывается небольшой блок кода со ссылками на файлы - фрагменты, разбросанные по квазидиску в произвольном порядке (типа FAT).
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Операционная система ShaOS

Post by petrenko »

Неее - никаких длинных имён ..
Ну тогда даже проще, пущай будут такие аттрибуты :

бит№0 {разрешена_запись}
бит№1 {скрытый/системный}
бит№2 {заархивированный/закодированный}
бит№3 { ??? }
бит№4 {фрагментированный/<зарезервировано>}
-от удлинителя имени /-часть-/ все "отгрызть" для указателя на следующий фрагмент.*
бит№5 {разрешено_чтение}
бит№6 {разрешено_выполнение}
|\_и на каком цпу оно разрешено, а 11 пусть будет "не_разрешено"*
бит№7 {разрешено_выполнение}|/
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

а что будет если чтение не разрешено? в чём смысл такого файла?
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Операционная система ShaOS

Post by petrenko »

Ну .. это .. важные системные выполняемые файлы обычно имеют разрешение на выполнение и запрет на чтение и тем более запрет на запись. ( Хотя зачастую всё равно "root" может то, что не могут другие пользователи. :rotate: )

Если ещё есть и запрет на запись в область памяти, где лежит выполняемый код, то это повышает надёжность системы.
( Для нищебродских решений на i8080 контроль доступа к памяти не очень актуален, ибо требует такого диспетчера памяти, который "навороченнее" самого i8080 :-? )
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

Ну в этом и проблема - у меня нету суперпользователя :)
Поэтому флага read-only будет достаточно (для ПЗУ)
Значит пока пусть остаётся дизайн 1996 года:
бит 0 - R (только для чтения);
бит 1 - H (скрытый);
бит 2 - C (закодирован);
бит 3 - P (находится на своём месте в памяти для ОЗУ или указатель);
бит 4 - F (фрагментирован);
бит 5 - L (файл имеет расширенный заголовок в 32 байта вместо 16);
биты 6 и 7 - C0,C1 (совместимость кода - 00 для 8080, 01 для 8085, 10 для Z80, 11 - см.расширенный заголовок).
Расширенный заголовок (вторые 16 байт заголовка, если флаг L=1):

Code: Select all

struct HEADER_EX
{
   BYTE C; /* столетие */
   BYTE Y; /* номер года в пределах столетия */
   BYTE M; /* месяц */
   BYTE D; /* день */
   BYTE h; /* часы */
   BYTE m; /* минуты */
   BYTE s; /* секунды */
   BYTE r[8]; /* резерв */
   BYTE c; /* расширенный байт совместимости - 0x00 для 8080/8085/Z80, 0x01 для Z180 и т.д.) */
};
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Операционная система ShaOS

Post by petrenko »

Тогда в вот этот вот "резерв" и впихнуть адрес_следующего_фрагмента :

Code: Select all

...
..
BYTE r[8]; /* резерв */ 
И 5й бит пущай на сие и указывает :

бит№5 {фрагментированный/<зарезервировано>} -от разширителя /-все-/ часть "отгрызть" для указателя на следующий фрагмент.*
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

petrenko wrote:Тогда в вот этот вот "резерв" и впихнуть адрес_следующего_фрагмента :

Code: Select all

...
..
BYTE r[8]; /* резерв */ 
И 5й бит пущай на сие и указывает :

бит№5 {фрагментированный/<зарезервировано>} -от разширителя /-все-/ часть "отгрызть" для указателя на следующий фрагмент.*
не - фрагментированный файл с коротким заголовком тоже будет - у него в теле просто будут идти ссылки на фрагменты, являющиеся скрытыми файлами (не видимыми юзеру)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

Shaos wrote:Ну в этом и проблема - у меня нету суперпользователя :)
Поэтому флага read-only будет достаточно (для ПЗУ)
Значит пока пусть остаётся дизайн 1996 года:
бит 0 - R (только для чтения);
бит 1 - H (скрытый);
бит 2 - C (закодирован);
бит 3 - P (находится на своём месте в ОЗУ или symlink);
бит 4 - F (фрагментирован);
бит 5 - L (файл имеет расширенный заголовок в 32 байта вместо 16);
биты 6 и 7 - C0,C1 (совместимость кода - 00 для 8080, 01 для 8085, 10 для Z80, 11 - см.расширенный заголовок).
Расширенный заголовок (вторые 16 байт заголовка, если флаг L=1):

Code: Select all

struct HEADER_EX
{
   BYTE C; /* столетие */
   BYTE Y; /* номер года в пределах столетия */
   BYTE M; /* месяц */
   BYTE D; /* день */
   BYTE h; /* часы */
   BYTE m; /* минуты */
   BYTE s; /* секунды */
   BYTE r[8]; /* резерв */
   BYTE c; /* расширенный байт совместимости - 0x00 для 8080/8085/Z80, 0x01 для Z180 и т.д.) */
};
Битики в атрибутиках надо немного переставить:

биты 0 и 1 - C0,C1 (совместимость кода - 00 для 8080, 01 для 8085, 10 для Z80, 11 - см.расширенный заголовок);
бит 2 - E (закодирован);
бит 3 - F (фрагментирован);
бит 4 - S (находится на своём месте в памяти для ОЗУ или указатель);
бит 5 - L (файл имеет расширенный заголовок в 32 байта вместо 16);
бит 6 - H (скрытый);
бит 7 - R (только для чтения) как в ORDOS.

В случае директория (ext=0) младшие 4 бита атрибутов превращаются в 4 старших бита адреса ссылки (A23,A22,A21,A20).

P.S. Бит 4 (S) является признаком указателя (symlink) для всех накопителей кроме основного ОЗУ (где все заголовки по сути являются указателями т.к. хранятся отдельно от файлов), в этом случае младшие 4 бита атрибутов также превращаются в 4 старших бита адреса ссылки (A23,A22,A21,A20). Возможно для директориев установку бита 4 в "1" надо сделать обязательным, тогда указатель на конкретное место накопителя будет обрабатываться только в случае S=1 (с той лишь разницей, что для директория он будет указывать на цепочку файлов, лежащих в директории, а для файла-указателя - на конкретный файл, куда ссылается этот symlink).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Операционная система ShaOS

Post by Shaos »

Shaos wrote:Взял исходник от лета 1998, переписал все комменты по английски и выложил на гитхаб (а летом 2018 переложил на гитлаб):

https://gitlab.com/shaos/shaos/blob/master/SHAOS.A

P.S. Линки на старые архивы:
http://www.nedopc.org/nedopc/shaos/s004_v0.zip (20K) - оригинальные исходники для RASM (1998)
http://www.nedopc.org/nedopc/shaos/s004_v0_.zip (13K) - перетранслированные в 2006 году исходники для ZMAC плюс TAP-файл:

Image
Нашёл исходники своей самописной утилитки 2002 года rasm2mac, которую я использовал для конвертации библиотек 8080 в z80 для nedoPC SDK (2002) и для конвертации исходников ShaOS в z80 (2006):

 rasm2mac.cpp

Code: Select all

// RASM2MAC.CPP - Alexander Shabarshin 01.03.2002

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MNEMO 244

char mnemo[MNEMO][24] = {
"LXI_B,$ld\tbc,~",
"LXI_D,$ld\tde,~",
"LXI_H,$ld\thl,~",
"LXI_SP,$ld\tsp,~",
"STAX_B$ld\t(bc),a",
"STAX_D$ld\t(de),a",
"SHLD$ld\t(~),hl",
"STA$ld\t(~),a",
"INX_B$inc\tbc",
"INX_D$inc\tde",
"INX_H$inc\thl",
"INX_SP$inc\tsp",
"INR_B$inc\tb",
"INR_D$inc\td",
"INR_H$inc\th",
"INR_M$inc\t(hl)",
"DCR_B$dec\tb",
"DCR_D$dec\td",
"DCR_H$dec\th",
"DCR_M$dec\t(hl)",
"MVI_B,$ld\tb,~",
"MVI_D,$ld\td,~",
"MVI_H,$ld\th,~",
"MVI_M,$ld\t(hl),~",
"DAD_B$add\thl,bc",
"DAD_D$add\thl,de",
"DAD_H$add\thl,hl",
"DAD_SP$add\thl,sp",
"LDAX_B$ld\ta,(bc)",
"LDAX_D$ld\ta,(de)",
"LHLD$ld\thl,(~)",
"LDA$ld\ta,(~)",
"DCX_B$dec\tbc",
"DCX_D$dec\tde",
"DCX_H$dec\thl",
"DCX_SP$dec\tsp",
"INR_C$inc\tc",
"INR_E$inc\te",
"INR_L$inc\tl",
"INR_A$inc\ta",
"DCR_C$dec\tc",
"DCR_E$dec\te",
"DCR_L$dec\tl",
"DCR_A$dec\ta",
"MVI_C,$ld\tc,~",
"MVI_E,$ld\te,~",
"MVI_L,$ld\tl,~",
"MVI_A,$ld\ta,~",
"MOV_B,B$ld\tb,b",
"MOV_B,C$ld\tb,c",
"MOV_B,D$ld\tb,d",
"MOV_B,E$ld\tb,e",
"MOV_B,H$ld\tb,h",
"MOV_B,L$ld\tb,l",
"MOV_B,M$ld\tb,(hl)",
"MOV_B,A$ld\tb,a",
"MOV_C,B$ld\tc,b",
"MOV_C,C$ld\tc,c",
"MOV_C,D$ld\tc,d",
"MOV_C,E$ld\tc,e",
"MOV_C,H$ld\tc,h",
"MOV_C,L$ld\tc,l",
"MOV_C,M$ld\tc,(hl)",
"MOV_C,A$ld\tc,a",
"MOV_D,B$ld\td,b",
"MOV_D,C$ld\td,c",
"MOV_D,D$ld\td,d",
"MOV_D,E$ld\td,e",
"MOV_D,H$ld\td,h",
"MOV_D,L$ld\td,l",
"MOV_D,M$ld\td,(hl)",
"MOV_D,A$ld\td,a",
"MOV_E,B$ld\te,b",
"MOV_E,C$ld\te,c",
"MOV_E,D$ld\te,d",
"MOV_E,E$ld\te,e",
"MOV_E,H$ld\te,h",
"MOV_E,L$ld\te,l",
"MOV_E,M$ld\te,(hl)",
"MOV_E,A$ld\te,a",
"MOV_H,B$ld\th,b",
"MOV_H,C$ld\th,c",
"MOV_H,D$ld\th,d",
"MOV_H,E$ld\th,e",
"MOV_H,H$ld\th,h",
"MOV_H,L$ld\th,l",
"MOV_H,M$ld\th,(hl)",
"MOV_H,A$ld\th,a",
"MOV_L,B$ld\tl,b",
"MOV_L,C$ld\tl,c",
"MOV_L,D$ld\tl,d",
"MOV_L,E$ld\tl,e",
"MOV_L,H$ld\tl,h",
"MOV_L,L$ld\tl,l",
"MOV_L,M$ld\tl,(hl)",
"MOV_L,A$ld\tl,a",
"MOV_M,B$ld\t(hl),b",
"MOV_M,C$ld\t(hl),c",
"MOV_M,D$ld\t(hl),d",
"MOV_M,E$ld\t(hl),e",
"MOV_M,H$ld\t(hl),h",
"MOV_M,L$ld\t(hl),l",
"MOV_M,A$ld\t(hl),a",
"MOV_A,B$ld\ta,b",
"MOV_A,C$ld\ta,c",
"MOV_A,D$ld\ta,d",
"MOV_A,E$ld\ta,e",
"MOV_A,H$ld\ta,h",
"MOV_A,L$ld\ta,l",
"MOV_A,M$ld\ta,(hl)",
"MOV_A,A$ld\ta,a",
"ADD_B$add\ta,b",
"ADD_C$add\ta,c",
"ADD_D$add\ta,d",
"ADD_E$add\ta,e",
"ADD_H$add\ta,h",
"ADD_L$add\ta,l",
"ADD_M$add\ta,(hl)",
"ADD_A$add\ta,a",
"ADC_B$adc\ta,b",
"ADC_C$adc\ta,c",
"ADC_D$adc\ta,d",
"ADC_E$adc\ta,e",
"ADC_H$adc\ta,h",
"ADC_L$adc\ta,l",
"ADC_M$adc\ta,(hl)",
"ADC_A$adc\ta,a",
"SUB_B$sub\tb",
"SUB_C$sub\tc",
"SUB_D$sub\td",
"SUB_E$sub\te",
"SUB_H$sub\th",
"SUB_L$sub\tl",
"SUB_M$sub\t(hl)",
"SUB_A$sub\ta",
"SBB_B$sbc\ta,b",
"SBB_C$sbc\ta,c",
"SBB_D$sbc\ta,d",
"SBB_E$sbc\ta,e",
"SBB_H$sbc\ta,h",
"SBB_L$sbc\ta,l",
"SBB_M$sbc\ta,(hl)",
"SBB_A$sbc\ta,a",
"ANA_B$and\tb",
"ANA_C$and\tc",
"ANA_D$and\td",
"ANA_E$and\te",
"ANA_H$and\th",
"ANA_L$and\tl",
"ANA_M$and\t(hl)",
"ANA_A$and\ta",
"XRA_B$xor\tb",
"XRA_C$xor\tc",
"XRA_D$xor\td",
"XRA_E$xor\te",
"XRA_H$xor\th",
"XRA_L$xor\tl",
"XRA_M$xor\t(hl)",
"XRA_A$xor\ta",
"ORA_B$or\tb",
"ORA_C$or\tc",
"ORA_D$or\td",
"ORA_E$or\te",
"ORA_H$or\th",
"ORA_L$or\tl",
"ORA_M$or\t(hl)",
"ORA_A$or\ta",
"CMP_B$cp\tb",
"CMP_C$cp\tc",
"CMP_D$cp\td",
"CMP_E$cp\te",
"CMP_H$cp\th",
"CMP_L$cp\tl",
"CMP_M$cp\t(hl)",
"CMP_A$cp\ta",
"RNZ$ret\tnz",
"RNC$ret\tnc",
"RPO$ret\tpo",
"POP_B$pop\tbc",
"POP_D$pop\tde",
"POP_H$pop\thl",
"POP_PSW$pop\taf",
"JNZ$jp\tnz,~",
"JNC$jp\tnc,~",
"JPO$jp\tpo,~",
"JMP$jp\t~",
"OUT$out\t(~),a",
"XTHL$ex\t(sp),hl",
"CNZ$call\tnz,~",
"CNC$call\tnc,~",
"CPO$call\tpo,~",
"PUSH_B$push\tbc",
"PUSH_D$push\tde",
"PUSH_H$push\thl",
"PUSH_PSW$push\taf",
"ADI$add\ta,~",
"SUI$sub\t~",
"ANI$and\t~",
"ORI$or\t~",
"RST_0$rst\t#00",
"RST_2$rst\t#10",
"RST_4$rst\t#20",
"RST_6$rst\t#30",
"RET$ret",
"PCHL$jp\t(hl)",
"SPHL$ld\tsp,hl",
"XCHG$ex\tde,hl",
"CPE$call\tpe,~",
"CALL$call\t~",
"ACI$adc\ta,~",
"SBI$sbc\t~",
"XRI$xor\t~",
"CPI$cp\t~",
"RST_1$rst\t#08",
"RST_3$rst\t#18",
"RST_5$rst\t#28",
"RST_7$rst\t#38",
"RLC$rlca",
"RAL$rla",
"DAA$daa",
"STC$scf",
"RRC$rrca",
"RAR$rra",
"CMA$cpl",
"CMC$ccf",
"CP$call\tp,~", // !!!
"JP$jp\tp,~",   // !!!
"RP$ret\tp",    // !!!
"EI$ei",        // !!!
"DI$di",	// !!!
"CZ$call\tz,~", // !!!
"CC$call\tc,~", // !!!
"CM$call\tm,~", // !!!
"JZ$jp\tz,~",
"JC$jp\tc,~",
"JPE$jp\tpe,~",
"JM$jp\tm,~",
"IN$in\ta,(~)",
"RZ$ret\tz",
"RC$ret\tc",
"RPE$ret\tpe",
"RM$ret\tm",
"HLT$halt",
"NOP$nop",
};

int main(int argc,char **argv)
{
 int i,j,k;
 FILE *fi,*fo;
 char str[256],st[256],st2[100],*po,*p2,*p3;
 printf("\nRASM2MAC, Copyright (c) 2002, Alexander Shabarshin\n");
 if(argc<2)
 {
   printf("\n\nRASM2MAC old.a new.a\n\n");
   return 0;
 }
 fi = fopen(argv[1],"rt");
 if(fi==NULL) return 0;
 fo = fopen(argv[2],"wt");
 if(fo==NULL){fclose(fi);return 0;}
 while(1)
 {
   fgets(str,255,fi);
   if(feof(fi)) break;
   j = 0;
   k = 0;
   for(i=0;i<strlen(str);i++) 
   {
       if(str[i]=='@') str[i]='_';
       if(str[i]=='\\') 
       {  if(k) str[i]='/'; 
          else  str[i]=';';
       }
       if(str[i]!='\n'&&str[i]!='\r') str[j++]=str[i];
       if(str[i]!=' '&&str[i]!='\t') k=1;	  
       else k=0;
   }
   str[j] = 0;
   while(j && (str[j-1]==' '||str[j-1]=='\t')) str[--j]=0;
   if(*str=='+') 
   {
      sprintf(st2,"include %s.a",&str[1]);
      strcpy(str,st2);
   }      
   for(i=0;i<MNEMO;i++)
   {  
      strcpy(st2,mnemo[i]);
      p2 = strchr(st2,'$');
      *p2 = 0; p2++;
      po = strstr(str,st2);
//      if(po!=NULL) printf("%s|%s\n",str,st2);
      if(po!=NULL && (*str==' '||*str=='\t'))
      {
	 for(j=1,p3=str;p3!=po;p3++)
	 {
	    if(*p3!=' '&&*p3!='\t') j=0;
	 }
      }
      p3 = strchr(str,';');
      if(p3==NULL) p3=po;
      if(po!=NULL && po>str && (po[-1]==' '||po[-1]=='\t') && po<=p3 && j)
      {  
	 if(*str==' ' || *str=='\t') strcpy(st,"\t");
	 else 
	 {
	    *po = 0;
	    strcpy(st,str);
	 }
	 p3 = strchr(p2,'~');
	 if(p3==NULL)
	 {
	    strcat(st,p2);
	 }
	 else
	 {
	    *p3 = 0; p3++;
	    strcat(st,p2);
	    p2 = &po[strlen(st2)];
	    while(*p2==' '||*p2=='\t') p2++;
	    strcat(st,p2);
	    strcat(st,p3);
	 }
	 strcpy(str,st);
         break;
      }
   }
   if(*str!='*')
      for(i=0;i<strlen(str);i++) 
         str[i]=tolower(str[i]);
   fprintf(fo,"%s\n",str);
 }
 fclose(fi);
 fclose(fo);
 return 1;
}

Я тут за главного - если что шлите мыло на me собака shaos точка net