📄 s12sermon2r1.dbg
字号:
;* Eeprom erasure assumes no protection. (Mass command will fail)
;*********************************************************************
EraseEECmd: jsr abClr ;abort commands and clear errors
brclr MEMSIZ0,eep_sw1+eep_sw0,ErsPageErr1 ;Check if device has EEprom
ldy #EEpromStart ; get device eeprom start
std 0,y ; write to eeprom (latch address)
; data is don't care (but needed)
movb #$41,ECMD ;mass erase command
movb #CBEIF,ESTAT ;register the command
nop ; wait a few cycles for
nop ; command to sync.
nop
ChkDoneE: ldaa ESTAT ;wait for CBEIF=CCIF=1 (cmnd done)
bpl ChkDoneE ;loop if command buffer full (busy)
asla ;moves CCIF to MSB (set/clear N bit)
bpl ChkDoneE ;loop if CCIF=0 (not done)
ldaa FSTAT
anda #$30 ;mask all but PVIOL or ACCERR
bne ErsPageErr1 ;back to prompt-flash error
ldaa #ErrNone ;code for no errors ($E0)
jmp Prompt ;ready for next command
ErsPageErr1: ldaa #ErrEeErase ;Erase error code ($E9)
jmp Prompt ;ready for next command
;*********************************************************************
;* Erase Command - Use repeated page erase commands to erase all flash
;* except bootloader in protected block at the end of flash, and mass
;* erase all EEPROM locations
;*
;* Eeprom erasure assumes no protection. (Mass command will fail)
;*********************************************************************
EraseAllCmd: jsr abClr ;abort commands and clear errors
brclr MEMSIZ0,eep_sw1+eep_sw0,ErsBlk0 ;Check if device has EEprom
ldy #EEpromStart ; get device eeprom start
std 0,y ; write to eeprom (latch address)
; data is don't care (but needed)
movb #MassErase,ECMD ;mass erase command
movb #CBEIF,ESTAT ;register the command
nop ; wait a few cycles for
nop ; command to sync.
nop
ChkDoneE1: ldaa ESTAT ;wait for CBEIF=CCIF=1 (cmnd done)
bpl ChkDoneE1 ;loop if command buffer full (busy)
asla ;moves CCIF to MSB (set/clear N bit)
bpl ChkDoneE1 ;loop if CCIF=0 (not done)
;
; erase flash pages from RomStart to start of protected bootloader
; no need to check for errors because we cleared them before EE erase
;
ErsBlk0: ; sector erase all full blocks
ldab #PagesBlk ; Get number of banks/blocks
decb ; erase all but last
stab 1,-sp ; save counter
ldaa #$3f ; highest bank
sba ; Compute lowest page-1
staa PPAGE ; PPAGE for first 16K page of block 0
; (passed in the A accumulator).
clr FCNFG ; set block select bits to 0.
ErsBlk0Lp: ldx #SectorSize ; select sector size
ldd #$4000 ; Window size
idiv ; compute total number of sectors
tfr x,d ; get number of sectors in B
ldx #Window ; point to the start of the PPAGE window.
bsr ErsSectors ; go erase the PPAGE window a sector at a time.
inc PPAGE ; go to the next PPAGE.
dec 0,sp ; done with all full PPAGE blocks?
bne ErsBlk0Lp ; no? then erase more blocks.
ldx #SectorSize ; select sector size
ldd #((BootStart-$c000)) ; get size - protected amount
idiv ; compute total number of sectors
; minus the bootblock.
tfr x,d ; get number of sectors in B
ldx #Window ; point to the start of the PPAGE window.
bsr ErsSectors ; go erase the PPAGE window a sector at a time.
pulb ; remove the page count from the stack.
; erase all sectors outside the bootblock.
;
;********************************************************************
;bulk erase all the rest
;********************************************************************
ldab #FlashBlks ; select lowest page of the highest bank
decb ;
beq EraseDone ; if single block device quit
ldab #LowestPage ; select lowest bank
BlockLoop: stab PPAGE ; must match array selection
lsrb ; calculate the value of the block select bits based
lsrb ; on bits 3:2 of the PPAGE register value. (<256k)
ldy #SectorSize ; get high byte of size
cpy #$0200 ; if larger than $200 shift again
beq nBlockLoop ; otherwise skip ahead
lsrb ; on bits 4:3 of the PPAGE register value. (512k)
nBlockLoop: comb
andb #$03 ; mask off all but the lower 2 bits.
stab FCNFG ; select the block to erase.
bsr BulkErase ; erase it
ldab PPAGE ;get ppage back
addb #PagesBlk ;
cmpb #($3F-PagesBlk) ; see if last block
bmi BlockLoop
EraseDone: movb #$3D,PPAGE ;select bank in array0
OkCommand: jmp CommandOK ;back to no error and prompt
BulkErase: pshx ;save address
ldx #Window ;must point into bank
staa ,x ;latch address to erase
movb #MassErase,FCMD ; Select mass erase
movb #CBEIF,FSTAT ;register the command
nop ;wait a few cycles for
nop ;command to sync.
nop
ChkDoneF: ldaa FSTAT ;wait for CBEIF=CCIF=1 (cmnd done)
bpl ChkDoneF ;loop if command buffer full (busy)
asla ;moves CCIF to MSB (set/clear N bit)
bpl ChkDoneF ;loop if CCIF=0 (not done)
pulx ;get address back
rts
;Erase 'b' (accumulator) sectors beginning at address 'x' (index register)
;
ErsSectors: exg b,y ;put the sector count in y.
ErsSectLp: std ,x
movb #SecErase,FCMD ;perform a sector erase.
jsr DoOnStack ;finish command from stack-based sub
tsta ;check for 0=OK
bne ErsSectErr ;back to prompt-flash erase error
leax SectorSize,x ;point to the next sector.
dbne y,ErsSectLp ;continue to erase remaining sectors.
rts
ErsSectErr: puld ; clear stack
bra ErsPageErr
ErsPage: jsr abClr ; abort commands and clear errors
ldab PPAGE ; get current ppage
lsrb ; calculate the value of the block select bits based
lsrb ; on bits 3:2 of the PPAGE register value. (<256k)
ldy #SectorSize ; get high byte of size
cpy #$0200 ; if larger than $200 shift again
beq ErsPage1 ; otherwise skip ahead
lsrb ; on bits 4:3 of the PPAGE register value. (512k)
ErsPage1: comb
andb #$03 ; mask off all but the lower 2 bits.
stab FCNFG ; select the block to erase.
ldab PPAGE ; get current ppage
cmpb #$3F ; is it the page with the monitor
bne ErsFullPage ; no then erase all of page
ldx #SectorSize ; select sector size
ldd #((BootStart-$c000)) ; get size - protected amount
idiv ; compute total number of sectors
; minus the bootblock.
tfr x,d ; get number of sectors in B
ldx #Window ; point to the start of the PPAGE window.
bsr ErsSectors ; go erase the PPAGE window a sector at a time.
bra EraPageStat ; back to no error and prompt
ErsFullPage: ldx #SectorSize ; select sector size
ldd #$4000 ; Window size
idiv ; compute total number of sectors
tfr x,d ; get number of sectors in B
ldx #Window ; point to the start of the PPAGE window.
bsr ErsSectors ; go erase the PPAGE window a sector at a time.
bra EraPageStat ;back to no error and prompt
EraPageStat: ldaa FSTAT
anda #$30 ;mask all but PVIOL or ACCERR
bne ErsPageErr ;back to prompt-flash error
ldaa #ErrNone ;code for no errors ($E0)
jmp Prompt ;ready for next command
ErsPageErr: ldaa #ErrFlash ;code for Flash error ($E6)
jmp Prompt ;ready for next command
;*********************************************************************
;* Read Byte Command - read specified address and return the data
;* 8-bit command code from host to SCI0 RxD
;* 16-bit address (high byte first) from host to SCI0 RxD
;* 8-bit data sent back to host through SCI0 TxD
;*********************************************************************
RdByteCmd: jsr getX ;get address to read from
ldaa ,x ;read the requested location
jsr PutChar ;send it out SCI0
jmp CommandOK ;ready for next command
;*********************************************************************
;* Read Word Command - read specified block of data
;* 8-bit command code from host to SCI0 RxD
;* 16-bit address (high byte first) from host to SCI0 RxD
;* 16-bit number sent back to host through SCI0 TxD
;* Special case of block read.
;*********************************************************************
RdWordCmd: jsr getX ;get address to read from
sendExit: ldd ,x ;read the requested location
jsr PutChar ;send it out SCI0
tba
jsr PutChar ;send it out SCI0
jmp CommandOK ;ready for next command
;*********************************************************************
;* Read Command - read specified block of data
;* 8-bit command code from host to SCI0 RxD
;* 16-bit address (high byte first) from host to SCI0 RxD
;* 8-bit number of bytes-1 to sent back to host through SCI0 TxD
;*********************************************************************
ReadCmd: jsr getX ;get address to read from
jsr GetChar ;get number of bytes to read
tab
incb ;correct counter (0 is actually 1)
ReadNext: ldaa ,x ;read the requested location
jsr PutChar ;send it out SCI0
inx
decb
bne ReadNext
ldaa #ErrNone ;code for no errors ($E0)
xPrompt: jmp Prompt ;ready for next command
;*********************************************************************
;* Write Command - write specified block of data
;* 8-bit command code from host to SCI0 RxD
;* 16-bit address (high byte first) from host to SCI0 RxD
;* 8-bit number of bytes-1 to write from host to SCI0 TxD
;* 8-bit values to write
;* this function used Word writes whenever possible. This is:
;* a) when more than one byte is still to write
;* b) and the address is even
;*********************************************************************
WriteCmd: jsr getX ;get address to write to
jsr GetChar ;get number of bytes to read
tab
incb ;correct counter (0 is actually 1)
WriteNext: cmpb #1 ;if only one byte left
pshb ;preserve byte counter
beq WriteByte ;write it
tfr x,a ;is address odd
bita #1
bne WriteByte ;write a byte first
WriteWord: jsr GetChar ;get high byte
tab ;save in B
dec ,sp ;decrement byte counter (on stack)
jsr GetChar ;get low byte
exg a,b ;flip high and low byte
jsr WriteD2IX ;write or program data to address
pulb ;restore byte counter
bne WriteError ;error detected
inx ;increment target address
bra Write1
WriteByte: jsr GetChar ;get data to write
jsr WriteA2IX ;write or program data to address
pulb ;restore byte counter
bne WriteError ;error detected
Write1: inx ;increment target address
decb ;decrement byte counter
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -