home *** CD-ROM | disk | FTP | other *** search
/ PDA Software Library / pdasoftwarelib.iso / PSION / UTILS / VR3A100 / VR3A.OPL < prev    next >
Encoding:
Text File  |  1994-01-09  |  19.2 KB  |  844 lines

  1. REM VR3a - A Vertical Text Reader for the Psion S3a
  2. REM Version 1.00, January 1994
  3. REM Copyright (C) 1994 Robert Boucher
  4. REM
  5. REM    This program is free software; you can redistribute it and/or modify
  6. REM    it under the terms of the GNU General Public License as published by
  7. REM    the Free Software Foundation; either version 2 of the License, or
  8. REM    (at your option) any later version.
  9. REM
  10. REM    This program is distributed in the hope that it will be useful,
  11. REM    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. REM    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. REM    GNU General Public License for more details.
  14. REM
  15. REM    You should have received a copy of the GNU General Public License
  16. REM    along with this program; if not, write to the Free Software
  17. REM    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. REM
  19. REM Author: Robert Boucher <boucher@asimov.ocunix.on.ca>
  20. REM                        <boucher@sofkin.ca>
  21. REM
  22. REM Bugs and Suggestions should be addressed to the author.
  23.  
  24. APP VR3A
  25.     TYPE $9004
  26.     PATH "\TXT"
  27.     EXT  "TXT"
  28.     ICON "\OPD\VR3A.PIC"
  29. ENDA
  30.  
  31. PROC MAIN:
  32.     GLOBAL xpos%, ypos%                                              rem vLIB
  33.     GLOBAL fwidth%(8), fheight%(8), fname$(8,8), maxfont%, spwidth%, fontlst$(255)  rem vLIB
  34.     GLOBAL fontno%, fontid%, vwidth%, vrows%, statfon%               rem vLIB
  35.     GLOBAL maxpag%, pageoff&(500), curpag%, bkmark%(10), fontvpg%    rem VPG file info
  36.  
  37.     LOCAL handle%, offset&                                           REM its handle and offset
  38.     GLOBAL filenam$(128), opafile$(128)                              REM filename from "O" GETCMD$
  39.     LOCAL prevnam$(128)
  40.     LOCAL newpag%
  41.     LOCAL ret%, pageno&
  42.     LOCAL key%, doscan%
  43.  
  44.     vINIT:     rem Initialize vertical text library
  45.   CLRvpg:    rem Clear VerticalPage variables
  46.   
  47.     newpag%=0  rem Do not draw the page
  48.     doscan%=0  rem Do not scan the keyboard
  49.  
  50.     IF CMD$(3)="O"
  51.         opafile$=CMD$(2)
  52.         key%=512+%N        rem OPA "O" Command
  53.     ELSEIF CMD$(3)="C"
  54.         STOP
  55.     ELSE
  56.         key%=512+%o        rem OPEN TEXT FILE
  57.     ENDIF
  58.  
  59.     GIPRINT "VR3a v1.00 ╕1994 Robert Boucher"
  60.     PAUSE -40 :KEY
  61.     
  62.     CACHE $3000,$3000
  63.     WHILE 1
  64.         IF newpag%
  65.             gCLS
  66.             STATUS:
  67.             gUPDATE OFF
  68.             BUSY "Showing page "+GEN$(curpag%, 5),2
  69.             LOCK ON
  70.             offset&=SHOWPG&:(handle%, pageoff&(curpag%))
  71.             LOCK OFF
  72.             CACHETIDY
  73.             BUSY OFF
  74.             IF offset&=-1
  75.                 maxpag%=curpag%
  76.             ELSE
  77.                 pageoff&(curpag%+1)=offset&
  78.             ENDIF
  79.             gUPDATE
  80.             BEEP 5,300
  81.             newpag%=0
  82.         ENDIF
  83.  
  84.         IF doscan%
  85.             DO
  86.                 key%=GETK%:
  87.             UNTIL key%<>0
  88.         ELSE
  89.             doscan%=1
  90.         ENDIF
  91.  
  92.         IF     key%=512+%n OR key%=13 OR key%=256 rem NEXT PAGE
  93.             IF curpag%=maxpag%
  94.                 GIPRINT "On the last page",0
  95.             ELSE
  96.                 curpag%=curpag%+1
  97.                 newpag%=1
  98.             ENDIF
  99.         ELSEIF key%=512+%p OR key%=257 OR key%=8  rem PREV PAGE
  100.             IF curpag%=1
  101.                 GIPRINT "On the first page",0
  102.             ELSE
  103.                 curpag%=curpag%-1
  104.                 newpag%=1
  105.             ENDIF
  106.         ELSEIF key%=512+ASC("-") OR key%=ASC("-") rem FIRST PAGE
  107.             IF curpag%=1
  108.                 GIPRINT "On the first page",0
  109.             ELSE
  110.                 curpag%=1
  111.                 newpag%=1
  112.             ENDIF
  113.         ELSEIF key%=512+ASC("+") OR key%=ASC("+") rem LAST PAGE
  114.             IF maxpag%
  115.                 IF curpag%=maxpag%
  116.                     GIPRINT "On the last page",0
  117.                 ELSE
  118.                     curpag%=maxpag%
  119.                     newpag%=1
  120.                 ENDIF
  121.             ELSE
  122.                 curpag%=curpag%+1
  123.                 newpag%=1
  124.             ENDIF
  125.         ELSEIF key%=512+%j OR key%=ASC("/")       rem JUMP TO PAGE
  126.             pageno&=curpag%
  127.             LOCK ON
  128.             DO
  129.                 dINIT "Jump to page"
  130.                 IF maxpag%
  131.                     dLONG pageno&, "Page:", &1, maxpag%
  132.                 ELSE
  133.                     dLONG pageno&, "Page:", &1, curpag%+1
  134.                 ENDIF
  135.                 dBUTTONS "Cancel", 27, "OK", 13
  136.                 ret%=DIALOG
  137.             UNTIL pageno&<>0
  138.             LOCK OFF
  139.             IF ret%
  140.                 curpag%=pageno&
  141.                 newpag%=1
  142.             ENDIF
  143.         ELSEIF key%=512+ASC("/")                  rem FULL RESCAN
  144.             RESCAN:(handle%, fontno%, 1, &0)
  145.             WRIVPG:(filenam$)
  146.             READVPG:(filenam$)
  147.             vFONT:(fontvpg%)
  148.             STATUS:
  149.             BEEP 5,300
  150.             dINIT "Rescan Completed"
  151.             dBUTTONS "Continue", 13
  152.             DIALOG
  153.         ELSEIF key%=512+%k                        rem SCAN TO END
  154.             RESCAN:(handle%, fontno%, curpag%, offset&)
  155.             WRIVPG:(filenam$)
  156.             READVPG:(filenam$)
  157.             vFONT:(fontvpg%)
  158.             STATUS:
  159.             BEEP 5,300
  160.             dINIT "Scan to End Completed"
  161.             dBUTTONS "Continue", 13
  162.             DIALOG
  163.         ELSEIF key%=512+%f OR key%=ASC("*")       rem SELECT FONT
  164.             newpag%=SELFON%:
  165.         ELSEIF key%=512+%z OR key%=ASC(".")       rem ZOOM IN
  166.             fontvpg%=fontvpg%+1
  167.             IF fontvpg%>maxfont%
  168.                 fontvpg%=1
  169.             ENDIF
  170.             vFONT:(fontvpg%)
  171.             newpag%=1
  172.         ELSEIF key%=512+%Z OR key%=ASC(",")       rem ZOOM OUT
  173.             fontvpg%=fontvpg%-1
  174.             IF fontvpg%<1
  175.                 fontvpg%=maxfont%
  176.             ENDIF
  177.             vFONT:(fontvpg%)
  178.             newpag%=1
  179.         ELSEIF key%=512+%r                        rem DROP BOOKMARK
  180.             DROPBMK:
  181.         ELSEIF key%=512+%g                        rem GOTO BOOKMARK
  182.             ret%=curpag%
  183.             JMPBMK:
  184.             IF curpag%<>ret%
  185.                 newpag%=1
  186.             ENDIF
  187.         ELSEIF key%=512+%N                        rem OPA "O" COMMAND
  188.             IF maxpag%
  189.                 WRIVPG:(filenam$)
  190.             ENDIF
  191.             IF handle%>0
  192.                 ret%=IOCLOSE(handle%)
  193.             ENDIF
  194.             filenam$=opafile$
  195.             SETNAME PARSE$:(opafile$,4)
  196.             GIPRINT "Opening "+PARSE$:(filenam$,4)
  197.             handle%=OPEN%:(filenam$)
  198.             IF handle%=-1
  199.                 doscan%=0
  200.                 key%=512+%o
  201.             ELSE
  202.                 vFONT:(fontvpg%)
  203.                 newpag%=1
  204.             ENDIF
  205.         ELSEIF key%=512+%o                        rem OPEN TEXT FILE
  206.             IF maxpag%
  207.                 WRIVPG:(filenam$)
  208.                 prevnam$=filenam$
  209.             ENDIF
  210.             IF handle%>0
  211.                 ret%=IOCLOSE(handle%)
  212.             ENDIF
  213.             filenam$="\TXT\*.*"
  214.             LOCK ON
  215.             DO
  216.                 dINIT "Select a text file to read"
  217.                 dFILE filenam$,"Filename:",0
  218.                 dBUTTONS "Quit VR", 27, "OK", 13
  219.                 ret%=DIALOG
  220.             UNTIL filenam$ <> ""
  221.             LOCK OFF
  222.             IF ret%=0 rem ESC was pressed
  223.                 doscan%=0
  224.                 key%=27
  225.             ELSE
  226.                 GIPRINT "Opening "+PARSE$:(filenam$,4)
  227.                 handle%=OPEN%:(filenam$)
  228.                 IF handle%=-1
  229.                     newpag%=0
  230.                     doscan%=0
  231.                     key%=512+%o
  232.                 ELSE
  233.                     vFONT:(fontvpg%)
  234.                     newpag%=1
  235.                 ENDIF
  236.             ENDIF
  237.         ELSEIF key%=27                            rem QUIT
  238.             dINIT "Really Quit?"
  239.             dBUTTONS "No", 27, "Yes", 13
  240.             ret%=DIALOG
  241.             IF ret%
  242.                 ret%=IOCLOSE(handle%)
  243.                 STOP
  244.             ENDIF
  245.         ELSEIF key%=512+%x                        rem EXIT
  246.             IF maxpag%
  247.                 WRIVPG:(filenam$)
  248.             ENDIF
  249.             ret%=IOCLOSE(handle%)
  250.             STOP
  251.         ELSEIF key%=512+%v OR key%=291            rem ABOUT VR
  252.             ABOUT:
  253.         ELSEIF key%=290                           rem MENU
  254.           mINIT
  255.             mCARD "File", "Open new text", %o    REM , "Delete text", %d
  256.             mCARD "Page", "Jump to page", %j, "Next page", %n ,"Prev page", %p,"First page", ASC("-"), "Last page", ASC("+")
  257.             mCARD "BookMark", "Drop Bmk", %r, "Goto Bmk", %g
  258.             mCARD "Rescan", "Full rescan", ASC("/"), "Scan to end", %k
  259.             mCARD "Special", "Select font", %f,"Zoom in", %z, "Zoom out", %Z, "About VR", %v, "Exit", %x
  260.             key%=512+MENU
  261.             doscan%=0
  262.         ENDIF
  263.     ENDWH
  264. ENDP rem MAIN:
  265.  
  266. REM **********************************
  267. REM * Vertical Reader Routines
  268. REM **********************************
  269.  
  270. PROC ABOUT:
  271.     dINIT "VR3A"
  272.     dTEXT "","Vertical Text Reader",2
  273.     dTEXT "","for the Series 3a",2
  274.     dTEXT "","Version 1.00, January 1994",2
  275.     dTEXT "","Copyright ╕1994 Robert Boucher",2
  276.     dTEXT "","boucher@asimov.ocunix.on.ca",2
  277.     dBUTTONS "OK", 13
  278.     DIALOG
  279. ENDP rem ABOUT:
  280.  
  281. PROC OPEN%:(filenam$)
  282.     LOCAL ret%, i%, handle%
  283.     LOCAL filevpg$(128)
  284.  
  285.     ret%=IOOPEN(handle%, filenam$, $0200)
  286.     IF ret%<0
  287.         ALERT("Error Opening "+filenam$,"Error: "+ERR$(ret%))
  288.         RETURN -1
  289.     ENDIF
  290.     filevpg$=PARSE$:(filenam$,7)+".VPG"
  291.     IF EXIST(filevpg$)
  292.         READVPG:(filenam$)
  293.     ELSE
  294.         fontvpg%=6
  295.         maxpag%=0
  296.         curpag%=1
  297.         pageoff&(1)=0
  298.         i%=1
  299.         WHILE i%<=10
  300.             bkmark%(i%)=1
  301.             i%=i%+1
  302.         ENDWH
  303.     ENDIF
  304.     RETURN handle%
  305. ENDP rem OPEN%:
  306.  
  307. PROC SELFON%:
  308.     LOCAL ret%, redraw%, showfon%
  309.     LOCAL oldsp%, font&
  310.     oldsp%=spwidth%
  311.     redraw%=0
  312.     showfon%=0
  313.     LOCK ON
  314.     DO
  315.         dINIT "Select Font"
  316.         dLONG font&, "Font:", &1, maxfont%
  317.         dBUTTONS "Cancel", 27, "Show", 32, "OK", 13
  318.         ret%=DIALOG
  319.         IF ret%=0
  320.             RETURN redraw%
  321.         ELSEIF ret%=32 
  322.             IF showfon%
  323.                 GET
  324.             ELSE
  325.                 SHOWFON:
  326.                 showfon%=1
  327.                 redraw%=1
  328.             ENDIF
  329.         ENDIF
  330.     UNTIL ret%=13
  331.     LOCK OFF
  332.  
  333.     IF font&=fontno%
  334.         RETURN redraw%
  335.     ELSE
  336.         fontvpg%=font&
  337.         vFONT:(fontvpg%)
  338.         maxpag%=0
  339.         RETURN 1
  340.     ENDIF
  341. ENDP rem SELFON%:
  342.  
  343. PROC SHOWFON:
  344.     LOCAL i%, str$(21), oldfont%, oldsp%
  345.     oldfont%=fontno%
  346.     oldsp%=spwidth%
  347.  
  348.     gCLS
  349.     vFONT:(statfon%)
  350.     spwidth%=fwidth%(statfon%)
  351.     vAT:(0,0)
  352.     vPRINT:("NO  NAME"+CHR$(13)+CHR$(13))
  353.     gUNLOADFONT fontid%
  354.     i%=1
  355.     DO
  356.         gUPDATE OFF
  357.         vFONT:(statfon%)
  358.         spwidth%=fwidth%(statfon%)
  359.         vPRINT:(CHR$(10)+GEN$(i%,-1)+"   "+UPPER$(fname$(i%))+CHR$(13)+CHR$(13))
  360.         gUNLOADFONT fontid%
  361.         vFONT:(i%)
  362.         vPRINT:("12345678901234567890"+CHR$(13))
  363.         vPRINT:("abcdefghijABCDEFGHIJ"+CHR$(13))
  364.         gUNLOADFONT fontid%
  365.         i%=i%+1
  366.     UNTIL i%>maxfont%
  367.     gUPDATE
  368.     vFONT:(statfon%)
  369.     spwidth%=fwidth%(statfon%)
  370.     vAT:(0, 479-fheight%(statfon%)-1)
  371.     gSTYLE 4
  372.     str$="   Press any key    "
  373.     vPRINT:(str$)
  374.     gSTYLE 0
  375.     spwidth%=oldsp%
  376.     vFONT:(oldfont%)
  377.     GET
  378. ENDP rem SHOWFON:
  379.  
  380. PROC STATUS:
  381.     LOCAL str$(21), oldfont%, oldsp%
  382.     oldfont%=fontno%
  383.     oldsp%=spwidth%
  384.     vFONT:(statfon%)
  385.     spwidth%=fwidth%(statfon%)
  386. REM 1st Status line
  387.     vAT:(0, 479-2*fheight%(fontno%)-3)
  388.     gSTYLE 4
  389.     IF maxpag%=0
  390.         str$="Pag:"+GEN$(curpag%,5)+"/"+GEN$(curpag%+1,5)+" Fnt:"+GEN$(oldfont%,5)
  391.     ELSE
  392.         str$="Pag:"+GEN$(curpag%,5)+"/"+GEN$(maxpag%,5)+" Fnt:"+GEN$(oldfont%,5)
  393.     ENDIF
  394.     str$=str$+REPT$(" ",1+vwidth%-LEN(str$))
  395.     vPRINT:(str$)
  396. REM 2nd Status line
  397.     vAT:(0, 479-fheight%(fontno%)-1)
  398.     str$="Text: "+LOWER$(PARSE$:(filenam$,6))
  399.     str$=str$+REPT$(" ",1+vwidth%-LEN(str$))
  400.     vPRINT:(str$)
  401.     gSTYLE 0
  402.     spwidth%=oldsp%
  403.     vFONT:(oldfont%)
  404. ENDP rem STATUS:
  405.  
  406. PROC SHOWPG&:(handle%, off&)
  407.     LOCAL istream%, ret%, lineout$(255)
  408.     LOCAL tmpstr$(255), c$(1), char$(1), length%
  409.     LOCAL row%, offset&, width%
  410.  
  411.     vAT:(0,0)  rem Top-Left Corner
  412.     row%=1
  413.     width%=0
  414.     istream%=handle%
  415.     offset&=off&
  416.     ret%=IOSEEK(istream%,1, offset&)
  417.     
  418.     ret%=IOREAD(istream%, ADDR(c$)+1, 1)
  419.     offset&=offset&+1
  420.     WHILE ret%<>-36 rem EOF
  421.         POKEB ADDR(c$), ret%
  422.  
  423.         IF ASC(c$)=13 rem CR
  424.             c$=""
  425.         ELSEIF ASC(c$)=10 OR ASC(c$)=9 rem NL or TAB
  426.             c$=" "
  427.         ENDIF
  428.  
  429.         IF c$=" " 
  430.             IF LEN(lineout$)>1 AND RIGHT$(lineout$,1)<>" "
  431.                 lineout$=lineout$+c$
  432.                 width%=width%+spwidth%
  433.             ENDIF
  434.         ELSE
  435.             lineout$=lineout$+c$
  436.             width%=width%+fwidth%(fontno%)
  437.         ENDIF
  438.  
  439.         IF width%>160
  440.             tmpstr$=lineout$
  441.             DO
  442.                 char$=RIGHT$(tmpstr$, 1)
  443.                 tmpstr$=LEFT$(tmpstr$, LEN(tmpstr$)-1)
  444.                 IF char$=" "
  445.                     BREAK
  446.                 ENDIF
  447.             UNTIL tmpstr$=""
  448.  
  449.             length%=LEN(tmpstr$)
  450.             IF length%>0
  451.                 vPRINT:(tmpstr$+CHR$(13))
  452.                 row%=row%+1
  453.                 lineout$=RIGHT$(lineout$, LEN(lineout$)-length%-1)
  454.                 width%=vWIDTH%:(lineout$)
  455.                 IF row%>vrows%
  456.                     RETURN offset&-LEN(lineout$)
  457.                 ENDIF
  458.             ENDIF
  459.         ENDIF
  460.         ret%=IOREAD(istream%, ADDR(c$)+1, 1)
  461.         offset&=offset&+1
  462.     ENDWH
  463.     
  464.     IF LEN(lineout$)>0
  465.         vPRINT:(lineout$)
  466.     ENDIF
  467.     RETURN -1
  468. ENDP rem SHOWPG&:
  469.  
  470.  
  471. REM **********************************
  472. REM * BookMark Routines
  473. REM **********************************
  474.  
  475. PROC DROPBMK:
  476.     LOCAL ret%, mark&
  477.  
  478.     LOCK ON
  479.     DO
  480.         dINIT "Drop which Bookmark?"
  481.         dLONG mark&, "Bookmark:", &1, &10
  482.         dBUTTONS "Cancel", 27,"Show", 32, "OK", 13
  483.         ret%=DIALOG
  484.         IF ret%=0
  485.             RETURN
  486.         ELSEIF ret%=32
  487.             SHOWBMK:
  488.         ENDIF
  489.     UNTIL ret%=13
  490.     bkmark%(mark&)=curpag%
  491.     LOCK OFF
  492. ENDP rem DROPBMK:
  493.  
  494. PROC JMPBMK:
  495.     LOCAL ret%, mark&
  496.     LOCK ON
  497.     DO
  498.         dINIT "Jump to which Bookmark?"
  499.         dLONG mark&, "Bookmark:", &1, &10
  500.         dBUTTONS "Cancel", 27, "Show", 32, "OK", 13
  501.         ret%=DIALOG
  502.         IF ret%=0
  503.             RETURN
  504.         ELSEIF ret%=32
  505.             SHOWBMK:
  506.         ENDIF
  507.     UNTIL ret%=13
  508.     curpag%=bkmark%(mark&)
  509.     LOCK OFF
  510. ENDP rem JMPBMK:
  511.  
  512. PROC SHOWBMK:
  513.     LOCAL i%
  514.     LOCK ON
  515.     i%=1
  516.     dINIT "Bookmarks"
  517.     dTEXT "", GEN$(i%,-1)+": Page "+GEN$(bkmark%(i%),-5)+"     "+GEN$(i%+5,-2)+": Page "+GEN$(bkmark%(i%+5),-5),0 :i%=i%+1
  518.     dTEXT "", GEN$(i%,-1)+": Page "+GEN$(bkmark%(i%),-5)+"     "+GEN$(i%+5,-2)+": Page "+GEN$(bkmark%(i%+5),-5),0 :i%=i%+1
  519.     dTEXT "", GEN$(i%,-1)+": Page "+GEN$(bkmark%(i%),-5)+"     "+GEN$(i%+5,-2)+": Page "+GEN$(bkmark%(i%+5),-5),0 :i%=i%+1
  520.     dTEXT "", GEN$(i%,-1)+": Page "+GEN$(bkmark%(i%),-5)+"     "+GEN$(i%+5,-2)+": Page "+GEN$(bkmark%(i%+5),-5),0 :i%=i%+1
  521.     dTEXT "", GEN$(i%,-1)+": Page "+GEN$(bkmark%(i%),-5)+"     "+GEN$(i%+5,-2)+": Page "+GEN$(bkmark%(i%+5),-5),0 :i%=i%+1
  522.     dBUTTONS "OK", 13
  523.     DIALOG
  524.     LOCK OFF
  525. ENDP rem SHOWBMK:
  526.  
  527. REM **********************************
  528. REM * Vertical Text Library
  529. REM **********************************
  530.  
  531. PROC vWIDTH%:(string$)
  532.     LOCAL str$(255), char$(1), width%
  533.     width%=0
  534.     str$=string$
  535.     WHILE LEN(str$)
  536.         char$=LEFT$(str$,1)
  537.         IF ASC(char$)=32
  538.             width%=width%+spwidth%
  539.         ELSE
  540.             width%=width%+fwidth%(fontno%)
  541.         ENDIF
  542.         str$=RIGHT$(str$, LEN(str$)-1)
  543.     ENDWH
  544.     RETURN width%
  545. ENDP rem vWIDTH%:
  546.  
  547. PROC vINIT:
  548.     LOCAL i%
  549.     xpos%=0
  550.     ypos%=0
  551.     i%=1
  552.     fwidth%(i%)=4 :fheight%(i%)=5  :fname$(i%)="sman0405" :i%=i%+1
  553.     fwidth%(i%)=4 :fheight%(i%)=6  :fname$(i%)="smxn0406" :i%=i%+1
  554.     fwidth%(i%)=5 :fheight%(i%)=8  :fname$(i%)="sman0508" :i%=i%+1
  555.     fwidth%(i%)=6 :fheight%(i%)=8  :fname$(i%)="smxn0608" :i%=i%+1
  556.     fwidth%(i%)=6 :fheight%(i%)=11 :fname$(i%)="smxn0614" :i%=i%+1
  557.     fwidth%(i%)=8 :fheight%(i%)=8  :fname$(i%)="smxn0808" :i%=i%+1
  558.     fwidth%(i%)=8 :fheight%(i%)=11 :fname$(i%)="smxn0814" 
  559.     statfon%=i%
  560.     maxfont%=i%
  561.     i%=2
  562.     fontlst$=fname$(1)
  563.     DO
  564.         fontlst$=fontlst$+","+fname$(i%)
  565.         i%=i%+1
  566.     UNTIL i%>maxfont%
  567. ENDP rem vINIT:
  568.  
  569. PROC vFONT:(no%)
  570.     fontno%=no%
  571.     fontid%=gLOADFONT("\VR3A\"+fname$(fontno%))
  572.     gFONT fontid%
  573.     vwidth%=INT(160/fwidth%(fontno%))
  574.     vrows%=INT((480-(2*fheight%(statfon%)-2))/fheight%(fontno%)) rem screen - 2 status lines
  575. rem    vrows%=INT(480/fheight%(fontno%)) rem full screen
  576.     spwidth%=INT(fwidth%(fontno%)/2)
  577. ENDP rem vFONT:
  578.  
  579. PROC vAT:(x%,y%)
  580.     LOCAL rx%
  581.     xpos%=x%
  582.     ypos%=y%
  583.     rx%=159-x%
  584.     IF rx%<0
  585.         rx%=0
  586.     ENDIF
  587.     gAT y%,rx%
  588. ENDP rem vAT
  589.  
  590. PROC vPRINT:(string$)
  591.     LOCAL str$(255), char$(1), rx%
  592.     str$=string$
  593.     WHILE LEN(str$)
  594.         char$=LEFT$(str$,1)
  595.         rx%=159-xpos%
  596.         IF rx%<0
  597.             rx%=0
  598.         ENDIF
  599.         gAT ypos%,rx%
  600.         IF char$=CHR$(13) rem CR
  601.             xpos%=0
  602.             ypos%=ypos%+fheight%(fontno%)
  603.         ELSEIF char$=CHR$(10) rem LF
  604.             ypos%=ypos%+fheight%(fontno%)
  605.         ELSE
  606.             gPRINT char$
  607.             IF char$=" "
  608.                 xpos%=xpos%+spwidth%
  609.             ELSE
  610.                 xpos%=xpos%+fwidth%(fontno%)
  611.             ENDIF
  612.         ENDIF
  613.         IF ypos%>479
  614.             ypos%=0
  615.         ENDIF
  616.         str$=RIGHT$(str$, LEN(str$)-1)
  617.     ENDWH
  618. ENDP rem vPRINT:
  619.  
  620. REM **********************************
  621. REM * VPG Library
  622. REM **********************************
  623.  
  624. PROC WRIVPG:(filenam$)
  625.     LOCAL filevpg$(128), handvpg%
  626.     LOCAL i%, ret%, longint&
  627.  
  628.     filevpg$=PARSE$:(filenam$,7)+".VPG"
  629.     ret%=IOOPEN(handvpg%, filevpg$, $0322)
  630.     IF ret%<0
  631.         ALERT("VPG: Error Opening "+filevpg$,"Error: "+ERR$(ret%))
  632.         RETURN
  633.     ENDIF
  634.  
  635.     longint&=maxpag%
  636.     ret%=WRITE%:(handvpg%, longint&)             rem NO OF PAGES
  637.     i%=1
  638.     WHILE i%<=maxpag%
  639.         ret%=WRITE%:(handvpg%, pageoff&(i%))       rem PAGE OFFSETs
  640.         i%=i%+1
  641.     ENDWH
  642.     longint&=curpag%
  643.     ret%=WRITE%:(handvpg%, longint&)             rem CURRENT PAGE
  644.     i%=1
  645.     WHILE i%<=10
  646.         longint&=bkmark%(i%)
  647.         ret%=WRITE%:(handvpg%, longint&)           rem BOOKMARKS
  648.         i%=i%+1
  649.     ENDWH
  650.     longint&=fontvpg%
  651.     ret%=WRITE%:(handvpg%, longint&)             rem FONT
  652.     ret%=IOCLOSE(handvpg%)
  653. ENDP rem WRIVPG:
  654.  
  655. PROC READVPG:(filenam$)
  656.     LOCAL filevpg$(128), handvpg%
  657.     LOCAL i%, ret%
  658.  
  659.     filevpg$=PARSE$:(filenam$,7)+".VPG"
  660.     ret%=IOOPEN(handvpg%, filevpg$, $0320)
  661.     IF ret%<0
  662.         ALERT("VPG: Error Opening "+filevpg$,"Error: "+ERR$(ret%))
  663.         RETURN
  664.     ENDIF
  665.  
  666.     maxpag%=READ&:(handvpg%)                     rem NO OF PAGES
  667.     i%=1
  668.     WHILE i%<=maxpag%
  669.         pageoff&(i%)=READ&:(handvpg%)              rem PAGE OFFSETs
  670.         i%=i%+1
  671.     ENDWH
  672.     curpag%=READ&:(handvpg%)                     rem CURRENT PAGE
  673.     i%=1
  674.     WHILE i%<=10
  675.         bkmark%(i%)=READ&:(handvpg%)               rem BOOKMARKS
  676.         i%=i%+1
  677.     ENDWH
  678.     fontvpg%=READ&:(handvpg%)                    rem FONTS
  679.     ret%=IOCLOSE(handvpg%)
  680. ENDP rem READVPG:
  681.  
  682. PROC CLRvpg:
  683.     REM    GLOBAL maxpag%, pageoff&(500), curpag%, bkmark%(10), fontvpg%    rem VPG file info
  684.     LOCAL i%
  685.     maxpag%=0
  686.     i%=1
  687.     DO
  688.         pageoff&(i%)=0
  689.         i%=i%+1
  690.     UNTIL i%>500
  691.     curpag%=1
  692.     i%=1
  693.     DO
  694.         bkmark%(i%)=1
  695.         i%=i%+1
  696.     UNTIL i%>10
  697.     fontvpg%=fontno%
  698. ENDP rem CLRvpg:
  699.  
  700. PROC RESCAN:(handle%, font%, startpg%, off&)
  701.     LOCAL i%, ret%, offset&
  702.  
  703.     offset&=off&
  704.     vFONT:(font%)
  705.     fontvpg%=font%
  706.     i%=startpg%
  707.     IF startpg%=1
  708.         CLRvpg:
  709.     ENDIF
  710.  
  711.     pageoff&(i%)=offset&
  712.     BUSY "Scanning Page "+GEN$(i%,5),2
  713.     offset&=SCANPG&:(handle%, offset&)
  714.     WHILE offset&<>-1
  715.         i%=i%+1
  716.         pageoff&(i%)=offset&
  717.         BUSY "Scanning Page "+GEN$(i%,5),2
  718.         offset&=SCANPG&:(handle%, offset&)
  719.     ENDWH
  720.     BUSY OFF
  721.     maxpag%=i%
  722.  
  723.     curpag%=startpg%
  724. ENDP rem RESCAN:
  725.  
  726. PROC SCANPG&:(handle%, off&)
  727.     LOCAL istream%, ret%, lineout$(255)
  728.     LOCAL tmpstr$(255), c$(1), char$(1), length%
  729.     LOCAL row%, offset&, width%
  730.  
  731.     row%=1
  732.     width%=0
  733.     istream%=handle%
  734.     offset&=off&
  735.     ret%=IOSEEK(istream%, 1, offset&)
  736.  
  737.     ret%=IOREAD(istream%, ADDR(c$)+1, 1)
  738.     offset&=offset&+1
  739.     WHILE ret%<>-36 rem EOF
  740.         POKEB ADDR(c$), ret%
  741.  
  742.         IF ASC(c$)=13 rem CR
  743.             c$=""
  744.         ELSEIF ASC(c$)=10 OR ASC(c$)=9 rem NL or TAB
  745.             c$=" "
  746.         ENDIF
  747.  
  748.         IF c$=" " 
  749.             IF LEN(lineout$)>1 AND RIGHT$(lineout$,1)<>" "
  750.                 lineout$=lineout$+c$
  751.                 width%=width%+spwidth%
  752.             ENDIF
  753.         ELSE
  754.             lineout$=lineout$+c$
  755.             width%=width%+fwidth%(fontno%)
  756.         ENDIF
  757.  
  758.         IF width%>160
  759.             tmpstr$=lineout$
  760.             DO
  761.                 char$=RIGHT$(tmpstr$, 1)
  762.                 tmpstr$=LEFT$(tmpstr$, LEN(tmpstr$)-1)
  763.                 IF char$=" "
  764.                     BREAK
  765.                 ENDIF
  766.             UNTIL tmpstr$=""
  767.  
  768.             length%=LEN(tmpstr$)
  769.             IF length%>0
  770.                 row%=row%+1
  771.                 lineout$=RIGHT$(lineout$, LEN(lineout$)-length%-1)
  772.                 width%=vWIDTH%:(lineout$)
  773.                 IF row%>vrows%
  774.                     RETURN offset&-LEN(lineout$)
  775.                 ENDIF
  776.             ENDIF
  777.         ENDIF
  778.         ret%=IOREAD(istream%, ADDR(c$)+1, 1)
  779.         offset&=offset&+1
  780.     ENDWH
  781.     RETURN -1
  782. ENDP rem SCANPG&:
  783.  
  784. PROC WRITE%:(handle%, longint&)
  785.     LOCAL buffer$(10), stream%, ret%
  786.     buffer$=GEN$(longint&, 10)
  787.     stream%=handle%
  788.     ret%=IOWRITE(stream%, ADDR(buffer$)+1, LEN(buffer$))
  789.     REM PRINT "Wrote:";longint&
  790.     RETURN ret%
  791. ENDP rem WRITE%:
  792.  
  793. PROC READ&:(handle%)
  794.     LOCAL buffer$(255), stream%, ret%, longint&
  795.     stream%=handle%
  796.     ret%=IOREAD(stream%, ADDR(buffer$)+1, 255)
  797.     POKEB ADDR(buffer$), ret%
  798.     longint&=VAL(buffer$)
  799.     REM PRINT "Read: ";longint&
  800.     RETURN longint&
  801. ENDP rem READ&:
  802.  
  803. REM **********************************
  804. REM * Misc Routines
  805. REM **********************************
  806.  
  807. PROC PARSE$:(fil$,req%)
  808. REM by Mark Esposito
  809. REM Pelican Software
  810.     LOCAL b%(6),p$(128),rel$(8),fsys$(8),dev$(2),path$(128),fn$(12),ext$(4)
  811.     p$=PARSE$(fil$,rel$,b%())
  812.     fsys$=MID$(p$,1,b%(2)-1)
  813.     dev$=MID$(p$,b%(2),b%(3)-b%(2))
  814.     path$=MID$(p$,b%(3),b%(4)-b%(3))
  815.     fn$=MID$(p$,b%(4),b%(5)-b%(4))
  816.     ext$=MID$(p$,b%(5),4)
  817.     IF req%=1     :RETURN fsys$
  818.     ELSEIF req%=2 :RETURN dev$
  819.     ELSEIF req%=3 :RETURN path$
  820.     ELSEIF req%=4 :RETURN fn$
  821.     ELSEIF req%=5 :RETURN ext$
  822.     ELSEIF req%=6 :RETURN fn$+ext$
  823.     ELSEIF req%=7 :RETURN fsys$+dev$+path$+fn$
  824.     REM Add your own combinations here
  825.     ENDIF
  826. ENDP rem PARSE$:
  827.  
  828. PROC GETK%:
  829.     LOCAL a%(6)
  830.     LOCAL comd$(130)
  831.  
  832.     GETEVENT a%()
  833.     IF a%(1)=$404
  834.         comd$=GETCMD$
  835.         IF LEFT$(comd$,1)="X"
  836.             RETURN 512+%x
  837.         ELSEIF LEFT$(comd$,1)="O"
  838.             opafile$=MID$(comd$,2,128)
  839.             RETURN 512+%N
  840.         ENDIF
  841.     ENDIF
  842.     RETURN a%(1)
  843. ENDP rem GETK%:
  844.