;********************************************************************** ;* Filename: ram.asm ;* Project: EPROM emulator ;* Date: 05 June 2005 ;* Version: 0.1 ;* Author: Philip Pemberton ;* ;* RAM handling. ;********************************************************************** include "config.inc" ; Device configuration ;********************************************************************** ;** HEADERS ;********************************************************************** include "pins.inc" ; Pin definitions ;********************************************************************** ;** CONSTANTS ;********************************************************************** lbank equ 0 ;register bank for the local state of this module lbankadr equ bankadr(lbank) ;address within local state register bank ;********************************************************************** ;** RAM VARIABLES ;********************************************************************** ; Global state. defram gbankadr global addr_High, addr_Low ; Make RAM address global addr_High res 1 ; High RAM address addr_Low res 1 ; Low RAM address ; Local state defram lbankadr ;********************************************************************** ;** SUBROUTINES ;********************************************************************** .ram CODE ; Code segment ;---------------------------------- ; Subroutine: addr_Inc ; Inputs: ; None ; Outputs: ; None ; Function: ; Increments the RAM address. ; glbsub addr_Inc dbankif gbankadr incfsz addr_Low, F ; Increment the low byte goto addr_inc_end ; If it overflows .. incf addr_High, F ; .. then increment the high byte too. addr_inc_end: dbankif gbankadr movf addr_High, W ; Address high -> addr port dbankif ADRL_PORT movwf ADRL_PORT bsf AHEN ; Strobe AHEN bcf AHEN dbankif gbankadr movf addr_Low, W ; Address low -> addr port dbankif ADRL_PORT movwf ADRL_PORT leave ;---------------------------------- ; Subroutine: addr_Reset ; Inputs: ; None ; Outputs: ; None ; Function: ; Resets the RAM address (sets it to 0x0000) ; glbsub addr_Reset dbankif gbankadr clrf addr_Low ; Zero the address clrf addr_High dbankif gbankadr movf addr_High, W ; Address high -> addr port dbankif ADRL_PORT movwf ADRL_PORT bsf AHEN ; Strobe AHEN bcf AHEN dbankif gbankadr movf addr_Low, W ; Address low -> addr port dbankif ADRL_PORT movwf ADRL_PORT leave ;---------------------------------- ; Subroutine: addr_Update ; Inputs: ; None ; Outputs: ; None ; Function: ; Loads the RAM address (addr_Low/addr_High) into the external buffer ; glbsub addr_Update dbankif gbankadr movf addr_High, W ; Address high -> addr port dbankif ADRL_PORT movwf ADRL_PORT bsf AHEN ; Strobe AHEN bcf AHEN dbankif gbankadr movf addr_Low, W ; Address low -> addr port dbankif ADRL_PORT movwf ADRL_PORT leave ;---------------------------------- ; Subroutine: ram_Read ; Inputs: ; None ; Outputs: ; W = Data byte ; Function: ; Reads a byte from the RAM. Assumes address is already set. Address ; will not be affected. ; glbsub ram_Read dbankif DATA_TRIS movlw 0xFF ; Data port to input mode movwf DATA_TRIS dbankif nREAD_PORT bcf nREAD ; READ pin low nop ; Let the data settle nop ; Let the data settle nop ; Let the data settle dbankif DATA_PORT movf DATA_PORT, W ; Get data byte off the bus dbankif nREAD_PORT bsf nREAD ; READ pin back high leave ;---------------------------------- ; Subroutine: ram_Write ; Inputs: ; W = Data byte ; Outputs: ; None ; Function: ; Writes a byte to the RAM. Assumes address is already set. Address ; will not be affected. ; glbsub ram_Write dbankif DATA_TRIS clrf DATA_TRIS ; Data port to output mode dbankif DATA_PORT movwf DATA_PORT dbankif nWRITE_PORT bcf nWRITE ; Strobe the WRITE pin nop ; Let the data settle nop ; Let the data settle nop ; Let it settle bsf nWRITE leave END