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

Popular posts from this blog

BOTTOM LIVE script

Evidence supporting quantum information processing in animals

ARMIES OF CHAOS