Turbo Assembly Masukan dari Keyboard
Kode Scan dan ASCII Prosesor pada keyboard mendeteksi setiap penekanan maupun pelepasan tombol pada keyboard. Prosesor ini menterjemahkan setiap sinyal yang terjadi berdasarkan posisi tertentu menjadi apa yang dinamakan kode Scan. Dengan demikian tombol "A" dan "B" akan mempunyai kode Scan yang berbeda karena posisinya memang berbeda. Lain halnya untuk tombol "A"<A besar> dan "a"<a kecil> yang terdapat pada posisi yang sama, akan mempunyai kode Scan yang sama. Kode Scan ini biasanya tidak berguna bagi kita. Kita biasanya hanya menggunakan kode ASCII dan Extended yang merupakan hasil terjemahan dari kode scan oleh keyboard handler. Kode ASCII adalah kode yang melambangkan suatu karakter baik berupa huruf,angka, maupun simbol-simbol grafik. Misalkan angka "1" akan dilambangkan dengan kode ASCII 49.
Kode Extended Kode ASCII telah menyediakan sebanyak 256 karakter dengan beberapa karakter kontrol, misalnya #10 untuk pindah baris dan #13 untuk Enter yang akan menggerakkan kursor kesamping kiri. Tetapi fungsi yang telah disediakan ini tidak mampu untuk menampilkan ataupun mendeteksi tombol fungsi misalnya F1, F2, F3 dan Home. Tombol kombisasi juga tidak dapat dideteksi oleh karakter ASCII , misalnya penekan tombol shif disertai tombol F1, penekanan Ctrl disertai tombol Home, dan lain-lain. Penekanan terhadap tombol-tombol fungsi dan tombol kombinasi akan menghasilkan kode ASCII 0<nil>. Karena alasan diatas maka diciptakanlah suatu kode yang dinamakan sebagai kode EXTENDED. Kode Extended ini dapat mendeteksi penekanan terhadap tombol-tombol fungsi maupun tombol kombinasi.
Masukan Satu Karakter Interupsi dari BIOS, yaitu interupsi 16h servis 0 dapat digunakan untuk mendapatkan masukan satu karakter dari keyboard. Hasil dari pembacaan karakter fungsi ini akan diletakkan pada register AX. Bila terjadi penekanan pada tombol biasa maka byte rendah dari AX<AL>, akan menunjukkan kode ASCII dari tombol tersebut dan byte tnggi dari AX<AH> akan berisi kode Scan dari tombol tersebut. Bila yang ditekan adalah tombol khusus(extended) yang akan menghasilkan kode ASCII 0 maka byte rendah dari register AX<AL> akan menghasilkan kode ASCII 0 dan byte tinggi dari AX<AH> akan akan berisi kode extended dari tombol tersebut.
Program .MODEL SMALL .CODE ORG 100h TData : JMP Proses T_ASCII DB 13,10,'Ini adalah tombol ASCII : $' T_Extended DB 13,10,'Ini adalah tombol Extended $' Proses : MOV AH,0 ; Servis Input satu karakter INT 16h ; Laksanakan PUSH AX ; Simpan hasil pembacaan pada stack CMP AL,00 ; Apakah ini karakter 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 karakter INT 21h ; Cetak karakter ! 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
Mendeteksi Penekanan Sembarang Tombol Dengan fungsi 11h dari interupsi 16h, kita bisa mendeteksi terhadap penekanan tombol,sama halnya seperti yang dilakukan oleh fungsi keypressed pada bahasa pascal. Fungsi ini akan mendeteksi keyboard buffer, bila pada keyboard buffer terdapat suatu tombol maka ia akan membuat zerro flags menjadi nol<0> dan register AL berisi kode ASCII dari karakter tersebut sedangkan register AH akan berisi kode Scan dari tombol tersebut. Sebaliknya jika pada keyboard buffer tidak ada karakter maka zerro flags akan bernilai satu <1>. Keyboard buffer adalah suatu penampung yang digunakan untuk menampung setiap penekanan tombol pada keybaord. Daya tampung normal dari keyboard buffer adalah 15 karakter. Jika keyboard buffer telah penuh, speaker akan mengeluarkan tanda berupa suara beep.
Program .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 ; Laksanakan ! JNZ EXIT ; Jika 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
Masukan Kalimat dari Keyboard Interupsi 21h servis ke 0Ah, digunakan untuk mendapatkan masukan dari keyboard lebih dari satu karakter. Untuk menggunkan fungsi ini anda harus menyediakan sebuah buffer untuk menampung hasil masukan dari keyboard. Anda bisa membuat sebuah buffer seperti: Buffer DB X,Y,Z DUP(?)
Program .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 karakter Enter? JE EXIT ; Ya! Lompat ke Exit MOV DL,[BX] ; Masukkan karakter pada DL MOV AH,02 ; Servis cetak karakter INT 21h ; Cetak karakter INC BX ; BX := BX+1 JMP Ulang ; Lompat ke Ulang EXIT: INT 20h ; Kembali ke DOS ! END TData