What's new

Sega Master System

krypt100

New member
some progress on my sms emulator which I started 2 weeks ago, most of the time was spent on the Z80 (still buggy and incomplete), as of now it's still far away from completion, interrupt handling is broken, scrolling is not implemented, sprite layer is missing, and the bg tiles are flipped.

screen shots from the nametable area of the VRAM
 

JKKDARK

New member
some progress on my sms emulator which I started 2 weeks ago, most of the time was spent on the Z80 (still buggy and incomplete), as of now it's still far away from completion, interrupt handling is broken, scrolling is not implemented, sprite layer is missing, and the bg tiles are flipped.

screen shots from the nametable area of the VRAM

Did you do some progress since August? :)
 

CodeSlinger

New member
Im having a look at starting a sega master system emulator now I've finished my gamboy emulator. I've had a quick look through the documentation and it looks easier than the gameboy which I didnt think would be the case. The only issue im having so far is I havent found anything related to the reset state of the SMS, like what do the registers get set to on startup and what is the stack pointer initialized to along with the program counter?

Anyone know of any documentation which explains this?

I cant see this project taking that long, maybe two months including sound emulation.

Thanks

Edit:

Im guessing that as I cannot find any documentation on this, perhaps the system sets the registers etc to a known state itself on powerup, so I dont need to set them the game will automatically do it... just a thought.
 
Last edited:

nameuser

New member
CodeSlinger - you can always get a BIOS, emulate it correctly, and check the system state after the BIOS turns itself off. As for running the BIOS - you just need to set PC to 0, I believe.

EDIT : also, interrupts are disabled before running the BIOS, of course. Also, both SP and AF are apparently 0xffff before running the BIOS (other registers are undefined) but I dunno if there are any BIOSes that make use of that - there are only a few, after all. (this is from the "undocumented Z80 documented" document and, again, applies to the machine's state before the BIOS, not before the games)
 
Last edited:

CodeSlinger

New member
Thats a good idea actually, thanks!

So far I've programmed about 50% of the Z80 cpu so hopefully by the weekend I can start getting some results.
 

AamirM

New member
Hi,

@ CodeSlinger:
If your still wondering why Shadow Dancer doesn't run on your SMS emu, SP should be 0xDFF0 ;) (disasm the bios).

stay safe,

AamirM
 

CodeSlinger

New member
Thanks mate :)

I now have one game showing the first screen which isnt bad considering ive only been working on it this weekend.

One question I do have though is the vcounter on the VDP has 192 active scanlines (default) and a total of 261 scanlines (default). When it goes over 261 it wraps back to 0. This means that an 8 bit variable cannot hold the full vcounter range because it can only hold a range of 0-255 and I need to store a range of 0-261. Now it seems quite obvious to me that I shouldnt be using an 8 bit variable to store vcounter and should be using a 16 bit which means I easily have enough room to store the vcounter range. All this seems fine to me.

However when the ROM reads from port $7F (mirrored in $7E) it stores the value of the vcounter in one of the 8 bit registers. So how can an 8 bit register store the correct value of vcounter because the vcounter cannot always be represented in an 8 bit number? The opcode responsible for retrieving the vcounter is "IN A, (n)" which doesnt set any flags otherwise I thought thats how it could do it.

Thanks for any help
 

AamirM

New member
Hi,

VCounter is always between 0-255. It jumps (comes back) between different screen areas. For example, on line 259 (on 192 active lines display) vcounter value would be 253. So everything can come in 8-bits ;) .

stay safe,

AamirM
 

CodeSlinger

New member
Thanks for the info! Sounds a bit hacky to me lol. Oh well simple enough to implement.

I havent been able to work on to emu for a few days now. I have two games showing their first screens. I dont think it will be that long until I change something and most games start showing something.
 

AamirM

New member
Hi,

Its not hacky :) . Its simply how the real thing works. Here is what a real Master system would return for each line (all creadits to Charles MacDonald, he probed these):

Code:
uint8 vc_ntsc_192[] =
{
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA,
                                  0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
};

stay safe,

AamirM
 
Last edited:

CodeSlinger

New member
Hi Guys,

It has taken me longer than I'd of liked to make progress with my emulator, mainly because I just havent had the time to work on it that I hoped for.

Anyway here are some screenies:


The alex kidd image is slightly out of date as I now have transparency working on sprites.

Sonic is completable which is great but some games dont even make it to the first screen. This is what I'm going to look into next.

I've ran zexall through my emulator and I pass all tests apart from the following:

aluop a, <ixh,ixl,iyh,iyl>
aluop a,<b,c,d,e,h,l,(hl),a>

aluop are the 8 bit add,adc,sub,sbc,and,or,xor,compare instructions. Interestingly enough the following instructions pass zexall

aluop a, nn
aluop a, <<ix,iy>+1>

All the opcode emulation functions I use for aluop are the same for both the aluop tests that work and for the ones that dont. So I dont understand why they work in some tests and not others.

Hopefully I'll have these fixed soon and then can work on debugging the games that arent working. Then it'll be sound emulation time. Fun fun fun


Edit:

Removed images, no longer have working server.
 
Last edited:

nondescript

New member
Is this thread active? I am starting on my master system emulator and had some questions regarding bank switching. Basically, i need a brief explanation on how bank switching works in sms. Any help is appreciated! Thanks!
 

nondescript

New member
This link has the memory map of SMS

www.smspower.org/uploads/Development/smsarch.html


My question is regarding the bank switching.

so, lets say the address generated fell in the frame 2 range then the mapper will check the register 0xffff and find out the appropriate
page to reference. Is that correct understanding? If so, when will the register 0xffff be updated? Thanks for all the help!
 

Helius

Capsule Corp.
Hi there!

After finishing and polishing my Game Boy emulator I wanted something a little bit more complex.

I tried the Master System and to my surprise I found that it is rather easy to emulate. The CPU (full Z80) is somewhat harder but the system is quite simple compared to the Game Boy and Game Boy Color. Most games aren't very sensitive to timing and the VDP is easy to implement.

So after three weeks of work I have my emu running quite nicely almost all roms and my Z80 core runs zexall without issues.

I'm just finishing the iOS version, you can follow the progress here: https://github.com/drhelius/Gearsystem

And now what? NES maybe?
 

Attachments

  • BTwqz9zCUAAfjf5.png
    BTwqz9zCUAAfjf5.png
    56.4 KB · Views: 97
  • BTwquP8IMAE5F-6.png
    BTwquP8IMAE5F-6.png
    52 KB · Views: 129
  • BTz_w-ZIIAA7D5c.png
    BTz_w-ZIIAA7D5c.png
    65.4 KB · Views: 135
  • BTwql_mIQAAhJW1.png
    BTwql_mIQAAhJW1.png
    78 KB · Views: 120

Top