home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / asmlib.lbr / HLP.AZM / HLP.ASM
Encoding:
Assembly Source File  |  1991-06-25  |  10.0 KB  |  378 lines

  1. ;----------------------------------------------------------------
  2. ; This is a program to display help files on the screen in an
  3. ; orderly manner.
  4. ; The user is able to specify a section number which will be
  5. ; indexed to and the text at that place in the help file will
  6. ; be displayed.
  7. ; The user is also to move up and down the help levels so that
  8. ; different messages are displayed. A global belp display of all
  9. ; the index sections is displayed is also available.
  10. ;
  11. ; In the index file the following codes are used.
  12. ; ::    is a section start
  13. ; :P    is a page end
  14. ; :N    is a page end and continue to next section
  15. ; :L    is a page end and proceed to last section
  16. ;
  17. ;                                 Written       R.C.H.   02/11/83
  18. ;                  Last Update    R.C.H.     05/11/83
  19. ;----------------------------------------------------------------
  20. ;
  21.     org    0100h
  22.     maclib    z80
  23. ;
  24. ; operating system equates.
  25. ;
  26. bdos    equ    05
  27. open    equ    15        ; open file
  28. sread    equ    20        ; sequential file read
  29. rread    equ    33        ; random file read
  30. sdma    equ    26        ; set dma address
  31. srrec    equ    36        ; set random record
  32. buffin    equ    10        ; read console buffer
  33. pstring    equ    09        ; print a string till a $
  34. buffer    equ    01000h        ; start of disk buffer
  35. bufsiz    equ    128        ; size of the file text buffer
  36. stack    equ    0fffh        ; stack space
  37. ;
  38. ; Help file equates
  39. ;
  40. section    equ    ':'        ; section start
  41. ;
  42.     lxi    sp,stack    ; set up
  43.     lxi    d,signon
  44.     call    print
  45. ;
  46. ; Here we initialize the help FCB for sequential reading to extract the 
  47. ; keys to be saved in the table
  48. ;
  49.     lxi    d,buffer
  50.     sded    curdma
  51.     mvi    c,sdma
  52.     call    bdos        ; set up dma buffer
  53.     lxi    d,fcb        ; point to it
  54.     mvi    c,open        ; open the file
  55.     call    bdos        ; do it
  56.     cpi    255        ; failed
  57.     jz    not$found
  58. ;
  59. ; Here and the files' sector should be in the current dma area
  60. ; Now we run through the file and extract all the section start
  61. ; codes.
  62. ;
  63. key$start:
  64.     call    getchr        ; get a character
  65.     jz    key$end        ; end of key extraction = end of file
  66.     cpi    section        ; is it a section start ??
  67.     jnz    key$start    ; keep on then
  68. ;
  69. ; Here we use the section counter to save the sector number and character
  70. ; index of the section start in the table of keys.
  71. ;
  72.     lda    curcol        ; get current column number
  73.     cpi    1        ; are we in column 1 ?
  74.     jrnz    key$start    ; if not in col 1 then ignore
  75. ;
  76. ; Since a start of section begins with '::' we must read the next file
  77. ; character to make sure wo where we are
  78. ;
  79.     call    getchr        ; get the character
  80.     jz    key$end        ; exit if end of file
  81.     cpi    section        ; is it a second ':' ??
  82.     jrnz    key$start
  83. ;
  84. ; If we are here then we are at a new section signalled by a '::' pair of 
  85. ; characters.
  86. ;
  87.     lda    cursct        ; get current section number
  88.     mov    e,a        ; save in an indexing register
  89.     inr    a
  90.     sta    cursct
  91.     lxi    h,keytab    ; point to start of key table
  92.     mvi    d,00        ; clear offset
  93.     dad    d
  94.     dad    d
  95.     dad    d        ; add 3 times the section number
  96. ; Here HL -> to the start of the 3 byte table entry
  97.     lded    cursec        ; get the current sector number
  98.     mov    m,e        ; save low byte first
  99.     inx    h
  100.     mov    m,d        ; save high byte next
  101. ; Lastly we save the offset into the sector of the start of the section
  102.     inx    h
  103.     lda    chrcnt        ; get character count as an offset
  104.     mov    m,a        ; save it, this is the offset into the buffer
  105. ;
  106. ; Now we may return to the reading and checking loop
  107.     jmp    key$start
  108. ;
  109. ;
  110. ; Here is jumped to when the end of file is reached. We assume that all 
  111. ; the sections have been found and their indicies have been loaded into 
  112. ; the key table. Now we can use the number that the user has entered to 
  113. ; index into the table and then to index into the help file.
  114. ;
  115. ;
  116. key$end:
  117.     mvi    a,1
  118.     sta    reqinx        ; save for now
  119.     lda    reqinx        ; get requested index number
  120. ; check if index number too low
  121.     ora    a        ; is it 00 ?
  122.     jz    low$inx        ; index 0 not allowed
  123. ; check if index number too large
  124.     mov    e,a        ; save index #
  125.     lda    cursct        ; get the last index section number
  126.     cmp    e        ; carry if request > current index
  127.     jc    hi$inx
  128.     mov    a,e        ; restore
  129. ; All is well. We may use the table data to index into the file
  130. ; to read the data as requested by the user.
  131. ;
  132. ; Here A = the index number.
  133.     call    getinx
  134. ; Now the sector buffer should be filled with the data from disk
  135. ; and the character pointers corrected to index into the data immediately
  136. ; after the index marker.
  137. ;
  138. lp2:
  139.     call    getchr
  140.     jz    finish        ; end on file end
  141. ; display the data
  142.     mov    e,a
  143.     mvi    c,2        ; display code
  144.     call    bdos
  145.     jmp    lp2
  146. ;
  147. ;----------------------------------------------------------------
  148. ; This is a central routine that returns either the next character from 
  149. ; the text file or a zero flag if end of file. If the sector buffer is 
  150. ; empty then the next sector must be read, ad infinitum.
  151. ;----------------------------------------------------------------
  152. ;
  153. getchr:
  154.     lda    chrcnt        ; get a count of character left in the buffer
  155.     ora    a
  156.     jz    fill$buff    ; buffer is empty if none left
  157. ; Here and we can decrement the counter, restore it, get a character etc.
  158.     dcr    a
  159.     sta    chrcnt        ; restore
  160.     lhld    curchr        ; get character pointer
  161.     mov    a,m
  162.     inx    h        ; point to next character
  163.     shld    curchr        ; save 
  164.     cpi    01ah        ; end of text file ??
  165.     jrnz    up$col        ; if not the update the column number
  166.     xra    a        ; clear accumulator if end of file
  167.     ret
  168. ;
  169. ; This routine must save the character in the accumulator and return it to
  170. ; the user after updating the column number.
  171. ;
  172. up$col:
  173.     push    psw        ; save the character
  174.     cpi    0dh
  175.     jrz    new$lin
  176.     cpi    0ah
  177.     jrz    new$lin
  178.     lda    curcol        ; get current column
  179.     inr    a
  180. up$col2:
  181.     sta    curcol
  182.     pop    psw
  183.     ret
  184. ;
  185. ; If a new line the clear the character counter
  186. new$lin:
  187.     xra    a
  188.     jr    up$col2
  189. ;
  190. ; here must read the next sector into the sector buffer, update 
  191. ; pointers and counters then return to read another character
  192. ;
  193. fill$buff:
  194. ; Bump the sector counter before anything else
  195.     lhld    cursec
  196.     inx    h
  197.     shld    cursec
  198. ; set up dma address
  199.     lded    curdma        ; set up DMA address
  200.     mvi    c,sdma
  201.     call    bdos
  202. ; read file next
  203.     lxi    d,fcb
  204.     mvi    c,sread        ; sequential read operation required
  205.     call    bdos        ; read the sector
  206.     ora    a        
  207.     jnz    fill$end    ; if not zero then end of file
  208. ; Here and we restore the counters and pointers then return
  209. fill$buff2:
  210.     mvi    a,bufsiz    ; 1 sector loaded
  211.     sta    chrcnt        ; save the counter
  212.     lhld    curdma
  213.     shld    curchr        ; point to first character
  214.     jmp    getchr       ; return to get a character from the start
  215. ;
  216. ; Here and the end of the file was encountered.
  217. ;
  218. fill$end:    ; fill the sector with eof characters
  219.     lhld    curdma
  220.     mvi    m,01ah
  221.     lded    curdma
  222.     inx    d
  223.     lxi    b,127        ; clear the rest of the buffer
  224.     ldir            ; shift the end of file character along
  225.     jmp    fill$buff2    ; restore pointers and return
  226. ;
  227. ; This routine must use the index number that points into the table to
  228. ; read the help file and then position the character pointer immediately after
  229. ; the start of index character.
  230. ; The index number is assumed to be contained in A
  231. ;
  232. getinx:
  233.     lxi    h,keytab    ; point to the table
  234.     dcr    a        ; normalize the index value
  235.     mov    e,a
  236.     mvi    d,00        ; load the offset
  237.     dad    d
  238.     dad    d
  239.     dad    d        ; point into the table
  240. ; Extract the sector number
  241.     mov    e,m
  242.     inx    h
  243.     mov    d,m        
  244. ; Now we need to save the offset to the index start for later use
  245.     inx    h
  246.     mov    a,m
  247.     sta    chrcnt        ; Save the offset as a pointer
  248. ; We need to also update the character pointer
  249.     lhld    curdma
  250.     mov    c,a
  251.     mvi    b,00
  252.     dad    b
  253.     shld    curchr
  254. ; Now we seek to the sector and read it into the buffer
  255.     call    seek        ; Go to the sector
  256.     ret
  257. ;
  258. ; This routine must seek the head to a sector number contained in DE
  259. ; and must read data into the sector buffer.
  260. ;
  261. seek:
  262.     lxi    h,fcb+33    ; sector number field
  263.     mov    m,e        ; set up low sector number
  264.     inx    h
  265.     mov    m,d        ; set up high byte
  266. ; Set up DMA
  267.     lded    curdma
  268.     mvi    c,sdma
  269.     call    bdos        ; set up 
  270. ; Random read the sector
  271.     mvi    c,rread        ; do a random read
  272.     lxi    d,fcb
  273.     call    bdos
  274. ; Test error values of return code
  275.     ora    a
  276.     rz            ; success
  277.     jz    rr$error
  278. ;
  279. ;----------------------------------------------------------------
  280. ; Display a signoff message and go back to o.s.
  281. ;----------------------------------------------------------------
  282. ;
  283. finish:
  284.     lxi    d,signoff
  285.     call    print
  286.     jmp    quit
  287. ;
  288. ;----------------------------------------------------------------
  289. ;             Error routines for all occurrences
  290. ;----------------------------------------------------------------
  291. ;
  292. not$found:
  293.     lxi    d,err2
  294.     call    print
  295.     jmp    quit        ; abort 
  296. ;
  297. low$inx:
  298.     lxi    d,err3
  299.     call    print
  300.     jmp    quit
  301. ;
  302. hi$inx:
  303.     lxi    d,err4
  304.     call    print
  305.     jmp    quit
  306. ;
  307. rr$error:
  308.     lxi    d,err5
  309.     call    print
  310.     jmp    quit
  311. ;
  312. ;
  313. quit:
  314.     jmp    0h
  315. ;
  316. ; error messages as per p-coded listing
  317. ;
  318. err1:    db    'Non initialized help system$'
  319. err2:    db    'File not found$'
  320. err3:    db    'Index 00 not allowed$'
  321. err4:    db    'Index too large$'
  322. err5:    db    'Random record seek error$'
  323. ;
  324. ; Simple screen messages
  325. ;
  326. signon:
  327.     db    'Help file reader starting$'
  328. signoff:
  329.     db    'Help file reader terminating$'
  330. ;
  331. ;
  332. print:    ; Print a string till a $
  333.     push    d
  334.     push    b
  335.     push    h
  336.     mvi    c,pstring
  337.     call    bdos
  338.     pop    h
  339.     pop    b
  340.     pop    d
  341.     ret
  342. ;
  343. ;
  344. fcb    db    00,'HELP    HLP',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  345.     db    00
  346. ;
  347. ; The following are variables used to read the file and keep
  348. ; track of data.
  349. ;
  350. reqinx    db    00        ; requested index or current index no
  351. beginx    db    00        ; Beginning index offset from sector start
  352. cursct    db    00        ; current section number
  353. curdma    db    00,00        ; current DMA address
  354. cursec    db    00,00        ; current sector number
  355. curchr    db    00,00        ; current character address
  356. curcol    db    00        ; current column number
  357. chrcnt    db    00        ; count to 00 of sectors in the buffer
  358. ;
  359. ; The following is a table of keys which are the sector
  360. ; numbers where a section of the help file was found.
  361. ; This is enough for 32 3 byte keys to be saved.
  362. ;
  363. ; Format is 2 bytes = sector number
  364. ;           1 byte  = offset into sector for section start
  365. ;
  366. keytab:
  367.     db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  368.     db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  369.     db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  370.     db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  371.     db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  372.     db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  373. ;
  374.     end
  375.  
  376.  
  377.  
  378.