All pastes #140400 Raw Edit

Untitled

public text v1 · immutable
#140400 ·published 2006-08-20 12:52 UTC
rendered paste body
; Adresse vom Parallelport

;.data

;ParportOut: dw 888

;ParportIn: dw 889

;LinksRechts: db 127

;VorneHinten: db 127



; .code

; 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



ueberpruef:

mov dx, ax

; wenn dx and-verknpft mit 32 0 ergibt(11001111 AND 00100000 = 0), dann ist die taste fr nach

; links gedrckt.

; jetzt noch das bit auf null setzen, dass, wenn zurueck zu ueberpruef

; gesprungen wird, das ganze nicht nochmal kommt

; (11001111 OR 00100000 = 11101111)

or ax, 00100000b

and dx, 00100000b

cmp dx, 0b

je nachlinks

; wieder ax nach dx kopiern, dann das selbe spiel mit 64 und rechts

mov dx, ax

or ax, 01000000b

and dx, 01000000b

cmp dx, 0b

je nachrechts

; mit 16 und vorne

mov dx, ax

or ax, 00010000b

and dx, 00010000b

cmp dx, 0b

je nachvorne

; 8 und hinten

mov dx, ax

or ax, 00001000b

and dx, 00001000b

cmp dx, 0b

je nachhinten



;; Das Carry-Flag l”schen, sonst sorgt das sp„ter fr verwirrung

clc

jmp weiter

; register bl: geschwindigkeit bh: fahrtrichtung. 127 = gradeaus

; bzw stehen. < 127 = links bzw rckw&#132;rts

nachvorne:

	; unsere geschwindigkeit ins register a kopieren

	mov al, bl

	; wenn al > 253, dann zu weiter springen

	cmp al, 253

	ja ueberpruef

	; 2 hinzufgen

	add al, 2

	; sonst zurckkopieren, und weiter pruefen

	mov bl, al

	jmp ueberpruef

nachhinten:

	; unsere geschwindigkeit ins register a kopieren

	mov al, bl

	; 2 hinzufgen

	sub al, 2

	; wenn al < 2, dann zu weiter springen

	jb ueberpruef

	; sonst zurckkopieren

	mov bl, al

	jmp ueberpruef

nachrechts:

	; unsere fahrtrichtung ins register a kopieren

	mov al, bh

	; 2 hinzufgen

	add al, 3

	; wenn al > 253, dann zu weiter springen

	cmp al, 252	

	ja ueberpruef

	; sonst zurckkopieren

	mov bh, al	

	jmp ueberpruef

nachlinks:

	; unsere fahrtrichtung ins register a kopieren

	mov al, bh

	; 2 hinzufgen

	sub al, 3

	; wenn al < 2, dann zu weiter springen

	cmp al, 3

	jb ueberpruef

	; sonst zurckkopieren

	mov bh, al

	jmp ueberpruef



weiter:

; --------------------------LINKS-RECHTS----------------------------------



; hier ist das echte gedrehe. erstmal den wert berechnen, den wir z&#132;hlen 

; mssen, 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 verfgung, 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 

; gedrckt, und wir fangen von vorne an.

mov ah, 01h

int 16h

jz anfang

; wenn nicht zero, dann taste gedrckt -> taste holen, dass sie nicht

; st&#148;rt, 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