10 REM >ScrMan/src v0.40
   20 REM Display manual pages
   30 REM Syntax: *Man (<section>) <item>
   40 REM Syntax: *Man <item>(<section>)
   50 REM Man Item    -> I.#Item
   60 REM Man 1 Item  -> I.1Item
   70 REM Man Item(1) -> I.1Item
   80 :
   90 INPUT"Manual files dir: (%.ManPages) "path$:IFpath$="":path$="%.ManPages"
  100 INPUT"Command to save: (%.Man)       "save$:IFsave$="":save$="%.Man"
  110 IFpath$<>"":path$=path$+"."
  120 :
  130 OSFIND=&FFCE:OSBGET=&FFD7:OSARGS=&FFDA:OSRDCH=&FFE0
  140 OSNEWL=&FFE7:OSWRCH=&FFEE:OSWORD=&FFF1:OSBYTE=&FFF4
  150 DIM mcode% &240:load%=&FFFF0900:max%=18
  160 IF LENpath$>max%:load%=load%-LENpath$+max%
  170 :
  180 lptr=&A8
  190 channel=&A8:height=&A9
  200 column=&AA:format=&AB:ptr=&AC
  210 :
  220 FOR P=0 TO 1
  230   O%=mcode%:P%=load%
  240   [OPT P*2+4
  250   EQUB 23:.block:EQUB 255             :\ VDU 23 block
  260   .ItemFilename:EQUS path$            :\ eg "$Docs.ManPages."
  270   .ItemDir     :EQUS "M."
  280   .ItemName    :EQUS "#Man":EQUB 13
  290   :
  300   .exec%
  310   LDY #0:LDX #lptr:LDA #1:JSR OSARGS  :\ Get command line
  320   LDA (lptr),Y:CMP #13:BEQ OpenItem
  330   TAX:INY:LDA (lptr),Y:CMP #ASC" ":BNE NoSection
  340   STX ItemName:INY                    :\ *man n item
  350   .SkipSpace
  360   LDA (lptr),Y:INY:CMP #ASC" ":BEQ SkipSpace:TAX
  370   .NoSection
  380   STX ItemDir:DEY:LDX #1
  390   .GetItemName
  400   LDA (lptr),Y:INY:STA ItemName,X     :\ Copy into filename
  410   CMP #ASC"(":BEQ GetSection
  420   INX:CPX #20:BCS OpenItemCR
  430   CMP #13:BNE GetItemName
  440   BEQ OpenItem
  450   .GetSection
  460   LDA (lptr),Y:STA ItemName           :\ *man item(n)
  470   .OpenItemCR
  480   LDA #13:STA ItemName,X
  490   .OpenItem
  500   LDX #ItemFilename AND 255
  510   LDY #ItemFilename DIV 256
  520   LDA #&40:JSR OSFIND
  530   TAY:BEQ errNotFound:STA channel
  540   JSR OSBGET:CMP #ASC":":BNE DisplayRestart
  550   LDX #0
  560   .RedirectLp
  570   STA ItemFilename,X:CMP #ASC" ":BCC ReOpen
  580   INX:JSR OSBGET:BCC RedirectLp
  590   .ReOpen
  600   LDA #13:STA ItemFilename,X
  610   JSR Close:JMP OpenItem
  620   .errNotFound
  630   BRK:EQUB 214:EQUS "Entry not found":BRK
  640   .msgMore
  650   EQUS ">EROM"
  660   :
  670   .DisplayRestart
  680   LDX #1:LDA #4:JSR OSBYTE            :\ Cursor keys give ASCII
  690   LDX #9:LDA #160:JSR OSBYTE          :\ Get screen dimensions
  700   TXA:STA height:LSR A:STA column
  710   LDY channel:LDA #0:JSR CallArgs:SEC :\ Read PTR
  720   LDA ptr+1:SBC column:STA ptr+1      :\ Move PTR back
  730   LDA ptr+2:SBC #0:STA ptr+2
  740   LDA ptr+3:SBC #0:STA ptr+3
  750   BCS MoveBack:LDX #3:LDA #0
  760   .MoveZero
  770   STA ptr,X:DEX:BPL MoveZero          :\ Before start, move to start
  780   .MoveBack
  790   PHP:LDA #1:JSR CallArgs             :\ Set PTR
  800   PLP:BCC Redisplay                   :\ Display from start of file
  810   .ScanForCR
  820   JSR OSBGET:CMP #13:BNE ScanForCR    :\ Scan to start of a line
  830   .Redisplay
  840   LDX #0:STX format:INX:STX column    :\ Initial settings
  850   LDX height:LSR height               :\ Start with whole page
  860   :
  870   \ X      =initial number of lines
  880   \ height =lines to scroll by
  890   \ channel=handle of open file
  900   \ column =print column
  910   \ format =character formatting
  920   :
  930   .DisplayLp
  940   LDY channel:JSR OSBGET:BCS EndOfFile
  950   JSR Output:TXA:BNE DisplayLp:CLC
  960   .EndOfFile
  970   PHP:LDX #4
  980   .MoreLp1
  990   LDA msgMore,X:JSR OSWRCH:DEX:BPL MoreLp1
 1000   JSR OSRDCH:PHP:PHA
 1010   LDX #4:LDA #127
 1020   .MoreLp2
 1030   JSR OSWRCH:DEX:BPL MoreLp2
 1040   PLA:PLP:BCS Escape
 1050   AND #&DF:CMP #ASC"Q":BEQ Quit
 1060   PLP:EOR #ASC"B":BEQ Back
 1070   EOR #201:BEQ Back
 1080   BCS EndOfFile                       :\ Can't move if at EOF
 1090   LDX height:BNE DisplayLp            :\ Do another half-page
 1100   .Back
 1110   LDA #12:JSR OSWRCH                  :\ CLS
 1120   JMP DisplayRestart                  :\ Display a page again
 1130   :
 1140   .Escape
 1150   LDA #126:JSR OSBYTE
 1160   .Quit
 1170   PLP:LDX #0:LDA #4:JSR OSBYTE
 1180   .Close
 1190   LDA #0:LDY channel:JMP OSFIND
 1200   .CallArgs
 1210   LDX #ptr:JMP OSARGS
 1220   :
 1230   .Extend
 1240   JSR OSBGET:AND #&DF
 1250   CMP #ASC"B":BEQ Toggle
 1260   CMP #ASC"I":BNE Return
 1270   \ _ = &1C     = %00011100
 1280   \ B = &42/&62 = %01x00010
 1290   \ I = &49/&69 = %01x01001
 1300   \ b2=underline, b1=bold, b0=italic
 1310   .Toggle
 1320   AND #7:EOR format:STA format:RTS
 1330   .CR
 1340   LDA #1:STA column:DEX:JMP OSNEWL
 1350   .TAB
 1360   LDA #32:JSR Display
 1370   LDA column:AND #7:BNE TAB
 1380   .Return
 1390   RTS
 1400   .Plain
 1410   JMP OSWRCH                          :\ Print plain character
 1420   :
 1430   .Output
 1440   CMP #ASC" ":BCS Display
 1450   CMP #9:BEQ TAB
 1460   CMP #13:BEQ CR
 1470   CMP #28:BEQ Toggle
 1480   CMP #29:BEQ Extend
 1490   CMP #26:BNE Return
 1500   LDA #ASC" "
 1510   .Display
 1520   INC column:LDY format:BEQ Plain
 1530   STA block:TXA:PHA
 1540   LDX #block AND 255:LDY #block DIV 256
 1550   LDA #10:JSR OSWORD                  :\ Read character definition
 1560   :
 1570   \ b2=underline, b1=bold, b0=italic
 1580   LDA format:LSR A:BCC CheckBold      :\ Skip if not italics
 1590   :
 1600   LSR block+1:LSR block+2             :\ Slant character
 1610   ASL block+6:ASL block+7:ASL block+8
 1620   :
 1630   .CheckBold
 1640   LSR A:BCC CheckUnder:PHA:LDX #8     :\ Skip if not bold
 1650   .BoldLp
 1660   LDA block,X:ASL A:ORA block,X       :\ Thicken character
 1670   STA block,X:DEX:BNE BoldLp
 1680   PLA
 1690   :
 1700   .CheckUnder
 1710   LSR A:BCC OutputChar
 1720   LDA #255:STA block+8                :\ Add an underline
 1730   :
 1740   .OutputChar
 1750   LDX #255:STX block+0:STX block+9:INX
 1760   .OutputLp
 1770   LDA block-1,X:JSR OSWRCH
 1780   INX:CPX #11:BCC OutputLp
 1790   PLA:TAX:RTS
 1800   :
 1810   EQUS RIGHT$("040",&B00-P%)
 1820 ]NEXT
 1830 IF P%>&B00:PRINT"Code overrun":END
 1840 PRINT"Saving ";save$;
 1850 save$="*Save "+save$+" "+STR$~mcode%+" "+STR$~O%+" "+STR$~(exec%OR&FFFF0000)+" "+STR$~load%
 1860 OSCLIsave$:PRINT