1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-11-25 06:31:25 +00:00
C02/include/xmemory.a02

153 lines
5.9 KiB
Plaintext

;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