home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / Microhelp / Source
Encoding:
Text File  |  1995-08-04  |  34.6 KB  |  2,362 lines

  1. ;  Microhelp source
  2. ;  to be compiled with ExtAsm
  3.  
  4. #name !RunImage
  5. #type &ff8
  6. #set stacksize=256
  7. #set Text_height=32
  8. #set Text_width=16
  9. #set Strlen=256
  10. #set Anclen=32
  11. #set Window_width=1280-48
  12.  
  13. struct v
  14. {
  15. .stack        DCD 0
  16. .quit        DCD 0
  17. .taskhandle    DCD 0
  18. .event        DCD 0
  19. .textptr    DCD 0
  20. .textend    DCD 0
  21. .workspace    DCD 0
  22. .workend    DCD 0
  23. .workptr    DCD 0
  24. .ramptr        DCD 0
  25. .appsize    DCD 0
  26. .html        DCD 0
  27. .exporttype    DCD 0
  28. .heading    DCD 0
  29. .colour        DCD 0
  30. .oldwidth    DCD 0
  31. .filewidth    DCD 0
  32. .fileheight    DCD 0
  33. .link        DCD 0
  34. .anc        DCD 0
  35. .tempptr    DCD 0
  36. .tempsize    DCD 0
  37. .iconptr    DCD 0
  38. .iconsize    DCD 0
  39. .filehandle    DCD 0
  40. .infotemp    DCD 0
  41. .infohandle    DCD 0
  42. .viewertemp    DCD 0
  43. .viewerhandle    DCD 0
  44. .buffer        DBB 16
  45. .anchor9    DBB 32
  46. .anchor8    DBB 32
  47. .anchor7    DBB 32
  48. .anchor6    DBB 32
  49. .anchor5    DBB 32
  50. .anchor4    DBB 32
  51. .anchor3    DBB 32
  52. .anchor2    DBB 32
  53. .anchor        DBB 32
  54. .guard1         DCD 0
  55. .data        DBB 256
  56.  
  57. .filename9    DBB 256
  58. .filename8    DBB 256
  59. .filename7    DBB 256
  60. .filename6    DBB 256
  61. .filename5    DBB 256
  62. .filename4    DBB 256
  63. .filename3    DBB 256
  64. .filename2    DBB 256
  65. .filename    DBB 256
  66. .guard2         DCD 0
  67. .templates    DBB &200
  68. .icons        DBB &100
  69. .iconsend    
  70. .sizeof
  71. }
  72.  
  73. struct wimp_r
  74. {
  75. .handle        DCD 0
  76. .vminx        DCD 0
  77. .vminy        DCD 0
  78. .vmaxx        DCD 0
  79. .vmaxy        DCD 0
  80. .scrx        DCD 0
  81. .scry        DCD 0
  82. .gminx        DCD 0
  83. .gminy        DCD 0
  84. .gmaxx        DCD 0
  85. .gmaxy        DCD 0
  86. .sizeof
  87. }
  88.  
  89. #set appsize=&2E40;memory needed for application
  90.  
  91. .appstart
  92. ADR R1,appstart
  93. ADD R1,R1,#appsize
  94. MOV R13,R1
  95. SUB R1,R1,#stacksize
  96. ADR R12,append
  97. ADD R3,R12,#v.sizeof
  98. CMP R3,R1
  99. BGE nomemoryerr
  100. BL init
  101. BL taskinit
  102. BL loadtemplates
  103. BL createwindows
  104. BL openviewer
  105. BL parse
  106. BVS abort
  107. BL doswap
  108. BL main
  109. .abort
  110. BL taskclose
  111.  
  112. SWI OS_Exit
  113.  
  114. .init
  115. STMFD R13!,{R14}
  116. SWI OS_GetEnv
  117. STR R1,[R12,#v.workend]
  118. ADR R1,appstart
  119. ADD R1,R1,#appsize
  120. STR R1,[R12,#v.workspace]
  121. STR R1,[R12,#v.workptr]
  122. SUB R1,R1,#&8000
  123. STR R1,[R12,#v.appsize]
  124. MOV R1,#0
  125. STR R1,[R12,#v.textptr]
  126. STR R1,[R12,#v.textend]
  127. STR R1,[R12,#v.ramptr]
  128. ADD R1,R12,#v.filename9
  129. MOV R0,#0
  130. STR R0,[R1],#Strlen
  131. STR R0,[R1],#Strlen
  132. STR R0,[R1],#Strlen
  133. STR R0,[R1],#Strlen
  134. STR R0,[R1],#Strlen
  135. STR R0,[R1],#Strlen
  136. STR R0,[R1],#Strlen
  137. STR R0,[R1],#Strlen
  138. STR R0,[R1],#Strlen
  139. ADD R1,R12,#v.anchor9
  140. MOV R0,#0
  141. STR R0,[R1],#Anclen
  142. STR R0,[R1],#Anclen
  143. STR R0,[R1],#Anclen
  144. STR R0,[R1],#Anclen
  145. STR R0,[R1],#Anclen
  146. STR R0,[R1],#Anclen
  147. STR R0,[R1],#Anclen
  148. STR R0,[R1],#Anclen
  149. STR R0,[R1],#Anclen
  150. STR R0,[R12,#v.guard1]
  151. STR R0,[R12,#v.guard2]
  152.  
  153. LDMFD R13!,{PC}
  154.  
  155. .taskinit
  156. STMFD R13!,{R14}
  157. MOV R0,#200
  158. LDR R1,taskid
  159. ADR R2,taskname
  160. MOV R3,#0
  161. SWI Wimp_Initialise
  162. STR R1,[R12,#v.taskhandle]
  163. MOV R0,#0
  164. STR R0,[R12,#v.quit]
  165. LDMFD R13!,{PC}
  166. .taskid
  167. DCB "TASK"
  168. .taskname
  169. DCB "Microhelp",0
  170. ALIGN
  171. .taskclose
  172. STMFD R13!,{R14}
  173. LDR R0,[R12,#v.taskhandle]
  174. LDR R1,taskid
  175. SWI Wimp_CloseDown
  176. LDMFD R13!,{PC}
  177.  
  178. .main
  179. STMFD R13!,{R14}
  180. STR R13,[R12,#v.stack]
  181. .pollloop
  182. LDR R0,[R12,#v.stack]
  183. CMP R0,R13
  184. BNE stackfault
  185. MOV R0,#&31
  186. ADD R1,R12,#v.data
  187. SWI Wimp_Poll
  188. STR R0,[R12,#v.event]
  189. .eventcase
  190. CMP R0,#1
  191. BEQ redraw
  192. CMP R0,#2
  193. BEQ open
  194. CMP R0,#3
  195. BEQ close
  196. CMP R0,#6
  197. BEQ mouseclick
  198. CMP R0,#9
  199. BEQ menuproc
  200. CMP R0,#17
  201. CMPNE R0,#18
  202. BEQ mesrecd
  203. CMP R0,#19
  204. BEQ ackrecd
  205. .eventins
  206. LDR R0,[R12,#v.guard1]
  207. LDR R1,[R12,#v.guard2]
  208. CMP R0,#0
  209. CMPEQ R1,#0
  210. BNE guarderr
  211. LDR R0,[R12,#v.quit]
  212. CMP R0,#0
  213. BEQ pollloop
  214. LDMFD R13!,{PC}
  215.  
  216. .mouseclick
  217. LDR R0,[R1,#8]; get buttons
  218. CMP R0,#2
  219. BEQ makemenu
  220. LDR R0,[R1,#12]
  221. LDR R2,[R12,#v.viewerhandle]
  222. CMP R0,R2
  223. BNE eventins
  224. LDR R2,[R1,#0]
  225. LDR R3,[R1,#4]
  226. ADD R1,R12,#v.data
  227. LDR R0,[R12,#v.viewerhandle]
  228. STR R0,[R1,#0]
  229. SWI Wimp_GetWindowState
  230. LDR R0,[R1,#wimp_r.vminx]
  231. SUB R2,R2,R0
  232. LDR R0,[R1,#wimp_r.vmaxy]
  233. SUB R3,R3,R0
  234. LDR R0,[R1,#wimp_r.scrx]
  235. ADD R2,R2,R0
  236. LDR R0,[R1,#wimp_r.scry]
  237. ADD R3,R3,R0
  238. RSB R3,R3,#0
  239. ;R2,R3 are the coords from the top left in the work area
  240.  
  241. BL linkscan
  242. BCS nolink
  243. .link
  244. BL swapfile
  245. BLVC doswap
  246. .nolink
  247. B eventins
  248.  
  249. .forceredraw
  250. STMFD R13!,{R14}
  251. ADD R1,R12,#v.data
  252. LDR R0,[R12,#v.viewerhandle]
  253. STR R0,[R1,#0]
  254. SWI Wimp_GetWindowState
  255. LDR R0,[R1]
  256. MOV R1,#0
  257. MOV R2,#-9999
  258. MOV R3,#9999
  259. MOV R4,#0
  260. SWI Wimp_ForceRedraw
  261. LDMFD R13!,{PC}
  262.  
  263. .linkscan
  264. STMFD R13!,{R0-R4,R14}
  265. MOV R0,#0
  266. STR R0,[R12,#v.link]
  267. LDR R10,[R12,#v.textptr]
  268. .lsloop
  269. LDR R4,[R12,#v.workptr]
  270. MOV R8,#0
  271. .lsloop2
  272. CMP R3,#Text_height
  273. CMPLT R2,R8  
  274. BLT lsfound
  275. .lstestskip
  276. LDRB R0,[R10],#1            ;emulate window draw routine, but without writes
  277. CMP R10,R4
  278. BGE lsfail
  279. CMP R0,#"<"
  280. BLEQ htmlcom
  281. CMP R0,#"&"
  282. BLEQ ampcom
  283. CMP R0,#9
  284. BLEQ drawtab
  285. CMP R0,#&0A
  286. BEQ lslineend
  287. CMP R3,#Text_height         ;start to sub R2 if this is our line
  288. BGE lsloop
  289. CMP R0,#&20                 ;sub if a real char
  290. ADDGE R8,R8,#Text_width
  291. B lsloop2
  292. .lslineend
  293. SUBS R3,R3,#Text_height
  294. BMI lsfail
  295. B lsloop
  296. .lsfail
  297. LDMFD R13!,{R0-R4,R14}
  298. ORR R14,R14,#1<<29
  299. MOVS PC,R14
  300.  
  301. .lsfound
  302. LDR R0,[R12,#v.link]
  303. CMP R0,#0
  304. BEQ lsfail
  305. LDMFD R13!,{R0-R4,R14}
  306. MOV R0,R10
  307. BIC R14,R14,#1<<29
  308. MOVS PC,R14
  309.  
  310. .jtscan
  311. STMFD R13!,{R0-R4,R14}
  312. MOV R0,#-1
  313. STR R0,[R12,#v.anc]
  314. ADD R0,R12,#v.anchor
  315. LDRB R0,[R0]
  316. CMP R0,#0
  317. BEQ jtend
  318. CMP R0,#255
  319. BEQ numberanchor
  320. MOV R6,#0
  321. LDR R10,[R12,#v.textptr]
  322. .jtloop
  323. LDR R4,[R12,#v.workptr]
  324. .jtloop2
  325. LDRB R0,[R10],#1            ;emulate window draw routine, but without writes
  326. CMP R10,R4
  327. BGE jtend
  328. CMP R0,#"<"
  329. BLEQ htmlcom
  330. CMP R0,#"&"
  331. BLEQ ampcom
  332. CMP R0,#&0A
  333. BEQ jtlineend
  334. B jtloop2
  335. .jtlineend
  336. ADD R6,R6,#Text_height
  337. LDR R0,[R12,#v.anc]
  338. CMP R0,#-1
  339. BEQ jtloop ;drops through
  340. .jtend
  341. LDMFD R13!,{R0-R4,R14}
  342. LDR R0,[R12,#v.anc]
  343. CMP R0,#-1
  344. BICNE R14,R14,#1<<29
  345. ORREQ R14,R14,#1<<29
  346. MOVS PC,R14
  347.  
  348. .numberanchor
  349. ADD R0,R12,#v.anchor
  350. LDR R0,[R0,#4]
  351. STR R0,[R12,#v.anc]
  352. B jtend
  353.  
  354. ; Menu selection code
  355.  
  356. .menuproc
  357. LDR R0,[R1]
  358. CMP R0,#m_back
  359. BEQ back
  360. CMP R0,#m_contents
  361. BEQ contents
  362. CMP R0,#m_index
  363. BEQ index
  364. CMP R0,#m_newview
  365. BEQ newview
  366. CMP R0,#m_export
  367. BEQ export
  368. CMP R0,#m_help
  369. BEQ dohelp
  370. CMP R0,#m_quit
  371. BEQ doquit
  372.  
  373. .menuins
  374. ADD R1,R12,#v.data 
  375. SWI Wimp_GetPointerInfo
  376. LDR R0,[R1,#8]
  377. TST R0,#1
  378. BNE remakemenu
  379. B eventins
  380.  
  381. .closeback
  382. ADD R0,R12,#v.filename2
  383. LDRB R0,[R0]
  384. CMP R0,#0
  385. BEQ eventins
  386. BL windback
  387. BL doswap
  388. B eventins
  389.  
  390. .back
  391. ADD R0,R12,#v.filename2
  392. LDRB R0,[R0]
  393. CMP R0,#0
  394. BEQ eventins
  395. BL windback
  396. BL doswap
  397. B menuins
  398.  
  399. .contentsstr
  400. DCB "CONTENTS",0
  401. .contentsupstr
  402. DCB "^.CONTENTS",0
  403. .indexstr
  404. DCB "INDEX",0
  405. .indexupstr
  406. DCB "^.INDEX",0
  407. ALIGN
  408.  
  409. .contents
  410. ADR R0,contentsstr
  411. STR R0,[R12,#v.link]
  412. BL swapfile
  413. BVS nocontents
  414. BL swaptest
  415. BVC foundcont
  416. .cloop
  417. ADR R0,contentsupstr
  418. STR R0,[R12,#v.link]
  419. BL swapfile
  420. BVS nocontents
  421. BL swaptest
  422. BVC foundcont
  423. B cloop
  424. .nocontents
  425. BL nocontentserr
  426. BL windback
  427. BL doswap
  428. B menuins
  429. .foundcont
  430. BL doswap
  431. B menuins
  432.  
  433. .index
  434. ADR R0,indexstr
  435. STR R0,[R12,#v.link]
  436. BL swapfile
  437. BVS noindex
  438. BL swaptest
  439. BVC foundindex
  440. .iloop
  441. ADR R0,indexupstr
  442. STR R0,[R12,#v.link]
  443. BL swapfile
  444. BVS noindex
  445. BL swaptest
  446. BVC foundindex
  447. B iloop
  448. .noindex
  449. BL noindexerr
  450. BL windback
  451. BL doswap
  452. B menuins
  453. .foundindex
  454. BL doswap
  455. B menuins
  456. .newviewcom
  457. DCB "Run MicroHelp:!Run ",0
  458. ALIGN
  459. .newview
  460. ADR R1,newviewcom
  461. ADD R0,R12,#v.data
  462. BL strcpy
  463. ADD R1,R12,#v.filename
  464. BL strcat
  465. ADD R0,R12,#v.data
  466. SWI Wimp_StartTask
  467. B menuins
  468.  
  469. .exportname
  470. DCB "Export",0
  471. ALIGN
  472.  
  473. .export
  474. LDR R0,[R1,#4]  ;test for export as html
  475. CMP R0,#1
  476. MOVNE R0,#0
  477. STR R0,[R12,#v.exporttype]
  478. BL geteditshandle
  479. BLVS noeditorerr
  480. BVS menuins
  481. MOV R4,R0
  482. LDR R0,[R12,#v.textptr]
  483. STR R0,[R12,#v.ramptr]
  484. ADD R1,R12,#v.data
  485. SWI Wimp_GetPointerInfo
  486. LDR R2,[R1,#0];mouse coords
  487. LDR R3,[R1,#4]
  488.  
  489. ADD R1,R12,#v.data
  490. MOV R0,#256
  491. STR R0,[R1,#0]
  492. MOV R0,#0 
  493. STR R0,[R1,#12]
  494. MOV R0,#1
  495. STR R0,[R1,#16];message type
  496. MOV R0,#-2
  497. STR R0,[R1,#20];destination window
  498. MOV R0,#-1
  499. STR R0,[R1,#24];destination icon
  500. STR R2,[R1,#28]
  501. STR R3,[R1,#32]
  502. LDR R2,[R12,#v.textptr]
  503. LDR R3,[R12,#v.textend]
  504. SUB R0,R3,R2
  505. MOV R0,#256
  506. STR R0,[R1,#36];estimated size
  507. MOV R0,#&FFF
  508. STR R0,[R1,#40];filetype
  509. ADD R0,R1,#44
  510. ADD R1,R12,#v.filename
  511. LDR R2,[R12,#v.html]
  512. LDR R3,[R12,#v.exporttype]
  513. CMP R2,R3
  514. ADRNE R1,exportname
  515. BL strcpy
  516. MOV R0,#18
  517. ADD R1,R12,#v.data
  518. MOV R2,R4
  519. SWI Wimp_SendMessage
  520. B menuins
  521.  
  522.  
  523. .ename1
  524. DCB "EDIT",0
  525. .ename2
  526. DCB "ZAP",0
  527. .ename3
  528. DCB "STRONGED",0
  529. .ename4
  530. DCB "_INSERT YOURS HERE",0
  531. ALIGN
  532. .geteditshandle
  533. STMFD R13!,{R14}
  534. MOV R5,#0
  535. .geloop
  536. CMP R5,#0
  537. BLT noeditors
  538. MOV R0,R5
  539. ADD R1,R12,#v.data
  540. MOV R2,#256
  541. SWI XTaskManager_EnumerateTasks
  542. LDMVSFD R13!,{R14}
  543. BVS ro3onlyerr
  544. MOV R5,R0
  545. MOV R4,R1
  546. ADD R3,R12,#v.data
  547. .geloop2
  548. CMP R3,R4
  549. BGE geloop
  550. LDR R1,[R3,#4];get task name
  551. ADR R0,ename1
  552. BL strcmp
  553. BEQ foundeditor
  554. ADR R0,ename2
  555. BL strcmp
  556. BEQ foundeditor
  557. ADR R0,ename3
  558. BL strcmp
  559. BEQ foundeditor
  560. ADR R0,ename4
  561. BL strcmp
  562. BEQ foundeditor
  563. ADD R3,R3,#16
  564. B geloop2
  565.  
  566. .foundeditor
  567. LDR R0,[R3,#0]
  568. LDMFD R13!,{R14}
  569. BIC R14,R14,#1<<28
  570. MOVS PC,R14
  571.  
  572. .noeditors
  573. LDMFD R13!,{R14}
  574. ORR R14,R14,#1<<28
  575. MOVS PC,R14
  576.  
  577. .selfhelpcom
  578. DCB "Run Microhelp:!Help",0
  579. ALIGN
  580.  
  581. .dohelp
  582. ADR R0,selfhelpcom
  583. SWI Wimp_StartTask
  584. B menuins
  585.  
  586. ; Main redraw code
  587.  
  588. .redraw
  589. ADD R1,R12,#v.data
  590. SWI Wimp_RedrawWindow
  591. MOV R11,R1
  592. CMP R0,#0
  593. BEQ eventins
  594. .rectloop
  595. MOV R0,#7
  596. STR R0,[R12,#v.colour]
  597. MOV R0,#0
  598. STR R0,[R12,#v.heading]
  599. LDR R0,[R12,#v.filewidth]
  600. STR R0,[R12,#v.oldwidth]
  601. LDR R0,[R11,#wimp_r.vminx]
  602. ADD R0,R0,#4
  603. LDR R2,[R11,#wimp_r.scrx]
  604. SUB R0,R0,R2
  605.  
  606. LDR R1,[R11,#wimp_r.vmaxy]
  607. SUB R1,R1,#4
  608. LDR R2,[R11,#wimp_r.scry]
  609. SUB R1,R1,R2
  610.  
  611.  
  612. LDR R2,[R11,#wimp_r.gmaxy]
  613. SUB R1,R1,R2
  614.  
  615. LDR R10,[R12,#v.textptr]
  616. CMP R10,#0
  617. BEQ redrawdone
  618. .lineskiploop
  619. CMP R1,#Text_height*2
  620. BLT lineskipped
  621. BL skipline
  622. BCS redrawdone
  623. SUB R1,R1,#Text_height
  624. B lineskiploop
  625. .lineskipped
  626. LDR R2,[R11,#wimp_r.gmaxy]
  627. ADD R1,R1,R2
  628.  
  629. MOV R6,R0
  630. MOV R7,R1
  631. .writeloop
  632. BL movecsr
  633. LDR R4,[R12,#v.workptr]
  634. MOV R8,#0
  635. .writeloop2
  636. CMP R10,R4
  637. BGE redrawdone
  638. LDRB R0,[R10],#1
  639. CMP R0,#"<"
  640. BLEQ htmlcom
  641. CMP R0,#"&"
  642. BLEQ ampcom
  643. CMP R0,#9
  644. BLEQ drawtab
  645. CMP R0,#&0A
  646. BEQ writelineend
  647. CMP R0,#&20
  648. BLT writeloop2
  649. LDR R1,[R12,#v.heading]
  650. CMP R1,#0
  651. BGT writeheading
  652.  
  653. SWI OS_WriteC
  654. .writeheadingins
  655. ADD R8,R8,#Text_width
  656. B writeloop2
  657. .writelineend
  658. LDR R0,[R12,#v.filewidth]
  659. CMP R8,R0
  660. STRGT R8,[R12,#v.filewidth]
  661. SUB R7,R7,#Text_height
  662. LDR R0,[R11,#wimp_r.gminy]
  663. CMP R7,R0
  664. BGE writeloop
  665. .redrawdone
  666. ADD R1,R12,#v.data
  667. SWI Wimp_GetRectangle
  668. MOV R11,R1
  669. CMP R0,#0
  670. BNE rectloop
  671. LDR R0,[R12,#v.oldwidth]
  672. LDR R1,[R12,#v.filewidth]
  673. CMP R0,R1
  674. BLNE resize
  675. B eventins
  676.  
  677. .skipline
  678. STMFD R13!,{R0-R1,R14}
  679. LDR R1,[R12,#v.workptr]
  680. .skloop2
  681. LDRB R0,[R10],#1
  682. CMP R10,R1
  683. BGE skipoverend
  684. CMP R0,#&0A
  685. BNE skloop2
  686. LDMFD R13!,{R0-R1,R14}
  687. BIC R14,R14,#1<<29
  688. MOVS PC,R14
  689. .skipoverend
  690. LDMFD R13!,{R0-R1,R14}
  691. ORR R14,R14,#1<<29 ;flag end of text
  692. MOVS PC,R14
  693.  
  694. .writeheading
  695. STMFD R13!,{R5-R7}
  696. MOV R5,R0
  697. ADD R6,R6,R8
  698. SUB R6,R6,#2
  699. SUB R7,R7,#2
  700. BL movecsr
  701. LDR R0,[R12,#v.heading]
  702. CMP R0,#1
  703. MOVEQ R0,#3
  704. ADDNE R0,R0,#6
  705. CMP R0,#8
  706. MOVEQ R0,#15
  707. CMP R0,#13
  708. MOVEQ R0,#3
  709. SWI Wimp_SetColour
  710. MOV R0,R5
  711. SWI OS_WriteC
  712. LDR R0,[R12,#v.colour]
  713. SWI Wimp_SetColour
  714. ADD R6,R6,#2
  715. ADD R7,R7,#2
  716. BL movecsr
  717. MOV R0,R5
  718. SWI OS_WriteC
  719. LDMFD R13!,{R5-R7}
  720. B writeheadingins
  721.  
  722.  
  723. .drawtab
  724. STMFD R13!,{R6,R14}
  725. ADD R8,R8,#Text_width*8
  726. BIC R8,R8,#Text_width*8-1
  727. ADD R6,R6,R8
  728. BL movecsr
  729. MOV R0,#0
  730. LDMFD R13!,{R6,PC}
  731.  
  732. .hrefcom
  733. DCB 27,"A",27,"HREF",27,"=",27,34,0
  734. .namecom
  735. DCB 27,"A",27,"NAME",27,"=",27,34,0
  736. .ancendcom
  737. DCB 27,"/A",0
  738. .headingcom
  739. DCB "H",0
  740. .headingend
  741. DCB "/H",0
  742. .boldcom
  743. DCB "B",0
  744. .boldend
  745. DCB "/B",0
  746. ALIGN
  747.  
  748.  
  749.  
  750. .htmlcom
  751. STMFD R13!,{R1-R4,R14}
  752. ADR R0,hrefcom
  753. BL scanline
  754. BLEQ setblue
  755. ADR R0,ancendcom
  756. BL scanline
  757. BLEQ setblack
  758. ADR R0,namecom
  759. BL scanline
  760. BLEQ testanchor
  761. ADR R0,headingcom
  762. BL scanline
  763. BLEQ headingon
  764. ADR R0,headingend
  765. BL scanline
  766. BLEQ headingoff
  767. ADR R0,boldcom
  768. BL scanline
  769. BLEQ boldon
  770. ADR R0,boldend
  771. BL scanline
  772. BLEQ headingoff
  773.  
  774.  
  775.  
  776. .skipcomloop
  777. LDRB R0,[R10],#1
  778. CMP R10,R4
  779. BGE skipcomend
  780. CMP R0,#">"
  781. BEQ skippedcom
  782. CMP R0,#"<"
  783. BEQ badskip
  784. B skipcomloop
  785. .skippedcom
  786. MOV R0,#0
  787. LDMFD R13!,{R1-R4,PC}
  788. .skipcomend
  789. MOV R0,#&0A
  790. LDMFD R13!,{R1-R4,PC}
  791.  
  792. .badskip
  793. SWI OS_WriteS
  794. DCB "[Error : Embedded tag missing '>' ]",0
  795. ALIGN
  796. B skippedcom
  797.  
  798. .setblack
  799. STMFD R13!,{R14}
  800. MOV R0,#0
  801. STR R0,[R12,#v.link]
  802. MOV R0,#7
  803. STR R0,[R12,#v.colour]
  804. SWI Wimp_SetColour
  805. LDMFD R13!,{PC}
  806.  
  807. .setblue
  808. STMFD R13!,{R14}
  809. STR R1,[R12,#v.link]
  810. MOV R0,#8
  811. STR R0,[R12,#v.colour]
  812. SWI Wimp_SetColour
  813. LDMFD R13!,{PC}
  814.  
  815. .setred
  816. STMFD R13!,{R14}
  817. MOV R0,#11
  818. STR R0,[R12,#v.colour]
  819. SWI Wimp_SetColour
  820. LDMFD R13!,{PC}
  821.  
  822. .testanchor
  823. STMFD R13!,{R14}
  824. ADD R0,R12,#v.anchor ;R1 is as it should be
  825. LDRB R2,[R0]
  826. CMP R2,#0
  827. LDMEQFD R13!,{PC}
  828. BL strcmp
  829. LDMNEFD R13!,{PC}
  830. STR R6,[R12,#v.anc]
  831. BL setred
  832. LDMFD R13!,{PC}
  833.  
  834. .headingon
  835. LDRB R0,[R10,#1]
  836. SUBS R0,R0,#"0"
  837. CMP R0,#1
  838. MOVLE R0,#1
  839. CMP R0,#6
  840. MOVGT R0,#0
  841. STR R0,[R12,#v.heading]
  842. MOV PC,R14
  843. .boldon
  844. MOV R0,#7
  845. STR R0,[R12,#v.heading]
  846. MOV PC,R14
  847.  
  848. .headingoff
  849. STMFD R13!,{R14}
  850. MOV R0,#0
  851. STR R0,[R12,#v.heading]
  852. BL setblack
  853. LDMFD R13!,{PC}
  854.  
  855. .ampamp
  856. DCB "AMP;",0
  857. .amplt
  858. DCB "LT;",0
  859. ALIGN
  860. .ampcom
  861. STMFD R13!,{R1-R4,R14}
  862. MOV R3,#0
  863. ADR R0,ampamp
  864. BL scanline
  865. MOVEQ R3,#"&"
  866. ADR R0,amplt
  867. BL scanline
  868. MOVEQ R3,#"<"
  869. .skipamploop
  870. LDRB R0,[R10],#1
  871. CMP R10,R4
  872. BGE skipampend
  873. CMP R0,#";"
  874. BEQ skippedamp
  875. CMP R0,#"&"
  876. BEQ badskipamp
  877. B skipamploop
  878. .skippedamp
  879. MOV R0,R3
  880. LDMFD R13!,{R1-R4,PC}
  881. .skipampend
  882. MOV R0,#&0A
  883. LDMFD R13!,{R1-R4,PC}
  884.  
  885. .badskipamp
  886. SWI OS_WriteS
  887. DCB "[Error : Embedded entity missing ';' ]",0
  888. ALIGN
  889. B skippedamp
  890.  
  891. .resize
  892. STMFD R13!,{R0-R1,R14}
  893. ADD R1,R12,#v.data
  894. MOV R0,#0
  895. STR R0,[R1]
  896. STR R0,[R1,#12]
  897. LDR R0,[R12,#v.filewidth]
  898. ADD R0,R0,#4
  899. CMP R0,#Window_width
  900. MOVLT R0,#Window_width
  901. BIC R0,R0,#3
  902. STR R0,[R1,#8]
  903. LDR R0,[R12,#v.fileheight]
  904. ADD R0,R0,#4
  905. CMP R0,#1024
  906. MOVLT R0,#1024
  907. RSB R0,R0,#0
  908.  
  909. BIC R0,R0,#3
  910. STR R0,[R1,#4]
  911. LDR R0,[R12,#v.viewerhandle]
  912. SWI Wimp_SetExtent
  913. LDMFD R13!,{R0-R1,PC}
  914.  
  915. .open
  916. MOV R0,#0
  917. ADD R1,R12,#v.data
  918. SWI Wimp_OpenWindow
  919. B eventins
  920.  
  921. .zerovscroll
  922. STMFD R13!,{R14}
  923. MOV R0,#0
  924. BL movevscroll
  925. LDMFD R13!,{PC}
  926.  
  927. .jumptoanchor
  928. STMFD R13!,{R14}
  929. BL jtscan
  930. MOV R0,#0
  931. LDRCC R0,[R12,#v.anc]
  932. SUBS R0,R0,#4*Text_height
  933. MOVMI R0,#0
  934. STR R0,[R12,#v.anc]
  935. BL movevscroll
  936. LDMFD R13!,{PC}
  937.  
  938. .movevscroll
  939. STMFD R13!,{R3,R14}
  940. MOV R3,R0
  941. ADD R1,R12,#v.data
  942. LDR R0,[R12,#v.viewerhandle]
  943. STR R0,[R1,#0]
  944. SWI Wimp_GetWindowState
  945. RSB R0,R3,#0
  946. STR R0,[R1,#wimp_r.scry]
  947. SWI Wimp_OpenWindow
  948. LDMFD R13!,{R3,PC}
  949.  
  950. .movecsr
  951. STMFD R13!,{R0,R14}
  952. SWI 256+25
  953. SWI 256+188
  954. AND R0,R6,#&FF
  955. SWI OS_WriteC
  956. AND R0,R6,#&FF00
  957. MOV R0,R0,LSR #8
  958. SWI OS_WriteC
  959. AND R0,R7,#&FF
  960. SWI OS_WriteC
  961. AND R0,R7,#&FF00
  962. MOV R0,R0,LSR #8
  963. SWI OS_WriteC
  964. LDMFD R13!,{R0,PC}
  965.  
  966. .mesrecd
  967. ADD R1,R12,#v.data
  968. LDR R0,[R1,#16]
  969. CMP R0,#0
  970. BEQ doquit
  971. CMP R0,#1
  972. BEQ mesdatasave
  973. CMP R0,#3
  974. BEQ mesdataload
  975. CMP R0,#6
  976. BEQ mesramfetch
  977. MOV R2,#&400CC ;Message_windowinfo
  978. CMP R0,R2
  979. BEQ mesiconize
  980. B eventins
  981.  
  982. .mesramfetch
  983. ; the ram transfer message
  984. ; we'll use the end of the v.data block as a 128 byte cache
  985.  
  986. LDR R0,[R1,#8]
  987. STR R0,[R1,#12] ;mov my_ref into your_ref
  988. LDR R9,[R1,#4]; target handle
  989. LDR R8,[R1,#20]; target buffer
  990. LDR R7,[R1,#24]; target buffer length
  991. MOV R6,#0      ; bytes transferred
  992. LDR R5,[R12,#v.exporttype]; if 1, export the file with HTML comms
  993. LDR R10,[R12,#v.ramptr] ;our pointer to our progress through the file so far
  994. CMP R10,#0
  995. BEQ eventins
  996. ADD R11,R12,#v.data+128 ;this points to our write buffer
  997. .mrwriteloop
  998. CMP R7,#0               ;have we filled the target's buffer?
  999. BLE mrend
  1000. LDR R4,[R12,#v.textend]
  1001. CMP R10,R4              ;have we finished our text?
  1002. MOVGE R4,#-1; flag this as the last message
  1003. BGE mrend
  1004. LDRB R0,[R10],#1
  1005. CMP R5,#1
  1006. BEQ mrskipdecode
  1007. CMP R0,#"<"             ;remove html commands
  1008. BLEQ htmlcom
  1009. CMP R0,#"&"
  1010. BLEQ ampcom
  1011. .mrskipdecode
  1012. CMP R0,#0
  1013. BEQ mrwriteloop
  1014. STRB R0,[R11],#1
  1015. ADD R6,R6,#1            ;inc the bytes transferred count
  1016. SUBS R7,R7,#1           ;dec the target buffer size
  1017. ADD R0,R12,#v.data+256  ;have we filled our cache?
  1018. CMP R11,R0
  1019. BLGE transcache         ;if so, empty it
  1020. B mrwriteloop
  1021.  
  1022. .mrend
  1023. BL transcache           ;transfer the part-filled cache
  1024. STR R10,[R12,#v.ramptr] ;save our pointer for the next message
  1025. ;now write our wimp message
  1026. ADD R1,R12,#v.data
  1027. MOV R0,#28
  1028. STR R0,[R1,#0]          ;message block size
  1029. MOV R0,#7     
  1030. STR R0,[R1,#16]         ;message type Message_RAMTransmit
  1031. ;don't touch [R1,#20], it's the target buffer address
  1032. STR R6,[R1,#24]         ;no.of bytes transferred
  1033. MOV R0,#18   ;message type User_Message_Recorded
  1034. CMP R6,#0    ;is this the last message because it's size is zero?
  1035. CMPNE R4,#-1 ;is this the last because we've reached the end of our text?
  1036. MOVEQ R0,#0
  1037. STREQ R0,[R12,#v.ramptr] ; we shouldn't get another message after this
  1038.  
  1039. MOVEQ R0,#17 ;User_Message
  1040. MOV R2,R9    ;destination task handle
  1041. SWI Wimp_SendMessage
  1042.  
  1043. B eventins
  1044.  
  1045.  
  1046.  
  1047.  
  1048. .mesramfail
  1049. B eventins
  1050.  
  1051.  
  1052. .transcache
  1053. STMFD R13!,{R0-R4,R14}
  1054. LDR R0,[R12,#v.taskhandle]
  1055. ADD R1,R12,#v.data+128
  1056. MOV R2,R9  ;target handle
  1057. MOV R3,R8  ;target buffer
  1058. SUBS R4,R11,R1
  1059. SWINE Wimp_TransferBlock
  1060. ADD R8,R8,R4  ;advance target buffer pointer
  1061. ADD R11,R12,#v.data+128; reset R11 to start of cache
  1062. LDMFD R13!,{R0-R4,PC}
  1063.  
  1064. .savepath
  1065. DCB "<Wimp$Scrap>",0
  1066. ALIGN
  1067.  
  1068. .mesdatasave
  1069. LDR R0,[R1,#20]
  1070. LDR R2,[R12,#v.viewerhandle]
  1071. CMP R0,R2
  1072. BNE eventins
  1073. MOV R10,R1
  1074. LDR R0,[R10,#8]
  1075. STR R0,[R10,#12]
  1076. MOV R0,#256
  1077. STR R0,[R1,#0]
  1078. MOV R0,#2; Message_DataSaveAck
  1079. STR R0,[R10,#16]
  1080.  
  1081. MOV R0,#-1
  1082. STR R0,[R10,#36]
  1083. ADR R1,savepath
  1084. ADD R0,R10,#44
  1085. BL strcpy
  1086. MOV R0,#17
  1087. MOV R1,R10
  1088. LDR R2,[R1,#4]
  1089. SWI Wimp_SendMessage
  1090. B eventins
  1091.  
  1092. .mesdataload
  1093. LDR R0,[R1,#20]
  1094. LDR R2,[R12,#v.viewerhandle]
  1095. CMP R0,R2
  1096. BNE eventins
  1097. LDR R0,[R1,#8]
  1098. STR R0,[R1,#12] ;mov my_ref into your_ref
  1099. MOV R0,#4
  1100. STR R0,[R1,#16]
  1101. MOV R0,#17
  1102. LDR R2,[R1,#4]
  1103. SWI Wimp_SendMessage
  1104. ADD R1,R12,#v.data
  1105. ADD R0,R1,#44
  1106. STR R0,[R12,#v.link]
  1107. BL swapfile       
  1108. BVS eventins
  1109. BL doswap
  1110. B eventins
  1111.  
  1112. .iconsprite
  1113. DCB "mhelp",0
  1114. ALIGN
  1115.  
  1116. .mesiconize
  1117. LDR R0,[R1,#20]
  1118. LDR R2,[R12,#v.viewerhandle]
  1119. CMP R0,R2
  1120. BNE menuins
  1121.  
  1122. MOV R10,R1
  1123. LDR R0,[R10,#8]
  1124. STR R0,[R10,#12] ;mov my_ref into your_ref
  1125. LDR R9,[R10,#4]; target handle
  1126. MOV R0,#60
  1127. STR R0,[R10,#0]
  1128. MOV R0,#&400CC;Message_WindowInf
  1129. STR R0,[R10,#16]
  1130. LDR R0,[R12,#v.viewerhandle]
  1131. STR R0,[R10,#20]
  1132. MOV R0,#0
  1133. STR R0,[R10,#24]
  1134. ADD R0,R10,#28
  1135. ADR R1,iconsprite
  1136. BL strcpy
  1137. ADD R0,R12,#v.filename
  1138. MOV R3,R0
  1139. BL strseek
  1140. MOV R2,#11
  1141. .iconloop
  1142. LDRB R1,[R0,#-1]!
  1143. CMP R1,#"."
  1144. CMPNE R1,#":"
  1145. MOVEQ R2,#0
  1146. SUBS R2,R2,#1
  1147. BGT iconloop
  1148. ADD R0,R0,#1
  1149. CMP R0,R3
  1150. MOVLT R0,R3
  1151. MOV R1,R0
  1152. ADD R0,R10,#36
  1153. BL strcpy
  1154. MOV R0,#17
  1155. ADD R1,R12,#v.data
  1156. MOV R2,R9
  1157. SWI Wimp_SendMessage
  1158. B menuins
  1159.  
  1160.  
  1161.  
  1162.  
  1163.  
  1164. .ackrecd
  1165. ;received a message acknowledgement
  1166. ;usually when out Message_DataLoad has bounced
  1167. LDR R0,[R1,#4] ;extract the senders task handle
  1168. LDR R2,[R12,#v.taskhandle]
  1169. CMP R0,R2 ;is it us?
  1170. BNE eventins
  1171. LDR R0,[R1,#16]
  1172. CMP R0,#5 ;is it a dataload?
  1173. BNE eventins
  1174. LDR R2,runcom
  1175. STR R2,[R1,#40]
  1176. ADD R0,R1,#40
  1177. SWI Wimp_StartTask
  1178. ; and pass to Wimp_StartTask
  1179. B eventins
  1180.  
  1181. .runcom
  1182. DCB "Run "
  1183.  
  1184. .close
  1185. LDR R9,[R1,#0];closed handle
  1186. LDR R2,[R12,#v.viewerhandle]
  1187. CMP R9,R2
  1188. BNE closeinfo
  1189. ADD R1,R12,#v.data+128
  1190. SWI Wimp_GetPointerInfo
  1191. LDR R0,[R1,#8];get button state
  1192. TST R0,#1
  1193. BNE closeback
  1194. ADD R1,R12,#v.data
  1195. SWI Wimp_CloseWindow
  1196. B doquit
  1197.  
  1198. .closeinfo
  1199. SWI Wimp_CloseWindow
  1200. B eventins
  1201.  
  1202. .doquit
  1203. MOV R0,#1
  1204. STR R0,[R12,#v.quit]
  1205. B eventins
  1206.  
  1207. .templatefile
  1208. DCB "Microhelp:Templates",0
  1209. .infoname
  1210. DCB "Proginfo",0
  1211. .viewername
  1212. DCB "Viewer",0
  1213. ALIGN
  1214.  
  1215. .openinfo
  1216. STMFD R13!,{R14}
  1217. LDR R0,[R12,#v.infohandle]
  1218. ADD R1,R12,#v.data
  1219. STR R0,[R1]
  1220. SWI Wimp_GetWindowState
  1221. MOV R0,#-1
  1222. STR R0,[R1,#28]
  1223. SWI Wimp_OpenWindow
  1224. LDMFD R13!,{PC}
  1225.  
  1226. .openviewer
  1227. STMFD R13!,{R14}
  1228. LDR R0,[R12,#v.viewerhandle]
  1229. ADD R1,R12,#v.data
  1230. STR R0,[R1]
  1231. SWI Wimp_GetWindowState
  1232. MOV R0,#-1
  1233. STR R0,[R1,#28]
  1234. SWI Wimp_OpenWindow
  1235. LDMFD R13!,{PC}
  1236.  
  1237.  
  1238. .createwindows
  1239. STMFD R13!,{R14}
  1240. LDR R1,[R12,#v.infotemp]
  1241. SWI Wimp_CreateWindow
  1242. STR R0,[R12,#v.infohandle]
  1243. STR R0,infohandle
  1244. LDR R1,[R12,#v.viewertemp]
  1245. SWI Wimp_CreateWindow
  1246. STR R0,[R12,#v.viewerhandle]
  1247. LDMFD R13!,{PC}
  1248.  
  1249. .loadtemplates
  1250. STMFD R13!,{R14}
  1251. ADD R1,R12,#v.templates
  1252. STR R1,[R12,#v.tempptr]
  1253. ADD R1,R12,#v.icons
  1254. STR R1,[R12,#v.iconptr]
  1255. ADR R1,templatefile
  1256. SWI Wimp_OpenTemplate
  1257. ADR R0,infoname
  1258. BL loadtemp
  1259. BVS closetemp
  1260. STR R0,[R12,#v.infotemp]
  1261. ADR R0,viewername
  1262. BL loadtemp
  1263. BVS closetemp
  1264. STR R0,[R12,#v.viewertemp]
  1265. .closetemp
  1266. SWI Wimp_CloseTemplate
  1267. LDMFD R13!,{PC}
  1268.  
  1269. .loadtemp
  1270. STMFD R13!,{R1-R6,R14}
  1271. MOV R1,R0
  1272. ADD R0,R12,#v.buffer
  1273. BL strcpy
  1274.  
  1275. ;MOV R1,#-1
  1276. ;LDR R2,[R12,#v.iconptr]
  1277. ;ADD R3,R12,#v.iconsend
  1278. ;MOV R4,#-1
  1279. ;ADD R5,R12,#v.buffer
  1280. ;MOV R6,#0
  1281. ;SWI Wimp_LoadTemplate
  1282. ;CMP R6,#0
  1283. ;LDMEQFD R13!,{R1-R6,R14}
  1284. ;BEQ notemperr
  1285. ;STR R1,[R12,#v.tempsize]
  1286. ;STR R2,[R12,#v.iconsize]
  1287. ;MOV PC,#0
  1288. ;LDR R0,[R12,#v.tempptr]
  1289. ;ADD R0,R0,R1
  1290. ;ADD R1,R12,#v.icons;end of template area
  1291. ;CMP R0,R1
  1292. ;LDMGTFD R13!,{R1-R6,R14}
  1293. ;BGT tempspaceerr
  1294. ;LDR R0,[R12,#v.iconptr]
  1295. ;ADD R0,R0,R2
  1296. ;ADD R1,R12,#v.iconsend
  1297. ;CMP R0,R1
  1298. ;LDMGTFD R13!,{R1-R6,R14}
  1299. ;BGT iconspaceerr
  1300.  
  1301. LDR R1,[R12,#v.tempptr]
  1302. LDR R2,[R12,#v.iconptr]
  1303. ADD R3,R12,#v.iconsend
  1304. MOV R4,#-1
  1305. ADD R5,R12,#v.buffer
  1306. MOV R6,#0
  1307. SWI Wimp_LoadTemplate
  1308. CMP R6,#0
  1309. LDMEQFD R13!,{R1-R6,R14}
  1310. BEQ notemperr
  1311. LDR R0,[R12,#v.tempptr]
  1312. ;LDR R1,[R12,#v.tempsize]
  1313. ;ADD R1,R1,#3
  1314. ;BIC R1,R1,#3
  1315. ADD R2,R0,#&1A8
  1316. STR R2,[R12,#v.tempptr]
  1317. LDR R2,[R12,#v.iconptr]
  1318. ;LDR R1,[R12,#v.iconsize]
  1319. ;ADD R1,R1,#3
  1320. ;BIC R1,R1,#3
  1321. ADD R2,R2,#&50
  1322. STR R2,[R12,#v.iconptr]
  1323. LDMFD R13!,{R1-R6,PC}
  1324.  
  1325.  
  1326. .swapfile
  1327. STMFD R13!,{R14}
  1328. ADD R10,R12,#v.filename
  1329. LDR R11,[R12,#v.link]
  1330. CMP R11,#0
  1331. LDMEQFD R13!,{PC}
  1332. BL writenumanchor
  1333. BL windforward
  1334. LDRB R0,[R11]
  1335. CMP R0,#"#" ;is this a link inside this file?
  1336. BEQ locallink
  1337. MOV R0,R11
  1338. BL testifrooted
  1339. BLEQ swaprooted
  1340. BEQ noadddot
  1341. .diruploop
  1342. LDRB R1,[R11]
  1343. CMP R1,#"^"
  1344. BNE nodirup
  1345. MOV R0,R10
  1346. BL removedir
  1347. LDMVSFD R13!,{PC} ;error if can't remove entry
  1348. ADD R11,R11,#2
  1349. B diruploop
  1350. .nodirup
  1351. MOV R0,R10
  1352. BL removedir
  1353. LDMVSFD R13!,{PC} ;error if can't remove entry
  1354.  
  1355. .noadddot
  1356. MOV R1,R11
  1357. BL filestrcat
  1358. BL grabanchor
  1359. LDMFD R13!,{R14}
  1360. BIC R14,R14,#1<<28
  1361. MOVS PC,R14
  1362.  
  1363. .locallink
  1364. MOV R0,R11
  1365. BL getanchor
  1366. LDMFD R13!,{R14}
  1367. BIC R14,R14,#1<<28
  1368. MOVS PC,R14
  1369.  
  1370.  
  1371. .swaprooted
  1372. STMFD R13!,{R1,R14}
  1373. ADD R0,R12,#v.filename
  1374. MOV R1,#0
  1375. STRB R1,[R0]    ;leave R0 set correctly
  1376. LDMFD R13!,{R1,PC}
  1377.  
  1378. .dot
  1379. DCB ".",0
  1380. ALIGN
  1381.  
  1382. .doswap
  1383. STMFD R13!,{R14}
  1384. BL readfile
  1385. BVS badswap
  1386. BCS nontext
  1387. BL resize
  1388. BL jumptoanchor
  1389. BL forceredraw
  1390. LDMFD R13!,{PC}
  1391.  
  1392. .doswapagain
  1393. STMFD R13!,{R14}
  1394. BL readfile
  1395. BLVS forceredraw
  1396. LDMFD R13!,{PC}
  1397.  
  1398.  
  1399. .badswap
  1400. MOV R0,#0
  1401. ADD R1,R12,#v.filename
  1402. BL openerr
  1403. BL forceredraw
  1404. ADD R0,R12,#v.filename2
  1405. LDRB R0,[R0]
  1406. CMP R0,#0
  1407. LDMEQFD R13!,{PC}
  1408.  
  1409. .nontext
  1410. BL windback
  1411. BL doswapagain
  1412. LDMFD R13!,{PC}
  1413.  
  1414. .swaptest
  1415. STMFD R13!,{R14}
  1416. BL readfile
  1417. LDMFD R13!,{PC}
  1418.  
  1419. .writenumanchor
  1420. STMFD R13!,{R14}
  1421. ADD R1,R12,#v.data
  1422. LDR R0,[R12,#v.viewerhandle]
  1423. STR R0,[R1,#0]
  1424. SWI Wimp_GetWindowState
  1425. ADD R0,R12,#v.anchor
  1426. MOV R2,#&FFFFFFFF
  1427. STR R2,[R0]
  1428. LDR R2,[R1,#wimp_r.scry]
  1429. RSB R2,R2,#0
  1430. ADD R2,R2,#Text_height*4
  1431. STR R2,[R0,#4]
  1432. MOV R2,#0
  1433. STR R2,[R0,#8]
  1434. LDMFD R13!,{PC}
  1435.  
  1436.  
  1437.  
  1438. .windforward
  1439. STMFD R13!,{R14}
  1440. ADD R2,R12,#v.filename9
  1441. ADD R3,R12,#v.filename8
  1442. MOV R4,#8
  1443. .wfloop
  1444. MOV R0,R2
  1445. MOV R1,R3
  1446. ADD R2,R2,#Strlen
  1447. ADD R3,R3,#Strlen
  1448. BL strcpy
  1449. SUBS R4,R4,#1
  1450. BGT wfloop
  1451.  
  1452. ADD R2,R12,#v.anchor9
  1453. ADD R3,R12,#v.anchor8
  1454. MOV R4,#8
  1455. .afloop
  1456. MOV R0,R2
  1457. MOV R1,R3
  1458. ADD R2,R2,#Anclen
  1459. ADD R3,R3,#Anclen
  1460. BL anccpy
  1461. SUBS R4,R4,#1
  1462. BGT afloop
  1463. MOV R0,#0
  1464. STRB R0,[R12,#v.anchor]
  1465. LDMFD R13!,{PC}
  1466.  
  1467. .windback
  1468. STMFD R13!,{R14}
  1469. ADD R2,R12,#v.filename
  1470. ADD R3,R12,#v.filename2
  1471. MOV R4,#8
  1472. .wbloop
  1473. MOV R0,R2
  1474. MOV R1,R3
  1475. SUB R2,R2,#Strlen
  1476. SUB R3,R3,#Strlen
  1477. BL strcpy
  1478. SUBS R4,R4,#1
  1479. BGT wbloop
  1480. ADD R3,R3,#Strlen
  1481. MOV R0,#0
  1482. STRB R0,[R3]
  1483.  
  1484. ADD R2,R12,#v.anchor
  1485. ADD R3,R12,#v.anchor2
  1486. MOV R4,#8
  1487. .abloop
  1488. MOV R0,R2
  1489. MOV R1,R3
  1490. SUB R2,R2,#Anclen
  1491. SUB R3,R3,#Anclen
  1492. BL anccpy
  1493. SUBS R4,R4,#1
  1494. BGT abloop
  1495. ADD R3,R3,#Anclen
  1496. MOV R0,#0
  1497. STRB R0,[R3]
  1498.  
  1499. LDMFD R13!,{PC}
  1500.  
  1501. .readfile
  1502. ; generic read a file routine
  1503. ; returns V set if file does not exist
  1504. ; returns C set if file is not text
  1505. STMFD R13!,{R14}
  1506. ADD R1,R12,#v.filename
  1507. LDRB R0,[R1]
  1508. CMP R0,#0
  1509. LDMEQFD R13!,{R14}
  1510. BEQ nullfileerr
  1511. BL getfiletype
  1512. CMP R0,#&1000
  1513. BEQ opendir
  1514.  
  1515. MOV R1,#&FFF
  1516. CMP R0,R1
  1517. BNE runfile
  1518.  
  1519. BL openfile
  1520. LDMVSFD R13!,{PC}
  1521. BL workshrink
  1522. MOV R0,#0
  1523. STR R0,[R12,#v.html]
  1524. BL denyexporthtml
  1525. LDR R10,[R12,#v.workspace]
  1526. LDR R9,[R12,#v.workend]
  1527. MOV R0,#Window_width
  1528. STR R0,[R12,#v.filewidth]
  1529. MOV R0,#0
  1530. STR R0,[R12,#v.fileheight]
  1531. .readloop2
  1532. STR R10,[R12,#v.workptr]
  1533. SUB R0,R9,R10
  1534. CMP R0,#&500 ;maxi.possible extension from one cache read
  1535. BGE noextend
  1536. BL workextend
  1537. MOVVS R0,#0
  1538. STRVS R0,[R12,#v.textptr]
  1539. LDMVSFD R13!,{PC}
  1540. .noextend
  1541. BL readcache 
  1542. BL scanforhtml
  1543. MOV R8,R0
  1544. MOV R7,R0
  1545.  
  1546. ADD R11,R12,#v.data
  1547. LDR R6,[R12,#v.html]
  1548. .readloop
  1549. CMP R8,#0
  1550. BLE readdone
  1551. LDRB R0,[R11],#1
  1552. CMP R6,#1
  1553. BEQ notrans
  1554. CMP R0,#"<"
  1555. BLEQ lttrans
  1556. CMP R0,#"&"
  1557. BLEQ amptrans
  1558. .notrans
  1559. CMP R0,#&0A
  1560. LDREQ R1,[R12,#v.fileheight]
  1561. ADDEQ R1,R1,#Text_height
  1562. STREQ R1,[R12,#v.fileheight]
  1563. STRB R0,[R10],#1
  1564. SUBS R8,R8,#1
  1565. B readloop
  1566. .readdone
  1567. CMP R7,#256
  1568. BGE readloop2
  1569. STR R10,[R12,#v.workptr]
  1570. BL closefile
  1571. LDR R0,[R12,#v.workspace]
  1572. STR R0,[R12,#v.textptr]
  1573. LDR R0,[R12,#v.workptr]
  1574. STR R0,[R12,#v.textend]
  1575. LDR R0,[R12,#v.html]
  1576. CMP R0,#1
  1577. BLEQ allowexporthtml
  1578.  
  1579. LDMFD R13!,{R14}
  1580. BIC R14,R14,#1<<29
  1581. MOVS PC,R14
  1582.  
  1583. .lttrans
  1584. MOV R0,#"&"
  1585. STRB R0,[R10],#1
  1586. MOV R0,#"l"
  1587. STRB R0,[R10],#1
  1588. MOV R0,#"t"
  1589. STRB R0,[R10],#1
  1590. MOV R0,#";"
  1591. MOV PC,R14
  1592.  
  1593. .amptrans
  1594. MOV R0,#"&"
  1595. STRB R0,[R10],#1
  1596. MOV R0,#"a"
  1597. STRB R0,[R10],#1
  1598. MOV R0,#"m"
  1599. STRB R0,[R10],#1
  1600. MOV R0,#"p"
  1601. STRB R0,[R10],#1
  1602. MOV R0,#";"
  1603. MOV PC,R14
  1604.  
  1605.  
  1606.  
  1607. .htmloncom
  1608. DCB "<",27,"HTML",27,">",0
  1609. ALIGN
  1610.  
  1611. .scanforhtml
  1612. STMFD R13!,{R0-R4,R10,R14}
  1613. ADD R10,R12,#v.data
  1614. ADD R4,R10,R0
  1615. ADR R0,htmloncom
  1616. BL scanline
  1617. MOV R0,#1
  1618. STREQ R0,[R12,#v.html]
  1619. LDMFD R13!,{R0-R4,R10,PC}
  1620.  
  1621.  
  1622. .workextend
  1623. STMFD R13!,{R5,R14}
  1624. LDR R0,[R12,#v.workptr]
  1625. LDR R1,[R12,#v.workspace]
  1626. SUB R0,R0,R1; get size of current heap
  1627. LDR R1,[R12,#v.appsize]
  1628. ADD R0,R0,R1; add application size
  1629. ADD R0,R0,#&1000; add a bit
  1630.  
  1631. MOV R1,#-1
  1632. MOV R5,R0
  1633. SWI Wimp_SlotSize
  1634. CMP R0,R5
  1635. LDMLTFD R13!,{R5,R14}
  1636. BLT nomemerr
  1637. SWI OS_GetEnv
  1638. STR R1,[R12,#v.workend]
  1639.  
  1640. LDMFD R13!,{R5,PC}
  1641.  
  1642. .workshrink
  1643. STMFD R13!,{R14}
  1644. LDR R1,[R12,#v.appsize]
  1645. ADD R0,R0,R1; add application size
  1646. ADD R0,R0,#&800; add a bit
  1647. MOV R1,#-1
  1648. SWI XWimp_SlotSize
  1649. LDMVSFD R13!,{PC}
  1650. SWI OS_GetEnv
  1651. STR R1,[R12,#v.workend]
  1652. LDMFD R13!,{PC}
  1653.  
  1654. .readcache
  1655. ; returns no.of bytes read in R0
  1656. STMFD R13!,{R1-R3,R14}
  1657. MOV R0,#4
  1658. LDR R1,[R12,#v.filehandle]
  1659. ADD R2,R12,#v.data
  1660. MOV R3,#256
  1661. SWI OS_GBPB
  1662. RSB R0,R3,#256
  1663. LDMFD R13!,{R1-R3,PC}
  1664.  
  1665.  
  1666. .opendir
  1667. BL isdirapp
  1668. BEQ runfile
  1669. ADD R10,R12,#v.data
  1670. MOV R0,#256
  1671. STR R0,[R10,#0]
  1672. MOV R0,#0
  1673. STR R0,[R10,#12]
  1674. MOV R0,#&400
  1675. STR R0,[R10,#16]
  1676. MOV R0,#0
  1677. STR R0,[R10,#20]
  1678. MOV R0,#0
  1679. STR R0,[R10,#24]
  1680. ADD R0,R10,#28
  1681. ADD R1,R12,#v.filename
  1682. BL filestrcpy
  1683. MOV R0,#17
  1684. MOV R1,R10
  1685. MOV R2,#0
  1686. SWI Wimp_SendMessage
  1687. LDMFD R13!,{R14}
  1688. ORR R14,R14,#1<<29
  1689. MOVS PC,R14
  1690.  
  1691.  
  1692.  
  1693.  
  1694.  
  1695. .runfile
  1696. ;run the file as if double-clicked
  1697. ;so send a Message_DataOpen
  1698. MOV R4,R0;file type
  1699. ADD R1,R12,#v.data
  1700. SWI Wimp_GetPointerInfo
  1701. LDR R2,[R1,#0];mouse coords
  1702. LDR R3,[R1,#4]
  1703.  
  1704. ADD R1,R12,#v.data
  1705. MOV R0,#256
  1706. STR R0,[R1,#0] 
  1707. MOV R0,#0
  1708. STR R0,[R1,#12]
  1709. MOV R0,#5
  1710. STR R0,[R1,#16];message type
  1711. LDR R0,[R12,#v.viewerhandle]
  1712. STR R0,[R1,#20]
  1713. MOV R0,#0
  1714. STR R0,[R1,#24]
  1715. STR R2,[R1,#28]
  1716. STR R3,[R1,#32]
  1717. MOV R0,#0
  1718. STR R0,[R1,#36]
  1719. STR R4,[R1,#40]
  1720. ADD R0,R1,#44
  1721. ADD R1,R12,#v.filename
  1722. BL strcpy
  1723. MOV R0,#18
  1724. ADD R1,R12,#v.data
  1725. MOV R2,#0
  1726. SWI Wimp_SendMessage
  1727. LDMFD R13!,{R14}
  1728. ORR R14,R14,#1<<29
  1729. MOVS PC,R14
  1730.  
  1731.  
  1732. .getfiletype
  1733. ; do this in a RISC OS 2 compatible form
  1734. STMFD R13!,{R1-R5,R14}
  1735. MOV R0,#5
  1736. ADD R1,R12,#v.filename
  1737. SWI XOS_File
  1738. MOVVS R0,#0
  1739. CMP R0,#0
  1740. MOVEQ R0,#&FFF  ;not a file - we'll trap this error later
  1741. LDMEQFD R13!,{R1-R5,PC}
  1742. CMP R0,#2
  1743. MOVGE R0,#&1000
  1744. LDMGEFD R13!,{R1-R5,PC}
  1745.  
  1746. AND R0,R2,#&FFF00
  1747. MOV R0,R0,LSR #8
  1748. LDMFD R13!,{R1-R5,PC}
  1749.  
  1750.  
  1751. .openfile
  1752. STMFD R13!,{R1,R14}
  1753. MOV R0,#&4C
  1754. ADD R1,R12,#v.filename
  1755. SWI XOS_Find
  1756. LDMVSFD R13!,{R1,PC}
  1757. STR R0,[R12,#v.filehandle]
  1758. LDMFD R13!,{R1,PC}
  1759.  
  1760. .closefile
  1761. STMFD R13!,{R0-R1,R14}
  1762. MOV R0,#0
  1763. LDR R1,[R12,#v.filehandle]
  1764. CMP R1,#0
  1765. SWINE XOS_Find
  1766. MOV R0,#0
  1767. STR R1,[R12,#v.filehandle]
  1768. LDMFD R13!,{R0-R1,PC}
  1769.  
  1770. .parse
  1771. ; parse environment string
  1772. STMFD R13!,{R14}
  1773. SWI OS_GetEnv
  1774. MOV R1,R0
  1775. ADR R0,filecom
  1776. BL stringsearch
  1777. LDMCSFD R13!,{R14}
  1778. BCS nofileerr
  1779. ADD R1,R0,#6
  1780. ADD R0,R12,#v.filename
  1781. BL filestrcpy
  1782. ADD R1,R12,#v.filename
  1783. LDRB R0,[R1]
  1784. CMP R0,#0
  1785. BLEQ setdefaultfile
  1786. BL getfileinfo
  1787. BVS openerr
  1788. CMP R0,#1
  1789. BEQ foundfile
  1790. CMP R0,#2
  1791. LDMNEFD R13!,{R14}
  1792. BNE openerr
  1793. .founddir
  1794. ADD R0,R12,#v.filename
  1795. ADR R1,contentstr
  1796. BL strcat
  1797. ADD R1,R12,#v.filename
  1798. BL getfileinfo
  1799. CMP R0,#1
  1800. LDMNEFD R13!,{R14}
  1801. BNE openerr
  1802. .foundfile
  1803. SWI OS_GetEnv
  1804. MOV R1,R0
  1805. ADR R0,anchorcom
  1806. BL stringsearch
  1807. BCS noanchorcom
  1808. ADD R1,R0,#8
  1809. ADD R0,R12,#v.anchor
  1810. BL filestrcpy
  1811. .noanchorcom
  1812. LDMFD R13!,{PC}
  1813.  
  1814. .filecom
  1815. DCB "-FILE ",0
  1816. .anchorcom
  1817. DCB "-ANCHOR ",0
  1818. .contentstr
  1819. DCB ".Contents",0
  1820. .defaultfile
  1821. DCB "Microhelp:^.Microhelp",0
  1822. ALIGN
  1823.  
  1824. .setdefaultfile
  1825. STMFD R13!,{R0-R1,R14}
  1826. ADD R0,R12,#v.filename
  1827. ADR R1,defaultfile
  1828. BL filestrcpy
  1829. LDMFD R13!,{R0-R1,PC}
  1830.  
  1831.  
  1832.  
  1833.  
  1834. .getfileinfo
  1835. STMFD R13!,{R14}
  1836. MOV R0,#5
  1837. SWI XOS_File
  1838. LDMFD R13!,{PC}
  1839.  
  1840. .testifrooted
  1841. STMFD R13!,{R0-R2,R14}
  1842. .loop11
  1843. LDRB R2,[R0],#1
  1844. CMP R2,#"$"
  1845. CMPNE R2,#":"
  1846. BEQ rooted
  1847. CMP R2,#34
  1848. MOVEQ R2,#0
  1849. CMP R2,#32
  1850. BGE loop11
  1851. LDMFD R13!,{R0-R2,R14}
  1852. BIC R14,R14,#1<<30
  1853. MOVS PC,R14
  1854. .rooted
  1855. LDMFD R13!,{R0-R2,R14}
  1856. ORR R14,R14,#1<<30
  1857. MOVS PC,R14
  1858.  
  1859.  
  1860. .filestrcat
  1861. STMFD R13!,{R0-R2,R14}
  1862. BL strseek
  1863. BL filestrcpy
  1864. LDMFD R13!,{R0-R2,PC}
  1865.  
  1866. .filestrcpy
  1867. STMFD R13!,{R0-R3,R14}
  1868. BL skipwhiteR1
  1869. .loop5
  1870. LDRB R2,[R1],#1
  1871. CMP R2,#34
  1872. MOVEQ R2,#0
  1873. CMP R2,#32
  1874. BLE filestrend
  1875. STRB R2,[R0],#1
  1876. B loop5
  1877. .filestrend
  1878. MOV R2,#0
  1879. STRB R2,[R0],#1
  1880. LDMFD R13!,{R0-R3,PC}
  1881.  
  1882. .grabanchor
  1883. STMFD R13!,{R0-R2,R14}
  1884. ADD R0,R12,#v.filename
  1885. MOV R1,R0
  1886. BL strseek
  1887. .loop7
  1888. LDRB R2,[R0,#-1]!
  1889. CMP R0,R1
  1890. BLE gafail
  1891. CMP R2,#":"
  1892. BEQ gafail
  1893. CMP R2,#"#"
  1894. BEQ gafound
  1895. B loop7
  1896. .gafound
  1897. MOV R1,#0
  1898. STRB R1,[R0]
  1899. BL getanchor
  1900. LDMFD R13!,{R0-R2,PC}
  1901. .gafail
  1902. MOV R0,#0
  1903. LDMFD R13!,{R0-R2,PC}
  1904.  
  1905. .getanchor
  1906. STMFD R13!,{R0-R1,R14}
  1907. ADD R1,R0,#1
  1908. ADD R0,R12,#v.anchor
  1909. BL strcpy
  1910. LDMFD R13!,{R0-R1,PC}
  1911.  
  1912. .isdirapp
  1913. STMFD R13!,{R0-R2,R14}
  1914. ADD R0,R12,#v.filename
  1915. MOV R1,R0
  1916. BL strseek
  1917. .loop17
  1918. LDRB R2,[R0,#-1]!
  1919. CMP R0,R1
  1920. BLE isfail
  1921. CMP R2,#":"
  1922. CMPNE R2,#"."
  1923. BEQ isfail
  1924. CMP R2,#"!"
  1925. BEQ isfound
  1926. B loop17
  1927. .isfound
  1928. LDMFD R13!,{R0-R2,R14}
  1929. ORR R14,R14,#1<<30
  1930. MOVS PC,R14
  1931. .isfail
  1932. LDMFD R13!,{R0-R2,R14}
  1933. BIC R14,R14,#1<<30
  1934. MOVS PC,R14
  1935.  
  1936.  
  1937. .strcat
  1938. STMFD R13!,{R0-R2,R14}
  1939. BL strseek
  1940. BL strcpy
  1941. LDMFD R13!,{R0-R2,PC}
  1942.  
  1943. .strseek
  1944. STMFD R13!,{R2,R14}
  1945. .loop2
  1946. LDRB R2,[R0],#1
  1947. CMP R2,#34
  1948. MOVEQ R2,#0
  1949. CMP R2,#32
  1950. BGE loop2
  1951. SUBS R0,R0,#1
  1952. LDMFD R13!,{R2,PC}
  1953.  
  1954. .strcmp
  1955. STMFD R13!,{R0-R3}
  1956. BIC R14,R14,#1<<30
  1957. .loop10
  1958. LDRB R2,[R0],#1
  1959. LDRB R3,[R1],#1
  1960. uppercase R2
  1961. uppercase R3
  1962. CMP R2,#0
  1963. ORREQ R14,R14,#1<<30
  1964. BEQ strcmpend
  1965. CMP R3,R2
  1966. BEQ loop10
  1967. .strcmpend
  1968. LDMFD R13!,{R0-R3}
  1969. MOVS PC,R14
  1970.  
  1971.  
  1972. .strcpy
  1973. STMFD R13!,{R0-R2,R14}
  1974. .loop1
  1975. LDRB R2,[R1],#1
  1976. CMP R2,#34
  1977. MOVEQ R2,#0
  1978. STRB R2,[R0],#1
  1979. CMP R2,#32
  1980. BGE loop1
  1981. LDMFD R13!,{R0-R2,PC}
  1982.  
  1983. .anccpy
  1984. STMFD R13!,{R0-R3,R14}
  1985. MOV R3,#32
  1986. .loopA1
  1987. LDRB R2,[R1],#1
  1988. STRB R2,[R0],#1
  1989. SUBS R3,R3,#1
  1990. BGT loopA1
  1991. LDMFD R13!,{R0-R3,PC}
  1992.  
  1993. .skipwhiteR1
  1994. STMFD R13!,{R2,R14}
  1995. .skipwhiteloop
  1996. LDRB R2,[R1]
  1997. CMP R2,#" "
  1998. LDMNEFD R13!,{R2,PC}
  1999. ADD R1,R1,#1
  2000. B skipwhiteloop
  2001.  
  2002. .removedir
  2003. ;removes the last entry from a path but leaves the : or .
  2004. ;returns end of string in R1
  2005. STMFD R13!,{R0-R2,R14}
  2006. MOV R1,R0
  2007. .loop3
  2008. LDRB R2,[R0],#1
  2009. CMP R2,#32
  2010. BGE loop3
  2011. SUB R0,R0,#2
  2012. .loop4
  2013. LDRB R2,[R0,#-1]!
  2014. CMP R0,R1
  2015. BLE noremovedir
  2016. CMP R2,#"."
  2017. CMPNE R2,#":"
  2018. BNE loop4
  2019. CMP R2,#":"
  2020. ADD R0,R0,#1
  2021. MOV R2,#0
  2022. STRB R2,[R0]
  2023. LDMFD R13!,{R0-R2,R14}
  2024. BIC R14,R14,#1<<28
  2025. MOVS PC,R14
  2026.  
  2027. .noremovedir
  2028. LDMFD R13!,{R0-R2,R14}
  2029. ORR R14,R14,#1<<28
  2030. MOVS PC,R14
  2031.  
  2032.  
  2033. .stringsearch
  2034. STMFD R13!,{R1-R5,R14}
  2035. MOV R4,R0
  2036. MOV R5,R1
  2037. .ssloop1
  2038. MOV R0,R4
  2039. MOV R1,R5
  2040. ADD R5,R5,#1
  2041. .ssloop2
  2042. LDRB R2,[R0],#1
  2043. LDRB R3,[R1],#1
  2044. CMP R2,#32    ;check for end of search string
  2045. BLT ssfound
  2046. CMP R3,#32    ;check for end of command line
  2047. BLT ssnotfound
  2048. uppercase R2
  2049. uppercase R3
  2050. CMP R2,R3
  2051. BNE ssloop1
  2052. B ssloop2
  2053. .ssfound
  2054. SUB R0,R5,#1
  2055. LDMFD R13!,{R1-R5,R14}
  2056. BIC R14,R14,#1<<29
  2057. MOVS PC,R14
  2058. .ssnotfound
  2059. MOV R0,#0
  2060. LDMFD R13!,{R1-R5,R14}
  2061. ORR R14,R14,#1<<29
  2062. MOVS PC,R14
  2063.  
  2064. ;R0 = command
  2065. ;R10 = string to scan
  2066. ;R4 = file limit
  2067. .scanline
  2068. STMFD R13!,{R2-R5,R14}
  2069. MOV R1,R10
  2070. .slloop
  2071. LDRB R2,[R0],#1
  2072. CMP R2,#0     ;check for end of search string
  2073. BEQ slfound
  2074. .slskipwhite
  2075. LDRB R3,[R1],#1
  2076. uppercase R2
  2077. uppercase R3
  2078. CMP R1,R4
  2079. BGT slnotfound
  2080. CMP R3,#&0A
  2081. BEQ slskipwhite
  2082. CMP R2,#27
  2083. BNE noskipwhite
  2084. CMP R3,#" "
  2085. BEQ slskipwhite
  2086. LDRB R2,[R0],#1
  2087. CMP R2,#0     ;check for end of search string
  2088. BEQ slfound
  2089. .noskipwhite
  2090. CMP R2,R3
  2091. BEQ slloop      ;drops through
  2092. .slnotfound
  2093. MOV R0,#0
  2094. LDMFD R13!,{R2-R5,R14}
  2095. BIC R14,R14,#1<<30
  2096. MOVS PC,R14
  2097. .slfound
  2098. SUB R0,R5,#1
  2099. LDMFD R13!,{R2-R5,R14}
  2100. ORR R14,R14,#1<<30
  2101. MOVS PC,R14
  2102.  
  2103. .writehex8
  2104. STMFD R13!,{R14}
  2105. ADD R1,R12,#v.buffer
  2106. MOV R2,#16
  2107. SWI OS_ConvertHex8
  2108. SWI OS_Write0
  2109. LDMFD R13!,{PC}
  2110.  
  2111. .wimperr
  2112. STMFD R13!,{R14}
  2113. MOV R1,#1
  2114. ADR R2,taskname
  2115. SWI XWimp_ReportError
  2116. LDMFD R13!,{R14}
  2117. ORR R14,R14,#1<<28
  2118. MOVS PC,R14
  2119.  
  2120. .nofileerr
  2121. ADR R0,nofiletext
  2122. B wimperr
  2123. .nofiletext
  2124. DCD &666
  2125. DCB "Microhelp : No -file command",0
  2126. ALIGN
  2127. .nomemoryerr
  2128. ADR R0,nomemorytext
  2129. SWI OS_GenerateError
  2130. .nomemorytext
  2131. DCD &666
  2132. DCB "Microhelp : Not enough memory",0
  2133. ALIGN
  2134. .stackfault
  2135. BL taskclose
  2136. ADR R0,stackfaulttext
  2137. SWI OS_GenerateError
  2138. .stackfaulttext
  2139. DCD &666
  2140. DCB "Microhelp : Stack fault",0
  2141. ALIGN
  2142.  
  2143. .nullfileerr
  2144. ADR R0,nullfiletext
  2145. B wimperr
  2146. .nullfiletext
  2147. DCD &666
  2148. DCB "Microhelp : Empty filename",0
  2149. ALIGN
  2150.  
  2151. .openerr
  2152. STMFD R13!,{R14}
  2153. MOV R0,#0
  2154. STR R0,[R12,#v.textptr]
  2155. MOV R2,#0
  2156. ADD R1,R12,#v.filename
  2157. MOV R0,#19
  2158. SWI XOS_File
  2159. B wimperr
  2160.  
  2161. .notemperr
  2162. ADR R0,notemptext
  2163. SWI OS_GenerateError
  2164. .notemptext
  2165. DCD &666
  2166. DCB "Microhelp : Failed to find template",0
  2167. ALIGN
  2168. ;.tempspaceerr
  2169. ;ADR R0,tempspacetext
  2170. ;SWI OS_GenerateError
  2171. ;.tempspacetext
  2172. ;DCD &666
  2173. ;DCB "Microhelp : No space for template",0
  2174. ;ALIGN
  2175. ;.iconspaceerr
  2176. ;ADR R0,iconspacetext
  2177. ;SWI OS_GenerateError
  2178. ;.iconspacetext
  2179. ;DCD &666
  2180. ;DCB "Microhelp : No space for icons",0
  2181. ;ALIGN
  2182. .guarderr
  2183. ADR R0,guardtext
  2184. SWI OS_GenerateError
  2185. .guardtext
  2186. DCD &666
  2187. DCB "Microhelp : String too long.  This could mean a missing ",34," in an HTML instruction or a problem with filenames.  Microhelp must leave the Desktop.",0
  2188. ALIGN
  2189. .ro3onlyerr
  2190. ADR R0,ro3onlytext
  2191. B wimperr
  2192. .nocontentserr
  2193. ADR R0,nocontentstext
  2194. B wimperr
  2195. .noindexerr
  2196. ADR R0,noindextext
  2197. B wimperr
  2198. .ro3onlytext
  2199. DCD &666
  2200. DCB "That feature is available only with RISC OS 3 or greater.",0
  2201. ALIGN
  2202. .nocontentstext
  2203. DCD &666
  2204. DCB "Could not find a Contents file",0
  2205. ALIGN
  2206. .noindextext
  2207. DCD &666
  2208. DCB "Could not find an Index file",0
  2209. ALIGN
  2210. .noeditorerr
  2211. ADR R0,noeditortext
  2212. B wimperr
  2213. .noeditortext
  2214. DCD &666
  2215. DCB "You need either Edit, Zap or StrongEd loaded to Export.",0
  2216. ALIGN
  2217. .nomemerr
  2218. ADR R0,nomemtext
  2219. B wimperr
  2220. .nomemtext
  2221. DCD &666
  2222. DCB "Not enough memory to load file.",0
  2223. ALIGN
  2224.  
  2225. .allowexporthtml
  2226. STMFD R13!,{R0,R14}
  2227. LDR R0,exportflags
  2228. BIC R0,R0,#1<<22
  2229. STR R0,exportflags
  2230. LDMFD R13!,{R0,PC}
  2231.  
  2232. .denyexporthtml
  2233. STMFD R13!,{R0,R14}
  2234. LDR R0,exportflags
  2235. ORR R0,R0,#1<<22
  2236. STR R0,exportflags
  2237. LDMFD R13!,{R0,PC}
  2238.  
  2239. .makemenu
  2240. LDR R0,[R1,#12] ;window handle
  2241. LDR R2,[R12,#v.viewerhandle]
  2242. CMP R0,R2
  2243. BNE eventins
  2244. LDR R2,[R1,#0]
  2245. LDR R3,[R1,#4]
  2246. SUB R2,R2,#m_width/2
  2247. SUB R3,R3,#0
  2248. .remakemenu
  2249. ADR R1,mainmenu
  2250. ADD R4,R12,#v.filename2
  2251. LDRB R4,[R4]
  2252. CMP R4,#0
  2253. LDR R4,backflags
  2254. ORREQ R4,R4,#1<<22
  2255. BICNE R4,R4,#1<<22
  2256. STR R4,backflags
  2257. SWI Wimp_CreateMenu
  2258. B eventins
  2259.  
  2260. #set m_back=0
  2261. #set m_export=1
  2262. #set m_newview=2
  2263. #set m_contents=3
  2264. #set m_index=4
  2265. #set m_info=5
  2266. #set m_help=6
  2267. #set m_quit=7
  2268. #set m_width=160
  2269.  
  2270. .mainmenu
  2271. DCB "Microhelp",0,0,0
  2272. DCB 7
  2273. DCB 2
  2274. DCB 7
  2275. DCB 0
  2276. DCD m_width
  2277. DCD 44
  2278. DCD 0
  2279.  
  2280.  
  2281. ;items
  2282. DCD 2
  2283. DCD -1
  2284. .backflags
  2285. DCD 1+(7<<24)
  2286. DCB "Back",0,0,0,0,0,0,0,0
  2287.  
  2288. DCD 0
  2289. DCD exportmenu
  2290. DCD 1+(7<<24)
  2291. DCB "Export",0,0,0,0,0,0
  2292.  
  2293. DCD 0
  2294. DCD -1
  2295. DCD 1+(7<<24)
  2296. DCB "New View",0,0,0,0
  2297.  
  2298.  
  2299. DCD 0
  2300. DCD -1
  2301. DCD 1+(7<<24)
  2302. DCB "Contents",0,0,0,0
  2303.  
  2304. DCD 2
  2305. DCD -1
  2306. DCD 1+(7<<24)
  2307. DCB "Index",0,0,0,0,0,0,0
  2308.  
  2309. DCD 0
  2310. .infohandle
  2311. DCD -1
  2312. DCD 1+(7<<24)
  2313. DCB "Info",0,0,0,0,0,0,0,0
  2314.  
  2315. DCD 0
  2316. DCD -1
  2317. DCD 1+(7<<24)
  2318. DCB "Help",0,0,0,0,0,0,0,0
  2319.  
  2320. DCD 128 ;*** end marker
  2321. DCD -1
  2322. DCD 1+(7<<24)
  2323. DCB "Quit",0,0,0,0,0,0,0,0
  2324.  
  2325. ALIGN
  2326.  
  2327. .exportmenu
  2328. DCB "Export",0,0,0,0,0,0
  2329. DCB 7
  2330. DCB 2
  2331. DCB 7
  2332. DCB 0
  2333. DCD m_width
  2334. DCD 44
  2335. DCD 0
  2336. ;items
  2337. DCD 0
  2338. DCD -1
  2339. DCD 1+(7<<24)
  2340. DCB "As Text",0,0,0,0,0
  2341.  
  2342. DCD 128
  2343. DCD -1
  2344. .exportflags
  2345. DCD 1+(7<<24)
  2346. DCB "As HTML",0,0,0,0,0
  2347.  
  2348. ALIGN
  2349. .append
  2350.  
  2351. macro uppercase m0
  2352. {
  2353.   CMP m0,#96
  2354.   BLT _skip
  2355.   CMP m0,#128
  2356.   BICLT m0,m0,#32
  2357.   ._skip
  2358. }  
  2359.  
  2360.   
  2361.   
  2362.