![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| On 13 mayo, 13:16, Pepe Pérez wrote: > pues me quito el sombrero y aplaudo toda tu explicación :-) Como diría el señor Lobo, "dejemos de ..." :P > De todas formas, si me permites y por "acotar" un poco más esto, creo que lo > que me ha despistado -y me parece que a Gandulf también- es esto: > > 23735 VECTOR Address used to extend the Basic interpreter > > que por ejemplo aparece mencionado aquí:http://www.users.globalnet.co.uk/~jg...01/yr01_71.htm > o lo que es peor, incluso aquí:http://www.worldofspectrum.org/faq/r...eripherals.htm Es que es correcto. Mira lo que pone al principio: http://www.users.globalnet.co.uk/~jg...01/yr01_71.htm SYSTEM VARIABLES The Microdrive, LAN and RS232 software uses more system variables; these are described as follows: http://www.worldofspectrum.org/faq/r...eripherals.htm ZX Interface I The ZX Interface I allows up to 8 ZX Microdrives to be connected to a single ZX Spectrum, features an RS-232 port, and provides networking facilities that allow up to 255 machines to directly communicate with each other. Sinclair BASIC includes commands to access the features of the ZX Interface I and the ZX Microdrive. The following system variables are used in addition to those specified for the standard machine: Están hablando de las variables del sistema de un Spectrum que tiene conectado un Interface I. Como he puesto en mi explicación esos valores son válidos para un Spectrum 48k (no estoy seguro de si también los 128k) sin nada conectado. Cuando conectas el Interface I el sistema operativo del Spectrum es extendido y la zona de variables del sistema crece empujando a la zona de canales hacia direcciones de memoria superiores (por eso está apuntada por la variable del sistema CHANS y no es una dirección fija, como todo lo que está situado por encima de la dirección de VARS). Si te lees toda la tabla de variables que dan en los enlaces que has puesto verás que al final pone: 23792 Start of Microdrive MAPs or CHANS Ahora en vez de empezar en la 23734 empiezan en la 23792, 58 bytes más arriba. Eso si no hay ningín Microdrive conectado, en cuyo caso se insertarán ahí los mapas del Microdrive y la dirección apuntada por CHANS aumentará en consecuencia. En este caso entonces, los pokes mágicos serían en direcciones 58 bytes mayores. Para que funcionase siempre lo que habría que hacer es: POKE PEEK 23631+ 256 * PEEK 23632 + 2, 181 Es decir, coger la dirección apuntada por CHANS (23631) y sumarle 2. > POKE 23736,0:POKE 23737,0:SAVE "xx" > > si que se produce el reset esperado... es más, da tiempo a ver perfectamente > como se imprime el mensaje "Start tape, then press any key" y justo luego, > sin esperar realmente a que se pulse la tecla se produce el reset. > > Es más, esto me hace pensar que se podría incluso afinar más y esto que > dices:> Luego espera a que se pulse una tecla y llama a la dirección de > > memoria PEEK 23736+256*PEEK 23737 > no es estrictamente cierto Tienes razón, esta parte no me quedó muy clara. A ver si a la segunda (voy a escribir esto de memoria, sin comprobarlo mucho)... Partamos de que está todo preparado por la rutina del SAVE para iniciar a guardar los datos y está ansiosa por comunicárnoslo. Primero le dice al sistema operativo (o más bien habría que llamarlo programa monitor, pero lo voy a dejar en s.o.) que selecciona el canal "K" como canal de entrada/salida, por lo que el s.o. se va a la tabla de canales apuntada por CHANS y busca una "K" para copiar las direcciones de los flujos (streams) que tiene asociados a otra variable del sistema llamada STRMS junto con otros datos (la explicación está en el articulo de la MH que puse). Después prepara el mensaje de error a imprimir en la parte inferior de la pantalla y dice que quiere imprimirlo (llama a la función generica de salida). Entonces (la función genérica de salida) coge la dirección de salida que se ha apuntado en STRMS y la utiliza para irla llamando sucesivamente con los caracteres a imprimir uno a uno en el registro A (acumulador) del microprocesador. Luego dice que quiere una tecla (llama a la función genérica de entrada). Para eso (la función genérica de entrada) coge la dirección de entrada que tiene apuntada en STRMS y llama a la función para que le devuelva en el registro A del acumulador el código ASCII de la tecla que se pulse a continuación. En condiciones normales, la función de entrada va devolviendo ceros y la rutina de SAVE vuelve a insistir hasta que recibe un valor distinto de cero como valor de la tecla pulsada. Cuando utilizamos el POKE hacemos trampas y cogemos directamente el valor de la última tecla que se pulsó (que será, por ejemplo, el ENTER de después de introducir el comando), que afortunadamente siempre se guarda el s.o. en la variable del sistema LASTK y por tanto nunca será cero (sólo sería cero si acabamos de encender el ordenador, pero entonces ¿como hemos metido el SAVE?¿No hemos escrito un LOAD""?¿Un RUN quizás?). Así pues al primer intento recibe un valor distinto de cero y la rutina de SAVE sigue con su rollo. > -por favor, perdóname si con esto te parece que > estoy criticando lo que has explicado o que no lo valoro, al contrario, > como ya he dicho, me ha parecido genial, pero como 25 años después ya > tenemos tiempo de afinar, por eso lo digo- No hay nada que perdonar. Precisamente los foros y las news están para este tipo de cosas. Offtopicazo: nos reunimos aquí (o allí) para compartir y aprender, y en nuestras manos siempre está el hacer buen uso de ello. Tanto si eres activo aportando información, como si eres pasivo eligiendo lo que quieres leer y lo que no. > El caso es que a mi me parece que en primer lugar se pone el mensaje y > _luego_ es cuando se llama a PEEK 23736+256*PEEK 23737 (es decir, _antes_ > de esperar a que se pulse la tecla y _no_luego) -por eso precisamente da > tiempo a ver el mensaje antes del reset- Creo que por lo que te da tiempo a leer el mensaje es porque el reset se toma su tiempo en borrar la pantalla. Aunque sólo corra a 3MHz, el Spectrum es más rápido que el ojo ![]() Pero tienes razón: primero escribe el mensaje y después se va a buscar una tecla. Hacerlo al revés no tiene sentido ![]() > En fin, de nuevo agradezco a todos el haber aclarado esto y que conste que > he disfrutado como "un enano" ;-) Ya te digo. El disfrute ha sido mútuo. > Un saludo. A mandar. |
| | ||||
| ||||
| |
| |||
| Como me aburro en el curro (menos mal que en Madrid es como si fuese jueves)... FE DE ERRATAS Veamos el trozo de la rutina de SAVE que se encarga de estos menesteres: (de http://www.wearmouth.demon.co.uk/zx82.htm) ;; SA-CONTRL L0970: PUSH HL ; save start of data LD A,$FD ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN XOR A ; clear to address table directly LD DE,L09A1 ; address: tape-msgs CALL L0C0A ; routine PO-MSG - ; 'Start tape then press any key.' SET 5,(IY+$02) ; TV_FLAG - Signal lower screen requires ; clearing CALL L15D4 ; routine WAIT-KEY Tiene una errata: LD A,$FD ; select system channel 'S' Mejor cogemos la que aloja el World of Spectrum: ftp://ftp.worldofspectrum.org/pub/si...ssemblyThe.txt 0970 SA-CONTRL PUSH HL Save the 'pointer'. LD A,+FD Ensure that channel 'K' CALL 1601,CHAN-OPEN is open. XOR A Signal 'first message'. LD DE,+09A1 Print the message - 'Start tape, CALL 0C0A,PO-MSG then press any key.'. SET 5,(TV-FLAG) Signal 'screen will require to be cleared'. CALL 15D4,WAIT-KEY Wait for a key to be pressed. > En condiciones normales, la función de entrada va devolviendo ceros y > la rutina de SAVE vuelve a insistir hasta que recibe un valor distinto > de cero como valor de la tecla pulsada. En realidad la propia rutina de SAVE no comprueba si se ha pulsado una tecla, se lo deja a la rutina WAIT-KEY. > (por eso está apuntada por la variable del sistema CHANS y no es una > dirección fija, como todo lo que está situado por encima de la > dirección de VARS). En realidad quería haber escrito "...todo lo que está situado por encima de la dirección de inicio de las variables del sistema).". Y seguro que hay más, pero el jefe ya me está mirando... |
| |||
| Como me aburro en el curro (menos mal que en Madrid es como si fuese jueves)... FE DE ERRATAS Veamos el trozo de la rutina de SAVE que se encarga de estos menesteres: (de http://www.wearmouth.demon.co.uk/zx82.htm) ;; SA-CONTRL L0970: PUSH HL ; save start of data LD A,$FD ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN XOR A ; clear to address table directly LD DE,L09A1 ; address: tape-msgs CALL L0C0A ; routine PO-MSG - ; 'Start tape then press any key.' SET 5,(IY+$02) ; TV_FLAG - Signal lower screen requires ; clearing CALL L15D4 ; routine WAIT-KEY Tiene una errata: LD A,$FD ; select system channel 'S' Mejor cogemos la que aloja el World of Spectrum: ftp://ftp.worldofspectrum.org/pub/si...ssemblyThe.txt 0970 SA-CONTRL PUSH HL Save the 'pointer'. LD A,+FD Ensure that channel 'K' CALL 1601,CHAN-OPEN is open. XOR A Signal 'first message'. LD DE,+09A1 Print the message - 'Start tape, CALL 0C0A,PO-MSG then press any key.'. SET 5,(TV-FLAG) Signal 'screen will require to be cleared'. CALL 15D4,WAIT-KEY Wait for a key to be pressed. > En condiciones normales, la función de entrada va devolviendo ceros y > la rutina de SAVE vuelve a insistir hasta que recibe un valor distinto > de cero como valor de la tecla pulsada. En realidad la propia rutina de SAVE no comprueba si se ha pulsado una tecla, se lo deja a la rutina WAIT-KEY. > (por eso está apuntada por la variable del sistema CHANS y no es una > dirección fija, como todo lo que está situado por encima de la > dirección de VARS). En realidad quería haber escrito "...todo lo que está situado por encima de la dirección de inicio de las variables del sistema).". Y seguro que hay más, pero el jefe ya me está mirando... |
| |||
| Como me aburro en el curro (menos mal que en Madrid es como si fuese jueves)... FE DE ERRATAS Veamos el trozo de la rutina de SAVE que se encarga de estos menesteres: (de http://www.wearmouth.demon.co.uk/zx82.htm) ;; SA-CONTRL L0970: PUSH HL ; save start of data LD A,$FD ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN XOR A ; clear to address table directly LD DE,L09A1 ; address: tape-msgs CALL L0C0A ; routine PO-MSG - ; 'Start tape then press any key.' SET 5,(IY+$02) ; TV_FLAG - Signal lower screen requires ; clearing CALL L15D4 ; routine WAIT-KEY Tiene una errata: LD A,$FD ; select system channel 'S' Mejor cogemos la que aloja el World of Spectrum: ftp://ftp.worldofspectrum.org/pub/si...ssemblyThe.txt 0970 SA-CONTRL PUSH HL Save the 'pointer'. LD A,+FD Ensure that channel 'K' CALL 1601,CHAN-OPEN is open. XOR A Signal 'first message'. LD DE,+09A1 Print the message - 'Start tape, CALL 0C0A,PO-MSG then press any key.'. SET 5,(TV-FLAG) Signal 'screen will require to be cleared'. CALL 15D4,WAIT-KEY Wait for a key to be pressed. > En condiciones normales, la función de entrada va devolviendo ceros y > la rutina de SAVE vuelve a insistir hasta que recibe un valor distinto > de cero como valor de la tecla pulsada. En realidad la propia rutina de SAVE no comprueba si se ha pulsado una tecla, se lo deja a la rutina WAIT-KEY. > (por eso está apuntada por la variable del sistema CHANS y no es una > dirección fija, como todo lo que está situado por encima de la > dirección de VARS). En realidad quería haber escrito "...todo lo que está situado por encima de la dirección de inicio de las variables del sistema).". Y seguro que hay más, pero el jefe ya me está mirando... |
| |||
| Como me aburro en el curro (menos mal que en Madrid es como si fuese jueves)... FE DE ERRATAS Veamos el trozo de la rutina de SAVE que se encarga de estos menesteres: (de http://www.wearmouth.demon.co.uk/zx82.htm) ;; SA-CONTRL L0970: PUSH HL ; save start of data LD A,$FD ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN XOR A ; clear to address table directly LD DE,L09A1 ; address: tape-msgs CALL L0C0A ; routine PO-MSG - ; 'Start tape then press any key.' SET 5,(IY+$02) ; TV_FLAG - Signal lower screen requires ; clearing CALL L15D4 ; routine WAIT-KEY Tiene una errata: LD A,$FD ; select system channel 'S' Mejor cogemos la que aloja el World of Spectrum: ftp://ftp.worldofspectrum.org/pub/si...ssemblyThe.txt 0970 SA-CONTRL PUSH HL Save the 'pointer'. LD A,+FD Ensure that channel 'K' CALL 1601,CHAN-OPEN is open. XOR A Signal 'first message'. LD DE,+09A1 Print the message - 'Start tape, CALL 0C0A,PO-MSG then press any key.'. SET 5,(TV-FLAG) Signal 'screen will require to be cleared'. CALL 15D4,WAIT-KEY Wait for a key to be pressed. > En condiciones normales, la función de entrada va devolviendo ceros y > la rutina de SAVE vuelve a insistir hasta que recibe un valor distinto > de cero como valor de la tecla pulsada. En realidad la propia rutina de SAVE no comprueba si se ha pulsado una tecla, se lo deja a la rutina WAIT-KEY. > (por eso está apuntada por la variable del sistema CHANS y no es una > dirección fija, como todo lo que está situado por encima de la > dirección de VARS). En realidad quería haber escrito "...todo lo que está situado por encima de la dirección de inicio de las variables del sistema).". Y seguro que hay más, pero el jefe ya me está mirando... |
| |||
| > Es que es correcto. Mira lo que pone al principio: > http://www.users.globalnet.co.uk/~jg...01/yr01_71.htm > SYSTEM VARIABLES > The Microdrive, LAN and RS232 software uses more system variables; > these are described as follows: entonces creo que ya entiendo a que te refieres. Esa dirección 23735 corresponde a esta definición: X2 23735 VECTOR Address used to extend the BASIC interpreter _solo_ cuando está conectado un microdrive o similar... mientras que si no hay aparato alguno "adosado" al spectrum pues se cumple todo lo que hasta ahora estamos hablando -y que además es lo que pone en el manual-... vamos, que como dices debí leer todo al completo y no solo la parte que me interesaba -y no, no creas que es la primera vez que me pasa ;-) - Pues de nuevo muchas gracias por tu paciencia y me da igual lo que diga el "señor Lobo" :-) yo he aprendido un montón de cosas que no sabía y eso es lo que más me gusta. Gracias de nuevo. Un saludo. PD: por cierto, el tema de "los canales" y el uso de funciones "genéricas" -como tú las llamas- para imprimir o para leer creo que en su tiempo fueron ampliamente desconocidas y que realmente deberían haber sido "la vanguardia" de la programación, mientras que lo que más se estilaba era decir que las rutinas de la ROM eran muy lentas sin comprender realmente el porqué de esa "lentitud". |
| |||
| > Es que es correcto. Mira lo que pone al principio: > http://www.users.globalnet.co.uk/~jg...01/yr01_71.htm > SYSTEM VARIABLES > The Microdrive, LAN and RS232 software uses more system variables; > these are described as follows: entonces creo que ya entiendo a que te refieres. Esa dirección 23735 corresponde a esta definición: X2 23735 VECTOR Address used to extend the BASIC interpreter _solo_ cuando está conectado un microdrive o similar... mientras que si no hay aparato alguno "adosado" al spectrum pues se cumple todo lo que hasta ahora estamos hablando -y que además es lo que pone en el manual-... vamos, que como dices debí leer todo al completo y no solo la parte que me interesaba -y no, no creas que es la primera vez que me pasa ;-) - Pues de nuevo muchas gracias por tu paciencia y me da igual lo que diga el "señor Lobo" :-) yo he aprendido un montón de cosas que no sabía y eso es lo que más me gusta. Gracias de nuevo. Un saludo. PD: por cierto, el tema de "los canales" y el uso de funciones "genéricas" -como tú las llamas- para imprimir o para leer creo que en su tiempo fueron ampliamente desconocidas y que realmente deberían haber sido "la vanguardia" de la programación, mientras que lo que más se estilaba era decir que las rutinas de la ROM eran muy lentas sin comprender realmente el porqué de esa "lentitud". |
| |||
| > Es que es correcto. Mira lo que pone al principio: > http://www.users.globalnet.co.uk/~jg...01/yr01_71.htm > SYSTEM VARIABLES > The Microdrive, LAN and RS232 software uses more system variables; > these are described as follows: entonces creo que ya entiendo a que te refieres. Esa dirección 23735 corresponde a esta definición: X2 23735 VECTOR Address used to extend the BASIC interpreter _solo_ cuando está conectado un microdrive o similar... mientras que si no hay aparato alguno "adosado" al spectrum pues se cumple todo lo que hasta ahora estamos hablando -y que además es lo que pone en el manual-... vamos, que como dices debí leer todo al completo y no solo la parte que me interesaba -y no, no creas que es la primera vez que me pasa ;-) - Pues de nuevo muchas gracias por tu paciencia y me da igual lo que diga el "señor Lobo" :-) yo he aprendido un montón de cosas que no sabía y eso es lo que más me gusta. Gracias de nuevo. Un saludo. PD: por cierto, el tema de "los canales" y el uso de funciones "genéricas" -como tú las llamas- para imprimir o para leer creo que en su tiempo fueron ampliamente desconocidas y que realmente deberían haber sido "la vanguardia" de la programación, mientras que lo que más se estilaba era decir que las rutinas de la ROM eran muy lentas sin comprender realmente el porqué de esa "lentitud". |
| |||
| > Es que es correcto. Mira lo que pone al principio: > http://www.users.globalnet.co.uk/~jg...01/yr01_71.htm > SYSTEM VARIABLES > The Microdrive, LAN and RS232 software uses more system variables; > these are described as follows: entonces creo que ya entiendo a que te refieres. Esa dirección 23735 corresponde a esta definición: X2 23735 VECTOR Address used to extend the BASIC interpreter _solo_ cuando está conectado un microdrive o similar... mientras que si no hay aparato alguno "adosado" al spectrum pues se cumple todo lo que hasta ahora estamos hablando -y que además es lo que pone en el manual-... vamos, que como dices debí leer todo al completo y no solo la parte que me interesaba -y no, no creas que es la primera vez que me pasa ;-) - Pues de nuevo muchas gracias por tu paciencia y me da igual lo que diga el "señor Lobo" :-) yo he aprendido un montón de cosas que no sabía y eso es lo que más me gusta. Gracias de nuevo. Un saludo. PD: por cierto, el tema de "los canales" y el uso de funciones "genéricas" -como tú las llamas- para imprimir o para leer creo que en su tiempo fueron ampliamente desconocidas y que realmente deberían haber sido "la vanguardia" de la programación, mientras que lo que más se estilaba era decir que las rutinas de la ROM eran muy lentas sin comprender realmente el porqué de esa "lentitud". |
| |||
| On 14 mayo, 09:31, Pepe Pérez wrote: > PD: por cierto, el tema de "los canales" y el uso de > funciones "genéricas" -como tú las llamas- para imprimir o para leer creo > que en su tiempo fueron ampliamente desconocidas y que realmente deberían > haber sido "la vanguardia" de la programación, mientras que lo que másse > estilaba era decir que las rutinas de la ROM eran muy lentas sin comprender > realmente el porqué de esa "lentitud". Este tema de los canales fue uno de los que más me costó entender cuando lo leí en su día. Pero claro, no es lo mismo leerlo con 13 años y siendo el artículo de MicroHobby la única fuente, con la dificultad añadida de probarlo en la máquina real que cuando se colgaba se perdía todo, que ahora con mucho más de el doble de edad, con la carrera tras las espaldas, trabajando de desarrollador desde hace tiempo... Aun así coincido contigo en tu apreciación de que la implementación de los canales en el Spectrum fue algo realmente inteligente. Si te lees el manual del Interface I verás que haciendo uso de los canales puedes leer y escribir en el microdrive utilizando PRINTs e INPUTs !!!! O hacer uso de la LAN que podías crear con hasta 64 Spectrums de una manera sumamente sencilla y desde el BASIC. E igualmente coincido en que no se explotó de manera adecuada. Casi siempre que he visto algún programilla o alguna rutina de utilidad que las usa hace una pequeña ñapa para utilizar los canales, en vez de hacerlo de manera adecuada con sus OPEN, CLOSE, PRINT # ... Por ejemplo esta rutina: http://microhobby.speccy.cz/mhf/022/MH022_14.jpg http://microhobby.speccy.cz/mhf/022/MH022_15.jpg http://microhobby.speccy.cz/mhf/022/MH022_16.jpg En vez de tenerse que utilizar "a pelo", POKEando los valores a imprimir en una posición de memoria fija y después llamando a la rutina directamente (la cual abre el canal "S" y utiliza la rutina de impresión del s.o.), podría haberse instalado como un nuevo canal de salida (por ejemplo creando el canal "H", por lo de High Resolution, o reutilizando el "P" de la impresora) y añadiendo un simple filtrado para los códigos AT, TAB, INK, PAPER, ... (si se quiere, pues no sería imprescindible utilizarlos) poderlo utilizar de una manera tan sencilla como: OPEN #4, "h": PRINT #4; "Texto en 64 columnas, como mola" Y los cambios y el esfuerzo en el C.M. serían mínimos. Como ejemplo de como utilizar bien los canales creo que el programita PROPAN (PROcesador-de-PANtallas creo que se llamaba) del curso de Código Máquina de la MH era un buen ejemplo (ahora no tengo por aquí el PDF del cursito para comprobarlo). Ampliaba las capacidades de manejar la pantalla de una manera muy sencilla desde BASIC para poder hacer scrolls y copia de secciones de la pantalla utilizando simples PRINTs y códigos de ontrol. |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| CAMBIAR DIRECCION DE CORREO ELECTRONICO O DIRECCION DE MESS | Danger.ve | Newsgroup microsoft.public.es.msn.messenger | 8 | 20-03-2007 21:54:06 |
| Conexión extraña | José Manuel | Newsgroup es.comp.virus | 16 | 23-01-2007 21:00:12 |
| IP MUY EXTRAÑA | Q | Newsgroup es.comp.redes.misc | 10 | 08-06-2006 11:22:07 |
| peticion extraña | CADchondo | Newsgroup es.comp.cad.autocad | 0 | 28-10-2005 10:25:25 |
| cosa extraña en C | Ricardo Catalinas Jimenez | Newsgroup es.comp.os.linux.programacion | 48 | 26-04-2005 21:49:19 |