home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tcom / debugger / memedit.seq < prev    next >
Text File  |  1989-10-05  |  7KB  |  177 lines

  1. \ Memory editor                                 Mike Mayo 9/13/89
  2.  
  3. decimal
  4.  
  5. : %mec! ( d a -- ) \ a byte store analogous to the default byte
  6.                    \ fetch of DUMP ; for use by memory editor
  7.         dumpseg @ swap c!L  ;
  8.  
  9. \ these deferred words allow the editor to be patched for editing
  10. \ memory in some target processor's environment
  11. defer mec!      ' %mec! is mec!     \ the word for storing a changed location
  12. defer medump    ' dump is medump    \ the dump utility to use
  13. defer medln     ' dln is medln      \ the one-line part of the dump utility
  14. 2 value nwidth                      \ 2 for byte-wide, 4 for word-wide
  15.  
  16. 0 value 0address        \ address of start of editing area
  17. 0 value 0dataY          \ screen row of first data line
  18. 0 value datalength      \ length of area to edit
  19. 0 value addr+           \ address offset into editing area
  20.  
  21. : set-attrib ( attrib -- ) \ dig into video memory and poke attrib
  22.                            \ into the attributes for the current location
  23.         video-seg @
  24.         addr+ 16 /mod swap  nwidth 2 <> if 2/ then
  25.         nwidth 1+ * 12 +  2*  \ x
  26.         swap  0dataY + 160 *  \ y
  27.         +      ( rev-attrib video-seg video-offset )
  28.         nwidth 2 <> if  3dup 5 +  3dup c!L  2+ c!L  then
  29.         1+ 3dup c!L  2+ c!L  ;
  30.  
  31. : cur>rev ( -- ) \ reverse video the current location
  32.         >attrib4 attrib c@ set-attrib >norm ;
  33. : cur>norm ( -- ) \ normal video the current location
  34.         >norm attrib c@ set-attrib >norm ;
  35. : cur>bold ( -- ) \ bold the current location
  36.         >attrib3 attrib c@ set-attrib >norm ;
  37.  
  38. : curat ( -- ) \ place the cursor on the current byte or word
  39.         cur>rev  cursor-off
  40.         base @
  41.         0 datalength 16 / 0dataY + 1+ at
  42.         ." Edit location " addr+ 0address + hex >attrib3 5 u.r space >norm
  43.         base !
  44.         addr+ 16 /mod swap  nwidth 2 <> if 2/ then
  45.         nwidth 1+ * 12 + swap  0dataY + at  ;
  46. : curhome  ( -- ) \ move the cursor to the left side
  47.         cur>norm  addr+ $0fff0 and =: addr+  curat ;
  48. : curend   ( -- ) \ move the cursor to the end of the line
  49.         cur>norm  addr+  $0f nwidth 2 <> if 1- then or  =: addr+  curat ;
  50. : ^curhome  ( -- ) \ move the cursor to the top left
  51.         cur>norm  off> addr+ curat ;
  52. : ^curend   ( -- ) \ move the cursor to the bottom right
  53.         cur>norm  datalength 1- nwidth 2 <> if 1- then  =: addr+  curat ;
  54. : redump ( -- ) \ redo the data display
  55.         0  0dataY 2- 2-  at  0address datalength medump  curat ;
  56. : pgup ( -- ) \ page up scrolls the window 1 line
  57.         -16 +!> 0address  redump  ;
  58. : pgdn ( -- ) \ page down scrolls the window 1 line
  59.          16 +!> 0address  redump  ;
  60. : ^pgup ( -- ) \ control page up scrolls the window 8 lines
  61.        -128 +!> 0address  redump  ;
  62. : ^pgdn ( -- ) \ control page down scrolls the window 8 lines
  63.         128 +!> 0address  redump  ;
  64. : curleft  ( -- ) \ move the cursor one byte to the left, with scroll
  65.         cur>norm  nwidth 2 <> if  decr> addr+  then  decr> addr+
  66.         addr+ 0< if  8 +!> addr+ pgup curend  else  curat  then ;
  67. : curright ( -- ) \ move the cursor one byte to the right, with scroll
  68.         cur>norm  nwidth 2 <> if  incr> addr+  then  incr> addr+
  69.         addr+ datalength >= if  -8 +!> addr+ pgdn curhome  else  curat  then ;
  70. : curdown  ( -- ) \ move the cursor one line down, with scroll
  71.         cur>norm  addr+ 16 +
  72.         datalength >= if  pgdn  else  16 +!> addr+ curat  then ;
  73. : curup    ( -- ) \ move the cursor one line up, with scroll
  74.         cur>norm  addr+ 16 -
  75.         0< if  pgup  else  -16 +!> addr+ curat  then ;
  76.  
  77. create metib 7 allot    \ buffer for keyboard input used by CHANGE
  78.  
  79. : change ( -- ) \ change data at the current location
  80.         cur>bold
  81.         base @ >r
  82.         0 datalength 16 / 0dataY + 2+ at
  83.         ." Key in HEX number then press <enter>"
  84.         ." \s04( just press enter to leave unchanged )"
  85.         >attrib3
  86.         0 datalength 16 / 0dataY + 1+ at
  87.         ." Change data at "  0address addr+ + hex u. ." to > "
  88.  
  89. \ get a new value
  90.         cursor-on  metib 6 blank
  91.         1 metib c!
  92.         #out @  #line @  metib  6  lineeditor
  93.         if
  94.                 metib c@
  95.                 nwidth <= if    metib ?uppercase number? nip
  96.                                 if    0address addr+ + mec!  true
  97.                                 else  drop false
  98.                                 then
  99.                           else  false
  100.                           then
  101.         else
  102.                 false
  103.         then
  104.         0= if ."    No change \:08"  then
  105.         >norm
  106.  
  107.         0 #line @ at 79 spaces   0 #line @ 1+ at 79 spaces
  108. \ redisplay the line containing changed data
  109.         curat  0 #line @ 1- at
  110.         0address addr+ $fff0 and +  medln
  111.  
  112.         addr+ datalength 1- nwidth 2 <> if 1- then
  113.         < if  curright       \ move the cursor to the next data location
  114.           else  curat  then  \ unless it is the last one on the screen
  115.         r> base !  ;
  116.  
  117. : mem-edit ( a l -- )
  118.         ." \d\4 Memory editor: \n"
  119.         ." \4   [Cntrl] Home End  keys move cursor \0  "
  120.         ." \4 [Cntrl] Page keys move window \n"
  121.         ." \4 <enter> to alter data at cursor \0\s11\4 <esc> when done "
  122.         #line @ 4 +  =: 0dataY
  123.         255 umin 10 max
  124.         dup 16 mod 0<> if  $0f or 1+  then \ length always 16n
  125.         2dup  =: datalength  =: 0address
  126.         medump             \ display the data to be edited
  127.         off> addr+  curat  \ and place cursor at the top left
  128.         begin
  129.                 key case   \ handle editing keystokes
  130.                 203 of  curleft    0    endof   \ left
  131.                 205 of  curright   0    endof   \ right
  132.                 200 of  curup      0    endof   \ up
  133.                 208 of  curdown    0    endof   \ down
  134.                 13  of  change     0    endof   \ enter, to change byte
  135.                 199 of  curhome    0    endof   \ home
  136.                 207 of  curend     0    endof   \ end
  137.                 247 of  ^curhome   0    endof   \ control home
  138.                 245 of  ^curend    0    endof   \ control end
  139.                 201 of  pgup       0    endof   \ page up
  140.                 209 of  pgdn       0    endof   \ page down
  141.                 132 of  ^pgup      0    endof   \ control page up
  142.                 246 of  ^pgdn      0    endof   \ control page down
  143.                 ^[  of             -1   endof   \ esc, to exit
  144.                 drop 0  endcase
  145.                 until
  146.         cur>norm
  147.         0 0dataY 4 - at 79 spaces         \ blank out top lines
  148.         0 0dataY 5 - at 79 spaces
  149.         0 datalength 16 / 0dataY + 1+ at  \ place cursor below dump box
  150.         79 spaces  0 #line @ at           \ and blank that line
  151. \ now restore deferred words and values
  152. \ to the defaults for editing local bytes
  153.         ['] %mec! is mec!       ['] %dumpc@ is dumpc@
  154.         ['] dump is medump      ['] dln is medln
  155.         2 !> nwidth
  156.         cursor-on    ;
  157.  
  158. defined wdump nip
  159. #if
  160.  
  161. \ The following is an example of redirecting the editor
  162. \ by changing the deferred words
  163.  
  164. : %wd! ( w A1 --- ) DUMPSEG @ SWAP !L ; \ word-dump store
  165.  
  166. : wEDIT ( a n -- ) \ edit word memory
  167.         4 !> nwidth
  168.         ['] dlnw is medln       ['] wdump is medump
  169.         ['] %dump@ is dump@     ['] %wd! is mec!        mem-edit   ;
  170.  
  171. #then
  172.  
  173. \s
  174. : tm    \ demonstrate the memory editor
  175.         pad 128  mem-edit ;
  176.  
  177.