Metropoli BBS
VIEWER: lst14-12.asm MODE: TEXT (ASCII)
;
; *** Listing 14-12 ***
;
; Demonstrates scanning a table with REPNZ SCASW in
; order to generate an index to be used with a jump table.
;
	jmp	Skip
;
; Branches to the routine corresponding to the key code in
; AX. Simply returns if no match is found.
;
; Input:
;	AX = 16-bit key code, as returned by the BIOS
;
; Output: none
;
; Registers altered: CX, DI, ES
;
; Direction flag cleared
;
; Table of 16-bit key codes this routine handles.
;
KeyLookUpTable	label	word
	dw	1e41h, 3042h, 2e43h, 2044h	;A-D
	dw	1245h, 2146h, 2247h, 2347h	;E-H
	dw	1749h, 244ah, 254bh, 264ch	;I-L
	dw	324dh, 314eh, 184fh, 1950h	;M-P
	dw	1051h, 1352h, 1f53h, 1454h	;Q-T
	dw	1655h, 2f56h, 1157h, 2d58h	;U-X
	dw	1559h, 2c5ah			;Y-Z
KEY_LOOK_UP_TABLE_LENGTH_IN_WORDS equ (($-KeyLookUpTable)/2)
;
; Table of addresses to which to jump when the corresponding
; key codes in KeyLookUpTable are found. All the entries
; point to the same routine, since this is for illustrative
; purposes only, but they could easily be changed to point
; to any label in the code segment.
;
KeyJumpTable	label	word
	dw	HandleA_Z, HandleA_Z, HandleA_Z, HandleA_Z
	dw	HandleA_Z, HandleA_Z, HandleA_Z, HandleA_Z
	dw	HandleA_Z, HandleA_Z, HandleA_Z, HandleA_Z
	dw	HandleA_Z, HandleA_Z, HandleA_Z, HandleA_Z
	dw	HandleA_Z, HandleA_Z, HandleA_Z, HandleA_Z
	dw	HandleA_Z, HandleA_Z, HandleA_Z, HandleA_Z
	dw	HandleA_Z, HandleA_Z
;
VectorOnKey	proc	near
	mov	di,cs
	mov	es,di
	mov	di,offset KeyLookUpTable
			;point ES:DI to the table of keys
			; we handle, which is in the same
			; code segment as this routine
	mov	cx,KEY_LOOK_UP_TABLE_LENGTH_IN_WORDS
			;# of words to scan
	cld
	repnz	scasw	;look up the key
	jnz	VectorOnKeyDone	;it's not in the table, so
				; we're done
	jmp	cs:[KeyJumpTable+di-2-offset KeyLookUpTable]
			;jump to the routine for this key
			; Note that:
			;   DI-2-offset KeyLookUpTable
			; is the offset in KeyLookUpTable of
			; the key we found, with the -2
			; needed to compensate for the
			; 2-byte (1-word) overrun of SCASW
HandleA_Z:
VectorOnKeyDone:
	ret
VectorOnKey	endp
;
Skip:
	call	ZTimerOn
	mov	ax,1e41h
	call	VectorOnKey	;look up 'A'
	mov	ax,1749h
	call	VectorOnKey	;look up 'I'
	mov	ax,1f53h
	call	VectorOnKey	;look up 'S'
	mov	ax,2c5ah
	call	VectorOnKey	;look up 'Z'
	mov	ax,0
	call	VectorOnKey	;finally, look up a key
				; code that's not in the
				; table
	call	ZTimerOff

[ RETURN TO DIRECTORY ]