среда, 6 сентября 2023 г.

Acorn MOS

 MOS allocates a 3.5 KiB block of memory (0x0000 to 0x0DFF) from the bottom of the memory map for operating system and language ROM workspace:

AddressUse
0x0000-0x00FFCurrent language workspace, misc system workspace
0x0100-0x01FFCPU stack
0x0200-0x02FFOS vectors, system variables, other workspace
0x0300-0x03FFVDU driver workspace, cassette system workspace, keyboard input buffer
0x0400-0x07FFAllocated to the current language ROM, or to the Tube. BASIC uses 0x0400-0x046B for the single-letter integer variables @% through Z% (4 bytes per letter), which are thus accessed faster than are variables on the heap.
0x0800-0x08FFSound system (stores ADSR envelopes and the tone buffer; if sound is not in use then a small amount of user data can be stored here), printer buffer, ENVELOPE definitions
0x0900-0x09FFCassette and serial input buffers (user data can be placed here if cassette is not in use, so many small machine code utilities were assembled into page 9)
0x0A00-0x0AFFCassette and serial output buffers, also used for small machine code utilities.
0x0B00-0x0BFFUser-defined keys (strings that are inserted when function keys are pressed, set by the *KEY command)
0x0C00-0x0CFFUser-defined characters for non-teletext modes (user data can be placed here if the display is in teletext mode)
0x0D00-0x0DFFNon-maskable interrupt service routine, networking workspace, mouse/trackball workspace, indirect vectors to paged ROMs and page ROM workspace pointers

Current language workspace, misc system workspace - 

0 - семечко для генератора случайных чисел
4 - 2 байта адреса специализированная таблица символов

33 два байта хука на новый корабль и дальше идет данные по ориентации  корабля

118 - внутренний стапель для сборки корабля или чертежная доска 33 бита

128 - разграничительная линия .LSP
129  - семя текущей галактики .QQ15
130 -  странный байт для управления регистром символов (скорее переключение в режим ввода скрытых команд).QQ17

147 - 150 Сохранение состояний регистров процессора (контекста) перед переходом в подпроцедуру
173 - что то про планету .XX14

30 пропущенных байт

0x00D1 - место для расчета координат и размеров

0x0100- CPU stack - Хип для расчета координат Elite -  верхний стек рабочего пространства

0x0200- OS vectors, system variables, other workspace - вторая часть из 255 байт оставлена под хип, как раз в неком смысле тут можно скоприровать верхнюю часть памяти, перепроектировать все пространство, включить семафор и перезаписать все наше окружение. Копирование целиком нужно из за особенности адресации скрытой недокументированной команды. Ну или тут у нас должно быть создано отображение отдельных элементов на точном расстоянии от границ страницы

0x0300- VDU driver workspace, cassette system workspace, keyboard input buffer - Графический драйвер -  переменные капитана корабля - миссия, координаты, галактики, деньги, топливо, чексумма

0x0400- Allocated to the current language ROM, or to the Tube. BASIC uses 0x0400-0x046B  - Заменяем на встроенный язык на основем мемоник. Причем каждая мемоника соответствует 4 байтам в итоге. Все двойного назначения - формируем по адресу  &1100, а затем готовую таблицу переносим вверх сразу после &0400 вместе с elite-loader.asm - Таким образом у нас вместо бейсика выходит встроенный язык, который используется вначале лоадером для идентификации, а затем  как язык управления.

Мог быть еще более изяшный способ - держать в голове все точные адреса ресурсов, которые могут вызываться как команды, путем пересылки в стек и выполнения. Но ребята не заморачивались и создали язык. Который до сих пор никто не расшифровал.

0x0800- Sound system (stores ADSR envelopes and the tone buffer; if sound is not in use then a small amount of user data can be stored here)

0x0900- Cassette and serial input buffers (

&1100 - Стартовая точка игры, где загружен лоадер elite-loader.asm и все остальные файлы  - таблица токенов, корабли



&6000  - Сработка защиты

\ and four files containing images, which are all moved into screen memory by
\ the loader:
\
\   * P.A-SOFT.bin contains the "ACORNSOFT" title across the top of the loading
\     screen, which gets moved to screen address &6100, on the second character
\     row of the monochrome mode 4 screen
\
\   * P.ELITE.bin contains the "ELITE" title across the top of the loading
\     screen, which gets moved to screen address &6300, on the fourth character
\     row of the monochrome mode 4 screen
\
\   * P.(C)ASFT.bin contains the "(C) Acornsoft 1984" title across the bottom
\     of the loading screen, which gets moved to screen address &7600, the
\     penultimate character row of the monochrome mode 4 screen, just above the
\     dashboard
\
\   * P.DIALS.bin contains the dashboard, which gets moved to screen address
\     &7800, which is the starting point of the four-colour mode 5 portion at
\     the bottom of the split screen


Когда в исходниках нам обосновывают то что отправляется текст на экран, забывают сказать об особенности, что с экрана он попадает автоматом в буфер принтера. Причем очень быстро. А так как у нас принтера нет, то можно использовать этот факт для управлением и перенастройки программы на лету. Достаточно совместить буферр выходной принтера с копией стека, а затем скопировать нужный кусок стека куда надо. Предварительно запомнив состояния.


В конце раздела Text, graphics, printing описан механизм использования клавиши копи. Она располагалась в середине между стрелками направления. И позволяла редатиорвать либо в строчном режиме, либо непосредственно в буфере видеопамяти любой текст. Так как её нажатие приводило к копированию символа из области видеопамяти в область управляемую программой. Таким образом можно было набрать нужные команды прямо на вершине стека, а затем передать на них управление.






















Комментариев нет: