Missing of /CAS sounds pretty bad... Missing of /IORQ is also kind of a mark that the CPU is not doing anything useful. The /INT is generated by VDP only after CPU asks it to start sending ints. In general I would guess that the CPU is not now booting even from the ROM... As you have oscilloscope, I think you should start from very basics... What kind of activity there is in address lines? Can you get any idea of address range the CPU is executing? Any activity on /RD, /WAIT, /MREQ, /ROMCS & /SLT3,30 ? Once we know what signals are working and what not, I think it is more easy to start giving better ideas... Maybe someone has inserted a cartridge wrong way around and now some buffer chip is in short circuit preventing Z80 from bus? Very hard to say.
The CPU seems active as far as I can tell. I have an oscilloscope, and I see perfectly normal activity in /RFSH, /M1, /WR, /RD, /MREQ, and /WAIT. There's also a healthy clock signal and normal activity in the address bus.
Where should I check the /ROMCS and /SLT3 signals? Is that in the VDP?
If CPU is active and there's no INT, the BIOS is stuck waiting for the first frame from the VDP. The system doesn't start until VDP sends this signal. That's what I found out during my repairing of F700P. I even found the place in BIOS where the code gets stuck with the logic analyzer. However in my case I at least got an empty blue screen before the BIOS got stuck.
If CPU is active and there's no INT, the BIOS is stuck waiting for the first frame from the VDP. The system doesn't start until VDP sends this signal. That's what I found out during my repairing of F700P. I even found the place in BIOS where the code gets stuck with the logic analyzer. However in my case I at least got an empty blue screen before the BIOS got stuck.
So that points to a bad ROM, right? (or a bad data bus and it's not able to get the data correctly from the ROM). Are the ROMs in OpenMSX the best ROMs to use, or is there a better repository of completely unaltered ROMs?
No, the ROMs were fine. They are just programmed so that they only continue booting after getting the first complete frame from VDP.
No, the ROMs were fine. They are just programmed so that they only continue booting after getting the first complete frame from VDP.
Oh so you're thinking faulty VDP! Bummer! I suspect that's difficult to replace, right?
I am not a professional engineer, I am just sharing my experience. Replacing the VDP is not much more difficult than replacing any other through-hole mounted chip of this size. The difficulty level depends on whether the board is single or double sided. On the double sided boards replacing the VDP is more challenging because the chip is usually soldered from both sides.
It also heavily depends on what tools you use to remove the chip. I use the Chinese-made electric desoldering pump to remove the solder from all the pins. It requires time and patience and there's always a risk to damage the board. In some cases, when you are sure that the chip is broken, it's safer to cut all the pins from the chip and remove them with a soldering iron - this saves the board.
I have the tools and the experience, so I'm not that concerned about removing the VDP. I'm more concerned about finding a replacement one :-b I don't imagine those are easy to come by, right?
Theres several V9938s and V9958s on eBay.
Where should I check the /ROMCS and /SLT3 signals? Is that in the VDP?
They activate the ROMs... I was wondering if we could somehow a bit limit the problem, like if the program is actually read from ROM correctly (No shorted address or data line or something like that)
VDP could be one to blaim... you said there was hot VRAM chips etc. but I still fail to see how it could affect the /CAS in RAM...
You said that you burned new ROMs, so maybe you could try to replace the main ROM with this "Hello World"-program I've wrote earlier... It does not need working RAM, working interrupts or anything like that... At least we could see if VDP can output video normally and if the program is read correctly from ROM...
; This is a "Hello World" program for Z80 and TMS9918 / TMS9928 / TMS9929 / ; V9938 or V9958 VDP. ; That means that this should work on SVI, MSX, Colecovision, Memotech, ; and many other Z80 based home computers or game consoles. ; ; Because we don't know what system is used, we don't know where RAM ; is, so we can't use stack in this program. ; ; This version of Hello World was written by Timo "NYYRIKKI" Soilamaa ; 17.10.2001 ; ;---------------------------------------------------------------------- ; Configure this part: DATAP: EQU #98 ; VDP Data port #98 works on all MSX models ; (TMS9918/TMS9929/V9938 or V9958) ; #80 works on SVI ; (for other platforms you have to figure this out by your self) CMDP: EQU #99 ; VDP Command port #99 works on all MSX models ; (TMS9918/TMS9929/V9938 or V9958) ; #81 works on SVI ; (for other platforms you have to figure this out by your self) ;----------------------------------------------------------------------- ; Program starts here: ORG 0 ; Z80 starts always from here when power is turned on DI ; We don't know, how interrupts works in this system, so we disable them. ; Let's set VDP write address to #0000 XOR A OUT (CMDP),A LD A,#40 OUT (CMDP),A ; Now let's clear first 16Kb of VDP memory LD B,0 LD HL,#3FFF LD C,DATAP CLEAR: OUT (C),B DEC HL LD A,H OR L NOP ; Let's wait 8 clock cycles just in case VDP is not quick enough. NOP JR NZ,CLEAR ; Now it is time to set up VDP registers: ;---------------------------------------- ; Register 0 to #0 ; ; Set mode selection bit M3 (maybe also M4 & M5) to zero and ; disable external video & horizontal interrupt LD C,CMDP LD E,#80 OUT (C),A OUT (C),E ;---------------------------------------- ; Register 1 to #70 ; ; Select 40 column mode, enable screen and enable vertical interrupt LD A,#70 INC E OUT (C),A OUT (C),E ;---------------------------------------- ; Register 2 to #0 ; ; Set pattern name table to #0000 XOR A INC E OUT (C),A OUT (C),E ;---------------------------------------- ; Register 3 is ignored as 40 column mode does not need color table ; INC E ;---------------------------------------- ; Register 4 to #1 ; Set pattern generator table to #800 INC A INC E OUT (C),A OUT (C),E ;---------------------------------------- ; Registers 5 (Sprite attribute) & 6 (Sprite pattern) are ignored ; as 40 column mode does not have sprites INC E INC E ;---------------------------------------- ; Register 7 to #F0 ; Set colors to white on black LD A,#F0 INC E OUT (C),A OUT (C),E ;---------------------------------------- ; Let's set VDP write address to #808 so, that we can write ; character set to memory ; (No need to write SPACE it is clear char already) LD A,8 OUT (C),A LD A,#48 OUT (C),A ; Let's copy character set LD HL,CHARS LD B, CHARS_END-CHARS COPYCHARS: LD A,(HL) OUT (DATAP),A INC HL NOP ; Let's wait 8 clock cycles just in case VDP is not quick enough. NOP DJNZ COPYCHARS ; Let's set write address to start of name table XOR A OUT (C),A LD A,#40 OUT (C),A ; Let's put characters to screen LD HL,ORDER LD B,ORDER_END-ORDER COPYORDER: LD A,(HL) OUT (DATAP),A INC HL JR OVERNMI NOP NOP ; Here is address #66, that is entry for NMI RETN ;Return from NMI OVERNMI: DJNZ COPYORDER ; The end HALT ; Character set: ; -------------- ORDER: DEFB 1,2,3,3,4,0,5,4,6,3,7 ORDER_END: CHARS: ; H DEFB %10001000 DEFB %10001000 DEFB %10001000 DEFB %11111000 DEFB %10001000 DEFB %10001000 DEFB %10001000 DEFB %00000000 ; e DEFB %00000000 DEFB %00000000 DEFB %01110000 DEFB %10001000 DEFB %11111000 DEFB %10000000 DEFB %01110000 DEFB %00000000 ; l DEFB %01100000 DEFB %00100000 DEFB %00100000 DEFB %00100000 DEFB %00100000 DEFB %00100000 DEFB %01110000 DEFB %00000000 ; o DEFB %00000000 DEFB %00000000 DEFB %01110000 DEFB %10001000 DEFB %10001000 DEFB %10001000 DEFB %01110000 DEFB %00000000 ; W DEFB %10001000 DEFB %10001000 DEFB %10001000 DEFB %10101000 DEFB %10101000 DEFB %11011000 DEFB %10001000 DEFB %00000000 ; r DEFB %00000000 DEFB %00000000 DEFB %10110000 DEFB %11001000 DEFB %10000000 DEFB %10000000 DEFB %10000000 DEFB %00000000 ; d DEFB %00001000 DEFB %00001000 DEFB %01101000 DEFB %10011000 DEFB %10001000 DEFB %10011000 DEFB %01101000 DEFB %00000000 CHARS_END: DS $7FFF-$,255
EDIT: Patched the code to enable interrupts to see if they are actually generated or not. (The program does not use them anyway)