A potential possibility is to replace Apple Slinky firmware with the RamFactor firmware. The ROM of the RamFactor is 8K in size, but that is not how much we'd need in the IIc. The layout of the ROM is two banks of 4K, selected by the low bit of $C08F+slot*$10. Each bank is laid out as follows, with the base at $C000 $C000-$C0FF: Copyright message and fill, not visible in-system. $C100-$C7FF: Slot firmware, $100 bytes for each slot, same code in both banks This represents the same code assembled for each slot. Only the slot the card is in is visible. $C800-$CFFF: 2K of shared firmware space firmware, different for each bank. So as we see, without any modifications we need approximately 4K+256 bytes of space to accomodate the RamFactor code. It is likely we will need to do some bank switching which tends to add code, but also make some optimizations or drop features, which will remove code. There is definitely enough space in the //c firmware for it. Especially if we can drop the original slinky code, which uses $C400-$C4FF, $C752-$C762 (bank switch, both banks), and $D800-$DB58 (eff. $DBFF). $C763-$C7FF is already used by ROM 4X. Features that might be droppable: More than 1MB memory support. Steps needed: Produce commented RF source that assembles to a binary match for the latest firmware (1.4). Port to Apple //c: - The main issue is that we don't have the ability to run RF code at $C800. - Bank switch code will need to be in the C400 space, but in the alt bank that has the //c diagnostics, which will either need to be modified or we will have to use less efficient bank switching (RTS trick). We can optimize the RTS trick in this scenario by having an entry point table all on the same page. If we waste a few bytes in the alt firmware bank we can do something like: entry: ; expect x = function code lda table_hibyte pha txa asl asl ; mult by 4 pha ; "return addr" now a multiple of 4 in jump table jmp swrts ; switch bank and go - If the RF code calls any monitor routines we may need to supply them outright or provide for a bank-switched call. - We are likely going to need a "cross-bank JSR". - Caller: Push callee address-1 on stack and JSR to xb_jsr - xb_jsr: change banks, stack has: SP->caller callee rework stack so that we have the following return entries SP->callee swrts caller sta $ ; into screen holes stx $ tsx ; SP->caller callee, x->caller callee lda $103,x ; callee high pha ; SP->callee[h] caller callee lda $102,x ; callee low pha ; SP->callee caller callee lda $101,x ; caller high sta $103,x ; SP->callee caller callee[l]+caller[h] lda $100,x ; caller low sta $102,x ; SP->callee caller caller lda #swrts_hi-1 sta $101,x lda #swrts_lo-1 sta $100,x ; SP->callee swrts caller lda $ ; from screen holes ldx $ rts ; pops callee, callee rts pops swrts, swrts pops caller ; above code is ~44 bytes