Спринтер управляет ISA-шиной через 2 порта (если пока забыть про листание страниц):
Первый это обрубок Скорпионовского 1FFDh, куда во всех примерах пишутся только 2 значения - 0x11 для включения ISA в последее окно памяти и 0x01 для возвращения обычной памяти (причём в документации было написано 0x10 и 0x00 соответственно) - классический скорпионовский порт имеет следующее описание:
Code: Select all
D0 - block of ROM in 0-3fff. when set to 1 - allows read/write page 0 of RAM
D1 - selects ROM expansion. this rom contains main part of service monitor.
D2 - not used
D3 - used for output in RS-232C
D4 - extended RAM. set to 1 - connects RAM page with number 8-15 in
C000-FFFF. number of page is given in gidits D0-D2 of port 7FFD
D5 - signal of strobe for interface centronics. to form the strobe has to be
set to 1.
D6-D7 - not used. ( yet ? )
Соответственно бит 0 был в 1 потому что в Спринтере в нулевой странице имелось ОЗУ с ОС, а бит 4 предполагал переход в расширенную область памяти - в нашем случае можно сделать аналогично, но явно прописать что за что отвечает:
Code: Select all
D0 - open RAM in window 0
D1 - select 2nd ROM
D2 - select SPI EEPROM (1-enabled, 0-disabled)
D3 - sync for SPI (SCK)
D4 - open ISA in window 3
D5 - strobe to 7-segment indicator (?)
D6 - disable extended ports in standard mode
D7 - serial output to SPI (MOSI)
У нас в нулевом окне может просвечивать начало динамической памяти 64КБ т.е. DRAM0, а вместо второй половины ПЗУ будет SRAM1 (по умолчанию же в нулевом окне будет SRAM0 содержащий в себе образ ПЗУ с бейсиком).
Все комбинации D1 и D0:
00 -> SRAM0
01 -> DRAM0
10 -> SRAM1
11 -> по идее это неиспользуемая комбинация, но мы можем подсунуть в этом случае DRAM3 (чтобы при открытой памяти ISA можно было в основной памяти перебирать все доступные страницы статического и динамического ОЗУ). Также не следует забывать, что системный порт Балтика SYS-REG также может убирать ПЗУ старшим битом - можно сделать так, чтобы и тот и этот биты могли управлять ПЗУ (один в стандартном режиме, а второй - в расширенном режиме). Также можно запрещать редактирование SRAM-ов изображающих из себя ПЗУ, если мы находимся в стандартном режиме.
Ещё я туда добавил биты для SPI и запрет расширенных портов в обычном ZX-режиме, чтобы ZX-софт чего-нибудь там случайно не нарушил.
Этот порт можно назвать EXT-REG и упростить его дешифрацию до #FD. При чтении из него можно возвращать MISO бит от SPI в нулевом бите (остальные биты можно скажем использовать для выбора того, какие блоки надо грузить из EEPROM - сколько-то битов для выбора образа биоса и сколько-то битов для выбора образа ромдиска).
Второй порт это сигналы ISA-шины RESET, AEN и 6 старших битов ISA-адреса:
Code: Select all
;port 9FBDh:
;D7...RESET
;D6...AEN
;D5...A19
;D4...A18
;D3...A17
;D2...A16
;D1...A15
;D0...A14
Можно назвать этот порт ISA-REG и упростить дешифрацию до #BD. Читать состояние прерываний ISA пока ненадо...
Выбор поля памяти ISA или IO в Спринтере осуществляется путём использования разных номеров страниц для подключения - у нас этого нет, но зато можно воспользоваться тем фактом, что платы ISA по памяти как правило отзываются только на адреса выше A0000h исоответственно можно нулём в старшем бите адреса A19 сигнализировать что мы обращаемся к IO, а единичкой - что к MEM. Плюс IO как правило это только 10 битов адреса или 1024 байта, а у нас целые 16КБ окно - поэтому в конец этого окна в случае выбора ISA IO можно воткнуть маленькое ПЗУ (2КБ) с бутлоадером
Code: Select all
EXT-REG = xxxx xx00 xxxx xx01 xxxx xx10 xxxx xx11
or
SYS-REG = 0xxx xxxx 1xxx xxxx
___________ ___________ ___________ ___________
#0000 | | | | |
| | | | |
| SRAM0 | DRAM0 | SRAM1 | DRAM3 |
| | | | |
#3FFF |___________|___________|___________|___________|
#4000 | |
| |
| DRAM1 |
| |
#7FFF |___________|
#8000 | |
| |
| DRAM2 |
| |
#BFFF |___________|___________ ___________
#C000 | | | |
| | | ISA IO |
| DRAM3 | ISA MEM |-----------|
| | | ROM <= 8K |
#FFFF |___________|___________|___________|
EXT-REG = xxx0 xxxx xxx1 xxxx xxx1 xxxx
and
ISA-REG = xxxx xxxx xx1x xxxx xx0x xxxx
При холодном старте вся память будет заполнена копиями стартового ПЗУ - внутренний триггер сбросит это состояние, когда первый раз произойдёт переход в старшую половину адреса:
Code: Select all
boot:
di
ld a,#FF
out (SYS_REG),a
ld a,#10
out (EXT_REG),a
ld a,#00
out (ISA_REG),a
jp #F810 ; disable all-ROM mode
f810:
; Bootloader from serial EEPROM
Вобщем как-то так...