Página 1 de 1

Acceso a FATWARE por software

Publicado: 08 Sep 2018, 13:31
por Bubu
¡Jarl, torpedos!

Hago una pregunta con mucho ware, jiji: ¿se puede acceder al Fatware desde el software? Uséase, ¿puedo hacer un pograma en ensamblador, de tal manera que mediante alguna instrucción OUT acceda a la tarjeta CF de un divIDE?
Lo pregunto porque se me ha ocurrido la siguiente paranoia: hacer un pograma en ensamblador que muestre una lista de juegos (la lista no la leería de la CF, sino que estaría embebida en el propio código fuente del pograma), y con los cursores me manejo, y al pulsar ENTER, cargo el TAP de ese juego. Sería algo así como sustituir el propio Fatware por un pograma que estaría en la misma CF.

Y la idea si se aplica al ResiDOS ya sería lo máximo: conseguiríamos visualizar los juegos con todos sus caracteres, y no sólo truncado a 8 caracteres.

¿Se puede?

Re: Acceso a FATWARE por software

Publicado: 13 Sep 2018, 16:35
por Kyp
Si se puede, el hardware del interfaz IDE es independiente del harware de mapeo de la RAM/ROM.
Por ejemplo, esto envía el comando IDENTIFY y lee los 512 bytes de respuesta del dispositivo:

Código: Seleccionar todo


ioData      equ   $a3   ; RW Data
ioDevice      equ   $bb   ; RW Drive/LBA bits 24 to 28
ioStatus      equ   $bf   ; R- Status
ioCommand   equ   $bf   ; -W Command
ioControl      equ   $e3   ; -W memory mapping control

ataDev0      equ   $a0   ; device 0 (master)
ataIdentify   equ   $ec   ; Identify device
ataSbReady   equ   6
ataSmFault   equ   $20   ; Device Fault
ataSmError   equ   $01   ; Error

ataBuffer      ds   512
;-------------------------------------------------------------------------------
Identify   ; read device identify data
;-------------------------------------------------------------------------------
; input   ataBuffer (buffer of 512 bytes to store identify data)
;-------------------------------------------------------------------------------
; output:   Z flag clear if error

.busy   in   a,(ioStatus)      ; wait while busy
      rlca
      jr   c,.busy

      ld   a,ataDev0         ; set device 0
      out   (ioDevice),a
      ld   a,ataIdentify      ; set command
      out   (ioCommand),a
      nop               ; 400 ns delay

.ready   in   a,(ioStatus)      ; wait until ready
      bit   ataSbReady,a
      jr   z,.ready
      and   ataSmFault|ataSmError
      ret   nz            ; ERROR

      ld   hl,ataBuffer      ; hl = data buffer
      ld   bc,ioData         ; b  = 0 (repeat 256 times), c = data port
      inir               ; read 256 bytes
      inir               ; read 256 bytes

      xor   a            ; SUCCESS
      ret


He hecho un poco de copy/paste de mi proyecto inacabado de firmware alternativo para el DivIDE, igual he copiado algo mal o me he dejado algo sin copiar pero para coger la idea creo que te vale. Toda la información la tienes en la web del DivIDE de velesoft.