Спринтер управляет 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 (а хотя если в будущем добавится ещё и порт #7FFD, то упрощать нельзя). При чтении из него можно возвращать 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
Вобщем как-то так...