Pada baris pertama pelajar memperoleh alamat efektif dari "Kal" dan disimpan pada DX. lalu pelajar simpan nilai DX yang menunjuk pada offset
"Kal" ini pada variabel Stacks. Sehingga pada saat pelajar hendak mencetak 'Kal' untuk kedua kalinya, pelajar tinggal mengambil nilai dari variabel Stacks dengan perintah "MOV DX,Stacks". .Kini akan pelajar lihat bagaimana memakai stack yang sebetulnya untuk tugas ini.
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kal DB 'LANG LING LUNG $'
Ganti DB 13,10,'$'
Stacks DW ?
Proses:
LEA DX,Kal
PUSH DX
MOV AH,09
INT 21h
LEA DX,Ganti
INT 21h
POP DX
INT 21h
Exit : INT 20h
END TData
program Operasi Stack
Dengan perintah "PUSH", pelajar menyimpan nilai register DX pada stack, lalu pada perintah "POP" pelajar mangambil keluar nilai yang disimpan
itu dari stack. Dari program ini dapat dilihat bagaimana stack menggantikan varibel pada program yang dipakai untuk menyimpan nilai pada register DX. Kini lihatlah bagaimana program yang memakai pengulangan didalam pengulangan dengan memanfaatkan stack ini. Dalam bahasa Pascal program nya akan tampak seperti berikut:
For i:= 10 DownTo 1 Do
For j:= 5 DownTo 1 Do
For s:= 3 DownTo 1 Do
Begin
End
Dalam bahasa assembler akan tampak seperti:
MOV CX,10
i:
PUSH CX
MOV CX,5
j:
PUSH CX
MOV CX,3
s:
LOOP s
POP CX
LOOP j
POP CX
LOOP i
Stack dapat pelajar bayangkan sebagai sebuah tabung yang panjang. sedang nilai pada register dapat dibayangkan berbentuk koin yang dapat dimasukkan dalam tabung itu . Untuk memasukkan nilai suatu register pada stack, dipakai perintah
push dengan syntax:
PUSH Reg16Bit
contoh : pada perintah:
MOV AX,12
MOV BX,33
MOV CX,99
PUSH AX ; Simpan nilai AX pada stack
PUSH BX ; Simpan nilai BX pada stack
PUSH CX ; Simpan nilai CX pada stack
Maka pada stack akan tampak seperti:
<<<< Gbr142.PIX >>>>>
gambar kode Penyimpanan Nilai Pada Stack
Dari gambar kode dapat kita lihat bahwa nilai yang terakhir dimasukkan(99) akan terletak pada puncak tabung stack. Untuk mengambil keluar koin nilai pada tabung stack, dipakai perintah.pop dengan syntax:
POP Reg16Bit
Perintah POP akan mengambil koin nilai pada stack yang paling atas dan dimasukkan pada Reg16Bit. Dari sini dapat kita lihat bahwa data yang terakhir
dimasukkan akan menjadi yang pertama dikeluarkan. Inilah sebabnya operasi
stack dinamankan LIFO(Last In First Out).
contoh : , untuk mengambil nilai dari register AX, BX dan CX .yang disimpan pada stack harus dilakukan pada register CX dahulu barulah BX.dan AX, seperti:
POP CX ; Ambil nilai pada puncak stack, masukkan ke CX
POP BX ; Ambil nilai pada puncak stack, masukkan ke BX
POP AX ; Ambil nilai pada puncak stack, masukkan ke AX
Perhatikan: Bila kita terbalik dalam mengambil nilai pada stack dengan POP AX
lalu POP BX dan POP CX, maka nilai yang akan kita dapatkan pada register
AX, BX dan CX akan terbalik. Sehingga register AX akan bernilai 99 dan CX akan bernilai 12.
TRIK:
,, data tidak bisa dicopykan antar segment
atau memory. Untuk menyalinkan data antar segment atau memory kita harus memakai register general purpose sebagai perantaranya, seperti:
MOV AX,ES ; Untuk menyamakan register
MOV DS,AX ; ES dan DS
Dengan adanya stack, kita bisa memakai nya sebagai perantara,.sehingga akan tampak seperti:
PUSH ES ; Untuk menyamakan register
POP DS ; ES dan DS
PUSF dan POPF, seperti dengan perintah PUSH dan POP. Perintah PUSFdipakai untuk menyimpan nilai dari flags register pada stack sedang POPF dipakai untuk mengambil nilai pada stack dan disimpan pada flags register. Kedua perintah ini dipakai tanpa operand:
PUSHF ; Simpan nilai Flags pada stack
POPF ; Ambil nilai pada stack Perintah PUSHF dan POPF dipakai untuk menyelamatkan kondisi dari flag
pada perubahan. PUSHF dan POPF biasanya dipakai pada operasi yang sangat mementingkan nilai pada flag ini, seperti pada operasi aritmatika.
MASUKAN DARI KEYBOARD
Keyboard yaitu sarana bagi pelajar untuk berkomunikasi dengan program .Pada bagian ini akan pelajar lihat bagaimana caranya untuk menanggapi masukan dari keyboard. namun sebelumnnya kita tentunya harus mengerti sedikit mengenai beberapa hal penting yang berkaitan dengan keyboard itu.
Prosesor pada keyboard mendeteksi setiap penekanan atau pelepasan tombol pada keyboard. Prosesor ini menterjemahkan setiap sinyal yang terjadi
berdasar posisi tertentu menjadi apa yang dinamakan kode Scan. Dengan demikian tombol "A" dan "B" akan memiliki kode Scan yang berbeda sebab
posisinya memang berbeda. Lain halnya untuk tombol "A"
dan "a" yang ada pada posisi yang sama, akan memiliki kode Scan yang
sama. Kode Scan ini biasanya tidak berguna bagi pelajar . pelajar biasanya hanya memakai kode ASCII dan Extended yaitu hasil terjemahan dari kode
scan oleh keyboard handler. Kode ASCII yaitu kode yang melambangkan suatu huruf baik berupa
huruf,angka, atau simbol-simbol grafik. contoh angka "1" akan dilambangkan dengan kode ASCII 49. Untuk kode ASCII ini bisa kita lihat pada lampiran.
Kode ASCII sudah menyediakan sebanyak 256 huruf dengan beberapa huruf kontrol, contoh #10 untuk pindah baris dan #13 untuk Enter yang akan menggerakkan kursor kesamping kiri. namun fungsi yang sudah disediakan ini tidak mampu untuk menampilkan ataupun mendeteksi tombol fungsi contoh F1, F2, F3 dan Home. Tombol kombisasi juga tidak dapat dideteksi oleh huruf ASCII , contoh penekan tombol shif ditambah tombol F1, penekanan Ctrl .ditambah tombol Home, dan lain-lain. Penekanan pada tombol-tombol fungsi dan tombol kombinasi akan menghasilkan kode ASCII 0.
sebab alasan diatas maka diciptakanlah suatu kode yang dinamakan sebagai kode EXTENDED. Kode Extended ini dapat mendeteksi penekanan pada
tombol-tombol fungsi atau tombol kombinasi. Untuk kode extended bisa kita lihat pada lampiran.
Interupsi dari BIOS, yaitu interupsi 16h servis 0 dapat dipakai untuk memperoleh masukan satu huruf dari keyboard. Hasil dari pembacaan huruf fungsi ini akan diletakkan pada register AX. Bila terjadi penekanan pada tombol biasa maka byte rendah dari AX, akan menandakan kode ASCII dari tombol itu dan byte tnggi dari AX
akan berisi kode Scan dari tombol itu .
Bila yang ditekan yaitu tombol khusus(extended) yang akan menghasilkan kode ASCII 0 maka byte rendah dari register AX akan menghasilkan kode
ASCII 0 dan byte tinggi dari AX akan akan berisi kode extended dari tombol itu .
; INTERUPSI 16h ;
; Input: OutPut: ;
; AH = 0 bila tombol biasa, maka: ;
; AL = ASCII ;
; AH = SCAN ;
; ;
; bila Tombol khusus, maka ;
; AL = 00 ;
; AH = Extended ;
; ;
;\========================================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
T_ASCII DB 13,10,'Ini yaitu tombol ASCII : $'
T_Extended DB 13,10,'Ini yaitu tombol Extended $'
Proses :
MOV AH,0 ; Servis Input satu huruf
INT 16h ; lakukan
PUSH AX ; Simpan hasil pembacaan pada stack
CMP AL,00 ; Apakah ini huruf extended ?
JE Extended ; Ya !, Lompat ke Extended
ASCII:
LEA DX,T_ASCII ; Ambil alamat efektif T_ASCII
MOV AH,09 ; Servis cetak kalimat
INT 21h ; Cetak kalimat !
POP AX ; Ambil kembali nilai AX pada stack
MOV DL,AL ; Ambil kode ASCII yang ditekan
MOV AH,2 ; Servis cetak huruf
INT 21h ; Cetak huruf !
CMP AL,'Q' ; Apakah yang ditekan huruf 'Q' ?
JE exit ; Ya !, lompat ke Exit
CMP AL,'q' ; Apakah yang ditekan huruf 'q' ?
JE exit ; Ya !, lompat ke Exit
JMP Proses ; Lompat ke Proses
Extended:
LEA DX,T_Extended ; Ambil alamat efektif T_Extended
MOV AH,09 ; Servis cetak kalimat
INT 21h ; Cetak kalimat !
JMP Proses ; Lompat ke Proses
exit: INT 20h ; Kembali ke DOS !
END TData
program Menunggu masukan satu huruf dari Keyboard Bila kita menekan tombol extended, seperti penekanan tombol anak panah,.F1, F2 dan sebagainya maka pada layar akan ditampilkan :
Ini yaitu tombol Extended Bila kita ingin mengetahui lebih lanjut mengenai tombol apa yang ditekan
maka kode extendednya bisa dilihat pada register AH. sedang bila yang ditekan yaitu tombol biasa, seperti huruf 'S' maka pada layar akan ditampilkan:
Ini yaitu tombol ASCII : S
program akan selesai bila kita menekan tombol "q" atau "Q". Dengan fungsi 11h dari interupsi 16h, pelajar bisa mendeteksi pada penekanan tombol,seperti seperti yang dilakukan oleh fungsi keypressed
pada bahasa pascal. Fungsi ini akan mendeteksi keyboard buffer, bila pada keyboard buffer ada suatu tombol maka ia akan membuat zerro flags menjadi
nol<0> dan register AL berisi kode ASCII dari huruf itu sedang register AH akan berisi kode Scan dari tombol itu . Sebaliknya bila pada keyboard buffer tidak ada huruf maka zerro flags akan bernilai satu <1>. Keyboard buffer yaitu suatu penampung yang dipakai untuk menampung setiap penekanan tombol pada keybaord. Daya tampung normal dari keyboard
buffer yaitu 15 huruf . bila keyboard buffer sudah penuh, speaker akan mengeluarkan tanda berupa suara beep.
; Input: OutPut: ;
; AH = 1 bila Ada tombol yang ditekan ;
; ZF = 0 dan ;
; AL = kode ASCII ;
; AH = Scan Code ; ; ;
; bila Tidak ada penekanan Tombol ;
; ZF = 1 ; ; ;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kal0 DB 'Tekan sembarang tombol untuk berhenti ! '
DB 13,10,'$'
Proses :
MOV AH,1 ; Servis untuk mengecek buffer keyboard
INT 16h ; lakukan !
JNZ EXIT ; bila ada tombol yang ditekan, lompat
; Ke EXIT
MOV AH,09 ; Servis untuk cetak kalimat
LEA DX,Kal0 ; Ambil alamat efektif Kal0
INT 21h ; Cetak kalimat !
JMP Proses ; Lompat ke Proses
exit : INT 20h ; Kembali ke DOS !
END TData
program Membuat fungsi Keypressed
Bila program dijalankan, maka pada layar akan ditampilkan tulisan: Tekan sembarang tombol untuk berhenti ! Tulisan ini akan ditampilkan terus sampai kita menekan sembarang tombol.
Pada program -program sebelumnya pelajar hanya bisa memperoleh masukan satu .huruf pada keybaord, bagaimana bila diinginkan masukan berupa suatukalimat? Untuk itu DOS sudah menyedikannya. Interupsi 21h servis ke 0Ah, dipakai untuk memperoleh masukan dari keyboard lebih dari satu huruf . sedang aturan pemakainya yaitu:
INPUT OUTPUT
AH = 0Ah Buffer yang berisi string
DS:DX= Buffer hasil masukan dari keyboard
Untuk memakai fungsi ini kita harus menyediakan sebuah buffer untuk .menampung hasil masukan dari keyboard. kita bisa membuat sebuah buffer
seperti:
Buffer DB X,Y,Z DUP(?)
Pada byte pertama yang pelajar gambarkan sebagai "X", dipakai sebagai tanda dari banyaknya huruf yang dapat dimasukkan dari keyboard ditambah 1.
Seperti bila kita memberi nilai 23, maka huruf maksimum yang dapat dimasukkan yaitu 22 huruf , sebab satu huruf lagi dipakai khusus oleh
tombol Enter(0Dh). Pada byte kedua yang pelajar gambarkan sebagai "Y" ,dipakai oleh fungsi
ini sebagai indikator banyaknya huruf yang sudah diketikkan oleh user(Tombol Enter<0dh> tidak akan dihitung). kita bisa memberi tanda "?"
untuk byte kedua ini, sebab nilainya akan diisi secara otomatis nantinya. Pada byte ketiga yang pelajar gambarkan sebagai "Z" inilah yang nantinya
yaitu awal dari masukan string akan ditampung. kita harus menyediakan banyaknya byte yang dibutuhkan, sesuai dengan byte pertama("X").
; INTERUPSI 21h ;
; Input: ;
; AH = 0Ah ;
; DS:DX = Penampung dengan spesifikasi: ;
; Byte 1 = Maksimum huruf yang dapat dimasukkan ;
; Byte 2 = Akan dijadikan Indikator banyaknya ;
; huruf yang dimasukkan ;
; Byte 3 keatas = Tempat hasil masukan ditampung ;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
T_Enter EQU 0Dh
Kal0 DB 'Ketikkan satu Kalimat : $'
Kal1 DB 13,10,'Kalimat pada buffer : $'
Buffer DB 23,?,23 DUP(?)
Proses : MOV AH,09
LEA DX,Kal0
INT 21h ; Cetak kalimat Kal0
MOV AH,0Ah ; Servis Input kalimat
LEA DX,Buffer ; DX menunjuk pada offset Buffer
INT 21h ; Input kalimat !
MOV AH,09
LEA DX,Kal1
INT 21h ; Cetak kalimat Kal1
LEA BX,Buffer+2 ; BX menunjuk byte ke 3 Buffer
Ulang:
CMP BYTE PTR [BX],T_Enter ; Apakah huruf Enter?
JE EXIT ; Ya! Lompat ke Exit
MOV DL,[BX] ; Masukkan huruf pada DL
MOV AH,02 ; Servis cetak huruf
INT 21h ; Cetak huruf
INC BX ; BX := BX+1
JMP Ulang ; Lompat ke Ulang
EXIT: INT 20h ; Kembali ke DOS !
END TData
program Masukan string dari Keyboard,Contoh dari hasil eksekusi program sesudah memperoleh masukan dari keyboard:
Ketikkan satu Kalimat : Equasoft
Kalimat pada buffer : Equasoft
sedang proses yang dilakukan pada program yaitu:
MOV AH,09
LEA DX,Kal0
INT 21h
Pertama-tama cetak kalimat Kal0 dengan servis 9 interupsi 21h, sesudah itu:
MOV AH,0Ah
LEA DX,Buffer
INT 21h
Pada bagian inilah pelajar meminta masukan dari keyboard, dengan DX.menunjuk pada buffer yang dipakai sebagai penampung.
MOV AH,09
LEA DX,Kal1
INT 21h
Sesudah itu cetaklah kalimat pada Kal1
LEA BX,Buffer+2
Dengan perintah ini maka BX akan menunjuk pada byte ke 3, atau awal.masukan string dari keyboard. agar lebih jelas, nilai pada buffer sesudah
memperoleh masukan yaitu:
Offset BX=Offset+2
_ _
+---+---+---+---+---+---+---+---+---+---+---+
| 9 | 8 | E | q | u | a | s | o | f | t | 0D|
+---+---+---+---+---+---+---+---+---+---+---+
Sesudah BX mnunjuk pada huruf pertama hasil masukan, maka:
CMP BYTE PTR [BX],T_Enter
JE EXIT
Periksalah, apakah huruf yang ditunjukkan BX yaitu 0D(Enter)? Bila ya, berarti akhir dari masukan. ,disini, bahwa pelajar memakai BYTE PTR. Bila tidak dipakai , assembler akan bingung apakah pelajar
ingin membandingkan isi alamat BX sebanyak 1 byte atau lebih dengan T_Enter.
MOV DL,[BX]
MOV AH,02
INT 21h
Bila bukan huruf enter, maka ambil huruf itu dan masukkan pada register DL untuk dicetak.
INC BX
JMP Ulang
Tambahlah BX denga satu sehingga BX akan menunjuk pada huruf selanjutnya. Proses dilanjutkan sampai ketemu tanda 0D atau huruf Enter.
Procedure yaitu suatu alat bantu yang sangat berguna. Dengan procedure suatu program yang besar bisa diselesaikan dengan lebih mudah.
Proses pencarian kesalahanpun akan lebih mudah bila dipakai procedure. Untuk membuat procedure bisa kita pakai bentuk seperti pada gambar ini
NamaP PROC NEAR/FAR
+---------+
| program |
+---------+
RET
NamaP ENDP
-------------------------------------------------------------
gambar kode Model Procedure
"NamaP" yaitu nama dari procedure yang pelajar diartikan sendiri. Untuk memudahkan nama untuk procedure bisa kita diartikan sesuai dengan fungsi
dari procedure itu , seperti CLS untuk procedure yang tugasnya menghapus layar. Dibelakang kata "PROC" kita harus memilih bentuk dari procedure
itu , yaitu "NEAR" atau "FAR". Bentuk "NEAR" dipakai bila procedure .itu nantinya dipanggil oleh program yang letaknya masih satu segment dari procedure itu . Pada program COM yang terdiri atas satu segment, pelajar akan selalu memakai bentuk "NEAR". Sebaliknya bentuk "FAR" ini dipakai bila procedure dapat dipanggil dari segment lain. Bentuk ini akan pelajar pakai pada program EXE.
Perintah "RET(Return)" dipakai untuk mengembalikan Kontrol program pada sipemanggil procedure. Pada bentuk NEAR perintah RET ini akan memPOP atau
mengambil register IP dari stack sebagai alamat loncatan menuju program pemanggil procedure. sedang pada bentuk "FAR" perintah RET akan mengambil register IP dan CS dari stack sebagai alamat loncatan menuju program pemanggil
procedure. Alamat kembali untuk procedure disimpan pada stack pada saat procedure itu dipanggil dengan perintah "CALL", dengan syntax:
CALL NamaP
Perintah Call ini akan menyimpan register IP saja bila procedure yang dipanggil berbentuk "NEAR". Bila procedure yang dipanggil berbentuk "FAR",
maka perintah "CALL" akan menyimpan register CS dan IP.
Sebagai contoh dari pemakaian procedure akan pelajar lihat pada program yang mencetak huruf dengan procedure.
.MODEL SMALL
.CODE
ORG 100h
Proses : CALL Cetak_Kar ; Panggil Cetak_Kar
INT 20h
Cetak_Kar PROC NEAR
MOV AH,02h
MOV DL,'S'
INT 21h ; Cetak huruf
RET ; Kembali kepada si pemanggil
Cetak_Kar ENDP ; END Procedures
END Proses
program memakai Procedure
Bila program dijalankan, maka pada layar akan ditampilkan huruf "S". Untuk membuat sebuah procedure ingatlah untuk menyimpan semua register
yang dipakai oleh procedure itu dan mengembalikan semua isi register pada akhir procedure. ini dilakukan untuk menjaga agar program utama
yang memakai procedure itu tidak menjadi kacau nantinya. Sebagai contohnya bisa kita lihat pada program
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kar DB ?
Klm DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 huruf
Proses : MOV CX,28 ; Banyaknya pengulangan
XOR BX,BX ; Addressing Mode
Ulang :
MOV DL,Klm[BX]
MOV Kar,DL
CALL Cetak_Kar ; Panggil Cetak_Kar
INC BX
LOOP Ulang
INT 20h
Cetak_Kar PROC NEAR
PUSH AX ; Simpan semua register
PUSH DX ; Yang dipakai
MOV AH,02h
MOV DL,Kar
INT 21h ; Cetak huruf
POP DX ; Kembalikan semua register
POP AX ; Yang disimpan
RET ; Kembali kepada si pemanggil
Cetak_Kar ENDP ; END Procedures
END TData
program memakai Procedure
Bila program dijalankan, maka pada layar akan ditampilkan:
BATMAN SI MANUSIA KELELAWAR
Pada procedure pelajar tidak bisa memakai parameter, inilah salah satu
kelemahan dari procedure yang sangat berarti. Untuk memakai parameter kita
harus memakai MACROS.
MACRO
Macro hampir sama dengan procedure, yang dapat membantu kita dalam
membuat program yang besar. Dengan Macro kita tidak perlu memakai perintah
"CALL" dan kita juga bisa memakai parameter dengan mudah. Suatu ciri dari
pemprograman bahasa tingkat tinggi!
Macro yaitu lebih mudah dibuat daripada procedure. Untuk membuat Macro
bisa kita pakai bentuk seperti pada gambar kode
---------------------------------------------------------------
NamaM MACRO [P1,P2,,]
+------------+
| program |
+------------+
ENDM
---------------------------------------------------------------
gambar kode Model Macro
"P1" dan "P2" yaitu parameter yang bisa kita pakai pada macro. Parameter ini berbentuk optional, artinya bisa dipakai ataupun tidak. agar
lebih jelas bisa kita lihat pada program MAC1 yang memakai macro ini untuk
mencetak huruf .
Cetak_Kar MACRO Kar
MOV CX,3
MOV AH,02
MOV DL,Kar
Ulang :
INT 21h ; Cetak huruf
LOOP Ulang
ENDM ; End Macro
;-----------------------------------;
; program : MAC1.ASM ;
; Fungsi : memakai Macro ;
; Untuk mencetak ;
; huruf 'SSS' ;
;-----------------------------------;
.MODEL SMALL
.CODE
ORG 100h
Proses:
Cetak_Kar 'S' ; Cetak Huruf S
INT 20h
END Proses
program 17.1. memakai Macro
(88)
Dari program MAC1 bisa kita lihat betapa mudahnya untuk memakai
macro. Pada procedure, setiap kali pelajar memanggilnya dengan perintah CALL maka
program akan melompat pada procedure itu , sehingga setiap procedure hanya
ada satu kali saja pada program . Lain halnya dengan Macro, setiap terjadi
pemanggilan pada macro atau dapat dikatakan secara kasar, setiap pelajar
memanggil macro dengan menuliskan nama macronya dalam program , maka seluruh
isi macro akan dipindahkan pada program yang memanggilnya. sehingga
bila pada program kita memanggil suatu macro sebanyak 10 kali maka macro
itu akan disisipkan 10 kali pada program . ini lah yang memicu
program yang memakai macro ukuran program nya menjadi lebih besar. namun
ini juga yang memicu program yang memakai macro lebih cepat
daripada procedure, sebab pada procedure komputer harus melakukan lompatan
namun pada macro tidak perlu.
Pada macro kita bisa memakai label seperti biasa. namun kita harus
ingat, sebab setiap pemanggilan Macro akan memicu seluruh isi macro
itu disisipkan pada program , maka pada macro yang didalamnya memakai
label hanya dapat dipanggil sebanyak satu kali. Bila kita memakai ya lebih
dari satu kali maka akan terjadi "**Error** Symbol already defined elsewhere:
ULANG" sebab dianggap pelajar memakai label yang sama.
Untuk menghindari hal itu, pakai lah directif LOCAL. Dengan directif
LOCAL assembler akan membedakan label itu setiap kali terjadi pemanggilan
pada nya.
Cetak_Kar MACRO Kar
LOCAL Ulang ; Label 'Ulang' jadikan Local
MOV CX,3
MOV AH,02
MOV DL,Kar
Ulang:
INT 21h ; Cetak huruf
LOOP Ulang
ENDM ; End Macro
;-----------------------------------;
;-----------------------------------;
.MODEL SMALL
.CODE
ORG 100h
Proses:
Cetak_Kar 'P' ; Cetak Huruf P
Cetak_Kar 'C' ; Cetak Huruf C
INT 20h
END Proses
program . memakai Perintah LOCAL
Bila pelajar sering memakai suatu fungsi seperti mencetak kalimat padasetiap program yang pelajar buat, tentu saja akan sangat membosankan sebab
setiap kali pelajar harus membuat fungsi yang sama. Dengan macro kita bisa menghindari hal itu dengan membuat suatu pustaka macro. Pustaka itu
bisa kita simpan dengan suatu nama, contoh 'pustaka.mcr'. File yang
tersimpan yaitu dalam bentuk ASCII, tanpa perlu di compile.
Cetak_Kar MACRO Kar ; Macro untuk mencetak
MOV AH,02 ; huruf
MOV DL,Kar
INT 21h
ENDM
Cetak_Klm MACRO Klm ; Macro untuk mencetak
LEA DX,Klm ; kalimat
MOV AH,09
INT 21h
ENDM
program Pustaka.MCR
Sesudah program kita ketikkan, simpanlah dengan nama
'PUSTAKA.MCR'. kita bisa memakai macro pada file pustaka.mcr dengan hanya
manambahkan kata:
INCLUDE PUSTAKA.MCR
contoh : bisa kita lihat pada program yang memakai
file pustaka.mcr ini untuk mencetak kalimat dan huruf .
INCLUDE PUSTAKA.MCR ; pakai file PUSTAKA.MCR
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kal0 DB 'pemakaian PUSTAKA MACRO $'
Proses:
Cetak_Klm Kal0 ; Cetak Kalimat Kal0
Cetak_Kar 'Y' ; Cetak Huruf 'Y'
INT 20h
END TData
program memakai Pustaka.MCR
Sesudah program kita jalankan, maka pada layar akan ditampilkan:
pemakaian PUSTAKA MACRO Y
Banyak pro dan kontra mengenai macro dan procedure ini. Sebagian pelajar
menganggap macro akan merugikan program , namun banyak juga yang menganggap
macro yaitu pemecahan yang tepat dalam pemprograman assembler yang terkenal
sulit untuk dipakai . Kini apa yang akan kita pakai ? Macro ataukah procedure
? Untuk itu marilah pelajar lihat dahulu perbedaan antara procedure dan macro
ini.
- Procedure tidak memperpanjang program , sebab hanya muncul sekali saja pada
program .
- Macro akan muncul pada program setiap terjadi pemanggilan pada macro,
sehingga macro akan memperpanjang program .
- Untuk memakai procedure kita harus memanggilnya dengan perintah CALL dan
dalam procedure diakhiri dengan RET.
- Macro bisa kita pakai dengan memanggil langsung namanya dan pada macro
tidak perlu diakhiri dengan RET.
- Procedure akan memperlambat program , sebab setiap pemanggilan pada
procedure, komputer harus melakukan lompatan.
- Macro tidak memperlambat program sebab komputer tidak perlu melakukan
lompatan.
- Pada procedure kita tidak bisa memakai parameter secara langsung. Bila
kita ingin memakai parameter bisa dengan melalui stack atau register.
- Macro dengan mudah bisa memakai parameter, suatu ciri bahasa tingkat
tinggi.
- Macro lebih mudah dibuat dan dipakai daripada procedure.
Sesudah melihat perbedaan-perbedaan itu , kapankah pelajar memakai
procedure dan kapankah memakai macro ?
- bila fungsi itu jarang dipanggil, pakai lah MACRO sebab macro tidak
memperlambat proses.
- bila fungsi itu sering dipanggil, pakai lah PROCEDURE sebab
procedure tidak memperbesar program .
- bila fungsi itu kecil, pakai lah MACRO. sebab pengaruh pada
besarnya program hanya sedikit dan program akan lebih cepat.
- bila fungsi itu besar, pakai lah PROCEDURE. sebab procedure tidak
memperbesar program .
OPERASI PADA LAYAR
Layar dapat dikat akan menjadi media yang menarik untuk dibahas, sebab
pada layar ini tampilan program bisa dijadikan semenarik mungkin. Pada bagian
ini yang paling penting dan harus kita kuasai yaitu bagian yang menerangkan
mengenai memory layar yang dipakai sebagai data ditampilkan gambar/teks
dilayar.
Pada layar disediakan suatu buffer atau memory yang mencatat tentang apa
yang akan ditampilkan dilayar. Komputer akan membaca data pada memory layar
untuk memperbaharui tampilan pada layar yang dilakukan kurang lebih 70 kali
setiap detiknya. Cepatnya penulisan kembali gambar kode pada layar ini dinamakan
sebagai "refresh rate".
Pada layar monitor monokrom(tidak berwarna), alamat memory yang
dipakai sebagai buffer dipakai lokasi memory dimulai pada alamat
B000h:0000. Pada monitor berwarna dipakai lokasi memory mulai alamat
B800h:0000. Untuk pembahasaan pelajar selanjutnya akan selalu dipakai alamat
buffer layar berwarna(B800h).
Pada modus teks, setiap saat komputer akan selalu melihat pada alamat
B800h:0000 sebanyak satu byte untuk menampilkan huruf ASCII pada posisi
kolom 0 dan baris 0. lalu alamat B800h:0001 dipakai sebagai atribut dari
posisi kolom 0 dan baris 0. Alamat B800h:0002 dipakai sebagai data untuk
menampilkan huruf ASCII pada posisi kolom 1 dan baris 0. Dan alamat
B800h:0003 dipakai sebagai data untuk menampilkan atribut dari posisi kolom
1 baris 0. Demikian seterusnya memory layar dipakai (Lihat gambar kode 18.1).
<<< Gbr181.PIX >>>
gambar kode 18.1. pemakaian Memory Layar Untuk
Menampilkan Teks Dan Atributnya
Dari sini sudah dapat pelajar ketahui bahwa sebuah huruf pada saat
ditampilkan dimonitor memakai 2 byte, yang mana byte pertama dipakai untuk
kode ASCII-nya dan byte berikutnya dipakai untuk atribut dari huruf
itu .
sebab pada mode default, layar teks dibagi menjadi 80 kolom dan 25
baris(80*25), maka memory yang dibutuhkan untuk satu layar yaitu:
80 * 25 * 2 = 4000 Byte
Dengan alamat memory yang dipakai secara berurutan ini, yang mana teks
akan menempati offset genap dan atribut menempati offset ganjil, alamat dari
posisi huruf atau atribut bisa dihitung dengan memakai rumus:
Offset huruf = (Baris * 160) + (Kolom * 2)
Offset Atribut = (Baris * 160) + (Kolom * 2)+1
sehingga bila pelajar ingin menampilkan huruf 'S' pada posisi
kolom 40 dan baris 12 maka alamat yang dipakai yaitu: (12*160)+(40*2)=2000,
atau tepatnya B800h:2000. Untuk menampilkan atribut pada posisi kolom 40 dan
baris 12 maka alamat yang dipakai yaitu:(12*160)+(40*2)+1=2001, atau
tepatnya B800h:2001. contoh : bisa kita lihat pada program 18.1. yang
akan menampilkan huruf "S" pada posisi kolom 40 dan baris 12 dengan
atributnya 95.
Tulis_Kar MACRO X,Y,Kar,Attr
MOV AX,0B800h
MOV ES,AX ; ES Menunjuk pada segment layar
MOV AH,Y
MOV AL,160
MUL AH ; Hitung offset baris
MOV BX,AX ; Simpan hasilnya pada BX
MOV AH,X
MOV AL,2
MUL AH ; Hitung offset kolom
ADD BX,AX ; Tambahkan hasilnya pada BX
MOV AL,Kar ; AL=huruf yang akan ditampilkan
MOV AH,Attr ; AH=Atribut yang akan ditampilkan
MOV ES:[BX],AL ; Tampilkan huruf dan atributnya
MOV ES:[BX+1],AH ; pada posisi kolom X dan baris Y
ENDM
;----------------------
.MODEL SMALL
.CODE
ORG 100h
Proses :
Tulis_Kar 40 12 'S' 95 ; Tulis huruf 'S' dengan
; no atribut 95 pada posisi
INT 20h ; kolom 40 dan baris 12
END Proses
program Menuliskan langsung pada memory layar
Dengan mengertinya kita pada program ini maka banyak program
menarik yang dapat kita hasilkan, seperti program rontok, menu sorot, shadow
dan lain sebagainya.
Pada bagian ini akan pelajar lihat, bagaimana caranya menggeser geser tulisan
dengan mengakses memory layar secara langsung dengan program rontok.
program rontok yaitu program yang akan membersihkan layar dengan cara
menjatuhkan atau merontokkan huruf pada layar satu persatu.
Delay MACRO
PUSH CX ; Macro ini dipakai untuk
XOR CX,CX ; menunda program , dan
Loop1:
LOOP Loop1 ; hanya melakukan looping
POP CX
ENDM
Geser MACRO PosY
PUSH AX
PUSH BX
PUSH CX ; Simpan semua register yang dipakai
XOR CX,CX
MOV AL,26
SUB AL,PosY
MOV CL,AL ; CX=banyaknya pergeseran kebawah
Loop2:
MOV AL,BYTE PTR ES:[BX] ; AL=huruf pada layar
MOV BYTE PTR ES:[BX+160],AL ; Geser ke bawah
Hilang:
MOV BYTE PTR ES:[BX],' ' ; Hapus huruf
; sebelumnya
Delay ; delay, agar bisa
; tampak
ADD BX,160 ; Menuju baris selanjutnya
LOOP Loop2 ; Ulangi ke Loop2
POP CX
POP BX
POP AX ; Kembalikan semua register yang dipakai
ENDM
;/===========================/
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
PosY DB ?
Proses:
MOV AX,0B800h
MOV ES,AX ; ES mencatat segment layar
MOV BX,3998 ; Posisi huruf 80,25
MOV CX,25 ; Banyaknya pengulangan baris
UlangY :
MOV PosY,CL ; PosY mencatat posisi baris
PUSH CX ; CX mencatat posisi Y
MOV CX,80 ; Banyaknya pengulangan Kolom
UlangX :
CMP BYTE PTR ES:[BX],33 ; Apakah ada huruf
; pada layar ?
JB Tdk ; Lompat ke Tdk, bila tidak ada
Geser PosY ; Geser huruf itu ke bawah
Tdk :
SUB BX,2 ; BX menunjuk huruf selanjutnya
LOOP UlangX ; Proses 80 kali untuk kolom
POP CX ; Ambil posisi Y
LOOP UlangY ; Ulangi dan ganti baris ke atas
EXIT:
INT 20h
END TData
program 18.2. Merontokkan huruf pada layar
Bila program 18.2 dijalankan, maka semua huruf pada layar akan
dirontokkan satu persatu sampai habis.
<<< Gbr182.PIX >>>
gambar kode 18.2. Hasil eksekusi program 18.2.
sedang penjelasan program nya yaitu:
Delay MACRO
PUSH CX
XOR CX,CX
Loop1:
LOOP Loop1
POP CX
ENDM
Macro ini dipakai untuk menunda program . Dengan menolkan CX, maka
looping yang akan diperoleh menjadi FFFFh kali, sebab pengurangan 0 dengan
1 akan akan menghasilkan nilai -1 atau FFFFh.
Geser MACRO PosY
PUSH AX
PUSH BX
PUSH CX
Pada macro inilah nantinya huruf-huruf pada layar akan digeser. Untuk
itu simpanlah semua register yang dipakai oleh macro ini sebab pada program
utama, register-register juga dipakai .
XOR CX,CX
MOV AL,26
SUB AL,PosY
MOV CL,AL
Ini yaitu bagian dari macro geser yang akan menghitung banyaknya
pergeseran kebawah yang akan dilakukan, dengan melihat posisi dari huruf yang
digeser pada variabel "PosY".
Loop2:
MOV AL,BYTE PTR ES:[BX]
MOV BYTE PTR ES:[BX+160],AL
Hilang:
MOV BYTE PTR ES:[BX],' '
Delay
ADD BX,160
LOOP Loop2
Bagian inilah yang akan menggeser geser tulisan pada layar. Register BX
ditambah dengan 160 untuk mengakses baris dibawahnya.
POP CX
POP BX
POP AX
ENDM
Pada akhir macro, kembalikanlah semua register yang sudah disimpan pada
awal macro. Ingat urutannya harus terbalik. Pada program utama:
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
PosY DB ?
Pertama-tama siapkanlah sebuah variabel untuk menampung posisi dari
baris yang sedang diakses.
Proses:
MOV AX,0B800h
MOV ES,AX
MOV BX,3998
MOV CX,25
Register ES, pelajar pakai sebagai penunjuk segment layar, yaitu pada
segment B800h. Register BX yang nantinya akan pelajar pakai sebagai penunjuk
offset dari ES diberi nilai 3998. sehingga pasangan ES:BP akan menunjuk
pada huruf dipojok kanan bawah atau posisi 79,24.
UlangY :
MOV PosY,CL
PUSH CX
MOV CX,80
UlangX :
CMP BYTE PTR ES:[BX],33
JB Tdk
Geser PosY
Tdk :
SUB BX,2
LOOP UlangX
POP CX
LOOP UlangY
EXIT:
INT 20h
END TData
lalu lakukanlah proses dengan melihat apakah ada huruf atau
tidak. ini dapat dilakukan dengan membandingkannya dengan kode ASCII 33,
bila data pada buffer layar dibawah ASCII 33 artinya tidak ada huruf pada
layar.
bila ada huruf pada layar maka proses geser dilakukan, sebaliknya
bila tidak ada huruf proses akan menuju pada posisi selanjutnya dan
melakukan hal yang sama.
BIOS menyediakan suatu fungsi yang dapat dipakai untuk mengulung layar
dengan batasan yang pelajar tentukan. sedang aturan pemakaian dari interupsi ini
yaitu:
INPUT:
AH = Diisi dengan 6 untuk menggulung layar keatas, untuk
menggulung layar kebawah diisi dengan 7.
AL = Banyaknya pergeseran yang akan dilakukan. bila diisi dengan
nol, maka seluruh isi window akan dihapus.
CH = Posisi baris kiri atas window
CL = Posisi kolom kiri atas window
DH = Posisi baris kanan bawah window
DL = Posisi kolom kanan bawah window
BH = Atribut yang akan mengisi hasil penggulungan window
Sesudah semuanya kita persiapkan lakukan lah interupsi 10h. kita bisa
membersihkan layar dengan fungsi ini dengan meletakkan 0 pada register AL, dan
membuat window pada posisi 0,0 dan 79,24.
DELAY MACRO ; Macro untuk menunda program
LOCAL Ulang
PUSH CX
XOR CX,CX
Ulang:
LOOP Ulang
POP CX
ENDM
Scrool MACRO X1,Y1,X2,Y2,Arah
PUSH CX
MOV AH,Arah ; Servis Gulung keatas atau kebawah
MOV AL,1 ; Jumlah Baris
MOV CL,X1 ; Kolom kiri atas
MOV CH,Y1 ; Baris kiri Atas
MOV DL,X2 ; Kolom kanan bawah
MOV DH,Y2 ; Baris kanan bawah
MOV BH,01000111b ; Atribut hasil penggulungan
INT 10h
POP CX
ENDM
;/========================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
G_Atas EQU 6 ; Servis untuk menggulung ke atas
G_Bawah EQU 7 ; Servis untuk menggulung ke bawah
Proses:
MOV CX,7
Ulang:
Scrool 20 7 60 14 G_Bawah
delay
LOOP Ulang
INT 20h
END TData
program 18.3. Mengulung layar
Bila program 18.3. kita jalankan, maka pada layar akan tampak seperti
gambar kode 18.2.
<<< Gbr183.PIX >>>
gambar kode 18.3. Hasil eksekusi program 18.3.
Untuk memindahkan posisi kursor, seperti dengan perintah GOTOXY pada
pascal, bisa kita pakai interupsi dari BIOS. Interupsi yang dipakai yaitu
interupsi 10h dengan aturan pemakaian:
INPUT:
AH = 2
DH = Posisi Baris(00-24)
DL = Posisi Kolom(00-79)
BH = Halaman layar(0=default)
sedang contoh dari pemakaian fungsi ini dalam bentuk macro yaitu:
GOTOXY MACRO X,Y
MOV AH,02
XOR BX,BX
MOV DH,Y
MOV DL,X
INT 10h
(100)
ENDM
seperti dengan fungsi WhereX dan WhereY dalam pascal, didalam
assembler kita juga bisa mengetahui posisi dari kursor. Untuk itu sudah
tersedia interupsi 10h dari BIOS dengan aturan pemakaian:
INPUT: OUTPUT:
AH = 03 DH = Posisi Baris
BH = Halaman Layar(0=default) DL = Posisi Kolom
sedang contoh pemakaian fungsi ini dalam bentuk macro bisa kita lihat
sebagai berikut:
WherePos MACRO X,Y
MOV AH,03
MOV BH,0
MOV X,DL
MOV Y,DH
ENDM
Dewasa ini, menu-menu yang disabila n oleh program yang besar hampir
semuanya dalam bentuk menu sorot. Kini dengan sedikit pengetahuan mengenai
memory layar akan pelajar buat suatu menu sorot yang sederhana. Menu ini bisa
dikembangkan atau dipakai untuk program yang kita buat.
Cls MACRO ; Macro untuk menghapus layar
MOV AX,0600h
XOR CX,CX
MOV DX,184Fh
MOV BH,10 ; Atribut Hijau diatas hitam
INT 10h
ENDM
GotoXY MACRO X,Y ; Macro untuk memindahkan kursor
MOV AH,02
XOR BX,BX
MOV DH,Y
MOV DL,X
INT 10h
ENDM
SimpanL MACRO ; Macro untuk menyimpan seluruh
LOCAL Ulang ; isi layar monitor
MOV AX,0B800h
MOV ES,AX
MOV CX,4000
XOR BX,BX
Ulang:
MOV AL,ES:[BX]
MOV Layar[BX],AL
INC BX
LOOP Ulang
ENDM
BalikL MACRO ; Macro untuk mengembalikan semua
LOCAL Ulang ; isi layar yang sudah disimpan
MOV CX,4000
XOR BX,BX
Ulang:
MOV AL,Layar[BX]
MOV ES:[BX],AL
INC BX
LOOP Ulang
ENDM
Sorot MACRO X,Y ; Macro untuk membuat sorotan
LOCAL Ulang ; pada menu
MOV BL,Y
MOV AL,160
MUL BL
MOV BX,AX
MOV AL,X
MOV AH,2
MUL AH
ADD BX,AX
INC BX ; Alamat warna pada posisi X,Y
MOV CX,25 ; Panjangnya sorotan
Ulang:
MOV BYTE PTR ES:[BX],4Fh ; Atribut sorotan
; putih diatas merah
ADD BX,2
LOOP Ulang
ENDM
Readkey MACRO ; Macro untuk membaca masukan dari
MOV AH,00 ; keyboard.
INT 16h ; hasilnya AH=Extended, AL=ASCII
ENDM
MenuL MACRO String ; Macro untuk mencetak menu
MOV AH,09
LEA DX,String
INT 21h
ENDM
;/=======================/;
.MODEL SMALL
.CODE
ORG 100h
TData: JMP Proses
Layar DB 4000 DUP (?)
Menu DB 9,9,'+=============================+',13,10
DB 9,9,'| »»» MENU SOROT ««« |',13,10
DB 9,9,'+=============================+',13,10
DB 9,9,'| |',13,10
DB 9,9,'| 1. Pilihan pertama |',13,10
DB 9,9,'| 2. Pilihan Kedua |',13,10
DB 9,9,'| 3. Pilihan Ketiga |',13,10
DB 9,9,'| 4. Pilihan Keempat |',13,10
DB 9,9,'| |',13,10
DB 9,9,'+=============================+$'
PosX DB 22 ; Posisi kolom mula-mula
PosY DB 12 ; Posisi baris mula-mula
Panah_Atas EQU 72 ; Kode tombol panah atas
Panah_Bawah EQU 80 ; Kode tombolpanah bawah
TEnter EQU 0Dh ; Kode tombol Enter
Proses :
Cls ; Hapus layar
GotoXY 0 8 ; kursor = 0,8
MenuL Menu ; gambar kode menu
SimpanL ; Simpan isi layar
Ulang :
BalikL ; Tampilkan isi layar yang
; disimpan
Sorot PosX,PosY ; Sorot posisi X,Y
Masukan:
Readkey ; Baca masukan dari keyboard
CMP AH,Panah_Bawah ; Panah bawah yang ditekan ?
JE Bawah ; Ya! lompat bawah
CMP AH,Panah_Atas ; Panah atas yang ditekan ?
JE CekY ; Ya, lompat CekY
CMP AL,TEnter ; Tombol enter yang ditekan ?
JNE Masukan ; Bukan, lompat ke ulangi
JMP Selesai ; Ya, lompat ke selesai
CekY :
CMP PosY,12 ; Apakah sorotan paling atas ?
JE MaxY ; Ya! lompat ke MaxY
DEC PosY ; Sorotkan ke atas
JMP Ulang ; Lompat ke ulang
MaxY :
MOV PosY,15 ; PosY=Sorotan paling bawah
JMP Ulang ; lompat ke ulang
Bawah :
CMP PosY,15 ; apakah sorotan paling bawah ?
JE NolY ; Ya! lompat ke NolY
INC PosY ; Sorotkan ke bawah
JMP Ulang ; Lompat ke ulang
NolY :
MOV PosY,12 ; Sorotan paling atas
JMP Ulang ; Lompat ke ulang
Selesai:
INT 20h
END TData
program 18.4. Membuat Menu Sorot
Bila program 18.4. dijalankan, maka kita akan memperoleh suatu menu
sorot yang menarik, seperti pada gambar kode 18.4.
<<< Gbr184.PIX >>>
gambar kode 18.4. Hasil eksekusi program 18.4.
sudah pelajar bahas bahwa pada normalnya satu layar memakai 4000
byte memory. namun memory yang disediakan untuk layar ini sebetulnya malah
beberapa kali lipat lebih banyak dari 4000 byte, sebab nya terciptalah apa
yang dinamakan 'paging' atau halaman tampilan layar.
Banyaknya halaman tampilan ini sangat bervariasi sebab tergantung
jumlah memory yang tersedia dan jumlah memory yang dipakai oleh satu halaman
tampilan. Untuk alamat awal dari masing-masing halaman tampilan bisa kita
lihat pada gambar kode 18.5.
+----------+--------------+
| Halaman | 80 X 25 |
+----------+--------------+
| 0 | B800:0000h |
| 1 | B800:1000h |
| 2 | B800:2000h |
| 3 | B800:3000h |
| 4 | B800:4000h* |
| 5 | B800:5000h* |
| 6 | B800:6000h* |
| 7 | B800:7000h* |
+----------+--------------+
Ket : * tidak berlaku pada CGA
gambar kode 18.5. Alamat Awal Halaman Tampilan
Untuk mengakses memory halaman tampilan yang lain pada modus teks, rumus
yang sudah pelajar buat terdahulu bisa kita perbaharui menjadi:
Offset huruf = (Baris * 160)+(Kolom * 2) + (Halaman*1000h)
Offset Atribut = (Baris * 160)+(Kolom * 2)+1+(Halaman*1000h)
Secara default halaman tampilan yang dipakai yaitu halaman tampilan
ke 0, yang beralamat awal pada B800:0000h. Untuk merubah halaman tampilan yang
aktif ini bisa kita pakai servis 5 dari interupsi 10h. sedang aturan
pemakaian servis ini yaitu:
INPUT:
AH = 5
AL = Nomor halaman tampilan yang akan diaktifkan
Delay MACRO Rep ; Macro ini untuk menunda program
LOCAL Ulang
PUSH CX
MOV DX,Rep
SUB CX,CX
Ulang:
LOOP Ulang
DEC DX
CMP DX,0
JNZ Ulang
POP CX
ENDM
Ak_Page MACRO No ; Macro ini dipakai untuk
MOV AH,5 ; mengaktifkan halaman layar
MOV AL,No
INT 10h
ENDM
;/========================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kal0 DB 'INI yaitu HALAMAN TAMPILAN KE 2 ',13,10
DB ' DENGAN ALAMAT AWAL B800:1000h !!! $'
Proses:
Ak_Page 2 ; Aktifkan halaman layar yang ke 2
MOV AH,09 ;
LEA DX,Kal0 ; Tulis kalimat pada halaman ke 2
INT 21h ;
MOV CX,3 ; Banyaknya pengulangan
Ulang:
Ak_Page 2 ; Aktifkan halaman ke 2
Delay 100
Ak_Page 0 ; Aktifkan halaman ke 0
Delay 100
LOOP Ulang
INT 20h
END Tdata
program 18.5. Halaman Layar
Bila program 18.5. kita jalankan, maka dapat kita lihat perpindahan
halaman aktif dari halaman tampilan 0 (default DOS) dan halaman tampilan 2.
Catatan:
Bila kita melakukan CLS dengan DOS, maka hanya halaman tampilan aktif
yang akan terhapus, sedang data pada halaman tampilan yang lain akan tetap.
Pada modus teks, huruf tersusun atas titik-titik yang
dinamakan pixel. Pixel-pixel yang membentuk huruf - huruf ini
disimpan dalam tabel. pada EGA ada 4 buah tabel, sedang pada VGA
ada 8 buah tabel huruf (Masing- masing 8 KB).
huruf yang ditampilkan pada layar monitor diambil dari
tabel-tabel yang membentuk huruf ini. Secara default tabel yang akan
dipakai yaitu tabel ke nol(0).
Bila monitor kita yaitu monitor EGA keatas, maka bentuk huruf bisa
diubah dengan mengubah isi dari tabel yang menyusun huruf ini.
Untuk itu BIOS sudah menyediakan interupsi 10h, service 11h, subservis 00
untuk keperluan ini. sedang aturan dari pemakaiannya yaitu:
INPUT:
AH = 11h
AL = 00h
CX = Jumlah bentuk huruf yang akan diganti
DX = Kode ASCII huruf awal yang akan diganti
BL = Nomor tabel huruf yang diubah
BH = Jumlah byte perhuruf
ES:BP = Alamat buffer pola huruf
;/================================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Tabel DB 00011000b ; __
DB 00011000b ; __
DB 10011001b ; _ __ _
DB 11111111b ; ________
DB 10011001b ; _ __ _
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00011000b ; __
DB 00001000b ; _
Proses :
MOV AX,1100h ; Servis
MOV DX,'A' ; huruf ASCII awal yang akan diganti
MOV CX,1 ; Banyaknya huruf yang akan diganti
MOV BL,0 ; Nomor blok pemuatan huruf
MOV BH,16 ; Jumlah byte perhuruf
LEA BP,Tabel ; Lokasi tabel
INT 10h
INT 20h
END TData
program 18.6. Merubah bentuk huruf
Bila program 18.6. dijalankan, maka semua huruf "A" akan akan segera
berubah bentuknya menjadi berbentuk pedang(gambar kode 18.6.).
<<<< Gbr186.PIX >>>>
gambar kode 18.6. Hasil eksekusi program 18.6.
Huruf-huruf yang dipakai akan kembali normal, bila dilakukan
pergantian mode. Cobalah kita buat sebuah program yang akan mengganti mode
layar dan lihatlah hasil yang akan terjadi sesudah membaca bagian 18.10
dibawah ini.
Suatu subsistem video bisa memiliki lebih dari satu mode video, namun
hanya satu mode yang dapat aktif pada satu saat. Banyaknya mode video yang
ada pada suatu jenis subsistem tergantung pada adapter yang dipakai.
Makin canggih adapter yang dipakai, makin banyak pula mode video yang
didukungnya. Untuk lebih jelasnya mengenai mode video ini dapat dilihat pada
gambar kode 18.7.
+------+--------+---------+-----------+----------+----------+
| Mode | Teks/ | Jumlah | Resolusi | Sistem | Jumlah |
| | Grafik | Warna/ | | Video | Halaman |
| | | Mono | | | Tampilan |
+------+--------+---------+-----------+----------+----------+
| 00h | T | Gray | 40X 25 | CMEV | 8 |
| 01h | T | 16 | 40X 25 | CMEV | 8 |
| 02h | T | Gray | 80X 25 | CMEV | 8 |
| 03h | T | 16 | 80X 25 | CMEV | 8 |
| 04h | G | 4 | 320X200 | CMEV | 1 |
| 05h | G | Gray | 320X200 | CMEV | 1 |
| 06h | G | 2 | 640X200 | CMEV | 1 |
| 07h | T | Mono | 80X 25 | DEV | 8 |
| 0Dh | G | 16 | 320X200 | EV | 8 |
| 0Eh | G | 16 | 640X200 | EV | 4 |
| 0Fh | G | Mono | 640X350 | EV | 2 |
| 10h | G | 16 | 640X350 | EV | 2 |
| 11h | G | Mono | 640X480 | MV | 1 |
| 12h | G | 16 | 640X480 | V | 1 |
| 13h | G | 256 | 320X200 | MV | 1 |
+------+--------+---------+-----------+----------+----------+
Ket. C = CGA (Color Graphics Adapter)
M = MCGA (Memory Controller Card Array)
D = MDA (Monochrome Display Adapter)
E = EGA (Enchanced Graphics Adapter)
V = VGA (Video Graphics Array)
gambar kode 18.7. Tabel Mode Video