Spectrofon #03: Sistema: Guía de Programación en Ensamblador TR-DOS

┌───────────────────────────┐
│ ────── SISTEMA ────── │
└───────────────────────────┘

(c) Павел Никитин.

TRABAJO CON TR-DOS EN ASAMBLADOR
---------------------------
En este artículo, revisaremos algunos trucos para usar las funciones de TR-DOS al programar en ensamblador.

1. FORMATEO DE PISTA.

Muchos programadores consideran la operación de formateo de una pista un misterio. Sin embargo, formatear una pista de manera arbitraria no es tan complicado. Escriba el siguiente programa en algún ensamblador, y usted mismo se convencerá de esto:

ORG #EA60 ;Dirección de inicio (60000 en decimal)
DI ;Deshabilitar interrupciones
LD A,#8 ;Cargar el código de comando VG93
CALL ZAGR
LD A,#3C ;Código de lado (igual a #3C y #2C
;para el lado superior e inferior, respectivamente)
LD C,#00 ;Número de pista (en este caso la 0)
CALL SEARCH ;Llamar a la rutina de búsqueda de pista
CALL FORMAT ;Llamar a la rutina de formateo
CALL FORMAT ;(se recomienda llamar varias veces)
EI ;Habilitar interrupciones
RET ;Regresar a BASIC
ZAGR LD IX,#2FC3
JP TO_TRDS
SEARCH LD IX,#2F4D ;Dirección en ROM de TR-DOS
;rutina de búsqueda de pista
TO_TRDS PUSH IX ;Colocar en la pila la dirección de la rutina
JP #3D2F ;Salto por la pila a la ROM de TR-DOS

FORMAT LD HL,FRM_DAT ;Secuencia de procedimientos,
LD BC,#007F ;directamente
LD A,#F0 ;produciendo
LD IX,#2F57 ;formateo
PUSH IX
LD IX,#3FCA
PUSH IX
LD IX,#2FC3
JP TO_TRDS

No olvide que la rutina de formateo no es más que una escritura, solo que no de datos (sus programas, matrices, etc.), sino de bytes de información del sistema sobre este sector.

FRM_DAT - lista de tales bytes que describen el sector de esta pista.

FRM_DAT DEFS 50,#4E ;Primer espacio.
DEFS 12,#00
DEFS 03,#F5 ;Escritura de tres bytes #A1
;y inicialización de la suma de verificación.
DEFB #FE ;Etiqueta de dirección de los datos de índice,
;es decir, #FE "dice" a VG que a continuación
;vienen los datos de índice (sobre la pista, sector, etc.)
DEFB #NN ;Número de pista
DEFB #NN ;Número de lado
DEFB #NN ;Número de sector
DEFB #NN ;Longitud del sector (toma valores
;0,1,2,3 para la longitud correspondiente en bytes
;128,256,512,1024)
DEFB #F7 ;Escritura de dos bytes de suma de verificación
DEFS 22,#4E ;Segundo espacio
DEFS 12,#00
DEFS 03,#F5 ;Inicialización de la suma de verificación
DEFB #FB ;("dice" a VG que a continuación se escriben
;los datos de los cuales constan sus archivos)
DEFS NNNN,#00 ;Datos (el número #NNNN depende de
;la longitud del sector - respectivamente
;128, 256, 512, 1024 bytes)
DEFB #F7 ;Escritura de dos bytes de suma de verificación
DEFS 54,#4E

Para cada pista, debe componer tantas tablas FRM_DAT como sectores desee obtener en esta pista:

SECTOR1_FRM_DAT 1
SECTOR2_FRM_DAT 2
etc.

Pero hay que recordar que en una pista se puede escribir aproximadamente (16*256+128) bytes de información.

A continuación, se presenta una lista de los procedimientos principales de la ROM de TR-DOS utilizados en el formateo.

1) Al entrar, el registro A debe contener el código de comando. La rutina asegura la verificación del final del comando y realiza un retraso.

#2F57 OUT (#1F),A ;Carga en el registro de comando
;el número 8 del acumulador
#2F59 IN A,(#FF) ;Verificación del final del comando
AND #80
JR Z,#2F59
PUSH BC ;Guardar BC
CALL #3DFD ;Llamar a la subrutina de retraso
POP BC ;Restaurar BC
RET ;Regresar de la rutina

2) Carga en el registro de comando VG93 el número del acumulador

#2FC3 OUT (#1F),A
RET

3) Rutina interna
TR-DOS que realiza un retraso

#3DFD LD A,#50 ;Dos ciclos elementales
#3DFF LD C,#FF ;anidados,
#3E01 DEC C ;que aseguran
JR NZ,#3E01 ;el retraso
DEC A
JR NZ,#3DFF
RET

4) Al entrar, el registro A contiene el número para cargar el registro del sistema. El registro C contiene el número de la primera pista del archivo. La rutina asegura la carga del número de pista en el registro de datos, la ejecución del comando de posicionamiento de las cabezas del disco en la pista correcta, la verificación de la ejecución del comando y la realización de un retraso.

#2F4D OUT (#FF),A ;Carga del registro del sistema
;con el código del lado #3C o #2C
LD A,C ;Transferencia del número del registro C a A
OUT (#7F),A ;Carga del número de pista en el registro de datos
CALL #3DFD ;Llamar a la subrutina de retraso
LD A,18
OUT (#1F),A
#2F59 IN A,(#FF) ;Verificación del final del comando
AND #80
JR Z,#2F59
PUSH BC ;Guardar BC
CALL #3DFD ;Llamar a la subrutina de retraso
POP BC ;Restaurar BC
RET

5) Rutina que realiza la salida de información (escritura en disco).

#3FCA IN A,(#FF) ;Ciclo de espera
AND #C0
JR Z,#3FCA
RET M
OUTI ;Salida de información
JR #3FCA

Usando la rutina de formateo descrita, se puede poner una "etiqueta" en el disco, si se formatea la pista así: los primeros 16 sectores de forma estándar, y uno con número n>16 con un tamaño de 128 bytes.

Al copiar dicho disco, el copiador de pista "no notará" el último sector y no será copiado. La pista se puede probar fácilmente leyendo con la rutina estándar de TR-DOS:

LD B,1 ;Número de sectores a leer.
LD C,5 ;Código de comando de lectura de grupo de sectores.
LD D,TREK ;Número de pista.
LD E,SECTOR ;Número de sector.
LD HL,ADDR ;Dirección de colocación del sector leído.
CALL #3D13 ;Punto de entrada grupal de las rutinas de TR-DOS.
RET

2. CONTROLADOR DE LECTURA DESDE EL DISCO, QUE NO REQUIERE VARIABLES DEL SISTEMA TR-DOS.

Muchos juegos, especialmente los de múltiples niveles, no siempre se adaptan bien a la disquetización utilizando la rutina estándar de carga de TR-DOS, ya que en este caso es necesario restaurar las variables del sistema TR-DOS, asignar un búfer, etc.

A continuación se presenta un controlador de lectura sector por sector del disco, que, si se utiliza hábilmente, hará que la carga desde el disco parezca menos dolorosa para el programa, ya que el controlador no necesita variables del sistema y un búfer adicional para la lectura, no hay problemas con las interrupciones.

Parámetros de entrada:

HL - dirección de carga en memoria;
DE - pista y sector inicial;
B - número de sectores.

CARGADOR DI ; Deshabilitar interrupciones.
NXTT PUSH BC ; Guardar BC.
PUSH DE ; --//-- DE.
LD A,D ; Determinar el número físico
OR A ; de la pista y lado.
RRA
LD C,A
LD A,#3C ; #3C - código del lado cero.
JR NC,SIDE ; Salto para establecer el lado.
LD A,#2C ; #2C - código del primer lado.
SIDE LD IX,#2F4D ; Llamar a la rutina de establecimiento de lado.
CALL TO_TRDS
POP DE ; Restaurar DE.
POP BC ; --//-- BC.

CONT PUSH BC
PUSH DE
LD IX,#2F1B
CALL TO_TRDS ; Lectura directa del sector.
POP DE
INC H
INC E
BIT 4,E ; Si el sector ha superado el 15,
JR Z,NXTS ; se convierte en 0, y la pista
LD E,#00 ; se incrementa en uno.
INC D
POP BC
DJNZ NXTT
RET
NXTS POP BC
DJNZ CONT
TO_TRDS PUSH IX ; Llamar a la rutina de TR-DOS
JP #3D2F

EJEMPLO DE USO:

LD HL,#6000 ;Lectura del catálogo del disco
LD DE,#0000 ;en la dirección #6000.
LD B,#9
CALL CARGADOR
EI
RET

Al usar este controlador, hay que recordar que los errores de lectura desde el disco no se manejan. Si la longitud del bloque cargado no es múltiplo de 256, sin medidas especiales se perderá 1

Contenido de la publicación: Spectrofon #03

  • Экспертиза
    Revisión crítica del juego estratégico 'GENGHIS KHAN' por su falta de precisión histórica y geográfica. Proporciona mecánicas de juego y consejos estratégicos, incluidas misiones únicas. Discute características como la gestión del ejército y la recolección de elementos mágicos.
  • Дебют
    El artículo reseña el juego 'ZZZZ' de MASTERTRONIC, destacando su innovador interfaz que combina comandos de texto e iconos para facilitar el juego. A pesar de algunos defectos en el interfaz, se elogia el humor y los elementos narrativos únicos del juego. Se ofrece una guía detallada del escenario inicial del juego.
  • Дебют
    Reseña del juego Castle Master de INCENTIVE, centrada en sus gráficos 3D y mecánicas de juego en el ZX Spectrum. El jugador navega un laberinto para rescatar a un amante secuestrado, combatiendo fantasmas y recogiendo tesoros. Se proporcionan controles detallados y consejos de juego.
  • Экзамен
    El artículo presenta una pregunta desafiante sobre el juego 'CASTLE MASTER'. El premio por la respuesta correcta es un ejemplar sin derechos de autor de 'SPECTROFON'. La revista busca respuestas a las preguntas de números anteriores.
  • Обзор
    Discusión sobre la rivalidad entre usuarios de Spectrum y Amiga. Resumen de nuevos juegos compatibles con Spectrum y sus características. Perspectiva sobre la cultura hacker y su influencia en los juegos.
  • С миру по биту
    Discusión sobre comentarios de los lectores sobre el programa ABS y la distribución de revistas. Explicación de la integración del programa ABS y los desafíos en la creación de juegos. Consideraciones sobre el contenido de la revista y sugerencias de los lectores.
  • Архив
    Reseña del juego retro 'GREAT BRITAIN LTD', destacando su papel estratégico como Primer Ministro del Reino Unido en los años 80, enfocándose en política, economía y elecciones.
  • Система - Павел Никитин
    Guía detallada sobre el uso de funciones TR-DOS en ensamblador para ZX Spectrum. Enfoque en el formateo de pistas y un controlador de lectura de disco sin variables del sistema TR-DOS. Incluye ejemplos de código y consejos prácticos.
  • Реклама
    El artículo proporciona información sobre cómo adquirir la revista 'SPECTROFON', invitaciones para colaborar y diversas ofertas de hardware.