Die parallele schnittstelle Programmierung

 

Programmierung und Zugang zu Häfen

 

 
 

parallele schnittstellebasisadresse 

Erstens ist etwas Verfahren wegen es, Sie fähig sein, sich zu entschließen, welcher die gemeine Adresse für den schnittstelle ist.

Als es wurde vorher gesagt, der parallele schnittstelle hat seine gemeine Adresse in Doppelverkehr von Gedächtnis aufeinanderfolgend. Dann ist der Inhalt dieser Richtungen des Gedächtnisses wegen gelesen, um sich zu entschließen, wenn ein schnittstelle existiert, und das seine Richtung ist.

MSDOS

Unter MSDOS kann der externe Befehl gebrauchte debug.exe auf die folgende Weise sein:

Exec der Befehl: debug.exe, bald erscheint das Symbol -

Schreiben Sie d 40:0008 nach diesem Zeichen

Von der Ausrüstung abzuhängen, erscheint den Staat der Erinnerung an die folgende Form: (die Daten können sich ändern)

0040:0000 ______________________78 03 00 00 00 00 00 00

Die Richtung des schnittstelles ist in umgekehrter Form (78 03), dann ist die Richtung:

0378 in hexadecimal. Es ist möglich, Benachrichtigung zu machen, daß diese Richtung in anderem PC anders sein kann.

(Schreiben Sie Q, um debug.exe zu verlassen)

In Turbo Pascal mit Assembler

{Archivo analisis.pas}

{Analizador de estado del Puerto Paralelo}

{Autor: Juan Carlos Galarza Roca}

{Diciembre de 1997}

{Versión : 1.0}

Program analisis_PP;

uses crt, dos, cadena, utiles;

var

dir_base,

dir_estado,

dir_control : Word;

puntero_int_1C : Pointer;

tick : Integer;

sw_m_t : Integer;

{$F+,S-,W-}

procedure manejador; interrupt;

{Este manejador se utiliza para temporizar el despliegue del

indicador de exploración, de modo que se haga la lectura de

datos y a la vez se despliegue el indicador}

var

a,

b,

x,

y : Integer;

begin

if sw_m_t=0 then begin;

{sw_m_t es la bandera del manejador de tareas

Esta bandera es actualizada por el programa

principal

}

x:=whereX;

y:=whereY;

{se guarda la posición del cursor en la pantalla}

tick:=tick+1;

{ La variable tick se incrementa cada 18,20677500572 segundos}

a:=6;

b:=3;

textcolor(7);

gotoxy(39+a,b);write('Explorando... ');

textcolor(2);

case tick of

13: begin gotoxy(60+a,b); write('> ');

gotoxy(52+a,b); write(' <');end;

15: begin gotoxy(60+a,b); write('-> ');

gotoxy(52+a,b) ;write(' <-');end;

17: begin gotoxy(60+a,b); write(' -> ');

gotoxy(52+a,b); write(' <- ');end;

19: begin gotoxy(60+a,b); write(' -> ');

gotoxy(52+a,b); write(' <- ');end;

21: begin gotoxy(60+a,b); write(' -> ');

gotoxy(52+a,b); write(' <- ');end;

23: begin gotoxy(60+a,b); write(' -> ');

gotoxy(52+a,b); write(' <- ');end;

25: begin gotoxy(60+a,b); write(' <- ');

gotoxy(52+a,b); write('< ');end;

27: begin gotoxy(60+a,b); write(' <- ');

gotoxy(52+a,b); write(' -> ');end;

29: begin gotoxy(60+a,b); write(' <- ');

gotoxy(52+a,b); write(' -> ');end;

31: begin gotoxy(60+a,b); write(' <- ');

gotoxy(52+a,b); write(' -> ');end;

33: begin gotoxy(60+a,b); write('<- ');

gotoxy(52+a,b); write(' -> ');end;

34: tick:=13;

end;

gotoxy(x,y);

{Devolver la posición original del cursor}

end;

end;

{$F-,S+}

begin

cursor_off;

tick:=0;

{Colocar el manejador de tareas}

GetIntVec($1C,puntero_int_1C);

SetIntVec($1C,Addr(manejador));

clrscr;

dir_base:=memW[$0040:0008];

dir_estado:=dir_base+1;

dir_control:=dir_base+2;

textcolor(2);

gotoxy(23,2);writeln('Analizador del Puerto Paralelo');

textcolor(9);

gotoxy(8,4); writeln('Direcciones: ');

textcolor(9);

gotoxy(10,5); writeln('Datos : ',dec_a_hexa(dir_base),' (h)');

gotoxy(10,6); writeln('Estado : ',dec_a_hexa(dir_estado),' (h)');

gotoxy(10,7); writeln('Control: ',dec_a_hexa(dir_control),' (h)');

{Ciclo repetivo principal}

repeat

sw_m_t:=1;

textcolor(9);

gotoxy(34,4); writeln('Estado: ');

gotoxy(36,5); write('Datos : ',port[dir_base]:3,' (d) ');

dec_bin(port[dir_base]);write(' (b)');

gotoxy(36,6); write('Estado : ',port[dir_estado]:3,' (d) ');

dec_bin(port[dir_estado]);write(' (b)');

gotoxy(36,7); write('Control: ',port[dir_control]:3,' (d) ');

dec_bin(port[dir_control]);write(' (b)');

textcolor(7);

gotoxy(9,9); write('Registro de Datos');

gotoxy(25,10); write('Pines 9 8 7 6 5 4 3 2');

gotoxy(25,11); write('Nombre D7 D6 D5 D4 D3 D2 D1 D0');

textcolor(2);

gotoxy(25,12); write('Valor '); dec_bin2(port[dir_base]);

textcolor(7);

gotoxy(9,14); write('Registro de Estado');

gotoxy(25,15); write('Pines 11 10 12 13 15 ** ** **');

gotoxy(25,16); write('Nombre -S7 S6 S5 S4 S3 ** ** **');

textcolor(2);

gotoxy(25,17);write('Valor '); dec_bin2(port[dir_estado]);

textcolor(7);

gotoxy(9,19); write('Registro de Control');

gotoxy(25,20); write('Pines ** ** ** ** 17 16 14 1');

gotoxy(25,21); write('Nombre ** ** ** ** -C3 C2 -C1 -C0');

textcolor(2);

gotoxy(25,22);write('Valor '); dec_bin2(port[dir_control]);

textcolor(2);

gotoxy(8,24);write('[Copyrigth (c) 1997 por JCGR Soft <pparalelo@hotmail.com>]');

textcolor(7);

sw_m_t:=0;

delay(100);

until keypressed;

cursor_on;

{Restaurar manejador de tareas}

SetIntVec($1C,puntero_int_1C);

end.

Port[dir_base]:=5;

     

    In C

    Outportb(dir_base, 5);

    In Assembler

mov dx, dir_base {Direccionar en dx la dirección base}

mov al, 5 {Colocar en ² al ² el número 5}

out dx, al {Enviar al puerto}

Var dato: byte;

dato:=Port[dir_estado];

unsigned int dato;

dato=inport(dir_estado);

mov dx, dir_estado {Direccionar dx con el registro de estado del puerto}

in al, dx {Leer del puerto. En el registro ² al ² está el dato leído}

 

Fragen? pparalelo@hotmail.com

Google