$MOD51
$TITLE(Scanner & Bambino Stepper Motor Driver ©2001)
$DEBUG
$OBJECT
$NOPAGING

	; Variables Description
	; R0-Randomize
	; R1-Actual Driver Mode
	; R1.0 - Speed M1
	; R1.1 - Speed M2
	; R1.2 - Changing Mode for M2 Enabled
	; R1.3 - -||-
	; R1.4 - Phase M1
	; R1.5 - Phase M2
	; R1.6 - ???
	; R2-Motors Acceleration
	; R3-Cykl1
	; R4-Cykl2
	; R5-M2 Off Delay
	; R6-Register for M1
	; R7-Register for M2

	ORG 0 		; Zaciatocna adresa programu v pamati

	MOV P1,#0 	; Vychodzie hodnoty
	MOV P3,#255
	MOV R6,#7
	MOV R7,#7

STOP: 
	INC R0 		; Rezim cakania na signal Bass P3.7 + randomize
	JB P3.7,STOP
START: 
	MOV R2,#12 	; <- Predvolba akceleracie (zvacsit ak motor vypadava zo synchronizacie a nemoze utiahnut zataz)
	MOV A,R0 	; Inicializacia noveho nahodneho rezimu drivera
	JB ACC.2,MoveM2
	JB ACC.3,MoveM2
	JB ACC.6,MoveM2
	XRL A,R1 	; Ak by nahodou bolo nahodne cislo rovnake, tak ho invertuj
	MOV R1,A
	INC R0 		; Generovanie nahodneho cisla
	AJMP RUN

MoveM2: 
	ANL A,#11011101B ; LSB .... MSB
	XRL A,R1
	MOV R1,A
RUN:
 	LCALL M1 	; Krok motora M1
	LCALL M2 	; Krok motora M2
	LCALL OUT 	; Nastavenie vystupov a zdrzanie programu
	MOV A,R1 	; Ak je velka rychlost motora M1
	JNB ACC.0,M1SPD1
	LCALL M1 	; Sprav dalsi krok M1
M1SPD1:
 	INC R0 		; Randomize
	MOV A,R1 	; Ak je velka rychlost motora M2
	JNB ACC.1,M2SPD1
	LCALL M2	; Sprav dalsi krok M2

M2SPD1:
	LCALL OUT 	; Nastav vystupy, zdrzanie programu
	MOV R5,#255 	; Inicializacia dobehu motora M2 xx-krokov po Bass off
	INC R0 		; Randomize
	JNB P3.7,RUN 	; Ak je signal Bass opakuj
	;---------------Ak nieje signal Bass netoc motorom M1 a dotoc M2
OnlyM2: 
	LCALL M2 	; Krok M2
	LCALL OUT 	; Nastavenie vystupov a zdrzanie programu
	INC R0 		; Randomize
	JNB P3.7,START 	; Ak sa objvail signal BASS odstartuj novy mod driveru
	MOV A,R1 	; Ak je velka rychlost M2
	JNB ACC.1,SPD1
	LCALL M2 	; Sprav dalsi krok
	SPD1: INC R0 	; Randomize
	LCALL OUT 	; Nastavenie vystupov a zdrzanie programu
	INC R0 ; Randomize
	JNB P3.7,START 	; Ak sa objavil signal Bass Odstartuj novy mod driveru
	DJNZ R5,OnlyM2 	; Ak trva dobeh M2 bez signalu Bass
	LJMP STOP 	; Ak skoncil dobeh M2 a nieje signal Bass
;----------------------------------------------------------------------------

;Podprogram M1 --------------------------------------------------------------
M1: 
	MOV A,R1 	; Zistenie smeru krutenia matora M1
	JB ACC.4,M1R
M1L: 
	MOV A,R6 	; Krok M1 v Lavo
	RL A
	MOV R6,A
	INC R0
	RET

M1R: 
	MOV A,R6 	; Krok M1 v Pravo
	RR A
	MOV R6,A
	RET

;Podprogram M2 --------------------------------------------------------------
M2: 
	MOV A,R1 	; Zistenie smeru krutenia motora M2
	JB ACC.5,M2R
M2L: 
	MOV A,R7 	; Krok M2 v Lavo
	RL A
	MOV R7,A
	INC R0
	RET
M2R: 
	MOV A,R7 	; Krok M2 v Pravo
	RR A
	MOV R7,A
	RET
;Podprogram OUT -------------------------------------------------------------
OUT: 
	CJNE R2,#0,ACCEL; Ak je nejake Acceleration delay
	AJMP NOACCEL
ACCEL: 
	DEC R2 		; Tak ho zmensi
NOACCEL:
	INC R0
	MOV A,R2 	;
	ADD A,#6 	; Acceleration delay + Default speed delay
	MOV R3,A 	; Nove Speed delay = Acceleration + Default

CYKL1: 
	MOV R4,#100 	; Spomalovacie cykly
CYKL2: 
	INC R0 		; Randomize
	NOP
	DJNZ R4,CYKL2
	DJNZ R3,CYKL1
	MOV P1,#0 	; Zopnutie vsetkych vystupov barny P1 do 0
	MOV A,R6 	; A=Register M1
	JNB ACC.0,M11 	; Testovanie kazd. druheho bitu a nastavovanie vystupov
	SETB P1.0
M11: 
	JNB ACC.2,M12
	SETB P1.1
M12: 
	JNB ACC.4,M13
	SETB P1.2
M13: 
	JNB ACC.6,M14
	SETB P1.3
M14: 
	INC R0
	MOV A,R7 	; A=Register M2
	JNB ACC.0,M21 	; Testovanie kazd. druheho bitu a nastavovanie vystupov
	SETB P1.4
M21: 
	JNB ACC.2,M22
	SETB P1.5
M22: 
	JNB ACC.4,M23
	SETB P1.6
M23: 
	JNB ACC.6,M24
	SETB P1.7
M24: 
	INC R0
	RET
END

