//内核区闪存的擦除

   对于想修改NC1020的朋友来说,已经掌握了内核保护原理,最想知道的事莫过于如何修改内核闪存了,不过要想修改

内核的闪存,必须先知道如何擦除内核的闪存了,现在我就向大家介绍方法.

  由于前面已经讲了非内核区闪存的擦除,我这里就把不同点给大家列出,其他的完全和前面非内核区的一样.

  1.在 擦除的最前 加这段代码:

    LDA #$00

    STA $18

    最后擦除完毕,加这代码:

    LDA #$1C

    STA $18

  2.代码要变了,请看表:

表1:

非内核区 内核区
  LDA #$F0   

  STA $8000

  LDA #$AA

  STA $5555

  LDA #$55

  STA $AAAA

  LDA #$80

  STA $5555

  LDA #$AA

  STA $5555

  LDA #$55

  STA $AAAA

 

  LDA #$AA

  STA $D555

  LDA #$55

  STA $AAAA

  LDA #$80

  STA $D555

  LDA #$AA

  STA $D555

  LDA #$55

  STA $AAAA

 

 

表2:

非内核区 内核区
  2038:LDA $8000   

  203B:AND #$88

  203D:CMP #$88

  203F:BNE $2038  

  2041:LDA #$F0

  2043:STA $8000

 

  2038:LDA $C000   

  203B:AND #$88

  203D:CMP #$88

  203F:BNE $2038  

  2041:LDA #$F0

  2043:STA $C000

 

  怕大家还是搞不清楚,我们还是举个例子吧

  例: 擦除 03 页码的 B000-B7FF,因为这段地址全是 FF,擦除了后对系统没有影响,如果你想验证你是否真的擦除

你可以先往里面写入几个字节,然后再擦除,我们这里就不写入字节了.

     A 2000

    2000:SEI                    //设置中断

    2001:LDA #$00              //最关键一段,一定要把 00 送地址 18

    2003:STA $18 

    2005:LDA $00                //保护地址00 0D 0A的内容进栈

    2007:PHA

    2008:LDA $0A

    200A:PHA

    200B:LDA $0D

    200D:PHA

    200E:LDA $0A

    2010:AND #$7F

    2012:STA $0A

 

    2014:LDA #$03                 //切换到 03 页码

    2016:STA $00

  

    2018:LDA #$AA              //擦除闪存的代码,固定不变的

    201A:STA $D555

    201D:LDA #$55

    201F:STA $AAAA

    2022:LDA #$80

    2024:STA $D555

    2027:LDA #$AA

    2029:STA $D555

    202C:LDA #$55

    202E:STA $AAAA

   

    2031:LDA #$30            //把 30 送闪存块头地址,这里是擦除B000-B7FF,所以是 B000

    2033:STA $B000

   

    2036:LDA $C000          //这里也是固定的,注意和擦除 非闪存区 的不同

    2039:AND #$88

    203B:CMP #$88

    203D:BNE $2036

    203F:LDA #$F0

    2041:STA $C000

 

    2044:LDA #$1C             //擦除完毕,把 1C 送地址 18

    2046:STA $18

 

    2048:CLI                //恢复被保护的数据

    2049:PLA

    204A:STA $0D

    204C:PLA

    204D:STA $0A

    204F:PLA

    2050:STA $00

    2052:RTS

 

注:上面的程序在 NC1020的NCTOOLS中通过.