Sesudah melihat tabel mode video, mungkin ada yang heran mengapa sesudah
mode 07h langsung ke mode 0Dh. sebetulnya mode- mode di antara kedua mode ini
ada, namun hanya untuk perangkat video khusus seperti untuk keperluan PCjr
yang sudah jarang. Mode video umum dari default DOS yaitu mode 03h yaitu teks
80X25.
Dalam inisialisasi mode video ini pelajar memakai 2 service dari
interupt 10h, yaitu untuk memperoleh mode video aktif dan merubah mode video.
Untuk memperoleh mode video aktif pakai service 0Fh. Sesudah
pemanggilan service ini, maka beberapa nilai akan dikembalikan ke register
yaitu :
- AL = mode video aktif (lihat tabel mode video)
- AH = jumlah huruf per kolom
- BH = halaman tampilan aktif
Halaman tampilan aktif di sini maksudnya yaitu nomor dari halaman yang
sedang ditampilkan. Jumlah halaman yang ada pada suatu sistem video
tergantung pada jumlah memori video yang tersedia.
sedang service 00h dipakai untuk merubah mode video. Seperti biasa
register AH akan berisi nomor service yang dalam ini yaitu 00h. sedang
mode yang diinginkan diletakkan dalam register AL.
SetMode MACRO Mode
MOV AH,00
MOV AL,Mode
INT 10h
ENDM
Setiap kali dilakukan perubahan pada mode video, maka otomatis memori
video juga akan dikosongkan dan sebagai akibatnya layar juga akan dibersihkan.
TIP:
sebab setiap kali terjadi pergantian mode layar akan dibersihkan, kita
bisa memanfaatkannya untuk membersihkan layar. contoh pada modus Teks
default(03), dengan mengaktifkan mode 03 juga, maka isi dari layar akan
langsung terhapus.
Bila pelajar tidak menginginkan terjadinya efek pembersihan layar ini, maka
nomor mode video pada AL harus dijumlahkan dengan 128 atau dengan kata lain
bit ke-7 pada AL dihidupkan. Dengan cara ini maka isi layar yang lama tidak
akan hilang sesudah perubahan mode.
Apa itu string ? String yaitu suatu jenis data yang terdiri atas
kumpulan huruf , angka, atau simbol. Pada operasi string register SI dan
DI berperan . Register SI(Source Index) dipakai
untuk mencatat alamat dari sumber string yang akan dimanipulasi sedang
register DI(Destination Index) dipakai untuk mencatat alamat atau tempat
hasil dari manipulasi string. Operasi pada string secara lengkap bisa kita
lihat pada tabel 19.1.
+-------------------------------------------------------------+
| INTRUKSI ARTI |
+-------------------------------------------------------------+
| CLD Clear Direction Flag |
| STD Set Direction Flag |
| |
| CMPS Compare String |
| CMPSB Compare String 1 Byte |
| CMPSW Compare String 1 Word |
| CMPSD Compare String 1 Double Word <80386 & 80486>|
| |
| LODS Load String |
| LODSB Load String 1 Byte To AL |
| LODSW Load String 1 Word To AX |
| LODSD Load String 1 Double Word To EAX <80386 & |
| 80486> |
| MOVS Move String |
| MOVSB Move String 1 Byte |
| MOVSW Move String 1 Word |
| MOVSD Move String 1 Double Word <80386 & 80486 > |
| |
| REP Repeat |
| REPE Repeat If Equal |
| REPZ Repeat If Zero |
| REPNE Repeat If Not Equal |
| REPNZ Repeat If Not Zero |
| |
| SCAS Scan String |
| SCASB Scan String 1 Byte |
| SCASW Scan String 1 Word |
| SCASD Scan String 1 Double Word <80386 & 80486> |
| |
| STOS Store String |
| STOSB Store AL at ES:DI String |
| STOSW Store AX at ES:DI String |
| STOSD Store EAX at ES:DI String <80386 & 80486> |
+-------------------------------------------------------------+
gambar kode 19.1. Perintah Untuk Operasi String
19.2. menyalinkan DAN ARAH PROSES OPERASI STRING
seperti dengan perintah MOV, pada string dipakai perintah
MOVS(Move String) untuk menyalin data dari DS:SI menuju ES:DI. Pasangan DS:SI
mencatat alamat dari sumber string sedang ES:DI mencatat alamat hasil dari
operasi string.
Setiap kali terjadi operasi string(MOVS) maka register SI dan DI akan
berkurang atau bertambah sesuai dengan direction flag. kita bisa menaikkan
nilai SI dan DI pada setiap proses dengan perintah CLD(Clear Direction Flag)
dan STD(Set Direction Flag) untuk menurunkan nilai SI dan DI pada setiap
proses. Pada saat program dijalankan, secara otomatis direction flag akan
menunjuk pada proses menaik.
;/=================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kalimat DB 'Donald Duck$' ; 12 huruf
Buffer DB 12 DUP(?)
Proses:
LEA SI,Kalimat ; SI = sumber
LEA DI,Buffer ; DI = tujuan
CLD ; Arah proses menaik
MOV CX,18 ; Banyaknya pengulangan
Ulang :
MOVS ES:Buffer,Kalimat ; Pindahkan data pada
LOOP Ulang ; DS:SI ke ES:DI
MOV AH,09 ;
LEA DX,Buffer ;
INT 21h ; Cetak data pada buffer
INT 20h
END TData
program 19.1. pemakaian perintah MOVS
Pada program 19.1. dapat kita lihat bagaimana proses menyalinkan data
'Kalimat' ke 'buffer'. Bila program 19.1. dijalankan maka dilayar akan
ditampilkan:
Donald Duck
Hasil yang tercetak yaitu data pada buffer yang diambil pada
variabel 'kalimat'. Perintah CLD dipakai untuk memastikan agar arah proses
menaik(SI dan DI ditambah setiap kali operasi).
(STD)Menurun <--- DS:SI ---> Menaik(CLD)
_
+---+---+---+---+---+---+---+---+---+---+---+
| D | o | n | a | l | d | | D | u | c | k |
+---+---+---+---+---+---+---+---+---+---+---+
Offset: 103 104 105 106 107 108 109 200 201 202 203
sebab sumber(kalimat) dan tujuan(buffer) pada program 19.1. dipakai
tipe data byte(DB) maka oleh assembler perintah MOVS akan dijadikan MOVSB(Move
string byte), sehingga register SI dan DI setiap kali proses akan ditambah
dengan 1. Bila sumber dan tujuan didiartikan dengan DW, maka assembler akan
menjadikannya MOVSW(Move string word), dan setiap kali operasi SI dan DI akan
ditambah dengan 2.
Selain dengan perintah MOVS, kita bisa juga langsung memakai
perintah MOVSB atau MOVSW. ,, mengapa pelajar harus
memakai MOVSB atau MOVSW, bila dengan perintah MOVS assembler akan
merubahnya secara otomatis. Bila kita memakai perintah MOVSB atau MOVSW
secara langsung maka ini akan membantu assembler sebab ia tidak perlu
lagi menterjemahkannya, selain itu program akan lebih efisien.
Intruksi MOVSB dan MOVSW tidak memerlukan operand, oleh sebab itu bila
pada program 19.1. ingin kita rubah dengan MOVSB, maka pada perintah:
MOVS ES:Buffer,Kalimat
Bisa kita ganti menjadi:
MOVSB
Pada program 19.1. pelajar masih memakai pengulangan yang primitif.
sebetulnya untuk operasi string ini assembler sudah menyediakan beberapa
pengulangan khusus, yaitu:
-REP <Repeat> : Melakukan pengulangan suatu operasi string
sebanyak CX kali(register CX akan dikurangi 1 secara otomatis). Ini yaitu
bentuk pengulangan tanpa syarat yang akan melakukan pengulangan terus sampai
CX mencapai 0.
-REPE <Repeat If Equal> : Melakukan pengulangan operasi string
sebanyak CX kali atau bila sampai ada ketidaksamaan pada kedua operand
yang membuat zero flag menjadi tidak aktif(ZF=0).
-REPZ <Repeat If Zero> : Perintah ini sama dengan REPE.
-REPNE <Repeat If Not Equal> : Melakukan pengulangan operasi string sebanyak
CX kali atau bila sampai ada kesamaan pada kedua operand yang membuat
zero flag menjadi aktif(ZF=1).
-REPNZ <Repeat If Not Zero> : Perintah ini sama dengan REPNE.
lihat :
kita hanya bisa memakai bentuk pengulangan string
bersyarat(REPE,REPZ,REPNE,REPNZ) ini ditambah dengan perintah CMPS dan SCAS.
ini dipicu hanya CMPS dan SCAS yang mempengaruhi zero flag.
Bila pada program 19.1. dipakai perulangan string, maka hasilnya akan
menjadi seperti program 19.2.
;/======================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Kalimat DB 'Donald Duck$' ; 12 huruf
Buffer DB 12 DUP(?)
Proses:
LEA SI,Kalimat ; SI = sumber
LEA DI,Buffer ; DI = tujuan
CLD ; Arah proses menaik
MOV CX,18 ; Banyaknya pengulangan
REP MOVS ES:Buffer,Kalimat ; Pindahkan data
; 'kalimat' ke 'Buffer'
MOV AH,09 ;
LEA DX,Buffer ;
INT 21h ; Cetak Data pada Buffer
INT 20h
END TData
program 19.2. pemakaian perintah REP
Pada dasarnya perbandingan string sama dengan menyalinkan string. Pada
perbandingan string juga ada bentuk CMPS yang dapat berupa
CMPSB(perbandingan byte), CMPSW(perbandingan word) dan CMPSD(perbandingan
double word pada 80386 keatas).
Pada string, perbandingan akan dilakukan pada lokasi memory DS:SI dan
ES:DI. Perbandingan bisa dilakukan perByte, PerWord atau perDouble Word(Untuk
80386 keatas).
Cetak_Klm MACRO Kal
MOV AH,09
LEA DX,Kal ; Macro untuk mencetak kalimat
INT 21h
ENDM
;/=============================/;
.MODEL SMALL
.CODE
ORG 100h
TData: JMP Proses
Kal1 DB 'akjsdfhakjvhdf'
Kal2 DB 'akjsdfhakPvhdf'
Pesan1 DB 'Kedua kalimat yang dibandingkan sama ! $'
Pesan2 DB 'Kedua kalimat yang dibandingkan tidak sama !$'
Proses :
LEA SI,Kal1
LEA DI,Kal2
CLD ; Arah proses menaik
MOV CX,14 ; Banyaknya perbandingan dilakukan
Ulang :
REP CMPSB ; Bandingkan selama sama
JNE TdkSama ; bila tidak sama, lompat ke TdkSama
Cetak_Klm Pesan1 ; Cetak pesan tidak sama
JMP EXIT ; Selesai
TdkSama:
Cetak_Klm Pesan2 ; Cetak pesan sama
EXIT :
INT 20h
END TData
program 19.3. Perbandingan String
Bila program 19.3. dijalankan, maka pada layar akan ditampilkan:
Kedua kalimat yang dibandingkan tidak sama !
Perlu kita perhatikan, bahwa perbandingan akan dilakukan sebanyak 14
kali(Nilai CX) atau ada ketidak-samaan pada kedua lokasi memory. Bila
ditemukan adanya ketidak samaan, perbandingan akan selesai dilakukan dan
register SI dan DI tetap ditambah dengan satu, sehingga akan menunjuk pada
huruf selanjutnya(sesudah huruf yang tidak sama, pada contoh 19.3.
berupa huruf "v").
Operasi scan pada string dipakai untuk membandingkan nilai pada
register AL, AX atau EAX(80386) dengan data pada ES:DI. sedang syntax
pemakaian SCAN ini yaitu:
SCANS Operand
seperti dengan operasi pada string lainnya, bila dipakai perintah
diatas, assembler masih akan menerjemahkannya dalam bentuk SCASB(perbandingan
AL dengan ES:DI), SCASW(perbandingan AX dengan ES:DI) atau SCASD(perbandingan
EAX dengan ES:DI) yang tidak memerlukan operand.
Cetak_Klm MACRO Kal
MOV AH,09 ;
LEA DX,Kal ;
INT 21h ; Macro untuk mencetak kalimat
ENDM
;/========================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Cari DB 'akddtiuerndfalDfhdadfbn' ; 24 buah huruf
Ketemu DB ' huruf ''s''yang dicari ketemu ! $'
Tidak DB ' huruf ''s'' yang dicari tidak ketemu ! $'
Proses:
LEA DI,Cari ; Lokasi dari string yang diScan
MOV AL,'s' ; huruf yang dicari
MOV CX,24 ; Banyaknya proses Scan
REPNE SCASB ; Scan sebanyak CX atau sampai ZF=1
JNZ Tdk_Ada ; bila tidak ketemu, maka lompat!
Cetak_Klm Ketemu ; Cetak ketemu
JMP Exit ; Habis
Tdk_Ada:
Cetak_Klm Tidak ; Cetak tidak ketemu
EXIT : INT 20h ; Selesai
END TData
program 19.4. Operasi Scan pada String
Bila program 19.4. dijalankan, maka pada layar akan ditampilkan:
huruf 's' yang dicari tidak ketemu !
LODS yaitu bentuk umum untuk mengambil string dari lokasi memory
DS:[SI] menuju AL, AX atau EAX. seperti dengan operasi string lainnya,
LODS juga akan diterjemahkan oleh assembler ke dalam bentuk LODSB(DS:[SI] ke
AL), LOSW(DS:[SI] ke AX) atau LODSD(DS:[SI] ke EAX<80386>).
19.6. MENGISI STRING
STOS yaitu bentuk umum untuk mengisi string dari AL,AX atau EAX
menuju ES:[DI]. seperti dengan operasi string lainnya, STOS juga akan
diterjemahkan oleh assembler ke dalam bentuk STOSB(AL ke ES:[DI]), STOSW(AX ke
ES:[DI]) atau STOSD(EAX ke ES:[DI] ).
bila Direction flag bernilai 0(dengan CLD) maka sesudah intruksi STOS
dijalankan register DI akan ditambah secara otomatis, sebaliknya bila
Direction flag bernilai 1(dengan STD) maka register DI akan dikurang secara
otomatis. kita bisa memakai intruksi pengulangan pada string ditambah
dengan perintah STOS ini.
Pada assembler, untuk mencetak suatu angka tidak semudah mencetak
angka pada bahasa tingkat tinggi. ini dipicu baik oleh BIOS atau
DOS tidak disediakan fungsinya. contoh pelajar memiliki suatu angka 7, untuk
mencetaknya pelajar harus menerjemahkan ke dalam kode ASCII 55 dahulu barulah
mencetaknya. Demikian halnya bila ingin mencetak angka 127, maka pelajar juga
harus menterjemahkannya dalam kode ASCII 49, 50 dan 55 untuk lalu dicetak.
Selanjutnya akan pelajar lihat, bagaimana caranya untuk mencetak angka
dalam bentuk desimal atau hexadesimal.
Cara yang paling banyak dilakukan oleh program mer assembler, untuk
mencetak angka dalam bentuk desimal yaitu dengan membagi angka itu
dengan 10. lalu sisa pembagiannya disimpan dalam stack. Pada saat
pencetakan, angka-angka yang disimpan dalam stack akan diambil satu persatu
untuk dicetak.
contoh kita memiliki angka 345, maka hasil pembagian dengan 10
sebanyak 3 kali akan menghasilkan sisa berturut-turut 5, 4 dan 3. Sisa
pembagian ini lalu disimpan pada stack. sebab sifat stack yang LIFO <Last
In First Out>, maka pada saat pengambilan angka pada stack untuk dicetak akan
diambil berturut-turut angka 345 !.
;/=======================/;
.MODEL SMALL
.CODE
ORG 100h
TData :
JMP Proses
Test_Angka DW 65535 ; Angka yang akan dicetak
Proses:
MOV AX,Test_Angka ; AX = angka yang akan dicetak
MOV BX,10 ; BX = penyebut
XOR CX,CX ; CX = 0
Ulang :
XOR DX,DX ; Cegah sisa bagi menjadi pembilang !
DIV BX ; Bagi angka yang akan dicetak dengan 10
PUSH DX ; Simpan sisa bagi dalam stack
INC CX ; CX ditambah 1
CMP AX,0 ; Apakah hasil bagi sudah habis ?
JNE Ulang ; bila belum, ulangi lagi !
Cetak :
POP DX ; Ambil 1 angka yang disimpan
ADD DL,'0' ; Ubah angka itu dalam kode ASCII
MOV AH,02 ;
INT 21h ; Cetak angka itu
LOOP Cetak ; ulangi
INT 20h
END TData
program 20.1. Mencetak angka dalam bentuk desimal
Bila program 20.1. dijalankan, maka pada layar akan ditampilkan:
65535
Apa itu bilangan prima? Bilangan prima yaitu bilangan yang hanya habis
dibagi oleh dirinya sendiri dan 1. Contoh dari bilangan prima ini yaitu 2, 3,
5, dan sebagainya.
Secara matematika, untuk mengetest apakah suatu bilangan yaitu prima
atau bukan, yaitu dengan cara pembagian. contoh pelajar ingin mengetahui
apakah angka 7 yaitu prima atau bukan, pelajar akan mencoba untuk membaginya
dengan 6, 5, 4,..2. Ternyata semua sisa pembagiannya yaitu tidak nol atau
tidak habis dibagi. Sebagai kesimpulannya, angka 7 yaitu prima.
Pada program 20.2. akan kita lihat bagaimana mencari dan menapilkan
semua angka prima yang terletak antara angka 0 sampai 1000. pelajar akan
memakai program 20.1. untuk menampilkan angka prima yang sudah berhasil
dicari.
Cetak_Klm MACRO Klm ; Macro untuk mencetak kalimat
MOV AH,09
LEA DX,Klm
INT 21h
ENDM
CDesimal MACRO Angka
LOCAL Ulang, Cetak
MOV AX,Angka ; AX = angka yang akan dicetak
MOV BX,10 ; BX = penyebut
XOR CX,CX ; CX = 0
Ulang :
XOR DX,DX ; Cegah sisa bagi menjadi pembilang !
DIV BX ; Bagi angka yang akan dicetak dengan 10
PUSH DX ; Simpan sisa bagi dalam stack
INC CX ; CX ditambah 1
CMP AX,0 ; Apakah hasil bagi sudah habis ?
JNE Ulang ; bila belum, ulangi lagi !
Cetak :
POP DX ; Ambil 1 angka yang disimpan
ADD DL,'0' ; Ubah 1 angka dalam kode ASCII
MOV AH,02 ;
INT 21h ; Cetak angka itu
LOOP Cetak ; ulangi
ENDM
;/====================/;
.MODEL SMALL
.CODE
ORG 100h
TData :JMP Awal
Batas DW 1000
Prima DW 0
I DW 2
J DW 2
Spasi DB ' $'
Header DB 9,9,9,'Bilangan Prima 1 sampai 1000 : ',13,10
DB 9,9,9,'------------------------',13,10,10,'$'
Awal :
Cetak_Klm Header
Proses :
MOV AX,Batas ; bila bilangan yang dicek
CMP AX,I ; sudah sama dengan Batas
JE Exit ; maka selesai
ForI :
MOV J,2 ; J untuk dibagi oleh I
MOV Prima,0 ; Prima = Tidak
ForPrima:
MOV AX,Prima ;
CMP AX,0 ; Apakah prima = Tidak ?
JNE TambahI ; bila Prima = Ya, lompat ke TambahI
MOV AX,I ;
CMP AX,J ; I = J ?
JNE Tidak ; bila tidak sama, lompat ke Tidak
CDesimal I ; Cetak angka prima
Cetak_Klm Spasi ; Cetak spasi
MOV Prima,1 ; Prima = Ya
JMP TambahJ ; Lompat ke TambahJ
Tidak :
MOV DX,0 ;
MOV AX,I ;
MOV BX,J ;
DIV BX ; Bagi I dengan J
CMP DX,0 ; Apakah sisa bagi=0?
JNE TambahJ ; bila tidak sama lompat ke TambahJ
MOV Prima,1 ; Prima = Ya
TambahJ :
INC J ; Tambah J dengan 1
JMP ForPrima ; Ulangi, bagi I dengan J
TambahI :
INC I ; Tambah I dengan 1
JMP Proses ; Ulangi Cek I = prima atau bukan
Exit :
INT 20h
END TData
program 20.2. Mencari dan menapilkan bilangan prima
Bila program 20.2. dijalankan, maka pada layar akan ditampilkan:
Bilangan Prima 0 sampai 1000 :
-----------------------------
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163
167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251
257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443
449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557
563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647
653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757
761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863
877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983
991 997
Dengan program 20.2. bilangan prima antara 0 sampai 65535 dapat kita
ditampilkan.
20.4. MENCETAK ANGKA DALAM BENTUK HEXADESIMAL
Untuk mencetak angka dalam bentuk hexadesimal, yaitu lebih mudah
daripada mencetak angka delam bentuk desimal. ini dipicu sifat dari
hexadesimal yang setiap angkanya terdiri atas 4 bit.
Untuk itu kita bisa membuat suatu tabel untuk hexadesimal yang terdiri
atas angka 0 sampai F. lalu ambillah angka yang ingin dicetak secara 4
bit untuk dipakai sebagai penunjuk dalam mencetak angka itu .
Cetak MACRO
MOV DL,Tabel_Hex[BX] ; MACRO untuk
MOV AH,02 ; mencetak
INT 21h ; huruf ke BX pada tabel_Hex
ENDM
;/=========================/;
.MODEL SMALL
.CODE
ORG 100h
TData :
JMP Proses
Tabel_Hex DB '0123456789ABCDEF'
Test_Angka DB 255 ; Angka yang akan dicetak 255=FFh
Proses:
SUB BH,BH ; Jadikan BH=0
MOV BL,Test_Angka ; BL = angka yang akan dicetak
PUSH BX ; Simpan angka itu
MOV CL,4 ; Ambil 4 bit tinggi dari +
SHR BL,CL ; BL untuk dicetak
Cetak ; Cetak 1 angka hexa tingginya
POP BX ; Ambil angka yang disimpan
AND BL,0Fh ; Ambil 4 bit rendah dari +
Cetak ; BL untuk dicetak
INT 20h
END TData
program 20.3. Mencetak angka dalam bentuk hexadesimal
Bila program 20.3. dijalankan, maka pada layar akan tercetak:
FF
Port bila diterjemahkan secara bebas, artinya yaitu pelabuhan atau
terminal, yaitu tempat keluar masuk. Pengertian port dalam komputer
juga tidak jauh berbeda. Port yaitu tempat komputer berkaitan dengan
alat-alat lain(dunia luar).
Untuk periferal yang dihubungkan dengan komputer seperti disk-drive,
keyboard, monitor, mouse, printer dan speaker biasanya akan diberi nomor
portnya masing-masing. Pengontrolan kerja dari periferal yang dihubungkan
dengan komputer biasanya dilakukan melalui portnya.
Oleh IBM, alat-alat yang dipakai pada komputer PC sudah diberi nomor
portnya masing-masing(gambar kode 21.1.)
+-----------------------------+-----------+-----------+
| Peralatan | PC/XT | AT |
+-----------------------------+-----------+-----------+
| DMA Controler (8237A-5) | 000-00F | 000-01F |
| Inteerupt Controler (8295A) | 020-021 | 020-03F |
| Timer | 040-043 | 040-05F |
| PPI 8255A-5 | 060-063 | --- |
| Keyboard (8042) | --- | 060-06F |
| RealTime Clock (MC146818) | --- | 070-07F |
| DMA Page Register | 080-083 | 080-09F |
| Interrupt Controler 2(8259A)| --- | 0A0-0BF |
| DMA Controller 2 (8237A-5) | --- | 0C0-0DF |
| MathCo | --- | 0F0-0F1 |
| MathCo | --- | 0F8-0FF |
| Hard Drive Controler | 320-32F | 1F0-1F8 |
| Game Port for Joysticks | 200-20F | 200-207 |
| Expansion Unit | 210-217 | --- |
| LPT2 | --- | 278-27F |
| COM2 | 2F8-2FF | 2F8-2FF |
| Prototype Card | 300-31F | 300-31F |
| NetWork Card | --- | 360-36E |
| LPT1 | 378-37F | 378-37F |
| MDA & Parallel Interface | 3B0-3BF | 3B0-3BF |
| CGA | 3D0-3DF | 3D0-3DF |
| Disk Controller | 3F0-3F7 | 3F0-3F7 |
| COM1 | 3F8-3FF | 3F8-3FF |
+-----------------------------+-----------+-----------+
gambar kode 21.1. Tabel Nomor Port
Untuk melihat nilai pada suatu port dipakai perintah:
IN Reg,NoPort
"Reg" harus yaitu register AL atau AX sedang "NoPort" yaitu
nomor port yang akan diakses. Perintah IN akan menyalinkan nilai pada "NoPort"
ke dalam "Reg". Perintah IN akan menyalinkan nilai pada port sebanyak 1 byte
bila dipakai regiser AL atau 1 word bila dipakai register AX.
Nomor Port yang ingin diakses bisa dituliskan secara langsung bila
nomor Port itu dibawah 255(FFh). Bila nomor port diatas FFh, maka nomor
port itu harus dimasukkan ke dalam register DX.
Untuk memasukkan nilai pada suatu port, dipakai perintah:
OUT NoPort,Reg
Perintah OUT ini sama dengan perintah IN hanya perintah OUT dipakai
untuk mengirimkan 1 byte(bila Reg=AL) atau 1 word(bila Reg=AX) pada port. Sama
halnya dengan perintah IN, bila nomor port yang diakses melebihi 255, harus
dipakai register DX. Contoh :
IN AL,60h ; ambil nilai 1 byte pada port 60h
OUT 60h,AL ; masukkan nilai AL pada port 60h
Pada dasarnya pengaksesan Port sama dengan pengaksesan memory, namun
harus diingat bahwa alamat Port dan memory yaitu lain. Jadi contoh alamat
Port 60h dan alamat memory 60h yaitu lain. Walupun keduanya memiliki nilai
yang sama namun sebetulnya alamat keduanya tidak ada hubungan sama sekali.
Pengaksesan Port sebetulnya tidak sesederhana yang dibayangkan oleh
banyak pelajar . sebab Port berkaitan langsung dengan perangkat keras komputer
maka pelajar harus mengetahui dengan jelas cara mengaksesnya. Ada Port yang cuma
bisa ditulisi atau dibaca.
Untuk Port yang memiliki hubungan dua arah atau untuk baca tulis
biasanya memiliki suatu lagi Port yang dipakai sebagai Port pengontrol.
Port pengontrol ini berfungsi untuk mengatur modus dari operasi yang akan
dilakukan pada alat itu . Lebih jauh dari pengaksesan Port ini tidak
bisa penulis ungkapkan disini sebab hal itu sangat tergantung dari jenis
perangkat kerasnya.
Untuk membunyikan speaker, suka atau tidak kita harus mengakses port.
ini dipicu sampai saat ini tidak adanya fasilitas dari DOS atau
BIOS untuk membunyikan speaker. Pada bagian ini akan pelajar lihat teknik-teknik
pemprograman dari speaker agar dapat menghasilkan suatu frekwensi atau nada.
Port 61h yaitu suatu I/O port yang dipakai untuk berbagai
keperluan, diantaranya oleh speaker pada bit 0 dan 1. Kedua bit ini
dihubungkan pada speaker melalui gerbang logika "AND" sehingga untuk
mengaktifkan suara pada speaker ini maka bit ke 0 dan 1 dari port 61h ini
harus bernilai 1. Ingatlah, pengaktifan pada speaker ini jangan sampai
mengganggu bit lainnya.
<<<<< Gbr212.PIX >>>>>>
gambar kode 21.2. Skema Rangkaian Speaker pada PC
Readkey MACRO ; Macro untuk
MOV AH,00 ; menunggu masukan dari keyboard
INT 16h
ENDM
;/=============================/;
.MODEL SMALL
.CODE
ORG 100h
Proses :
IN AL,61h ; Ambil data port 61h <Speaker>
OR AL,00000011b ; Jadikan Bit ke 0 & 1 menjadi 1
OUT 61h,AL ; Bunyikan speaker
Readkey ; Menunggu penekanan sembarang tombol
AND AL,11111100b ; Jadikan bit ke 0 & 1 menjadi 0
OUT 61h,AL ; Matikan speaker
INT 20h ; selesai
END Proses
program 21.1. Mengaktifkan speaker
Untuk menghasilkan suatu frekwensi yang tepat dengan program 21.1.
memang agak sulit, sebab frekwensi yang terjadi sangat tergantung dari
kecepatan komputer yang bersangkutan. Bila pada komputer kita ada tombol
TURBO, cobalah ubah-ubah kecepatan dari komputer untuk melihat perubahan dari
frekwensi yang dihasilkan.
Untuk menghasilkan suatu frekwensi yang tidak terpengaruh oleh kecepatan
komputer, bisa dilakukan dengan memrogram timer <pewaktu> yang dipakai oleh
speaker ini. Frekwensi yang dihasilkan dengan memakai tetapan waktu akan
lebih mudah dihasilkan dan lebih tepat.
PIT <program mable Interval Timer> yaitu suatu timer yang dapat
diprogram . Keluaran dari PIT ini dipakai antara lain oleh detik jam
waktu(IRQ0) dan RAM dinamik untuk me-refresh dirinya. Keluaran ketiga (OUT2)
dari PIT untuk menghasilkan sinyal gelombang persegi yang dipakai oleh
speaker.
sebab frekwensi yang dihasilkan oleh PIT ini dapat diatur melalui
perangkat lunak maka dapat dimanfaatkan untuk membentuk nada pada speaker.
Untuk memrogram timer<PIT> ini, pertama-tama pelajar harus mengirimkan
nilai B6h pada port 43h. Pengiriman nilai ini akan memicu port 42h siap
untuk menerima nilai 16 bit untuk dijadikan tetapan perhitungan<counter>.
Untuk nilai counter yang diberikan pada port 43h ini dipakai rumus :
Counter = 123540h / Hz Hz=<frekwensi ingin dihasilkan>
Hasil dari perhitungan ini lalu dimasukkan kedalam timer melalui
port 42h dan akan disimpan dalam regiser internal 16 bit. namun sebab Timer
ini hanya memiliki 8 bit masukan maka pelajar tidak bisa memasukkan 16 bit
sekaligus. ini dapat kita bayangkan sebagai suatu kamar yang dapat
menampung 2 pelajar namun pintunya hanya dapat dilalui oleh 1 pelajar . Untuk itu
masukkanlah byte rendahnya terlebih dahulu lalu masukkan byte tingginya.
Sesudah timer diprogram , maka speaker tinggal diaktifkan untuk
menghasilkan frekwensi yang sesuai dengan timer. Secara teori frekwensi yang
dapat dihasilkan berupa 1 Hz - 1,193 Mhz (bandingkan dengan kemampuan dengar
manusia 20 Hz - 20 Khz).
Dengan frekwensi yang tepat, sebetulnya banyak hal yang dapat pelajar
lakukan. pelajar dapat saja membuat program Pengusir Nyamuk ataupun program
pengusir Burung dan Tikus. Binatang- binatang ini biasanya takut pada
frekwensi yang tinggi seperti frekwensi 20 Khz - 40 Khz. Untuk mengusir nyamuk
frekwensi 25 Khz sudah memadai, namun bila kita ingin mengusir tikus
sebaikkan frekwensinya dibuat suatu layangan. Artinya frekwensi yang
dihasilkan diubah-ubah antara 20 Khz - 40 Khz.
NoPCsound MACRO
IN AL,61h ; Ambil data Port 61h
AND AL,0FCh ; Matikan bit ke 6 & 7
OUT 61h,AL ; Masukkan nilainya pada Port 61h
ENDM
PCsound MACRO Hz
MOV AL,0B6h ;
OUT 43h,AL ; Persiapkan Timer
MOV DX,0012h ;
MOV AX,3540h ; Bagi 123540H dengan frekwensi
MOV BX,Hz ; yang akan dihasilkan.
DIV BX ; < 123540:Hz > , hasil pada AX
OUT 42h,AL ; Masukkan byte rendah dahulu.
MOV AL,AH ; Port hanya dapat melalui AL/AX
OUT 42h,AL ; Masukkan byte tingginya.
IN AL,61h ; Ambil data port 61h <Speaker>
OR AL,03 ; Jadikan Bit ke 6 & 7 menjadi 1
OUT 61h,AL ; Bunyikan speaker
ENDM
;/=================================/;
.MODEL SMALL
.CODE
ORG 100h
Proses :
PCsound 25000 ; Frekwensi untuk mengusir nyamuk.
MOV AH,00
INT 16h ; Readkey
NoPCsound ; Matikan suara.
INT 20h ; selesai
END Proses
program 21.2. Pengontrolan speaker dan timer
Frekwensi yang dihasilkan pada program 21.2. tidak akan terdengar, oleh
sebab itu bila kita ingin mendengar suatu frekwensi cobalah ubah nilai 25000
dengan nilai 20 - 20000.
program format, copy dan delete dari Dos tentunya sudah tidak asing lagi
bagi pelajar . contoh pada program copy, untuk menyalin suatu file yang bernama
SS.ASM pada drive B: menuju drive C: dengan nama TT.ASM dapat pelajar tuliskan
dengan:
Parameter 1 Parameter 2
+---+----++---+----+
COPY B:SS.ASM C:TT.ASM
Yang dimaksud dengan parameter program yaitu semua tulisan yang
ada dibelakang kata copy(B:SS.ASM dan C:TT.ASM). B:SS.ASM dikatakan
sebagai parameter pertama sedang C:TT.ASM dikatakan sebagai parameter
kedua.
Masih ingatkah kita , pada setiap program COM pelajar selalu menyediakan
100h byte kosong dengan perintah ORG 100h. 100h byte kosong kosong ini
dinamakan sebagai PSP atau program Segment Prefix dan dipakai oleh DOS untuk
mengendalikan jalannya program pelajar . Salah satu pengontrolan yang dilakukan,
yaitu pada paramater program .
PSP sebetulnya masih dibagi-bagi lagi menjadi bagian-bagian yang
tugasnya berbeda-beda. Salah satu bagian yang mengatur pada parameter
program yaitu yang dinamakan sebagai FCB(File Control Block). FCB ini terdiri
atas 2 bagian, yaitu FCB1 dan FCB2.
FCB1 bertugas menampung parameter pertama dari program , dan berada pada
offset 5Ch sampai 6Bh(16 Byte). sedang FCB2 bertugas menampung parameter
kedua dari program , dan berada pada offset 6Ch sampai 7Bh(16 Byte).
Ingatlah, bila kita menjalankan sebuah program pada prompt Dos maka yang
terakhir dimasukkan pastilah huruf Enter(0Dh).
Cetak_Klm MACRO Klm ; Macro untuk mencetak kalimat
LEA DX,Klm
MOV AH,09
INT 21h
ENDM
Cetak_Kar MACRO Kar ; Macro untuk mencetak huruf
MOV DL,Kar
MOV AH,02
INT 21h
ENDM
;/=======================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Para1 DB ' Parameter pertama : $'
Para2 DB 13,10,' Parameter kedua : $'
Proses : Cetak_Klm Para1 ; Cetak kalimat Para1
MOV BX,5Ch ; Alamat FCB1
MOV CX,16
Ulang1 :
Cetak_Kar [BX] ; Cetak parameter pertama (FCB1)
INC BX
LOOP Ulang1
Cetak_Klm Para2 ; Cetak kalimat Para2
MOV CX,16
Ulang2 :
Cetak_Kar [BX] ; Cetak parameter kedua (FCB2)
INC BX
LOOP Ulang2
INT 20h
END TData
program 22.1. Mengambil parameter 1 dan 2 program dari FCB
Untuk mencoba dengan program 22.1., masukkanlah parameter program . Hasil
eksekusinya akan tampak seperti:
C:\> FCB12 F111 F222
Parameter pertama : F111
Parameter kedua : F222
22.3. DATA TRANSFER AREA
Dengan FCB pelajar hanya mampu mengambil 2 parameter dari program .
Bagaimana bila parameter yang dimasukkan lebih dari 2?. Untuk itu kita harus
mengakses bagian lain dari PSP yang dinamakan sebagai DTA atau Data Tranfer
Area. DTA mencatat semua parameter yang dimasukkan pada program .
DTA terletak mulai pada offset ke 80h sampai FFh dari PSP. Bila kita
memasukkan parameter dalam program , seperti:
C:\> FCB 111
Maka pada DTA, offset ke 80h akan berisi banyaknya huruf yang
diketikkan termasuk huruf enter(Dalam contoh=04). Pada offset ke 81h akan
berisi spasi(20h), dan pada offset ke 82h berisi huruf pertama parameter
program .
Cetak_Klm MACRO Klm ; Macro untuk mencetak kalimat
LEA DX,Klm
MOV AH,09
INT 21h
ENDM
Cetak_Kar MACRO Kar ; Macro untuk mencetak huruf
MOV DL,Kar
MOV AH,02
INT 21h
ENDM
;/==========================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Para DB 13,10,' Parameter program : $'
T_Enter EQU 0Dh
Spasi EQU 20h
Proses : Cetak_Klm Para ; Cetak kalimat Para1
MOV BX,81h ; Alamat DTA
Ulang :
INC BX ; BX = Alamat DTA
CMP BYTE PTR [BX],T_Enter ; Apakah tombol Enter ?
JE Exit ; Ya! Lompat ke Exit
Cetak_Kar [BX] ; Bukan! Cetak huruf tsb
CMP BYTE PTR [BX],Spasi ; Apakah spasi ?
JNE Ulang ; Bukan, lompat ke ulang
Cetak_Klm Para ; Ya! Cetak kalimat
JMP Ulang ; Lompat ke ulang
Exit :
INT 20h
END TData
program 22.2. Mengambil parameter program dari DTA
Bila program 22.2. dijalankan seperti:
C:\>DTA P111 P222 P333
Parameter program : P111
Parameter program : P222
Parameter program : P333
OPERASI PADA FILE
Pada Dos versi 1.0 penanganan file dilakukan melalui FCB. System ini
muncul, sebagai hasil dari kompabilitas dengan CP/M. Ternyata penanganan file
melalui FCB ini banyak kendalanya, seperti kemampuan manampung nama file yang
hanya 11 huruf . sebab hanya mampu menampung 11 huruf maka nama untuk
directory tidak akan tertampung sehingga Dos versi awal tidak bisa menangani
adanya directory. Penanganan file melalui FCB ini sudah ketinggalan zaman dan
sudah banyak ditinggalkan oleh program mer-program mer. sebab itu maka pada
buku ini, pelajar hanya akan membahasnya sekilas.
Pada Dos versi 2.0 diperkenalkan suatu bentuk penanganan file yang baru.
Penanganan file ini dinamakan File Handle yang mirip dengan fungsi pada UNIX.
Dengan file handle penanganan pada directory dengan mudah dilakukan.
Operasi file yang dilakukan dengan file handle harus dibuku(Open) terlebih
dahulu, selain itu file handle bekerja dengan apa yang dinamakan dengan
ASCIIZ. ASCIIZ atau ASCII+Zero byte yaitu suatu teknik penulisan string yang
diakhiri dengan byte nol(0) atau huruf Null. Contohnya dalam penulisan nama
file:
Nama DB 'DATA.DAT ',0 <----- ASCIIZ
Untuk menciptakan suatu file baru, dapat dipakai fungsi 3Ch dari
intrupsi 21h. sedang aturan dari pemakaian interupsi ini yaitu dengan
memasukkan nilai servis 3Ch pada AH, pasangan register DS:DX menunjuk pada
nama file ASCIIZ yang akan diciptakan, CX diisi dengan atribut file atau
maksud dari pembukaan file itu dengan spesifikasi nomor Bit:
- 0 untuk File Read Only, yaitu file yang dibuka hanya untuk dibaca.
- 1 untuk File Hidden, yaitu file yang disembunyikan. Jenis file ini tidak
akan ditampilkan pada proses DIR dari DOS.
- 2 untuk File System, yaitu file yang akan otomatis dijalankan pada saat
BOOT. Jenis file ini biasanya berkaitan erat dengan mesin komputer dan
biasanya ditanda i dengan ektensi SYS.
- 3 untuk Volume label.
- 4 untuk Nama subdirectory.
- 5 untuk File Archive, yaitu suatu bentuk file normal.
bila fungsi ini berhasil menciptakan suatu file baru, maka Carry flag
akan dijadikan 0(Clear) dan AX akan berisi nomor handle(Nomor pembukaan file).
Setiap file yang dibuka akan memiliki nomor handle yang berbeda-beda, biasanya
bernilai 5 keatas. Sebaliknya bila proses penciptaan file gagal, maka Carry
flag akan dijadikan 1(Set) dan AX akan berisi kode kesalahan. sedang kode
kesalahan yang sering terjadi yaitu:
- 03h artinya Path tidak ditemukan
- 04h artinya Tidak ada handle
- 05h artinya akses pada file ditolak
Dalam memakai fungsi ini kita harus berhati-hati. Bila pada proses
penciptaan file baru dan ternyata file itu sudah ada, maka fungsi ini
akan menjadikan file itu menjadi nol. Untuk menghindari ini kita bisa
memakai fungsi 4Eh untuk mengecek apakah file yang akan diciptakan sudah
ada atau belum.
Create MACRO NamaFile, Attribut, Handle
PUSH CX
PUSH DX
MOV AH,3Ch
MOV CX,Attribut
LEA DX,NamaFile
INT 21h
MOV Handle,AX
POP DX
POP CX
ENDM
Untuk membuka suatu file yang sudah ada, dipakai fungsi 3Dh dari
interupsi 21h. sedang aturan dari pemakaiannya yaitu:
INPUT:
AH = 3Dh
AL = Tujuan pembukaan file:
- 00 hanya untuk dibaca (Read Only)
- 01 hanya untuk ditulisi (Write Only)
- 02 untuk ditulis dan dibaca (Read/Write)
DS:DX = Nama file dengan ASCIIZ
OUTPUT:
bila berhasil, maka CF = 0 dan AX = Nomor handle
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
Hati-hatilah:
Pembukaan file yang dilakukan oeh fungsi ini akan memindahkan pointer
file pada awal file. Bila kita membuka suatu file dengan fungsi ini dan
langsung menulis pada file itu , maka isi dari file itu akan
tertimpa. Untuk menghindari ini pointer file harus dipindahkan pada akhir file
sesudah pembukaan. sedang contoh dari macro untuk membuka file dengan fungsi
3Dh ini yaitu:
Open MACRO NamaFile,Attribut,Handle
PUSH DX
MOV AH,3Dh
MOV AL,Attribut
LEA DX,NamaFile
INT 21h
MOV Handle,AX
POP DX
ENDM
Untuk menutup suatu file yang sudah dibuka, dapat dipakai fungsi ke
3Eh dari interupsi 21h. Fungsi ini akan menutup file yang dibuka dengan 3Dh.
Untuk memakai nya isilah AH dengan 3Eh dan BX dengan nomor handle file
itu . sedang contoh dari macro untuk menutup suatu file yang terbuka
yaitu:
Close MACRO Handle
PUSH BX
MOV AH,3Eh
MOV BX,Handle
INT 21h
POP BX
ENDM
sebetulnya tidak semua file yang sudah dibuka harus ditutup dengan
interupsi khusus. Bila kita mengakhiri program tidak dengan interupsi 20h
namun dengan fungsi 4Ch dari interupsi 21h, maka penutupan file yang terbuka
sebetulnya tidak perlu. ini dipicu interupsi ini akan menutup semua
file yang terbuka secara otomatis. Mengenai fungsi 4Ch dari interupsi 21h ini
akan pelajar bahas lebih lanjut nantinya.
Ingatlah:_
Kemampuan Dos dalam menangani file yang terbuka yaitu terbatas.
Kemampuan Dos dalam menangani file yang terbuka dapat diatur melalui
Config.Sys dengan perintah: Files=n.
Pembacaan file handle dapat dilakukan melalui fungsi 3Fh dari interupsi
21h. sedang aturan dari pemakaian fungsi ini yaitu:
INPUT:
AH = 3Fh
CX = Banyaknya data(dalam byte) yang ingin dibaca
BX = Nomor File handle
DS:DX = Alamat buffer tempat hasil pembacaan akan disimpan
OUTPUT:
bila berhasil, maka CF = 0 dan AX = Jumlah byte yang sudah
dibaca. Bila AX=0 atau AX < CX artinya akhir file sudah
dicapai.
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
sedang contoh dari pemakaian nya dalam macro yaitu:
Read MACRO Handle,Number,Buffer
PUSH BX
PUSH CX
PUSH DX
MOV AH,3Fh
MOV BX,Handle
MOV CX,Number
LEA DX,Buffer
INT 21h
POP DX
POP CX
POP BX
ENDM
lihat :
Fungsi ini akan membaca banyaknya data dari suatu file dari posisi yang
tidak tetap, tergantung dari pointer file pada saat itu. Fungsi ini hanya
mampu membaca sebesar 1 segment(64 KB) dalam sekali pembacaan. Untuk membaca
file yang besar kita bisa membacanya dengan proses looping. pada proses
looping, posisi pointer tidak perlu diatur lagi sebab setiap kali selesai
pembacaan, pointer akan diatur secara otomatis.
Untuk menulisi file dapat dipakai fungsi 40h dari interupsi 21h.
sedang aturan dari pemakaian fungsi ini yaitu:
INPUT:
AH = 40h
BX = Nomor File Handle
CX = Banyaknya data(dalam byte) yang akan dituliskan
DS:DX = Alamat dari data yang akan ditulis ke file
OUTPUT:
bila berhasil, maka CF = 0 dan AX = Jumlah byte yang berhasil
dituliskan.
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
sedang contoh macro dari pemakaian fungsi ini yaitu:
Write MACRO Handle,Number,Buffer
PUSH BX
PUSH CX
PUSH DX
MOV AH,40h
MOV BX,Handle
MOV CX,Number
LEA DX,Buffer
INT 21h
POP DX
POP CX
POP BX
ENDM
Fungsi ini hampir sama dengan fungsi 3Fh. Dengan melihat pada nilai AX
sesudah operasi penulisan berhasil, maka dapat diketahui:
- Bila AX = CX, artinya operasi penulisan berhasil dengan sukses.
- Bila AX < CX, artinya penulisan hanya berhasil menulis sebagian
dari data yang seharusnya dituliskan.
Cetak MACRO Kal ; Macro untuk mencetak
MOV AH,09 ; kalimat
LEA DX,Kal
INT 21h
ENDM
;/=====================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP MULAI
Sumber DB 'Nama file sumber : $'
Tujuan DB 13,10,'Nama file tujuan : $'
File1 DB 70,?,70 Dup (0)
File2 DB 70,?,70 Dup (0)
Handle1 DW ?
Handle2 DW ?
Good DB 13,10,'menyalinkan File sudah dilakukan ....$'
Err1 DB 13,10,'Salah perintah .....$'
Err2 DB 13,10,'File tidak ditemukan .....$'
Err3 DB 13,10,'Path tidak ditemukan .....$'
Err4 DB 13,10,'File yang dibuka, kebanyakan ...$'
Err6 DB 13,10,'pemakaian File handle yang salah ..$'
Err15 DB 13,10,'Spesifikasi Drive yang salah ....$'
Err21 DB 13,10,'Drive tidak siap .....$'
Err29 DB 13,10,'Kesalahan penulisan ....$'
Err30 DB 13,10,'Kesalahan pembacaan ....$'
ErrL DB 13,10,'Kesalahan yang lain .....$'
Mulai :
MOV AX,3 ; Ganti mode
INT 10H ; untuk membersihkan layar
TanyaF1 :
Cetak Sumber ; Cetak kalimat "sumber"
MOV AH,0AH ;
LEA DX,File1 ; Tanya nama file yang ingin
INT 21h ; dicopy
LEA BX,File1 ; bila user tidak mengetikkan
INC BX ; nama file yang ingin dicopy
CMP BYTE PTR [BX],0 ; atau langsung ditekan enter
JE TanyaF1 ; maka tanya lagi
Ulang1 :
INC BX ;
CMP BYTE PTR [BX],0Dh ;
JNE Ulang1 ; Jadikan file "sumber"
MOV BYTE PTR [BX],0 ; menjadi ASCIZZ
TanyaF2 :
Cetak Tujuan ; Cetak kalimat "tujuan"
MOV AH,0AH ; Tanya nama file
LEA DX,File2 ; "tujuan" atau nama file
Int 21h ; hasil menyalinkan
LEA BX,File2 ; bila user tidak mengetikkan
INC BX ; nama file untuk "tujuan"
CMP BYTE PTR [BX],0 ; atau langsung ditekan enter
JE TanyaF2 ; maka tanya lagi
Ulang2 :
INC BX ;
CMP BYTE PTR [BX],0Dh ;
JNE Ulang2 ; Jadikan file Tujuan
MOV BYTE PTR [BX],0 ; menjadi ASCIZZ
MOV AH,3DH ; Servis buka file
MOV AL,0 ; Mode file Read Only
LEA DX,File1 + 2 ; Nama file "sumber"
INT 21h ;
JC Er ; bila error, lompat
MOV Handle1,AX ; AX=nomor handle file "sumber"
MOV AH,3CH ; Buat file baru
LEA DX,File2 + 2 ; Dengan nama "tujuan"
MOV CX,00100000b ; File Archive / normal
Int 21h ;
JC Er ; bila error, lompat
MOV Handle2,AX ; AX=nomor handle file "tujuan"
Copy :
MOV AH,3FH ; servis baca file
MOV BX,Handle1 ; Baca file "sumber"
MOV CX,1024 ; Banyaknya pembacaan
LEA DX,Buffer ; Lokasi penampungan
INT 21h ;
JC Er ; bila error, lompat
CMP AX, 0 ; Pembacaan file sudah EOF?
JE Selesai ; Ya, exit
MOV CX,AX ; Banyaknya data
MOV AH,40h ; Servis tulis file
MOV BX,Handle2 ; Tulis file "Tujuan"
LEA DX,Buffer ; Lokasi data
Int 21h
JC Er ; bila error, lompat
CMP CX,AX ; File habis dicopy?
JE Copy ; belum, ulangi
Selesai :
Cetak Good ; menyalinkan selesai
MOV AH,3Fh ; Tutup file
MOV BX,Handle1 ; "sumber"
INT 21h ;
MOV BX,Handle2 ; Tutup file
INT 21h ; "Tujuan"
EXIT :
INT 20h ; Selesai
Er :
CMP AX,1
JNE NotErr1
Cetak Err1
JMP EXIT
NotErr1 :
CMP AX,2
JNE NotErr2
Cetak Err2
JMP EXIT
NotErr2 :
CMP AX,3
JNE NotErr3
Cetak Err3
JMP EXIT
NotErr3 :
CMP AX,4
JNE NotErr4
Cetak Err4
JMP EXIT
NotErr4 :
CMP AX,6
JNE NotErr6
Cetak Err6
JMP EXIT
NotErr6 :
CMP AX,21
JNE NotErr21
Cetak Err21
JMP EXIT
NotErr21 :
CMP AX,29
JNE NotErr29
Cetak Err29
JMP EXIT
NotErr29 :
CMP AX,30
JNE NotErr30
Cetak Err30
JMP EXIT
NotErr30 :
Cetak ErrL
JMP EXIT
Buffer LABEL BYTE
END TData
program 23.1. menyalin File
Bila program 23.1. dijalankan, maka program akan meminta kita memasukan
nama file yang akan dicopy dan nama file hasil copy-an, seperti:
Nama file sumber : TASM.EXE
Nama file tujuan : B:SS.PROG
Maka file TASM.EXE akan dicopykan pada drive b: dengan nama SS.PROG.
Bila menyalinkan file berhasil dengan sukses, maka pada layar akan ditampilkan:
menyalinkan File sudah dilakukan ....
Keterangan program :
MOV AX,3
INT 10H
Ini yaitu perintah untuk mengaktifkan mode layar 03, atau mode default
dari DOS. Dengan pengaktifan mode layar ini seluruh isi layar akan terhapus.
TanyaF1 :
Cetak Sumber
MOV AH,0AH
LEA DX,File1
INT 21h
Mintalah dari user untuk memasukkan nama file yang akan dicopy. Hasil
input dari user ini, disimpan pada varibel penampung "File1" yang
didiartikan untuk mampu menampung sampai 70 huruf .
LEA BX,File1
INC BX
CMP BYTE PTR [BX],0
JE TanyaF1
Ulang1 :
INC BX
CMP BYTE PTR [BX],0Dh
JNE Ulang1
MOV BYTE PTR [BX],0
Sesudah diperoleh nama file yang ingin dicopy, jadikanlah nama file
itu menjadi ASCIZZ. sebab setiap input dari keyboard selalu diakhiri
dengan enter(0Dh), maka pelajar tinggal mencari huruf enter itu dan
menggantinya dengan byte 0, untuk membuatnya menjadi ASCIZZ.
TanyaF2 :
Cetak Tujuan
MOV AH,0AH
LEA DX,File2
Int 21h
LEA BX,File2
INC BX
CMP BYTE PTR [BX],0
JE TanyaF2
Ulang2 :
INC BX
CMP BYTE PTR [BX],0Dh
JNE Ulang2
MOV BYTE PTR [BX],0
Proses untuk menanyakan nama file hasil copy-an, sama dengan proses
meminta nama file yang ingin dicopy. Nama file hasil copyan juga dijadikan
ASCIIZ.
MOV AH,3DH
MOV AL,0
LEA DX,File1 + 2
INT 21h
JC Er
MOV Handle1,AX
Bukalah file yang akan dicopy dengan atribut pembukaan 0, atau Read
Only. Nomor handle file itu akan diberikan oleh DOS berupa suatu angka.
Simpanlah nomor handle yang diberikan DOS untuk file yang dibuka ini. Untuk
selanjutnya kita tinggal memakai nomor handle dari file ini untuk
mengaksesnya.
MOV AH,3CH
LEA DX,File2 + 2
MOV CX,00100000b
INT 21h
JC Er
MOV Handle2,AX
Buatlah sebuah file baru dengan atribut pembukaan 32 atau file
archive(normal). Simpanlah nomor handle yang diberikan DOS untuk file yang
baru diciptakan ini. bila file yang baru diciptakan ini sudah ada pada disk
sebelumnya, maka file itu akan dihapus.
Copy :
MOV AH,3FH
MOV BX,Handle1
MOV CX,1024
LEA DX,Buffer
INT 21h
JC Er
CMP AX, 0
JE Selesai
MOV CX,AX
MOV AH,40h
MOV BX,Handle2
LEA DX,Buffer
Int 21h
JC Er
CMP CX,AX
JAE Copy
Sesudah itu, bacalah file yang akan dicopy sebanyak 1024 byte, dan
disimpan pada variabel penampung buffer. Sesudah pembacaan, lakukanlah
penulisan kepada file baru sebanyak byte yang berhasil dibaca. Proses baca dan
tulis ini dilakukan terus sampai file itu berhasil dicopykan semuanya.
lihat :
Untuk membaca file yang dicopy dan menulisi file baru, pelajar tinggal
memakai nomor handle yang pelajar dapatkan pada saat pembukaan dan pembuatan
file itu .
Selesai :
Cetak Good
MOV AH,3Fh
MOV BX,Handle1
INT 21h
MOV BX,Handle2
INT 21h
EXIT :
INT 20h
Sesudah proses menyalinkan file selesai, tutuplah file itu dengan
memakai nomor handle-nya.
Er :
CMP AX,1
JNE NotErr1
Cetak Err1
JMP EXIT
NotErr1 :
CMP AX,2
JNE NotErr2
Cetak Err2
JMP EXIT
NotErr2 :
CMP AX,3
JNE NotErr3
Cetak Err3
JMP EXIT
NotErr3 :
CMP AX,4
JNE NotErr4
Cetak Err4
JMP EXIT
NotErr4 :
CMP AX,6
JNE NotErr6
Cetak Err6
JMP EXIT
NotErr6 :
CMP AX,21
JNE NotErr21
Cetak Err21
JMP EXIT
NotErr21 :
CMP AX,29
JNE NotErr29
Cetak Err29
JMP EXIT
NotErr29 :
CMP AX,30
JNE NotErr30
Cetak Err30
JMP EXIT
NotErr30 :
Cetak ErrL
JMP EXIT
Ini yaitu bagian yang akan menerjemahkan kode kesalahan dari Dos.
Proses yang dilakukan memang agak sedikit bertele-tele, sebab dibandingkan
satu persatu. pelajar akan mempelajari cara/teknik untuk menerjemahkan kode
kesalahan ini secara profesional pada bagian 23.11.
Buffer LABEL BYTE
Ini yaitu suatu pendefinisian data istimewa dalam assembler. Dengan
mengartikan nya pada akhir file, akan pelajar dapatkan suatu buffer/penampung
yang besar sekali (sebatas memory yang tersedia). Untuk lebih jelasnya kita
bisa lompat pada bagian 24.7. sebentar, untuk membaca keterangan mengenai tipe
data ini.
Untuk menghapus suatu file, dapat dipakai fungsi ke 41h
dari interupsi 21h. sedang aturan dari pemakaian fungsi ini yaitu:
INPUT:
AH = 41h
DS:DX = Nama file(ASCIIZ) yang akan dihapus
OUTPUT:
bila berhasil, maka CF = 0
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
Perlu kita ketahui, fungsi ini tidak mendukung huruf khusus seperti
'?' dan '*' dari Dos. sehingga fungsi ini hanya mampu menghapus 1 buah
file setiap saat.
Delete MACRO Nama
MOV AH,41h ; Servis untuk menghapus file
LEA DX,Nama ; DS:DX menunjuk pada nama file
INT 21h
ENDM
;/====================/;
.MODEL SMALL
.CODE
ORG 100h
TData :JMP Proses
Error DB ' Sorry, File kita tidak bisa dihapus !',13,10
DB ' kita harus memakai parameter ',13,10
DB ' seperti: ',13,10
DB ' C:\> Hapus FILE_X ',13,10,10
DB ' untuk menghapus file FILE_X $'
Proses : MOV DI,80h ; Alamat awal parameter
MOV AL,0Dh ; huruf Enter
REPNE SCASB ; Cari huruf Enter
DEC DI ; DI menunjuk huruf Enter
MOV AL,0 ; Jadikan ASCIIZ
STOSB ; Letakkan byte 0 pada DS:[DI]
MOV DI,82h ; Awal String
Delete [DI] ; Hapus file parameter
JNC Exit ; bila tidak ada kesalahan, Habis
MOV AH,09 ; bila ada kesalahan
LEA DX,Error ; Tampilkan peringatan !
INT 21h
Exit :
INT 20h
END TData
program 23.2. Menghapus File
program 23.2. bisa kita pakai untuk menghapus suatu file dengan
parameter. contoh file COBA.TXT akan dihapus, maka bisa dihapus dengan cara:
HAPUS COBA.TXT
Pada file ada pointer(penunjuk) yang berguna untuk menandakan
suatu lokasi tertentu pada file. Dengan fungsi 42h dari Dos, penunjuk file ini
dapat dipindah-pindahkan. sedang aturan dari pemakaian fungsi ini yaitu:
INPUT:
AH = 42h
BX = Handle
CX = Offset Hi(tinggi) yang menandakan besarnya perpindahan
DX = Offset Lo(rendah) yang menandakan besarnya perpindahan
AL = Mode perpindahan, dengan nilai:
00 untuk berpindah dari awal file
01 untuk berpindah pada posisi sekarang
02 untuk berpindah dari akhir file
OUTPUT:
bila berhasil, maka CF = 0 dan DX:AX = menunjuk pada posisi baru
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
sedang contoh macro dari pemakaian fungsi ini yaitu:
Seek MACRO Handle,Mode,OffsetLo,OffsetHi
PUSH BX
PUSH CX
MOV AH,42h
MOV AL,Mode
MOV BX,Handle
MOV CX,OffsetHi
MOV DX,OffsetLo
INT 21h
POP CX
POP BX
ENDM
,, pada file ada suatu byte yang
dipakai sebagai atribut dari file itu . Atribut ini menentukan jenis
dari file itu
DOS menyediakan fungsi ke 43h untuk mengatur atribut file. sedang aturan
dari pemakaian fungsi ini yaitu:
INPUT:
AH = 43h
AL = Mode, dengan spesifikasi
00 untuk melihat atribut dari suatu file
01 untuk mengubah atribut dari suatu file
DS:AX = Nama file dalam bentuk ASCIIZ
CX = Atribut, dengan spesifikasi Nomor bit:
- 0 untuk File Read Only
- 1 untuk File Hidden
- 2 untuk File System
- 3 untuk Volume label.
- 4 untuk Nama subdirectory.
- 5 untuk File Archive
OUTPUT:
bila berhasil, maka CF = 0 dan CX menandakan atribut dari
file, bila mode pada AL=0
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
Cetak_Kal MACRO Kal ; Macro untuk mencetak kalimat
MOV AH,09
LEA DX,Kal
INT 21h
ENDM
;/=========================/;
.MODEL SMALL
.CODE
ORG 100h
TData : JMP Proses
Error DB 'Sorry, file tidak ditemukan atau ',13,10
DB ' kita tidak menpakai parameter $'
Jenis DB 'Jenis File ini : $'
Attr1 DB 13,10,'-> Read Only $'
Attr2 DB 13,10,'-> Hidden $'
Attr3 DB 13,10,'-> System $'
Attr4 DB 13,10,'-> Volume $'
Attr5 DB 13,10,'-> Nama Directory $'
Attr6 DB 13,10,'-> Archive $'
Tabel DW Attr1,Attr2,Attr3,Attr4,Attr5,Attr6
Proses:
MOV BX,82h ; Alamat DTA, Awal parameter
Ulang :
CMP BYTE PTR [BX],0Dh ; Apakah=Enter?
JE ASCIIZ ; Ya, Jadikan ASCIIZ
INC BX ; tunjuk huruf selanjutnya
JMP Ulang ; ulangi, cari enter
ASCIIZ:
MOV BYTE PTR[BX],0 ; Jadikan ASCIIZ
MOV AH,43h ; Servis untuk atribut file
MOV DX,82h ; DX = Awal nama file ASCIIZ
MOV AL,00 ; Untuk membaca atribut
INT 21h ; Baca atribut file
JNC Good ; bila tidak error lompat
Cetak_Kal Error ; Error, cetak pesan dan
JMP Exit ; Selesai
Good :
Cetak_Kal Jenis ; Cetak kalimat
MOV AX,1 ; AX untuk mengetes Bit
XOR BX,BX ; BX=penunjuk isi Tabel
CEK :
PUSH AX ;
PUSH BX ; simpan isi register
PUSH CX ;
AND CX,AX ; Mengetest bit
JCXZ Tidak ; bila CX=0 artinya bit=0
ADD BX,BX ; BX kali 2, untuk akses Tabel
MOV AH,09 ; Servis cetak kalimat
MOV DX,Tabel[BX] ; Alamat offset dari kalimat
INT 21h ; Cetak kalimat
Tidak :
POP CX ;
POP BX ; Ambil nilai register
POP AX ;
ADD AX,AX ; AX untuk test bit berikutnya
INC BX ; BX=Banyaknya pengulangan
CMP BX,6 ; Apakah sudah mengetest 6 bit?
JE Exit ; Ya! selesai
JMP CEK ; Ulangi, test bit berikutnya
Exit :
INT 20h
END TData
program 23.3. Melihat Atribut File
Dengan program 23.3. kita bisa melihat atribut dari suatu file, termasuk
file hidden, seperti IO.SYS. Untuk melihat atribut dari file itu
ketikkan:
C:\>ATTR IO.SYS
Jenis File ini :
-> Read Only
-> Hidden
-> System
-> Archive
Mengenai pemakaian Tabel, akan dijelaskan pada sub bab 23.11 yang
menjelaskan mengenai teknik untuk menerjemahkan kode kesalahan Dos dengan
cepat dan mudah.
Untuk mengganti nama suatu file, dapat dipakai fungsi ke 56h dari Dos.
sedang aturan dari pemakaian fungsi ini yaitu:
INPUT:
AH = 56h
DS:DX = Nama file lama (ASCIIZ)
ES:DI = Nama file baru (ASCIIZ)
OUTPUT:
bila berhasil, maka CF = 0
bila tidak berhasil, maka CF = 1 dan AX = kode kesalahan
Pada bab ini, pelajar sudah banyak menyinggung mengenai kode kesalahan.
Kode kesalahan biasanya dilaporkan dalam register AX sesudah suatu operasi
mengalami kesalahan(Error). sedang arti dari kode kesalahan ini, bisa kita
lihat pada gambar kode 23.1.
Kode salah Arti Kode Salah
-------------------------------------------------------------
01 Salah perintah
02 File tidak ditemukan
03 Path tidak ditemukan
04 File yang dibuka terlalu banyak
05 Operasi ditolak
06 pemakaian file handle yang salah
07 MCB(Memory Control Blocks) sudah rusak
08 Kekurangan memory
09 Kesalahan alamat memory blok
10 Kesalahan environment string
11 Kesalahan format
12 Kesalahan kode akses
13 Kesalahan data
15 Kesalahan spesifikasi drive
16 Tidak dapat menghapus directory aktif
17 Device yang tidak sama
18 Tidak ada file yang ditemukan lagi
19 Tidak dapat menulis pada disket yang diprotek
20 Unit tidak diketahui
21 Drive belum siap
22 Perintah tidak diketahui
23 Data disk ada kesalahan
25 Pencarian alamat pada disket ada kesalahan
26 Tipe media tidak diketahui
27 Pencarian nomor sektor tidak ditemukan
28 Printer tidak diberi kertas
29 Kesalahan pada saat penulisan
30 Kesalahan pada saat pembacaan
61 Queue Printer sudah penuh
65 Perintah ditolak
80 File sudah ada
82 Tidak bisa membuat entri directory
83 Kesalahan pada interupsi 24
86 Kesalahan password
87 Kesalahan parameter
-------------------------------------------------------------
gambar kode 23.1. Arti dari kode kesalahan DOS yang umum
Pada program yang lengkap biasanya bila ada error, akan dilaporkan
kepada pemakainya. Cara yang kuno untuk dipakai untuk mencetak arti
kesalahan yaitu dengan membandingkan kode kesalahan yang dihasilkan dan
mencetak pesannya, seperti:
TData: JMP Proses
Error1 DB ' Salah perintah ! $'
Error2 DB ' File tidak ditemukan ! $'
Error3 DB ' Path tidak ditemukan ! $'
:
2a
SPEED RACING 3Dinilah screen shot game android yang bisa dimainkan dengan android 4 keatas pada android 7 layar 10 inch dengan memori 1 gb ,juga android 4 layar 3 inch memori 256 mb pun game ini tidak patah patah masih bisa berjalan lancar , game terbaik dari yang terbaik dalam hal kecepatan graphic 3d nya ini buatan brolicious yang berjudul " SPEED RACING 3D" dengan ukuran game hanya 44,3 mb saja ,pada game ini graphic nya bagus walaupun semua tidak terlalu halus pada dekorasi detilnya sudah cukup bagus ,cepat sistem tampilan 3d nya sesuai kecepatan laju kendaraan anda ,mobil anda akan berjalan lincah gesit , ada mobil yang berjalan sendiri berlalulalang , anda diwajibkan menjalankan misi misi sederhana yaitu mengendalikan mobil dengan baik tanpa ada kesalahan misalnya menabrak anda diwajibkan mebyelesaikan balapan ini dengan kecepatan tinggi ,untuk dapat skor anda harus menyelesaikan setiap misi dengan cepat ,anda yang berusaha sendiri menyelesaikan tiap tahap , ada banyak petunjuk lengkap di sepanjang jalan yang sangat jelas sehingga bisa memperkirakan tikungan jalan agar terhindar dari menabrak ,trek jalur sangat panjang terlalu banyak tikungan tanjakan tajam anda salah akan menabrak kalah bila terlalu emosi menambah kecepatan ,jalanya agar licin ,perlu ketelitian konsentrasi tinggi game ini dibuat untuk anda yang sudah mahir mengendalikan ditikungan ,anda tidak dapat memilih mobil , anda tidak akan bosan memainkan game ini berulangkali,sangat sulit mengatasi tabrakan bila anda ingin kencang , panorama perkotaanya sangat lumayan bagus banyak pemandangan menarik namun bila anda sudah mahir anda pantas disebut hebat , lokasi yang ekstrem banyak kota kota , hutan gunung yang selalu jelas luarbiasa unik pada kondisi siang ,hujan ,anda berputar putar di mode alam yang rumit ,kontrol yang sangat nyaman sebab tidak ada gyroscope sehingga bisa diatur dikendalikan tangan kiri atau kanan , mobil atau truk yang ada ukuranya proposional dengan dekorasi sekitarnya lumayan mirip asli,rugi kalau anda tidak mencobanya tak ada salahnya anda mencobanya,anda bisa mengunduhnya di google play store