011:utilidades

¡Esta es una revisión vieja del documento!


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

Paco MARTIN y José Mario 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.

íe	org óeeee
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 23? ¡ '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	err0r6 rst 8
210	defb 5 ¡ 'number too big'
220	j
230	errora rst 3
240	defb 9 ; argumento invalido.
250	;
260	¡
270	errorb rst 8
280	defb 10 ; 'integer out of range'
290	i
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	i_d 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	j
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,c pres)
730	ld	< baud),de
740	pop	hl
750	inc	hl
760	ld	a, < hl)
770	cp
7s0	jp	nz,errora
7»0	inc	hl
800	ret
810	;
320	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
»80	ld	a,32
990 llena	ld	<de),a
1000	inc	de
1010	djnz llena
¡020	ret ¡030 ;
1040 sintax inc	hl
1050	ld	a,<hl>"
1060	cp 13
1070	jr	z,pprog
1080	cp	202 i 'line'
1090	jr	z,lprog
1100	cp 170 ¡ 'screens
1110	jr	z,spant
1120	cp 175 ¡ 'code'
1130	jr	z,code
i 140	JP	ERRORC
1150 i
1160 pprog	ret 1 1 70 ¡
1180 lprog	ret 1190 ¡
1200 spam-	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 ¡ 'screens
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
1 700	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	defu	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	defuj	1500
1960 cabec	defb	0
1970 dirt	defw	0
1980 lont	defw	0
  • 011/utilidades.1291405646.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel