Buenas de nuevo!!!
Por fin he conseguido hacer el borrado y la grabación
El problema venia por mi propia aplicación al intentar realizar la grabación de los datos. Existía un problema de sincronización entre la salida de la rutina de borrado/grabado y la ejecución del resto del programa, incluido el estado y orden de ejecución de las irqs.
Para averiguarlo he sacado la rutina completa a un programa aparte para ver si funcionaba, y resulta que el código corría correctamente.... Bueno he tenido que cambiar los registros en la invocación a la rutina open del kernal
El tema de la '
S' es con el código $53.
Aquí dejo la rutina completa, funciona correctamente
.pc = $2200
.const file_start = $25a6 // Inicio datos C64
.const file_end = $25b2
jsr loadprepare
// ** SCRATCH OLD FILE **
lda #fname_end-scratch
ldx #<scratch // XY ptr
ldy #>scratch
jsr K_setnam
lda #$01 // Logical
ldy #$0F // Secondary
ldx #8
jsr K_setlfs
jsr K_open
bcc noError2
sta errorLevel
inc ioError
lda #2
sta BORDER
noError2:
lda #$01 // Logical
jsr K_close
jsr K_clrchn
// ** SAVE NEW FILE **
jsr loadsetlfs
jsr loadsetnam
lda #<file_start // ZP ptr to start address
sta temp1
lda #>file_start
sta temp2
ldx #<file_end // XY = end address
ldy #>file_end
lda #temp1 // ZP ptr, 1st byte
jsr K_save
bcc noError3
sta errorLevel
inc ioError
noError3:
//jmp closeExit
// Close open file and return
closeExit:
lda #$01 // Logical
jsr K_close
jsr K_clrchn
jsr cargaMiZp
lda #$35 //desactivacion de las funciones Kernal
sta $01
lda #$01
sta $d01a //turn on raster irq.
cli
lda #1
sta BORDER
jmp *
// Prepare hardware for IO operation
loadprepare:
sei // Disable IRQ
lda #0
sta $d01a //turn off raster irq.
jsr grabaMiZp
jsr cargaZp
lda #$36 // Kernal on
sta $01
lda #0 // Reset rs 232
sta $02a1
sta $d404 // Sid silent
sta $d404+7
sta $d404+14
sta $9d // Disable KERNAL messages
sta ioError // Clear error return flag
rts
// SETLFS. Set file parameters.
// Input: A = Logical number// X = Device number// Y = Secondary address.
loadsetlfs:
lda #$01 // Logical
ldy #$00 // Secondary
loadsetlfs2:
ldx lastDevice
jmp K_setlfs
// SETNAM. Set file name parameters.
// Input: A = File name length// X/Y = Pointer to file name.
loadsetnam:
lda #fname_end-fname
ldx #<fname // XY ptr
ldy #>fname
jmp K_setnam
Unas ultimas aclaraciones:
Hay que guardar anteriormente la memoria de la pagina cero, por ejemplo nada mas arrancar el programa.
Antes de usar las rutinas kernal se restaura esa memoria anteriormente guardada, guardando la propia pagina cero de tu programa, para una vez llamadas las funciones del kernal restaurar de nuevo la pagina cero propia.
Todo esto, si tu programa usa la pagina cero claro.
Este vaivén de cargas y grabaciones de memoria es debido a que las rutinas del kernal usan la pagina cero.
Gracias a todos por sus comentarios