; erstmal die geschwindigkeit und die fahrtrichtung ins register b mov bh, 127 mov bl, 127 anfang: ; erstma holen wir uns den parport ins haus und schreiben es nach ax. mov dx, 889 in ax, dx ; ax nach dx kopieren mov cx, ax links: mov dx, cx ; wenn dx and-verknpft mit 32 0 ergibt(11001111 AND 00100000 = 0), dann ist die taste fr nach ; links gedrckt. ; jetzt noch das bit auf null setzen, dass, wenn zurueck zu ueberpruef ; gesprungen wird, das ganze nicht nochmal kommt ; (11001111 OR 00100000 = 11101111) and dx, 00100000b cmp dx, 0b jne rechts ; unsere fahrtrichtung ins register a kopieren mov al, bh ; 2 hinzufgen sub al, 3 ; wenn al < 2, dann zu weiter springen cmp al, 3 jb rechts ; sonst zurckkopieren mov bh, al ; wieder ax nach dx kopiern, dann das selbe spiel mit 64 und rechts rechts: mov dx, cx and dx, 01000000b cmp dx, 0b jne vorne ; unsere fahrtrichtung ins register a kopieren mov al, bh ; 2 hinzufgen add al, 3 ; wenn al > 253, dann zu weiter springen cmp al, 252 ja vorne ; sonst zurckkopieren mov bh, al ; mit 16 und vorne vorne mov dx, cx and dx, 00010000b cmp dx, 0b jne hinten ; unsere geschwindigkeit ins register a kopieren mov al, bl ; wenn al > 253, dann zu weiter springen cmp al, 253 ja hinten ; 2 hinzufgen add al, 2 ; sonst zurckkopieren, und weiter pruefen mov bl, al ; 8 und hinten hinten: mov dx, cx and dx, 00001000b cmp dx, 0b jne weiter ; unsere geschwindigkeit ins register a kopieren mov al, bl ; 2 hinzufgen sub al, 2 ; wenn al < 2, dann zu weiter springen jb weiter ; sonst zurckkopieren mov bl, al ;; Das Carry-Flag lschen, sonst sorgt das spter fr verwirrung clc ; register bl: geschwindigkeit bh: fahrtrichtung. 127 = gradeaus ; bzw stehen. < 127 = links bzw rckwrts weiter: ; --------------------------LINKS-RECHTS---------------------------------- ; hier ist das echte gedrehe. erstmal den wert berechnen, den wir zhlen ; mssen, um zur richtigen richtung zu drehen, und zwar sind das zwischen 1 ; und 2 millisekunden, also zwischen 560 und 1120. ; wir haben das register a und d zur verfgung, beide mit den vollen 4 byte. ; zuerst mal den linksrechts-wert mal 141( 560 / 255 * 64 ) ; dann kommt bei lr=0 0ms, bei lr=255 1ms raus ; mal 255, wg den servos. spaeter nochmal mal 2 mov al, bh mov cl, 255 mul cl ; jetzt liegt in ax der sleepwert * 64, d.h. das ganze muss um 6 bit nach rechts ; verschoben werden, dass der tatsaechliche sleep-wert rauskommt. shr ax, 6 ; jetzt steht in ax, irgendwas zwischen 0 und 560. es soll aber etwas zwischen ; 560 und 1120 rein, also nochmal 560 dazu ; Naja, doch nicht 560, die servos sin ein bisschen eigenartig... add ax, 400 ; noch mal zwei, vorhin hat alles in ein byte passen muessen, jetz nich mehr. ; also einfach nach links verschieben ; wiegesagt, die servos... shl ax, 1 ; soviel muessen wir jetzt zaehlen, also los gehts! ; jetzt steht in ax der wert, den wir sleepen muessen, um auf den ; entsprechenden winkel zu lenken, also los gehts. ; erst ax ins zaehlregister, ecx schreiben, dann parport datapin 1 an ; und dann sinnlos loopen. hinterher parport wieder aus. mov cx, ax ; Die Adresse vom Parport ist 888 mov dx, 888 mov ax, 0 mov al, 1b out dx, al call sleep mov al, 0 out dx, al ;-----------------------VORNE-HINTEN------------------------- ; jetzt den vh-wert mal 141( 560 / 255 * 64 ) ; dann kommt bei vh=0 0ms, bei vh=255 1ms raus mov ax, 0 mov al, bl mov cl, 220 mul cl ; jetzt liegt in ax der sleepwert * 64, d.h. das ganze muss um 6 bit nach rechts shr ax, 6 ; jetzt steht in ax, irgendwas zwischen 0 und 560. es soll aber etwas zwischen ; 560 und 1120 rein, also nochmal 560 dazu add ax, 350 ; das ganze nochmal mal zwei, also eins nach links shl ax, 1 ; soviel muessen wir jetzt zaehlen, also los gehts! ; jetzt steht in ax der wert, den wir sleepen muessen, um auf den ; entsprechenden winkel zu lenken, also los gehts. ; erst ax ins zaehlregister, ecx schreiben, dann parport datapin 1 an ; und dann sinnlos loopen. hinterher parport wieder aus. mov cx, ax ; Die Adresse vom Parport ist 888 mov dx, 888 mov ax, 0 mov al, 10b out dx, al ; einfach unsere Prozedur aufrufen, die zaehlt das ganze dann ab. call sleep mov al, 0 out dx, al ;Nun noch 17 (20 - 3) ms warten... mov ecx, 16800 call sleep ; jetzt 1 ins register a schreiben, dann interrupt 22 aufrufen, wenn der ; interrupt a mit zero berschreibt, ist kein zeichen auf der tastatur ; gedrckt, und wir fangen von vorne an. mov ah, 01h int 16h jz anfang ; wenn nicht zero, dann taste gedrckt -> taste holen, dass sie nicht ; strt, d.h. hinterher in der cmdline steht, dann ende mov ah, 0h int 16h mov ax, 4c00h int 21h ;------------------------FUNKTIONEN----------------------------------- sleep: dosleep: loop dosleep ret