Пытаюсь понять как работает 'маппер' в DivIDE/DivMMC. Эскпериментирую в emu, а там, глядишь и в реале, на рассыпухе, есть желание его сделать.
Если представить карту памяти, то получается 8 вариантов.
Два бита из регистра управления Е3h, CONMEM-бит_7 и MAPRAM-бит_6 и бит, назову его trap - активация пеключения при попадании в определенные адреса.
если судить из этого описания DivIDE:
--------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------So, when CONMEM is set, there is:
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket), and this area is flash-writable if EPROM jumper is open.
2000-3fffh - 8k bank, selected by BANK 0..1 bits, always writable.
When MAPRAM is set, but CONMEM is zero, and entrypoint was reached:
0000-1fffh - Bank No.3, read-only
2000-3fffh - 8k bank, selected by BANK 0..1. If it's different from Bank No.3, it's writable.
When MAPRAM is zero, CONMEM is zero, EPROM jumper is closed and entrypoint was reached:
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket, so open jumper in this case), read-only.
2000-3fffh - 8k bank, selected by BANK 0..1, always writable.
Otherwise, there's normal speccy memory layout. No modified ROM, no shit.
вариант 1) получается, что при CONMEM==1 не имеет значение состояние бит MAPRAM и trap, всегда будет 'DivROM' и некая страница 'DivRAM'
при CONMEM==0 получаем:
вариант 2) MAPRAM==1, trap==1, когда первые 8КБ, это третья страница 'DivRAM' только чтение, а вторые 8КБ, это некая страница 'DivRAM'
вариант 3) MAPRAM==0, trap==1, повторяем вариант 1)
вариант 4-8) все остальные варианты, это обычное ПЗУ ZX48.
итого:
если CONMEM==0, MAPRAM==0, trap==0 карта=0, вариант 4)
0000-3fffh 16k normal speccy EEPROM memory layout
если CONMEM==0, MAPRAM==0, trap==1 карта=1, вариант 3)
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket, so open jumper in this case), read-only.
2000-3fffh - 8k bank, selected by BANK 0..1, always writable.
если CONMEM==0, MAPRAM==1, trap==0 карта=2, вариант 4)
0000-3fffh 16k normal speccy EEPROM memory layout
если CONMEM==0, MAPRAM==1, trap==1 карта=3, вариант 2)
0000-1fffh - Bank No.3, read-only
2000-3fffh - 8k bank, selected by BANK 0..1. If it's different from Bank No.3, it's writable.
если CONMEM==1, MAPRAM==0, trap==0 карта=4, вариант 1)
если CONMEM==1, MAPRAM==0, trap==1 карта=5
если CONMEM==1, MAPRAM==1, trap==0 карта=6
если CONMEM==1, MAPRAM==1, trap==1 карта=7
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket), and this area is flash-writable if EPROM jumper is open.
2000-3fffh - 8k bank, selected by BANK 0..1 bits, always writable.
--------------------------------------------------------------------------------------------------------------------
вот так я дополняю конфигурацию в emu ZX_Spectrum_48:
Скрытый текст
cpu : z80 {
debug=cas
debug=trap
mem=mm
int[FF]=vid.irq
port[a3]=hdd.data8[0]
port[a7]=hdd.data8[1]
port[ab]=hdd.data8[2]
port[af]=hdd.data8[3]
port[b3]=hdd.data8[4]
port[b7]=hdd.data8[5]
port[bb]=hdd.data8[6]
port[bf]=hdd.data8[7]
port[E3]=portE3
port[E7]=sdcard.ss
port[EB]=sdcard.data8
port[FD]=portFD
port[FE]=sys.data[0]
}
biosESX : Memory {
rom="ZX\esxmmc.bin"
}
mem2 : Memory {
size=20000
frame[0].size=2000
frame[0].page=portE3.portA[0-3]
}
mem2p : MemMap {
page[3]=portE3.portA[3]
page[2]=portE3.portA[2]
page[1]=portE3.portA[1]
page[0]=portE3.portA[0]
map[15][0000-1FFF]=mem2[1e000]
map[14][0000-1FFF]=mem2[1c000]
map[13][0000-1FFF]=mem2[1a000]
map[12][0000-1FFF]=mem2[18000]
map[11][0000-1FFF]=mem2[16000]
map[10][0000-1FFF]=mem2[14000]
map[9][0000-1FFF]=mem2[12000]
map[8][0000-1FFF]=mem2[10000]
map[7][0000-1FFF]=mem2[e000]
map[6][0000-1FFF]=mem2[c000]
map[5][0000-1FFF]=mem2[a000]
map[4][0000-1FFF]=mem2[8000]
map[3][0000-1FFF].ro=mem2[6000]
map[2][0000-1FFF]=mem2[4000]
map[1][0000-1FFF]=mem2[2000]
map[0][0000-1FFF]=mem2[0000]
}
mm : MemMap {
page[2]=portE3.portA[7]
page[1]=portE3.portA[6]
page[0]=trap.output
map[0][0000-3FFF]=bios[0000]
map[0][4000-FFFF]=mem1[0000]
map[1][0000-1FFF]=biosESX[0000]
map[1][2000-3FFF]=mem2.frame[0]
map[1][4000-FFFF]=mem1[0000]
map[2][0000-3FFF]=bios[0000]
map[2][4000-FFFF]=mem1[0000]
map[4][0000-1FFF]=biosESX[0000]
map[4][2000-3FFF]=mem2.frame[0]
map[4][4000-FFFF]=mem1[0000]
map[5][0000-1FFF]=biosESX[0000]
map[5][2000-3FFF]=mem2.frame[0]
map[5][4000-FFFF]=mem1[0000]
map[3][0000-1FFF].ro=mem2[6000]
map[3][2000-3FFF]=mem2p
map[3][4000-FFFF]=mem1[0000]
map[6][0000-1FFF]=biosESX[0000]
map[6][2000-3FFF]=mem2.frame[0]
map[6][4000-FFFF]=mem1[0000]
map[7][0000-1FFF]=biosESX[0000]
map[7][2000-3FFF]=mem2.frame[0]
map[7][4000-FFFF]=mem1[0000]
initpage=0
}
portE3 : K580ww55 {
}
trap : exec-sensor {
range[0000-0001]=1
range[0008-0009]=1
range[0038-0039]=1
range[0066-0067]=1
range[04c6-04c7]=1
range[0562-0563]=1
range[3D00-3DFF]=1
range[1FF8-1FFF]=0
}
sdcard : sd-mmc {
image="zx\SanF2.raw"
}
hdd : cf-ide {
drive[0].image="zx\SanF2.raw"
drive[0].geometry=1024C16H63S
; ca a (cat a)
}
[свернуть]
но ничего не работает.
Переключение DivROM и страниц DivRAM в отладчике видно, но при попытке из DivROM вывести текст приглашения, идет вызов функции ПЗУ ZX48, там далее, вызов на rst 8, его перехват(trap) на DivROM, а вот обратно возврат происходит в пустую страницу DivRAM 0х2246...
Получается, что то не так с распределением страниц, где ошибка, может кто подсказать?




Ответить с цитированием