home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 4 / AUCD4.iso / utils / programing / babe / !Babe / !RunImage (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1998-03-28  |  15KB  |  610 lines

  1.  Babe 
  2.  David Sharp 1998
  3.  Project Commenced: 11/1/98
  4.  version$="v0.04 (28/3/1998)"
  5. Qv$="Babe SSEM Emulator by David Sharp (DavidSharp@ThePentagon.com) "+version$
  6. debug%=
  7. Start_Error
  8. infile$=""
  9. outfile$=""
  10.  "<Babe$Dir>.emu"
  11.  "<Babe$Dir>.asm"
  12.  "<Babe$Dir>.WimpLib"
  13. Initialise_Variables
  14.  "Wimp_Initialise",200,&4B534154,taskname$ 
  15.  ,taskhandle%
  16. Initialise_Program
  17. CheckInitLoad
  18.  "Wimp_Poll",poll_mask%,wimp% 
  19.  reason%
  20.  reason% 
  21.       
  22.  0     : 
  23. Poll_Null
  24. $      
  25.  2     : 
  26. Poll_WindowOpen
  27. %      
  28.  3     : 
  29. Poll_WindowClose
  30. $      
  31.  6     : 
  32. Poll_MouseClick
  33. #      
  34.  7     : 
  35. Poll_DragEnded
  36. "      
  37.  8     : 
  38. Poll_KeyPress
  39. $      
  40.  9     : 
  41. Poll_MenuChoice
  42.  "      
  43.  17,18 : 
  44. Poll_Messages
  45.  quit%=
  46.  ************************ Initialise Routines ****************************
  47.  these routines are called before the Wimp poll loop begins
  48. Initialise_Variables
  49.  variables
  50. *0   taskname$="Babe"             :
  51.  task name
  52. +>   iconsprite$="!babe"          :
  53.  the main program sprite
  54. ,5   quit%=
  55.                       :
  56.  should I quit?
  57. -D   poll_mask%=0                     :
  58.  poll codes not to request
  59.  windows opened before
  60. 0D   opened_field%=
  61.               :
  62.  has field_Window% been opened
  63. 1B   dragging%=
  64.                   :
  65.  no drag currently happening
  66.  area sizes
  67. 4:   wimp_length%=10000                :
  68.  work area size
  69. 5E   indr_length%=10000                :
  70.  indirected data area size
  71.  set up areas
  72. 88   
  73.  wimp% wimp_length%           :
  74.  setup work area
  75. 9C   
  76.  indr% indr_length%           :
  77.  setup indirected data area
  78. :9   
  79.  font_buffer% 256             :
  80.  window font area
  81. ;I   indr_end%=indr%+indr_length%     :
  82.  End of indirected icons buffer
  83. <8   
  84.  icon_block% &400             :
  85.  icon block area
  86. =>   
  87.  ret% 256,t% 256,l% 256       :
  88.  for FNEVALSysVariable
  89.    type$=""
  90.  Clear font buffer
  91.  I%=0 
  92.       font_buffer%?I%=0
  93. Wimp_GetScreenVariables
  94. FF   SolidDrag% =
  95. _gen_solid_drag        :
  96.  Is solid drag enabled ??
  97.  assembler information
  98.  asmopt% 10
  99. J6   asmopt%?0=0 :
  100.  convert SB5 to SUB on assembling
  101. K=   
  102.  obj$(31) :
  103.  hold assembled code max 32 lines anyway.
  104.  actlin$(31)
  105. M%   
  106.  read in actline lookup table
  107.  x%=0 
  108.       
  109.  actlin$(x%)
  110. Q2   
  111.  binstring% 33 :
  112.  buffer for binary string
  113.  emulator information
  114.    xcycle%=0
  115.    mode%=0
  116. X4   
  117.  code% 5*1024     :
  118.  area for assembled code
  119. Y5   
  120.  sprites% 64*2    :
  121.  sprite area for graphics
  122. ZB   
  123.  "OS_File",16,"<Babe$Dir>.raw",sprites%  :
  124.  load graphics
  125. \8   
  126.  data for actline conversion from number 0 to 31
  127.  "00000","10000","01000","11000","00100","10100","01100","11100","00010"
  128.  "10010","01010","11010","00110","10110","01110","11110","00001","10001"
  129.  "01001","11001","00101","10101","01101","11101","00011","10011","01011"
  130.  "11011","00111","10111","01111","11111"
  131. _gen_solid_drag
  132.  "OS_Byte",161,28 
  133.  ,,A%
  134. =((A% 
  135.  2)=2)
  136. Initialise_Program
  137. kO   iconbar%=
  138. Wimp_CreateIconBar(iconsprite$,-1) :
  139.  create bar icon on right
  140. lE   
  141. Load_Templates      :
  142.  load predefined windows from templates
  143. m,   
  144. Initialise_Windows  :
  145.  setup windows
  146. n+   
  147. SetUp_Menus         :
  148.  define menus
  149. Initialise_Emu
  150. Disable
  151. Disable
  152. t+   
  153. Wimp_IconDisable(options_Window%,0)
  154. u+   
  155. Wimp_IconDisable(options_Window%,1)
  156. v+   
  157. Wimp_IconDisable(options_Window%,4)
  158. w+   
  159. Wimp_IconDisable(options_Window%,5)
  160. y*   
  161. Wimp_IconDisable(notify_Window%,5)
  162. {%   
  163. Wimp_MenuDisable(bar_Menu%,2)
  164. |%   
  165. Wimp_MenuDisable(bar_Menu%,3)
  166. Load_Templates
  167.  "Wimp_OpenTemplate",,"<Babe$Dir>.Templates"
  168. (   info_Window%=
  169. Load_Window("info")
  170. (   save_Window%=
  171. Load_Window("save")
  172. *   savet_Window%=
  173. Load_Window("savet")
  174. ,   notify_Window%=
  175. Load_Window("notify")
  176. &   dis_Window%=
  177. Load_Window("dis")
  178. &   asm_Window%=
  179. Load_Window("asm")
  180. .   options_Window%=
  181. Load_Window("options")
  182.  _Window%=FNLoad_Window("")
  183.  "Wimp_CloseTemplate"
  184. Initialise_Windows
  185.  set text, sprites and selected etc. for windows
  186. Wimp_IconPutText(info_Window%,3,version$)
  187. Load_Window(window$)
  188.  window%
  189. "Wimp_LoadTemplate",,wimp%,indr%,indr_end%,font_buffer%,window$,0 
  190. ,,indr%
  191. "Wimp_CreateWindow",,wimp% 
  192.  window%
  193. =window%
  194. SetUp_Menus
  195.  iconbar menu
  196.  bar_Menu% 28+(4*24)
  197. Wimp_MenuStart("Babe",bar_Menu%,12*18)
  198. Wimp_MenuAddString("Info",info_Window%)
  199. Wimp_MenuAddString("Assembler",-1)
  200. Wimp_MenuAddString("Disassembler",-1)
  201. Wimp_MenuAddString("Options",-1)
  202. Wimp_MenuAddString("Quit",-1)
  203. Wimp_MenuEnd
  204. Wimp_MenuDottedLine(bar_Menu%,1)
  205. Wimp_MenuDottedLine(bar_Menu%,4)
  206.  ******************************** Miscellaneous ****************************
  207. Start_Error
  208.  debug% 
  209.       
  210.  "Edit:Throwback"
  211.       
  212.  "XHourglass_Smash"
  213. !      
  214. $+" at line "+
  215.  ************************************* Polling *****************************
  216.  all 1st level administration of wimp polling
  217. Poll_Null
  218. Poll_WindowOpen
  219.  "Wimp_OpenWindow",,wimp%
  220. Poll_WindowClose
  221.  "Wimp_CloseWindow",,wimp%
  222. Poll_MouseClick
  223.    buttons%=wimp%!8
  224.    window%=wimp%!12
  225.    icon%=wimp%!16
  226.    mousex%=wimp%!0
  227.    mousey%=wimp%!4
  228.  buttons% 
  229. !      
  230.  2    : 
  231. Poll_OpenMenu
  232.       
  233. Poll_WindowClick
  234.  ***** PROCPoll_DragEnded is moved to the 'Dragging' section
  235. Poll_KeyPress
  236. Poll_Messages
  237.    sender%=wimp%!4
  238.    myref%=wimp%!8
  239.  wimp%!16 
  240. <      
  241.  0 : quit%=
  242.                     :
  243.  quit requested
  244. <      
  245.  1 : 
  246. DataSave                  :
  247.  save to window
  248. D      
  249.  2 : 
  250. DataSaveAck               :
  251.  acknowledge save to me
  252. >      
  253.  3 : 
  254. DataLoad                  :
  255.  load from a file
  256. D      
  257.  4 : 
  258. DataLoadAck               :
  259.  acknowledge load to me
  260. ?      
  261.  5 : 
  262. DataOpen                  :
  263.  double-click file
  264. C      
  265.  8 : quit%=
  266.                     :
  267.  taskman quit/shutdown
  268. >      
  269.  &502   : 
  270. InteractiveHelp      :
  271.  interactive help
  272. G      
  273.  &400CC : 
  274. WindowInfo           :
  275.  handle shift-close of win
  276.  ***************************** Window Click *******************************
  277. Poll_WindowClick
  278.  set click-defining variables
  279.    mousex%=wimp%!0
  280.    mousey%=wimp%!4
  281.    buttons%=wimp%!8
  282.    window%=wimp%!12
  283.    icon%=wimp%!16
  284.  decide next procedure depending on which window was clicked on
  285.  window% 
  286. '      
  287.  -2              : 
  288. MouseBar
  289. 1      
  290.  notify_Window%  : 
  291. MouseNotify(icon%)
  292. /      
  293.  save_Window%    : 
  294. MouseSave(icon%)
  295. 0      
  296.  savet_Window%   : 
  297. MouseSaveT(icon%)
  298. MouseBar
  299.  buttons% 
  300.       
  301.  4 : 
  302. Wimp_Notify("Double-click or drag to this icon either an SSEM assembly text file, or an SSEM object code file.")
  303. 2      
  304.  1 : 
  305. Wimp_WindowToTop(options_Window%)
  306. MouseNotify(icon%)
  307.    wimp%!0=128
  308.    wimp%!4=129
  309.    wimp%!8=130
  310.    wimp%!12=131
  311.    wimp%!16=4
  312.    wimp%!20=5
  313.    wimp%!24=-1
  314.  49,wimp%,wimp%
  315.  wimp%!0*2*wimp%!16,wimp%!4*2*wimp%!20,wimp%!8*2*wimp%!16,wimp%!12*2*wimp%!20
  316. Wimp_WindowClose(notify_Window%)
  317. MouseSave(icon%)
  318.  icon% 
  319.     ;      
  320.  0 : 
  321.  buttons% 
  322.  &50 
  323. StartDrag(save_Window%)
  324. B      
  325.  2 : 
  326. SaveObjectCode(
  327. Wimp_IconGetText(save_Window%,1))
  328. MouseSaveT(icon%)
  329.  icon% 
  330. <      
  331.  0 : 
  332.  buttons% 
  333.  &50 
  334. StartDrag(savet_Window%)
  335. E      
  336.  2 : 
  337. SaveAssemblyCode(
  338. Wimp_IconGetText(savet_Window%,1))
  339. InteractiveHelp
  340. WindowInfo
  341.  Handles special iconising information (ROS 3 only)
  342.    window%=wimp%!20
  343.    sprite$=""
  344.  window% 
  345. 7      
  346.                : text$="Babe":sprite$="babe"
  347.  sprite$="" 
  348.  sprite$="babe" :
  349.  *** dummy until proper sprites drawn
  350.  !   wimp%!0=(36+
  351. (text$)+4)
  352.    wimp%!12=myref%
  353.    wimp%!16=&400CC
  354.    $(wimp%+28)=sprite$+
  355.    $(wimp%+36)=text$+
  356. %-   
  357.  "Wimp_SendMessage",17,wimp%,sender%
  358. &!   
  359. Wimp_WindowClose(window%)
  360.    iconised%=
  361.  ****************************** Dragging **********************************
  362. StartDrag(window%)
  363.    wimp%!0=window%
  364.  window% 
  365. 0-      
  366.  save_Window%    : savetype$="BAB"
  367. 1-      
  368.  savet_Window%   : savetype$="FFF"
  369. 3&   
  370.  "Wimp_GetWindowState",,wimp%
  371.    x%=wimp%!4-wimp%!20
  372.    y%=wimp%!16-wimp%!24
  373.    wimp%!4=0
  374. 7$   
  375.  "Wimp_GetIconState",,wimp%
  376.    !wimp%=window%
  377. 92   wimp%!4  =5                    :
  378.  drag type
  379. :%   wimp%!8+= x%          :
  380.  min x
  381. ;%   wimp%!12+=y%          :
  382.  min y
  383. <%   wimp%!16+=x%          :
  384.  max x
  385. =%   wimp%!20+=y%          :
  386.  max y
  387. >A   
  388.  above vars must be in this order because they interelate
  389.    wimp%!24=-1
  390.    wimp%!28=-1
  391.    wimp%!32=&7FFFFFFF
  392.    wimp%!36=&7FFFFFFF
  393.  SolidDrag% 
  394. EO      
  395.  "DragASprite_Start",%11000101,1,"file_"+savetype$,wimp%+8,wimp%+28
  396. G"      
  397.  "Wimp_DragBox",,wimp%
  398. Poll_DragEnded
  399.  file$
  400.  SolidDrag% 
  401.  "DragASprite_Stop" :
  402.  free solid drag workspace
  403. N6  file$=
  404. GetLeafName(
  405. Wimp_IconGetText(window%,1))
  406.  "Wimp_GetPointerInfo",,wimp%
  407. P,  wimp%!20=wimp%!12     :
  408.  window handle
  409. Q*  wimp%!24=wimp%!16     :
  410.  icon number
  411. R2  wimp%!28=wimp%!0      :
  412.  destination x coord
  413. S2  wimp%!32=wimp%!4      :
  414.  destination y coord
  415. T@  wimp%!12=0            :
  416.  marks original message, not reply
  417. U-  wimp%!16=1            :
  418.  message action
  419. V=  wimp%!36=0            :
  420.  estimated size of data (bytes)
  421. W,  wimp%!40=
  422. ("&"+savetype$)  :
  423.  filetype
  424. X'  $(wimp%+44)=file$     :
  425.  leafname
  426. Y6  wimp%!0=60            :
  427.  length of message block
  428.  "Wimp_SendMessage",18,wimp%,wimp%!20 :
  429.  send datasave message
  430. DataSave
  431. ^$   type$=
  432. GiveFileType(wimp%!40)
  433. _7   fileleafname$=
  434. Wimp_GetStringAtAddress(wimp%+44)
  435.    wimp%!4=myref%
  436. aI   
  437.  "Wimp_SendMessage",19,wimp%,wimp%!20,wimp%!24 
  438.  ,,dest_thandle%
  439. bH   
  440.  get destinations file handle, to check not saving into outself!
  441. c%   
  442.  dest_thandle%<>taskhandle% 
  443. d'      
  444.  type$="FFF" 
  445.  type$="BAB" 
  446. eA         $(wimp%+44)="<Wimp$Scrap>" :
  447.  filename in Scrap area
  448. f2         wimp%!16=2          :
  449.  message number
  450. g3         wimp%!0=256         :
  451.  length of block
  452. h0         wimp%!12=myref%     :
  453.  my reference
  454. i8         wimp%!36=-1         :
  455.  'unsafe' file marker
  456. jO         
  457.  "Wimp_SendMessage",18,wimp%,sender% :
  458.  send datasaveack message
  459.       
  460. DataSaveAck
  461. p/   file$=
  462. Wimp_GetStringAtAddress(wimp%+44)
  463. qL   
  464.  savetype$="BAB" 
  465. SaveObjectCode(file$) 
  466. SaveAssemblyCode(file$)
  467. r2   
  468.  "OS_File",17,file$ 
  469.  obj_type%,,,,fsize%
  470. sA   
  471.  check that it is a file, not a directory nor application
  472.  obj_type%=1 
  473.       wimp%!16=3
  474.       wimp%!0=256
  475.       wimp%!12=myref%
  476.       wimp%!36=fsize%
  477. yI      
  478.  "Wimp_SendMessage",17,wimp%,sender% :
  479.  send dataload message
  480. {M   
  481.  if it is a transferred file then don't put Wimp$Scrap in save window
  482. |C   
  483.  file$<>"<Wimp$Scrap>" 
  484. Wimp_IconPutText(window%,1,file$)
  485. DataLoad
  486. /   file$=
  487. Wimp_GetStringAtAddress(wimp%+44)
  488.    type$=
  489. ~(wimp%!40)
  490.  type$="BAB" 
  491.  type$="FFF" 
  492.       
  493. Load(file$)
  494. A      
  495.  file$="<Wimp$Scrap>" 
  496. ("*WIPE "+file$+" F ~V ~C R")
  497. .      wimp%!0=256       :
  498.  length of block
  499. <      wimp%!12=myref%   :
  500.  my ref from data load message
  501. -      wimp%!16=4        :
  502.  message number
  503. L      
  504.  "Wimp_SendMessage",17,wimp%,sender% :
  505.  send dataloadack message
  506. \      
  507. Wimp_Notify("This filetype if not supported by Babe, &FFF and &BAB only please.")
  508. DataLoadAck
  509.  save and load has been successfully completed!
  510. DataOpen
  511.    type$=
  512. ~(wimp%!40)
  513. /   file$=
  514. Wimp_GetStringAtAddress(wimp%+44)
  515.  type$="BAB" 
  516.       wimp%!12=wimp%!8
  517. 1      
  518.  "Wimp_SendMessage",17,wimp%,wimp%!20
  519.       
  520. Load(file$)
  521.  ***************************** Menu Click *********************************
  522.  Which menu should be opened on a window click
  523. Poll_OpenMenu
  524.  window% 
  525.       
  526. ;         
  527. Wimp_IconBarMenuPos(bar_Menu%,iconbar%,x%,y%)
  528. ,         
  529. Wimp_OpenMenu(bar_Menu%,x%,y%)
  530.  Which menu has the choice been made from
  531. Poll_MenuChoice
  532.  menu% 
  533. )      
  534.  bar_Menu%    : 
  535. MenuChoiceBar
  536.  if adjust used then reopen menu
  537.  "Wimp_GetPointerInfo",,wimp%
  538.  wimp%!8=1 
  539.  "Wimp_CreateMenu",,menu%,wimp%!0,wimp%!4
  540. MenuChoiceBar
  541. Menu_ItemNumber(0) 
  542. .      
  543.  2 : 
  544. Wimp_WindowToTop(asm_Window%)
  545. .      
  546.  3 : 
  547. Wimp_WindowToTop(dis_Window%)
  548. 2      
  549.  4 : 
  550. Wimp_WindowToTop(options_Window%)
  551.       
  552.  5 : quit%=
  553.  *************************** file handling ****************************
  554. CheckInitLoad
  555. *   file$=
  556. EvalSYSVariable("Babe$File")
  557.  file$<>"xxx" 
  558.       type$="BAB"
  559.        
  560. LoadObjectCode(file$)
  561. ("Set Babe$File xxx")
  562. Load(file$)
  563.  type$ 
  564. *      
  565.  "BAB" : 
  566. LoadObjectCode(file$)
  567. ,      
  568.  "FFF" : 
  569. LoadAssemblyCode(file$)
  570. a      
  571. Wimp_Notify("This filetype if not supported by Babe, &FFF and &BAB only please.")
  572. LoadObjectCode(file$)
  573.  get emu options
  574.    mode%=0
  575. Wimp_IconSelected(options_Window%,6) 
  576.  mode%=1
  577. Wimp_IconSelected(options_Window%,7) 
  578.  mode%=2
  579. Wimp_IconSelected(options_Window%,8) 
  580.  mode%=3
  581. Wimp_IconSelected(options_Window%,9) 
  582.       mode%=4
  583. :      xcycle%=
  584. Wimp_IconGetText(options_Window%,10))
  585.    oldmode%=
  586. Initialise_Emu
  587. LoadObjectFile(file$)
  588.  start
  589.  "Press any key to return to the desktop"
  590.    key=
  591.  MODE oldmode%
  592.  SYS "Wimp_ForceRedraw",-1,0,0,&7FFFFFFF,&7FFFFFFF
  593.  OSCLI("WIMPMODE "+STR$oldmode%)
  594.  *POINTER
  595.  "Wimp_SetMode",oldmode%
  596. LoadAssemblyCode(file$)
  597.    infile$=file$
  598. Wimp_WindowToTop(save_Window%)
  599. Save(file$)
  600. Wimp_Notify("save type: "+savetype$)
  601. SaveAssemblyCode(file$)
  602.    B=
  603. (file$)
  604. ("SETTYPE "+file$+" FFF")
  605. SaveObjectCode(outfile$)
  606. Wimp_IconSelected(options_Window%,11) 
  607.  log%=1 
  608.  log%=0
  609. Assembler(infile$,outfile$)
  610.