	.DATA
	Org	20H
EnableMotor	Ds	1
sTEP		dS	1
	.CODE
Init_Serial		EQU	1B8H
Serial_Out		EQU	1C8H
ROM			EQU	2000H
TabelKecepatan		EQU	50H
PointerKecepatan	EQU	41H
JumlahMotor		EQU	8
StepKecepatan		EQU	30

	Org	ROM			;Reset Vector
	Ajmp	Start			;
	Org	ROM+3H			;External Interrupt 0 Vector
	Reti				;
	Org	ROM+0BH			;Timer 0 Interrupt Vector
	Reti				;
	Org	ROM+13H			;External Interrupt 1 Vector
	Reti				;
	Org	ROM+1BH			;Timer 1 Interrupt Vector
	Reti				;
	Org	ROM+23H			;Serial Interrupt Vector
	Ajmp	Serial_Interrupt
;---------
;- Aktifkan Serial Interrupt
;- Isi Tabel Kecepatan dan Tabel Pointer Data Kecepatan
;- Kirim seluruh isi tabel kecepatan ke P1 berulang-ulang
;- Keaktifan motor atau perubahan motor akan terjadi setiap terjadi serial 
;  interrupt
;---------
Start:
	Lcall	Init_Serial		;Inisial Serial Port 9600 bps
	mOV	sTEP,#00h
	
	Setb	EA			;Aktifkan Serial Interrupt
	Setb	ES			;
	Mov	EnableMotor,#00H	;Aktifkan semua motor
	Acall	IsiTabel		;Isi Tabel Kecepatan dan Pointer data kecepatan

Loop2Motor:
	Mov	R0,#TabelKecepatan	;R0 menuju ke tabel data kecepatan motor
	Mov	R7,#StepKecepatan	;R7 diisi dengan jumlah step kecepatan

LoopMotor:
	Mov	A,@R0			;Ambil data di tabel keceptan motor
	Mov	B,EnableMotor		;OR kan dengan keaktifan motor
	Orl	A,B			;
	Mov	P1,A			;Kirim ke P1
	Inc	R0			;Tunjuk tabel kecepatan berikutnya
	Djnz	R7,LoopMotor		;Lakukan hingga sejumlah step kecepatan
	Ajmp	Loop2Motor		;Kembali ke loop2Motor

;-------------
;Isi Tabel Kecepatan dengan FF atau tidak ada kecepatan
;Isi Tabel Alamat Step Kecepatan dengan alamat awal dari Tabel Kecepatan
;-------------

IsiTabel:
	Mov	R0,#TabelKecepatan		;R0 ke alamat awal tabel ke
						;cepatan motor
	Mov	R7,#StepKecepatan		;R7 diisi dengan jumlah step
						;kecepatan

LoopKecepatanAwal:
	Mov	@R0,#0FFH			;Isi FFH di seluruh data
	Inc	R0				;kecepatan motor
	Djnz	R7,LoopkecepatanAwal		;
	Mov	R0,#PointerKecepatan		;R0 ke alamat awal tabel alamat
						;step kecepatan motor
	Mov	R7,#JumlahMotor			;R7 dengan jumlah motor

IsiAlamatMotor:
	Mov	@R0,#TabelKecepatan		;Isi tabel pointer data kecepatan
	Inc	R0				;dengan alamat awal pointer kecepatan
	Djnz	R7,IsiAlamatMotor		;
	Ret


;------
;Penambahan kecepatan
;- Ambil pointer kecepatan motor di alamat ini ditunjuk oleh kode
;  yang diterima (R0)
;- Apabila pointer menunjuk ke akhir tabel maka pointer tidak berubah
;- Apabila pointer belum menunjuk ke akhir tabel maka pointer akan menuju ke
;  alamat berikutnya

TambahKecepatan:
	Mov	A,@R0			;Ambil alamat data kecepatan terakhir dari
					;motor tersebut 
	Cjne	A,#StepKecepatan+TabelKecepatan,TidakResetAlamat ;Bila alamat
					;terakhir, kembali ke alamat awal

	Clr	ES
	Mov	A,#'!'
	Lcall	Serial_Out
	Setb	ES
	Mov	@R0,A
	Ret

TidakResetAlamat:
	Push	A			;Pointer menunjuk ke alamat berikut
	Inc	A			;
	Mov	@R0,A			;
	Pop	A			;
	Ret

;-------------
;- Ambil alamat step kecepatan yang terakhir dan bila belum mencapai
;  alamat awal, tunjuk ke alamat sebelumnya dan simpan kembali ke tabel
;- Bila mencapai alamat awal, maka tetap tahan di alamat tersebut

KurangiKecepatan:
	Mov	A,R0			;Ambil Kode yang diterima
	Clr	C			;
	Subb	A,#JumlahMotor		;Kode yg diterima - JumlahMotor = alamat
					;tabel pointer data kecepatan terakhir dari motor
					;yang diakses
	Mov	R0,A			;Ambil pointer data kecepatan terakhir
	Mov	A,@R0			;tersebut 
	Cjne	A,#TabelKecepatan,Tidak2resetAlamat ;Bila alamat bukan
					;pointer awal, maka menuju alamat step
					;sebelumnya
LihatCarry2:
	Mov	A,#TabelKecepatan	;bila alamat awal maka, tahan di alamat
	Mov	@R0,A			;tersebut
	Ret

Tidak2ResetAlamat:
	Dec	A			;Menuju ke alamat step sebelumnya
	Mov	@R0,A			;simpan di tabel alamat step
	Ret

;--------
;INTERRUPT SERVICE ROUTINE
;--------
Serial_Interrupt:
	Clr	ES			;Disable Interrupt
	Mov	P1,#0FFH		;Matikan semua motor sejenak
	Mov	A,SBUF			;Simpan perintah di R5

;-------
;Terjemahkan perintah yang diterima dari serial
;- Perintah '>' untuk pengaturan kecepatan
;	A.....H = Motor 1.....Motor 8 ditambah kecepatan
;	I.....P = Motor 1.....Motor 8 dikurangi kecepatan
;  Contoh:
;	- Menaikkan kecepatan motor 1: >A
;	- Mengurangi kecepatan motor 8: >P
;
;  Bila kecepatan mencapai maksimal atau minimal maka kecepatan akan bertahan
;  di sana
;- Perintah '!' untuk mengatur keaktifan motor
;	A.....H = Motor 1.....Motor 8 aktif
;	I.....P = Motor 1.....Motor 8 non aktif
;  Contoh:
;	- Mengaktifkan motor 7: !G
;	- Menonaktifkan motor 3: !K
;------------
	Cjne	A,#'>',Bukan_Kecepatan	;
	Ajmp	Kecepatan

Bukan_Kecepatan:
	Cjne	A,#'!',Kembali		

;---------
;Mengatur keaktifkan Motor
;Keaktifan motor diatur oleh variabel EnableMotor
;Variabel ini terdiri dari 8 bit di mana bit 0 adalah Motor 1 hingga bit 8 adalah
;motor 8. Bit 1 menandakan motor non aktif dan bit 0 menandakan motor aktif
;---------
	Clr	RI			;Ambil kode keaktifan motor
	Jnb	RI,*			;
	Mov	A,SBUF			;
	Clr	C			;
	Subb	A,#'A'			;Kode keaktifan - 'A' = urutan aksi motor
	Mov	DPTR,#AksiMotor		;DPTR menunjuk ke alamat awal aksi motor
	Mov	R0,#EnableMotor		;R0 menunjuk alamat variabel keaktifan
	Mov	B,#07			;Urutan aksi motor * 7 (ukuran area yg
	Mul	AB			;dipakai utk tiap urutan aksi motor)
	Jmp	@A+DPTR			;Lompat ke alamat urutan aksi motor

Kecepatan:
	Clr	RI
	Jnb	RI,*
	Mov	R5,SBUF
;------------
;- Periksa apakah perintah pengurangan atau penambahan kecepatan
;------------
	Mov	R0,05H			;Kode Motor yang diakses -> R0
	Cjne	R0,#PointerKecepatan+JumlahMotor,LihatCarry ;Kode yang diterima
					;> dari 'H' maka pengurangan kecepatan
LihatCarry:				;
	Jnc	PerintahPengurangan	;
					;Bila tidak maka penambahan kecepatan
	Acall	TambahKecepatan		;

;-------
;- Proses penambahan kecepatan/mengaktifkan motor dilakukan dengan 
;  meng-clear bit-bit dari motor yang diakses di alamat yang ditunjuk 
;  oleh pointer data kecepatan
;- Proses pengurangan kecepatan/menonaktifkan motor dilakukan dengan men-set
;  bit-bit dari motor yang diakses di alamat yang ditunjuk oleh pointer data
;  kecepatan
;------
AksiMotor2:
	Mov	R0,A			;R0 diisi alamat step kecepatan yang
					;akan diubah
	Mov	DPTR,#AksiMotor		;DPTR ke alamat awal tabel aksi motor
	Mov	A,R5			;Kode yg diterima - 'A' = Urutan
	Clr	C			;aksi motor
	Subb	A,#'A'			;
	Mov	B,#07			;Urutan aksi motor * 7 (area yg digunakan
	Mul	AB			;setiap urutan)
	Jmp	@A+DPTR			;Lompat ke alamat urutan aksi motor

PerintahPengurangan:
	Acall	KurangiKecepatan
	Ajmp	AksiMotor2

Kembali:		
	Clr	RI			;Hapus Flag Receive
	Clr	TI			;Hapus Flag Transmit
	Setb	ES			;Enable Serial Interrupt
	Reti				;Kembali dari interrupt

;----------
;Lakukan set atau clear bit di alamat yang ditunjuk oleh R0
;- Untuk mengatur kecepatan
;	- R0 diisi alamat step kecepatan
;	- Set/clear di bit yang tergantung dari motor yang diakses pada alamat yg
;	  ditunjuk R0
;- Untuk mengatur keaktifan
;	- R0 diisi alamat variabel keaktifan motor (EnableMotor)
;	- Set/clear di bit yang tergantung dari motor yang diakses
;-----------

AksiMotor:
;Tambah Kecepatan/aktifkan Motor 1
	Mov	A,@R0
	Clr	A.0
	Mov	@R0,A
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 2
	Mov	A,@R0
	Clr	A.1
	Mov	@R0,A
;	iNC	sTEP
;	mOV	a,sTEP
;	lCALL	197h
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 3
	Mov	A,@R0
	Clr	A.2
	Mov	@R0,A
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 4
	Mov	A,@R0
	Clr	A.3
	Mov	@R0,A
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 5
	Mov	A,@R0
	Clr	A.4
	Mov	@R0,A
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 6
	Mov	A,@R0
	Clr	A.5
	Mov	@R0,A
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 7
	Mov	A,@R0
	Clr	A.6
	Mov	@R0,A
	Ljmp	Kembali
;Tambah Kecepatan/aktifkan Motor 8
	Mov	A,@R0
	Clr	A.7
	Mov	@R0,A
	Ljmp	Kembali

;Kurangi Kecepatan/nonaktifkan Motor 1
	Mov	A,@R0
	Setb	A.0
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 2
	Mov	A,@R0
	Setb	A.1
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 3
	Mov	A,@R0
	Setb	A.2
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 4
	Mov	A,@R0
	Setb	A.3
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 5
	Mov	A,@R0
	Setb	A.4
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 6
	Mov	A,@R0
	Setb	A.5
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 7
	Mov	A,@R0
	Setb	A.6
	Mov	@R0,A
	Ljmp	Kembali
;Kurangi Kecepatan/nonaktifkan Motor 8
	Mov	A,@R0
	Setb	A.7
	Mov	@R0,A
	Ljmp	Kembali


