******************************************************************************************
******************************************************************************************
*************************** PROGRAMA PARA GRABAR EN FLASH JK3 ****************************
******************************************************************************************
******************************************************************************************
************************** ASIGNACION DE VARIABLES Y POSICIONES **************************
******************************************************************************************
B EQU $01
D EQU $03
DDRB EQU $05
DDRD EQU $07
CONFIG1 EQU $1F
FLCR EQU $FE08 ;REGISTRO DE CONTROL FLASH
FLSPR EQU $FE09 ;REGISTRO DE PROTECCION DEL BLOQUE DE FLASH
FLTCR EQU $FE0A
CLAVE0 EQU $A0
CLAVE1 EQU $A1
CLAVE2 EQU $A2
CLAVE3 EQU $A3
AUX0 EQU $A4
AUX1 EQU $A5
AUX2 EQU $A6
AUX3 EQU $A7
DATOG EQU $A8
******************************************************************************************
************************* RUTINAS ROM PARA EL MANEJO DE LA FLASH *************************
******************************************************************************************
GETBYTE EQU $FC00 ;Sub-Rutina en ROM TX/RX un Byte x port
RDVRRNG EQU $FC03 ;Sub-Rutina en ROM lectura y verif. de un rango
ERARNGE EQU $FC06 ;Sub-Rutina en ROM borrado row / mass Flash
PRGRNGE EQU $FC09 ;Sub-Rutina en ROM escritura datos en FLASH
DELNUS EQU $FC0C ;Sub-Rutina en ROM DELAY "N" microsegundos
PAGINA EQU $EC00 ;Primera dir de la primera página de Flash
RAM EQU $0080 ;Dirección de inicio de la RAM
Rutinas_Rom EQU RAM+8 ;RAM para uso del "MONITOR ROM"
******************************************************************************************
;RAM p/uso en prog/erase flash, Rutinas ROM.
;Estas variables deben estar en estas direcciones NO CAMBIAR!!!!!!!
ORG Rutinas_Rom
CTRLBYT RMB 1 ;BIT 6 -> MASS FLAG, 1 -> mass er
CPUSPD RMB 1 ;CPU speed -> 4 x Fop aprox.
LADDR RMB 2 ;Dirección de FLASH
DATA RMB 1 ;Dato a escribir en la Flash ($008C)
TEMPORAL RMB 1 ;Buffer temporal para guardar datos por ejemplo el X
******************************************************************************************
ORG PAGINA ;TABLA PARA GRABADO DE DATOS
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
FCB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
******************************************************************************************
ORG $ED00 ;ORIGEN DEL PROGRAMA
******************************************************************************************
INICIO MOV #$01,CONFIG1 ;DESACTIVO PERRO GUARDIAN
RSP ;Reset del STACK
LDA #$FF
STA FLSPR ;Se quita la protección de la FLASH toda
MOV #$00,CTRLBYT
MOV #$0A,CPUSPD ;Frecuencia para la rutina DELNUS (9.8304MHz 10Mhz ($0A)
SEI ;ELIMINO INTERRUPCIONES
CLR DATOG
NOP
JSR borrar_pagina
MOV #$15,DATOG
JSR ESCRIBO_FLASH
AIX #-1F ;POSICIONO AL X EN EL SEGUNDO LUGAR DE LA TABLA
MOV #$26,DATOG
JSR ESCRIBO_FLASH
AIX #-1E ;POSICIONO AL X EN EL SEGUNDO LUGAR DE LA TABLA
MOV #$59,DATOG
JSR ESCRIBO_FLASH
AIX #-1D ;POSICIONO AL X EN EL SEGUNDO LUGAR DE LA TABLA
MOV #$DC,DATOG
JSR ESCRIBO_FLASH
I2 BRA I2 ;LAZO INFINITO
******************************************************************************************
************************************** SUBRRUTINAS ***************************************
******************************************************************************************
Borrar_Pagina:
MOV #00,CTRLBYT ; CTRLBYT = 0 -> MASS ERASE -> P.E
MOV #10,CPUSPD ; CPUSPD=10 -> 4xFop -> 4x 2,45
LDHX #PAGINA ;H:X = A la primera dir de la Pagina ($EC00)
JSR ERARNGE ;Rutina ROM que borra un rango de la Flash
NOP ;Debo estar seguro de que X=0 cuando entre en
NOP ;la rutina de escribir en la FLASH para que el dato
NOP ;se guarde en el vector 0 al inicio del array.
CLRX
RTS ;Retorno de Subrutina
******************************************************************************************
Escribo_Flash:
STX TEMPORAL ;GUARDO EL INDICE DEL X EN EL TEMPORAL
MOV #00,CTRLBYT ;CTRLBYT = 0 -> MASS ERASE = 0
MOV #10,CPUSPD ;CPUSPD=10 -> 4xFop -> 4x 2,45
LDHX #PAGINA ;H:X = $EC00 (Primer vector de la Pagina)
LDX TEMPORAL ;RECUPERO EL INDICE DEL X EN EL TEMPORAL
STHX LADDR ;completa a la rutina ROM PRGRNGE (H=$EC y X=posicion)
LDA DATOG
STA DATA
LDA #$FF ;Debo escribir cualquier cosa
STA FLSPR ;en el registro "FLBPR" antes...
JSR PRGRNGE ;Rutina ROM, DATA contiene lo que se escribirá en la Flash
NOP
NOP
RTS ;Retorno de Subrutina
******************************************************************************************
ORG $FFFE ;VECTORES DE RESET
RESET DW INICIO
END