011:utilidades

Diferencias

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

Enlace a la vista de comparación

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