程序员发现了影响Apple IIc和Apple IIc Plus的固件错误, 迈克尔·吉德罗(Michael Guidero)。 根据发布 他的博客,以下代码和注释中所述的错误是由于他在MAME中对Apple IIc和Apple IIc Plus仿真而产生的。
内存扩展固件具有以下代码来测试内存扩展卡的大小(如果已安装):
numbanks equ $03bb ; screen hole - $c0 sizetemp equ $0478 ; screen hole shared addrl equ $bff8 ; slinky address reg for indirect use addrm equ $bff9 ; real registers are from $c0c0-$c0c3 addrh equ $bffa ; .. data equ $bffb ; slinky data reg ; at entry x is expected to have $c8 (slot * $10 + $88) ; and y is expected to contain $c4 (slot $Cn) testsize equ * lda #0 ; zero address reg l/m sta addrl,x sta addrm,x lda #$10 ; start at 1 meg and go down sec tsloop sbc #1 ; move down a bank sta addrh,x lda data,x ; save existing data pha dec addrl,x ; fix address (undo auto-increment) lda #$a5 ; common apple check byte sta data,x ; store it dec addrl,x ; fix... eor data,x ; 0 if the data is there dec addrl,x ; fix... cmp #1 ; C = 0 if data okay pla sta data,x ; restore data lda addrh,x ; <-- SEE COMMENTS BELOW and #$0f ; only lower nibble valid beq tsnoram ; no RAM somehow! bcs tsloop ; loop until we find a bank adc #1 ; C = 0 from compare tsnoram sta numbanks,y lsr a sta sizetemp ; sizetemp = upper byte of block count rts如果您注意到该代码从所指示的行开始,则可以看到该代码抓住了Slinky地址寄存器的高字节,并将低半字节直接用作计数器值。
问题是,当没有安装内存扩展卡时,就没有寄存器,并且值就是浮动总线。代码跳出循环的唯一原因是因为浮动总线通常碰巧有一堆字节流,低字节中有0。
就是说,当前的MAME不会使$ C0C0- $ C0CF的总线浮动。这将导致ROM $ 03在首次访问该卡时挂起,并且由于ROM $ 04中的更改而在引导时挂起了ROM $ 04。
到目前为止,该错误似乎并不影响实际的硬件,但仅限于MAME系统中的仿真。当被问及他的错误发现时,迈克尔说,“I将与MAME团队合作修复MAME。实际上,它对真正的硬件影响不大。不过,我有解决方法。”
有趣的是,迈克尔也是 ROM 04x / ROM 05x项目 为了追求最终的Apple IIc,Apple II社区的一些成员实施了该工具。
有关此项目和Michael的其他作品的更多信息,请查看他的主要博客,网址为:
http://apple2.guidero.us/doku.php?id=start
请关注并喜欢我们: