カテゴリ 重要度 ステータス 解決状況 登録日時 最終更新
ゲームプレイ解決済み修正済み2015-10-28 22:502015-10-29 20:57
 
テスターcuavas担当者cuavasソースosborne/osborne1.cpp
バージョン0.166発生バージョン修正バージョン0.168
修正コミットプルリク
フラグ
セット osborne1
セット詳細
osborne1 - Osborne-1
 
概 要ROMバンキングが正しく動作していない。
詳 細Osborne 1 can switch between ROM and memory mapped I/O or RAM in the low 16k of the address space. The logic to do this is rather convoluted, and involves several flipflops. From the schematic the following signals are significant in the selection of this bank:


RESET* <= power-on reset generator
NMI* <= reset key active low
M1* <= (/M1 == 1)
M1 <= (/M1 == 0)
INTAK* <= (/IORQ == 0) && (/M1 == 0) && (/WR == 1)
MREQ* <= (/MREQ == 1) || (/RFSH == 0)
RD* <= (/RD == 1)
ROM RD* <= (MREQ* == 1) || (RD* == 1)
/NMI <= (NMI* == 1) || (UB6-5 == 1)


UB6-5 (flipflop)
write to 0x01 in I/O => 1
M1 0->1 => NMI*
(i.e. set by writing to port 1 or the start of opcode fetch or interrupt acknowledge while reset key is not pressed, and cleared by start of opcode fetch or interrupt acknowledge while reset key is pressed)


UB4-5 (flipflop)
Write to 0x01 in I/O => 1
(INTAK* == 0) => 0
((M1 == 1) || (ROM MODE* == 0)) 0->1 => UB6-5


ROM MODE* (flipflop)
write to 0x01 in I/O => 1
(write to 0x00 in I/O) || (RESET* == 0) => 0
((M1 == 1) || (ROM MODE* == 0)) 0->1 => UB4-5


ROM CE* <= (ROM MODE* == 1) || (ADDR15 == 1) || (ADDR14 == 1) || (ADDR15 == 1)
IO REQ <= (ROM MODE* == 0) && (ADDR15 == 0) && (ADDR14 == 0) && (ADDR13 == 1) && (MREQ* == 0)


I/O SEL* (flipflop)
(I/O REQ == 0) => 1
CPU CLK 0->1 => (CHAR CLK* == 0) || (MEM CLK == 0)


The ROM MODE* signal is the key one. Note the nasty feedback loops in the way flipflops are set. To handle banking properly, we need to track the UB6-5, UB4-5 an ROM MODE* flipflop values. The following signals need to be available:
* I/O space writes (we get a nice callback for this already)
* RESET* (power-on reset can be done in the device reset handler)
* NMI* (comes from a currently unimplemented button, but simple enough)
* /M1 output of Z80 CPU (not sure if this is available, need to detect edges)
* /IORQ and /WR output of Z80 CPU (only used in conjunction with /M1 to detect interrupt acknowledge, level sensitive but we need the edge to trigger the transition)
再現手順 
追加情報 
 
添付ファイル