287 lines
6.2 KiB
NASM
287 lines
6.2 KiB
NASM
; ***************************************************************************
|
|
; copyright : (C) 2026 by Martin Preuss
|
|
; email : martin@libchipcard.de
|
|
;
|
|
; ***************************************************************************
|
|
; * This file is part of the project "AqHome". *
|
|
; * Please see toplevel file COPYING of that project for license details. *
|
|
; ***************************************************************************
|
|
|
|
#ifndef AQH_AVR_MODULES_RAM_23LC512_MAIN_ASM
|
|
#define AQH_AVR_MODULES_RAM_23LC512_MAIN_ASM
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; defs
|
|
|
|
.equ RAM_23LC512_LASTADDR = 65535
|
|
.equ RAM_23LC512_PATTERNSIZE = 0
|
|
|
|
.equ RAM_23LC512_CMD_READ = 0x03
|
|
.equ RAM_23LC512_CMD_WRITE = 0x02
|
|
.equ RAM_23LC512_CMD_RDMR = 0x05
|
|
.equ RAM_23LC512_CMD_WRMR = 0x01
|
|
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; data
|
|
|
|
.dseg
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; code
|
|
|
|
.cseg
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_Init @global
|
|
;
|
|
; @param X destination address
|
|
|
|
RAM_23LC512_Init:
|
|
sbi RAMCS_DDR, RAMCS_PIN ; RAMCS: output
|
|
sbi RAMCS_OUTPUT, RAMCS_PIN ; RAMCS high
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_StartWriting @global
|
|
;
|
|
; @param X destination address
|
|
; @clobbers r16-r19, r23
|
|
|
|
RAM_23LC512_StartWriting:
|
|
ldi r16, RAM_23LC512_CMD_WRITE
|
|
rjmp ram23LC512StartTransfer ; (r16-r19, r23)
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_StartReading @global
|
|
;
|
|
; @param X source address
|
|
; @clobbers r16-r19, r23
|
|
|
|
RAM_23LC512_StartReading:
|
|
ldi r16, RAM_23LC512_CMD_READ
|
|
rjmp ram23LC512StartTransfer ; (r16-r19, r23)
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_EndTransfer @global
|
|
;
|
|
|
|
RAM_23LC512_EndTransfer:
|
|
sbi RAMCS_OUTPUT, RAMCS_PIN ; CS high
|
|
bigcall SPISW_MasterStop
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_ReadBytes @global
|
|
;
|
|
; @param X source address
|
|
; @param Y destination address
|
|
; @param R25:r24 number of bytes to read
|
|
; @clobbers r16-r19, r23-r25
|
|
|
|
RAM_23LC512_ReadBytes:
|
|
rcall RAM_23LC512_StartReading ; (r16-r19, r23)
|
|
|
|
RAM_23LC512_ReadBytes_loop:
|
|
ldi r16, 0xff
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
st Y+, r16
|
|
sbiw r25:r24, 1
|
|
brne RAM_23LC512_ReadBytes_loop
|
|
rcall RAM_23LC512_EndTransfer
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_WriteBytes @global
|
|
;
|
|
; @param X destination address
|
|
; @param Y source address
|
|
; @param R25:r24 number of bytes to write
|
|
; @clobbers r16-r19, r23-r25
|
|
|
|
RAM_23LC512_WriteBytes:
|
|
rcall RAM_23LC512_StartWriting ; (r16-r19, r23)
|
|
|
|
RAM_23LC512_WriteBytes_loop:
|
|
ld r16, Y+
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
sbiw r25:r24, 1
|
|
brne RAM_23LC512_WriteBytes_loop
|
|
rcall RAM_23LC512_EndTransfer
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_Fill @global
|
|
;
|
|
; @param X destination address
|
|
; @param R16 byte to write
|
|
; @param R25:r24 number of bytes to write
|
|
; @clobbers r16-r19, r22-r25
|
|
|
|
RAM_23LC512_Fill:
|
|
mov r22, r16
|
|
rcall RAM_23LC512_StartWriting ; (r16-r19, r23)
|
|
|
|
RAM_23LC512_Fill_loop:
|
|
mov r16, r22
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
sbiw r25:r24, 1
|
|
brne RAM_23LC512_Fill_loop
|
|
rcall RAM_23LC512_EndTransfer
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_WritePattern @global
|
|
;
|
|
; @clobbers r16-r19, r23-r25
|
|
|
|
RAM_23LC512_WritePattern:
|
|
clr xl
|
|
clr xh
|
|
rcall RAM_23LC512_StartWriting ; (r16-r19, r23)
|
|
ldi r24, LOW(RAM_23LC512_PATTERNSIZE)
|
|
ldi r25, HIGH(RAM_23LC512_PATTERNSIZE)
|
|
clr xl
|
|
clr xh
|
|
RAM_23LC512_WritePattern_loop:
|
|
mov r16, xh
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
adiw xh:xl, 1
|
|
sbiw r25:r24, 1
|
|
brne RAM_23LC512_WritePattern_loop
|
|
rcall RAM_23LC512_EndTransfer
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_ReadPattern @global
|
|
;
|
|
; @clobbers r16-r19, r23-r25
|
|
|
|
RAM_23LC512_ReadPattern:
|
|
clr xl
|
|
clr xh
|
|
rcall RAM_23LC512_StartReading ; (r16-r19, r23)
|
|
ldi r24, LOW(RAM_23LC512_PATTERNSIZE)
|
|
ldi r25, HIGH(RAM_23LC512_PATTERNSIZE)
|
|
clr xl
|
|
clr xh
|
|
RAM_23LC512_ReadPattern_loop:
|
|
ldi r16, 0xff
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
cp r16, xh
|
|
clc
|
|
brne RAM_23LC512_ReadPattern_ret
|
|
adiw xh:xl, 1
|
|
sbiw r25:r24, 1
|
|
brne RAM_23LC512_ReadPattern_loop
|
|
rcall RAM_23LC512_EndTransfer
|
|
sec
|
|
RAM_23LC512_ReadPattern_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine RAM_23LC512_ReadModeRegister
|
|
;
|
|
; @return r16 mode register
|
|
; @clobbers r17-r19, r23
|
|
|
|
RAM_23LC512_ReadModeRegister:
|
|
ldi r16, RAM_23LC512_CMD_RDMR
|
|
rcall ram23LC512StartCommand
|
|
clr r16
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
push r16
|
|
rcall RAM_23LC512_EndTransfer
|
|
pop r16
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ram23LC512StartTransfer
|
|
;
|
|
; @param r16 command
|
|
; @param X address
|
|
; @clobbers r16-r19, r23
|
|
|
|
ram23LC512StartTransfer:
|
|
rcall ram23LC512StartCommand
|
|
|
|
; send address
|
|
mov r16, xh
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
mov r16, xl
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ram23LC512StartCommand
|
|
;
|
|
; @param r16 command
|
|
; @clobbers r16-r19, r23
|
|
|
|
ram23LC512StartCommand:
|
|
push r16
|
|
bigcall SPISW_MasterStart
|
|
pop r16
|
|
nop
|
|
sbi RAMCS_DDR, RAMCS_PIN ; CS: output
|
|
cbi RAMCS_OUTPUT, RAMCS_PIN ; CS low
|
|
nop
|
|
|
|
; send command
|
|
bigcall SPISW_MasterExchangeByteMode0 ; (r17, r18, r19, r23)
|
|
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|