THE ASSEMBLY LANGUAGE "MAGAZINE" 1989
THE ASSEMBLY LANGUAGE "MAGAZINE" VOL1 NUMBER1
FEBRUARY 20,1989
## #### #### ####### ## ## ###### #### ## ##
#### ## ## ## ## ## # ### ### ## ## ## ## ##
## ## ### ### ## # ####### ## ## ## ## ##
## ## ### ### #### ####### ##### ## ####
###### ### ### ## # ## # ## ## ## ## # ##
## ## ## ## ## ## ## # ## ## ## ## ## ## ##
## ## #### #### ####### ## ## ###### ####### ####
#### ## ## ## #### ## ## ## #### #######
## #### ### ## ## ## ## ## #### ## ## ## #
## ## ## #### ## ## ## ## ## ## ## ## #
## ## ## ## #### ## ## ## ## ## ## ####
## # ###### ## ### ## ### ## ## ###### ## ### ## #
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
####### ## ## ## ## ##### ###### ## ## ##### #######
Written by and for assembly language programmers.
The Assembly Language "MAGAZINE" vol. 1, #1
(send in your title suggestions!)
For the month of February 1989, we have:
Introduction..................................3
Article Suggestions...........................4
What Started It...............................5
Review of the A86 Assembler...................7
FAST Memory Moves.............................8
Source code..............................8
A Few Good Programs..........................11
Keyboard Trapping-How When and Where.........13
Source code.............................15
Book Reviews.................................24
Guidelines for Contributors..................26
NOTE: *** WE NEED CONTRIBUTORS! *** Read Article Suggestions and
Guidelines and start sending those articles in!
Special to Electronic Magazines
The source files included here are complete asm files and you only need to
edit them out with a text editor and then assemble them.
Produced by Patrick & David O'Riva
Edited, arranged, sent, etc. by same
Always available at: The AsmLang & CFS BBS
(408) 259-2223 (woof! 143/37)
2726 Hostetter Rd, San Jose, CA 95132
Assembly Language 'Magazine'
In this, the first issue, the only editorial you are going to get is
this short introduction to the magazine and an even shorter one to myself.
This is to be a publication devoted to Assembly language programming
and to the Assembly language programmer. At first look it might appear that
it is to be a pclone only forum, but that is not the intention or the desire.
My current system is pclone and therefore where I have begun, but the same
needs exist on other systems as well: 6502, 6800, 68000 and so forth.
If there is to be any restriction it would be in the direction away from
pure operating systems and into user visible applications, but that line is
far too hazy to consider.
The hope is to present this 'magazine' monthly with a transmission
date of the 15th. If YOUR interest is not communicated to me by way of
comments and article submissions this publication will evaporate immediately.
Your editor is no one you would have heard about. My first program-
ming was done by setting toggle switches on the front of the machine and
hitting the enter button. I have worked on operating systems and interfaces
on the 8088, Z80, 6800 and 6502. I am currently disabled and some months my
productive time approaches 0 but with the cooperation of my son (an excellent
programmer) I hope to coordinate this far into the future.
Policy on Piracy
As you well know programming is not easy. It is always time consum-
ing and often very tedious. A good program is as creative as a book or a work
of art. Even a bad program entails many man hours of effort. This time
should not be stolen from the authors. With conventional marketing piracy is
illegal.In Shareware the same moral obligations exist. If we use it we should
pay for it. Many of the programs to be discussed I expect to be in this
category.
I don't generally recommend publication of source code unless it is
your intention to put it in the public domain, however illustrative pieces
in an article could be of benefit to us all. No code not wholly written by
the author should be submitted.
Suggestions for articles to be submitted
Reviews of programs- Reviews are always interesting because they can save
someone a great deal of time in checking out something that
will not meet their needs.
Bugs and idiosyncrasies- Undocumented facts about common tools
COM vs EXE
How to write a good TSR
Math libraries- All about
What is a good user interface
Public key signatures and Encryption- no viruses in Shareware
Most anything else of interest to you
The Beginning
This was sent out on the FidoNet 80XXX echo in December 1988. Enough favorable
replies were received to continue the project.
I am interested in starting a national magazine devoted to the use of
assembly language. The principle aims would be as follows:
Improving the skills and knowledge of us all
Widening the awareness of the benefits of assembly
Provide reviews of new tools
Is there a need for such a publication? In terms of mass readership, probably
not. But in the desires of the select group of people who program in assembly
I feel that there is.
Magazine is really the wrong term. I don't think there is a term for
what this would likely have to be. If there was a large enough market for a
normal publication I'm sure one of the major publishers would have done it.
I foresee an electronic distribution possibly carried on the 80xx Echo then
those interested could print it out, copy it, and make it available to others
who would be interested. Eventually a more formal distribution might be
arranged if there were enough interest. If anyone reading this is interested
in contributing articles or just making comments I would like to hear from
you.
EDITORIAL (JUST TO SPARK CONTROVERSY)
Higher level languages are primarily a method of producing software
useful for corporations, because it can be written and understood by pro-
grammers with little knowledge of the equipment. This work can then be
passed on to another after he leaves, and little is lost. This same work
can also be moved to another environment simply by changing compilers.
Complex programs can be written quickly (This may be a fiction) and sent to
market.
This all sounds pretty good, right? No. The price that we have to
pay for this is far too high. The size of these programs is becoming absurd.
This forces users (and that's what we all are) into a continual quest for
larger memory. The major debugging programs available leave no room in a
512k pclone to fit the program being debugged. Spreadsheet and database
programs are as bad and get worse with every new release of an 'improved'
version.
The main program we use continuously is a major offender this way.
DOS has grown almost geometrically and has come to occupy a significant
fraction of available memory while adding few (if any) improvements since
version 2.0 (the continuing standard of compatibility).
This situation is bad enough, but it is just the tip of the real
damage done by the NECESSARY use of high level language by the leading
software companies. Speed-- the magic word in computing is so thoroughly
compromised that the hardware industry is just holding its head above the
morass.
Within the last year I have tried the latest release of the
assembler package from a major software company. I'm sure you know which
one I mean, but I'd rather not use names at this time so I don't have to
strictly document my figures. It was significantly larger than the previous
version (though somewhat faster 35 seconds as opposed to 50 seconds on the
program I tested it with). It would not assemble my source code from the
previous version without a number of silly modifications. The involved
syntax this package has traditionally used has annoyed me since the first
version I purchased. About this same time I tried a shareware assembler that
supports largely the same functions though in slightly differing form to
reflect the preference of the author. I won't say that it was without
flaws. No program is. After *removing* the instructions that have so irritated
me in the other I assembled the same program with this. It is a fraction
of the size (about 20k). It loaded itself, loaded and assembled my program,
delivered a complete COM file, and inserted some trivial error messages *into*
a copy of my original source file in ** 4 ** seconds. This is around the
same length of time it took the other assembler to load itself.
The editor contained in the commercial package while very versatile,
and using some very clever techniques to speed up the usage, the first
time I tried to load a file in I thought my poor machine had bombed and
I reset it, but then I noticed that the disk was being accessed and it even-
tually displayed my file. The same situation occurred when I asked it to
show me it's help file. The shareware editor I am using now allows me even
greater versatility, only occupies about 15% of the memory and I can be
editing my file long before the other one would have loaded itself. And it's
not even completely written in assembly.
In summation, while high level language may have its place, it is
not in programs expected to have high usage or when speed or size are
significant factors. The end users need to be given a choice and shown the
difference between quality programming and the corporate programming (much
of it vaporware) that they are now being offered.
A86 Assembler Review
A86 is a full featured Assembler for the 8088 80286 8087 80287 v20 and v30
microprocessors. It is not fully MASM compatible, though it comes close
(except in the area of macros - its macro support is quite strong but entirely
different from MASM). Some of its unique features are support of entirely
local variables so that a new and unique name need not be thought up for each
local jump. It synthesizes the move segment register to segment register moves
with pushes and pops and has some interesting commands to jmp far on
condition,using the inverse jshort instruction and a local label. This saves a
good amount of typing and actually makes the code more readable. It is a tiny
program, less than 24k and the assembly speed is astounding. The claim is
1000 lines per second. It will directly produce a COM file, usually so quick-
ly you don't even need to pause in your typing. EXE files are also supported
but as the COM format is so simple I haven't really checked that out too
well, and the support is not complete. The documentation is good for the
operation of the assembler but it is not a tutorial in assembly language
programming.
So much for the advantages. It is not MASM compatible. While it will
work with most MASM source files without macros, MASM will not accept an A86
file. Most of the formatting commands of MASM (the proc and assume statements)
are more or less ignored. The segment end statements are ignored, as a seg-
ment statement closes the current segment. This simplified syntax can greatly
reduce the amount of typing necessary in a program, but somewhat more care is
needed by the programmer.
One of the worst flaws as I see it is the lack of support for in-
clude files though its acceptance of multiple command line modules and libr-
ary files partially makes up for this.
Overall, this is a very high quality program but not to be con-
sidered if you require MASM compatibility. This is a shareware offering by
Eric Isaccson, available from most BBS's.
There is a companion symbolic debugger D86 also available.
MASM is a trademark of Microsoft Corporation
DMA Transfers for FAST Memory Moves
If you ever have the need for super fast moves of blocks of memory and you
can put up with a lot of restrictions in order to gain the speed there is a
method in the PC environment to move bytes at the rate of one every 3 clock
cycles. Compare that to the clocks for a rep movsb and then say that isn't
fast. This isn't for every programmer and it certainly isn't for every time
you need to move a few bytes.
The DMA chip is a four channel device. Channel 0 is reserved for
refresh of memory that requires at least 256 consecutive bytes be read some-
where in memory at intervals less than about 4ms. The other three channels
are available for such things as transferring information to and from the
disk drives or the ports. Interesting trivia so far, but not very useful in
moving memory around. It gets worse. The 8259 DMA doesn't know anything about
segments. It only knows a 64k universe. This is where the Page registers come
in. The page registers decide which page (on 64k boundaries) the 8259 will
look at for any operation. There are not, as you might guess, 4 page
registers,but only 2 plus a default. If it is not channel 1 or 2 then it uses
the default register programmed as channel 3.
A careful reading of the data sheet of the 8259 discloses that it is
capable of doing a memory to memory transfer but only between channels 0 and
1. That is why this method is a little tricky to use. In order to set up your
own parameters you have to disable the timer from asking for a DMA from chan-
nel 0 every x milliseconds and reconfigure the 8259 and assume the respon-
sibility for doing the memory refresh. It actually sounds worse than it is.
The configuring and re configuring of the 8259 doesn't take all that long, so
the time is made up after only moving a few tens of bytes, and if you move at
least 256 CONSECUTIVE bytes the memory refresh requirement is met for another
2 or 3 milliseconds. The page registers are taken care of by setting channels
1 and 3 to the same value.
Given below is an example of a program I wrote just to test the
idea. A lot of the setup is too complex to explain in this short article, but
if you are interested in checking it all out you will need a data sheet on
the 8259. This worked nicely on my machine and should on most compatibles
just the way it is. With the not-so-compatible it may very well not. I hope
this listing is well enough commented so you can figure it out and make use of
it sometime.
` DMA SOURCE
PAGE 60,132
TITLE DMA MEMORY TO MEMORY
DMA EQU 0
STACK SEGMENT PUBLIC 'STACK'
DB 32 DUP('STACK')
STACK ENDS
DATA SEGMENT PUBLIC 'DATA'
SOURCE DW 08000H
TARGET DW 09000H
NUMBER DW 800H
INCDEC DB 0
PAGER DB 0BH ;PAGE (O TO F)
FILL DB 0 ;2 IF A FILL OP
DATA ENDS
ASSUME CS:CODE,DS:DATA,ES:DATA
CODE SEGMENT PUBLIC 'CODE'
START:
MOV AX,DATA
MOV DS,AX
MOV AX,0B800H
MOV ES,AX
PAGE:
MOV AL,PAGER ;PAGE TO OPERATE IN
OUT 83H,AL
UNDMA:
OUT 0DH,AL ;MASTER RESET OF DMA
MOV DX,03D8H
MOV AL,1
OUT DX,AL
MOV AX,SOURCE ;WHERE IS IT COMING FROM
OUT 0H,AL
MOV AL,AH
OUT 0H,AL
MOV AX,TARGET ;WHERE TO PUT IT
OUT 2H,AL
MOV AL,AH
OUT 2H,AL
MOV AX,NUMBER ;HOW MANY
OUT 3H,AL
MOV AL,AH
OUT 3H,AL
MOV AL,009H ;ENABLE M TO M,COMPRESSED
OR AL,FILL ;WILL BE 2 IF FILL OP
OUT 8H,AL
MOV AL,088H ;BLOCK MODE, INC, READ
OR AL,INCDEC ;WILL BE 20H IF DEC
OUT 0BH,AL
MOV AL,85H ;BLOCK MODE, INC, WRITE
OR AL,INCDEC ;WILL BE 20H IF DEC
OUT 0BH,AL
MOV AL,4 ;THIS IS THE REQUEST
OUT 9,AL ;DO IT
MOV AL,9
OUT DX,AL
RESET: OUT 0DH,AL ;THIS IS A MASTER RESET
OUT 0CH,AL ;RESET F/L F/F
MOV AL,01
OUT 0,AL
OUT 0,AL
REINIT:
MOV AL,0
OUT 83H,AL ;MOVES REFRESH TO BASE PAGE
MOV AL,0FFH
OUT 1,AL
PUSH AX
OUT 1,AL
OUT 0BH,AL
INC AL ;MODE CHAN3
OUT 0BH,AL
PUSH AX
POP AX
POP AX
POP AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
`
All Programs Small and Fast
---------------------------
The programs mentioned here are ones that I use regularly or have been
recommended to me by those whose opinion I trust. In the later case, I have
tried them but they just don't fit with the way I do things. You will notice
some obvious holes in this list. These are cases where I have found nothing
that I am pleased enough to pass on. Not all of them are written in assembly
but they still work well in an assembly programming environment. Most of them
are Shareware products, and while this is not by design on my part it is not
by chance either. They were written by talented programmers in a non-corporate
setting.
Xhelp
This is a TSR pop-up. It comes with a file containing the DOS 3.2 instruction
set (about 50 pages worth) and an IBM/ascii table. It will also accept and
integrate any other documents that you care to enter. It implements searches,
index, and table of contents. Place marker is maintained between pop-ups.
I resent its size, but it is fast and well implemented.
Exwells Software Company
7677 Oakport St Suite 110
Oakland,CA 94621
CED
One of the command line editors. It has extended functions to make DOS com-
mands resident and other programs can be invoked with arguments as though
from a batch file with a specified synonym. Small and fast. Also works inside
programs that strictly use DOS editing functions keeping internal and external
commands separate. Shareware.
List
Version 6.3+. I don't think this needs much said. It is by Vern Buerg,is small
and fast. If you don't have it, get it! Shareware
TSR
A collection of TSR handling programs. The Mark records the machine state,
including vectors, environment, and most anything else it can. Release, looks
for the latest Mark and restores that machine state, then erases the Mark.
Thus any TSR's are removed completely. This is very useful for development
work. Shareware.
Qedit
This is a full screen editor. It is small, super fast, has too many features
to begin to list. You can configure the keyboard any way you like it very
quickly and easily. 10 file concurrent editing, 99 nameable buffers etc.
One of the finest pieces of software available. Shareware.
Microspell
A spelling checker. Unbelievable speed, compatible with most word processors.
Supports auxiliary dictionaries and allows entries into the main dictionary.
Trigram systems
5840 Northumberland St.
Pittsburgh,PA 15217
412-422-8976
Assemblers
This is a blank entry. A86 comes very close to qualifying; it is small, fast
but is lacking some useful tools such as include files. I am still using
grudgingly predominantly MASM 4 but may switch over. TASM from Borland is
receiving some interesting comments, but is still large 97k, and not as fast
as it might be. I've also heard of PASM. A review of it would be greatly
appreciated. Late break: OPTASM may be reasonable as well...
Word Processors
This is also a blank entry. ChiWriter by Horstman Software is decent. It
is versatile, easy, but large and slow. The big NAMES I've tried I have thrown
away in disgust. Target size: <40k, plus fonts. Should scroll at typematic
rate. 100k search <1 sec. Configurable command keys(!).
Getting User Input, Part One
by David O'Riva
Most of you are familiar with the various ways to read the
keyboard. One can ask DOS, through interrupt 21H, and get keystrokes
coming from the keyboard (or from whatever device or file the user told DOS
to use instead of the keyboard).
Alternatively, if you want to be sure that you're getting actual
*keyboard* input, and/or you want more information than DOS is willing to
provide, you can go through INT 16H:
MOV AH,0
INT 016H ;get a key & scancode
MOV DX,AX ;save keystroke in DX
MOV AH,2
INT 016H ;get shift state in AL
...would give you the key pressed, it's scan code, and the shift states in
effect at the time of the press. Information on all the INT 16H modes is
available from many references, and we will not delve any deeper into that
here.
Now, if you NEED to know exactly what the keyboard state is, or to
get a keystroke the micro-second it is pressed, or to interpret and act on
multiple keystrokes (for example: you're writing a game, and you want one
half of the keyboard to be controls for player 1, and the other half to be
controls for player two.) then you need an IRQ 1 trap.
The following sequence of events occurs for every key that is
pressed:
* KEYPRESS *
IRQ 1 is pulled high
The 8259 interrupt controller halts the system and does an INT 09H
The BIOS code for INT 09H polls the keyboard for the scan code, converts
the code into an IBM scan code, which is for the most part identical to
the scan codes from the keyboard.
If the CTRL-ALT-DEL sequence was pressed, control is given to the warm boot
code. Other special keys are serviced (i.e. SYSREQ on ATs, soft turbo
mode switches, etc...)
The keystroke is placed in the buffer, if there is room.
The INT 09H code resets the 8259 and leaves.
INT 16H (when called) pulls the keystroke out of the buffer and hands it to
the application, or to DOS, which hands it to the application.
Note that the INT 09H code in BIOS will only respond to a
keyboard MAKE code, except for shift keys. The keyboard itself handles
typematic repeating, except on PCjrs.
An IRQ 1 server needs to be installed BEFORE the BIOS code, and
can respond in varying ways to keystrokes. Here are some examples of IRQ 1
servers for specific tasks:
1. For HOT-KEY popup
a) poll the keyboard, find out whether it's a MAKE or BREAK code
b) if it's a BREAK code
b1) is it the BREAK code for our hot-key?
b2) if so, did we trap the make code?
b3) if we did, clear the keyboard latch, reset the 8259, and leave.
c) if it's a MAKE code
c1) is it the MAKE code for our hot-key?
c2) if so, are we allowed to pop up now? (you don't want to start
multiple iterations of your popup program...)
c3) if we are, set a flag to wait for the BREAK code, clear the
keyboard latch and 8259, and start the popup.
d) if it wasn't acted upon before, leave the keyboard latch and
interrupt mask as they are and continue down the INT 09H chain.
2. For multiple-key trapping
First, set up an array that corresponds to the keys you want to trap.
a) poll the keyboard, find out whether it's a MAKE or BREAK code.
b) if it's a MAKE code
b1) is it one of the keys we want to know about?
b2) if so, set the element in the array that corresponds to this key.
b3) You will *usually* want to clear the KB latch and 8259 to prevent
the BIOS keyboard buffer from overflowing...
c) if it's a BREAK code
c1) is it one of the keys we want to know about?
c2) if so, clear the element in the array that corresponds to this key.
c3) if you prevented the MAKE code from reaching BIOS, do the same for
this BREAK code.
d) if it wasn't acted upon, continue down the INT 09H chain
(alternatively, you can trap a key other keys here, like your "end
the game" key, and prevent ANY keystrokes from reaching BIOS. This
would prevent a CTRL-C from invoking DOS's critical-error handler,
a CTRL-ALT-DEL from blowing the game if files are open, etc...)
e) in your game's code, use the array to determine which keys are pressed
and what to do.
As you can see, this sort of trap can be extremely powerful. The
only caveat is that this requires a very-compatible PClone. And this may
not be that bad, since I know that at least two very large game companies
are using a method similar to this for their games.
Included with this article is a program called SHOWKEY.ASM, which
installs an IRQ 1 trap and prints on the screen the scan code that it
received from polling the keyboard, the current shift state, and the key
and scan code that a call to INT 16H returned (dashes are printed if the
key was not passed to the buffer). The only thing I ask in relation to
this code is that if you distribute it unmodified, you leave my copyright
message in. The code should be commented well enough that it is
understandable.
Next month: Pop-up TSR'S. How to write, how to invoke, how to run,
how to remove from memory. Watch for it!
NOTE: This is my first effort at writing an article for
programmers on a complicated subject. Any comments or suggestions on
writing style or clarity of explanation would be welcomed. Send to FidoNet
node 143/37 - Dave.
` PAGE 60,132
TITLE SHOWKEY - Shows key codes
;
;
COMMENT~*********************************************************************
* --++**> All code in this file is Copyright 1989 by David O'Riva <**++-- *
*****************************************************************************
* *
* Written for the Microsoft Macro Assembler version 5.1 *
* *
* MUST BE CONVERTED INTO A .COM FILE BEFORE RUNNING!!! *
* *
* *
* Short advertisement - use QEdit! Get it from 143/37! *
* *
****************************************************************************~
.XLIST
;
; Macros used by this program
;
?PLevel = 0
PNPROC MACRO PNAME ;;declare near public procedure
IF2
%OUT Routine: &PNAME
ENDIF
PUBLIC &PNAME
&PNAME PROC NEAR
?PLevel = ?PLevel+1 ;;next level of nesting
@@SAVE_NAME &PNAME,%?PLevel
ENDM
ENDPROC MACRO
@@REC_NAME %?PLevel
@@EP1 %@@TEMP
?PLevel = ?PLevel-1
ENDM
@@SAVE_NAME MACRO PNAME,LVL
?PN&LVL EQU <&PNAME>
ENDM
@@REC_NAME MACRO LVL
@@TEMP EQU <?PN&LVL>
ENDM
@@EP1 MACRO PNAME
&PNAME ENDP
ENDM
PUSHM MACRO LST
IRP REG,<&LST&>
PUSH REG
ENDM
ENDM
POPM MACRO LST
IRP REG,<&LST&>
POP REG
ENDM
ENDM
@CHANGE_VECT MACRO INUM,GARB,NEW,GARB2,SAVEAREA
MOV AX,0
MOV ES,AX
MOV AX,ES:[INUM*4]
MOV DX,ES:[INUM*4+2]
MOV WPTR CS:[SAVEAREA],AX
MOV WPTR CS:[SAVEAREA+2],DX
MOV AX,OFFSET CS:NEW
CLI
MOV ES:[INUM*4],AX
MOV ES:[INUM*4+2],CS
STI
ENDM
@RESTORE_VECT MACRO INUM,GARB,SAVEAREA
MOV AX,0
MOV ES,AX
MOV AX,WPTR CS:[SAVEAREA]
MOV DX,WPTR CS:[SAVEAREA+2]
CLI
MOV ES:[INUM*4],AX
MOV ES:[INUM*4+2],DX
STI
ENDM
BPTR EQU <BYTE PTR>
WPTR EQU <WORD PTR>
DPTR EQU <DWORD PTR>
CR EQU <13>
LF EQU <10>
JR EQU <JMP SHORT>
INT_CTRL EQU 020H ;Interrupt control port
EOI EQU 020H ;Reset interrupt controller command
KB_DATA EQU 060H ;Keyboard data port
KB_CTRL EQU 061H ;Keyboard control port
;
;****************************************************************************
;
BIOSDATA SEGMENT AT 00040H
;----------------------------------------------------------------------------
;Keyboard Data Area
;----------------------------------------------------------------------------
ORG 00017H
KB_FLAG LABEL BYTE
;----- Shift flag equates within KB_FLAG
INS_STATE EQU 80H ;INSERT state is active
CAPS_STATE EQU 40H ;CAPS LOCK state toggled
NUM_STATE EQU 20H ;NUM LOCK state toggled
SCROLL_STATE EQU 10H ;SCROLL LOCK state toggled
ALT_SHIFT EQU 08H ;ALT key depressed
CTRL_SHIFT EQU 04H ;CTRL key depressed
LEFT_SHIFT EQU 02H ;left SHIFT key depressed
RIGHT_SHIFT EQU 01H ;right SHIFT key depressed
ORG 00018H
KB_FLAG_1 LABEL BYTE
;----- Shift flag equates within KB_FLAG_1
INS_SHIFT EQU 80H ;INSERT key depressed
CAPS_SHIFT EQU 40H ;CAPS LOCK key depressed
NUM_SHIFT EQU 20H ;NUM LOCK key depressed
SCROLL_SHIFT EQU 10H ;SCROLL LOCK key depressed
HOLD_STATE EQU 08H ;suspend key has been toggled
ORG 00019H
ALT_INPUT LABEL BYTE ;storage for alternate keypad entry
ORG 0001AH
BUFFER_HEAD LABEL WORD ;pointer to head of keyboard buffer
ORG 0001CH
BUFFER_TAIL LABEL WORD ;pointer to tail of keyboard buffer
ORG 0001EH
KB_BUFFER LABEL WORD ;keyboard buffer
ORG 0003EH
KB_BUFFER_END LABEL WORD
;----- HEAD = TAIL indicates that the buffer is empty
NUM_KEY EQU 69 ;scan code for NUM LOCK
SCROLL_KEY EQU 70 ;sc for SCROLL LOCK
ALT_KEY EQU 56 ;sc for ALT key
CTL_KEY EQU 29 ;sc for CTRL key
CAPS_KEY EQU 58
LEFT_KEY EQU 42
RIGHT_KEY EQU 54
INS_KEY EQU 82
DEL_KEY EQU 83
BIOSDATA ENDS
.LIST
.SALL
;
;****************************************************************************
;
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
MAIN PROC FAR
ORG 100H
ENTRY: JMP INSTALL
;============================================================================
;
; MY LOCAL DATA
;
;
;
OLD9 DD ? ;old INT 9 vector
;
;
LAST_KEY DB ? ;make code from key trap
LAST_SHIFT DB ? ;shift state on trap
KEYPRESSED DB ? ;TRAP flag - non-zero = key was trapped
LINECOUNT DB ? ;current count of lines on screen
SHIFTOVL DB 'RLCA' ;
NOTICE LABEL BYTE
DB CR,LF
DB 'SHOWKEY v1.0 12-01-1988',CR,LF
DB 'COPYRIGHT 1988 ORIVATION',CR,LF
DB CR,LF
DB 'SHOWKEY shows the incoming scan codes from the keyboard hardware',CR,LF
DB ' and from the BIOS, and the shifts in effect at the press.',CR,LF
DB ' Type a "Q" to quit.',CR,LF
LINE0 DB '+INCOMING CODES--+------+------+------+',CR,LF
DB '| ASCII | SHIFTS | KEYB | BIOS | EXTD |',CR,LF
DB '| CHAR | RLCA | CODE | CODE | CODE |',CR,LF
DB '+-------+--------+------+------+------+',CR,LF,'$'
ILINE DB '| '
ACHAR DB ' '
DB ' | '
SHIFTS DB 'RLCA'
DB ' | '
KBC DB '00'
DB ' | '
BIOSC DB '00'
DB ' | '
EXTC DB '00'
DB ' |',CR,LF,'$'
;
;
;============================================================================
PAGE
;****************************************************************************
; START - main program loop
;
;
; ENTRY: from command line
;
; EXIT: ???
;
; DESTROYED: ALL
;
;----------------------------------------------------------------------------
PNPROC START
PUSHM <CS,CS>
POPM <ES,DS>
;----------------------------------------------------------------------------
; print copyright notice
;----------------------------------------------------------------------------
MOV AH,9
MOV DX,OFFSET NOTICE
INT 021H
MOV LINECOUNT,20
;----------------------------------------------------------------------------
;
;
; MAIN LOOP
;
;
;----------------------------------------------------------------------------
NEXT_CHAR_IN: DEC LINECOUNT
JNZ S_1
;
; reprint column headers if scrolled off screen
;
MOV DX,OFFSET LINE0
MOV AH,9
INT 021H
MOV LINECOUNT,20
;----------------------------------------------------------------------------
; wait until our trap finds something
;----------------------------------------------------------------------------
S_1: CMP CS:KEYPRESSED,0
JZ S_1
;----------------------------------------------------------------------------
; reset trap and get 'make' code of key pressed
;----------------------------------------------------------------------------
MOV CS:KEYPRESSED,0
MOV AL,LAST_KEY
MOV SI,OFFSET KBC
CALL REGISTERTOTEXT
;----------------------------------------------------------------------------
; did BIOS pick up on the key?
;----------------------------------------------------------------------------
MOV AH,1
INT 016H
S_2: JNZ S_3
;----------------------------------------------------------------------------
; if BIOS didn't get it, print dashes instead
;----------------------------------------------------------------------------
MOV WPTR BIOSC,('-'*256+'-')
MOV WPTR EXTC,('-'*256+'-')
MOV ACHAR,' '
JR S_6
;----------------------------------------------------------------------------
; print the key BIOS found
;----------------------------------------------------------------------------
S_3: MOV AH,0
INT 016H
PUSH AX
MOV ACHAR,AL
;
; since we're using cooked console output, only print chars > 32
;
CMP AL,' '
JAE S_5
MOV ACHAR,' '
;
; get ASCII code of character
;
S_5: MOV SI,OFFSET BIOSC
CALL REGISTERTOTEXT
;
; and get extended (scan) code from BIOS
;
MOV SI,OFFSET EXTC
POP AX
MOV AL,AH
CALL REGISTERTOTEXT
;----------------------------------------------------------------------------
; read shift states in effect at the time of the press
;----------------------------------------------------------------------------
S_6: MOV AX,WPTR SHIFTOVL ;* restore shift characters to
MOV WPTR SHIFTS,AX ;| output string
MOV AX,WPTR SHIFTOVL+2 ;|
MOV WPTR SHIFTS+2,AX ;*
MOV SI,OFFSET SHIFTS ;SI -> shift info to display
MOV AL,LAST_SHIFT ;AL = shift codes in BIOSDATA
MOV CX,4 ;CX = # of shifts to check
S_7: SHR AL,1 ;shift bit -> carry flag
JC S_8 ;if set, bypass this one
MOV BPTR [SI],' ' ;clear this shift character
S_8: INC SI ;SI -> next shift character
LOOP S_7 ;check it
;----------------------------------------------------------------------------
; print a line of information about the keypress
;----------------------------------------------------------------------------
MOV AH,9
MOV DX,OFFSET ILINE
INT 021H
;----------------------------------------------------------------------------
; if this character was a 'Q', then leave now
;----------------------------------------------------------------------------
MOV AL,ACHAR
CMP AL,'Q'
JZ S_OUT
;----------------------------------------------------------------------------
; more characters in BIOS buffer?
;----------------------------------------------------------------------------
MOV AH,1
INT 016H
JNZ S_2
;----------------------------------------------------------------------------
; do next key
;----------------------------------------------------------------------------
JMP NEXT_CHAR_IN
;----------------------------------------------------------------------------
; leave
;----------------------------------------------------------------------------
S_OUT: JMP UNLOAD
ENDPROC
;****************************************************************************
; REGISTERTOTEXT - Converts AL into ASCII hex digits in CS:[SI]
;
;
; ENTRY: AL = register to translate
; SI = place to put translated digits
;
; EXIT: AX = hex digits
;
; DESTROYED: AX
;
;----------------------------------------------------------------------------
ASSUME ds:NOTHING,es:NOTHING
PNPROC REGISTERTOTEXT
;----------------------------------------------------------------------------
; split AL into two nibbles
;----------------------------------------------------------------------------
MOV AH,AL
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
AND AL,0FH
;----------------------------------------------------------------------------
; convert AL into a hex digit
;----------------------------------------------------------------------------
ADD AL,'0' ;AL = actual digit
CMP AL,'9'
JBE R_1
ADD AL,'A'-'0'-10
;----------------------------------------------------------------------------
; convert AH into a hex digit
;----------------------------------------------------------------------------
R_1: ADD AH,'0' ;AH = actual digit
CMP AH,'9'
JBE R_2
ADD AH,'A'-'0'-10
;----------------------------------------------------------------------------
; store hex number in [SI]
;----------------------------------------------------------------------------
R_2: MOV CS:[SI],AH
MOV CS:[SI+1],AL
RET
ENDPROC
PAGE
;****************************************************************************
; TRAPPER9 - Intercepts the incoming keyboard scan code
;
; This routine intercepts the keyboard hardware interrupt, looking
; for a valid "make" code. If such a code is found, it is stored in local
; data along with the current shift state, and a flag is set indicating that
; a keypress was trapped.
;
; ENTRY: from IRQ 1, machine state is ???
;
; EXIT: continues KB interrupt chain
;
; DESTROYED: none
;
;----------------------------------------------------------------------------
ASSUME ds:BIOSDATA,es:NOTHING
PNPROC TRAPPER9
STI ;since the keyboard interrupt mask
;is never cleared within this routine,
;there is no chance of accidental
;re-entry with interrupts enabled
PUSHM <AX,BX,DS> ;save everthing I use
MOV AX,SEG BIOSDATA ;DS-> BIOS's data seg
MOV DS,AX
IN AL,KB_DATA ;Poll keyboard controller
TEST AL,080H ;See if we got a 'make' code
JNZ T_ChainOn ;If it's a 'break' code, ignore it...
;----------------------------------------------------------------------------
; ignore the four shift keys (CTRL, ATL, L-SHIFT, R-SHIFT)
;----------------------------------------------------------------------------
CMP AL,038H
JZ T_ChainOn
CMP AL,02AH
JZ T_ChainOn
CMP AL,01DH
JZ T_ChainOn
CMP AL,036H
JZ T_ChainOn
;----------------------------------------------------------------------------
; save info about this key
;----------------------------------------------------------------------------
MOV CS:LAST_KEY,AL ;save key make code
MOV AL,KB_FLAG
MOV CS:LAST_SHIFT,AL;save current shift state
MOV CS:KEYPRESSED,1 ;set 'TRAPPED' flag
;----------------------------------------------------------------------------
; Continue down the KB handler chain...
;----------------------------------------------------------------------------
T_chainon: POPM <DS,BX,AX>
JMP DWORD PTR CS:OLD9
ENDPROC
PAGE
;****************************************************************************
; UNLOAD - Unhooks all vectors and exits
;
;
; ENTRY: nothing
;
; EXIT: never exits.
;
; DESTROYED: this program.
;
;----------------------------------------------------------------------------
ASSUME ds:CODE,es:CODE
PNPROC UNLOAD
@RESTORE_VECT 9 FROM OLD9 ;Restore keyboard vector
MOV AX,04C00H ;Exit w/ERRORLEVEL 0
INT 021H
ENDPROC
PAGE
;****************************************************************************
; INSTALL - Installs traps, then runs the program.
;
;
; ENTRY: called on entry to the program
;
; EXIT: starts running main code
;
; DESTROYED: assume ALL but DS
;
;----------------------------------------------------------------------------
ASSUME ds:CODE,es:CODE
PNPROC INSTALL
;----------------------------------------------------------------------------
; install our keyboard hardware interrupt trap
;----------------------------------------------------------------------------
@CHANGE_VECT 9 TO TRAPPER9 SAVEIN OLD9
;----------------------------------------------------------------------------
; continue program execution
;----------------------------------------------------------------------------
JMP START
ENDPROC
MAIN ENDP
;
;****************************************************************************
;
CODE ENDS
END ENTRY`
Book Reviews - February
With the wide assortment of books available for the IBM PC series and the
greatly differing quality some sort of review is desirable before
entering the bookstore. It is all too likely that you will come out
poorer by $100.00 or more. It is also important to purchase a book that
matches your level of experience.
Novice:
This is the most important of the levels. The basic information must be
complete, practical and be presented in a manner that informs without
confusing. The books that accomplish this are few indeed.
8088 Assembler Language Programming: The IBM PC
written by David C. Willen & Jeffery I. Krantz
published by Howard W. Sams & Co., Inc.
This book is a well-written introduction to the 8088 instruction set and
some of the hardware on a standard PC. Has a complete explanation of
hexadecimal & binary numbering systems, an explanation of what assembly
language is and what it's good for. Has chapters on keyboard, joystick,
monitor text modes, sound, interrupts, a bit about file handling and
more. Includes programming examples. Slightly outdated, uses DOS 1
functions and assumes MASM v1.0, but worth the price.
IBM PC-DOS Handbook
written by Richard Allen King
published by Sybex
This is a complementary book to the one above. They really contain different
material and together make a good starting point. This volume deals with the
interface to DOS versions 1 and 2. Designed so that you can focus on
one thing you want to do, and look up everything DOS will do for you
towards that. No programming examples.
Advanced:
These are books that assume a reasonable knowledge of assembly language and
delve deeply into the topics they cover.
Writing MSDOS device drivers
written by Robert S. Lai
published by The Waite Group (Addison-Wesley Publishing Company)
Quite possibly the definitive book on device drivers. Assumes that you
are comfortable with assembly language. Explains device drivers
completely, with lots(!!) of examples. The most in-depth and complete
reference on the subject I've seen.
Includes a Console, Printer, Clock, and RAM Disk driver.
Programmer's Guide to PC & PS/2 Video Systems
written by Richard Wilton
published by the Microsoft Press
The best book I've seen for video. Assumes complete knowledge of
assembly language and the ability to interpret hardware terms.
Unfortunately, the examples are written such that they interface with C,
but that could be easily changed. Has complete information on MDA, HGC,
CGA, EGA, VGA, and MCGA adapters. Includes line, arc, area-fill, and
adapter identification routines to name a few, along with complete port
programming information. A must for graphics programmers.
DOS Programmer's reference
written by Terry R. Dettmann
published by QUE Corporation
The front of this book isn't that impressive (contains basic info about
DOS, BIOS, screen handling, memory etc.) but the last 400 pages are a
VERY impressive reference to all the BIOS interrupts, DOS interrupts
(including more undocumented functions than I've seen anywhere else),
Microsoft Mouse interrupt functions, which aren't documented in the
mouse package anymore, and the EMS interrupt functions (version 3.2).
If you need a good all-in-one reference, this is it.
NOTE: I am positive that I overlooked a number of extremely good books
here. We need you (the readers) to write reviews of books that deal
with assembly language and/or hardware for IBM PC's or any other system.
Since our main work is done on PClones and we don't really have access
to any other sort of system, we need reviews of books for 680x0, 6502,
and whatever else you're using. Send all reviews in ASCII text form to
FidoNet node 143/37. Thanx. - Dave
GUIDE LINES FOR CONTRIBUTORS AND 'ADVERTISERS'
Name and address must be included with all articles and files
Executable file size and percent of assembly code (when available) should
be included when a program is mentioned and is required from an author or
publisher.
Any article of interest to Assembly language programmers will be considered
for inclusion. Quality of writing will not be a factor, but I reserve the
right to try and correct spelling errors and minor mistakes in grammar.
Non-exclusive copyright must be given. No monetary compensation will be made.
Outlines of projects that might be undertaken jointly are welcome. For
example:
One person who is capable with hardware needs support from a user friendly
programmer and a math whiz.
Advertisements as such are not acceptable. Authors and publishers wishing to
contribute reviews of their own products will be considered and included as
space and time permit. These must include executable file size, percent of
assembly code and time comparisons.
Your editor would like information on math libraries, and reviews of such.
Articles must be submitted in pclone readable format or sent E-mail.
Address: Patrick O'Riva
2726 Hostetter Rd
San Jose, CA 95132
Money: Your editor has none. Therefore no compensation can be made for
articles included. Subscription fees obviously don't exist. Publication costs
I expect to be nil (NUL). Small contributions will be accepted to support the
BBS where back issues are available as well as files and programs mentioned in
articles(if PD or Shareware ONLY).
Comments
Post a Comment