011:utilidades

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
011:utilidades [d/m/Y H:i] – creado miguel011:utilidades [d/m/Y H:i] (actual) – [Utilidades: Carga y almacenamiento de programas con velocidad variable (I)] miguel
Línea 3: Línea 3:
 ===== Utilidades: Carga y almacenamiento de programas con velocidad variable (I) ===== ===== Utilidades: Carga y almacenamiento de programas con velocidad variable (I) =====
  
-FIXME+{{ :011:utilidades.jpg|}} 
 + 
 +--- //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).
  
-Paco MARTIN y José Mario DIAZ 
-El bricolaie 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 Habilidad, 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, SA-VE/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. 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. 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). 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. 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 apro- + 
-ximadamente de unos 1.500 baudios, o sea, 1500/8 BYTES por segundo.+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. 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. 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. 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. 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 SA-VE 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. +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: 
-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: +<code basic> 
-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.+SAVE BAUDIOS; "NOMBRE" 
 +</code> 
 + 
 +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: 
 + 
 +<code basic> 
 +10 RANDOMIZE USR 60000: REM SAVE 2500; "DEMO" 
 +</code> 
 + 
 +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. 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. 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 +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. 
-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. No obstante, publicaremos un programa Basic cargador para los lectores que no dispongan de ensamblador.
-íe org óeeee + 
-20 ld hl,(23645) +===== Listado ensamblador ===== 
-30 inc hl + 
-40 ld a,hl) +<code ASM> 
-50 cp 234 ¡ 'rem' +10 org 60000 
-60 jr nz,errora +20 ld hl,(23645) 
-70 inc hl +30 inc hl 
-80 ld a,hl) +40 ld a, (hl) 
-90 cp 248 ¡ 'save' +50 cp 234 'rem' 
-100 jr z.tsave +60 jr nz,errora 
-110 cp 23? ¡ 'load' +70 inc hl 
-120 jr z.tload +80 ld a, (hl)  
-130 cp 214 ¡ "verify' +90 cp 248 'save' 
-140 jr z.tveryf +100 jr z,tsave 
-150 cp 213 ¡ 'merge' +110 cp 239 ; 'load' 
-160 jr z,tmerge +120 jr z,tload 
-170 jr errora +130 cp 214 ; 'verify' 
-180 ; +140 jr z,tveryf 
-190 ¡ +150 cp 213 'merge' 
-200 err0r6 rst 8 +160 jr z,tmerge 
-210 defb 5 ¡ 'number too big' +170 jr errora 
-220 j +180 ; 
-230 errora rst 3 +190 ; 
-240 defb 9 ; argumento invalido. +200 error6 rst 8 
-250 ; +210 defb 5 'number too big' 
-260 ¡ +220 ; 
-270 errorb rst 8 +230 errora rst 8 
-280 defb 10 ; 'integer out of range' +240 defb 9 ; 'argumento invalido' 
-290 i +250 ; 
-300 errorc rst 8 +260 ; 
-310 defb 11 ¡ 'nonsense in basic' +270 errorb rst 8 
-320 ; +280 defb 10 ; 'integer out of range' 
-330 errorf rst 8 +290 ; 
-340 defb 14 ¡ 'invalid filename' +300 errorc rst 8 
-350 errorr rst 8 +310 defb 11 'nonsense in basic' 
-360 defb 26 ¡ 'tape loading error' +320 ; 
-370 ; +330 errorf rst 8 
-380 tmerge call baudio +340 defb 14 'invalid filename' 
-390 call name +350 errorr rst 8 
-400 inc hl +360 defb 26 'tape loading error' 
-410 i_d a, hl) +370 ; 
-420 cp 13 +380 tmerge call baudio 
-430 jr nz,errorc +390 call name 
-440 ret +400 inc hl 
-450 ; +410 ld a, (hl) 
-460 tveryf call baudio +420 cp 13 
-470 call name +430 jr nz,errorc 
-480 call nsint +440 ret 
-490 ret +450
-500 tsave call baudio +460 tveryf call baudio 
-510 call name +470 call name 
-520 jr c,errorf +480 call nsint 
-530 call sintax +490 ret 
-540 ret +500 tsave call baudio 
-550 j +510 call name 
-560 tload call baudio +520 jr c,errorf 
-570 call name +530 call sintax 
-530 call nsint +540 ret 
-590 ret +550 ; 
-600 ; +560 tload call baudio 
-610 baudio call numero +570 call name 
-620 push hl +530 call nsint 
-630 cp "t" +590 ret 
-640 jp nz,errorc +600 ; 
-650 ld hl,799 +610 baudio call numero 
-660 sbc hl,de +620 push hl 
-670 jp nc,errorb +630 cp "t" 
-680 and a +640 jp nz,errorc 
-690 ld hl,5000 +650 ld hl,799 
-700 sbc hl,de +660 sbc hl,de 
-710 jp c.err0r6 +670 jp nc,errorb 
-720 ld de,pres) +680 and a 
-730 ld baud),de +690 ld hl,5000 
-740 pop hl +700 sbc hl,de 
-750 inc hl +710 jp c,err0r6 
-760 ld a, hl) +720 ld de, (pres) 
-770 cp +730 ld (baud),de 
-7s0 jp nz,errora +740 pop hl 
-7»0 inc hl +750 inc hl 
-800 ret +760 ld a, (hl) 
-810 ; +770 cp """ 
-320 name ld b,10 +780 jp nz,errora 
-830 ld de,cabec*+790 inc hl 
-840 pname ld a,(hl) +800 ret 
-850 cp +810 ; 
-860 jr z.cmp +820 name ld b,10 
-870 ld de ),a +830 ld de,cabec+
-880 inc hl +840 pname ld a,(hl) 
-890 inc de +850 cp """ 
-900 djnz pname +860 jr z,cmp 
-910 ld a,(hl) +870 ld (de),a 
-920 cp +880 inc hl 
-930 ret z +890 inc de 
-940 scf +900 djnz pname 
-950 ret +910 ld a,(hl) 
-960 cmp ld a,+920 cp """ 
-970 cp b +930 ret z 
-»80 ld a,32 +940 scf 
-990 llena ld <de),a +950 ret 
-1000 inc de +960  cmp ld a,
-1010 djnz llena +970 cp b 
-¡020 ret ¡030 +980 ld a,32 
-1040 sintax inc hl +990  llena ld (de),a 
-1050 ld a,<hl>" +1000 inc de 
-1060 cp 13 +1010 djnz llena 
-1070 jr z,pprog +1020 ret 
-1080 cp 202 'line' +1030 
-1090 jr z,lprog +1040  sintax inc hl 
-1100 cp 170 ¡ 'screens +1050 ld a,<hl> 
-1110 jr z,spant +1060 cp 13 
-1120 cp 175 ¡ 'code' +1070 jr z,pprog 
-1130 jr z,code +1080 cp 202 'line' 
-i 140 JP ERRORC +1090 jr z,lprog 
-1150 i +1100 cp 170 ; 'screen$
-1160 pprog ret 1 1 70 ¡ +1110 jr z,spant 
-1180 lprog ret 1190 ¡ +1120 cp 175 'code' 
-1200 spam- ret 1210 ; +1130 jr z,code 
-1220 code call numero +1140 JP ERRORC 
-1230 ld <dirt),de +1150 ; 
-1240 call comdat +1160  pprog ret 
-1250 ld a,(hl) +1170 ; 
-1260 cp +1180  lprog ret 
-1270 jp nz,errorc +1190 ; 
-1280 call enum +1200  spant ret 
-1290 ld (lont).de +1210 ; 
-1300 call comdat +1220  code call numero 
-1310 ret 1320 ¡ +1230 ld (dirt),de 
-1330 comdat ld a,d +1240 call comdat 
-1340 or e +1250 ld a,(hl) 
-1350 ret nz +1260 cp "," 
-1360 dec hl +1270 jp nz,errorc 
-1370 ld a,hl) +1280 call enum 
-¡330 cp "0" +1290 ld (lont),de 
-1390 jp nz,errorc +1300 call comdat 
-1400 inc hl +1310 ret 
-1410 ret +1320 ; 
-1420 ¡ +1330  comdat ld a,d 
-1430 enum call numero +1340 or e 
-1440 cp 13 +1350 ret nz 
-1450 jp nz,errorc +1360 dec hl 
-1460 ret 1470 ; +1370 ld a, (hl) 
-1430 nsint inc hl +¡330 cp "0" 
-1490 ld a,hl) +1390 jp nz,errorc 
-1500 cp 13 +1400 inc hl 
-1510 ret z +1410 ret 
-1520 cp 170 ¡ 'screens +1420 ; 
-1530 jr z,spant +1430  enum call numero 
-1540 cp 175 ¡ 'code' +1440 cp 13 
-1550 jr. z, lcode +1450 jp nz,errorc 
-1560 jp errorc +1460 ret 
-1570 ret +1470 ; 
-1580 ¡ +1430  nsint inc hl 
-1590 lcode ret 1600 ; +1490 ld a, (hl) 
-1610 numero ld de,+1500 cp 13 
-1620 crnum inc hl +1510 ret z 
-1630 ld a,(hl) +1520 cp 170 ; 'screen$
-1640 cp 58 +1530 jr z,spant 
-1650 ret nc +1540 cp 175 'code' 
-1660 cp 48 +1550 jr z, lcode 
-1670 ret c +1560 jp errorc 
-1680 sub 48 +1570 ret 
-1690 push hl +1580 ; 
-1 700 ld pres),de +1590  lcode ret 
-1710 ex de,hl +1600 ; 
-1720 call mult +1610  numero ld de,
-1730 ld d,+1620  crnum inc hl 
-1740 ld e,+1630 ld a,(hl) 
-1750 add hl,de +1640 cp 58 
-1760 jp c,errorb +1650 ret nc 
-1770 ex de,hl +1660 cp 48 
-1780 pop hl +1670 ret c 
-1790 jr crnum • 1800 ; +1680 sub 48 
-1810 pres defu 0 1820 ; +1690 push hl 
-1830 mult add hl,hl +1700 ld (pres),de 
-1840 jp c,errorb +1710 ex de,hl 
-1850 ld d,+1720 call mult 
-i860 ld e,+1730 ld d,0 
-1870 add hl,hl +1740 ld e,a 
-1880 jp c,errorb +1750 add hl,de 
-1890 add hl,hl +1760 jp c,errorb 
-1900 jp c,errorb +1770 ex de,hl 
-1910 add hl,de +1780 pop hl 
-1920 jp c,errorb +1790 jr crnum 
-1930 ret 1940 ¡ +1800 ; 
-1950 baud defuj 1500 +1810  pres defw 0 
-1960 cabec defb 0 +1820 ; 
-1970 dirt defw 0 +1830  mult add hl,hl 
-1980 lont defw 0+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 
 +</code>
  • 011/utilidades.1291398296.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel