................................< .laser .topmargin 1" .bottommargin 1" .margin 1" .; The following rulers work for Times-Roman and Helvetica - 10 point type .font helvetica .point 10 .; Three columns per page (2 1/16") ................................< .; Two columns per page (3 1/16") ..................................................< AAA by SDH NOTE: Alphanso's Assembler Assylum has been running now since December of '85. If you find yourself confused or lost during these "beginning" assembler sessions, refer to the previous AAA's for more details. There are some topics that have been covered previously that are not discussed in detail every month. Tweeking the Terminal Status Word This month's session will explore a few neat tricks you may perform with the Terminal Status Word. You will also be introduced to "bit flipping", talk more about error trapping, and (of course), continue employing MACROs. .hlt bold _Status Words_ In order for AMOS to keep track of each JOB and terminal on the system, status words are maintained down in system memory. Status words are nothing more than a series of bits (usually 16 bits contained in a word), where each bit in the word represents a characteristic or particular "status" of the JOB or terminal. The bits are sometimes refered as "flags". If a certain bit is .hlt italic on, we say the flag is _set_, if the bit is off, we say the flag is _clear_. In this months session, a frequently used status word is going to be modified. This word is the Terminal Status Word. AMOS has a naming convention for flags contained in a status word. This makes it much easier to write programs (and read other's), because the name of each flag symbolizes the function of the flag. Below is a graphic representation of the Terminal Status Word, with the corresponding flag names shown: .;ED - SEE MAC ASSEMBLER FILE:JOBTRM .; and BITS .; in SuperDave's Doodles Disk .;(placement of the pics is documented below) .; .; PLACE THE STATUS WORD PICTURE HERE .; .hlt bold _AND, OR, and COM_ .hlt italic When you want to flip a bit ON or OFF inside a status word, you need to adjust only the bit(s) you want to mess with and leave the other bit(s) alone. The way we do this in computerland is via AND and OR. The best way to understand AND or OR is via graphics (see below). Basically, when you AND a number to an existing value, the number you _AND_ _with_ dictates which bits will be COPIED. Bits that are NOT copied are set to zero. Confusing, so let's look at some pictures: .; AND picture here Unlike AND, OR will SET bits - the number you OR with an existing value will SET the bits you OR - every bit not ORed will be left "as is". If the bit was already set, OR has no effect on the bit (since it is already set!): .;OR picture here Finally, since we are going to use COM in the program example for this month, let's take a look at it. What COM does is flip a value "180 degrees", i.e., 1's turn into 0's, and 0's turn into 1's (COM stands for COMplement): .;COM picture here .hlt bold _On to the Example_ .hlt italic Now that _most_ of the theory has been covered, let's look at a program that employs the above operations. The program is called TRMTST (Terminal Test). TRMTST will demonstrate how to "turn off" keyboard echoing when you need to acquire a "password" or secret data. Before we examine TRMTST line-by-line, one more note: TRMTST also contains a _subroutine_. I am assuming that most of the readers are familiar with subroutines (like from your BASIC programming experiences), so I am not going to go into a heavy theory discussion on subroutines. .; insert TRMTST.T in 300,7 (or 300,5 if I remembered to move it) .hlt bold _Line-by-Line, Byte-by-Byte_ Let's first examine the two MACROs at the top of the source file. _DEFINE NOECHO_ This MACRO is going to set a flag in the Terminal Status Word. For background, the second flag inside the Terminal Status Word is the ECho Suppress flag. If this flag is set, then your terminal will not echo characters back to the screen upon typing. If the flag is clear, then every keystroke you type is displayed (or echoed) on your terminal. _JOBIDX A6_ Get the pointer of the JCB for the JOB running the program and place this pointer into A6. _MOV JOBTRM(A6),A1_ Add the offset JOBTRM to the pointer contained in A6, and then MOVe the longword pointed to by this result into the address register A1. This move will place in A1 a pointer to the JOB's Terminal Status Word. In other words, A1 now points to the Terminal Status Word for the JOB running the program. _ORW #T$ECS,@A1_ OR the Word value of #T$ECS with the value pointed to by A1. The result is stored in the memory location that A1 points to. Notice the naming of the flag: T$ECS. This should somehow remind you of '_T_erminal - _EC_ho _S_uppress'. The value of #T$ECS is the #2 (remember, the second bit). This ORW will set bit 2 in the Terminal Status Word and leave every other bit untouched (or "as is"). This has the effect of suppressing all keyboard echoing. If you are confused, draw a picture similar to the examples presented above and notice how the second bit will be set from the ORW. _DEFINE ECHO_ This MACRO will clear a bit in the Terminal Status Word, the T$ECS flag. _MOVW #T$ECS,D4_ MOVe the Word value of #T$ECS to the data register D4. The value #T$ECS is a #2 (it is the 2nd bit in the status word, which is equivalent to #2). _COMW D4_ COMplement the Word contained in register D4. Remember, complement converts 1's to 0's and 0's to 1's. So before this instruction, D4 contains a binary value of 0000000000000010, and afterwords, D4 contains 1111111111111101. _ANDW D4,@A1_ .hlt italic Finally, AND the value pointed to by A1 with the value contained in D4. Notice that every bit in the word pointed to by A1 (the Terminal Status Word) will be left alone _except_ the 2nd bit - the T$ECS flag. This bit will _not_be copied, it will be set to zero or "cleared". This has the effect of turning echo back on. .hlt bold Now let's take a look at some of the instructions contained within the main body of the program. _TYPECR_ _TYPECR _ _TYPECR _ _KBD_ .hlt key .blank | These three lines don't need much explaination. The first three lines display the function of the program, and the KBD line waits for user input. KBD waits for a _|RETURN|_ before continuing with the rest of the program. Register A2 will be pointing to the first character of the line entered. We have learned that this location is down in system memory - AMOSL.INI created this location via the TRMDEF statement (buffer portion). .hlt bold _CTRLC BYEBYE_ .hlt key .blank | If by chance a user doesn't want to see the workings of this fantastic program and hits a _|cC|_,the program would then jump to the instruction line labeled by BYEBYE. .hlt bold _TYPECR_ _TYPECR _ _CALL TYPLIN_ Two more lines of general screen output, and then a subroutine call. The subroutine TYPLIN (for Type Line) will be executed, and upon completion of the subroutine, the program will continue execution on the line below the CALL instruction line. TYPLIN simply types out a line pointed to by A2 - see AAA, Feb '86 for details if you are fuzzy about input via KBD. _TYPECR_ _TYPECR _ _TYPECR _ Similar to the above three lines at the top of the main program. _NOECHO_ This is the MACRO call to NOECHO. This has the effect of generating the code contained within the NOECHO MACRO. Notice that this is the first time a MACRO with no arguments has been used - yes, it is legal. The other effect (already discussed) is that the ECHO will be turned off. _KBD_ _CTRLC BYEBYE_ .hlt key .blank | Similar to the above KBD and CTRLC instruction lines above. Notice that even though the echo is suppressed at this time, KBD acts "normally" and expects a _|RETURN|_ when the input line is complete. Special note of the CTRLC BYEBYE instruction line. If you look ahead in the source file, you will discover that if a _|cC|_ is hit at this time in the program, TRMTST never "resets" the Terminal Status Word back to "normal". This is because each time you exit a program, AMOS will do this for you! .hlt bold _ECHO_ _TYPECR_ _TYPECR _ _CALL TYPLIN_ Inform the user that the computer still "sees" the data even though the user of the program does not. Also reset the terminal status word with the MACRO ECHO. Finally, type out the line of entered text with the TYPLIN subroutine. _EOLN: TYPECR_ _BYEBYE:EXIT_ When the entire suppressed input line is typed out except for the CRLF, simply type out the CRLF, and EXIT the program. _Wrapping Up_ .hlt key .blank | One item to note: AMOS will normally "upper case" all input via the KBD line. If you haven't noticed this, try TRMTST with lower case input - you will see your input echoed back to the screen in upper case letters! There is a flag in the Terminal Status Word that informs AMOS to pass lower case letters. See the diagram of the Terminal Status Word above for details. You should be able to set this flag after reading and understanding this months session. Well, that does it for this month. Next month, more of the same, but we will learn how to "clear out" _|cC|_ from within a program and not exit back to AMOS, plus (if possible), learn how to generate some ASCII constants from within the program. If you would like to see a particular function or trick discussed, send Email or call. See you next month. .