IAP_ADDRL DATA 0C4H
IAP_CMD DATA 0C5H
IAP_TRIG DATA 0C6H
IAP_CONTR DATA 0C7H
IAP_TPS DATA 0F5H
P0M1 DATA 093H
P0M0 DATA 094H
P1M1 DATA 091H
P1M0 DATA 092H
P2M1 DATA 095H
P2M0 DATA 096H
P3M1 DATA 0B1H
P3M0 DATA 0B2H
P4M1 DATA 0B3H
P4M0 DATA 0B4H
P5M1 DATA 0C9H
P5M0 DATA 0CAH
ORG 0000H
LJMP MAIN
ORG 0100H
IAP_IDLE:
MOV IAP_CONTR,#0 ;Disable IAP function
MOV IAP_CMD,#0 ;Clear command register
MOV IAP_TRIG,#0 ;Clear trigger register
MOV IAP_ADDRH,#80H ;Set the address to a non-IAP area
MOV IAP_ADDRL,#0
RET
IAP_READ:
MOV IAP_CONTR,#80H ;Enable IAP
MOV IAP_TPS,#12 ;Set the erasing wait parameter of 12MHz
MOV IAP_CMD,#1 ;Set IAP read command
MOV IAP_ADDRL,DPL ;Set IAP low address
MOV IAP_ADDRH,DPH ;Set IAP high address
MOV IAP_TRIG,#5AH ;Write trigger command (0x5a)
MOV IAP_TRIG,#0A5H ;Write trigger command (0xa5)
NOP
MOV A,IAP_DATA ;Read IAP data
LCALL IAP_IDLE ;Disable IAP function
RET
IAP_PROGRAM:
MOV IAP_CONTR,#80H ;Enable IAP
MOV IAP_TPS,#12 ;Set the erasing wait parameter of 12MHz
MOV IAP_CMD,#2 ;Set IAP writing command
MOV IAP_ADDRL,DPL ;Set IAP low address
MOV IAP_ADDRH,DPH ;Set IAP high address
MOV IAP_DATA,A ;Write IAP data
MOV IAP_TRIG,#5AH ;Write trigger command (0x5a)
MOV IAP_TRIG,#0A5H ;Write trigger command (0xa5)
NOP
LCALL IAP_IDLE ;Disable IAP function
RET