;********* PROGRAM PEMBUAT GAMBAR PADA LCD GRAFIK 240 X 64 **************
; Design by : Paulus Andi Nalwan, ST
; electronic@sby.centrin.net.id
;
; DELTA ELECTRONIC
; Kompleks Ruko Manyar Megah Indah Plaza Blok D-22
; Ngagel Jaya Selatan
; Phone: 62-31-5020210
; Fax: 62-31-5054561
; Surabaya 60284
; http://www.delta-electronic.com
;
; Assembly by : ALDS v3.21
;*********************

	.DATA
	Org	50H
PTRH	Ds	1
PTRL	Ds	1
CommandKarakter	Ds	1
PointerGrafik	Ds	2
PointerMemori	Ds	2

	.CODE
JumlahKolom		EQU	40
JumlahBaris		EQU	64

;Data-data Inisialisasi LCD
TulisADP		EQU	0C4H
BacaADP			EQU	0C5H

AWRON			EQU	0B0H
ADPSET			EQU	024H
AWROFF			EQU	0B2H


HexASCII2		EQU	00FAH
ASCII_Hex		EQU	0113H
Dec_DPTR		EQU	0130H
Capitalize		EQU	013CH
KirimPesan_Serial	EQU	01D8H
Writeext_memory		EQU	0157H
Serial_In		EQU	01D0h
Serial_Out		EQU	01C8h
ASCII_Out		EQU	0197H
Enter_Code		EQU	01ABH

InitLCDGRP		EQU	0486H
TulisDataLCD		EQU	052EH
KirimPerintah		EQU	0548H
KirimData2x		EQU	0557H
TungguStatus1		EQU	0575H
TungguStatusAWR		EQU	058BH
SetPointerAlamat	EQU	05C7H
KirimPesanLCD		EQU	0609H

ROM			EQU	2000H
DP			EQU	8000H	;

FlagHapus	Bit	7FH

	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
	Reti				;


KolomPixel	EQU	240

Start:
	Lcall	InitLCDGRP		;Inisial LCD Grafik
	Lcall	HapusMemori		;Hapus Layar LCD

LoopMenuUtama:
	Lcall	Menu			;Tampilkan Menu Teks
	Mov	DPTR,#PesanMenuUtama
	Lcall	KirimPesan_Serial
Loop2MenuUtama
	Lcall	Serial_In
	Lcall	Serial_Out
	Mov	DPTR,#TabelMenuUtama	;DPTR menuju ke tabel perintah
	Mov	B,A
	Acall	CariPerintah1B		;Jalankan subrutin ini
	Jc	$+3			
	Jmp	@A+DPTR			;Bila ditemukan maka langsung ke 

	Mov	A,#08H
	Lcall	Serial_Out
	Mov	A,#' '
	Lcall	serial_Out
	Mov	A,#08H
	Lcall	Serial_Out
	Ajmp	Loop2MenuUtama

SetKoordinat:
	Pop	DPL
	Pop	DPH

BuatGambar:	
	Mov	DPTR,#PesanKoordinat
	Lcall	KirimPesan_Serial
	Lcall	AmbilSerial2B
	Mov	DPH,A
	Lcall	AmbilSerial2B
	Mov	DPL,A
	Lcall	Enter_Code

	Push	DPH
	Push	DPL
	Mov	DPTR,#PesanBuatGambar
	Lcall	KirimPesan_Serial
	Pop	DPL
	Pop	DPH
	Clr	FlagHapus

LoopBuatGambar:
	Jb	FlagHapus,HapusPixel	
	Push	DPH
	Push	DPL
	Lcall	SetbGrafis
	Pop	DPL
	Pop	DPH

Loop3BuatGambar:
	Push	DPH
	Push	DPL

Loop2BuatGambar:
	Lcall	Serial_In
	Mov	B,A
	Mov	DPTR,#TabelBuatGambar
	Lcall	CariPerintah1B
	Jc	Loop2BuatGambar
	Jmp	@A+DPTR

HapusPixel:
	Push	DPH
	Push	DPL
	Lcall	ClrGrafis
	Pop	DPL
	Pop	DPH
	Ajmp	Loop3BuatGambar
	
HapusTitik:
	Pop	DPL
	Pop	DPH
	Setb	FlagHapus
	Ajmp	LoopBuatGambar	

Tulistitik:
	Pop	DPL
	Pop	DPH
	Clr	FlagHapus
	Ajmp	LoopBuatGambar

CursorAtas:
	Pop	DPL
	Pop	DPH
	Acall	KeAtas
	Ajmp	LoopBuatGambar

CursorBawah:
	Pop	DPL
	Pop	DPH
	Acall	KeBawah
	Ajmp	LoopBuatGambar

CursorKiri:
	Pop	DPL
	Pop	DPH
	Acall	KeKiri
	Ajmp	LoopBuatGambar

CursorKanan:
	Pop	DPL
	Pop	DPH
	Acall	KeKanan
	Ajmp	LoopBuatGambar

BuatGambarSelesai:
	Pop	DPL
	Pop	DPH
	Acall	SimpanGambar
	Lcall	HapusMemori
	Ajmp	LoopMenuUtama	

LihatGambar:
	Mov	DPTR,#PesanDaftarGambar
	Lcall	KirimPesan_Serial

	Lcall	DaftarFile
	Jc	FileKosong
	Mov	DPTR,#PesanPilihan
	Lcall	KirimPesan_Serial
	Acall	AmbilSerial2B	
	Mov	NomorFile,A
	Acall	DisplayGambar
	Ajmp	LoopMenuUtama

FileKosong:
	Mov	DPTR,#PesanKosong
	Lcall	KirimPesan_Serial
	Ajmp	LoopMenuUtama

HapusGambar:
	Mov	DPTR,#MemoriGambar
LoopHapusgambar:
	Mov	A,#00H
	Lcall	TulisMemori
	Inc	DPTR
	Mov	A,DPH
	Cjne	A,#40H,LoopHapusGambar
	Mov	DPTR,#PesanTerhapus
	Lcall	KirimPesan_Serial
	Ajmp	LoopMenuUtama	


;***** SUBROUTINES ******

SimpanGambar:
	Lcall	CariMemoriKosong
	Mov	PointerMemori,DPL
	Mov	PointerMemori+1,DPH
	Mov	DPTR,#01E0H

LoopScanningLCD:
	Mov	CommandKarakter,#BacaADP
	Lcall	BacaMemoriLCD
	Jz	DataKosong
	Push	DPH
	Push	DPL
	Push	DPL
	Push	DPH
	Mov	DPL,PointerMemori
	Mov	DPH,PointerMemori+1
	Lcall	TulisMemori
	Inc	DPTR
	Pop	A
	Lcall	TulisMemori
	Inc	DPTR
	Pop	A
	Lcall	TulisMemori
	Inc	DPTR

	Mov	PointerMemori,DPL
	Mov	PointerMemori+1,DPH
	Pop	DPL
	Pop	DPH
DataKosong:
	Inc	DPTR
	Mov	A,DPH
	Cjne	A,#0BH,LoopScanningLCD
	Mov	A,DPL
	Cjne	A,#0E0H,LoopScanningLCD

	Mov	DPL,PointerMemori
	Mov	DPH,PointerMemori+1
	Mov	A,#0FFH
	Lcall	TulisMemori
	Ret

DisplayGambar:	
	Setb	F0
	Mov	PointerGrafik+1,#01H
	Mov	PointerGrafik,#0E0H
	Mov	DPTR,#MemoriGambar

LoopCariFile:
	Djnz	NomorFile,BelumKetemu
	Clr	F0

BelumKetemu:
LoopDisplayGambar:
	Lcall	BacaMemori		;Baca Data
	Inc	DPTR			;
	Cjne	A,#0FFH,FileGambarBelumSelesai
	Ret

FileGambarBelumSelesai:
	Jb	F0,LoopCariFile

	Push	A
	Lcall	BacaMemori		;Baca DPH LCD
	Inc	DPTR
	Mov	PointerGrafik+1,A
	Lcall	BacaMemori
	Inc	DPTR
	Mov	PointerGrafik,A
	Pop	A
	Mov	CommandKarakter,#TulisADP
	Push	DPH
	Push	DPL
	Mov	DPH,PointerGrafik+1
	Mov	DPL,PointerGrafik
	Lcall	TulisMemoriLCD

	Inc	DPTR
	Mov	PointerGrafik+1,DPH
	Mov	PointerGrafik,DPL
	Pop	DPL
	Pop	DPH
	Ajmp	LoopDisplayGambar	
	

KeKiri:
	Lcall	Dec_DPTR
	Ret

KeKanan:
	Inc	DPTR
	Ret

KeBawah:
	Mov	A,DPL
	Add	A,#KolomPixel
	Jnc	Tidak2TambahDPH
	Inc	DPH
Tidak2TambahDPH:
	Mov	DPL,A
	Ret

KeAtas:
	Clr	C
	Mov	A,DPL
	Subb	A,#KolomPixel
	Jnc	TidakKurangiDPH
	Dec	DPH
TidakKurangiDPH:
	Mov	DPL,A
	Ret	

	include	c:\programs\alds31\routines\cariprnt.asm

;- Kalau ada file maka carry flag clear
;- Kalau file tidak ada maka carry flag set
DaftarFile:
	Mov	DPTR,#MemoriGambar
	Mov	NomorFile,#01H
	Lcall	BacaMemori
	Jz	TidakAdaFile
LoopDaftarFile:
	Inc	DPTR
	Inc	DPTR
	Inc	DPTR

	Lcall	BacaMemori
	Cjne	A,#0FFH,LoopDaftarFile
	Lcall	Enter_Code
	Mov	A,NomorFile
	Lcall	ASCII_Out
	Inc	NomorFile
	Inc	DPTR
	Inc	DPTR
	Inc	DPTR
	Lcall	BacaMemori
	Jz	DaftarFileSelesai
	Inc	DPTR
	Ajmp	LoopDaftarFile

DataBerikutnya:
	Inc	DPTR
	Lcall	1A0H
	Inc	DPTR
	Lcall	1A0H
	Ajmp	$
	Ajmp	LoopDaftarFile
		
TidakAdaFile:
	Setb	C
	Ret

DaftarFileSelesai:
	Clr	C
	Ret


AmbilSerial2B:
	Lcall	Serial_In
	Lcall	Capitalize
	Lcall	Serial_Out
	Push	A
	Lcall	Serial_In
	Lcall	Capitalize
	Lcall	serial_Out
	Mov	B,A
	Pop	A
	Lcall	ASCII_Hex
	REt

IsiAngka2B:
	Acall	AmbilSerial2B
	Mov	@R0,A
	Dec	R0
	Acall	AmbilSerial2B
	Mov	@R0,A
	Ret

	.DATA
NomorFile	Ds	1
	.CODE

CariMemoriKosong:
	Mov	DPTR,#MemoriGambar

LoopCariMemoriKosong
	Lcall	BacaMemori
	Jz	MemoriKosongKetemu
	Inc	DPTR
	Ajmp	LoopCariMemoriKosong

MemoriKosongKetemu:
	Ret


SetbGrafis:
	Acall	DPTRBitAddress
	Acall	SetPixel
	Ret

ClrGrafis:
	Acall	DPTRBitAddress
	Acall	ClrPixel
	Ret

ReadPixel:
	Mov	DPTR,#06H
	Acall	DPTRBitAddress
	Mov	A,DPL
	Mov	B,DPH
	Lcall	SetPointerAlamat
	Mov	A,#TulisADP
	Lcall	KirimPerintah
	Mov	DPTR,#DP
	Movx	A,@DPTR
	Ret


;********* KONVERSI DPTR KE BIT ADDRESS ***********
;DPTR disimpan di PTR
;PTR dibagi 6
;Hasil bit address disimpan di DPTR dan Akumulator
;DPTR = Hasil bagi PTR dg 6, akumulator jumlah pergeseran titik

DPTRBitAddress:
	Push	PSW
	Mov	PTRH,DPH
	Mov	PTRL,DPL
	Mov	DPTR,#01E0H

LoopDPTRBitAddress:
	Clr	C
	Mov	A,PTRL
	Jz	LihatPTRH

ProsesKurangi:
	Subb	A,#06
	Jc	PTRL<6
	Mov	PTRL,A	
	Inc	DPTR
	Ajmp	LoopDPTRBitAddress

PTRL<6:
	Clr	C
	Mov	A,PTRH
	Jz	DPTRBitSelesai
	Mov	A,PTRL
	Subb	A,#06
	Mov	PTRL,A

	Inc	DPTR
	Dec	PTRH
	Ajmp	LoopDPTRBitAddress

LihatPTRH:
	Clr	C
	Mov	A,PTRH
	Jz	DPTRBitSelesai
	Mov	A,PTRL
	Ajmp	ProsesKurangi

DPTRBitSelesai:
	Mov	A,PTRL
	Pop	PSW
	Ret
;********* End of DPTR Bit Address **********



;*********** SET/CLR PIXEL PADA POSISI BIT ADDRESS *******
; Setiap byte memori data grafik terdiri dari 6 bit, sehingga untuk 8 byte
; memori contohnya, mempunyai 48 bit address
; Alamat memori ditunjuk oleh DPTR
; Posisi bit ditentukan oleh akumulator
; Akumulator, pada subroutine ini diubah sebagai berikut:
; 00 = FD, bit ke 5 (pixel paling kiri dari setiap blok)
; 01 = FC, bit ke 4 
; 02 = FB, bit ke 3
; 03 = FA, bit ke 2
; 04 = F9, bit ke 1
; 05 = F8, bit ke 0

ClrPixel:
	Mov	B,A
	Mov	A,#05H
	Clr	C
	Subb	A,B
	Orl	A,#11110000b
	Ajmp	EksekusiPixel

SetPixel:
	Mov	B,A
	Mov	A,#05
	Clr	C
	Subb	A,B
	Orl	A,#11111000b

EksekusiPixel:
	Push	A
	Mov	A,#AWROFF
	Lcall	KirimPerintah
	Mov	A,DPL
	Mov	B,DPH
	Lcall	SetPointerAlamat	
	Pop	A
	Lcall	KirimPerintah
	Ret

LebihKecil6?:	
	Mov	A,DPL
	Cjne	A,#07,LihatC
LihatC:
	Jnc	Kembali
	Mov	A,DPH
	Jz	Kembali
	Clr	C	

Kembali:
	Ret
	
********************************
;*** SUBROUTINE PENAMPIL MENU TEKS *******
; Bagian tempat pengguna dapat mengatur koordinat dan isi teks yang ditampilkan
Menu:
	Mov	DPTR,#PesanFungsi
	Mov	A,#53
	Mov	B,#00
	Lcall	KirimPesanLCD
	Mov	A,#AWROFF
	Lcall	KirimPerintah	

	Mov	DPTR,#PesanFungsi1
	Mov	A,#131
	Mov	B,#00H
	Lcall	KirimPesanLCD
	Mov	A,#AWROFF
	Lcall	KirimPerintah	

	Mov	DPTR,#PesanFungsi2
	Mov	A,#171
	Mov	B,#00H
	Lcall	KirimPesanLCD
	Mov	A,#AWROFF
	Lcall	KirimPerintah	

	Mov	DPTR,#PesanFungsi3
	Mov	A,#211
	Mov	B,#00H
	Lcall	KirimPesanLCD
	Mov	A,#AWROFF
	Lcall	KirimPerintah	
	Ret

PesanFungsi:
	DB	'DAFTAR FUNGSI',00

PesanFungsi1:
	DB	'Fungsi 1 :',00

PesanFungsi2:
	DB	'Fungsi 2 :',00

PesanFungsi3:
	DB	'Fungsi 3 :',00


;********** SUBROUTINE2 CONTROL WORD **********
; - Mengatur posisi dan area teks
; - Mengatur posisi dan area grafik



;******** SUBROUTINE MEMBACA/MENULIS ISI MEMORI LCD *******
; - Alamat Memori ditunjuk oleh DPTR
; - CommandKarakter harus diatur

BacaMemoriLCD:
	Push	DPH
	Push	DPL
	Mov	A,DPL
	Mov	B,DPH
	Lcall	SetPointerAlamat
	Lcall	TungguStatus1
	Mov	A,CommandKarakter
	Lcall	KirimPerintah
	Mov	DPTR,#DP
	Movx	A,@DPTR
	Pop	DPL
	Pop	DPH
	Ret

TulisMemoriLCD:
	Push	DPH
	Push	DPL
	Push	A
	Mov	A,DPL
	Mov	B,DPH
	Lcall	SetPointerAlamat
	Lcall	TungguStatus1
	Mov	DPTR,#DP
	Pop	A
	Movx	@DPTR,A
	Mov	A,CommandKarakter
	Lcall	KirimPerintah
	Pop	DPL
	Pop	DPH
	Ret


;******* SUBROUTINE MENGHAPUS TOTAL DATA LCD *********
HapusMemori:
	Mov	B,#00H
	Mov	A,#00H
	Lcall	KirimData2x
	Mov	A,#ADPSET
	Lcall	KirimPerintah

	Mov	A,#AWRON
	Lcall	KirimPerintah
	
	Mov	R6,#JumlahKolom
Loop2HapusLCD:
	Mov	R7,#Jumlahbaris*8

LoopHapusLCD:
	Mov	A,#00H
	Lcall	TulisDataLCD
	Lcall	TungguStatusAWR
	Djnz	R7,LoopHapusLCD
	Djnz	R6,Loop2HapusLCD
	Mov	A,#AWROFF
	Lcall	KirimPerintah
	Ret

TulisMemori:
	Lcall	Writeext_Memory
	Ret

BacaMemori:
	Movx	A,@DPTR
	Ret

PesanMenuUtama:
	DB	'1. Buat Gambar',0AH,0DH
	DB	'2. Lihat Gambar',0AH,0DH
	DB	'3. Hapus Gambar',0AH,0DH,0FH

TabelMenuUtama:
	DB	'1'
	DW	BuatGambar
	DB	'2'
	DW	LihatGambar
	DB	'3'
	DW	HapusGambar
	DB	0

PesanBuatGambar:
	DB	'Num Lock 8 : Cursor ke atas',0AH,0DH
	DB	'Num Lock 4 : Cursor ke kiri',0AH,0DH
	DB	'Num Lock 2 : Cursor ke bawah',0AH,0DH
	DB	'Num Lock 6 : Cursor ke kanan',0AH,0DH
	DB	'Enter	    : Simpan Gambar',0AH,0DH
	DB	'Tab	    : Set Koordinat',0AH,0DH
	DB	'Num Lock Del  : Mode Hapus',0AH,0DH
	DB	'Num Lock Ins  : Mode Tulis',0AH,0DH
	DB	0FH

TabelBuatGambar:
	DB	'8'
	DW	CursorAtas
	DB	'4'
	DW	CursorKiri
	DB	'2'
	DW	CursorBawah
	DB	'6'
	DW	CursorKanan
	DB	0DH
	DW	BuatGambarSelesai
	DB	'7'
	DW	SetKoordinat
	DB	'.'
	DW	HapusTitik
	DB	'0'
	DW	TulisTitik
	DB	09
	DW	SetKoordinat
	DB	0

PesanKoordinat:
	DB	0AH,0DH,'Koordinat : ',0FH

PesanDaftarGambar:
	DB	0AH,0DH,'File',0FH

PesanPilihan:
	DB	0AH,0DH,'Pilihan : ',0FH

PesanTerhapus:
	DB	0AH,0DH,'Terhapus!',0AH,0DH,0FH

PesanKosong:
	DB	' Kosong',0AH,0DH,0FH

	Org	2800H
MemoriGambar: