HispaMSX

Libreria INL para Turbo Pascal... y Pequeño problemilla.

2005-11-01 23:43:53
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.


<Anterior en la conversación] Conversación actual [Siguiente en la conversación>