home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-02-21 | 50.0 KB | 1,281 lines |
-
-
-
- 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).
-
-
-
-
-
-
-
-