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:
Address | Use |
---|---|
0x0000-0x00FF | Current language workspace, misc system workspace |
0x0100-0x01FF | CPU stack |
0x0200-0x02FF | OS vectors, system variables, other workspace |
0x0300-0x03FF | VDU driver workspace, cassette system workspace, keyboard input buffer |
0x0400-0x07FF | Allocated 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-0x08FF | 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), printer buffer, ENVELOPE definitions |
0x0900-0x09FF | Cassette 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-0x0AFF | Cassette and serial output buffers, also used for small machine code utilities. |
0x0B00-0x0BFF | User-defined keys (strings that are inserted when function keys are pressed, set by the *KEY command) |
0x0C00-0x0CFF | User-defined characters for non-teletext modes (user data can be placed here if the display is in teletext mode) |
0x0D00-0x0DFF | Non-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 описан механизм использования клавиши копи. Она располагалась в середине между стрелками направления. И позволяла редатиорвать либо в строчном режиме, либо непосредственно в буфере видеопамяти любой текст. Так как её нажатие приводило к копированию символа из области видеопамяти в область управляемую программой. Таким образом можно было набрать нужные команды прямо на вершине стека, а затем передать на них управление.
Комментариев нет:
Отправить комментарий