**************** RUTIN-RUTIN ARIMATIKA DAN KONVERSI *************
;
;Cara Penggunaan Subroutine
;- Subroutine penambahan & pengurangan
;	- Isi Operand dan Operand 2
;	- R0 pada Operand dan R1 pada Operand2
;	- Panggil subroutine penambahan/pengurangan
;	- Operand  2 berfungsi sebagai nilai pengurang pada subroutine 
;	  pengurangan
;	- Hasil terdapat pada lokasi operand
;- Subroutine melihat hasil
;	- Set R0 pada digit terbesar dari memori yang dilihat
;	- Panggil Subroutine Lihat Hasil
;- Subroutine pembagian/perkalian
;	- Isi operand dengan bilangan yang akan dibagi/dikali
;	- Isi hasil kali/hasil bagi dengan bilangan pengali/pembagi
;	- Panggil Subroutine perkalian/pembagian
;	- Hasil terdapat pada bagian yg ditunjuk oleh hasil kali/hasil bagi
;- Subroutine konversi bilangan dasar
;	- Isi Dasar Bilangan dengan dasar bilangan yang akan dikonversi
;	- Isi bilangan yang akan dikonversi pada Operand
;	- Panggil Subroutine konversi bilangan dasar
;	- Hasil terdapat pada lokasi Hexdec_Buff
	.DATA
	ORG	*
SizeX	EQU	5			;Aritmatik Operasi 4 byte
Lokasi_Titik	EQU	0

;VARIABEL
Dasar_Bilangan	Ds	1		;Dasar Bilangan untuk konversi
HexDec_Ptr	Ds	1
Operand 	DS SizeX		;Bilangan yang dikurang/ditambah
Operand2	Ds SizeX		;Bilangan pengurang/penambah
Pembagi 	DS SizeX		;Bilangan pembagi
HasilBagi 	DS SizeX		;Hasil bagi
SisaBagi 	DS SizeX		;Sisa pembagian (hanya digunakan pada
					;Subroutine konversi bilangan dasar)
Pengali 	EQU Pembagi		;Lokasi pengali = lokasi pembagi
HasilKali 	EQU HasilBagi		;Lokasi hasil kali = lokasi hasil bagi
HexDec_Buff	Ds	SizeX		;Kapasitas Buffer Hexa to Desimal 

	.CODE

	Org	*
Lihat_Hasil:
	Mov	R7,#SizeX

LoopLihat_Hasil:
	Mov	A,@R0
	Inc	R0
	Lcall	ASCII_Out
	Djnz	R7,LoopLihat_Hasil
	Ret

OutDesimal:
	Mov	R0,#Hexdec_Buff-1
	Mov	A,R6
	Add	A,R0
	Mov	R0,A

	Mov	R7,#SizeX

LoopOutDesimal:
	Mov	A,@R0
	Add	A,#30H
	Lcall	PrintChar
	Dec	R0	
	Djnz	R6,LoopOutDesimal
	Ret


Hapus_Memori:
	Push	07H
	Mov	R7,#SizeX

LoopHapus_Memori:
	Mov	@R0,#00H
	Inc	R0
	Djnz	R7,LoopHapus_Memori
	Pop	07H
	Ret


;KONVERSI HEXA KE DESIMAL
;Bilangan yang dikonversi berada di operand
;- Operand / 10
;- Simpan sisa bagi
;- Bila hasil bagi kurang dari 10, lakukan pembagian lagi hingga hasil bagi
;- kurang dari 10
;- Hasil Konversi berada di HexDec_Buff
;- R6 jumlah digit desimal
KonversiBilanganDasar:
	Mov	R6,#00H
	Mov	HexDec_Ptr,#HexDec_Buff		;Pointer ke alamat awal Buffer
						;Konversi Hexa ke Desimal
	Push	07H
	Push	00H
	Push	05H
	Mov	R0,#Operand
	Mov	R5,#SizeX	

LoopPeriksa_Nol:
	Mov	A,@R0
	Inc	R0
	Jnz	NilaiBukan_Nol
	Djnz	R5,LoopPeriksa_Nol	
	Ajmp	NilaiNol	

NilaiBukan_Nol:

	Mov	R0,#Operand2
	Lcall	HapusNilai
	Mov	Operand2,#10

	Mov	R0,#Operand
	Mov	R1,#Operand2
	Lcall	Perbandingan
	Jnc	NilaiAtas10
	Inc	R6
	Mov	Hexdec_Buff,Operand
	
NilaiNol:
	Pop	05H
	Pop	00H
	Pop	07H
	Ret

NilaiAtas10:
	Pop	05H
	Pop	00H

Konversi_Lagi:
	Mov	R0,#Pembagi
	Lcall	HapusNilai
	Mov	Pembagi,Dasar_Bilangan

	Acall	Pembagian			;
	Mov	R0,HexDec_Ptr			;Simpan sisa bagi di memori
	Mov	@R0,SisaBagi			;yg ditunjuk hexdec_ptr
	Mov	A,SisaBagi
	Mov	R0,#HasilBagi			;Hasil bagi > pembagi?
	Mov	R1,#Pembagi			;
	Acall	Perbandingan			;
	Inc	HexDec_Ptr			;
	Inc	R6
	Jc	Konversi_Selesai		;Tidak, konversi selesai
	Acall	CopyHasil_keOperand
	Ajmp	Konversi_Lagi			;Ya, bagi lagi

Konversi_Selesai:
	Inc	R6
	Mov	R0,Hexdec_Ptr			;Simpan Hasil Bagi
	Mov	@R0,HasilBagi			;
	Pop	07H
	Ret

CopyHasil_keOperand:
	Mov	R7,#SizeX
	Mov	R0,#HasilKali
	Mov	R1,#Operand

LoopCopy_HasilkeOperand
	Mov	A,@R0
	Inc	R0
	Mov	@R1,A
	Inc	R1
	Djnz	R7,LoopCopy_HasilkeOperand
	Ret	

CopyNilai:
	Mov	R7,#SizeX

LoopCopyNilai:
	Mov	A,@R0
	Inc	R0
	Mov	@R1,A
	Inc	R1
	Djnz	R7,LoopCopyNilai
	Ret	


;RUTIN-RUTIN ARITMATIKA
Pembagian:
	MOV R0,#HasilBagi
	ACALL HapusNilai
	MOV R0,#SisaBagi
	ACALL HapusNilai
;
	MOV R3,#SizeX*8
LoopPembagian:
	CLR C
	MOV R0,#Operand
	ACALL GeserKiri1X
	MOV R0,#SisaBagi
	ACALL GeserKiri1X
;
	MOV R0,#SisaBagi
	MOV R1,#Pembagi
	ACALL Perbandingan SisaBagi-Pembagi?
	JC JanganDikurangi SisaBagi<Pembagi, skip!
;
	MOV R0,#SisaBagi
	MOV R1,#Pembagi
	ACALL Pengurangan SisaBagi:=SisaBagi-Pembagi
JanganDikurangi:
	CPL C
	MOV R0,#HasilBagi Simpan hasil
	ACALL GeserKiri1X
	DJNZ R3,LoopPembagian
	RET
GeserKiri1X:
	MOV R2,#SizeX
LeftShift:
	MOV A,@R0
	RLC A
	MOV @R0,A
	INC R0
	DJNZ R2,LeftShift
	RET

HapusNilai:
	MOV R2,#SizeX
LoopHapus:
	MOV @R0,#0
	INC R0
	DJNZ R2,LoopHapus
	RET

Perbandingan:
	CLR C
	MOV R2,#SizeX
LoopPerbandingan:
	MOV A,@R0
	SUBB A,@R1
	INC R1
	INC R0
	DJNZ R2,LoopPerbandingan
	RET

Pengurangan:
	CLR C
	MOV R2,#SizeX
LoopPengurangan:
	MOV A,@R0
	SUBB A,@R1
	MOV @R0,A
	INC R0
	INC R1
	DJNZ R2,LoopPengurangan
	RET

Perkalian:
	MOV R0,#HasilKali
	ACALL HapusNilai

	MOV R3,#SizeX*8

LoopPerkalian:
	CLR C
	MOV R0,#Pengali+SizeX-1
	MOV R2,#SizeX
GeserKanan:
	MOV A,@R0
	RRC A
	MOV @R0,A
	DEC R0
	DJNZ R2,GeserKanan
	JNC JanganDitambah
	MOV R0,#HasilKali
	MOV R1,#Operand
	ACALL Penambahan

JanganDitambah:
	CLR C
	MOV R0,#Operand
	ACALL GeserKiri1X
	DJNZ R3,LoopPerkalian
	RET

Penambahan:
	CLR C
	MOV R2,#SizeX
LoopPenambahan:
	MOV A,@R0
	ADDC A,@R1
	MOV @R0,A
	INC R0
	INC R1
	DJNZ R2,LoopPenambahan
	RET

