Info Guide #12
31 декабря 2017

Системки - NedoLang: Памяти под самокомпиляцию не хватало (часть 4).

    Бутылочное горлышко
Alone Coder

   Памяти под самокомпиляцию не хватало.
   Конечно, можно  было  сразу  подключить
ОЗУ с нулевого адреса. Но своей операцион─ 
ной системы не было,вместо файловых опера─ 
ций ещё стояли заглушки,а вCP/Mпрограмма 
такого размера не поместилась бы (странно, 
что нет версийCP/Mс теневым расположени─ 
емBDOSиBIOS,это технически возможно).И 
мне было бы проблематично отлаживать прог─ 
рамму в незнакомой системе. К тому же, хо─ 
телось  сделать  хоть  одну версию под наш 
родимый48K.
   Я решил отлаживать вTR-DOSпутём напи─
сания некоей прослойки, реализующей файло─ 
вую систему последовательного доступа. Чу─ 
тьё  подсказывало, что влезть в48Kможно, 
надо просто поработать над оптимизацией. 

  27.02.2017 - добавлены  ключи командной
строки  для  компиляции в разных режимах и
для ассемблирования. И небольшая оптимиза─
ция. Размер58481 байт,причём ассемблерный
файл  занял 510  килобайт. Такими темпами
даже дискеты не хватит.

  28.02.2017 - только исправлял мануал.

  03.03.2017 - вместо временных меток ти─
па_lll сделал генерацию  правильных меток
в теле команд. Ассемблерный файл сократил─
ся  до438 килобайт. Размер кода после не─
которых оптимизаций -56643 байта.

  04.03.2017 - в кодогенераторе самые по─
пулярные тексты выделены в процедуры.Ассе─
мблерный  файл сократился до380 килобайт.
Размер кода51183 байта.

  06.03.2017 - уменьшал  число параметров
в процедурах  и делал  разбор  черезmatch
(съедание  слова  сразу  при  совпадении с
ожидаемым). Размер кода49036 байт.
   Вообще подходы к построению парсера без
правого контекста:
  # readword + compile_value
  # read_compile_value
  # match_value(при удаче делает readword)

  08.03.2017 - идея: вместо отдельного 8-
битного  контекста  хранить байт в младшем
байте обычных регистров, а аккумулятор ис─
пользовать только как прокси для доступа к
нему (помнить, загружена ли в него копия и
чья).

  09.03.2017 - убраны некоторые неисполь─
зуемые  процедуры  и  переменные. Улучшаем
кодогенератор согласно вчерашней идее, за─
одно убраноOR A в условиях,если флаги уже
выставлены.
   Основная часть компилятора (безmain.c,
но сnedodefs.h ):
*.c (8), *.h (3):
 188271
 5700 строк
*.asm (включая затычки системных процедур)
 332639 (ftokenized: 294874)
 14398 строк
compiled by IAR: 32944 байт;
compiled by SDCC 3.6.0: 39801 байт;
compiled by NedoLang: 42956 байт.

  10.03.2017  -  добавлены  нестандартные
комментарии ;;  в  начале строки - для Си
это  не  комментарии. Так  оформляются все
вызовы  отладочного вывода.36241 байт. То
есть  компилятор влезает в адресное прост─
ранство48K. Ассемблер почти влезает в 64K
с метками. Надо  сокращать  ассемблер  или
метки. А лучше и то, и другое. Но пока ас─
семблер  не может ассемблировать сам себя,
потому что в компиляторе нетenum и switch
..case ,а в ассемблере нет склейки меток.

  13.03.2017 - сделал enum.

  15.03.2017 - разрешены байтовые индексы
в массивах, чтобы лишний раз не преобразо─
вывать их вUINT.

  16.03.2017 - разрешён  доступ  к необъ─
явленным    байтовым    константам   через
+_CONSTNAME.  Добавлены временные каталоги
для  свалки  результатов  компиляции прог─
рамм.

  17.03.2017 - сделал  switch  и  склейку
меток  в ассемблере. Размер  таблицы меток
при ассемблировании компилятора сократил с
40K до38K. Заодно все имена файлов сокра─ 
тил до 8 символов.

  20.03.2017 - сокращал названия перемен─
ных и процедур. Таблица меток меньше35K.

  22.03.2017 - ещё  сокращал  названия  и
вложенности. Таблица  меток  теперь меньше
31K. Добавил командыINC, DEC. 

  23.03.2017 - ещё  немного  сокращений -
ассемблер  с метками уже меньше40K. Начал
писать файловую библиотеку.

  24.03.2017 - сделал файловую библиотеку
и стартап-исходник на ассемблере, началась
настоящая отладка в эмуляторе:
┌────────────────────────────────────────┐
 1)
компилятору надо раскрывать t при компи─ 
ляции строк? 
это: 
  - asmstr ТОЛЬКО в do_asm
  - emitvarstr_tword в emitvarstrz
нет, компилятор всё делает правильно! 
это ассемблер должен уметь так компилиро─ 
вать текст в кавычках! 
 2)
readquotes сработало (dec c), идём на 
asmstr 
asm выключен по умолчанию, правим стартап 
все команды asm отработали 
похоже, не детектит // 
    or l
    cpl
    jp z
ошибка в emitinvb - надо fused=false 
 3)
потом ошибка в fopen - b не равен 0 
 4)
потом в flushdesc пропущен ld l,FCB.fn 
 5)
потом в flush при выделении секторов номер 
сектора не записан в дескриптор 
(firstsector) и в cursector - пишем в 0-й 
 6)
первый сектор ferr запорот fvar, первый 
сектор fasm запорот ferr (secwritten обну─ 
лялся не там, a!=0) 
 7)
лезет куча ошибок: 
все ld [],a, ld [],hl пустые (автометки 
правильные) 
пропущена ветка eat_variable.b 
(t = t|_T_ARRAY) 
 8)
похоже, не может найти ни одну переменную 
strcp (bb86),lbltype (8f29),addvar (8faf) 
выглядят правильно в файле fasm 
c279 - lblbuf 
неправильно скомпилировано 
_lblbuf[_lblbufindex]=+(CHAR)(+(BYTE)len); 
пишет a, который не присвоен: 
    LD DE,[addvar.len.]
    LD [HL],A
но после pokeb (где использовался до 
этого a) _rproxy = 0x00!!! 
ошибка в emitpokeb - при (hl) писался все─ 
гда a. 
 9)
fasm, ferr оборваны 
неправильные размеры непервых блоков 
(не обнулялся lastlen) 
 10)
ассемблер валится на первом же токене 
потому что перед jp (hl) нет cmdpeek 
 11)
теперь виснет на конце файла,т.е. не попал 
в case _ASMTOKEN_EOF: 
    {goto endloop;/**exit!!!*/}
таблица switch вся заполнена default!!! 
потому что генерируются метки asmloop.J0, 
а в таблице без J 
но нельзя склеивать . с числом 
исправил 
 12)
теперь в конце сбрасывается 
в org.f оказывается 44 байта вместо 4 
5 ошибок в первой строке (комментарий 709a 
обработать не смог) и дальше ошибки в 2903 
и далее (тоже комментарии) 
начало  bin.f совпадает, но длина #1656 
вместо #160c 
расхождение с #14a3 - лишние #c9 итп 
это было из-за комментария 
";при чтении длина 0 - это отсутствие
файлов или файл длиной 0 (длина в секторах
может быть любая)"
 13)
UNTIL 
((_token==+_ASMTOKEN_ENDCOMMENT)||_waseof) 
   скомпилилось в
    LD A,[_token.]
    LD E,_ASMTOKEN_ENDCOMMENT.
    SUB E
    LD L,0
    JR NZ,$+2+1
    DEC L
    LD A,[_waseof.]
    OR L
    JP C,asmloop.y
потому что выше сравнение в параметре 
функции стояло без скобок и "оптимизирова─ 
лось" на 1-м уровне вложенности выражения. 
исправил 
 14)
всё скомпилилось правильно, но сбросилось 
сделал защиту от "оптимизации" сравнений 
на первом уровне вложенности в присваива─ 
ниях и вызовах (начальный уровень вложен─ 
ности там поставил выше) 
 15)
в конце вываливается с ошибкой и портит 
бейсик, даже после одного прохода 
вместо ex af,af' получается ex (sp),hl 
(токенизируется и экспортируется правиль─ 
но) 
коды sp и af совпадают - проверять надо 
второй регистр в ex 
пофиксил 
 16)
всё равно в конце вываливается с ошибкой 
не присвоен hl'=10072! 
 17)
ld (de),a неправильно ассемблировалось 
(токенизируется и экспортируется правиль─ 
но) 
ошибка была - reg вместо oldreg 
 18)
;increase block number (after flushdesc!) 
;глючит, если последний блок <256 
ручной flush пока невозможен 
  0. начало работы (первое сохранение):
   - создаём новый дескриптор
   - сохраняем данные туда
   - сохраняем дескриптор
   - block++ (теперь дескриптор невалид─
ный, пока не создадим новый) 
  1. добавляем много данных, пока блок не
заполнится 
  2. блок заполнен:
   - сохраняем дескриптор
   - block++ (теперь дескриптор невалид─
ный, пока не создадим новый) 
  3. добавляем немного данных
  4. fclose:
   - создаём новый дескриптор
   - сохраняем данные туда
   - сохраняем дескриптор (может быть с
некруглой длиной) 
   - block++ (теперь дескриптор невалид─
ный, пока не создадим новый) 
   (потом снова вызывается savedesc,но
нам нельзя) 
запретил вызов savedesc в fclose при 0 
записанных секторов 
└────────────────────────────────────────┘

  25.03.2017  -  компилятор, токенизатор,
ассемблер  и  детокенизатор   работают  на
Speccy.  Пока  вызываются  без  параметров 
(они жёстко прописаны в стартапе).

                  * * *

   Как строить проект?
  - в ассемблер попадает больше файлов,чем
в компилятор, т.к.добавляются ещё стандар─ 
тные процедуры умножения-деления и файлы с 
переменными 
  - или в ассемблер попадёт всего два фай─
ла - склеенный  код (с приклеиванием стан─ 
дартных  процедур) и склеенные переменные, 
или только один склеенный код 

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

  reader будет общий у компилятора и то─
кенизатора (и поддерживает комменты) 
  - тогда reader должен писать коммент в
нетокенизированный  ассемблерный текст и в 
токенизированный одинаково 
  - или   нетокенизированный  ассемблерный
текст не существует,тогда комментарии/оши─ 
бки тоже должны об этом знать! Токенизиро─ 
вать комментарии/ошибки на уровнеemitter?
(компилятор  может  не  выводить  ошибки в 
ferr, а выводить прямо в асм)

   Для  файлов  с переменными можно сгене─
ритьincludeв каждом,но надо знать модель 
памяти (вдруг  надо  разделить  команды  и 
данные!) 




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Галерея герцога Бофора - Новые поступления в экспозицию.
Презентация - Авторские программы: Орагон
Фантастика - Эрис Лоренс "Этот проклятый компьютер".

В этот день...   21 ноября