nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 04:15



Reply to topic  [ 55 posts ]  Go to page Previous  1, 2, 3, 4  Next
Операционная система ShaOS 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Взял исходник от лета 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

_________________
:dj: https://mastodon.social/@Shaos


23 Jun 2016 20:57
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
По решётке выполнилась вот такая тест-программа:
Code:
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

_________________
:dj: https://mastodon.social/@Shaos


24 Jun 2016 17:14
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
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. А может и ненадо...

_________________
:dj: https://mastodon.social/@Shaos


24 Jun 2016 18:12
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post Re:
Shaos wrote:
Формат квазидисков операционки ShaOS:

Cтруктура аналогична ордосу - у каждого файла есть 16-байтовый заголовок (есть возможность иметь 32-байтовый - с меткой времени), среди файлов могут попадаться подкаталоги. Формат простого заголовка:
Code:
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 - см.расширенный заголовок).
Расширенный заголовок с датой и временем создания файла пока не предполагается...

_________________
:dj: https://mastodon.social/@Shaos


27 Jun 2016 19:21
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
По поводу исполняемых файлов 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 (на своём месте).

_________________
:dj: https://mastodon.social/@Shaos


27 Jun 2016 20:03
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
(IMHO) у файлов должны быть такие аттрибуты :
{заархивированный/закодированный}
{фрагментированный/длинное_имя} -от удлинителя имени часть "отгрызть" для указателя на следующий фрагмент.*
{скрытый/системный}
{}
{разрешено_чтение}
{разрешена_запись}
{разрешено_выполнение}
|\_и на каком цпу оно разрешено, а 11 пусть будет "не_разрешено"
{разрешено_выполнение}|/

*_То есть с этим флагом имя может выглядет как то так :
" |файл_с_длинным_и|[frag№]#{адр.след.фраг.}менем.TXT| "


28 Jun 2016 02:29
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Неее - никаких длинных имён :)

А по поводу фрагментированности - это я так планировал дырки заделывать, освободившиеся от удалённых файлов если новый файл больше, чем старая дырка - в этом случае вместо файла записывается небольшой блок кода со ссылками на файлы - фрагменты, разбросанные по квазидиску в произвольном порядке (типа FAT).

_________________
:dj: https://mastodon.social/@Shaos


28 Jun 2016 05:22
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Quote:
Неее - никаких длинных имён ..

Ну тогда даже проще, пущай будут такие аттрибуты :

бит№0 {разрешена_запись}
бит№1 {скрытый/системный}
бит№2 {заархивированный/закодированный}
бит№3 { ??? }
бит№4 {фрагментированный/<зарезервировано>}
-от удлинителя имени /-часть-/ все "отгрызть" для указателя на следующий фрагмент.*
бит№5 {разрешено_чтение}
бит№6 {разрешено_выполнение}
|\_и на каком цпу оно разрешено, а 11 пусть будет "не_разрешено"*
бит№7 {разрешено_выполнение}|/


29 Jun 2016 01:50
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
а что будет если чтение не разрешено? в чём смысл такого файла?

_________________
:dj: https://mastodon.social/@Shaos


29 Jun 2016 04:11
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Ну .. это .. важные системные выполняемые файлы обычно имеют разрешение на выполнение и запрет на чтение и тем более запрет на запись. ( Хотя зачастую всё равно "root" может то, что не могут другие пользователи. :rotate: )

Если ещё есть и запрет на запись в область памяти, где лежит выполняемый код, то это повышает надёжность системы.
( Для нищебродских решений на i8080 контроль доступа к памяти не очень актуален, ибо требует такого диспетчера памяти, который "навороченнее" самого i8080 :-? )


29 Jun 2016 04:42
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Ну в этом и проблема - у меня нету суперпользователя :)
Поэтому флага read-only будет достаточно (для ПЗУ)
Значит пока пусть остаётся дизайн 1996 года:
Quote:
бит 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:
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 и т.д.) */
};

_________________
:dj: https://mastodon.social/@Shaos


29 Jun 2016 05:08
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Тогда в вот этот вот "резерв" и впихнуть адрес_следующего_фрагмента :
Code:
...
..
BYTE r[8]; /* резерв */

И 5й бит пущай на сие и указывает :

бит№5 {фрагментированный/<зарезервировано>} -от разширителя /-все-/ часть "отгрызть" для указателя на следующий фрагмент.*


29 Jun 2016 06:18
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
petrenko wrote:
Тогда в вот этот вот "резерв" и впихнуть адрес_следующего_фрагмента :
Code:
...
..
BYTE r[8]; /* резерв */

И 5й бит пущай на сие и указывает :

бит№5 {фрагментированный/<зарезервировано>} -от разширителя /-все-/ часть "отгрызть" для указателя на следующий фрагмент.*


не - фрагментированный файл с коротким заголовком тоже будет - у него в теле просто будут идти ссылки на фрагменты, являющиеся скрытыми файлами (не видимыми юзеру)

_________________
:dj: https://mastodon.social/@Shaos


29 Jun 2016 07:20
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Shaos wrote:
Ну в этом и проблема - у меня нету суперпользователя :)
Поэтому флага read-only будет достаточно (для ПЗУ)
Значит пока пусть остаётся дизайн 1996 года:
Quote:
бит 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:
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 - H (скрытый);
бит 6 - R (только для чтения);
бит 7 - L (файл имеет расширенный заголовок в 32 байта вместо 16).

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

P.S. Бит 4 (S) является признаком указателя (symlink) для всех накопителей кроме основного ОЗУ (где все заголовки по сути являются указателями т.к. хранятся отдельно от файлов), в этом случае младшие 4 бита атрибутов также превращаются в 4 старших бита адреса ссылки (A23,A22,A21,A20). Возможно для директориев установку бита 4 в "1" надо сделать обязательным, тогда указатель на конкретное место накопителя будет обрабатываться только в случае S=1 (с той лишь разницей, что для директория он будет указывать на цепочку файлов, лежащих в директории, а для файла-указателя - на конкретный файл, куда ссылается этот symlink).

_________________
:dj: https://mastodon.social/@Shaos


04 Jul 2016 22:52
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
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):

Code:
// 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;
}

_________________
:dj: https://mastodon.social/@Shaos


29 Jul 2021 21:26
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 55 posts ]  Go to page Previous  1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 21 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.