|
ForumsSega Master System / Mark III / Game GearSG-1000 / SC-3000 / SF-7000 / OMV |
Home - Forums - Games - Scans - Maps - Cheats - Credits Music - Videos - Development - Hacks - Translations - Homebrew |
Goto page 1, 2 Next |
Author | Message |
---|---|
|
Few questions from a newbey / WingWarriors
Posted: Mon May 02, 2016 6:56 am
|
Hi,
I'm new in Master System development. I have some experience in z80 assembly and I have done a MSX game, that I would like to port to Master System. https://www.msx.org/es/news/challenges/es/msxdev15-wing-warriors I have followed the Maxims tutorial and advance quite a bit. But now is pretty clear that my rom will take more than 48 Kb and the memory layout that you can find in the tutorial will not fit to my requirements. .memorymap
defaultslot 0 slotsize $c000 ; $80000=512, $40000=256, $20000=128, $10000=64Kb, $c000=48Kb, $8000=32Kb, $4000=16Kb slot 0 $0000 slotsize $2000 slot 1 $c000 ; The RAM is a single slot starting at $C000 and is $2000 bytes big .endme .rombankmap bankstotal 1 banksize $c000 banks 1 .endro I have searched a little bit on the net, how to do the bank switch, but I didn't find any tutorial or post that clarifies this. I don't understand very well the concepts "bank" and "section". Can anybody explain to me in a way that even a child could understand? How do you make a bank switch? Also, when I compile with my current code I find some suspicius lines. WingWarriors.asm: INTERNAL_PASS_2: Section "data_gfx_select_1" doesn't fit into the specified 1 bytes. Enlarging to 2652 bytes.
WingWarriors.asm: INTERNAL_PASS_2: Section "data_gfx_select_2" doesn't fit into the specified 2 bytes. Enlarging to 4750 bytes. WingWarriors.asm: INTERNAL_PASS_2: Section "data_gfx_select_3" doesn't fit into the specified 3 bytes. Enlarging to 101 bytes. WingWarriors.asm: INTERNAL_PASS_2: Section "data_gfx_stg_1" doesn't fit into the specified 1 bytes. Enlarging to 2686 bytes. WingWarriors.asm: INTERNAL_PASS_2: Section "data_gfx_stg_2" ...... object.o: MEM_INSERT: Overwrite at $7ffa (old $3f new $55). object.o: MEM_INSERT: Overwrite at $7ffb (old $15 new $d9). object.o: MEM_INSERT: Overwrite at $7fff (old $08 new $4c). Free space at $0064-$0065. Free space at $7fdd-$7fdf. Free space at $9845-$bfff. Bank 00 has 10176 bytes (20.70%) free. 10176 unused bytes of total 49152. Presione una tecla para continuar . . . Everytime I got those MEM_INSERT something in my code is not working right. Why does that happens? Find attached to this post the code in case you want to check. Thank you in advance! |
|
|
Posted: Mon May 02, 2016 7:18 am |
Maybe sverx' post on banking and related issues can help? (http://www.smspower.org/forums/15794-AFewHintsOnCodingAMediumLargeSizedGameUsingWLADX). | |
|
Posted: Mon May 02, 2016 9:12 am |
There's a standard mapper memory map bundled with WLA DX, you just pick the bank counts.
WLA DX assigns meaning to sections with _<number> at the end of the name, it's warning you that you're exceeding the number. Memory overwriting is very bad, it suggests something has gone much more wrong but may be a side effect of the broken banking. If you have everything in sections then it shouldn't happen (you get "no room for section" instead). |
|
|
Posted: Mon May 02, 2016 8:30 pm |
Than you hang-on & Maxim.
I have read the "AFewHints..." thread, but still there's something very elemental that I don't understand. The .superfree and .free keywords. In witch context do they allocate in memory? In any part of the ROM memory? In bank that has been previously defined in the code? I have changed the memory map to this...: .memorymap
defaultslot 0 slotsize $4000 slot 0 $0000 ; rom bank 0 (0-16 kb). slot 1 $4000 ; rom bank 1 (16-32 kb). slotsize $2000 slot 2 $c000 ; ram. .endme .rombankmap bankstotal 3 banksize $4000 banks 3 .endro ...but now the graphics are corrupted. How do I control the bank that the graphics are allocated and how do I swich between those banks to load them correctly? |
|
|
Posted: Mon May 02, 2016 8:54 pm |
You need a third slot at $8000. Free sections go anywhere in the current bank, so your bank directives are important. Superfree sections go anywhere they want, so you always need to page them in (:label) before accessing the data.
I'll take a closer look at your code tomorrow, I didn't get to a real computer yet... |
|
|
Posted: Mon May 02, 2016 9:10 pm |
Hi and welcome Fran Matsusaka,
you switch to a bank by writing to the mapper register corresponding to the slot you want your bank to be mapped into. If you want to map your bank into slot 2 ($8000 - $bfff) you just write the desired bank number to $ffff. (As Maxim said you should additionally have slot 2 starting from $8000.) If you know what bank you want to map in, e.g., bank 3 then you can just do ld a, 3
ld ($ffff), a If you don't know the bank or don't want to hardcode the bank you can also use a label to retrieve the bank it is stored in by doing the following: ld a, :theLabel
ld ($ffff), a The colon (:) prefixing theLabel tells the assembler to put the bank of the label here. To provide more detailed help it'd be helpful to have a compiled binary to test. |
|
|
Posted: Tue May 03, 2016 7:58 am |
That thread assumes you already know what's paging and how it works, and develops from there. You're probably still learning what is paging and how to use it so you might be still too much a newbie for that topic, but you'll probably find it useful as soon as you learn how to page... BTW the basic concept is that the Z80 processor 'sees' the memory addresses from $0000 to $bfff 'through' 3 'holes', called 'slots'. The first slot starts at $0000, the second at $4000 and the third at $8000, and they're all 16KB in size. Your ROM instead is made up of 16KB chunks, called 'banks', numbered from 0 onward. In the simpler approach you will map bank 0 onto slot 0, bank 1 onto slot 1 and all the other banks, when you need to access data into them, on slot 2. To select which bank got mapped into slot 2... well, Calindro is already explaining :) |
|
|
Posted: Tue May 03, 2016 7:24 pm |
Thank you Calindro! That's exactly what I was missing! Now the program works prefectly with 4 banks. Now I feel confident to be able to add more banks in case I need them. Also, thanks to sverx for you explanation. I think I undestand it now. It may be simple, but is a little bit abstract at first. By the way, I have a small problem in a given screen. For a unknown reasson a misterious tile appears on the top left part of the screen. I have yet not started with sprites. Maybe I override a part of the VRAM for sprite-only use with the tile info??? |
|
|
Posted: Tue May 03, 2016 8:10 pm |
You can turn off all the sprites: Output $d0 to vram address $3f00 (the first sprite's vertical position). $d0 is a special character - all sprites that occur after the $d0 entry are disabled. Judging by your screenshot, I think this will fix your mysterious tile issue. | |
|
Posted: Wed May 04, 2016 8:57 pm |
That was exactly the problem. Thank you very much! | |
|
Line interruptions
Posted: Mon Jan 23, 2017 9:49 am
|
Hi again,
Recently I continued the game, and I have found few new problems. I have studied the documentation about line interruptions, but at this point I'm don't know what I'm doing wrong. I have a vertical scroll, and I want to add two lines of tiles with a message (from pixel 64 to 72 and 128-136) that should not be affected by scroll. I think a image is worth it than one thousand words... So i want the scroll to move but not the couple of messages. So far I have writen a peace of code to trigger the lines 64, 72, 128 and 136. I think everything is right, but is not working and the whole screen is scrolling. I guess I may be missing something very elemental... Here's the code Vblank/HBlank handler: ;==============================================================
; Vblank/HBlank handler ;============================================================== .org $0038 .section "Interrupt handler" force ex af,af' ; save accumulator in its shadow reg. in a,$bf ; get vdp status / satisfy interrupt. ld (PORT_VDPStatus),a ; save vdp status in ram. ld a,[m_iInterruptState] cp ST_BOSS_COMING jr z,hBlankHandler_BossComming vBlankHandler: jp interruptEnd hBlankHandler_BossComming: call INTERRUPT_BOSS_COMMING interruptEnd: ex af,af' ; restore accumulator. ei ; enable interrupts. ret ; return from interrupt. .ends State initialization and line interruption switch on: ;==============================================================
; GAME_BOSS_COMING ;============================================================== INIT_BOSS_COMING: ld a,ST_BOSS_COMING ld [m_iInterruptState],a xor a ld [m_iInterruptIndex],a add a,255 out ($bf),a ld a, $8a out ($bf),a ; Enable h interrutions hBlank ld a, %10010100 ; |||||||| ; |||||||`- Synch enable ; ||||||`-- Extra height enable/TMS9918 mode select ; |||||`--- Mode 4 enable ; ||||`---- Shift sprites left 8 pixels ; |||`----- Enable line interrupts ; ||`------ Hide leftmost 8 pixels ; |`------- Horizontal scroll lock ; `-------- Vertical scroll lock out ($bf),a ld a,$80 out ($bf),a call myhalt .... State update: REPAINT_BOSS_COMING:
ld a,1 ld [m_iInterruptIndex],a ; frame control call myhalt_pmusic call myhalt call myhalt ; lines between 64 & 128 call DRAW_SPRITES ; draw sprites call myhalt call myhalt ; Check frame call DRAW_SCROLL ... Funtion to handle line interruption: INTERRUPT_BOSS_COMMING:
in a,($7e) ; V counter for debug purpouses ld a,[m_iInterruptIndex] inc a ld [m_iInterruptIndex],a cp 1 jr z,INTBOSS_VBLANK cp 2 jr z,INTBOSS_LINE31 cp 3 jr z,INTBOSS_LINE63 cp 4 jr z,INTBOSS_LINE64 cp 5 jr z,INTBOSS_LINE72 cp 6 jr z,INTBOSS_LINE128 cp 7 jr z,INTBOSS_VBLANK ret ;============================================================== ; Vblank ;============================================================== INTBOSS_VBLANK: ; Restore scroll ld a,[m_iDrawScrollY] ld b,8 add a,b out ($BF), a ld a, $89 ; Register $09 - Background Y Scroll out ($BF), a ; next interruption ld a,30 out ($bf),a ld a,$8a out ($bf),a ret ;============================================================== ; Line 31 ;============================================================== INTBOSS_LINE31: ; next interruption ld a,2 out ($bf),a ld a,$8a out ($bf),a ret ;============================================================== ; Line 63 ;============================================================== INTBOSS_LINE63: ; next interruption ld a,7 out ($bf),a ld a,$8a out ($bf),a ret ;============================================================== ; Line 64 ;============================================================== INTBOSS_LINE64: ; next interruption ld a,55 out ($bf),a ld a,$8a out ($bf),a ; Reset scroll ld a,[m_iTxtBossCommingScroll1] out ($bf),a ld a,$89 out ($bf),a ret ;============================================================== ; Line 72 ;============================================================== INTBOSS_LINE72: ; next interruption ld a,7 out ($bf),a ld a,$8a out ($bf),a ; Restore scroll ld a,[m_iDrawScrollY] ld b,8 add a,b out ($BF), a ld a, $89 ; Register $09 - Background Y Scroll out ($BF), a ret ;============================================================== ; Line 128 ;============================================================== INTBOSS_LINE128: ; next interruption ld a,255 out ($bf),a ld a,$8a out ($bf),a ; Reset scroll ld a,[m_iTxtBossCommingScroll2] out ($bf),a ld a,$89 out ($bf),a ret I may provide source code in private if somebody whan to check it Thanks in advance! |
|
|
Posted: Mon Jan 23, 2017 9:54 am |
well, it's only that unfortunately you can't change the vertical scroll value mid-frame - when the screen is already in the "vDraw" phase :| | |
|
Posted: Mon Jan 23, 2017 10:57 am |
So, that means that what I whant to do is not possible? Or that I need to find a new aproach to achieve it? I have seen other threads that do similar things
http://www.smspower.org/forums/8333-PartScreenScroll Edit: it's possible to change the horizontal scroll in line interrupt but not the vertical scroll? Edit2: having reading the thread again from top to bottom is pretty clear that vscroll can not be changed. That sucks... |
|
|
Posted: Mon Jan 23, 2017 1:06 pm |
you can anyway update the tiles on screen (on a adequate row) and let the text scroll with the background... | |
|
Posted: Mon Jan 23, 2017 2:45 pm |
Yep, that's what I'm working on now. Thanks | |
|
Posted: Mon Feb 20, 2017 10:09 pm |
Hi again,
I have done the music and I'm starting to implement the sound FX's to the game. I'm having small problems mixing both at the same time. In the MSX version of the game the sound FX uses the channel 3, muting the music while it's playing and recovering the music sound as soon as the FX is over. The trick is done very well, so it doesn't break the music rythm very much. It can not be said the same thing with PSGLib... after the FX is over the third channel keeps muted for a few frames, and sometimes I have the feeling that all channels has been muted! This happens with a sound FX that is played when you move the cursor. Strangely the other sound FX (selecting a option) doesn't seems to have that problem. So I don't know if can be fixed in the library or if is a limitation of the sound chip, neither if ts there any workaround to the problem, but any suggestion would be really apreciated. You can find the msx game to see how well the music and the fx plays together, and also the master system demo to hear the problem. MSX: https://drive.google.com/open?id=0B-6vVXEeG1u3N2RNZmNjUUZ2UzQ Master System: https://drive.google.com/open?id=0B-6vVXEeG1u3aTVTcU8xb3FuN3c |
|
|
Posted: Tue Feb 21, 2017 9:12 am |
That's what happens when the FX has some silence at the end. Trim that silence from the FX, if that's unwanted. edit: I tried your ROM, it seems to me you're using wrong channels for SFX. The SFX can only use channel 2 and/or 3(noise) and when you convert the VGM to PSG format, you should use the filter option if you're going to use that PSG for SFXs (I mean you need to specify -2 or -3 or -23 as the last parameter according to the channels you want to retain) |
|
|
Posted: Thu Feb 23, 2017 6:23 am |
Hi sverx, thanks as always.
Yes, it was indeed a problem with the conver from vgm to psg. About your first sentence, if I trim the silence from the effect file, would not the effect sound keep sounding until a music note overwrites it? |
|
|
Posted: Thu Feb 23, 2017 9:05 am |
No, as soon as the SFX is over the channel will be 'reallocated' to the tune and its frequency and volume will be restored to what the tune commanded. So there's really no use of leaving silence at the end of the SFX, unless you really want a trailing silence... | |
|
Posted: Fri Apr 07, 2017 6:09 pm |
Hi again,
I have tested my game on a Megadrive. By using a Master System pad everything works perfect, but if I use a Megadrive pad the controls are screwed up. I have searched a little bit about this matter, but is pretty confusing... is possible to support Megadrive pads using the game in Power Base Converter? |
|
|
Posted: Fri Apr 07, 2017 9:15 pm |
Hello Fran,
If your game only use 2 standard master system buttons, you may set megadrive pad select always high before reading port. You can read about it in: http://www.smspower.org/Development/PeripheralPorts |
|
|
Posted: Mon Apr 10, 2017 6:56 pm |
Thanks for your response. I readed the documentation and I fixed it! | |
|
Posted: Mon Oct 01, 2018 12:00 pm |
Hi again.
After having a snap of more than one year I returned to the game, as it's pretty advanced and few task remains to be completed. The thing is that I have bought a Game Gear recently, with an everdrive, and I felt the impulse to make a port to this console in GG mode. The original SMS game has the "Disable vertical scrolling for colums 24-32" flag on. In GameGear this is completelly useless, as it only locks the last two colums of the visible screen and The UI can not be drawed in such small area. Anybody knows a way to disable more colums in the GG? Or is a completelly lost case? Thanks in advance |
|
|
Posted: Mon Oct 01, 2018 12:19 pm |
short answer: no, you can't disable scroll on more columns.
anyway if you're porting your game to GG you should probably re-think some other stuff too... or make it an SMS game in a GG cart (which will resize your SMS screen to fit the GG one, the outcome is pretty bad IMHO) |
|
|
Posted: Mon Oct 01, 2018 1:57 pm |
Yes. I guess the only way should to add score information in a pause screen, excepting remaining lifes, that could be done by sprites. Thank for the information! |
|
|
Posted: Mon Oct 01, 2018 4:58 pm |
I attempted to disable scrolling for a UI on mine as well and tried many tricks to see if I could get it but never could. I ended up using a pause menu that just redraws whats currently on screen in vram then places sprites to represent score, health, and any extras. Most of this was also because using priority tiles and GSL which got in the way of on screen UI sprites. However I manage to get it in my battle scenes since I dont use priority tiles, Ive yet to reposition it for GG screen size though.
|
|
|
Posted: Sat Mar 02, 2019 9:07 pm |
Hi again!
I've almost finished the game. All bugs fixed and all features implemented... excepting the sound FX. I'm using some Alexx kid sounds as placeholders. I would like to have the same sound fx from the original MSX version, but I cannot understand very well the format, no matter how long I check the hexadecimal data. Is there any expert in vgm sound that could replicate the MSX sound fx's just listening them? I need 4 sounds. I may pay a few bucks (50 $) for the job. Thanks in advance! |
|
|
Posted: Sun Mar 03, 2019 12:10 am |
Use VGMTool to write VGMs to text to understand the format. SFX are usually fairly simple. | |
|
Posted: Mon Mar 04, 2019 7:34 pm |
Thanks. The problem is with the MSX format, not with the VGM. Anyway, I was able to understand it and now happily I have finished the game! |
|
|
Posted: Mon Mar 04, 2019 8:10 pm |
Show us the thing! :-D | |
|
Posted: Tue Mar 05, 2019 8:45 am |
Coding compo is due in a few days - I hope we'll see the game then :) | |
|
Posted: Sun Apr 07, 2019 3:51 pm |
Nooooooooooo!!!!! It seems I the deadline was a few days ago... I wish I readed this message earlier... Thanks anyway |
|
|
Posted: Sun Apr 07, 2019 3:53 pm |
Here you have it: Game gear: https://drive.google.com/open?id=1C30SFT6eMFAd_c6zAnA0cDEMBbSeFZ3- Master System: https://drive.google.com/open?id=1Wv5_Pf66EAzmegp0Ix7eJvohAyYnGmBS |
|
|
Posted: Sun Apr 07, 2019 4:23 pm |
Wow, this is amazing!
I like how the game is balanced, it's not too difficult and very pleasant to play. (Although I have to admit I did use savestate on the later bosses). Attached the SMS/GG roms (prefer using attachment rather than GoogleDrive links, they will disappear). |
|
|
Posted: Sun Apr 07, 2019 4:51 pm |
Wow! only tried a fast play, but it looks really, really promising!
You should have entered the contest! |
|
|
Posted: Tue Apr 09, 2019 11:23 am |
I found a bug (I think, unless it was my emulator), I died at the same time as completing the first level, got shot after I had lost control of the player - and this totally messed up the graphics on the second level. When I tried playing it again and didn't die everything looked fine. | |
|
Posted: Tue Apr 09, 2019 5:20 pm |
Really nice game.
I miss a special attack with the second button and some sound effects. A video of my first gameplay: |
|
|
Posted: Tue Apr 09, 2019 7:22 pm |
Congratulations Fran !!!!!
It makes me up for create new games. Looks really like Phelios style in 8 bit system |
|
|
Posted: Wed Apr 10, 2019 7:40 am |
the same here, not sure what caused it, though. I'm going to test it on hardware ASAP. |
|
|
Posted: Wed Apr 10, 2019 4:41 pm |
Hey, thanks for your video! Yes, I miss the second button also. From my point of view, that's what would make this a decent Master System game, but I couldn't find any good idea to implement easily and cheap (I don't have to many tile/sprites memory free). Also would be nice to have something like a secondary shot, that differs depending on the character. But that means a lot of extra sprites (and code). Fx and sverx, thanks for the bug report. I will work on a fix this weekend. |
|
|
Posted: Wed Apr 10, 2019 6:47 pm |
Finally got a chance to play this. I played on real hardware, on the Mega Sg to be precise.
Master System version is heavily glitched. There‘s a weird doubling of tile rows, and tile rows are refreshed in the middle of the screen. Music seems to run a whole lot faster than on the Game Gear. Game Gear version seems to run fine, but the smaller screen gets very cramped and you can get easily swarmed without a chance to escape if enemies come from front and back. I very much like the little radar thing that shows your position in the level. Both versions have slowdown if many bullets are on screen, even the music slows down. Apart from that, I think the game is great. There are some really nice bullet patterns, especially at the bosses. Beautiful graphics, too, even though it seems you less simultaneous colors than the system offers, but that‘s probably because the visuals have been ported from the MSX. |
|
|
Posted: Wed Apr 10, 2019 8:52 pm |
I've just tried in a Megadrive II and besides the music speed problem I didn't found anything strange with the graphics. Could you post a photo of that doubling of tile rows glitch?
Yeah. I spend a lot of effort reducing the slowdowns, but my knowledge on the system and in z80 has its own limits. Thanks for the comments! And a small question: is possible to use the megadrive pause button? |
|
|
Posted: Wed Apr 10, 2019 9:54 pm |
Good idea about a different shot. Another idea:Maybe you can add different types and choose the type with the second button. |
|
|
Posted: Thu Apr 11, 2019 6:53 am |
I think the Mega Sg might act like an SMS1 VDP, and you have probably switched off bit 0 in VDP register 2. http://www.smspower.org/Development/TilemapMirroring This describes exactly what I‘m seeing. At which speed is the music supposed to play? Have you tried updating the PSG channels at the start if vblank? That way the music would keep playing at normal speed even if the game slows down. I can‘t test pause button behaviour, unfortunately, because the Mega Sg maps the MD start button to SMS pause button automatically when in SMS mode. |
|
|
Posted: Fri Apr 12, 2019 4:41 pm Last edited by Fran Matsusaka on Sat Apr 13, 2019 8:02 am; edited 2 times in total |
That's very interesting indeed. And very anoying too lol So I have to understand that your Mega Sg is implementing the SMS1 VDP in Master System mode, and my Megadrive 2 is probably implementing the SMS2 VDP, so for that reasson I don't see the bug? Could you check if the bug is now fixed when you have time? Thanks in advance! |
|
|
Posted: Sat Apr 13, 2019 5:54 am |
Thanks for updating. I‘ll test it as soon as I can. Might not be before tomorrow, though.
I think it‘s interesting that the Mega SG acts like an SMS1 VDP, as I think the later revision would actually make more sense for compatibility‘s sake. I‘d like to test on my real SMS, too, but my original Everdrive has died and I haven‘t yet found an SD card my replacement X7 works with. |
|
|
Posted: Sat Apr 13, 2019 8:38 am |
I had the chance to do a quick test run. The tilemap mirroring is fixed now, but two new bugs have surfaced:
1. The screen border flashes when an enemy is destroyed. 2. A short way into the first level, the screen freezes for a second. After that the body of the player sprite is missing, just the wings remain. You can still move around, but no enemies appear anymore. |
|
|
Posted: Sat Apr 13, 2019 8:50 am |
I fixed few bugs, and now the music is in the correct speed in all versions and regions
|
|
|
Posted: Sat Apr 13, 2019 8:55 am |
Glad to hear it is fixed.
Hehehe, that's done at purpouse. But few people sees it as a bug :p
Yeah, that's a consecuence of moving the music from the main loop to the vblank handler. The music is at the correct speed always, but sometimes destroys registers. I added a couple push/pop and that made the trick. The fixed version is already in my previous link. Thanks for the testing! |
|
|
Posted: Sun Apr 14, 2019 9:12 am |
The latest version works flawlessly, at least up until the stage 6 boss. That‘s as far as I got so far.
One minor thing: In the dialogue boxes before the boss fights everything in the eight rightmost columns text is one pixel up compared to the rest. I guess scrolling of the level should stop one pixel earlier? I still find the flashing borders a tad annoying, but of course I respect your artistic choice. Could you tell me where exactly the player‘s hitbox is and how big it is? I could have sworn I got hit by some bullets that should have missed the player‘s legs just barely. |
|
Goto page 1, 2 Next |