mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-22 01:31:33 +00:00
Documented module xmemory and created template include files
This commit is contained in:
parent
7ed5a51ae2
commit
3b570f248c
119
doc/xmemory.txt
Normal file
119
doc/xmemory.txt
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
Template Functions for C02 Programs
|
||||||
|
|
||||||
|
This module provides functions to read from and write to extended
|
||||||
|
memory.
|
||||||
|
|
||||||
|
Extended memory is RAM that is not directly addressable by the 6502.
|
||||||
|
Read and write operations use a 24-bit logical address, which is
|
||||||
|
comprised of an 8-bit bank and 16-bit offset and automatically updated
|
||||||
|
after each operation.
|
||||||
|
|
||||||
|
At the beginning of the program use the directives
|
||||||
|
|
||||||
|
#include <stddef.h02>
|
||||||
|
#include <xmemory.h02>
|
||||||
|
|
||||||
|
The following functions are defined:
|
||||||
|
|
||||||
|
b,d = xgetad(); Returns the current logical extended bank b
|
||||||
|
and offset d.
|
||||||
|
|
||||||
|
Note: the physical address stored in XMBANK
|
||||||
|
and XMADDR is converted to a logical bank and
|
||||||
|
offset, which are returned.
|
||||||
|
|
||||||
|
xsetad(b,d); Sets the current logical extended bank to b
|
||||||
|
and offset to d.
|
||||||
|
|
||||||
|
This extended address is used for all read and
|
||||||
|
write functions except for the page operations.
|
||||||
|
|
||||||
|
Note: the logical address is converted to a
|
||||||
|
physical address stored in XMBANK and XMADDR.
|
||||||
|
|
||||||
|
c = xgetc(); Reads a byte from the current extended address,
|
||||||
|
increments the address, and returns the byte
|
||||||
|
as c.
|
||||||
|
|
||||||
|
xputc(c); Writes byte c to the current extended address,
|
||||||
|
then increments the address.
|
||||||
|
|
||||||
|
w = xgeti(); Reads a word starting at the current extended
|
||||||
|
address, adds 2 to the address, and returns the
|
||||||
|
word as w.
|
||||||
|
|
||||||
|
xputi(w); Writes word w at the current extended address,
|
||||||
|
then adds 2 to the address.
|
||||||
|
|
||||||
|
c,w = xgetl(); Reads a long starting at the current extended
|
||||||
|
address, adds 3 to the address, and returns the
|
||||||
|
high byte of the long in c and the low word in w.
|
||||||
|
|
||||||
|
xputl(c,w); Writes the long consisting of the byte c and
|
||||||
|
word w at the current extended address, then
|
||||||
|
adds 3 to the address.
|
||||||
|
|
||||||
|
xread(n,r); Reads n bytes starting at the current extended
|
||||||
|
address into array r, then adds n to the address.
|
||||||
|
|
||||||
|
xwrite(n,r); Writes n bytes of array r starting at the current
|
||||||
|
extended address, then adds n to the address.
|
||||||
|
|
||||||
|
xswap(n,r); Swaps n bytes of array r with n bytes starting at
|
||||||
|
the current extended address, then adds n to the
|
||||||
|
address.
|
||||||
|
|
||||||
|
xload(w); Reads word w bytes into local memory starting at
|
||||||
|
the address specified by a call to setdst() from
|
||||||
|
extended memory starting at the current extended
|
||||||
|
address, then adds w to the address.
|
||||||
|
|
||||||
|
xsave(w); Writes word w bytes from local memory starting at
|
||||||
|
the address specified by a call to setsrc() into
|
||||||
|
extended memory starting at the current extended
|
||||||
|
address, then adds w to the address.
|
||||||
|
|
||||||
|
xchng(w); Swaps word w bytes in local memory starting at
|
||||||
|
the address specified by a call to setdst() with
|
||||||
|
extended memory starting at the current extended
|
||||||
|
address, then adds w to the address.
|
||||||
|
|
||||||
|
xsetpg(b,p) Sets the current extended address to bank b and
|
||||||
|
offset p * 256. This ensures that the address is
|
||||||
|
on a page boundary for subsequent page read and
|
||||||
|
write operations.
|
||||||
|
|
||||||
|
Note: The page operation are the fastest of the
|
||||||
|
block read and write functions since the code
|
||||||
|
can use indirect addressing.
|
||||||
|
|
||||||
|
xrpage(n,p); Copies n 256 byte pages starting at the current
|
||||||
|
extended bank and page to local memory starting
|
||||||
|
at address p * 256, then updates the extended
|
||||||
|
address accordingly.
|
||||||
|
|
||||||
|
xwpage(n,p); Copies n 256 bytes from local memory starting
|
||||||
|
at address p * 256 to extended memory starting at
|
||||||
|
current bank and page, then updates the extended
|
||||||
|
address accordingly.
|
||||||
|
|
||||||
|
xspage(n,p); Swaps n 256 bytes from local memory starting at
|
||||||
|
address p * 256 with extended memory starting at
|
||||||
|
current bank and page, then updates the extended
|
||||||
|
address accordingly.
|
||||||
|
|
||||||
|
Note: This library expects the following functions to be defined:
|
||||||
|
|
||||||
|
ext(); External function description
|
||||||
|
|
||||||
|
along with the zero page variables
|
||||||
|
|
||||||
|
zpage0,zpage1: Zero page variable pair
|
||||||
|
|
||||||
|
the external variables
|
||||||
|
|
||||||
|
exvar0,exvar1: External variable pair
|
||||||
|
|
||||||
|
and the constants
|
||||||
|
|
||||||
|
#CNSTNAME Constant description
|
153
include/xmemory.a02
Normal file
153
include/xmemory.a02
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
;Extended Memory Assembly Language Routines Non-Functional Template
|
||||||
|
;Requires locations XMBANK and XMADDR (header.a02)
|
||||||
|
|
||||||
|
SUBROUTINE XMEMORY
|
||||||
|
|
||||||
|
;Extended Memory Constants\
|
||||||
|
XLBANK EQU $00 ;Maximum Logical Bank - 0 = Not Implemented
|
||||||
|
|
||||||
|
;Extended Memory Physical Address Registers - Defined in header.a02
|
||||||
|
;XMBANK Bank These contain the physical bank and address of extended memory,
|
||||||
|
;XMADDR Address which are usually different than the logical bank and address.
|
||||||
|
|
||||||
|
;Bank Selected Memory
|
||||||
|
;This interface is used by nearly every 6502 based 8-bit computer
|
||||||
|
;The extended memory is exposed as a 1K, 8K, or 16K section of the
|
||||||
|
;6502's address space. An I/O register is used to to map equally
|
||||||
|
;sized banks of the extended memory into this section of RAM.
|
||||||
|
;XMBANK is the bank number and XMADDR is the offset in the bank.
|
||||||
|
;Bank Physical Address Max Ext
|
||||||
|
;Size XMBANK XMADDR Logical Address RAM
|
||||||
|
; 1K BBBBBBBB 000000AA AAAAAAAA 000000BB BBBBBBAA AAAAAAAA 256K
|
||||||
|
; 8K BBBBBBBB 00000AAA AAAAAAAA 00000BBB BBBBBAAA AAAAAAAA 512K
|
||||||
|
; 16K BBBBBBBB 0000AAAA AAAAAAAA 0000BBBB BBBBAAAA AAAAAAAA 1024K
|
||||||
|
;Ultimem for the VIC-20 uses a two-byte bank number and 8K banks
|
||||||
|
;giving a 27-bit wide address, but this module is limited to 24 bits.
|
||||||
|
; Physical Address Max Ext
|
||||||
|
; XMBANK XMADDR Logical Address RAM
|
||||||
|
;000BBBBB BBBBBBBB 00000AAA AAAAAAAA BBBBBBBB BBBBBAAA AAAAAAAA 16MB
|
||||||
|
|
||||||
|
;Page Selected Memory
|
||||||
|
;The interface is used by GeoRAM for the Commodore 64 and 128
|
||||||
|
;The extended memory is exposed as a single page (256 bytes) of the
|
||||||
|
;6502's address space. I/O registers are used to select a bank of
|
||||||
|
;up to 64K of extended memory and to map a page of that bank to
|
||||||
|
;the page of RAM. GeoRAM uses 16K banks.
|
||||||
|
;XMBANK is the bank number, the high byte of XMADDR is the page of
|
||||||
|
;the bank, and the low byte of XMADDR is the offset in the page.
|
||||||
|
;Bank XMBANK XMADDR Max Ext
|
||||||
|
;Size Bank Page Offset Logical Address RAM
|
||||||
|
; 16K BBBBBBBB 0000PPPP AAAAAAAA 0000BBBB BBBBPPPP AAAAAAAA 1MB
|
||||||
|
; 64K BBBBBBBB PPPPPPPP AAAAAAAA BBBBBBBB PPPPPPPP AAAAAAAA 16MB
|
||||||
|
|
||||||
|
;DMA Controller`
|
||||||
|
;This interface is used by the Commodore REUs and the run6502 emulator.
|
||||||
|
;The expansion device suspends operation of the 6502 and directly
|
||||||
|
;reads and writes to the system RAM. I/O registers are used to select
|
||||||
|
;an operation (read, write, or swap), a 24-bit extended memory address,
|
||||||
|
;a 16-bit system RAM address, and 16-bit byte count.
|
||||||
|
;XMBANK and XMADDR contain the 24-bit extended memory address which is
|
||||||
|
;identical to the logical address, for up to 16MB of extended memory.
|
||||||
|
|
||||||
|
;xgetad() - Get Logical Extended Memory Address
|
||||||
|
; For run6502, this is the same as the Physical Address
|
||||||
|
;Returns: A = Logical Bank ($00-$0F)
|
||||||
|
; YX = Logical Address ($0000-$FFFF)
|
||||||
|
XGETAD: LDA #$FF ;Return $FF,$FFFFF which would
|
||||||
|
TAY ;indicate 16MB of extended memory,
|
||||||
|
TAX ;which is rare on 8-bit machines
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;xsetad() - Set Logical Extended Memory Address
|
||||||
|
; For run6502, this is the same as the Physical Address
|
||||||
|
;Args: A = Logical Bank ($00-$0F)
|
||||||
|
; YX = Logical Address ($0000-$FFFF)
|
||||||
|
;Returns: A=$00 - Success or $FF - Failure
|
||||||
|
XSETAD: LDA #$FF ;Return Failure
|
||||||
|
|
||||||
|
;xputc() - Write Byte to Extended Memory
|
||||||
|
;Args: A = Byte
|
||||||
|
;Affects: A,X
|
||||||
|
XPUTC: RTS
|
||||||
|
|
||||||
|
;xgetc() - Read Byte from Extended Memory
|
||||||
|
;Returns: A = Byte
|
||||||
|
XGETC: LDA #0 ;Return 0
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;xputi() - Write Word to Extended Memory
|
||||||
|
;Args: YX = Word
|
||||||
|
XPUTI: RTS
|
||||||
|
|
||||||
|
;xgeti() - Read Word from Extended Memory
|
||||||
|
;Returns: YX = Word
|
||||||
|
XGETI: LDY #0 ;Return Zero
|
||||||
|
LDX #0
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;xgetl() - Read Long from Extended Memory
|
||||||
|
;Args: AYX = Long
|
||||||
|
XGETL: LDA #0 ;Return Zero
|
||||||
|
|
||||||
|
;xputl() - Write Long to Extended Memory
|
||||||
|
;Args: AYX = Long
|
||||||
|
XPUTL: RTS
|
||||||
|
|
||||||
|
;xread(n,dest) - Read Bytes from Extended Memory
|
||||||
|
;Args: A = Number of Bytes to Read (0=256)
|
||||||
|
; YX = Destination Address
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XREAD: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xwrite(n,source) - Write Bytes to Extended Memory
|
||||||
|
;Args: A = Number of Bytes to Write (0=256)
|
||||||
|
; YX = Source Address
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XWRITE: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xswap(n,dest) - Swap Bytes with Extended Memory
|
||||||
|
;Args: A = Number of Bytes to Exchange
|
||||||
|
; YX = System Memory Address
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XSWAP: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xload(addr) - Load from Extended Memory
|
||||||
|
;Args: YX = Local Memory End Address
|
||||||
|
;Uses: GETDST - Local Memory Start Address
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XLOAD: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xsave(size) - Save from Extended Memory
|
||||||
|
;Args: YX = Local Memory End Address
|
||||||
|
;Requires: SRCPTR = Local Memory Start Address
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XSAVE: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xchng(size) - Exchange with Extended Memory
|
||||||
|
;Args: YX = Local Memory End Address
|
||||||
|
;Requires: DSTPTR = Local Memory Start Address
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XCHNG: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xrpage(count, page) - Read Extended Memory Pages
|
||||||
|
;Args: A = Number of Pages
|
||||||
|
; Y = Local Memory Starting Page
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XRPAGE: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xwpage(count, page) - Write Extended Memory Pages
|
||||||
|
;Args: A = Number of Pages
|
||||||
|
; Y = Local Memory Starting Page
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XWPAGE: ;Return $FF,$FFF
|
||||||
|
|
||||||
|
;xspage(count, page) - Swap Extended Memory Pages
|
||||||
|
;Args: A = Number of Pages
|
||||||
|
; Y = Local Memory Starting Page
|
||||||
|
;Returns: AYX = New Extended Memory Address
|
||||||
|
XSPAGE: LDA #$FF ;Return $FF,$FFF
|
||||||
|
TAY
|
||||||
|
TAX
|
||||||
|
RTS
|
||||||
|
|
||||||
|
ENDSUBROUTINE
|
105
include/xmemory.h02
Normal file
105
include/xmemory.h02
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/****************************************
|
||||||
|
* xmemory.h02 - Extended Memory Access *
|
||||||
|
* Non-Functional Template Module *
|
||||||
|
****************************************/
|
||||||
|
|
||||||
|
#define XLBANK $0F //Maximum Logical Bank
|
||||||
|
|
||||||
|
/* Exhange with with Extended Memory *
|
||||||
|
* Setup: xsetad(xbank, xaddr) *
|
||||||
|
* setdst(maddr) *
|
||||||
|
* Args: int n - number of bytes *
|
||||||
|
* Returns: char bank - Extended Bank *
|
||||||
|
* int addr - Extended Address */
|
||||||
|
void xshng();
|
||||||
|
|
||||||
|
/* Get Logical Extended Memory Address *
|
||||||
|
* Returns: char xbank - Logical Bank *
|
||||||
|
* int xaddr - Logical Address *
|
||||||
|
char xgetad();
|
||||||
|
|
||||||
|
/* Read Byte from Extended Memory *
|
||||||
|
* Returns: char b: Byte Read */
|
||||||
|
char xgetc();
|
||||||
|
|
||||||
|
/* Read Word from Extended Memory *
|
||||||
|
* Returns: int i: Word Read */
|
||||||
|
int xgeti();
|
||||||
|
|
||||||
|
/* Read Long from Extended Memory *
|
||||||
|
* Returns: long l: Long Read */
|
||||||
|
char xgetl();
|
||||||
|
|
||||||
|
/* Load from Extended Memory *
|
||||||
|
* Setup: xsetad(xbank, xaddr) *
|
||||||
|
* setdst(maddr) *
|
||||||
|
* Args: int n - number of bytes *
|
||||||
|
* Returns: char bank - Extended Bank *
|
||||||
|
* int addr - Extended Address */
|
||||||
|
void xload();
|
||||||
|
|
||||||
|
/* Write Byte to Extended Memory *
|
||||||
|
* Args: char b: Byte to Write */
|
||||||
|
void xputc();
|
||||||
|
|
||||||
|
/* Write Word to Extended Memory *
|
||||||
|
* Args: int i: Word to Write */
|
||||||
|
void xputi();
|
||||||
|
|
||||||
|
/* Write Long to Extended Memory *
|
||||||
|
* Args: long l: Long to Write */
|
||||||
|
void xputl();
|
||||||
|
|
||||||
|
/* Read Bytes from Extended Memory *
|
||||||
|
* Args: char n - Number of Bytes *
|
||||||
|
* int maddr - Destination Address *
|
||||||
|
* Returns: char bank - Extended Bank *
|
||||||
|
* int addr - Extended Address */
|
||||||
|
void xread();
|
||||||
|
|
||||||
|
/* Read Extended Memory Pages *
|
||||||
|
* Args: char n - Number of Pages *
|
||||||
|
char p - Local Start Page */
|
||||||
|
void xrpage();
|
||||||
|
|
||||||
|
/* Save to Extended Memory *
|
||||||
|
* Setup: setsrc(maddr) *
|
||||||
|
* Args: int n - number of bytes *
|
||||||
|
* Returns: char bank - Extended Bank *
|
||||||
|
* int addr - Extended Address */
|
||||||
|
void xsave();
|
||||||
|
|
||||||
|
/* Set Extended Memory Address *
|
||||||
|
* Args: char xbank - Extended Bank *
|
||||||
|
* int xaddr - Extended Address */
|
||||||
|
void xsetad();
|
||||||
|
|
||||||
|
/* Set Extended Memory Page *
|
||||||
|
* Args: char xbank - Extended Bank *
|
||||||
|
* int xpage - Extended Page */
|
||||||
|
void xsetpg();
|
||||||
|
|
||||||
|
/* Swap Extended Memory Pages *
|
||||||
|
* Args: char n - Number of Pages *
|
||||||
|
char p - Local Start Page */
|
||||||
|
void xspage();
|
||||||
|
|
||||||
|
/* Swap Bytes with Extended Memory *
|
||||||
|
* Args: char n - Number of Bytes *
|
||||||
|
* int maddr - Destination Address *
|
||||||
|
* Returns: char bank - Extended Bank *
|
||||||
|
* int addr - Extended Address */
|
||||||
|
void xswap();
|
||||||
|
|
||||||
|
/* Write Extended Memory Page *
|
||||||
|
* Args: char xbank - Extended Bank *
|
||||||
|
* char xpage - Extended Page *
|
||||||
|
* char mpage - Memory Page */
|
||||||
|
void xwpage();
|
||||||
|
|
||||||
|
/* Write Bytes to Extended Memory *
|
||||||
|
* Args: char n - Number of Bytes *
|
||||||
|
* int maddr - Source Address *
|
||||||
|
* Returns: char bank - Extended Bank *
|
||||||
|
* int addr - Extended Address */
|
||||||
|
void xwrite();
|
Loading…
Reference in New Issue
Block a user