011:utilidades

¡Esta es una revisión vieja del documento!


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

FIXME

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. 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 apro- 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. 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 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. 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.1291398296.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel