Da es hier mindestens 2 MFA-Nutzer gibt, sowie einen zukünftigen MFA-Nutzer und ich auch schon danach gefragt wurde, hier etwas zur Tastatur des Mikrocomputers für Ausbildung:
Pinbelegung der Tataturbuchse:
Code
01 DB0 09 +12V
02 DB1 10 GND
03 DB2 11 +5V
04 DB3 12 n/c
05 DB4 13 n/c
06 DB5 14 n/c
07 DB6 15 Bell (wird durch T1 auf GND gezogen)
08 Strobe
Pinbelegung von Hier
Da ich keine passende Tastatur habe, habe ich mir einfach schnell etwas für den Parallelport des PCs gebastelt:
Die Verdrahtung ist recht einfach:
DB25->DB15
1->8 2->1 3->2 4->3 5->4 6->5 7->6 8->7
wie auch das Programm:
Beenden geht mit F10
Für schnelle Rechner ungeeignet.
Code
.model TINY
.code
org 100h
Prog:
xor ax,ax
push es
mov es,ax ;holen des Interruptvectors 1C; ein eintrag in der IVT =4byte
mov bx,[es:112] ;Und Speichern des Vektors in der Variable TimerTick
push bx ;Die IVT liegt an Adresse 0000:0000 mit 4bytes pro Eintrag
mov bx,[es:114] ; $1C*4=112dez
push bx
cli ;deaktivieren der Interrupts
mov bx, OFFSET DelayInit ;setzen des neuen Interruptvektors
mov [es:112],bx
mov [es:114],cs
sti ;erneutes Aktivieren der Interrupts
xor cx,dx ;Initialisierung meiner Zählvariablen
xor dx,dx
DelayInit_Start: ;warten auf den ersten Int für den Start der Initialisierung
cmp Byte PTR delayconst,00h
je DelayInit_Start
DelayInit_: ;Warten auf den zweiten Int
inc cx
nop
cmp cx,0000h ;mit cmp gearbeitet für bessere Übereinstimmung
jne DelayInit_NO ;mit Eigentlicher Delayschleife
inc dx
DelayInit_NO:
cmp Byte PTR delayconst,00h
jne DelayInit_
cli
pop bx ;zurücksetzen der Interruptumleitung
mov [es:114],bx
pop bx
mov [es:112],bx
sti
pop es
;############################## an PC angepasst ##############################
;18,2 Ticks/s = 1 Tick~60ms
mov bx,cx
mov cx,06h ;Teilen durch 64 um nahe an 1ms für das Delay zu kommen
div_loop:
shr dx,1 ;8086 code, brauche ausserdem den Übertrag
rcr bx,1
loop div_loop
mov Word PTR delayconst,bx
mov Word PTR delayconst+2,dx
;////////////////////////////// an PC angepasst //////////////////////////////
mov dx,OFFSET OK1 ;Augabe String per Int
mov ah,09
int 21h
Hauptschleife:
mov bl,ah ;sichern des letzten Zeichens auf bl, da ah überschrieben wird
;für 2byte Tastencodes
mov ah,08h ;Ersatz für readkey (Unit crt läuft nicht auf dem Pofo)
int 21h ;wartet auf einen Tastendruck und liefert den Tastencode in al zurück
cmp bl,00h ;wenn Tastencode<>0, dann normal weiter
jne No_Fmenue
cmp al,44h ;F10 gedrückt==Ende
je End_
No_FMenue:
mov ah,al ;sichern von al für 2byte Tastencodes, alle anderen Register werden überschrieben
;############################## an PC angepasst ##############################
;Beim Pofo sind die Steueregister vertauscht
mov dx,word PTR [baseport] ;Ausgabe des Zeichens an den Parallelport
Out dx,al
mov al,01h
inc dx
inc dx ;Und setzen von Strobe
Out dx,al
;////////////////////////////// an PC angepasst //////////////////////////////
xor cx,cx ;zurücksetzen der Zählvariablen
xor bx,bx ;dx wird nicht verwendet, wird zum zurücksetzen von Strobe benötigt
Delay: ;Delayschleife und Delayinit sollten einigermaßen gleich sein
inc cx ;sieht daher evtl. etwas merkwürdig aus
NOP
cmp bx,Word PTR delayconst+2
je Delay_End
cmp cx,0000h
jne Delay
inc bx
cmp bx,Word PTR delayconst+2
je Delay
Delay_End:
cmp cx,Word PTR delayconst
jne Delay
;############################## an PC angepasst ##############################
;Beim Pofo sind die Steueregister vertauscht
xor al,al ;zurücksetzen von Strobe
out dx,al
;////////////////////////////// an PC angepasst //////////////////////////////
jmp Hauptschleife
;################################## Variablen ##################################
OK1:
db 'OK$'
delayconst:
dd 00000000h ;Delaykonstante, wird noch initialisiert
;############################## an PC angepasst ##############################
BasePort:
dw 0378h ;Basisadresse des Parallelports
;;////////////////////////////////// Variablen //////////////////////////////////
DelayInit: ;Interuptroutine für die Initialisierung der Delaykonstante
not Byte PTR delayconst ;Unit CRT läuft nicht auf dem Pofo
iret ;macht aus $00 ein $FF und umgekehrt - flag für Start/Ende des Delayinit
End_:
mov ax,4C00h
int 21h
End Prog
Alles anzeigen
siehe auch: http://www.dosforum.de/viewtopic.php?f=4&t=6175&p=67257&hilit=MFA#p67257
Viel Spaß