ASM2.TXT - intro to keyboard and flow control


Alright.  This bit of code introduces control flow, keyboard input, and 
a way to easily print out one character.


First off, lets examine the easiest one: printing a character. It's like this: you put the character to print in DL, put 2 in AH and call interrupt 21h. Damn easy.
Ok, lets look at the next easiest one: keyboard input. There are quite a few functions related to INT 16h (the keyboard interrupt.) They are:

FUNCTION#


0h -Gets a key from the keyboard buffer. If there isn't one, it waits until there is. Returns the SCAN code in ah, and the ASCII translation in AL 1h -Checks to see if a key is ready to grab. Sets the zero flag if a key is ready to grab. Grab it with Fn# 0 This also returns the same info about the key as Fn#0, but does not remove it from the buffer. 2h -Returns the shift flags in al. They are: bit 7 - Insert active bit 6 - Caps lock active bit 5 - Num Lock active bit 4 - Scroll lock active bit 3 - Alt pressed bit 2 - Ctrl pressed bit 1 - Left shift pressed bit 0 - right shift pressed 3h -You can set the Typematic Rate and delay with this function registers must be set as follows AL = 5 BH = Delay value (0-3: 250,500,750,1000 millisec) BL = Typematic rate (0-1fh) 1fh = slowest (2 chars per sec) 0 =fastest (30 chars per second) 4h -Key Click control - not important 5h -STUFF the keyboard input: CH = scan code CL = ascii code output: al = 0 no error al = 1 keyboard buffer is full 10h -Same as #0, but its for the extended keyboard. Checks all the keys. 11h -Same as #1, but for the extended keyboard. 12h -Same as #2, but AH contains additional shift flags: bit 7 - Sys req pressed bit 6 - Caps lock active bit 5 - Num Lock active bit 4 - Scroll lock active bit 3 - Right Alt active bit 2 - Right Ctrl active bit 1 - Left Alt active bit 0 - Right Alt active Al is EXACTLY the same as in Fn#2 WHERE AH= the function number when you call INT 16h
That's neat-o, eh? Now on to flow controll via CMP and Jcc... CMP: CMP is the same as SUB, but it does NOT alter any registers, only the flags. This is used in conjunction with Jcc. Jcc: Ok, Jcc is not a real instruction, it means 'jump if conditionis met.' I'll break this into 3 sections, comparing signed numbers, comparing unsigned numbers, and misc. Note that a number being 'unsigned' or 'signed' only depends on how you treat it. That's why there are different Jcc for each... If you treat it as a signed number, the highest bit denotes whether it's negative or not. Prove to yourself that 0FFFFh is actually -1 by adding 1 to 0FFFFh. You should get a big zero: 00000h. (Remember that the number is ONLY 16 bits and the carry dissapears..)

UNSIGNED:


JA -jumps if the first number was above the second number JAE -same as above, but will also jump if they are equal JB -jumps if the first number was below the second JBE -duh... JNA -jumps if the first number was NOT above... (same as JBE) JNAE-jumps if the first number was NOT above or the same as.. (same as JB) JNB -jumps if the first number was NOT below... (same as JAE) JNBE-jumps if the first number was NOT below or the same as.. (same as JA) JZ -jumps if the two numbers were equal (zero flag = 1) JE -same as JZ, just a different name JNZ -pretty obvious, I hope... JNE -same as above...

SIGNED:


JG -jumps if the first number was > the second number JGE -same as above, but will also jump if they are equal JL -jumps if the first number was < the second JLE -duh... JNG -jumps if the first number was NOT >... (same as JLE) JNGE-jumps if the first number was NOT >=.. (same as JL) JNL -jumps if the first number was NOT <... (same as JGE) JNLE-jumps if the first number was NOT <=... (same as JG) JZ, JE, JNZ, JNE - Same as for Unsigned

MISC:


JC -jumps if the carry flag is set JNC -Go figgure... Here's the rest of them... I've never had to use these, though... JO -jump if overflow flag is set JNO -... JP -jump is parity flag is set JNP -... JPE -jump if parity even (same as JP) JPO -jump if parity odd (same as JNP) JS -jumps if sign flag is set JNS -... Here's the flags really quickly: bit# 8 7 6 5 4 3 2 1 0 symbol: O D I T S Z A P C O = OverFlow flag D = Direction flag * I = Interrupt flag T = Trap flag S = Sign flag Z = Zero flag * A = Auxiliary flag C = Carry flag * The * denotes the ones that you should know.
That's it for now... Until next time... Draeden\VLA

ASM2.ASM

; ASM2.ASM ; Prints messages get keyboard input and has control flow DOSSEG .MODEL SMALL .STACK 200h .DATA Prompt db 13,10,"Do you want to be prompted again? (Y/N) $" NoMessage db 13,10,"Ok, then I won't prompt you anymore.$" YesMessage db 13,10,"Here comes another prompt!$" UnKnownKey db 13,10,"Please hit either Y or N.$" .CODE START: mov ax,@DATA ;moves the segment of data into ax mov ds,ax MainLoop: mov ah,9 mov dx,offset Prompt int 21h ;print a message mov ah,0 int 16h ;get a key, returned in AX ;AL is the ASCII part ;AH is the SCAN CODE push ax mov dl,al mov ah,2 int 21h ;print character in dl pop ax cmp al,"Y" ;was the character a 'Y'? jne NotYes ;nope it was Not Equal mov ah,9 mov dx,offset YesMessage int 21h jmp MainLoop NotYes: cmp al,"N" ;was the character a 'N' je ByeBye ;Yes, it was Equal mov dx,offset UnknownKey mov ah,9 int 21h jmp MainLoop ByeBye: mov dx,offset NoMessage mov ah,9 int 21h mov ax,4c00h ;Returns control to DOS int 21h ;MUST be here! Program will crash without it! END START
This page hosted by Get your own Free Home Page

Back to main page
This page was last updated by Tore Nilsson on 1996-10-28>