011:utilidades

Microhobby 11. Año II, del 15 al 21 de enero de 1985

Paco Martín y José María Diaz

El bricolaje de los sistemas TURBO. Comandos nuevos y más veloces para su ordenador.

La forma más común utilizada por gran mayoría de los usuarios del ZX Spectrum para grabar y cargar sus programas es la cinta de cassette; este soporte, frente a su bajo costo y relativa fiabilidad, presenta el problema de la lentitud en la transferencia de información.

Por tanto, convendría que el usuario pudiera elegir la velocidad de transferencia casette-ordenador, es decir, SAVE/LOAD programar más deprisa o más despacio que el standard permitido por el propio sistema operativo del ordenador (la ROM).

Antes de entrar en detalles concretos tal vez sería conveniente recordar una serie de conceptos que nos vamos a ver obligados a utilizar a lo largo de este artículo.

La unidad básica del Spectrum para el tratamiento de la información es el «BYTE», es decir, un número binario que varía cíclicamente de 0 a 255; un byte está «compuesto» de 8 bits que tendremos que transferir al cassette o recibir de él.

Existen dos maneras de hacerlo: los ocho bits a la vez (en paralelo) o bit a bit hasta completar el byte de información (en serie).

El Spectrum emplea este último método, por lo que nos centraremos en la transmisión en serie.

Conviene manejar una magnitud que nos mida la velocidad de transferencia de información, para poder manipularla desde un programa; esta magnitud es el «BAUDIO» y representa el tiempo que tarda un BIT en transmitirse. La velocidad «de fábrica» del Spectrum es aproximadamente de unos 1.500 baudios, o sea, 1500/8 BYTES por segundo.

Nosotros hemos realizado un programa en lenguaje máquina cuyo límite inferior ronda los 800 baudios y cuyo límite superior alcanza 5000.

Es necesario aclarar que no todos los cassettes son iguales ni todos están preparados para recibir/transmitir a muy alta velocidad, así que tendrá que hacer algunas pruebas para encontrar la velocidad que se ajuste a su aparato.

El programa consta de dos grandes partes bien diferenciadas: la primera se encarga de la sintaxis de los nuevos comandos Basic que hemos construido al efecto; la segunda realiza el trabajo de SAVE/LOAD propiamente dicho. Por razones de espacio, nos centraremos en este número en la rutina de sintaxis, y en el próximo en la segunda parte.

Entre los diversos métodos conocidos para ampliar el BASIC del Spectrum, hemos elegido uno que funciona con o sin microdrive; para mayor sencillez, debe correrse la rutina en lenguaje máquina dentro de la propia línea de comandos, bien en modo directo o programa.

Los nuevos comandos tienen una sintaxis muy parecida a la original, excepto por la inclusión de la velocidad en BAUDIOS; por ejemplo, para realizar un SAVE habría que decir:

SAVE BAUDIOS; "NOMBRE"

donde BAUDIOS sería un número entre 800 y 5000 inclusive. Esta es la única modificación que hay que incluir en todas las órdenes de SAVE, LOAD, VERIFY y MERGE.

Para poner un ejemplo más concreto, supongamos que nuestra rutina en máquina está ensamblada en la dirección 60000 y queremos salvar un programa llamado “DEMO” desde el propio programa DEMO a 2500 baudios; escribiríamos:

10 RANDOMIZE USR 60000: REM SAVE 2500; "DEMO"

o sin número de línea. El REM es imprescindible ponerlo para que la rutina pueda funcionar.

El procedimiento seguido por la rutina máquina es muy sencillo: existe una variable del sistema localizada en la dirección 23645 cuyo contenido es la dirección del siguiente carácter a interpretar, para ver si es sintácticamente correcto. Tomamos este carácter y los siguientes para ver si responden a la secuencia elegida por nosotros; si es así, la sentencia se ejecuta, si no, mediante la rutina ROM «RST 8» presentamos en pantalla el mensaje de error adecuado.

Como nuestros lectores observarán, la sintaxis de los parámetros que siguen al comando CODE no está «controlada» en todos los casos por razones que se harán claras en los siguientes artículos.

La longitud del listado de esta parte del programa nos ha decidido a emplear el lenguaje ensamblador en aras de la claridad, pensando en aquellos que estén interesados en estudiar la estructura y funcionamiento del programa paso a paso, desarrollo que nosotros, una vez más por razones de espacio, no podemos realizar con el detalle que quisiéramos.

No obstante, publicaremos un programa Basic cargador para los lectores que no dispongan de ensamblador.

10		org 60000
20		ld hl,(23645)
30		inc hl
40		ld a, (hl)
50		cp 234 ; 'rem'
60		jr nz,errora
70		inc hl
80		ld a, (hl) 
90		cp 248 ; 'save'
100		jr z,tsave
110		cp 239 ; 'load'
120		jr z,tload
130		cp 214 ; 'verify'
140		jr z,tveryf
150		cp 213 ; 'merge'
160		jr z,tmerge
170		jr errora
180 ;
190 ;
200	error6	rst 8
210		defb 5 ; 'number too big'
220 ;
230	errora	rst 8
240		defb 9 ; 'argumento invalido'
250 ;
260 ;
270	errorb	rst 8
280		defb 10 ; 'integer out of range'
290 ;
300	errorc	rst 8
310		defb 11 ; 'nonsense in basic'
320 ;
330	errorf	rst 8
340		defb 14 ; 'invalid filename'
350	errorr	rst 8
360		defb 26 ; 'tape loading error'
370 ;
380	tmerge	call baudio
390		call name
400		inc hl
410		ld a, (hl)
420		cp	13
430		jr	nz,errorc
440		ret
450		;
460	tveryf	call baudio
470		call name
480		call nsint
490		ret
500	tsave	call baudio
510		call name
520		jr	c,errorf
530		call sintax
540		ret
550 ;
560	tload	call baudio
570		call name
530		call nsint
590		ret
600 ;
610	baudio	call numero
620		push hl
630		cp	"t"
640		jp	nz,errorc
650		ld	hl,799
660		sbc	hl,de
670		jp	nc,errorb
680		and	a
690		ld	hl,5000
700		sbc	hl,de
710		jp	c,err0r6
720		ld	de, (pres)
730		ld	(baud),de
740		pop	hl
750		inc	hl
760		ld	a, (hl)
770		cp	"""
780		jp	nz,errora
790		inc	hl
800		ret
810 ;
820	name	ld	b,10
830		ld	de,cabec+i
840	pname	ld	a,(hl)
850		cp	"""
860		jr	z,cmp
870		ld	(de),a
880		inc	hl
890		inc	de
900		djnz pname
910		ld	a,(hl)
920		cp	"""
930		ret	z
940		scf
950		ret
960	 cmp	ld	a,9
970		cp	b
980		ld	a,32
990	 llena	ld	(de),a
1000		inc	de
1010		djnz llena
1020		ret
1030 ;
1040	 sintax inc	hl
1050		ld	a,<hl>
1060		cp	13
1070		jr	z,pprog
1080		cp	202 ; 'line'
1090		jr	z,lprog
1100		cp 170 ; 'screen$'
1110		jr	z,spant
1120		cp 175 ; 'code'
1130		jr	z,code
1140		JP	ERRORC
1150 ;
1160	 pprog	ret
1170 ;
1180	 lprog	ret
1190 ;
1200	 spant	ret
1210 ;
1220	 code	call numero
1230		ld	(dirt),de
1240		call comdat
1250		ld	a,(hl)
1260		cp	","
1270		jp	nz,errorc
1280		call enum
1290		ld	(lont),de
1300		call comdat
1310		ret
1320 ;
1330	 comdat ld	a,d
1340		or	e
1350		ret	nz
1360		dec	hl
1370		ld	a, (hl)
¡330		cp	"0"
1390		jp	nz,errorc
1400		inc	hl
1410		ret
1420 ;
1430	 enum	call	numero
1440		cp	13
1450		jp	nz,errorc
1460		ret
1470 ;
1430	 nsint	inc	hl
1490		ld	a, (hl)
1500		cp	13
1510		ret	z
1520		cp	170 ; 'screen$'
1530		jr	z,spant
1540		cp	175 ; 'code'
1550		jr	z, lcode
1560		jp	errorc
1570		ret
1580 ;
1590	 lcode	ret
1600 ;
1610	 numero	ld	de,0
1620	 crnum	inc	hl
1630		ld	a,(hl)
1640		cp	58
1650		ret	nc
1660		cp	48
1670		ret	c
1680		sub	48
1690		push	hl
1700		ld	(pres),de
1710		ex	de,hl
1720		call	mult
1730		ld	d,0
1740		ld	e,a
1750		add	hl,de
1760		jp	c,errorb
1770		ex	de,hl
1780		pop	hl
1790		jr	crnum
1800 ;
1810	 pres	defw	0
1820 ;
1830	 mult	add	hl,hl
1840		jp	c,errorb
1850		ld	d,h
i860		ld	e,l
1870		add	hl,hl
1880		jp	c,errorb
1890		add	hl,hl
1900		jp	c,errorb
1910		add	hl,de
1920		jp	c,errorb
1930		ret
1940 ;
1950	 baud	defw	1500
1960	 cabec	defb	0
1970	 dirt	defw	0
1980	 lont	defw	0
  • 011/utilidades.txt
  • Última modificación: d/m/Y H:i
  • por miguel