AUXILIARY MEMORY MANAGEMENT

8.5

An example of a routine to identify useable memory is as follows:

 

LDX BANK#

Bank number to start. $1B for //e compatibility

MARKALL

STX BNKSELCT

Select bank with the $C07X bank switch

 

STX ALTZP

Write to $C009 for aux. zero page

 

STX TEST1

Write the bank number to first location

 

 

in zero page of selected bank

 

TXA

Prepare for EOR

 

E0R #FF

Reverse the bank’s bits setting

 

STA TEST2

Write the checksum byte to second location

 

 

in zero page of selected bank

 

DEX

Decrease the bank counter

 

BPL MARKALL

Loop through to bank zero

 

LDX BANK1

Bank number to start, same as MARKALL start

READALL

STX BNXSELCT

Select bank with the $C07X bank switch

 

CPX TEST1

Compare bank number against memory

 

BNE MAPFAIL

Memory map marked showing bank n with no memory

 

TXA

Prepare for EOR

 

EOR #FF

Prepare the checksum for the double check

 

CMP TEST2

Compare the EOR’d byte for the double check

 

BNE MAPFAIL

Memory map marked showing bank n with no memory

 

BEQ MAPPASS

Memory bank exists, mark bank n into memory

READNEXT

 

MAPFAIL, MAPPASS return here

 

DEX

Decrease the bank count

 

BPL READALL

Loop through to bank 0

 

STX MAINZP

Select main memory zero page

 

RTS

 

Memory Bank Mapping

You should keep a record 0f available memory for your program’s use after you have identified the memory on the card. Either a byte map or a bit map could be used for the memory map. You may wish to construct a map that not only shows which 64K banks are useable, but like DOS and ProDOS sector bit maps, also keeps track of the availability of smaller increments of memory. The auxiliary bank memory map could then become part of a larger memory manager.

You will also need to use a byte or bytes to track the memory bank in current use. The $CO7X strobe cannot be read to see which bank was last called.

Memory Transfers

Data can be transferred from main memory to auxiliary memory and back using standard //c auxiliary memory transfer commands. The RAMRD and RANWRT soft switches and the AUXMOVE routine described in Chapter 7 all function normally. The only difference is the additional need to determine which of the MultiRam C’s 64K banks should be used for the transfer.