Hello,
I'm looking for the above manual, not the owner/user manual that is readily available online.
I want to address the I/O registers of the card and I need the I/O reference with an explanation of what does what.
Thanks
Luca
Hello,
I'm looking for the above manual, not the owner/user manual that is readily available online.
I want to address the I/O registers of the card and I need the I/O reference with an explanation of what does what.
Thanks
Luca
Please support the defense of Ukraine.
Direct or via Unclutter App
No Ads.
No Trackers.
No Social Media.
All Content Locally Hosted.
Built on Free Software.
We have complied with zero government requests for information.
~ Est. 1999 ~
A pillar of corporate stability since the second millenium.
© 1999-2999 Tom Owad
Are you talking about the card that fits in a regular slot that is often called a "Slinky" card? Provides 256k up to 1MB?
Yes , the slinky card
I have basic information about how to index memory in the "slinky card":
there are three memory address registers and one data register in the slinky card that can be accessed at the I/O slot addresses
$C080 + Slot * 16 = ADDRL
$C081 + Slot * 16 = ADDRM
$C082 + Slot * 16 = ADDRH
$C083 + Slot * 16 = DATA
To access any byte in the 1Mb card memory region , You write the address in the ADDRH|ADDRM|ADDRL registers and read or write the byte in DATA register.
I would like to read the technical manual to know if there are any quirks in using this card .
Thanks
Luca
Maybe the following link(s) will shine some light on what you are looking for:
https://archive.org/search?query=Apple+II+memory+expansion+card
https://archive.org/details/XREFAppleIIBooksAndNotesAPDA1989
There is one especially interesting quirk. It's mentioned in Apple's manuals, but it's novel enough to be worth describing here.
As you may already know, Apple designed the DATA port so that it advances to the next address each time you access it. That enables software to read contiguous data by just sequentially reading them from the DATA port, without needing to manually update the ADDR ports. Or write contiguous data by sequentially writing to the DATA port, without updating the ADDR ports.
But the method of incrementing those three ports includes a subtle quirk:
Those last two implementation details can cause subtle bugs if software modifies the contents of just one ADDR port. For instance, if ADDRL = $81 and a program tries to "go back 2 bytes" by writing ADRRL = $7F, this will cause ADDRM to increment by 1 because it detected the highest-bit of ADDRL changed from 1 to 0.
To avoid such bugs, Apple suggests programmers should always set all 3 ADDR ports when moving to a new address, and set them in the order: ADDRL, then ADDRM, then ADDRH
THANK YOU for the detailed explanation, the only two programming examples I found work like that and I was about to follow those but I was lacking the information of why :)
I imagine that the DATA register should also be accessed with CPU instructions that do not access twice the memory location to avoid an unwanted double increment of the ADDR registers.
I've already seen a similar beaviour, even if not a direct consequence of that, using DEBUG program under APPLE II OS/9 to test the card . DEBUG, always checks that a byte has been really written to memory by reading it back to warn the user of erroneous writes to ROM memory areas, so the ADDR registers are incremented twice.
THANK YOU for Your help!
Luca
Right. For the same reason, you don't want to use read-modify-write instructions like INC and DEC.
Applied Engineering has some good programming tips and workarounds in Chapter 6 of the manual for their RamFactor card, which works just like Apple's card.
AE RAMFactor v.1.5 manual on Apple2.org
RAMFactor is backward-compatible with the Apple II Memory Expansion Card, so the programming guidelines are similar...but Applied Engineering's documentation is a lot more helpful! (RAMFactor adds some features that aren't present on the Apple II Memory Expansion Card.)
Oh! I now understand why Mame emulator uses the same code for both cards , "memexp" and "ramfactor" ..
// device type definition
extern const device_type A2BUS_MEMEXP;
extern const device_type A2BUS_RAMFACTOR;
Mame..
I'll check the ramfactor docs for sure,
thanks a lot for Your help!!
Luca