10
20
30
40
50
60
70
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