EJEMPLO ASSEMBLY

GRAVADOR 8051 DE MEMORIAS FLASH PARA 89C51 FLASH


PCB

ELECTRICO


                                                                 
                                                                        ASSEMBLY
                                                                                                               
                         .include .\reg51.def
                         .var_org  $20  iram  

status            .ds.b 1
statusser       .ds.b 1
statusb         .ds.b 1
statush         .ds.b 1
vacio           .ds.b 1
modelo        .ds.b 1
rmod            .ds.b 1
bloser          .ds.b 1
indice          .ds.b 1
bufer           .ds.b 1
addsl           .ds.b 1
addsh          .ds.b 1
octetos        .ds.b 1
lectura         .ds.b 1
datam          .ds.b 1
ind_h           .ds.b 1    ;indice del conversor
crchx           .ds.b 1
bufhex         .ds.b 1
NULO        .DS.B 1
lengt            .ds.b 2    ;largo del paquete de tx
lengtg          .ds.b 2    ;ciclos de grabado
mdptrp        .ds.b 2    ;datapointer de tx
mdptr          .ds.b 2    ;datapointer de grabado
mdpth         .ds.b 2    ;datapointer del conversor
pila:
                        .text_org $0000

RESET:  ljmp arranca
INT0:   ljmp teclado
        .ds.b 5
TIMER0  ljmp arranca
        .ds.b 5
INT1:   ljmp ARRANCA
        .ds.b 5
TIMER1: ljmp arranca
        .ds.b 5
SERIE0: ljmp lee
        .ds.b 5
TIMER2: ljmp arranca  
        .ds.b 13
SERIE1: ljmp arranca
        .ds.b 5
INT2:   ljmp arranca
        .ds.b 5
INT3:   ljmp arranca
        .ds.b 5
INT4:   ljmp arranca
        .ds.b 5
INT5:   ljmp arranca
        .ds.b 5
WDT1:   ljmp arranca;


arranca:  mov    sp,#pila
          jnb p3.2,p2400
          mov    tmod,#%00000001    
          mov    t2con,#%00110100   ;generador de baudios  ;ok
          mov    th2,#$ff
          mov    tl2,#$dd
          mov    rcap2h,#$ff
          mov    rcap2l,#$dd        ;dd  9600 baudios          
          mov    SCON,#%01010000    ;Configura el puerto serie:
          sjmp confr      

p2400:    jnb  p3.2,!
          mov    tmod,#%00000001    
          mov    t2con,#%00110100   ;generador de baudios  ;ok
          mov    th2,#$ff
          mov    tl2,#$b8
          mov    rcap2h,#$ff
          mov    rcap2l,#$b8        ;b8  4800 baudios          
          mov    SCON,#%01010000    ;Configura el puerto serie:
          lcall  espera2
          lcall  espera2

confr:    clr    psw.1
          mov    rmod,#$00
          mov    nulo,#$40
          mov    status,#$00
          mov    statusser,#$00
          mov    statusb,#$00
          mov    statush,#$00
          mov    vacio,#$00
          mov    auxr,#%00000001      
          mov    r3,#$00
          mov    bloser,#$00
          mov    ip,#%00010001
          mov    dptr,#$0000   ;uno adelantado (+1) para compenzar
          mov    mdptrp+0,dpl  ;aumento adelantado de dptr en la lectura
          mov    mdptrp+1,dph
          mov    lengt+0,#$00
          mov    lengt+1,#$04  ;1kbyte
          setb   ie.7
          setb   ie.4
          setb   ie.1
          setb   ie.0                    ;int ext 0
          setb   status.5              ;por defecto 5vpp

          mov    modelo,#$01    ;registro de modelos
          mov    indice,#$00
          mov    a,#$8
          mov    r0,#octetos
          mov    @r0,a
          mov    addsl,#$ff       ;inicio de grabado menos uno (-1)
          mov    addsh,#$7f       ;
          mov    datam,#%00000000
          mov    lengtg+0,#$ff  
          mov    lengtg+1,#$1f
          mov    dptr,#$0000
          mov    mdptr+0,dpl
          mov    mdptr+1,dph
REP_MENU  lcall  envia_menu
          MOV P1,#%00100000
          nop
          nop
          sjmp !

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

envia_menu:
       mov dptr,#menu
       lcall envia_texto
       reti
menu:
  .dc.b   ,10,10,10,10,10,10,10,10,10,13
  .dc.b   "                         iA",10,10,13
  .dc.b   "       AT89C2051-AT89C4051-AT89C51-AT89C52",10,13
  .dc.b   "       AT89S51-AT89S52- AT89C8252-AT89LV52",10,13
  .dc.b   "       AT89LV52-AT89LV55-AT89LS52-89LS51",10,10,13
  .dc.b   "               * MENU DE USO *",10,10,10,13
  .dc.b   "        (M)  SELECCION DE MODELO",10,13
  .dc.b   "        (C)  CONFIRMACION DE MODELO",10,13
  .dc.b   "        (L)  LECTURA DE MEMORIA",10,13
  .dc.b   "        (X)  HABILITA ALMACENAR EN RAM Y/O COPIAR A PC ",10,13
  .dc.b   "        (B)  BORRADO TOTAL DE MEMORIA",10,13
  .dc.b   "        (G)  GRABAR CHIP",10,13
  .dc.b   "        (E)  GRABA 2k eeprom AT89c8253",10,13
  .dc.b   "        (T)  TRANSFERIR MEMORIA DEL CHIP A PC",10,13
  .dc.b   "        PAQUETES DE 1K con cheksum 1K xmodem",10,13
  .dc.b   "        - 8K SIN PROTOCOLO SI (X) FUE ACTIVADO",10,13
  .dc.b   "        (F)  LECTURA FABRICANTE MODELO Y VPP",10,13
  .dc.b   "        (V)  COMPARA MEMORIA RAM CON CHIP",10,13
  .dc.b   "        (Z)  BLOQUEOS NIVEL1 NIVEL2 NIVEL3",10,13
  .dc.b   "        (H)  TX-RX 19200 BAUDIOS",10,13,13,13,0
envia_texto:
         clr a
         movc a,@a+dptr
         jz f_pres          
         inc dptr
         lcall tx
         sjmp envia_texto
f_pres:  ret

lee:     jnb     scon.0,!
         mov     A,SBUF          ;Lee caracter del buffer
         clr     SCON.0          ;Indica que es tenido en cuenta
         mov     bufer,a
         jnb     statusser.5,recepcion
         jb      statusser.7,cheq
         lcall   recepcion_bin        
         reti
cheq:    lcall   cheqsu
         reti

tx:      mov SBUF,A              ;Se mete en el buffer de la UART
         jnb SCON.1,!            ;Espera a que haya sido enviado
         clr SCON.1              ;Se va a transmitir un byte
         ret

recepcion:
         clr c
         mov a,bufer
         mov b,#'M'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz modser
         clr c
         mov a,bufer
         mov b,#'L'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz lectser
         clr c
         mov a,bufer
         mov b,#'C'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz confser
         mov a,bufer
         mov b,#'R'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz repi_menu
         mov a,bufer
         mov b,#'F'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz fabtt
         mov a,bufer
         mov b,#'B'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz borr
         mov a,bufer
         mov b,#'G'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz grrrr
         mov a,bufer
         mov b,#'X'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz permite_entrada
         mov a,bufer
         mov b,#'T'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz transf
         mov a,bufer
         mov b,#'V'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz VER
         mov a,bufer
         mov b,#'Z'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz BLOK
         mov a,bufer
         mov b,#'H'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz HEXA
         mov a,bufer
         mov b,#'E'  ;header 0x02  1kb bytes packet
         xrl a,b
         jz eep
         reti

eep:  ljmp eeprom

BLOK:      LJMP BLOQUEOS

VER:       LJMP VERIFICA

transf:    ljmp cero      

modser:    ljmp fun4

lectser:   ljmp fun5

confser:   ljmp fun1

repi_menu:
           clr statusser.5
           ljmp rep_menu

fabtt:     ljmp fun6

borr:      ljmp fun3

grrrr:     ljmp fun2

HEXA:     mov dptr,#IBIN
          lcall envia_texto
          mov    tmod,#%00000001    
          mov    t2con,#%00110100   ;generador de baudios  ;ok
          mov    th2,#$ff
          mov    tl2,#$ee
          mov    rcap2h,#$ff
          mov    rcap2l,#$ee        ;b8  4800 baudios          
          mov    SCON,#%01010000    ;Configura el puerto serie:
          reti


permite_entrada:
           cpl status.6                            ;permite lectura y almacenamiento de memoria de chip
           jnb status.6,slec
           mov dptr,#cylectura
           lcall envia_texto
           reti
slec:      mov dptr,#xlectura
           lcall envia_texto
           reti

recepcion_bin:
           jb statusser.4,packet
           jb statusser.2,pnum
           jb statusser.1,pnum
           clr c
           mov a,bufer
           mov b,#%00000010                      ;header 0x02  1kb bytes packet
           xrl a,b
           jz atr
           clr c
           mov a,bufer
           mov b,#%00000100                     ;?EOF recibido responde 0x06 rx completado
           xrl a,b
           jz eof

header_error:
           clr statusser.1      
           clr statusser.2      
           clr statusser.3      
           clr statusser.4
           clr statusser.7
           mov r3,#$00
           mov a,#$15
           acall tx
           ret

eof:       mov a,#$06
           acall tx
           mov statush,#$00
           mov vacio,#$00
           clr statusser.5
           clr statusser.1      
           clr statusser.2      
           clr statusser.3      
           clr statusser.4
           clr statusser.7
           mov dptr,#$0000
           mov mdptrp+0,dpl
           mov mdptrp+1,dph
           ret

atr:       setb statusser.2
           mov lengt+0,#$00
           mov lengt+1,#$04  ;1kbyte
           ret

pnum:      jb statusser.4,packet
           jb statusser.3,num
           mov bloser,bufer
           setb statusser.3
           ret
num:       mov a,bufer
           cpl a
           xrl a,bloser
           jz  numok
erroblocke:
           clr statusser.1      
           clr statusser.2      
           clr statusser.3      
           clr statusser.4
           clr statusser.7
           mov a,#$15
           acall tx
           ret      
numok:     setb statusser.4
           ret

packet:    mov p1,#%10111110        ;set ESTADO DE LECTURA vpp 5 en espera
       
           jb vacio.4,bin_puro
           jb statush.7,hexai
           mov b,#$3a
           mov a,bufer
           clr c
           xrl a,b
           jz  authex           ; autodeteccion de hexa intel

           setb vacio.4
           clr statush.7
           sjmp bin_puro
authex:
           setb statush.7
           clr vacio.4
           sjmp hexai

bin_puro:
           mov dpl,mdptrp+0
           mov dph,mdptrp+1     ;carga puntero virtual
           mov a,bufer
           movx @dptr,a      ;carga dato apuntado por puntero virtual
           mov b,r3
           add a,b
           mov r3,a
           inc dptr            ;incrementa direcion
           mov mdptrp+0,dpl
           mov mdptrp+1,dph     ;guarda direccion
           jnb statush.7,binp
HEXAI:
           mov a,bufer
           mov b,r3
           add a,b
           mov r3,a
           lcall decodificador
binp:
           ljmp rxx?
rxxs:          
           ret


rxx?:     mov r0,lengt+0
          mov r1,lengt+1
          djnz r0,rxx52         ;decrementa byte bajo
          djnz r1,rx52          ;decrementa byte alto
          setb statusser.7
          RET
rxx52:    mov lengt+0,r0        ;devuelve valor y retorna a grabacion
          RET                   ;otro siclo
rx52:     mov lengt+1,r1        ;devuelve valor y retorna a grabacion
          mov lengt+0,r0
          RET                   ;otro siclo

cheqsu:   mov a,bufer
          xrl a,r3
          jz okcrc
          clr statusser.1      
          clr statusser.2      
          clr statusser.3      
          clr statusser.4
          clr statusser.7
          mov r3,#$00
          mov a,#$15
          mov SBUF,A              ;Se mete en el buffer de la UART
          jnb SCON.1,!            ;Espera a que haya sido enviado
          clr SCON.1              ;Se va a transmitir un byte
          mov p1,#%00111110        ;set ESTADO DE LECTURA vpp 5 en espera
          ret
okcrc:
          clr ie.4
          clr statusser.1      
          clr statusser.2      
          clr statusser.3      
          clr statusser.4
          clr statusser.7
          mov r3,#$00
          djnz R0,!
          djnz R0,!
          djnz R0,!
          setb ie.4
          mov a,#$06
          mov SBUF,A              ;Se mete en el buffer de la UART
          jnb SCON.1,!            ;Espera a que haya sido enviado
          clr SCON.1              ;Se va a transmitir un byte
          ret  

retorna_packete:
          jb status.6,total
          mov a,,#$02
          acall tx
          inc bloser
          mov a,bloser
          acall tx
          mov bloser,a
          cpl a        
          acall tx
          mov R3,#$00

          mov lengt+0,#$00
          mov lengt+1,#$04  ;1kbyte

          sjmp packetx

total:    mov lengt+0,#$00
          mov lengt+1,#$20  ;8kbyte

packetx:
         mov dpl,mdptrp+0
         mov dph,mdptrp+1     ;carga puntero virtual de tx
         movx a,@dptr       ;carga dato apuntado por puntero virtual
         mov bufer,a
         mov b,r3
         add a,b
         mov r3,a
         inc dptr            ;incrementa direcion
         mov mdptrp+0,dpl
         mov mdptrp+1,dph    ;guarda direccion
         mov a,bufer
         acall tx
         nop
         mov r0,lengt+0
         mov r1,lengt+1
         djnz r0,rxxt52         ;decrementa byte bajo
         djnz r1,rxt52          ;decrementa byte alto
         jb status.6,src
         mov a,r3
         acall tx
src:     mov r3,#$00
         mov    dptr,#$0000   ;uno adelantado (+1) para compenzar
         mov    mdptrp+0,dpl  ;aumento adelantado de dptr en la lectura
         mov    mdptrp+1,dph
         ret
rxxt52:  mov lengt+0,r0        ;devuelve valor y retorna a grabacion
         ljmp packetx             ;otro siclo
rxt52:   mov lengt+1,r1        ;devuelve valor y retorna a grabacion
         mov lengt+0,r0
         ljmp packetx          ;otro siclo

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

teclado:
       jnb p3.2,!
       lcall espera2
       lcall espera2
       lcall espera2
       lcall espera2
       lcall espera2
       lcall espera2
       setb statusser.5
       mov a,#$15
       lcall tx
       mov statusb,#00
       reti

cero:
       setb p1.7
       mov    dptr,#$0000   ;uno adelantado (+1) para compenzar
       mov    mdptrp+0,dpl  ;aumento adelantado de dptr en la lectura
       mov    mdptrp+1,dph
       lcall retorna_packete
       clr p1.7
       mov statusb,#00
       reti


uno:
       setb statusser.5
       mov a,#$15
       lcall tx
       mov statusb,#00
       ret


FUN1:
       lcall configura
       mov statusb,#00
       reti  

FUN2:
       clr ie.0
       clr p3.2
       lcall espera2
       lcall espera2
       setb p3.2
       setb ie.0
       mov a,#$00
       xrl a,statusb
       jnz bks
       clr status.6
       mov dptr,#g_disp
       lcall envia_texto
       jb status.3,g8252
       lcall graba89c52
       clr status.7
       reti
g8252:
       clr ie.0
       clr p3.2
       lcall espera2
       lcall espera2
       setb p3.2
       setb ie.0
       lcall graba89c8252
       clr status.7
       reti
bks:
       lcall ale_puls52
       mov statusb,#$00
       mov dptr,#bcomp
       lcall envia_texto
       reti


FUN3:  setb status.0             ;condicion de borrado
       clr status.6
       mov dptr,#borrado
       lcall envia_texto
       jb status.3,b8253
       lcall borra89c52
       lcall espera2
       lcall espera2
       lcall borra89c52

       clr ie.0
       clr p3.2
       lcall espera2
       lcall espera2
       setb p3.2
       setb ie.0

       lcall lectura_chip
       clr status.0
       mov statusb,#00
       reti

b8253:

       lcall borra89c8253
       lcall espera2
       lcall espera2
       lcall borra89c8253

       clr ie.0
       clr p3.2
       lcall espera2
       lcall espera2
       setb p3.2
       setb ie.0

       lcall lectura_chip
       clr status.0
       mov statusb,#00
       reti


FUN4:
       clr ie.0
       clr p3.2
       lcall espera2
       lcall espera2
       setb p3.2
       setb ie.0

       mov a,modelo
       mov b,#$04
       cjne a,b,pxm
       mov modelo,#$00
pxm:   inc modelo
       lcall c_modelo
       mov statusb,#00
       reti  

bufer_copia = $0000


FUN5:  
       clr ie.0
       clr p3.2
       lcall espera2
       lcall espera2
       setb p3.2
       setb ie.0
       clr  status.7            ;solo lectura (anula diferencia con ff)
       setb status.2           ;pemita escritura en linea superior lectura)
       jnb  status.6,slectura
       mov dptr,#bufer_copia
swp:   mov  mdptr+0,dpl
       mov  mdptr+1,dph
slectura:
       mov  dptr,#lecturas
       lcall envia_texto
       lcall lectura_chip
       clr  status.2
       clr  status.7
       mov statusb,#00
       reti

FUN6:
       clr ie.0
       clr p3.2
       lcall espera2
       setb p3.2
       setb ie.0

       clr status.6
       mov indice,#$00
       lcall codigo?
       lcall c_modelo
       mov statusb,#00
       reti  


VERIFICA:
       clr  status.7            ;solo lectura (anula diferencia con ff)
       setb status.2           ;pemita escritura en linea superior lectura)
       mov dptr,#bufer_copia
       mov  mdptr+0,dpl
       mov  mdptr+1,dph
       mov dptr,#verificacion
       lcall envia_texto
       clr ie.0
       clr p3.2
       lcall espera2          ; pone a cero conunter 4051
       setb p3.2
       setb ie.0
       mov dptr,#compar
       lcall envia_texto
       lcall verifica_grabado
       clr  status.2
       clr  status.7
       mov statusb,#00
       reti


BLOQUEOS:
       inc statusb
       mov b,statusb
       mov a,#$01
       xrl a,b
       jz niv1
       mov a,#$02
       xrl a,b
       jz niv2
       mov a,#$03
       xrl a,b
       jz niv3
       mov statusb,#$00
       reti
     
niv1:  mov dptr,#bloc1
       mov p1,#00111111
       lcall envia_texto
       reti

niv2:  mov dptr,#bloc2
       mov p1,#00110011
       lcall envia_texto
       reti
               
niv3:  mov dptr,#bloc3
       mov p1,#00110101
       lcall envia_texto
       reti

eeprom:
         clr  status.7            ;solo lectura (anula diferencia con ff)
         setb status.2           ;pemita escritura en linea superior lectura)
         mov addsl,#$ff  
         mov addsh,#$7f  
         mov lengtg+0,#$00
         mov lengtg+1,#$08    ;2k
         mov dptr,#$0000      ;ajusta para grabado de eeprom 2 k memoria
         mov mdptr+0,dpl
         mov mdptr+1,dph
         mov  dptr,#teeprom
         lcall envia_texto
         lcall graba89c8252ex
         clr  status.2
         clr  status.7
         reti


;///////////////////////////////////////////////////////////////////////////


borra89c52:
          setb  status.7
          lcall contr_borrado52
          jb status.5,ale5b            ;BORRADO EN 5VPP
          lcall ale_borrado52
          ret
ale5b:    lcall ale_borrado52_v5
          ret                    ; falta retorno hacia control de programa

borra89c8253:
          setb  status.7
          lcall contr_borrado8253
          lcall ale_borrado8252
          ret                    ; falta retorno hacia control de programa


graba89c8252ex:
          clr status.7
gbaex:
          lcall adres_data      ;dato y direccion  reajuste cada siclo
          lcall contr_esc8252ex ;seteo incial
          lcall espera1
          jnb p1.1,!            ;ESPERA BUSY
          lcall adds_escl       ;direcciones bajas puesta en lach
          lcall adds_esch       ;direcciones altas puesta en lach
          lcall data_esc        ;dato en lach de escritura
          lcall ale_puls8252    ;pulso en bajo de ale/-prog
          lcall muestra_lcd_g   ;lach lcd direcion origen,destino y dato grabado    
          lcall espera2
          ljmp  fin82ex?


graba89c8252:
          clr status.7
gbaz:
          lcall adres_data    ;dato y direccion  reajuste cada siclo
          lcall contr_esc8252 ;seteo incial
          jnb p1.1,!          ;ESPERA BUSY
          lcall adds_escl     ;direcciones bajas puesta en lach
          lcall adds_esch     ;direcciones altas puesta en lach
          lcall data_esc      ;dato en lach de escritura
          lcall ale_puls8252  ;pulso en bajo de ale/-prog
          lcall muestra_lcd_g ;lach lcd direcion origen,destino y dato grabado    
          ljmp  fin82?


graba89c52:
          clr status.7
          lcall contr_esc52   ;seteo incial
gaa:
          lcall adres_data    ;dato y direccion  reajuste cada siclo
          lcall adds_escl     ;direcciones bajas puesta en lach
          lcall adds_esch     ;direcciones altas puesta en lach
          lcall data_esc      ;dato en lach de escritura
          jb status.5,vpplow  ;sino 5, 12
          lcall ale_puls52    ;pulso en bajo de ale/-prog
          ljmp cta
vpplow:
          lcall ale_puls52_v5 ;pulso en bajo de ale/-prog
cta:
          lcall muestra_lcd_g   ;lach lcd direcion origen,destino y dato grabado    
          setb p1.6             ;incrementa puntero 4051
          clr  p1.6
          ljmp fin52?


codigo?:  mov addsl,#$00
          mov addsh,#$80

codigo??:
          lcall adres_code??     ; ajusta direcciones de lectura de codigo de fabrica      
          lcall adds_escl        ; lachea direcciones bajas
          lcall adds_esch        ; lachea direcciones altas
          lcall contr_lec_cod_device52  ;
          lcall cff
          setb p1.6             ;incrementa puntero 4051
          clr  p1.6
          mov r0,addsh
          cjne r0,#$82,codigo??
          ret

lectura_chip:
          lcall adres_data_l    ;dato y direccion  reajuste cada siclo
          lcall adds_escl       ;direcciones bajas puesta en lach
          lcall adds_esch       ;direcciones altas puesta en lach
          jb status.3,l8252
          lcall contr_lec52     ;leer lo grabado
          sjmp norml
l8252:
          lcall contr_lec8252     ;leer lo grabado
norml:
          lcall adres_data_ll   ;almacena lo grabado
          lcall add_destino     ;lach lcd direcion origen,destino y dato grabado    
          setb p1.6             ;incrementa puntero 4051
          clr  p1.6
          jnb status.7,s_error          
          jnb status.1,s_error
          ret
s_error:  ljmp fin52l?


verifica_grabadoex:
          lcall adres_data_l    ;dato y direccion  reajuste cada siclo
          lcall adds_escl       ;direcciones bajas puesta en lach
          lcall adds_esch       ;direcciones altas puesta en lach
          lcall contr_lec8252ex ;leer lo grabado

          lcall adres_data_lll  ;almacena lo grabado
          lcall muestra_lcd     ;lach lcd direcion origen,destino y dato grabado    
          jnb status.7,s_errorc          
          jnb status.1,s_errorc
          ret
s_errorc:
          ljmp fin52Vex?



verifica_grabado:
          lcall adres_data_l    ;dato y direccion  reajuste cada siclo
          lcall adds_escl       ;direcciones bajas puesta en lach
          lcall adds_esch       ;direcciones altas puesta en lach
          jb status.3,v8252
          lcall contr_lec52     ;leer lo grabado
          sjmp normv
v8252:
          lcall contr_lec8252     ;leer lo grabado
normv
          lcall adres_data_lll  ;almacena lo grabado
          lcall muestra_lcd     ;lach lcd direcion origen,destino y dato grabado    
          setb p1.6             ;incrementa puntero 4051
          clr  p1.6
          jnb status.7,s_errorcex          
          jnb status.1,s_errorcex
          ret
s_errorcex:
           ljmp fin52V?


c_modelo: mov dptr,#xis8952-51
          mov a,modelo
          mov b,#$33
          mul ab
          jb psw.2,ovf
          clr c
          addc a,dpl    
          mov dpl,a
          jnc cres
          inc dph
          sjmp cres
ovf:      addc a,dpl
          mov dpl,a
          jc audph
          mov a,b
          add a,dph
          mov dph,a
          sjmp cres
audph:    inc dph
          mov a,b
          clr c
          addc a,dph
          jc udphn
          mov dph,a
          sjmp cres
udphn:    mov dph,a
          inc dph
cres:     lcall envia_texto
          ret

xIS8952:      .dc.b "8K flash AT89-C52-LS52-",10,13
              .dc.b "LS8252-LV52-S52-IS89C52",10,13,0
xAT8952:      .dc.b "4K flash    AT89C4051  ",10,13
              .dc.b "  AT89LV51- C51 - S51  ",10,13,0
xra2:         .dc.b "12K flash   AT89LS8253 ",10,13
              .dc.b "       2K eeprom       ",10,13,0
xAT898252:    .dc.b "2K flash    AT89c2051  ",10,13
              .dc.b "                       ",10,13,0


;----------------------------------------------------------------------------
;
;funciones del control de grabacion bit 4 del puerto b acceso al 74573
;    P1.
;    | 0 | p2.6         H   |   L   |   L   |
;    | 1 | p2.7         L   |   H   |   L   |
;    | 2 | p3.6         L   |   H   |   H   |
;    | 3 | p3.7         L   |   H   |   H   |
;    | 4 | p3.3         L   |   H   |   H   |
;    | 5 | EA/Vpp     puls L| puls L|   H   |
;    | 6 | clock para 89c2051 - 4051
;    | 7 | ale especial   conmuta bancos combinado con A15
:
;    P3.  
;    | 5 | ALE/prog    H(12v)| H(12v)| H(12v)|
;    | 2 | RESET 89C4051
;----------------------------------------------------------------------------

contr_borrado52:            
        clr   p3.3
        setb  p3.4
        mov   p1,#%00110001      
        ret

contr_borrado8253:            
        clr   p3.3
        setb  p3.4
        mov   p1,#%00010001   ; 12 vpp permanente
        ret

contr_esc8252:
        mov   p1,#%00001110  ; 12 VPP PERMANENTE  
        setb  p3.3           ;
        setb  p3.4           ;
        ret

contr_esc8252ex:
        mov   p1,#%00001100      ; 12 VPP PERMANENTE  
        setb  p3.3
        clr   p3.4
        ret

contr_esc52:
        setb  p3.3
        setb  p3.4
        mov   p1,#%00101110      
        ret

contr_lec8252:
        mov   p1,#%00001100        ;12 vpp seteado permanente
        setb  p3.4
        clr   p3.3
        mov   P0,#%11111111
        lcall espera
        mov   a,p0
        mov   lectura,a
        ret

contr_lec8252ex:
        mov   p1,#%00001100        ;12 vpp seteado permanente
        clr   p3.4
        clr   p3.3
        mov   P0,#%11111111
        lcall espera
        mov   a,p0
        mov   lectura,a
        ret

contr_lec52:
        clr   p3.3
        setb  p3.4
        mov   p1,#%00101100        ;set ESTADO DE LECTURA VPP 5v en espera
        mov   P0,#%11111111
        lcall espera
        mov   a,p0
        mov   lectura,a
        ret


contr_lec_cod_device52:
        jb status.3,l8253c       ; modelos 8252 8253
        mov p1,#%00111111        ;set ESTADO DE LECTURA vpp 5 en espera
        mov p1,#%00100000        ;set ESTADO DE LECTURA vpp 5 en espera
        mov P0,#%11111111
        lcall espera
        mov a,p0
        mov lectura,a
        ret
l8253c:
        mov p1,#%00011111        ;set ESTADO DE LECTURA vpp 12
        mov p1,#%00000000        ;set ESTADO DE LECTURA vpp 12
        mov P0,#%11111111
        lcall espera
        mov a,p0
        mov lectura,a
        ret

contr_ini:
        mov P1,#%00100000        ;vpp activo en estado bajo
        ret

  ;----carga direcciones y datos---

adds_escl:
        SETB P1.7
        mov P0,ADDSL             ;address Low luego @ alguna variable
        CLR P1.7
        MOV P0,#%11111111
        ret

adds_esch:
        mov P2,ADDSH            ;address Hi  luego @ alguna variable  
        ret


fin52Vex?:
        mov r0,lengtg+0
        mov r1,lengtg+1
        djnz r0,ld52Vex            ;decrementa byte bajo
        djnz r1,hd52Vex            ;decrementa byte alto
        mov dptr,#compar
        lcall envia_texto
        lcall fin_lectura
        ret
ld52Vex:
        mov lengtg+0,r0         ;devuelve valor y retorna a grabacion
        ljmp verifica_grabadoex       ;otro siclo
hd52Vex:
        mov lengtg+1,r1         ;devuelve valor y retorna a grabacion
        mov lengtg+0,r0
        ljmp verifica_grabadoex       ;otro siclo

fin52V?:
        mov r0,lengtg+0
        mov r1,lengtg+1
        djnz r0,ld52V            ;decrementa byte bajo
        djnz r1,hd52V            ;decrementa byte alto
        lcall fin_lectura
        ret
ld52V:  mov lengtg+0,r0         ;devuelve valor y retorna a grabacion
        ljmp verifica_grabado       ;otro siclo
hd52V:  mov lengtg+1,r1         ;devuelve valor y retorna a grabacion
        mov lengtg+0,r0
        ljmp verifica_grabado       ;otro siclo



fin52l?: mov r0,lengtg+0
        mov r1,lengtg+1
        djnz r0,ld52l            ;decrementa byte bajo
        djnz r1,hd52l            ;decrementa byte alto
        lcall fin_lectura
        ret

ld52l:  mov lengtg+0,r0         ;devuelve valor y retorna a grabacion
        ljmp lectura_chip       ;otro siclo
hd52l:  mov lengtg+1,r1         ;devuelve valor y retorna a grabacion
        mov lengtg+0,r0
        ljmp lectura_chip       ;otro siclo

fin52?: mov r0,lengtg+0
        mov r1,lengtg+1
        djnz r0,ld52            ;decrementa byte bajo
        djnz r1,hd52            ;decrementa byte alto
        lcall fin_grab
        ret

ld52:   mov lengtg+0,r0        ;devuelve valor y retorna a grabacion
        ljmp gaa               ;otro siclo
hd52:   mov lengtg+1,r1        ;devuelve valor y retorna a grabacion
        mov lengtg+0,r0
        ljmp gaa               ;otro siclo

fin82?: mov r0,lengtg+0
        mov r1,lengtg+1
        djnz r0,ld82             ;decrementa byte bajo
        djnz r1,hd82             ;decrementa byte alto
        lcall fin_grab
        ret
ld82:   mov lengtg+0,r0         ;devuelve valor y retorna a grabacion
        ljmp gbaz               ;otro siclo
hd82:   mov lengtg+1,r1         ;devuelve valor y retorna a grabacion
        mov lengtg+0,r0
        ljmp gbaz               ;otro siclo

fin82ex?:
        mov r0,lengtg+0
        mov r1,lengtg+1
        djnz r0,ld82ex             ;decrementa byte bajo
        djnz r1,hd82ex             ;decrementa byte alto
        lcall fin_grabex
        ret

ld82ex: mov lengtg+0,r0         ;devuelve valor y retorna a grabacion
        ljmp gbaex                ;otro siclo
hd82ex: mov lengtg+1,r1         ;devuelve valor y retorna a grabacion
        mov lengtg+0,r0
        ljmp gbaex                ;otro siclo


     ;----coloca datos----
data_esc:
         mov P0,datam             ;dato a grabar
         ret

     ;---ALE/PROG pulso en bajo,
ale_puls8252:
         CLR P3.5
         lcall espera1
         SETB P3.5
         ret

ale_puls52_v5:
         CLR P3.5
         lcall espera1
         SETB P3.5
         ret

ale_puls52:
         CLR P1.5       ;vpp 12v
         lcall espera1
         CLR P3.5
         lcall espera1
         SETB P3.5
         lcall espera1
         SETB P1.5
         ret

ale_borrado52:
         CLR P1.5         ; set vpp 12
         lcall espera1
         lcall espera1
         lcall espera1
         lcall espera1
         CLR P3.5
         lcall espera2
         SETB P3.5
         lcall espera1
         lcall espera1
         lcall espera1
         lcall espera1
         SETB P1.5      
         ret

ale_borrado52_v5:
         lcall espera1
         lcall espera1
         CLR P3.5
         lcall espera1
         lcall espera1
         lcall espera1
         lcall espera1
         lcall espera1
         lcall espera1
         SETB P3.5
         lcall espera1
         lcall espera1
         ret


ale_borrado8252
         lcall espera2
         lcall espera1
         CLR P3.5
         lcall espera1
         lcall espera2
         lcall espera1
         SETB P3.5
         lcall espera1
         lcall espera2
         ret


fin_grabex:
          lcall contr_ini
          mov dptr,#GF
          lcall envia_texto

        mov addsl,#$ff  
        mov addsh,#$7f  
        mov lengtg+0,#$00
        mov lengtg+1,#$08    ;2k
        mov dptr,#$0000      ;ajusta para grabado-lectura de eeprom 2k
        mov mdptr+0,dpl
        mov mdptr+1,dph
       
          lcall verifica_grabadoex

          ret


fin_grab: lcall contr_ini
          mov dptr,#GF
          lcall envia_texto
          lcall configura

       clr ie.0
       clr p3.2
       lcall espera2
       setb p3.2
       setb ie.0

          lcall verifica
          ret

fin_lectura:
          lcall contr_ini
          jnb status.2,lect    ;( status.7)
          mov dptr,#oasd
          sjmp ao1
lect:     mov dptr,#GFL
          lcall envia_texto
          lcall configura
          ret
ao1:      lcall envia_texto
          lcall configura
          ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
espera:   mov acc,#$03
rty:      djnz acc,rty
          ret

espera1:  mov acc,#$00
          mov b,#$01             ;1.1 Mseg
rty1:     djnz acc,rty1
          djnz b,rty1
          ret

espera2:  mov acc,#$00
          mov b,#$06             ;8.0 Mseg
rty2:     djnz acc,rty2
          djnz b,rty2
          ret

adres_data_l:                   ;carga direciones y datos a grabar
          mov dpl,addsl
          mov dph,addsh
          inc dptr
          mov addsl,dpl       ;guarda direccion incrementada
          mov addsh,dph
          ret

adres_data_ll:
          jnb status.6,salm
          jb status.3,vppa
          mov p1,#%10111110
          sjmp clra
vppa:
          clr  p1.5
          setb p1.7
clra:
          mov dpl,mdptr+0
          mov dph,mdptr+1     ;carga puntero virtual
          mov  a,lectura
          movx @dptr,a        ;carga dato apuntado por puntero virtual
          inc dptr            ;incrementa direcion
          mov mdptr+0,dpl
          mov mdptr+1,dph     ;guarda direccion
          jb status.3,salm
          mov p1,#%00111110
salm:
          clr p1.7
          ret

adres_data_lll
          jb status.3,vppb
          mov p1,#%10111110        ;set ESTADO DE LECTURA vpp 5 en espera
          sjmp nclrb
vppb:
          clr  p1.5
          setb p1.7
nclrb:
          mov dpl,mdptr+0
          mov dph,mdptr+1     ;carga puntero virtual
          movx a,@dptr      ;carga dato apuntado por puntero virtual
          mov datam,a
          inc dptr            ;incrementa direcion
          mov mdptr+0,dpl
          mov mdptr+1,dph     ;guarda direccion
          jb status.3,sclrb
          mov p1,#%00111110
sclrb:
          clr p1.7
          ret


adres_data:                   ;carga direciones y datos a grabar
          jb status.3,vppc
          mov p1,#%10111110        ;set ESTADO DE LECTURA vpp 5 en espera
          sjmp nclrc
vppc:
          clr  p1.5
          setb p1.7
nclrc:
          mov dpl,addsl
          mov dph,addsh
          inc dptr
          mov addsl,dpl       ;guarda direccion incrementada
          mov addsh,dph
          mov dpl,mdptr+0
          mov dph,mdptr+1     ;carga puntero virtual
          movx a,@dptr      ;carga dato apuntado por puntero virtual
          mov datam,a
          inc dptr            ;incrementa direcion
          mov mdptr+0,dpl
          mov mdptr+1,dph     ;guarda direccion
          jb status.3,sclrc
          mov p1,#%00111110
sclrc:
          clr p1.7
          ret

adres_code??:             ; solo direcciones de lectura de codigo de fabrica
          mov dpl,addsl
          mov dph,addsh
          inc dptr        ; incrementa para proxima direccion leida
          mov addsl,dpl
          mov addsh,dph
          ret

muestra_lcd:
          mov a,datam        ;lectura
          mov b,lectura
          clr c
          xrl a,b
          jz gok
          setb status.4
          sjmp  gcont
          nop
gok:      clr status.4
          nop
gcont:    mov r0,#octetos
          mov a,@r0
          mov r0,a
          djnz r0,noctg
          mov octetos,#$80
          sjmp octg
noctg:    mov r1,#octetos
          mov a,r0
          mov @r1,a
          ret

octg:     jb status.4,erg
          mov a,#'©'
          lcall tx
          sjmp fcont
erg:      mov a,#'±'
          lcall tx
fcont:    ret

muestra_lcd_g:
          mov r0,#octetos
          mov a,@r0
          mov r0,a
          djnz r0,noctgg
          mov octetos,#$80
          sjmp octgg
noctgg:
          mov r1,#octetos
          mov a,r0
          mov @r1,a
          ret
octgg:
          mov a,#'¯'
          lcall tx
          ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

add_destino:
          clr status.1
          mov b,#$ff
          mov a,lectura  
          xrl a,b
          jz ncoded
          clr status.4           ;datos en estado ff en memoria leida
          sjmp boludo
ncoded:                           ;dato difiere de ff en memoria leida
          setb status.4
boludo:   jnb status.7,spb
          mov b,#$ff
          mov a,lectura
          xrl a,b
          jz spb

falla_borrado:
          mov dptr,#f_borrado
          lcall envia_texto
          setb status.1

spb:      mov r0,#octetos
          mov a,@r0
          mov r0,a
          djnz r0,noct
          mov octetos,#$80
          jb status.7,soct
          sjmp oct

noct:     mov r1,#octetos
          mov a,r0
          mov @r1,a
          ret

oct:      jb status.0,octx
          jb status.4,codes          
          mov a,#'¸'
          lcall tx
          sjmp sadf
codes:    mov a,#'±'
          lcall tx
sadf:     ret

          jnb status.7,octx
          ljmp soct

octx:     jb status.2,soct
ocx:      jb status.4,codesb          
          mov a,#'¸'
          lcall tx
          sjmp sadf
codesb:   mov a,#'±'
          lcall tx
          ret

soct:     jb status.2,ocx
          jb status.0,ocx
          ret
;////////////////////////////////////////////////////////////////////////////
cff:
          mov a,addsl
          xrl a,#$30
          jz cffa
          mov a,addsl
          xrl a,#$31
          jz cffb3
          mov a,addsl
          xrl a,#$32
          jz xcffc
          mov a,addsl
          xrl a,#$00
          jz cffa
          mov a,addsh
          xrl a,#$81
          jz cffb100
          mov a,addsh
          xrl a,#$82
          jz xcffc
          ret

cffb3:    ljmp cffb31


xcffc:    ljmp cffc

cffa:  
          mov a,lectura
          mov b,#$1e      ;1E atmel
          clr c
          xrl a,b
          jz atm
          mov a,lectura
          mov b,#$De      ;D5 ISSI
          clr c
          xrl a,b
          jz issi
          ret
       
atm:      mov dptr,#atmel
          lcall envia_texto
          ret
issi:     mov dptr,#issiy
          lcall envia_texto
          ret

cffb100:
          mov a,lectura
          mov b,#$21        ;21 89C2051     100
          clr c
          xrl a,b
          jz model4
          mov a,lectura
          mov b,#$41        ;41  89C4051    100
          clr c
          xrl a,b
          jz model5
          mov a,lectura
          mov b,#$61        ;61   89LS51    100
          clr c
          xrl a,b
          jz model6
          mov a,lectura
          mov b,#$62        ;62   89LS52    100
          clr c
          xrl a,b
          jz model7  
          mov a,lectura
          mov b,#$51        ;62   89S51     100
          clr c
          xrl a,b
          jz model11  
          ret
         
model1:      mov modelo,#$01      ;8k    
             mov dptr,#AT89C52
             lcall envia_texto
             ret
model3:      mov modelo,#$01      ;8k
             setb status.3
             mov dptr,#AT89ls8252
             lcall envia_texto
             ret
model4:      mov modelo,#$04      ;2k
             mov dptr,#AT89C2051
             lcall envia_texto
             clr status.3
             ret
model5:      mov modelo,#$02      ;4k
             mov dptr,#AT89C4051
             lcall envia_texto
             ret
model6:      mov modelo,#$02      ;4k
             mov dptr,#AT89ls51
             lcall envia_texto
             ret
model7:      mov modelo,#$01      ;8k
             mov dptr,#AT89ls52
             lcall envia_texto
             ret
model8:      mov modelo,#$01      ;8k
             mov dptr,#AT89lv52
             lcall envia_texto
             ret
model10:     mov modelo,#$03      ;12k
             mov dptr,#AT89s8253
             lcall envia_texto
             setb status.3
             ret
model11:     mov modelo,#$02      ;4k
             mov dptr,#AT89s51
             lcall envia_texto
             ret
model12:     mov modelo,#$01      ;8k
             ret
model2:      mov modelo,#$01      ;8k
             ret
cffb31:
          mov a,lectura
          mov b,#$52        ;52 model 52     31
          clr c
          xrl a,b
          jz model1
          mov a,lectura
          mov b,#$51        ;51 model ISSI89C52    31
          clr c
          xrl a,b
          jz model2
          mov a,lectura
          mov b,#$82        ;82 model 8252    31
          clr c
          xrl a,b
          jz model3
          mov a,lectura
          mov b,#$62        ;62   89LV52    31
          clr c
          xrl a,b
          jz model8  
          mov a,lectura
          mov b,#$73        ;73   89S8253   31
          clr c
          xrl a,b
          jz model10  
          RET

cffc:     mov a,lectura
          mov b,#%11111111
          clr c
          xrl a,b
          jz v12v
          mov a,lectura
          mov b,#%00000110
          clr c
          xrl a,b
          jz v12v
          mov a,lectura
          mov b,#%00000101
          clr c
          xrl a,b
          jz v5v
          mov a,lectura
          mov b,#%01010101
          clr c
          xrl a,b
          jz v5v
          mov a,lectura
          mov b,#%10101010
          clr c
          xrl a,b
          jz v12v
          ret

v12v:     mov dptr,#VPP12
          lcall envia_texto
          clr status.5             ;vpp 12 v
          ret
v5v:      mov dptr,#vpp5
          lcall envia_texto
          setb status.5       ; status.5  5 vpp  seleccion
          ret


configura:
          mov a,#$01
          cjne a,modelo,cnfat
          ljmp m8k        
cnfat     mov a,#$02
          cjne a,modelo,cnfa
          ljmp m4k        
cnfa:     mov a,#$03
          cjne a,modelo,cnfb
          ljmp m12k        
cnfb:     mov a,#$04
          cjne a,modelo,configurado
          ljmp m2k        

configurado:

          ret

m8k:
          mov addsl,#$ff  
          mov addsh,#$7f  
          mov lengtg+0,#$ff
          mov lengtg+1,#$1f    ;8k
          mov dptr,#$0000     ;cambiar en el modelo a hacer binario
          mov mdptr+0,dpl
          mov mdptr+1,dph
          clr status.3
          jb status.1,s_er1
          mov dptr,#mconf
          lcall envia_texto
          mov dptr,#kba
          lcall envia_texto
          ljmp configurado
s_er1     ret
           
m4k:
          mov addsl,#$ff  
          mov addsh,#$7f  
          mov lengtg+0,#$00
          mov lengtg+1,#$10    ;4k
          mov dptr,#$0000     ;cambiar en el modelo a hacer binario
          mov mdptr+0,dpl
          mov mdptr+1,dph
          clr status.3
          jb status.1,s_er3
          mov dptr,#mconf
          lcall envia_texto
          mov dptr,#kbb
          lcall envia_texto
          ljmp configurado
s_er3:    ret

m2k:
          mov addsl,#$ff  
          mov addsh,#$7f  
          mov lengtg+0,#$00
          mov lengtg+1,#$08    ;2k
          mov dptr,#$0000     ;cambiar en el modelo a hacer binario
          mov mdptr+0,dpl
          mov mdptr+1,dph
          clr status.3
          jb status.1,s_er4
          mov dptr,#mconf
          lcall envia_texto
          mov dptr,#kbc
          lcall envia_texto
          ljmp configurado
s_er4:    ret  

m12k:     mov addsl,#$ff  
          mov addsh,#$7f  
          mov lengtg+0,#$00
          mov lengtg+1,#$30    ;12k
          mov dptr,#$0000     ;cambiar en el modelo a hacer binario
          mov mdptr+0,dpl
          mov mdptr+1,dph
          setb status.3
          jb status.1,s_er5
          mov dptr,#mconf
          lcall envia_texto
          mov dptr,#kbd
          lcall envia_texto
          ljmp configurado
s_er5:    ret

;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;  STATUSH.7 ACTIVA DECODIFICADOR HEX INTEL
;  mdpth          .ds.b 2     ;datapointer del conversor
;  ind_h          .ds.b 1      ;indice del conversor


decodificador:
          mov b,#$3a
          mov a,bufer
          xrl a,b
          jz  dosp
          jb vacio.3,inch
          jb vacio.0,inicio
         
dosp:
          clr  vacio.1
          setb vacio.0
          mov crchx,#$00
          ret
inicio:
          mov b,#$0d
          mov a,bufer
          xrl a,b
          jz  inch
          mov b,#$0a
          mov a,bufer
          xrl a,b
          jz  inch

          cpl vacio.1
          lcall ascii_exa          ;CONVIERTE ASCII EN EXADECIMAL GUARDA EN R5
          jb vacio.1,inch        ;FALTA COMPLETAR NIBLE SUPERIOR

          jb statush.6,crc

          jb statush.5,crc      ;ultimo byte recibido

          mov b,bufhex
          mov a,crchx     ;INTERCAMBIA      
          clr c
          subb a,b
          mov crchx,a     ;GUARDA CRC      

          jb statush.4,codigo

          jb statush.3,tipo

          jb statush.2,puntero_l

          jb statush.1,puntero_h

          mov a,bufhex
          mov ind_h,a
          setb statush.1              ;INDICE DE CANTIDAD RECIBIDO
inch:  
          ret

tipo:     mov a,bufhex
          mov b,#$00
          xrl a,b
          jz normal          
          setb statush.6                   ;LINEA FINAL RECIBIDA
          ret
normal:   setb statush.4              ;TIPO DE LINA RECIBIDA
          ret

puntero_h:
          mov a,bufhex
          mov mdpth+1,A
          setb statush.2                  ;DPTR H RECIBIDO
          ret
puntero_l:
          mov a,bufhex
          mov mdpth+0,a
          setb statush.3             ;DPTR L RECIBIDO
          ret

codigo:   mov dph,mdpth+1
          mov dpl,mdpth+0
          mov a,bufhex
          movx @dptr,a
          inc dptr
          mov mdpth+1,dph
          mov mdpth+0,dpl
          djnz ind_h,inch
          setb statush.5             ;ULTIMO BYTE DE CODIGO
          ret

crc:      mov a,crchx
          mov b,bufhex
          xrl a,b
          jz okhx
          clr statush.7
          ret

okhx:     jb statush.6,crcf
          clr vacio.0
          clr vacio.1
          mov statush,#%10000000
          ret

crcf:     clr vacio.0
          clr vacio.1
          setb vacio.3
          mov statush,#%10000000
          ret


ASCII_EXA:
          mov a,bufer
          jnb acc.6,numeros
          mov b,#$37         ;RESTO 55
          clr c
          subb a,b
          jb vacio.1,supn     ;BIT ACTIVO = PRIMER NIBLE

          anl a,#%00001111
          orl a,bufhex         ;AGRGO SUPERIOR GUARDADO
          mov bufhex,a       ;RETORNO DATO A R5
          ret
NUMEROS:
          mov b,#$30         ;RESTO 48
          clr c
          subb a,b
          jb vacio.1,supn

          anl a,#%00001111
          orl  a,bufhex           ;AGREGO SUPERIOR GUARDADO
          mov  bufhex,a        ;GUARDO
          ret
SUPN:
          swap a                   ;PRIMER NIBLE SUPERIOR
          mov bufhex,a        ;DEJO SUPERIO  LIMPIO INFERIOR
          ret        



;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ

issiy         .dc.b "                  ISSI",10,10,13,0
atmel:        .dc.b ,10,10,"                   ATMEL",10,10,13,0
VPP12:        .dc.b "                 12v VPP",10,10,13,0
VPP5:         .dc.b "                 5v  VPP",10,10,13,0
AT89C52:      .dc.b "                AT89C52",10,10,13,0
AT89C2051:    .dc.b "                AT89C2051",10,10,13,0
AT89C4051:    .dc.b "                AT89C4051",10,10,13,0
AT89ls52:     .dc.b "                AT89LS52",10,10,13,0
AT89ls51:     .dc.b "                AT89LS51",10,10,13,0
AT89LV52:     .dc.b "                AT89LV52",10,10,13,0
AT89s51:      .dc.b "                AT89S52",10,10,13,0
AT89s52:      .dc.b "                AT89S52",10,10,13,0
AT89ls8252:   .dc.b "               AT89ls8252",10,10,13,0
AT89s8253:    .dc.b "               AT89s8253",10,10,13,0
ISSI8952      .Dc.B ,10,"    IS89C52",10,10,13,0
AT898252:     .dc.b ,10,"    89c8252",10,10,13,0
oasd:         .dc.b ,10,10,13,"     LECTURA COMPLETA",10,10,13,0
kba:          .dc.b "   8k    (G) graba (B) borra (L) lee...",10,10,13,0
kbb:          .dc.b "   4k    (G) graba (B) borra (L) lee...",10,10,13,0
kbc:          .dc.b "   2k    (G) graba (B) borra (L) lee...",10,10,13,0
kbd:          .dc.b "   12k   (G) graba (B) borra (L) lee...",10,10,13,0
GF:           .dc.b ,10,10,13,"         F I N  GRABACION",10,10,13,0
blanco:       .dc.b "     CHIP DESCONOCIDO, DESCONECTADO o ABERIADO",10,10,13,0
GFL:          .dc.b ,10,10,13," CHIP CONTROLADO Y BORRADO!!!!!!",10,10,13,0
f_borrado     .dc.b "       falla  borrado!!!   reintentar? (b)",10,10,13,0
borrado:      .dc.b "     CHIP-BORRADO?",10,10,13,0
mconf:        .dc.b "     CONFIGURADO",10,10,13,0
lecturas:     .dc.b "     LEYENDO MEMORIA  ± /ff   ¸ /code   ",10,10,13,0
xlectura:     .dc.b ,10,10,13,"      solo lectura para verificacion",10,10,13,0
cylectura:    .dc.b ,10,10,13,"      lee y guarda memoria de chip en ram",10,10,13,0
verificacion: .dc.b ,10,10,13,"      compara datos en memorias origen / destino",10,10,13,0
COMPAR        .dc.b ,10,10,13,"      © ok  ± bloke distinto",10,10,13,0
g_disp        .dc.b ,10,10,13,"      GRABANDO DISPOSITIVO",10,10,13,0
bloc1         .dc.b ,10,10,13,"SET LB1  (Z)PROXIMO (G) ACTIVA    ",10,10,13,0
bloc2         .dc.b ,10,10,13,"SET LB1 & LB2 (Z)PROXIMO (G) ACTIVA  ",10,10,13,0
bloc3         .dc.b ,10,10,13,"SET LB1 & LB2 & LB3 (Z)PROXIMO (G) ACTIVA ",10,10,13,0
BCOMP         .dc.b ,10,10,13,"BLOQUEO COMPLETADO",10,10,13,0
IBIN          .dc.b ,10,10,13,"CONFIGURADO 19200 BPS",10,10,13,0
teeprom       .dc.b ,10,10,13,"GRABANDO EEPROM 2KB 89S8253",10,10,13,0
                                 .END