Versi¢n 1.1 N. Soriano
Comunidad MSX
12 de Septiembre de 2007
ObsoNET - Manual del Programador
ObsoNET Copyright (c) 2004
Daniel Berdugo Gonz lez (hardware), dberdugo1@yahoo.es
N‚stor Soriano Vilchez (software), konamiman@konamiman.com
MSX-DOS 2 adaptado a ObsoNET por Armando P‚rez Abad
*** ATENCION ***
La cara FRONTAL de la tarjeta ObsoNET es la que contiene los LEDs, el
conector para el cable RJ45 y el logotipo "ObsoNET".
Öndice
1. Introducci¢n
2. Requerimientos e instalaci¢n
3. Caracter¡sticas de ObsoNET
3.1 Caracter¡sticas generales
3.2 Organizaci¢n de la memoria
3.3 Mapeo de la ROM
3.4 Detecci¢n de ObsoNET
4. La BIOS de ObsoNET
4.1 Caracter¡sticas y uso
4.2 Rutinas de la BIOS
4.3 Integraci¢n de la BIOS con otros programas en ROM
4.4 Uso de la BIOS por programas residentes
4.5 Notas de la versi¢n 1.1. Compatibilidad con la UNAPI Ethernet.
Ap‚ndice A. Formato de las tramas Ethernet
Ap‚ndice B. C¢digo para la detecci¢n de ObsoNET
Ap‚ndice C. Referencias
Direcci¢n del autor
1. Introducci¢n
ObsoNET es una tarjeta Ethernet 10BaseT con conector RJ45 para
ordenadores MSX. Con ObsoNET es posible conectar cualquier ordenador
MSX a una red Ethernet, e incluso directamente a Internet por medio
de un router ADSL.
Este manual contiene informaci¢n de inter‚s para los programadores
que quieran desarrolar aplicaciones que hagan uso de ObsoNET a bajo
nivel (manipulaci¢n directa de tramas Ethernet y configuraci¢n de la
tarjeta). Para trabajar a nivel de TCP/IP es necesario instalar
InterNestor Lite para ObsoNET; dicha aplicaci¢n tiene su propio
manual, por lo que no se tratar aqu¡.
En cuanto a los usuarios en general, deben consultar directamente los
manuales de los programas de red que usar n. S¢lo la Secci¢n 2 de
este manual ser de cierto inter‚s para ellos.
2. Requerimientos e instalaci¢n
ObsoNET funciona en todos los ordenadores MSX, desde MSX1 hasta
Turbo-R.
Instalar ObsoNET es tan sencillo como:
1. Insertar la tarjeta en cualquier slot libre del MSX.
2. Enchufar un cable de par trenzado conectado a una red en el
conector RJ45 de la tarjeta.
3. Encender el MSX.
Una vez que el MSX ha arrancado, ya es posible enviar y recibir
tramas Ethernet por medio de las rutinas de la BIOS de ObsoNET
(descrita en la Secci¢n 4). ¨Quien dijo Plug & Play? :-)
Para usar TCP/IP, sin embargo, es necesario instalar InterNestor Lite
para ObsoNET; este programa requiere MSX2 con 128K de RAM mapeada.
Consultar el manual del propio InterNestor Lite para m s detalles.
Es posible conectar m s de una tarjeta ObsoNET simult neamente en un
MSX. Las rutinas de la BIOS de una tarjeta dada actuar n sobre su
propio puerto Ethernet, sin entrar en conflicto con las dem s. Sin
embargo, InterNestor Lite y las utilidades suministradas con ObsoNET
s¢lo funcionan sobre la primera de las tarjetas (la que tenga n£mero
de slot m s bajo). Para efectivamente usar varias tarjetas
simult neamente es necesario desarrollar software espec¡fico.
3. Caracter¡sticas de ObsoNET
3.1 Caracter¡sticas generales
ObsoNET consiste b sicamente en un controlador Ethernet RTL8019AS y
en una Flash ROM de 512K. En la ROM se almacena una BIOS con rutinas
para enviar/recibir tramas Ethernet y para configurar la tarjeta; la
BIOS se describe en la Secci¢n 4. Tambi‚n hay una EEPROM de 1K -no
modificable mediante software- que almacena la direcci¢n Ethernet de
la tarjeta.
El tama¤o de la BIOS es de aproximadamente 2K, y el resto de la ROM
queda libre para almacenar cualquier software. Se dan m s detalles
en secciones posteriores.
3.2 Organizaci¢n de la memoria
El espacio de memoria de ObsoNET est organizado de la siguiente
forma:
#4000-#7FDF: Flash ROM
#7FE0-#7FFF: Registros del RTL8019AS
#BFE0-#BFFF: Registros del RTL8019AS (r‚plica de #7FE0-#7FFF)
El RTL8019AS se controla por medio de 32 registros que est n mapeados
en ObsoNET de la siguiente forma:
#7FE0 y #BFE0: Registro 0
#7FE1 y #BFE1: Registro 1
.
.
.
#7FFF y #BFFF: Registro 31
Para detalles sobre el funcionamiento de cada registro y del
RTL8019AS en general, consultar el manual del controlador en la web
de Realtek (ver Ap‚ndice C). En condiciones normales, no obstante,
no es necesario manipular directamente estos registros; basta con
usar las rutinas de la BIOS (excepto para el mapeo de la ROM y para
buscar tarjetas ObsoNET en el sistema, como se detalla m s adelante).
NOTA: El RTL8019AS tiene en realidad cuatro bancos de 32 registros.
El banco visible se selecciona por medio de los bits 7 y 6 del
registro 0 (este registro es especial, es visible en todos los
bancos). Este conocimiento es necesario para manipular el mapeo de
la ROM y para buscar tarjetas ObsoNET en el sistema.
3.3 Mapeo de la ROM
El tama¤o de la Flash ROM es de 512K, pero por medio del espacio de
direcciones de ObsoNET s¢lo son visibles 16K simult neamente (en
realidad 16K-32 bytes, debido al espacio ocupado por los registros
del RTL8019AS).
La ROM se divide por tanto en 32 p ginas l¢gicas de 16K, numeradas de
0 a 31. Para seleccionar (o consultar) la p gina visible es
necesario acceder a uno de los registros del RTL8019AS, en concreto
el registro BPAGE (registro 2 del banco 3).
As¡ pues, para seleccionar una p gina de la ROM es necesario hacer lo
siguiente:
1. Escribir el valor #C0 en el registro 0 (selecci¢n del banco 3).
2. Escribir el n£mero de p gina deseado en el registro BPAGE
(registro 2).
En c¢digo:
ld a,#C0
ld (#7FE0),a
ld a,
ld (#7FE2),a
Si en vez de escribir en BPAGE lo leemos, obtendremos el n£mero de la
p gina actualmente conectada.
Para grabar la ROM se debe usar el programa ONETFRL.COM, suministrado
con ObsoNET y disponible en Internet (ver Ap‚ndice C).
3.4 Detecci¢n de ObsoNET
Para comprobar si en un determinado slot hay una ObsoNET conectada,
se sigue el siguiente algoritmo:
1. Se conecta el slot a comprobar en la p gina 1.
2. Asumiendo que hay una ObsoNET conectada, se conecta el banco de
registros 0 (ver Secci¢n 3.2) y se leen los registros 8019ID0 y
8019ID1 (registros 10 y 11, respectivamente). Los valores le¡dos
deben ser #50 y #70 respectivamente. De lo contrario, el slot NO
contiene una ObsoNET.
3. Se conecta el banco de registros 2 y se vuelven a leer los
registros 10 y 11. Esta vez los valores le¡dos deben ser
DISTINTOS a los obtenidos en el paso anterior. De no ser as¡, el
slot NO contiene una ObsoNET.
Llegados a este punto, ya sabemos que en el slot hay una ObsoNET.
Falta comprobar si tiene grabada la BIOS en la Flash ROM.
4. Se conecta la p gina 0 de la ROM (ver Secci¢n 3.3) y se comprueba
si la posici¢n #7FD0 contiene la cadena "ObsoNET", con esa
combinaci¢n de may£sculas y min£sculas y terminada con un
car cter 0. De ser as¡, la ObsoNET dispone de BIOS.
El ap‚ndice B contiene el c¢digo que implementa este algoritmo de
detecci¢n.
4. La BIOS de ObsoNET
4.1 Caracter¡sticas y uso
ObsoNET, si est bien configurada (ver (see Secci¢n 3.4)), tiene en
su ROM una BIOS con rutinas que permiten enviar y recibir tramas
Ethernet, as¡ como realizar tareas b sicas de configuraci¢n de la
tarjeta. Si ObsoNET no tiene BIOS, ‚sta se puede grabar a partir del
fichero BIOS.ROM o BIOSDOS2.ROM y la utilidad ONETFRL.COM; estos
ficheros se proporcionan con ObsoNET y tambi‚n est n disponibles en
Internet (ver Ap‚ndice C).
Para usar la BIOS de ObsoNET se debe, en primer lugar, buscar la
ObsoNET y comprobar que tiene la BIOS grabada (ver Secci¢n 3.4); y a
continuaci¢n hacer lo siguiente:
1. Conectar el slot de ObsoNET en la p gina 1:
ENASLT: equ #0024
ld a,
ld h,#40
call ENASLT
2. Seleccionar la p gina 0 de la ROM (ver Secci¢n 3.3):
ld a,#C0
ld (#7FE0),a
xor a
ld (#7FE2),a
3. Llamar a la rutina o rutinas deseadas mediante instrucciones
CALL.
-- O bien --
1. Seleccionar la p gina 0 de la ROM usando WRSLT (ver Secci¢n 3.3):
WRSLT: equ #0014
ld a,
ld e,#C0
ld hl,#7FE0
call WRSLT
ld a,
ld e,0
ld hl,#7FE2
call WRSLT
2. Llamar a la rutina o rutinas deseadas con CALSLT:
CALSLT: equ #001C
ld iy,*256
ld ix,
ld ... (establecer otros registros adecuadamente)
call CALSLT
(Nota: ninguna de las rutinas de la BIOS de ObsoNET usa los rgistros
IX/IY como par metros de entrada ni salida)
Las rutinas de la BIOS usan exclusivamente la pila para el
almacenamiento de datos temporales, y no acceden a ninguna otra parte
de la RAM del sistema (excepto al enviar o recibir paquetes): la BIOS
no reduce la memoria disponible para el usuario ni usa direcciones
"ilegales" de la zona de trabajo del sistema.
En la secci¢n siguiente se describen todas las rutinas de la BIOS de
ObsoNET.
4.2 Rutinas de la BIOS
Nota: todas las rutinas modifican todos los registros a no ser que se
indique lo contrario.
* ONET_RESET (#7FCD): Inicializa la tarjeta ObsoNET
Entrada: -
Salida: -
Esta rutina, que es ejecutada autom ticamente cuando el ordenador
arranca, inicializa la tarjeta ObsoNET dej ndola lista para su
uso. En concreto, realiza las siguientes tareas:
1. Env¡a un comando RESET al controlador RTL8019AS.
2. Cancela el env¡o de paquete en curso si lo hay.
3. Inicializa los registros del RTL8019AS a sus valores
adecuados.
4. Configura la recepci¢n para admitir paquetes broadcast y
rechazar paquetes multicast, con CRC err¢neo, o no dirigidos a
nosotros (excepto broadcast).
5. Lee la direcci¢n hardware de la tarjeta desde la EEPROM y la
almacena en los registros PAR0 a PAR5.
6. Configura la m scara multicast como todo unos.
* GET_VERS (#7FCA): Obtiene la versi¢n de la BIOS.
Entrada: -
Salida: A = Versi¢n principal
B = Versi¢n secundaria
C = Revisi¢n
Preserva F, DE, HL
Esta rutina simplemente devuelve la versi¢n de la BIOS. La
informaci¢n devuelta deber¡a mostrarse como "Versi¢n A.B.C". La
versi¢n descrita en este manual es la 1.0.0.
* GET_HWAD (#7FC7): Obtiene la direcci¢n f¡sica de ObsoNET.
Entrada: -
Salida: L-H-E-D-C-B = Direcci¢n f¡sica de ObsoNET
Preserva AF
Esta rutina devuelve la direcci¢n f¡sica (tambi‚n conocida como
direcci¢n hardware, direcci¢n ethernet o MAC) de ObsoNET. Esta
informaci¢n se lee de los registros PAR0 a PAR5 del RTL8019AS,
registros que a su vez son establecidos en base al contenido de la
EEPROM por la rutina RTL_RESET.
La informaci¢n se devuelve en un formato que facilita su
almacenamiento en memoria en el orden correcto, por ejemplo:
call GET_HWAD
ld (HWAD),hl
ld (HWAD+2),de
ld (HWAD+4),bc
...
HWAD: ds 6
* GET_NETSTAT (#7FC4): Obtiene el estado de la conexi¢n a la red
Entrada: -
Salida: A = 0 si no hay conexi¢n a la red
1 si hay conexi¢n a la red
Esta rutina comprueba si ObsoNET est f¡sicamente conectada a una
red activa, es decir, si es posible el env¡o y la recepci¢n de
paquetes.
Para realizar la comprobaci¢n se intenta enviar un paquete de
prueba (cuyas direcciones f¡sicas de env¡o y recepci¢n son
00-00-00-00-00-00), por lo que la ejecuci¢n de la rutina toma
cierto tiempo; por tanto, no es recomendable ejecutarla con
demasiada frecuencia.
* ONET_ONOFF (#7FC1): Activa o desactiva ObsoNET
Entrada: A = 0: Obtener el estado actual
1: Activar la tarjeta
2: Desactivar la tarjeta
Salida: A = Estado de la tarjeta:
1: Activada
2: Desactivada
Preserva C, DE, HL
Esta rutina activa o desactiva el controlador RTL8019AS de
ObsoNET. Mientras est‚ desactivado, se ignorar n todos los
paquetes recibidos.
* CONF_RX (#7FBE): Configuraci¢n de los par metros de recepci¢n
Entrada: A = Banderas que indican la configuraci¢n
cuando est n establecidas:
bit 7: S¢lo devolver la configuraci¢n actual
(se ignoran las otras banderas)
bit 4: Aceptar todos los paquetes recibidos, sea cual
sea su direcci¢n de destino ("modo promiscuo")
bit 3: Aceptar los paquetes recibidos cuya direcci¢n
de destino sea de multicast
bit 2: Aceptar los paquetes recibidos cuya direcci¢n
de destino sea la de broadcast (FF-FF-FF-FF-FF-FF)
bit 1: Aceptar los paquetes recibidos cuya longitud
sea inferior a 64 bytes
Salida: A = Configuraci¢n actual
(igual que a la entrada excepto el bit 7)
Preserva BC, DE, HL
Cuando el controlador RTL8019AS detecta un paquete nuevo recibido
desde la red, examina la direcci¢n f¡sica de destino del paquete
para decidir si debe ser capturado (para ser recogido
posteriormente, ver la rutina GET_PACKET) o no. Esta rutina
configura los tipos de direcciones que se considerar n v lidas
para realizar la captura:
* Los paquetes cuya direcci¢n de destino coincida con la de la
tarjeta (seg£n los registros PAR0 a PAR5) siempre se capturan,
con independencia de la configuraci¢n de recepci¢n.
* Si el bit 4 est a 1 ("modo promiscuo"), se capturar n todos
los paquetes que viajen por la red, con independencia de su
direcci¢n de destino. Este modo es £til para desarrollar
analizadores de red.
* Si el bit 3 est a 1, se capturar n los paquetes cuya direcci¢n
de destino sea de multicast, siempre que la m scara de
multicast lo permita (ver la rutina CONF_MCAST).
* Si el bit 2 est a 1, se capturar n los paquetes cuya direcci¢n
de destino sea la de broadcast (FF-FF-FF-FF-FF-FF); estos
paquetes est n dirigidos a todas las m quinas de la red y en
condiciones normales siempre deber¡an ser aceptados.
* Si el bit 1 est a 1, se capturar n los paquetes cuyo tama¤o
sea inferior a 64 bytes. El est ndar Ethernet obliga a que
todos los paquetes que circulan por la red tengan un tama¤o
igual o superior a 64 bytes, aunque hay sistemas operativos que
env¡an paquetes menores.
La configuraci¢n por defecto (establecida por RTL_RESET) es
%00000110, es decir, se aceptan los paquetes de broadcast y los de
tama¤o inferior a 64 bytes, y se rechazan los de multicast; esta
configuraci¢n es la m s adecuada en circunstancias normales.
* CONF_MCAST (#7FBB): Configuraci¢n de la m scara de multicast
Entrada: Cy = 0 para obtener la m scara actual
1 para establecer la m scara
HL = Direcci¢n para depositar la m scara si Cy=0;
direcci¢n desde la que leer la m scara si Cy=1
Salida: -
Esta rutina obtiene o establece la m scara de multicast, que
decide qu‚ direcciones de multicast se consideran v lidas como
direcci¢n de destino en los paquetes capturados (es necesario
adem s activar la recepci¢n de paquetes multicast; ver la
descripci¢n de la rutina CONF_RX).
La m scara de multicast consta de ocho bytes, que son tratados
como una tabla de 64 bits. Cuando llega un paquete cuya direcci¢n
f¡sica de destino es de multicast (el bit m s bajo del primer byte
es uno), el RTL8019AS aplica a dicha direcci¢n una funci¢n hash
que da como resultado un n£mero de 6 bits. Dicho n£mero se toma
como ¡ndice en la m scara de multicast: si el bit correspondiente
est a uno, se captura el paquete, en caso contrario se descarta.
El valor por defecto de la m scara (establecido por RTL_RESET) es
de todo unos (ocho bytes #FF).
* GET_INSTAT (#7FB8): Obtiene datos del paquete m s antiguo recibido
Entrada: -
Salida: A = 0: No hay paquetes capturados
1: Hay paquetes capturados listos para ser recogidos
BC = Tama¤o del paquete capturado m s antiguo
HL = Bytes 12 (H) y 13 (L) del paquete capturado
m s antiguo (longitud o Ether-Type)
Esta rutina comprueba si hay paquetes capturados en el b£fer
interno del RTL8019AS. Si hay al menos uno, devolver A=1, y en
HL y BC devolver datos relativos al m s antiguo, que es el que se
obtendr si se llama a GET_PACKET.
BC devuelve el tama¤o total del paquete (incluyendo la cabecera
Ethernet), mientras que HL devuelve los bytes 12 y 13 del paquete
capturado; esto permite distinguir el tipo de trama usada por el
paquete, Ethernet 2 o IEEE802.3, antes de obtenerlo (ver el
ap‚ndice A para m s detalles sobre los tipos de tramas Ethernet).
El tama¤o del b£fer usado para capturar paquetes es de 8K. Si se
llena, no se capturar n nuevos paquetes, por lo que es conveniente
recoger los paquetes capturados (con GET_PACKET) regularmente.
* GET_PACKET (#7FB5): Obtiene el paquete recibido
m s antiguo capturado
Entrada: HL = Direcci¢n para depositar el paquete
(0 para descartarlo)
Salida: A = 0 si se ha obtenido (o descartado) un paquete
1 si no hab¡a paquetes pendientes
BC = Tama¤o del paquete obtenido
Esta rutina copia a la direcci¢n indicada por HL el paquete m s
antiguo recibido, y a continuaci¢n elimina dicho paquete del b£fer
de recepci¢n del RTL8019AS. La direcci¢n pasada no puede ser una
direcci¢n de p gina 1 (#4000-#7FFF).
Si se especifica HL=0, el paquete se descarta: se borra del b£fer
pero no es copiado a memoria.
Para saber a priori si hay paquetes disponibles antes de intentar
obtenerlos, se puede usar la rutina GET_INSTAT.
* SEND_PACKET (#7FB2): Env¡a un paquete a la red
Entrada: HL = Direcci¢n del paquete a enviar
BC = Longitud del paquete a enviar (14 a 1514 bytes)
A = 0: Ejecuci¢n s¡ncrona
(esperar a que el env¡o finalice)
1: Ejecuci¢n as¡ncrona
(terminar inmediatamente tras iniciar el env¡o)
Salida: En ejecuci¢n s¡ncrona:
A = 0: Paquete enviado con ‚xito
1: Longitud del paquete inv lida
3: Env¡o cancelado por p‚rdida de portadora
4: Env¡o cancelado por excesivas colisiones
En ejecuci¢n as¡ncrona:
A = 0: El env¡o del paquete ha comenzado
1: Longitud del paquete inv lida
Esta rutina env¡a (o inicia el env¡o de) el paquete almacenado en
la direcci¢n pasada en HL. Dicha direcci¢n no puede ser de p gina
1 (#4000-#7FFF).
La longitud completa del paquete, incluyendo la cabecera Ethernet,
se debe pasar en BC, y debe ser un valor entre 14 y 1514. Si el
valor es inferior a 64, se enviar n en realidad 64 bytes a la red:
el paquete seguido de datos aleatorios.
Si se selecciona ejecuci¢n s¡ncrona, la rutina esperar a que el
env¡o del paquete finalice (o falle), y entonces devolver el
c¢digo de terminaci¢n apropiado en A. En cambio, si se selecciona
ejecuci¢n as¡ncrona, la rutina ordenar al RTL8019AS que inicie el
env¡o del paquete, tras lo cual finalizar inmediatamente; para
obtener el estado de la transmisi¢n (en curso, terminada con ‚xito
o fallida) se debe usar la rutina SEND_STATUS.
N¢tese que si ya hay un env¡o en curso cuando se ejecuta
SEND_PACKET, la rutina esperar a que dicho env¡o finalice antes
de comenzar el env¡o nuevo. Esto ocurre siempre, con
independencia de que se pida transmisi¢n s¡ncrona o as¡ncrona.
* SEND_STATUS (#7FAF): Obtiene el estado de la transmisi¢n
de un paquete
Entrada: -
Salida: A = 0: No se han enviado paquetes
desde la £ltima ejecuci¢n de RTL_RESET
1: Paquete envi ndose
2: Paquete enviado con ‚xito
3: Env¡o cancelado por p‚rdida de portadora
4: Env¡o cancelado por excesivas colisiones
Preserva C, DE, HL
Esta rutina devuelve el estado del £ltimo env¡o realizado mediante
la rutina SEND_PACKET. El estado devuelto es siempre v lido, con
independencia de que la transmisi¢n fuera s¡ncrona o as¡ncrona;
por ejemplo, si una ejecuci¢n s¡ncrona de SEND_PACKET devuelve
A=0, esta rutina devolver A=2.
La informaci¢n obtenida no se borra: ejecuciones sucesivas de esta
rutina siempre devolver n el mismo valor mientras no vuelva a
ejecutarse SEND_PACKET (o RTL_RESET).
4.3 Integraci¢n de la BIOS con otros programas en ROM
La BIOS de ObsoNET tiene un tama¤o de £nicamente 2K (en la versi¢n
actual), por lo que el resto de la ROM (de 512K de tama¤o total)
puede usarse para almacenar otros programas (por ejemplo, el MSX-DOS
2 adaptado que se suministra con ObsoNET). En esta secci¢n se
explica c¢mo integrar la BIOS de ObsoNET con otros programas que se
graben en la Flash ROM de ObsoNET.
La BIOS de ObsoNET se distribuye en tres ficheros:
o BIOS.ROM (16K): La BIOS m s espacio en blanco de relleno y una
cabecera ROM, lista para ser grabada en la memoria Flash mediante
ONETFRL.COM.
o BIOSDOS2.ROM (64K): La BIOS m s una versi¢n adaptada a ObsoNET de
MSX-DOS 2, tambi‚n lista para ser grabada en la memoria Flash
mediante ONETFRL.COM. Esta es la ROM que ObsoNET lleva grabada
"de f brica".
o BIOS.DAT (2048 bytes): La BIOS sola.
Este £ltimo fichero, BIOS.DAT, es el que nos interesa para integrar
la BIOS con otros programas. La integraci¢n consiste simplemente en
la inclusi¢n del contenido de BIOS.DAT en el fichero .ROM que
contiene el c¢digo a grabar, de forma que se cumplan las dos
siguientes condiciones:
1. El contenido de BIOS.DAT debe aparecer en la posici¢n #3800 del
fichero .ROM a grabar (asumiendo que la primera posici¢n es la
0). Es decir, una vez grabada la ROM, la BIOS debe ser visible
en la direcci¢n #7800 del slot de ObsoNET cuando se selecciona la
p gina 0 de la ROM.
2. El c¢digo de inicializaci¢n de la ROM debe efectuar una llamada a
la direcci¢n #7800. Si la ROM no tiene c¢digo de inicializaci¢n,
se debe poner el valor #7800 en la direcci¢n INIT de la cabecera
ROM (posici¢n 2 del fichero, direcci¢n #4002 en el slot).
Por ejemplo, sup¢ngase que se desea grabar un programa de tama¤o
inferior a 14K junto con la BIOS. Entonces deber¡a hacerse lo
siguiente:
1. Generar el fichero PROGRAM.DAT, que contenga el programa m s
relleno al final hasta completar 14K (14336 bytes). El c¢digo
del programa deber¡a tener esta estructura:
org #4000
db #41,#42 ;Cabecera ROM
dw INIT
ds 12 ;O bien punteros a comandos CALL, etc
INIT: call #7800 ;Obligatorio
... (inicializaci¢n propia del programa)
ret
... (resto del programa)
CODE_END:
ds #7800-CODE_END ;Relleno hasta 14K
O bien, si el programa no tiene c¢digo propio de inicializaci¢n:
org #4000
db #41,#42 ;Cabecera ROM
dw #7800
ds 12 ;O bien punteros a comandos CALL, etc
... (programa)
CODE_END:
ds #7800-CODE_END ;Relleno hasta 14K
2. Concatenar PROGRAM.DAT con BIOS.DAT para generar el fichero ROM a
grabar; por ejemplo, desde el int‚rprete de comandos de DOS 2:
CONCAT /B PROGRAM.DAT BIOS.DAT PROGRAM.ROM
El fichero resultante PROGRAM.ROM, de 16K, ya se puede grabar en
la ROM de ObsoNET mediante la utilidad ONETFRL.COM.
Si el programa a grabar es mayor de 14K, se debe generar otro
fichero, PROGRAM2.DAT, que contendr el c¢digo y/o los datos que
ser n visibles a partir de la p gina 1 de la ROM. El tama¤o de este
fichero puede ser de hasta 496K, y en esta ocasi¢n, para generar el
fichero ROM definitivo se har¡a:
CONCAT /B PROGRAM.DAT BIOS.DAT PROGRAM2.DAT PROGRAM.ROM
4.4 Uso de la BIOS por programas residentes
Las rutinas de la BIOS de ObsoNET no se han dise¤ado para ser
reentrantes. Es decir, si cuando se est ejecutando una rutina de la
BIOS se produce una interrupci¢n, resultado de la cual se ejecuta
c¢digo que a su vez realiza llamadas a la misma (o a otra) rutina de
la BIOS, el comportamiento de las rutinas (y por tanto de la propia
ObsoNET) ser probablemente err¢neo. Un ejemplo de programa que usa
la BIOS desde c¢digo asociado a la interrupci¢n del reloj es
InterNestor Lite.
Por tanto, al desarrollar programas normales (que no se ejecuten
desde una interrupci¢n) que hagan uso de la BIOS de ObsoNET hay dos
opciones para hacer frente a esta limitaci¢n:
1. Avisar en la documentaci¢n del programa de que para su correcta
ejecuci¢n no puede haber instalado ning£n programa residente que
haga uso de la BIOS de ObsoNET.
2. En el caso de InterNestor Lite, no es necesario desinstalarlo: si
se pausa (mediante INL P), no se ejecutar el c¢digo asociado a
la interrupci¢n del reloj (tambi‚n es posible pausar InterNestor
Lite mediante c¢digo, ver el manual de dicho programa para m s
detalles).
3. Deshabilitar las interrupciones (DI) antes de cada llamada a una
rutina de la BIOS de ObsoNET, y si es necesario volver a
habilitarlas (EI) despu‚s.
En cuanto a los programas residentes que ejecuten rutinas de la BIOS
de ObsoNET desde c¢digo disparado por una interrupci¢n, tambi‚n
deber¡an indicar esta circunstancia en su documentaci¢n.
4.5. Notas de la versi¢n 1.1. Compatibilidad con la UNAPI Ethernet.
Desde la versi¢n 1.1, la BIOS de ObsoNET es compatible con la
especificaci¢n Ethernet UNAPI. El nombre de implementaci¢n UNAPI es
"ObsoNET" (sin las comillas), y no hay rutinas especif¡cas de la
implementaci¢n.
La rutina ETH_GET_NETSTAT invoca a GET_NETSTAT, la cual env¡a un
paquete de prueba para comprobar la conectividad de red; por tanto,
no deber¡a ser ejecutada muy a menudo. Las rutinas ETH_GET_FRAME y
ETH_SEND_FRAME invocan a GET_PACKET y SEND_PACKET, respectivamente;
estas rutinas no aceptarn una direcci¢n de p gina 1 (#4000-#7FFF)
como origen o destino para las tramas.
N¢tese que el tama¤o del fichero BIOS.DAT ha cambiado de 1536 bytes
en la versi¢n 1.0 a 2048 bytes en la versi¢n 1.1. Adem s, la
posici¢n de fichero de BIOS.DAT al integrarlo con otro programa en
una ROM ha cambiado de #3A00 a #3800; y la direcci¢n de
inicializaci¢n que debe ser llamada ha cambiado de #7A00 to #7800.
V‚ase la Secci¢n 4.3.
La especificaci¢n Ethernet UNAPI est disponible en
http://www.konamiman.com.
Ap‚ndice A. Formato de las tramas Ethernet
En este ap‚ndice se describe el formato de las tramas Ethernet. Esta
informaci¢n se proporciona £nicamente como referencia y no es
exhaustiva. Se puede hallar informaci¢n m s detallada en Internet.
Hay dos tipos de tramas Ethernet: el tipo Ethernet II y el tipo
IEEE802.3 con extensi¢n SNAP (tipo IEEE para abreviar).
El formato Ethernet II es como sigue (cada l¡nea son 32 bits):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Direcci¢n Ethernet de destino |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dir. Eth. destino (cont.) | Dir. Eth. fuente |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Direcci¢n Ethernet fuente (continuaci¢n) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ether-Type | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
. .
. Datos del paquete .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
El formato de la trama IEEE es como sigue:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Direcci¢n Ethernet de destino |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dir. Eth. destino (cont.) | Dir. Eth. fuente |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Direcci¢n Ethernet fuente (continuaci¢n) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Longitud | 170 | 170 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 3 | 0 | 0 | 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ether-Type | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
. .
. Datos del paquete .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Las direcciones Ethernet, de seis bytes de longitud, son £nicas para
cada tarjeta y se asignan en tiempo de fabricaci¢n. La direcci¢n
compuesta por todo unos (seis bytes #FF) es especial: se trata de la
direcci¢n de broadcast, y cuando aparece en el campo de direcci¢n de
destino indica que el paquete est destinado a todas las m quinas
conectadas a la red, en vez de a una m quina concreta.
Las direcciones Ethernet normales tienen el bit m s bajo del primer
byte puesto a cero. Cuando est a uno, se trata de una direcci¢n de
multicast (paquete dirigido a un grupo de ordenadores).
El tama¤o m¡nimo de una trama Ethernet (incluyendo todas las
cabeceras) es de 64 bytes. El tama¤o m ximo es de 1514 bytes.
El campo "Longitud" de las tramas IEEE cuenta a partir del primer
byte 170. Es decir, es igual a la longitud de la parte de datos, m s
ocho.
El campo "Ether-Type" indica el tipo de paquete transportado en la
parte de datos. Los dos tipos m s com£nmente usados son:
#0800: Datagrama IP
#0806: Paquete ARP
Ambos tipos de trama, Ethernet II e IEEE, pueden coexistir en una
misma red. Para saber de qu‚ tipo es una trama recibida, se debe
consultar el contenido del n£mero de 16 bits de las posiciones 12 y
13 de la trama:
o Si el n£mero es menor o igual a 1500, se trata de una trama IEEE
(el n£mero expresa longitud).
o Si el n£mero es mayor que 1500, se trata de una trama Ethernet II
(el n£mero expresa Ether-Type). Todos los c¢digos Ether-Type son
mayores que 1500.
A la hora de enviar paquetes, se deben enviar en tramas de tipo
Ethernet II a no ser que se sepa que las m quinas de la red trabajan
£nicamente con el formato IEEE.
N¢tese que los campos Longitud y Ether-Type se almacenan en formato
Big-Endian, es decir con el byte alto primero; al contrario de lo que
hace el MSX, que almacena los n£meros de 16 bits en Little-Endian,
con el byte bajo primero. Por tanto, para obtener el
Ether-Type/Longitud en HL no se podr¡a hacer lo siguiente:
ld hl,(PAQUETE+12) ; INCORRECTO !!!
En su lugar habr¡a que hacer:
ld a,(PAQUETE+12)
ld h,a
ld a,(PAQUETE+13)
ld l,a
O bien:
ld hl,(PAQUETE+12)
ld a,h
ld h,l
ld l,a
O bien:
ld ix,PAQUETE
ld h,(ix+12)
ld l,(ix+13)
Ap‚ndice B. C¢digo para la detecci¢n de ObsoNET
En este ap‚ndice se muestra una rutina que comprueba todos los slots
del sistema en busca de una ObsoNET.
La rutina consta principalmente de tres subrutinas:
o NEXTSLOT devuelve, cada vez que es llamada, el siguiente n£mero de
slot disponible en el sistema.
o CHKOBSO comprueba si hay una ObsoNET en el slot conectado en la
p gina 1, mediante el test de los registros descrito en la Secci¢n
3.4.
o CHKBIOS comprueba si la ObsoNET conectada en la p gina 1 tiene una
BIOS.
;SRCHOBSO - Rutina de b£squeda de ObsoNET
; por N‚stor Soriano
;ObsoNET (c) 2004
;por Daniel Berdugo (hardware) y N‚stor Soriano (software)
;
;Entrada: -
;Salida: A = Slot de ObsoNET (#FF si no se encuentra)
; Cy = 1 si la ObsoNET tiene BIOS
; Slot de ObsoNET conectado en p gina 1
; (si no se encuentra,
; £ltimo slot disponible conectado)
ENASLT:
equ #0024
SRCHOBSO:
ld a,#FF ;Inicializa la rutina NEXTSLOT
ld (NEXTSL),a
SRCHLOOP:
call NEXTSLOT ;Obtiene siguiente slot disponible...
cp #FF ;(si no quedan slots, terminar)
ret z
push af
ld h,#40 ;...y lo conecta.
call ENASLT
pop af
ld c,a
call CHKOBNET ;Comprueba si hay ObsoNET...
jr nc,SRCHLOOP ;...y si no, pasa al siguiente slot.
call CHKBIOS ;Comprueba si hay BIOS y termina.
ld a,c
ret
;--- Comprobaci¢n de la presencia de una ObsoNET en la p gina 1.
; Entrada: -
; Salida: Cy = 1 si en la p gina 1 hay una ObsoNET, 0 si no
; Modifica: AF, B
CHKOBNET:
ld a,(#7FE0) ;Guarda valor para restaurarlo
ld b,a ;si no hay una ObsoNET
xor a ;Conecta banco de registros 0
ld (#7FE0),a
ld a,(#7FEA) ;Lee registros 10 y 11 (8019ID0/1),
cp #50 ;deben devolver #50 y #70 resp.
jr nz,NO_OBNET
ld a,(#7FEB)
cp #70
jr nz,NO_OBNET
ld a,#80 ;Conecta banco de registros 2
ld (#7FE0),a
ld a,(#7FEA) ;Lee registros 10 y 11 (no usados,
cp #50 ;NO deben devolver #50 y #70)
scf
ret nz
ld a,(#7FEB)
cp #70
scf
ret nz
NO_OBNET:
ld a,b ;No hay ObsoNET: restaura contenido
ld (#7FE0),a ;de #7FE0 por si es RAM
or a
ret
;--- Comprobaci¢n de la presencia de BIOS en la ObsoNET de p gina 1.
; Entrada: -
; Salida: Cy = 1 si hay BIOS, 0 si no
; Modifica: AF, HL, DE
CHKBIOS:
ld a,#C0 ;Conecta p gina 0 de la ROM
ld (#7FE0),a
xor a
ld (#7FE2),a
ld hl,#7FD0
ld de,OBSTRING
CHKBLOOP: ;Bucle de comparaci¢n de cadenas
ld a,(de)
cp (hl)
scf
ccf
ret nz
or a
scf
ret z
inc hl
inc de
jr CHKBLOOP
OBSTRING:
db "ObsoNET",0
;--- Subrutina NEXTSLOT:
; Devuelve en A el siguiente slot disponible
; cada vez que es llamada.
; Cuando ya no quedan slots devuelve #FF.
; Para incializarla hay que escribir #FF en NEXTSL.
; Modifica: AF, BC, HL
EXPTBL:
equ #FCC1
NEXTSLOT:
ld a,(NEXTSL)
cp #FF
jr nz,NXTSL1
ld a,(EXPTBL) ;Primer slot
and %10000000
ld (NEXTSL),a
ret
NXTSL1:
ld a,(NEXTSL)
cp %10001111
jr z,NOMORESL ;No hay m s slots?
cp %00000011
jr z,NOMORESL
bit 7,a
jr nz,SLTEXP
SLTSIMP:
and %00000011 ;Slot simple
inc a
ld c,a
ld b,0
ld hl,EXPTBL
add hl,bc
ld a,(hl)
and %10000000
or c
ld (NEXTSL),a
ret
SLTEXP:
ld c,a ;Slot expandido
and %00001100
cp %00001100
ld a,c
jr z,SLTSIMP
add %00000100
ld (NEXTSL),a
ret
NOMORESLT:
ld a,#FF
ret
NEXTSL:
db #FF ;Ultimo slot devuelto
Ap‚ndice C. Referencias
En este ap‚ndice se muestran algunas direcciones de inter‚s en
Internet.
* P gina de Konamiman: http://www.konamiman.com/msx/obsonet-s.html
Esta p gina contiene informaci¢n sobre ObsoNET, as¡ como las £ltimas
versiones de la BIOS y del software asociado (incluyendo InterNestor
Lite para Ethernet) disponibles para descarga.
* P gina de Realtek: http://www.realtek.co.tw
P gina de los fabricantes del controlador Ethernet RTL8019AS, en el
que se basa ObsoNET.
* The RFC Editor: http://www.rfc-editor.org
Esta p gina contiene todos los RFC (Request for Comments) existentes.
Los RFC son documentos que describen y especifican, entre otras
cosas, los protocolos usados por las aplicaciones de Internet
(protocolos TCP/IP y los basados en ‚stos: Telnet, FTP, SMTP, POP3,
HTTP, IRC...)
* The MSX Resource Center: http://www.msx.org
P gina de noticias y recursos relacionados con el MSX. Si alguien
desarrolla una aplicaci¢n para ser usada con ObsoNET y/o con
InterNestor Lite, probablemente se anunciar aqu¡. :-)
Direcci¢n del autor
N‚stor Soriano Vilchez
EMail: konamiman@konamiman.com
URI: http://www.konamiman.com