$EJECT
;********************************************************************
;PODPROGRAMY PRO OBSLUHU SERIOVE EEPROM A WD  X25043/X25045 PROCESOREM 8051
;
; JEDNA SE O MODIFIKOVANE PODPROGRAMY OD XICORu, PRO VLATNI POTREBU.
; CASOVANI JE PRO MAX 12MHz PROCESORU 8051 
; A PRISTUPOVOU DOBU EEPROM 1 MIKRO SEKUNDA
; OBSAHUJE NASLEDUJICI PODPROGRAMY:
;BYTE_READ  -	CTE JEDEN BAJT Z EEPROM
;WREN_CMD   -	POVOLI ZAPIS DO EEPROM, JE TREBA POUZIT PRED JAKIMKOLIV ZAPISEM
;BYTE_WRITE -	ZAPISE JEDEN BAJT DO EEPROM
;VETA_READ  -	NACITA POSLOUPNOST BAJTU Z EEPROM DO RAM
;VETA_WRITE -	ZAPISUJE POSLOUPNOST BAJTU Z RAM DO EEPROM
;RDSR_CMD   -	CTE STATUS REGISTR
;WRSR_CMD   -	ZAPISUJE DO STATUS REGISTRU
;
;POUZIVAJI
; ACC, R7, R6, R5, R0, B, DPTR
;ADRESA SE PREDAVA V  DPTR
;DATA SE PREDAVAJI V ACC
;
;JE TREBA DEFINOVAT 
;CS	BIT			;CIPSELEKT AKTIVNI V  LOW
;SI	BIT			;SERIOVY VSTUP DAT DO EEPROM
;SCK	BIT			;CLOCK
;SO	BIT			;SERIOVY VYSTUP DAT Z EEPROM
;




;------------------------------------------------
;DEFINPOVANI KONSTANT PRO PODPROGRAM
;
WREN_INST	EQU	06H
WRDI_INST	EQU	04H
WRSR_INST	EQU	01H
RDSR_INST	EQU	05H
WRITE_INST	EQU	02H
READ_INST	EQU	03H
STATUS_REG	EQU	00H
MAX_POLL	EQU	99H 
;


;------------------------------------------------
;POVOLENI ZAPISU DO PAMETI
;
WREN_CMD:
	MOV	A,#WREN_INST
WREN1:	CLR	SCK		;HODINY LOW
	CLR	CS		;VYBER EEPROM AKIVUJ CS
	CALL	OUTBYT
	CLR	SCK
	SETB	CS
	RET
;------------------------------------------------
;ZAKAZ ZAPISU DO PAMETI
WRDI_CMD:
	MOV	A,#WRDI_INST
	JMP	WREN1
;------------------------------------------------
;ZAPIS DO STATUT REGISTRU
;VSTUP: ACC
; 	STATUS REGISTR
; X X WD1 WDO BL1 BL0 WEL WIP	NAZEV
; 7 6  5   4   3   2   1   0	BIT
;				BEZI ZAPISOVACI PROCES 0=ZAPISOVANI UKONCENO
;				STATUS ZABRANENEHO ZAPISU 0=ZAPIS ZAKAZAN
;				OCHRANA PROTI ZAPISU 	00 BEZ OCHRANY
;							01 180-1FFH
;							10 100-1FFH
;							11 000-1FFH
;				CAS WATCHDOGu	00 1.4sec
;						01 0.6
;						10 0.2
;						11 NEFUNKCNI
;
WRSR_CMD:
	PUSH	ACC		;USCHOVEJ NASTAVOVACI SLOVO PRO STATUS REGISTR
	CLR	SCK
	CLR	CS
	MOV	A,#WRSR_INST
	CALL	OUTBYT		
	POP	ACC
	CALL	OUTBYT		;NASTAV STATUS REGISTR
	CLR	SCK
	SETB	CS
	CALL	WIP_POLL
	RET
;------------------------------------------------
;CTENI STATUS REGISTRU
;VYSTUP: ACC
;
RDSR_CMD:
	CLR	SCK
	CLR	CS
	MOV	A,#RDSR_INST
	CALL	OUTBYT
	CALL	INBYT
	CLR	SCK
	SETB	CS
	RET
;------------------------------------------------
;ZAPIS JEDNOHO BAJTU DO PAMETI EEPROM
;VSTUPY: ACC=DATA
;	 DPTR=ADRESA
;
BYTE_WRITE:
	PUSH	ACC		;USCHOVEJ DATA
	CLR	SCK
	CLR	CS
	MOV	A,#WRITE_INST
	MOV	B,DPH
	MOV	C,B.0
	MOV	ACC.3,C
	CALL	OUTBYT		;VYSLI INSTRUKCI A HORNI BAJT ADRESY
	MOV	A,DPL
	CALL	OUTBYT		;VYSLI DOLNI BAJT ADRESY
	POP	ACC		;OBNOV DATA
	CALL	OUTBYT		;ZAPIS DATA DO EEPROM
	CLR	SCK
	SETB	CS
	LCALL	WIP_POLL
	RET
;------------------------------------------------
;CTENI DAT Z EEPROM
;VSTUP:	PDTR=ADRESA
;VYSTUP:  ACC=DATA
;
BYTE_READ:
	CLR	SCK
	CLR	CS
	MOV	A,#READ_INST
	MOV	B,DPH
	MOV	C,B.0
	MOV	ACC.3,C
	CALL	OUTBYT
	MOV	A,DPL
	CALL	OUTBYT
	CALL	INBYT
	CLR	SCK
	SETB	CS
	RET
;------------------------------------------------
;CEKANI NA KONEC ZAPISOVE OPERACE   WIP SPADNE DO LOW
;
WIP_POLL:
	MOV	R6,#MAX_POLL
WIP_POLL1:
	lcall	rdsr_cmd
	jnb	acc.0,wip_poll2		;VYSKOC JELI WIP JIZ V NULE
	djnz	r6,wip_poll1		
WIP_POLL2:
	RET
;------------------------------------------------
;VYSLANI BYTU DO EEPROM
;
OUTBYT:
	SETB	SO		;UVONI, AT NESTAHUJE DO LOW JSOULI SI A SO SPOJENY
	SETB	SI
	MOV	R7,#08
OUTBYT1:
	CLR	SCK		
	RLC	A
	MOV	SI,C
	SETB	SCK
	DJNZ	R7,OUTBYT1
	SETB	SI		;UVOLNI,AT NESTAHUJE PRI CTENI
	RET
;------------------------------------------------
;PRCTENI BYTU ZEEPROM
INBYT:
	SETB	SI		;UVOLNI AT NESTAHUJI
	SETB	SO
	MOV	R7,#08
INBYT1:
	SETB	SCK
	CLR	SCK
	MOV	C,SO
	RLC	A
	DJNZ	R7,INBYT1
	RET
;------------------------------------------------
;ZAPIS A CTENI VICE BAJTU Z EEPROM
;VSTUPY: DPTR=POCATECNI ADRESA V EEPROM
;	 R5=POCET NACITANYCH, ZAPISOVANYCH BAJTU
;	 R0=ADRESA V RAM ODKUD NEBO KAM SE BAJT PRENASEJI
;
VETA_WRITE:
	CALL	WREN_CMD
	MOV	A,@R0
	CALL	BYTE_WRITE
	INC	DPTR
	INC	R0
	DJNZ	R5,VETA_WRITE
	RET
;
VETA_WR_D:
	CALL	WREN_CMD
	MOV	A,@R0
	CALL	BYTE_WRITE
	INC	DPTR
	DEC	R0
	DJNZ	R5,VETA_WR_D
	RET
;
VETA_READ:
	CALL	BYTE_READ
	MOV	@R0,A
	INC	DPTR
	INC	R0
	DJNZ	R5,VETA_READ
	RET