home *** CD-ROM | disk | FTP | other *** search
/ MikeOS 4.5 / mikeos.iso / mikeos.flp / memedit.bas < prev    next >
BASIC Source File  |  2014-12-21  |  7KB  |  406 lines

  1. rem Memory Manipulator (MEMEDIT.BAS), version 3.1.1
  2. rem An advanced memory modification tool for MikeOS
  3. rem Copyright (C) Joshua Beck
  4. rem Email: mikeosdeveloper@gmail.com
  5. rem Licenced under the GNU General Public Licence v3, see LICENCE
  6.  
  7. rem Requires the MB++ library, version 3.2.3 recommended
  8. include "mbpp.bas"
  9.  
  10. parameters:
  11.   if $1 = "" then goto init
  12.   size $1
  13.   if r = 1 then print "File does not exist." 
  14.   if r = 1 then end
  15.   x = ramstart
  16.   x = x / 16
  17.   x = x + 1
  18.   x = x * 16
  19.   y = 65535 - x
  20.   if s > y then print "File too big."
  21.   if s > y then end
  22.   load $1 x
  23.   d = x
  24.   f = x
  25.  
  26. init:
  27.   gosub startprg
  28.   z = 9
  29.   $T = "Memory Manipulator"
  30.   gosub settitle
  31.   cls
  32.   cursor off
  33.   c = 7
  34.   h = 9
  35.   t = 1
  36.   z = 1
  37.   gosub anistart
  38.   gosub refresh
  39.   
  40.   a = 5
  41.   b = 4
  42.   gosub update_screen
  43.   gosub highlight_on
  44.   
  45.   x = ramstart
  46.   y = progstart
  47.   v = 0 - x
  48.   x = x - y
  49.  
  50.   $T = "              About"
  51.   $5 = "Memory Manipulator, version 3.1.1"
  52.   $6 = "Copyright (C) Joshua Beck 2012"
  53.   $7 = "Licenced under the GNU GPLv3"
  54.   $8 = "Program Memory: " + x + " bytes"
  55.   $9 = "Avaliable Memory: " + v + " bytes"
  56.   gosub mesbox
  57. goto main
  58.  
  59. main:
  60.   do
  61.     waitkey k
  62.     if k = 1 then gosub go_up
  63.     if k = 2 then gosub go_down
  64.     if k = 3 then gosub go_left
  65.     if k = 4 then gosub go_right
  66.     if k = 13 then gosub new_value
  67.     if k = 27 then gosub endprog
  68.     if k > 96 and k < 123 then k = k - 32
  69.     if k = 'G' then gosub go_location
  70.     if k = 'L' then gosub load_file
  71.     if k = 'O' then gosub save_file
  72.     if k = 'Q' then gosub page_up
  73.     if k = 'Z' then gosub page_down
  74.   loop endless
  75.  
  76. go_up:
  77.   if b = 4 then goto scroll_up
  78.   gosub highlight_off
  79.   b = b - 1
  80.   d = d - 16
  81.   gosub highlight_on
  82. return
  83.  
  84. go_down:
  85.   if b = 19 then goto scroll_down
  86.   gosub highlight_off
  87.   b = b + 1
  88.   d = d + 16
  89.   gosub highlight_on
  90. return
  91.  
  92. go_left:
  93.   if a = 5 then goto back_line
  94.   gosub highlight_off
  95.   a = a - 3
  96.   d = d - 1
  97.   gosub highlight_on
  98. return
  99.  
  100. go_right:
  101.   if a = 50 then goto forward_line
  102.   gosub highlight_off
  103.   a = a + 3
  104.   d = d + 1
  105.   gosub highlight_on
  106. return
  107.  
  108. scroll_up:
  109.   gosub highlight_off
  110.   f = f - 16
  111.   d = d - 16
  112.   gosub update_screen
  113.   gosub highlight_on
  114. return
  115.  
  116. scroll_down:
  117.   gosub highlight_off
  118.   f = f + 16
  119.   d = d + 16
  120.   gosub update_screen
  121.   gosub highlight_on
  122. return
  123.  
  124. back_line:
  125.   if b = 4 then goto sback_line
  126.   gosub highlight_off
  127.   b = b - 1
  128.   a = 50
  129.   d = d - 1
  130.   gosub highlight_on
  131. return
  132.  
  133. forward_line:
  134.   if b = 19 then goto sforward_line
  135.   gosub highlight_off
  136.   b = b + 1
  137.   a = 5
  138.   d = d + 1
  139.   gosub highlight_on
  140. return
  141.  
  142. sback_line:
  143.   gosub highlight_off
  144.   a = 50
  145.   f = f - 16
  146.   d = d - 1
  147.   gosub update_screen
  148.   gosub highlight_on
  149. return
  150.  
  151. sforward_line:
  152.   gosub highlight_off
  153.   a = 5
  154.   f = f + 16
  155.   d = d + 1
  156.   gosub update_screen
  157.   gosub highlight_on
  158. return
  159.  
  160. page_up:
  161.   gosub highlight_off
  162.   f = f - 256
  163.   d = d - 256
  164.   gosub update_screen
  165.   gosub highlight_on
  166. return
  167.  
  168. page_down:
  169.   gosub highlight_off
  170.   f = f + 256
  171.   d = d + 256
  172.   gosub update_screen
  173.   gosub highlight_on
  174. return
  175.  
  176. go_location:
  177.   t = 2
  178.   $T = "Goto - Location"
  179.   $5 = "Enter a hexdecimal memory address to"
  180.   $6 = "go to between 0000 and FFFF."
  181.   v = 1
  182.   gosub inpbox
  183.   $4 = $I
  184.   
  185.   if $4 = "" then return
  186.   gosub highlight_off
  187.   gosub hexstr_to_num
  188.   w = d - f
  189.   d = v
  190.   v = v - w
  191.   f = v
  192.   gosub update_screen
  193.   gosub highlight_on
  194. return
  195.  
  196. new_value:
  197.   gosub highlight_off
  198.   move a b
  199.   print "  "
  200.   move a b
  201.   w = a - 5 / 3 + 59
  202.   move w b
  203.   print " "
  204.   move a b
  205.   v = 0
  206.   cursor on
  207.   
  208.   do
  209.     waitkey k
  210.     if k = 27 then goto bad_number
  211.     v = 16
  212.     if k > 47 and k < 58 then v = k - 48
  213.     if k > 64 and k < 71 then v = k - 55
  214.     if k > 96 and k < 103 then v = k - 87
  215.   loop until v < 16
  216.   print chr k ;
  217.   v = v * 16
  218.  
  219.   do
  220.     waitkey k
  221.     if k = 27 then goto bad_number
  222.     j = 16
  223.     if k > 47 and k < 58 then j = k - 48
  224.     if k > 64 and k < 71 then j = k - 55
  225.     if k > 96 and k < 103 then j = k - 87
  226.     if j < 16 then print chr k ;
  227.   loop until j < 16
  228.   v = v + j
  229.  
  230.   poke v d
  231.   cursor off
  232.   gosub update_screen
  233.   gosub highlight_on
  234. return
  235.  
  236. bad_number:
  237.   loop until k = 27
  238.   getkey k
  239.   cursor off
  240.   gosub update_screen
  241.   gosub highlight_on
  242. return
  243.   
  244. load_file:
  245.   t = 14
  246.   $T = "Load"
  247.   $5 = "Enter a filename to load at the"
  248.   $6 = "selected location (blank to cancel)"
  249.   v = 1
  250.   gosub inpbox
  251.   $4 = $I
  252.   if $4 = "" then return
  253.   
  254.   load $4 d
  255.   if r = 1 then $E = "File does not exist!"
  256.   if r = 1 then goto errbox
  257.  
  258.   gosub highlight_off
  259.   gosub update_screen
  260.   gosub highlight_on
  261. return
  262.  
  263. save_file:
  264.   t = 13
  265.   $T = "Save"
  266.   $5 = "What filename do you want to use?"
  267.   $6 = "How many bytes to save (hex)?"
  268.   v = 1
  269.   gosub dinbox
  270.   
  271.   if $8 = "" then return
  272.   $4 = $8
  273.   gosub hexstr_to_num
  274.   delete $7
  275.   save $7 d v
  276.   
  277.   if r = 1 then $E = "Read-only disk!"
  278.   if r = 1 then goto errbox
  279. return
  280.  
  281. update_screen:
  282.   ink 7
  283.   w = f
  284.   for y = 4 to 19
  285.     move 5 y
  286.     for x = 1 to 16
  287.       peek v w
  288.       w = w + 1
  289.       print hex v ;
  290.       print " " ;
  291.     next x
  292.   next y
  293.   
  294.   w = f
  295.   for y = 4 to 19
  296.     move 59 y
  297.     for x = 1 to 16
  298.       peek v w
  299.       print chr v ;
  300.       w = w + 1
  301.     next x
  302.   next y
  303. return
  304.  
  305. highlight_on:
  306.   move a b
  307.   ink 232
  308.   curschar v
  309.   print chr v ;
  310.   curschar v
  311.   print chr v ;
  312.   w = a - 5 / 3 + 59
  313.   move w b
  314.   curschar v
  315.   print chr v
  316.   
  317.   ink 9
  318.   move 74 1
  319.   v = d / 256
  320.   print hex v ;
  321.   v = d % 256
  322.   print hex v ;
  323.   move 74 1
  324.   for x = 1 to 4
  325.     curschar v
  326.     print chr v ;
  327.   next x
  328. return
  329.  
  330. highlight_off:
  331.   move a b
  332.   ink 7
  333.   curschar v
  334.   print chr v ;
  335.   curschar v
  336.   print chr v ;
  337.   w = a - 5 / 3 + 59
  338.   move w b
  339.   curschar v
  340.   print chr v
  341. return
  342.  
  343. hexstr_to_num:
  344.   w = & $4
  345.   v = 0
  346.   do
  347.     peek j w
  348.     gosub digit_convert
  349.     if j < 16 then v = v * 16
  350.     if j < 16 then v = v + j
  351.     w = w + 1
  352.   loop until j = 16
  353. return
  354.   
  355. digit_convert:
  356.   if j < 16 then j = 16
  357.   if j > 47 and j < 58 then j = j - 48
  358.   if j > 64 and j < 71 then j = j - 55
  359.   if j > 96 and j < 103 then j = j - 87
  360.   if j > 15 then j = 16
  361. return
  362.  
  363. content:
  364.   gosub savevar
  365.   move 59 1
  366.   ink 9
  367.   print "Selected Byte: 0000"
  368.   ink 3
  369.   move 5 3
  370.   print "0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F        0123456789ABCDEF"
  371.   move 5 20
  372.   print "0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F        0123456789ABCDEF"
  373.   for y = 0 to 15
  374.     v = y * 16
  375.     w = y + 4
  376.     move 2 w
  377.     print hex v
  378.     move 76 w
  379.     print hex v
  380.     move 2 w
  381.     curschar v
  382.     print chr v ;
  383.     curschar v
  384.     print chr v ;
  385.     move 76 w
  386.     curschar v
  387.     print chr v ;
  388.     curschar v
  389.     print chr v ;
  390.   next y
  391.   ink 1
  392.   move 0 21
  393.   print chr 195 ;
  394.   for x = 1 to 78
  395.     print chr 196 ;
  396.   next x
  397.   print chr 180 ;
  398.   ink 3
  399.   move 2 22
  400.   print "Use the arrow keys to move around, G for GOTO, Enter to change a value,"
  401.   move 2 23
  402.   print "Q for page up, Z for page down, O to Save and L to load files into memory."
  403. return
  404.  
  405.  
  406.