......................................................................... .; >>>>> Please put the title here <<<<< .laser .topmargin 1" .margin 1" .bottommargin 1" .hlt bold .; pick one of the fonts, and comment out or erase the one you don't want .;font helvetica .font times .point 9.4285 .leading 1 .; The following rulers work for Times-Roman and Helvetica .; Three columns per page (2 1/16") ..................................< .; Two columns per page (3 1/25") ......................................................< AAA BY SDH .hlt bold _Displaying System Date and Time_ Hello assemblers! Welcome to the 12th submission of the AAA! This month we will cover quite a few new tricks. We will learn a simple method on how to access the system date and time and display this information to the screen. We will also cover employing some pre-supplied subroutines that AMOS provides for us, and even learn how to access them during assembly. Let's get started. _Using a System Library Routine_ AMOS supplies us assemblers with some standard .hlt italic _library_ routines that we may access. One of these .hlt bold routines (think subroutine) will output the system date and time for us, and is labeled _$ODTIM_ (_$_ystem call _O_utput _D_ate and _TIM_e). Just as we have written short subroutines in earlier AAA programs and then used "CALL ROUTINE", we can _CALL $ODTIM_ - even though the library routine's code is not contained within our program. Remember in the December '86 AAA we created a subroutine called MENU that typed out a menu to the screen and waited for user input. When we accessed this subroutine, we just placed in the code _CALL MENU_. Further down in the code was our routine marked with the label MENU:. This is how the assembler figured out where to get the next instruction(s). When the MENU routine was finished, we returned to the line below the _CALL_. When you use a library routine like $ODTIM, you still have the line of code _CALL $ODTIM_, but you do _not_ have a label $ODTIM:! AMOS will execute the code contained in $ODTIM and then return you to your program. However, how does AMOS know where to get the instructions contained in $ODTIM? The procedure is twofold. 1) You must first place in a line of code at the top of your program that looks like this: _AUTOEXTERN_. This line informs the assembler that any CALL or LABEL that it can't find from within the source code must exist "externally". In other words, $ODTIM exists externally to the file. Since there is some source code "missing", the assembler cannot create a .LIT file (the dot command). Therefore, the assembler only gets through Phase 2 of assembly, and creates an .OBJ file. 2) To "link" up the external label or CALL with our .OBJ file from (1) above, you use the _.LNKLIT_ command. LNKLIT has many forms, but for library routines, the format is _.LNKLIT object program name_. This command will then take our .OBJ file from (1) above and link in the external library code, creating our desired dot (.LIT) command. Simple enough, no? _Format of $ODTIM_ The subroutine $ODTIM has many different formats. Again, this routine will display the date and time for us, but the display has many different looks. Below is the calling setup for $ODTIM. It requires registers D3, D4, D5, and A2 to be set up according to the desired format you would like to see the time and/or date displayed: _D3_ : if 0, use system time and system date, egnor D4. If non-zero, D3 contains the date you would like displayed. _D4_ : if D3 is zero, D4 is egnored, else D4 holds the time you would like displayed. _D5_ : contains "flags" (set bits). Each of the first 16 bits (lower word) of D5 represent flags to dictate $ODTIM's output (see the diagram below for each flags purpose). A special case exists if D5 contains a "-1". If D5 contains a -1, the output looks like this: .center Friday, February 20, 1987 02:15:53 PM _A2_ : if non-zero, the date and/or time is returned to the memory location pointed to by A2. If you do not want the output to go to a memory location, make sure A2 contains a zero. .;ED - INSERT FROM SUPER DAVES DOODLES "TIME BITS" HERE _Time for an Example Program_ Let's employ the $ODTIM call in a simplified clock program. Below is a program called CLOCK. This program will display the current day to us and then continually update the time of day. Here is CLOCK: .;ED, PROGRAM IS CALLED CLOCK.M68[300,7] _Line-by-Line, Byte-by-Byte (partial)_ SEARCH AAA. This is a non-AMOS universal file that we have been using over and over. This file contains all of our slick MACROs that we have created over the series. This universal file is in the Assembler PPN on the Network [100,133] and is also listed in the January '87 AAA. Once we SEARCH this file, we may use any or all of the MACROs contained within. .; AUTOEXTERN This informs the assembler that there is some source code external to this file, and LNKLIT will need to be performed. .; DEFINE CLEAR = PRTTAB -1,0 DEFINE CUROFF = PRTTAB -1,29. DEFINE CURON = PRTTAB -1,28. This is really slick. Since AAA.UNV from our SEARCH above contains the MACRO "PRTTAB" (which is just like PRINT TAB (#,#) from within BASIC), we can create "new" MACROs by employing the already defined PRTTAB MACRO. This is a very nice feature of the Alpha Micro assembler, and it definately makes your programs really easy to read. .; CLR D3 MOV #0,A2 This is where we setup $ODTIM's input parameters. Since D3 contains a zero, we will be using the current system time and date (and D4 will be egnored). Also, since the output will be to the terminal, A2 must contain a zero. .; MOV #^H000002F6,D5 Move the 32 bit HEX value (#^H) 2F6 to register D5. This is where we "set our flags". The binary equivalent for HEX 2F6 is 00000000000000000000001011111010. This flag setting will produce the following using $ODTIM (assuming the date is 02/20/87): .center Friday, February 20, 1987 To see this, take the lower 16 bits of the above binary equivalent and place these bits in the above diagram. (If you are confused between binary, hex, and octal, get a program called _CONVRT.BAS_ off the Network, PPN [100,101]. This program lets you enter in any number and see all the equivalents of every base. Also See the November '85 Heyliger's Highlights). .; CLEAR CUROFF PRTTAB 3,20. TYPE <Today is > The above four lines clear the screen, turn off the cursor, tab to row 3, column 20, and type out the message contained in the <..>. Notice how the 3 MACROs above make for real easy programming! .; CALL $ODTIM Here is our library routine call. This will cause the $ODTIM routine to be executed and then after execution, AMOS will return control to our program on the next line below this CALL. .; PRTTAB 5,25. TYPE <Current time is: > CTC These three lines will first move the cursor to row 5, column 25, type out the message contained between the <...>, and then "set" control C (just in case this wasn't set before the user ran CLOCK). .; CLR D3 MOV #H^00004801,D5 These two lines will set up $ODTIM to type out the time to the users terminal in the following format: .center hh:mm:ss AM/PM The HEX value 4801 has the 32 bit binary equivalent of 00000000000000000100100000000001. See if you can place the lower 16 bits of this number into the diagram above to understand the flag settings! .; CTRLC BYEBYE PRTTAB 5,42. CALL $ODTIM SLEEP #5000. The above for lines are repeated over and over again until the user hits a cC. The CTRLC line informs AMOS to JMP to the label BYEBYE when a user hits a cC. The PRTTAB line will place the cursor at the end of the "Current time is: " line, then the $ODTIM call will type out the time of day for us. The SLEEP instruction will cause the JOB to sleep for 1/2 second, at which time the above four lines will be executed again. The only way out of this infinate loop is via cC. .; CURON CLEAR EXIT END Finally, CURON will cause the cursor to be turned back on, CLEAR will clear the screen, and EXIT will place you back at the dot. END informs the assembler that there is no more source code for this file. _A Wrap_ Not bad! This assembly stuff is getting easier and easier, isn't it? When you assemble this program, remember that the assembler will only go through Phase 2 (assuming no errors). Once Phase 2 is complete, enter in _.LNKLIT CLOCK_. This will create CLOCK.LIT. Remember, you may order a compiled version of the first 10 AAA's for only $10.00 via AMUS, so don't delay. Have fun with CLOCK, and I'll see you next month or at AMUS '87.