Hola
Tengo muy avanzada una libreria para inl en Pascal, ya funciona:
http://hideoworld.iespana.es/msx/inlpascal.png
Esto a modo de anuncio.
Ahora viene la parte especial a ver si la ve el lider:
Tengo un pequeño problema, despues de hacer cualquier llamada a una
funcion del inl, al volver al dos, el ordenador se resetea, de las
funciones INL y las funciones Pascal vuelve bien, asi que no creo que
sea que se pierde algo de la pila, no se si sera cosa del cambio de
paginas. Bueno a ver si a alguien se le ocurre algo. Esto es lo que llevo:
Un saludo.
---------------------------------------------------------------------------------------------^^
Program INLtest;
Type
OpenString = String[255];
LAIP = array [1..4] of byte;
VAR
PUT_P1: array [1..4] of byte;
INL_SEG1,INL_SEG2,INL_P3DIR:integer;
Function INLinstalado :Byte; {Returns 1/0}
VAR temp :Byte;
Begin
Inline (
$AF/ {xor a}
$11/$03/$22/ {LD DE,#2203}
$CD/$CA/$FF/ {call #FFCA}
$32/temp/ {ld (temp),a}
$78/ {ld a,b}
$32/INL_SEG1/ {ld (INL_SEG1),a}
$79/ {ld a,c}
$32/INL_SEG2/ {ld (INL_SEG2),a}
$ED/$63/INL_P3DIR/ {ld (INL_P3DIR),hl}
$01/$0F/$00/ {ld bc,15}
$09/ {add hl,bc}
$11/PUT_P1/ {ld de,PUT_P1}
$01/$03/$00/ {ld bc,3}
$ED/$B0 {ldir}
);
INLinstalado := Temp;
End;
Procedure INLDNS_Q (HostName :OpenString);
VAR temp,temp1,temp2,temp3,temp4,ra,rc :byte;
Begin
writeln('');
writeln('**dns_q por aqui 1**');
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
$21/HostName/ {LD hl,HOSTNAME}
$23/ {inc hl}
$CD/$5D/$40/ {call DNS_Q}
$32/ra/ {ld (ra),a}
$f5/ {push af}
$c1/ {pop bc}
$79/ {ld a,c}
$79/ {ld a,c}
$32/rc/ {ld (rc),a}
$7D/ {ld a,l}
$32/temp1/ {ld (IP1),a}
$7c/ {ld a,h}
$32/temp2/ {ld (IP2),a}
$7b/ {ld a,e}
$32/temp3/ {ld (IP3),a}
$7a/ {ld a,d}
$32/temp4 {ld (IP4),a}
);
writeln('resultado:',rc,',',ra);
writeln('**dns_q por aqui 3**');
End;
Procedure INLDNS_S (Var resultadoa,resultadob,IP1,IP2,IP3,IP4 :byte );
VAR temp,temp1,temp2,temp3,temp4,ra,rb :byte;
Begin
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
$CD/$60/$40/ {call DNS_S}
$32/ra/ {ld (ra),a}
$78/ {ld a,b}
$32/rb/ {ld (rb),a}
$7D/ {ld a,l}
$32/temp1/ {ld (IP1),a}
$7c/ {ld a,h}
$32/temp2/ {ld (IP2),a}
$7b/ {ld a,e}
$32/temp3/ {ld (IP3),a}
$7a/ {ld a,d}
$32/temp4 {ld (IP4),a}
);
ip1:=temp1;
ip2:=temp2;
ip3:=temp3;
ip4:=temp4;
resultadoa:=ra;
resultadob:=rb;
write('<s>:',resultadoa,',',resultadob);
End;
Function INLTCP_OPEN (IP1,IP2,IP3,IP4 :byte; prem,plocal:integer):byte;
VAR ra,rc :byte;
Begin
writeln('');
writeln('**tcp_open por aqui 1**');
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
{ld hl,(IP_REMOTE)}
$3A/IP1/ {ld a,(IP1)}
$6f/ {ld l,a}
$3A/IP2/ {ld a,(IP2)}
$67/ {ld h,a}
{ld de,(IP_REMOTE+2)}
$3A/IP3/ {ld a,(IP3)}
$5f/ {ld e,a}
$3A/IP4/ {ld a,(IP4)}
$57/ {ld d,a}
$dd/$2a/prem/ {ld ix,(PORT_REMOTE)}
$fd/$2A/$FF/$FF/ {ld iy,(PORT_LOCAL)}
{************temporal********}
$3E/$00/ {ld a,(PASSIVE_OPEN)}
$01/$00/$00/ {ld bc,0}
$CD/$63/$40/ {call TCP_OPEN}
$32/ra/ {ld (ra),a}
$f5/ {push af}
$c1/ {pop bc}
$79/ {ld a,c}
$32/rc {ld (rc),a}
);
INLTCP_OPEN:=ra;
writeln('resultado:',rc,',',ra);
writeln('**TCP_OPEN por aqui 3**');
End;
Procedure INLTCP_CLOSE (conexion :byte);
VAR ra,rc :byte;
Begin
writeln('');
writeln('**tcp_close por aqui 1**');
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
$3A/conexion/ {ld a,(conexion)}
$CD/$66/$40/ {call TCP_CLOSE}
$32/ra/ {ld (ra),a}
$f5/ {push af}
$c1/ {pop bc}
$79/ {ld a,c}
$32/rc {ld (rc),a}
);
writeln('resultado:',rc,',',ra);
writeln('**TCP_close por aqui 3**');
End;
Procedure INLTCP_SENDchar (conexion:byte;dato :char);
VAR ra,rc :byte;
Begin
{ writeln('');
writeln('**tcp_sendchar por aqui 1**'); }
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
$3A/conexion/ {ld a,(conexion)}
$21/dato/ {ld hl,temp}
$01/$01/$00/ {ld bc,1}
{cy = 0}
$CD/$6C/$40/ {call TCP_SEND}
$32/ra/ {ld (ra),a}
$f5/ {push af}
$c1/ {pop bc}
$79/ {ld a,c}
$32/rc {ld (rc),a}
);
{ writeln('resultado:',rc,',',ra);
writeln('**TCP_sendchar por aqui 3**'); }
End;
function INLTCP_RCVchar (conexion:byte):char;
VAR ra,rc :byte;
temp :char;
leidos :integer;
Begin
{ writeln('');
writeln('**tcp_rcvchar por aqui 1**'); }
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
$3A/conexion/ {ld a,(conexion)}
$11/temp/ {ld de,temp}
$01/$01/$00/ {ld bc,1}
$CD/$6F/$40/ {call TCP_RCV}
$ED/$43/leidos/ {ld leidos,bc}
$32/ra/ {ld (ra),a}
$f5/ {push af}
$c1/ {pop bc}
$79/ {ld a,c}
$32/rc {ld (rc),a}
);
IF leidos <1 then temp:=chr(0);
INLTCP_RCVchar:=temp;
{ writeln('resultado:',rc,',',ra);
{ writeln('**TCP_rcvchar por aqui 3**'); }
End;
function INLTCP_STATUS (conexion:byte):byte;
VAR ra,rc,temp :byte;
colatrans,colaentra,libretrans :integer;
Begin
Inline (
$AF/ {xor a}
$F5/ {push af}
$3A/INL_SEG1/ {ld a,(INL_SEG1)}
$CD/PUT_P1/ {call PUT_P1}
$F1/ {pop af}
$3A/conexion/ {ld a,(conexion)}
$CD/$72/$40/ {call TCP_STATUS}
$ED/$43/colatrans/ {ld colatrans,bc}
$ED/$53/libretrans/ {ld libretrans,de}
$ED/$63/colaentra/ {ld colaentra,hl}
$32/ra/ {ld (ra),a}
$f5/ {push af}
$c1/ {pop bc}
$79/ {ld a,c}
$32/rc {ld (rc),a}
);
INLTCP_STATUS:=ra;
writeln('resultado:',rc,',',ra,' --- ','trans:',colatrans,' ---
','entra:',colaentra,' --- ','libre:',libretrans);
End;
function Inkey:char;
var bt:byte;
begin
Inkey:=chr(0);
Mem[$FCA9]:=1;
Inline($f3/$fd/$2a/$c0/$fc/$DD/$21/$9F/00
/$CD/$1c/00/$32/bt/$fb);
Inkey:=chr(bt);
Mem[$FCA9]:=0;
end;
Var
resa,resb,conex,stat : byte;
IP : LAIP;
serv:Openstring;
letra,letrain:char;
puerto:integer;
Begin
PUT_P1[4]:=201;
Clrscr;
Write('INL instalado:');
Writeln(INLinstalado);
if (inlinstalado=1) then
begin
write('Servidor:');
readLN(serv);
write('Puerto:');
readLN(puerto);
serv:=serv+chr(0);
INLDNS_Q(serv);
repeat
INLDNS_S(resa,resb,ip[1],ip[2],ip[3],ip[4]);
until resa>1;
writeln(' ');
writeln('resultado:',resa,',',resb);
if resa=2 then
begin
writeln('La IP es:',ip[1],',',ip[2],',',ip[3],',',ip[4]);
conex:=inltcp_open(ip[1],ip[2],ip[3],ip[4],puerto,-32768);
repeat
stat:=INLTCP_STATUS (conex);
until (stat=4) or (stat=0);
if stat=4 then
begin
writeln('conexion abierta');
letra:='w';
repeat
if keypressed then
begin
letra:=inkey;
write(letra);
inltcp_sendchar(conex,letra);
if letra=chr(13) then
inltcp_sendchar(conex,chr(10));
end;
letrain:=inltcp_rcvchar(conex);
if letrain>' ' then write(letrain);
{write(INLTCP_STATUS (conex));}
until letra=chr(27);
inltcp_close(conex);
repeat
until INLTCP_STATUS (conex)=0;
end;
end;
end;
write(INLTCP_STATUS (conex));
readLN(serv);
End.