6502.org http://forum.6502.org/ |
|
ATF1504ASL Memory Mapper in WinCUPL http://forum.6502.org/viewtopic.php?f=10&t=5703 |
Page 1 of 1 |
Author: | DarthWader [ Mon Jul 15, 2019 5:41 am ] |
Post subject: | ATF1504ASL Memory Mapper in WinCUPL |
I can't for the life of me figure out what is wrong with my code. I want my register "[Rom_Bank_Reg7..0]" to be written when the input address is between 0x2000 - 0x2FFF (and WR is asserted). I've included the top 4 bits of the address bus as inputs so I can detect this address range. The output "[hiRom7..0]" should behave as follows:
Because the system only reads from from for addresses less than 0x8000, I am using A15 as a CE (active low) for the ROM. I don't think the ATF1504ASL supports synchronous resets, so that's why I'm using asynchronous. I didn't think this would be a problem, since my RESET signal is coming from an input pin (faster than using product terms). However, my program keeps hanging when I try to execute it. Does anyone see any issues below, especially regarding any potential reset issues? Just in case, .l is the latch input, .le is the latch enable, and .ar is the async reset. Sorry if I ask any dumb questions, I'm a total newbie and WinCUPL is surprisingly hard to find help with. Code: /* INPUTS */
pin 2 = A15; /*RomCE, Active low*/ pin 3 = A14; pin 5 = A13; pin 6 = A12; pin 8 = D7; pin 10 = D6; pin 11 = D5; pin 12 = D4; pin 13 = D3; pin 14 = D2; pin 15 = D1; pin 18 = D0; pin 20 = RD; pin 21 = WR; pin 39 = RESET; /* OUTPUTS */ pin 23 = hiRom0; pin 25 = hiRom1; pin 27 = hiRom2; pin 28 = hiRom3; pin 30 = hiRom4; pin 31 = hiRom5; pin 33 = hiRom6; pin 34 = hiRom7; /* VARIABLES */ Rom_Bank_Select = !A15 & !A14 & A13 & !A12 & !WR; node [Rom_Bank_Reg7..0]; [Rom_Bank_Reg7..0].l = [D7..0]; [Rom_Bank_Reg7..0].le = Rom_Bank_Select; Rom_Bank_Reg7.ar = !RESET; Rom_Bank_Reg6.ar = !RESET; Rom_Bank_Reg5.ar = !RESET; Rom_Bank_Reg4.ar = !RESET; Rom_Bank_Reg3.ar = !RESET; Rom_Bank_Reg2.ar = !RESET; Rom_Bank_Reg1.ar = !RESET; Rom_Bank_Reg0.ar = !RESET; [hiRom7..0] = [Rom_Bank_Reg7..0] & A14; |
Author: | Chromatix [ Mon Jul 15, 2019 5:53 am ] |
Post subject: | Re: ATF1502ASL Memory Mapper in WinCUPL |
For a start, shouldn't it be: Code: Rom_Bank_Select = !A15 & !A14 & A13 & !A12 & !WR;
|
Author: | DarthWader [ Mon Jul 15, 2019 6:13 am ] |
Post subject: | Re: ATF1502ASL Memory Mapper in WinCUPL |
Chromatix wrote: For a start, shouldn't it be: Code: Rom_Bank_Select = !A15 & !A14 & A13 & !A12 & !WR; Normally, yes, but this system is mapped in such a way that I was able to remove A12 for this equation. I'll go ahead and add it in there for clarity, though. And just to be sure, I added it back to the code and tested again, but I'm still getting random hangs/resets. |
Author: | Chromatix [ Mon Jul 15, 2019 6:53 am ] |
Post subject: | Re: ATF1502ASL Memory Mapper in WinCUPL |
Okay, what about: Code: [hiRom7..0] = [Rom_Bank_Reg7..0] & A14 & !RD; Plus I don't see any term for controlling the tristating. I forget which term you need to make to control that, so I'll assume .oe; the above equation can then be split into two parts: Code: [hiRom7..0] = [Rom_Bank_Reg7..0];
[hiRom7..0].oe = !A15 & !A14 & A13 & A12 & !RD; |
Author: | 8BIT [ Mon Jul 15, 2019 3:23 pm ] |
Post subject: | Re: ATF1504ASL Memory Mapper in WinCUPL |
So are you saying you want the outputs tri-stated when the address bus is below 0x4000? I get the idea of of using banked memory, but the bank select lines are usually driven all the time to memory device in addition to the lower-order address lines from the microprocessor. The /CS line would be used to enable the memory device. Aside from that, in order to gate addresses above 0x4000, you need to use an OR gate with A15 and A14. Using just A14 only enables 0x4000-0x7FFF and 0xC000-0xFFFF. 0x8000-0xBFFF would not be enabled as A14 is low in that range. So, from Chromatix's example, Code: [hiRom7..0] = [Rom_Bank_Reg7..0]; [hiRom7..0].oe = A15 # A14; From your original code, the outputs would match the latch when A14 is high and the outputs would be 0x00 when A14 is low. If it is desired to have to outputs be 0x00 when the address is below 0x4000, then try this: Code: [hiRom7..0] = [Rom_Bank_Reg7..0] & (A15 # A14); Hope that helps! Daryl |
Author: | DarthWader [ Mon Jul 15, 2019 4:16 pm ] |
Post subject: | Re: ATF1504ASL Memory Mapper in WinCUPL |
I would prefer the bank select lines to never be tristated if possible. I had assumed they would always be driven in my code. About the output equation, the A15 line is also used as the CE for the ROM (active low), because this system only tries to read from ROM between 0x0000 and 0x7FFF. Sorry, I should've mentioned that originally. So, when the system tries to read between 0x0000 and 0x3FFF, I want [hiRom7..0] to output 0x00 (preferably 0x01, but 0x00 will work for now). Between 0x4000 and 0x7FFF, I want it to output whatever "bank number" was written to the Bank Register. So if register value = 0x02, then when the system tries to read 0x4000 - 0x7FFF, it's really reading from 0x8000 - 0xBFFF. This is why I only used A14 when deciding to set the bank select lines high. Thank you for the advice so far. |
Author: | 8BIT [ Mon Jul 15, 2019 7:18 pm ] |
Post subject: | Re: ATF1504ASL Memory Mapper in WinCUPL |
That is good, and your code should work as written. Except, where is your RAM? If you have any interrupts or JSR opcodes, you'll need RAM on the stack page (0x0100). Otherwise, the return addresses will not be stored and your code will crash for sure. Typical 6502 memory is RAM starting from the bottom, 0x0000, and working upward and ROM located at 0xFFFF and working down. That way the vectors in page 0xFFxx are valid at startup. That's another question, is there ROM at 0xFFFC & 0xFFFD holding a valid reset vector? Daryl |
Author: | DarthWader [ Mon Jul 15, 2019 7:39 pm ] |
Post subject: | Re: ATF1504ASL Memory Mapper in WinCUPL |
I just realized I've made a huge mistake. While I was researching WinCUPL, I kept coming to this site for code examples. All this time I thought people were just asking general questions about WinCUPL, and I didn't pay attention to the name of the website. My project isn't for a 6502...it's for a variation of z80 (unofficially the "GB z80") used in the Nintendo Gameboy. I feel pretty silly now, but you did give me something to think about. I checked and the ROM I'm testing with is expecting extra RAM to be installed, so that might explain the crashes. I will find another program that doesn't need extra RAM and test with that until I get my RAM logic added. I wish I could delete this post now since it isn't relevant to the forum, maybe a moderator can? Sorry again for the mix up, but thanks for all the help! |
Author: | Chromatix [ Mon Jul 15, 2019 7:41 pm ] |
Post subject: | Re: ATF1504ASL Memory Mapper in WinCUPL |
No, it's fine I think. Maybe it should be moved to the Programmable Logic section, but… I could mention the sister site anycpu.org? |
Author: | GARTHWILSON [ Mon Jul 15, 2019 9:42 pm ] |
Post subject: | Re: ATF1504ASL Memory Mapper in WinCUPL |
Chromatix wrote: No, it's fine I think. Maybe it should be moved to the Programmable Logic section, but… I could mention the sister site anycpu.org? I moved it to "Programmable Logic." This is specifically a 65xx forum though, and even the programmable logic section is for, as the title on the front page says, "Topics relating to PALs, CPLDs, FPGAs, and other PLDs used for the support or creation of 65-family processors, both hardware and HDL." For non-65-related topics, please do join us on the AnyCPU forum. Thanks. |
Page 1 of 1 | All times are UTC |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |