Difference between revisions of "XBoard Memory Init"

From 8BitDev.org - Atari 7800 Development Wiki
Jump to: navigation, search
(Created page with "<pre> ; X-Board Description ; The X-board (iet7830) is an internal expansion board for the ATARI 7800 which ; gives the system 128 Kbyte of SRAM and one POKEY chip. ; ; The ex...")
 
(No difference)

Latest revision as of 00:44, 8 November 2015

; X-Board Description
; The X-board (iet7830) is an internal expansion board for the ATARI 7800 which
; gives the system 128 Kbyte of SRAM and one POKEY chip.
;
; The expansion SRAM is located from $4000 up to $7fff and is divided into 8 banks
; of 16Kbyte each. The SRAM is by default disabled when the system starts up and
; has to be enabled by the application. This is so that existing games and software
; will function properly. To enable the SRAM write a "1" to Bit 3 of the XCTRL
; register.
;
; The POKEY is located in the high section of the available memory area at $0400
; of the 7800. It is selected from $0460 - $046f when Bit 4 of the XCTRL register
; is set to "1" if Bit 4 = "0" the POKEY is disabled.
;
XCTRL           =       $0470  ; Note Write only
; Bit 4 = Enable POKEY chip
; Bit 3 = Enable Banked 128Kbyte SRAM
; Bit 2 = Bit 2 of SRAM bank select
; Bit 1 = Bit 1 of SRAM bank select
; Bit 0 = Bit 0 of SRAM bank select

;
; Bit patterns for enabling/disabling XBoard features.
XENABLEMEM      =       %00001000
XENABLEPOKEY    =       %00010000

XPOKEYBASE1     =       $0450
XPOKEYBASE2  =       $0460

MEMTESTCOUNT    =       10     ; Number of iterations when testing the XBoard Memory
XMEMORYSTART    =       $4000  ; This is where the memory of the XBoard starts

;************************************************************************
;*
;* Function:    SetXCtrl
;*
;* Description: This function sets the XCTRL register to the value in
;*              acc and updates the shadow
;*
;************************************************************************
SetXCtrl:      sta     XCTRL
               sta     XCTRL_SHDW
   
               rts
;************************************************************************
;*
;* Here's the code for checking and enabling the XBoard SRAM
;*
;* This test fills the entire 16K memory bank with a known pattern
;* and then compares it with the same pattern. If any byte is unequal
;* the memory test aborts and reports no memory.
;*
;* For this test to be effective the length of the test pattern must
;* not be equal to a power of 2 base. So it has been chosen to just
;* repeat all strings used into memory.
;*
;************************************************************************
; First we load the memory with a known test string......
               lda     #XENABLEMEM
               jsr     SetXCtrl        ; Enable XBOARD SRAM and set to bank zero

               lda     #<XMEMORYSTART
               sta     MemTest
               lda     #>XMEMORYSTART
               sta     MemTest+1      ; Loads the memory address

               lda     #MEMTESTCOUNT  ; Number of iterations to test in memory (<256)
               sta     Iterate

               ldy     #0
XCheck0:        
               ldx     #<MEMTESTLEN   ; Load memory test string length (<256)
XCheck1:        
               lda     Text1,X
               sta     (MemTest),Y    ; Store test character

               inc     MemTest
               bne     XCheck15
               inc     MemTest + 1    ; Increment the XBoard memory pointer
               
XCheck15:
               lda     MemTest        ; Check low target adress for zero
               bne     XCheck2        ; Skip if not zero
               
               lda     MemTest + 1    ; Check high target address
               cmp     #$80           ; If it's hex 80 we have a wrap = done
               bne     XCheck2        ; Loop again if not zero
               jmp     XCheck25       ; Break out of this loop

XCheck2:        dex
               bne     XCheck1        ; Store the entire test data set
               beq     XCheck0        ; Reload test string counter

; Second phase of the memory test
; Now we compare the stored data in memory with the reference content....
XCheck25:                
               lda     #<XMEMORYSTART
               sta     MemTest
               lda     #>XMEMORYSTART
               sta     MemTest+1      ; Loads the memory address

               lda     #MEMTESTCOUNT  ; Number of iterations to test in memory (<256)
               sta     Iterate

               ldy     #0
XCheck3:        
               ldx     #<MEMTESTLEN   ; Load memory test string length (<256)
XCheck4:        
               lda     Text1,X        ; Load the known data to compare memory contents with
               cmp     (MemTest),Y    ; And do the comparison.
               bne     XCheck6        ; Skip further checking if not equal, ie. memory error

XCheck7:        inc     MemTest        ; ... otherwise continue to compare.
               bne     XCheck5
               inc     MemTest + 1    ; Increment the XBoard memory pointer
XCheck5:        
               lda     MemTest        ; Check low target adress for zero
               bne     XCheck55       ; Skip if not zero
               
               lda     MemTest + 1    ; Check high target address
               cmp     #$80           ; If it's hex 80 we have a wrap = done
               bne     XCheck55       ; Loop again if not zero
               jmp     TA1            ; Break out of this loop
XCheck55:
               dex
               bne     XCheck4        ; Store the entire test data set
               beq     XCheck3        ; And reload the test length counter

TA1:            jsr     XMemOK         ; Go show memory indicator