//内核区闪存的擦除
对于想修改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中通过.