home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.tar / ftp.whtech.com / Geneve / 9640news / CAT14 / SBUGMC.ARK < prev    next >
Text File  |  2006-10-19  |  16KB  |  283 lines

  1. ?
  2. Using SBUG to DEBUG your Assembly Programs
  3.  
  4.     This tutorial will describe how to use the TI SBUG program to debug your
  5. assembly language programs. Although specificly written for SBUG the principles
  6. apply to the other debugers on the market. As I am sure you have already
  7. discovered, the familiar error messages and helps are not available from
  8. Assembler that you are accustomed to from BASIC.  I know many of you have typed
  9. in my first tutorial or used one of the beginning assembly language books on
  10. the market and had difficulty getting the program to run properly.  Take heart,
  11. we all had the same problems when we were learning and until you master the use
  12. of one of the debuging programs your you can pull your hair out and may
  13. eventually give up.
  14.     As I have already mentioned there are several very good debug programs
  15. available for the TI. Here they are briefly. DEBUG is the program supplied with
  16. your editor assembler cartridge.  It has many helpful features particularly the
  17. ones that allow you to set CRU bits, move memory, and compare memory. My main
  18. criticism of DEBUG is it's inability to single step through instructions.
  19. BUGOUT written by Gregg Wonderly is also very good. It offers multiple fields
  20. of information on the screen at the same time. Many advanced features like
  21. dumping to disk. Without a doubt the most advanced that I have used. My main
  22. criticism is that it maps the VDP to text mode which interferes with VDP
  23. mapping for the screen image table and color table if you need to inspect these
  24. locations in your program.  The one I use the most is SBUG. This is the super
  25. debuger released by TI to users groups after the pull out. If you need a copy
  26. I'll upload it to access.  SBUG allows you to operate from graphics or bit map
  27. mode, single step, and output to printer or disk.  Let's get down to how to use
  28. it.
  29.     First you should print out the instructions supplied with SBUG on the disk.
  30. Since this is a display/variable 80 file you may print it out with TI-Writer or
  31. Editor/Assembler editor.  This help file covers all of the instructions
  32. available. I intend to cover only the ones of greatest interest to us.
  33.     It's important to know where your assembly program loads into memory.  With
  34. some few exceptions which won't be discussed now, your program will load into
  35. high memory expansion at >A000.  That's the first address in high memory. You
  36. can make your program load in other places but that is beyond the scope of this
  37. tutorial. SBUG is what we call relocatable object code. It loads on top (not
  38. over) of the last program entered. In other words, if your program is 500 bytes
  39. long it would load from >A000 to >A500. SBUG when loaded will load beginning at
  40. >A502.
  41.     I've included a brief program in this tutorial which puts characters on the
  42. screen. We'll use it to illustrate how to use SBUG. Go ahead at this time and
  43. type it in using the editor, save it, load the assembler except this time at
  44. the LIST FILE NAME prompt enter your printer description. Remember if you are
  45. using a PIO printer it should be entered with a period following PIO. At the
  46. OPTIONS prompt enter RLS. R to tell the assembler that you used R in front of
  47. your registers in the source code, L to give you a source listing to your
  48. printer, and S to give you a table of the symbols you used. This source list is
  49. necessary for using SBUG effectively.
  50.     Let's examine the source listing columns for a moment. Here's an example
  51. line from the source listing:
  52.  
  53. 0049 006C 0201      LI  R1,>5500
  54.      006E 5500
  55.  
  56. Here's what that tells us. 0049 means this statement is number 0049 in our
  57. source code. That means if we received the message invalid register in line
  58. 0049 when we were assembling the code we could look at line 0049 and see what
  59. was wrong with R1. The next field over is the most important one to us when
  60. using SBUG. This gives us the exact location in memory where this instruction
  61. resides. If this was the first program you loaded into memory then this
  62. instruction would reside at >A06C. Remember I told you that the program loads
  63. at >A000 by default? In other words >A000 plus >006C=>A06C.  We'll come back to
  64. this field shortly.  The next field >0201, is the machine language mnemonic for
  65. Load Immediate (LI). Look on page 5 of your blue editor/assembler card. See the
  66. opcode >0200? This tells us the instruction for this OPCODE is LI. The 1 in
  67. >0201 tells us to load immediate R1 with the value in the next word of memory.
  68. In this case Load Immediate R1 with >5500.  See how easy that is? For a
  69. detailed description see section 15.4 in the E/A manual.
  70.     We're ready to get down to business. First load the object code for the
  71. program I have given you into the computer. You should *always* load your
  72. program before you load SBUG. Next before you press enter after you have loaded
  73. the demo program load SBUG. One note here. As long as you are not using the X/B
  74. cartridge to load with, it is much faster to load the compressed version of
  75. SBUG or SBUGC as it is listed on your disk. Both do the exact same job. Press
  76. enter and for the program name enter SBUG. The SBUG title screen should come
  77. up. The message on the screen will ask you if you are using a bit map screen?
  78. Enter N at this prompt.  Next you will be asked for your list device. Enter
  79. your printer description here (you could enter DSK1.FILENAME instead if you
  80. wanted output to disk). The input prompt is a '.' . At the prompt enter L to
  81. turn off the list device. Our program runs from SBUG's control so we need to
  82. set up SBUG to run our program so we may interact with it. To do this we must
  83. tell SBUG where the first executable instruction (entry point) to our program
  84. is and what address we are using for a workspace.  You may remember there are
  85. three hardware registers used by the 9900 CPU in the TI-99. These are the
  86. program counter, workspace register, and status register. The program counter
  87. always points to the next instruction to be executed in memory. The workspace
  88. register points to the current 32 bytes (16 words) of memory we are using for
  89. workspace. The status register contains the current status of the computer as a
  90. result of the last instruction executed. Given that, we now need to find the
  91. entry point to our program.  There are two basic ways to do this.  Perhaps the
  92. easiest is to look on the source listing at the label (in the example program
  93. START) we placed in the DEF statement at the beginning of the program and get
  94. the address directly from the source listing. The alternate way is to use the M
  95. command of SBUG to examine memory. The memory we need to examine is the
  96. Reference/Definition (REF/DEF) table approximately from >3F30 to >4000. This
  97. table lists the entry point to the program and the utilities we referenced.
  98. Here's how to examine this table.
  99. M 3F30,3FFF  <enter>
  100. This command will scroll the contents of these memory locations to the screen.
  101. In this case we are looking for the program name which is START. When you see
  102. START press any key to stop the scroll. You should see a line of memory which
  103. looks like:
  104.  
  105. 3F30=5354 4152 5420  START
  106. 3F36=A058 .... ....
  107.  
  108. Press FCTN X to abort the listing or any command. Since labels may be up to 6
  109. characters (bytes) long, the seventh and eighth bytes contain the program entry
  110. point.  In this case >A058. This should be the same address on the source
  111. listing.  *Remember* SBUG always displays and only accepts HEX numbers.
  112.     Next we need the workspace address.  We obtain that from the source
  113. listing.  In this case it is >A05C. We get this by finding the label for our
  114. workspace, in this case WS. We look at the second column and there is the
  115. beginning of the workspace.
  116.     We're now ready to set up the hardware registers to run our program.  We do
  117. this by entering a R at the prompt. SBUG responds with W=0000. W is the
  118. workspace address. In this case type A05C and press the <space bar>.  That
  119. calls up the prompt P=0000 for program counter address which in this case is
  120. A058. If you press space again you could set the status register but this is
  121. unnecessary in this case so just press enter. We've now told SBUG where our
  122. program resides in memory and where the workspace is.
  123.     To make it easy to figure the offset of our instructions we have a bias
  124. command. Press X and the computer displays 0000 press A000 <enter>.  This sets
  125. the value of X to >A000. Now let's get down to examining our program in memory.
  126. To do this we set breakpoints (just like BASIC) at the instruction where we
  127. want to stop.  Ready to set one? At the prompt press B 68X <enter>.  This
  128. automatically adds the A000 offset to the instruction at 0068. You could have
  129. just entered it as B A068 if you wanted to add the offset yourself.  This tells
  130. SBUG to interrupt the program before it executes LI R0,>390.  See where I got
  131. that? Look at the second column on your source listing and go down it until you
  132. find memory location 0068. Now if you want to see where your current
  133. breakpoints are press B <enter>. Now to execute the program up to that
  134. instruction press E <enter>. The screen will show three addresses across the
  135. screen. From left to right they are the workspace address, program counter
  136. address, and status register. Now we're ready to single step through some
  137. instructions.  Enter S for single step at the prompt.  This displays the
  138. following:
  139. A068=0200  LI R00,>0390
  140.  
  141. A068 is the memory address for the instruction. Remember what 0200 is? LI R0.
  142. Then there is the plain text instruction. What value should be in R0? >0390 of
  143. course. To check this press W 0 <enter>. This shows the current contents of R0.
  144. If you ever have the need you may change this value by entering another value
  145. before pressing enter. If you press the space bar you see the next register R1
  146. and so on. One important point. Never try to single step thru VDP, GROM, or
  147. KSCAN routines.  There is a good chance you will lock up the computer. When you
  148. encounter one of these instructions just set a breakpoint (B) on the other side
  149. of it and execute (E) around it.  Now press B 80X or B A080 <enter> at the
  150. prompt.  This sets the breakpoint at the INC R0 instruction.  Press E <enter>.
  151. What's the value in R0? It should be >383 from instruction >A082.  Now press S.
  152. The INC R0 instruction appears. Again check the value in R0 (remember W0), it
  153. should be >384.  See how you may interact directly with the computer? Press S
  154. again and you see the CI instruction.  Press S again and you get:
  155. JNE      $+>00FA
  156.    JMP TO A07C
  157. This says to jump to A07C (LOOP2) if R3 is not equal to zero. Now set B A0CE.
  158. Press E <enter> to execute. The program stops at the MOV @SAVRTN,R11
  159. instruction. Let's examine some VDP RAM. To do this we use the M command again
  160. but proceed the address with a V for VDP access. Press M V168,1AF . This shows
  161. the screen image table from decimal 360 to 431 where we put our text and ball.
  162. Examine the bytes carefully and you should see the border characters. Note: The
  163. screen is not exactly as we had it because SBUG shares the same screen with us
  164. and we're seeing some of SBUGs screen also.  Now press M VBF8,C00 <enter>. This
  165. is the pattern descriptor table where the shape of our ball is stored. Compare
  166. it with PATRN from the source listing and ten press M A022,A028 to see the
  167. pattern description as it resides in CPU RAM.
  168.     Well I've gone long again but there is so much to cover. You really need to
  169. get the hang of using SBUG, it allows you to interact with your program to see
  170. exactly what is going wrong when you have a problem. It will save you many
  171. hours of grief.
  172.  
  173. *****************************************
  174. *                                       *
  175. * This program accompanies tutorial #4  *
  176. *   on using SBUG. It also shows you    *
  177. *   how to redefine characters, place   *
  178. *   them on the screen, and change the  *
  179. *   color of each character set         *
  180. * Entry Point -> START                  *
  181. * Must be run from E/A or MM Load & Run *
  182. * R0-R2 Used for general VDP access     *
  183. * R3 Used as a general purpose counter  *
  184. * R11 contains the return address on    *
  185. *     entry.                            *
  186. *                                       *
  187. *****************************************
  188.  
  189.        DEF  START        DEFINE THE ENTRY POINT OF THE PROGRAM
  190.        REF  VMBW,VSBW,VWTR SYSTEM UTILITIES WE WILL USE
  191.  
  192. * DATA STATEMENTS *
  193.  
  194. SAVRTN DATA 0            SET ASIDE A WORD OF MEMORY TO SAVE THE RETURN ADDRESS
  195. BORDER DATA >8080,>2020,>2020,>2020 CHAR >80 WILL BE OUR BORDER
  196.        DATA >2020,>2020,>2020,>2020
  197.        DATA >2020,>2020,>2020,>2020
  198.        DATA >2020,>2020,>2020,>8080
  199. PATRN  DATA >3C7E,>FFFF,>FFFF,>7E3C
  200.  
  201. STATUS EQU  >837C        LOCATION OF THE GPL STATUS BYTE
  202. *                        THIS EQUATES THE LABLE STATUS TO THIS ADDRESS
  203. WS     BSS  >20          SET ASIDE 32 BYTES OF MEMORY FOR OUR WORKSPACE
  204.  
  205. MSG    TEXT 'THIS IS A TEST' 14 BYTES LONG
  206.        EVEN              FORCES THE PROGRAM COUNTER TO AN EVEN MEMORY ADDRESS.
  207. * AS A GENERAL RULE ALWYS USE EVEN AFTER THE LAST BYTE, BSS, OR TEXT OPCODE.
  208.  
  209. START  MOV  R11,@SAVRTN  MOV THE ADDR IN R11 TO THE WORD OF MEMORY AT SAVRTN
  210.        LWPI WS           TELL THE HARDWARE WORKSPACE REGISTER WHERE YOUR WS IS
  211.  
  212. *--PUT A BLUE BORDER AROUND THE SCREEN--*
  213.  
  214.        LI   R0,>0705     07 IS VDP REG 7 OR THE SCREEN BACKGROUND COLOR
  215.        BLWP @VWTR        05 IS THE BACKGROUND COLOR. (LT BLUE)
  216. * THIS SETS THE TOP AND BOTTOM OF THE SCREEN TO LT BLUE.
  217. * SEE SECTION 16.1 E/A MANUAL FOR MORE INFORMATION ON VWTR.
  218.  
  219. * NOW SET CHAR >80 (128 decimal) TO A BLUE ON BLUE SQUARE
  220.        LI   R0,>390    THIS IS THE POS IN VDP RAM COLOR TABLE FOR CHARS >80->87
  221.        LI   R1,>5500   BLUE FOREGROUND/BACKGROUND IN MSB OF R1
  222.        BLWP @VSBW      REMEMBER R0 ALWAYS IS THE ADDR IN VDP. R1 ALWAYS CPU.
  223. * SEE SECTION 21.2.2 FOR MORE INFORMATION ON THE COLOR TABLE
  224.  
  225. * NOW LET'S MAKE ALL THE CHARACTER SETS BLACK ON WHITE
  226.  
  227.        LI   R0,>383      START WITH CHAR SET >18
  228.        LI   R1,>1F00     1=BLACK FG, F=WHITE BKGND
  229. LOOP2  BLWP @VSBW
  230.        INC  R0           POINT TO NEXT VDP RAM COLOR TABLE ADDRESS
  231.        CI   R0,>390      LAST COLOR TABLE ADDRESS (CHARS >78->7F)
  232.        JNE  LOOP2
  233.  
  234. * NOW WRITE THE BORDER TO THE SCREEN AND CLEAR THE SCREEN AT THE SAME TIME
  235.  
  236.        LI   R3,24        24 ROWS TO WRITE
  237.        CLR  R0           BEGINNING OF SCREEN IMAGE TABLE
  238.        LI   R1,BORDER    ADDRESS OF ONE ROW OF BORDER DATA
  239.        LI   R2,32        32 BYTES TO WRITE
  240. LOOP   BLWP @VMBW        WRITE A ROW
  241.        AI   R0,32        POINT TO BEGINNING OF NEXT ROW
  242.        DEC  R3
  243.        JNE  LOOP
  244.  
  245. * NOW WE'LL PUT THE MESSAGE ON THE SCREEN CENTERED
  246. * REMEMBER THAT THE SCREEN IMAGE TABLE IS FROM 0 TO 767 IN VDP RAM
  247. * TO DETERMINE THE ADDRESS FROM ROW AND COLUMN WE USE THE FOLLOWING FORMULA
  248. * ADDR=((ROW-1)*32)+(COLUMN-1) IF WE WANT OUR MESSAGE AT ROW 12 COLUMN 9 THE VDP
  249. * ADDRESS WOULD BE 360
  250.  
  251.        LI   R0,360       VDP ADDRESS IN SCREEN IMAGE TABLE
  252.        LI   R1,MSG       ADDRESS OF THE DATA IN CPU RAM
  253.        LI   R2,14        14 BYTES LONG
  254.        BLWP @VMBW        WRITE IT TO THE SCREEN
  255.  
  256. * NOW SUPPOSE WE WANT TO MAKE CHAR >7F A BALL SHAPE AND PLACE IT UNDER THE TEXT
  257. * THE PATTERN TABLE IN E/A IS LOCATED AT >0800. TO CALCULATE THE LOCATION OF A
  258. * PARTICULAR CHARACTER MULTIPLY IT'S HEX VALUE BY 8 AND ADD THE RESULT TO >800.
  259.  
  260.        LI   R0,>0BF8     (>7F*8)+>800=>BF8
  261.        LI   R1,PATRN     PATTERN TO DEFINE >81 TO FROM CPU RAM
  262.        LI   R2,8         PATTERNS ALWAYS 8 BYTES
  263.        BLWP @VMBW        >81 IS NOW THE SHAPE OF A BALL
  264.  
  265.        LI   R0,431       SCREEN IMAGE TABLE TWO ROWS BELOW TEXT CENTERED
  266.        LI   R1,>7F00     WRITE >81 (BALL) TO THE SCREEN
  267.        BLWP @VSBW        PUT IT UP
  268.  
  269. * EXPERIMENT WITH THIS PROGRAM UNTIL YOU ARE COMFORTABLE WITH VDP RAM ACCESS
  270.  
  271.        MOV  @SAVRTN,R11  RESTORE R11 TO THE ADDRESS YOU WISH TO RETURN
  272.        LIMI 2            ENABLE INTERRUPTS SO QUIT KEY WILL WORK
  273.        JMP  $            LOCK UP THE COMPUTER (SAME AS 100 GOTO 100)
  274.        RT
  275.        END
  276.  
  277.  
  278.  
  279.  
  280. Download complete.  Turn off Capture File.
  281.  
  282.  
  283.