| 
 
注册时间2006-1-24最后登录1970-1-1 
 | 
 
 发表于 2007-2-24 02:56:30
|
显示全部楼层 
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;系统nor备份还原for nc2600
 INT:  .MACRO BRK_PARAM
 .DB $00
 .DW BRK_PARAM
 .ENDM
 .ORG $2010
 
 LDX #<MenuData
 LDY #>MenuData
 INT $CB03
 RTS
 MenuData:  .DB $09,$02
 .DW  _NorSave
 .DW  _MenuHelp
 .DW  _NorBack
 .DW  _MenuHelp
 .DB "1.备份系统Nor"
 .DB $FF
 .DB "2.还原系统Nor"
 .DB $FF,$FF
 _MenuHelp:   .DB "备份系统Nor:     备份系统Nor的$01页--$09页(共09页,故需 要288K+16K=304K的空 间,备份前请确认空间足够)到文件“/BASIC文件/N26.sys”中。  "
 .DB "还原系统Nor:      将文件“/BASIC文件/N26.sys”的内容覆盖系统Nor的$01页--$09页 (共09页),程序会自 动校正CheckSum值.另 "
 .DB "外,为减少对Nor 的擦写次数,内容不变的块(以2048个字节为单位)将不进行覆盖。    注意:          "
 .DB "1.运行本程序前请确定您的机器电量充足。  2.还原系统Nor前请确 定没有错误,误改系统Nor的后果可以很严重 的,特别是$01页,那 是通信部分的程序。  "
 .DB "***** 免责声明 *****如果因为程序错误,或误操作,稳定性等等原因造成的数据丢失或系统错误甚至硬件损坏,作者概不负责!请慎重!"
 .DB $00,$00
 _NorSave:  JSR _OpenDir
 BCC _NSL1
 INT $0312-2
 _NSL1:    JSR _WriteFileName
 JSR _READOPEN
 BCS _NSL2
 JSR _CoverOrNot
 CMP #$79
 BNE _NSL4
 INT $0517-1
 JMP _NSL2
 _NSL4:    INT $0517-1
 RTS
 _NSL2:    LDA $0A
 PHA
 LDA $00
 PHA
 JSR _MesSaving
 JSR _CREATEOPEN
 BCC _NSL3
 INT $0312-2
 _NSL3:    LDA #$01
 STA $92
 _NSL6:    LDA $92
 STA $90
 LDA #$40
 STA $91
 _NSL5:    LDA #$00
 STA $03F6
 JSR _SendNorToRam3000
 LDA #$00
 STA $E0-3
 LDA #$30
 STA $E1-3
 LDA #$00
 STA $08C6+$49
 LDA #$10
 STA $08C7+$49
 INT $0518-1
 BCC _WriteSuccess
 JMP _ErrorOut
 _WriteSuccess:
 jsr ShowWorking
 CLC
 LDA $91
 ADC #$10
 STA $91
 CMP #$C0
 BNE _NSL5
 INC $92
 LDA $92
 CMP #$0a  ;结束页
 BNE _NSL6
 INT $0517-1
 LDA #$00
 JSR _TISHI
 PLA
 STA $00
 PLA
 STA $0A
 RTS
 _NorBack:  JSR _OpenDir
 BCC _NBL1
 JMP _ErrorFile
 _NBL1:    JSR _WriteFileName
 JSR _READOPEN
 BCC _NBL2
 JMP _ErrorFile
 _NBL2:    JSR _BackOrNot
 CMP #$79
 BEQ _NBL3
 INT $0517-1
 RTS
 _NBL3:    JSR _MesBacking
 LDA $0A
 PHA
 LDA $00
 PHA
 LDA #$01
 STA $92
 _NBL6:    LDA $92
 STA $90
 LDA #$40
 STA $91
 _NBL5:    LDA #$00
 STA $03F6
 LDA #$00
 STA $E0-3
 LDA #$30
 STA $E1-3
 LDA #$00
 STA $08C6+$49
 LDA #$08
 STA $08C7+$49
 INT $0516-1
 JSR _CMPNorWith3000
 BCC _NBL4
 JSR WriteNor
 _NBL4:
 jsr ShowWorking
 CLC
 LDA $91
 ADC #$08
 STA $91
 CMP #$C0
 BNE _NBL5
 INC $92
 LDA $92
 CMP #$0a
 BNE _NBL6
 INT $0517-1
 JSR _CheckSum
 LDA #$01
 JSR _TISHI
 PLA
 STA $00
 PLA
 STA $0A
 RTS
 _ErrorFile:  LDA #$02
 JMP _TISHI
 ;将$3000-$37FF的内容与第$90页,第$91块的NOR内容进行比较,全部相同结果C=0,ELSE C=1
 _CMPNorWith3000
  DA $90 STA $00
 LDA #$10
 STA $0A
 LDA $91
 STA $81
 LDA #$00
 STA $80
 STA $82
 LDA #$30
 STA $83
 _CMPL1 :   LDY #$00
 _CMPL2 :  LDA ($80),Y
 CMP ($82),Y
 BNE _NotSame
 INY
 BNE _CMPL2
 INC $81
 INC $83
 LDA $81
 AND #$07
 BNE _CMPL1
 CLC
 RTS
 _NotSame :   SEC
 RTS
 ; _ _ _ _读打开文件
 _READOPEN:  LDA #$80
 STA $08C9+$49
 INT $0515-1
 RTS
 ; _ _ _ _新建打开文件
 _CREATEOPEN:  LDA #$70
 STA $08C9+$49
 LDA #$EF
 STA $08CA+$49
 STA $08CB+$49
 INT $0515-1
 RTS
 ; _ _ _ _写打开文件
 _WRITEOPEN:  LDA #$C0
 STA $08C9+$49
 INT $0515-1
 RTS
 _OpenDir:   LDX #$10
 LDA  _Dir-1,X
 STA $088C+$49,X
 .DB $CA,$D0,$F7
 JSR _OPENFOLDER
 RTS
 ; _打开文件夹,不存在则创建
 _OPENFOLDER:
 INT $050D
 BCC _OFOEND
 LDA $08CC+$49
 CMP #$02
 BNE _OFOL1
 INT $050B
 BCC _OPENFOLDER
 _OFOL1 :   SEC
 _OFOEND :   RTS
 _WriteFileName: LDX #$10
 LDA  _File-1,X
 STA $088C+$49,X
 .DB $CA,$D0,$F7
 RTS
 _MesBacking:   INT $C72A
 LDX#$14
 LDA  _BackMes-1,X
 STA $02E7,X
 .DB $CA,$D0,$F7
 INT $C719
 RTS
 _BackMes :   .DB "   正在还原...    "
 _MesSaving :  INT $C72A
 LDX #$14
 LDA  _SavMes-1,X
 STA $02E7,X
 .DB $CA,$D0,$F7
 INT $C719
 RTS
 _SavMes:  .DB "   正在备份...    "
 _ErrorOut:  INT $C72A
 LDX #$14
 LDA  _ErrMes-1,X
 STA $02E7,X
 .DB $CA,$D0,$F7
 INT $C719
 INT $0517-1
 INT $050E
 INT $C00A
 INT $0312-2
 _ErrMes:
 .DB "   写文件时出错   "
 ; **********8JSR _TISHI提示信息A提示序号
 _TTS:     .DB "备份成功还原成功文件错误"
 _TST:     .DB "      "
 .DB $00,$00
 _TSDB :   .DB $80
 .DW  _TST
 .DB $20,$19,$08,$02
 .DW  _TSDB +6
 _DTST :   .DW  _TSDB
 _TISHI:   ASL
 ASL
 ASL
 TAX
 LDY #$00
 _GTS :     LDA  _TTS ,X
 STA  _TST,Y
 INX
 INY
 CPY#$08
 BNE _GTS
 LDX _DTST
 LDY _DTST+1
 LDA #$00
 STA $0A32
 INT $CA12
 INT $C00A
 RTS
 _CoverOrNot:  LDX _QC
 LDY _QC+1
 LDA #$02
 INT $CA12
 RTS
 _QC :     .DW  _QuestCover
 _QuestCover:  .DB $80
 .DW  _TXTQC
 .DB $10,$09,$0E,$04
 .DW  _ADD02
 _ADD02 :   .DB $02
 _TXTQC :   .DB "  文件已存在,"
 .DB $00
 .DB "  确定覆盖?"
 .DB $00,$00
 _BackOrNot:   LDX _QB
 LDY _QB+1
 LDA #$02
 INT $CA12
 RTS
 _QB:     .DW  _QuestBack
 _QuestBack:   .DB $80
 .DW  _TXTQB
 .DB $10,$10,$0E,$02
 .DW  _ADD02
 _TXTQB:   .DB "  确认要还原?"
 .DB $00,$00
 _Dir:     .DB "/BASIC文件"
 .DB $00
 _File:     .DB "N26.sys"
 .DB $00
 
 ;************CheckSum*******************
 _CheckSum :
 LDA $0A
 AND #$70
 STA $0A
 LDX #$6F
 _GETSUB1 :   LDA $C398,X
 STA $0280,X
 DEX
 BPL _GETSUB1
 LDA #$60
 STA $02ED
 JSR $0280
 CLI
 LDA $0F0A
 EOR #$FF
 STA $0F0A
 LDA $0F0B
 EOR #$FF
 STA $0F0B
 LDA #$03
 STA $00
 LDA $BFF0
 STA $0F10
 LDA $BFF1
 STA $0F11
 LDA $0F0A
 CMP $0F10
 BNE _ChangeCS
 LDA $0F0B
 CMP $0F11
 BNE _ChangeCS
 _MainEnd :   RTS
 _ChangeCS :   LDA #$03
 STA $90
 LDA #$B8
 STA $91
 JSR _SendNorToRam3000
 LDA $0F0A
 STA $37F0
 LDA $0F0B
 STA $37F1
 LDA #$03
 STA $90
 LDA #$B8
 STA $91
 JSR WriteNor
 JMP _MainEnd
 ;将$90页的$91块(如$91=#$A0,则为$A000-$AFFF)Nor Flash发送到$3000-$3FFF
 _SendNorToRam3000:
 LDA $90
 STA $00
 LDA #$10
 STA $0A
 LDA $91
 STA $81
 LDA #$00
 STA $80
 STA $82
 LDA #$30
 STA $83
 _SNTRL1 :   LDY#$00
 _SNTRL2 :   LDA ($80),Y
 STA ($82),Y
 INY
 BNE _SNTRL2
 INC $81
 INC $83
 LDA $81
 AND #$0F
 BNE _SNTRL1
 RTS
 ;将$3000-$37FF这$800 字节写入$90页的$91块(如$91=#$A0,则为$A000-$A7FF)Nor Flash
 WriteNor:
 SEI
 lda $0435
 and #$fb
 sta $18
 LDA #$10
 STA $0A
 LDA $90
 STA $00
 LDA #$00
 STA $80
 LDA $91
 STA $81
 LDA #$AA
 STA $5555
 LDA #$55
 STA $AAAA
 LDA #$80
 STA $5555
 LDA #$AA
 STA $5555
 LDA #$55
 STA $AAAA
 LDY #$00
 LDA #$30
 STA ($80),Y
 WNORL1:
 NOP
 LDA $8000
 BPL WNORL1
 NOP
 AND #$08
 BEQ WNORL1
 LDA #$F0
 STA $8000
 ;上为擦
 LDA #$00
 STA $60
 LDA #$30
 STA $61
 LDY #$00
 
 WNORL6:   LDA ($60),Y
 cmp ($80),y
 beq WNORL4
 LDX #$AA
 STX $5555
 LDX #$55
 STX $AAAA
 LDX #$A0
 STX $5555
 STA ($80),Y
 WNORL5
 LDA $8000
 NOP
 BPL WNORL5
 AND #$08
 BEQ WNORL5
 LDA #$F0
 STA $8000
 LDA ($80),Y
 CMP ($60),Y
 BNE WNORL2
 WNORL4
 INY
 BNE WNORL6
 inc $61
 inc $81
 lda $61
 cmp #$38
 BNE WNORL6
 WNORL2:
 CLI
 RTS
 
 
 ShowWorking
 LDA $91
 PHA
 LDA $92
 pha
 LDA $40
 AND #$03
 TAX
 LDA ShowWorkingTxt,x
 STA $02f7
 INT $c719
 INC $40
 PLA
 STA $92
 PLA
 sta $91
 rts
 
 
 ShowWorkingTxt
 .db "/|\-"
 | 
 |