10 REM >GetPages 1.22
   20 REM  About 1986 v0.10 JGH: Initial version at Myers Grove
   30 REM  Early 1988 v1.00 JGH: Tidied version for Micro User
   40 REM 20-Apr-1997 v1.10 JGH: Selects magazine, looks on every line for subpage
   50 REM 21-Jun-1998 v1.20 JGH: Can do range of pages
   60 REM 30-Jul-1998 v1.21 JGH: Better index match, doesn't miss last page
   70 REM 09-Mar-2000 v1.22 JGH: Display TAB corrected
   80 :
   90 MODE7:DIMctrl%20,pf%(99):X%=ctrl%:Y%=X%DIV256:ver$="1.22":PROCtitle
  100 A%=130:IF(USR&FFF4 AND&FFFF00)<>&FFFF00:PRINT"Program must run in the I/O processor.":END
  110 IFHIMEM<>&7C00:OSCLI"SHADOW 1":MODE 7:IFHIMEM<>&7C00:PRINT"Please turn shadow screen off.":END
  120 VDU23;2,53;0;0;0:PROCassem:ON ERROR PROCerr
  130 *HON
  140 INPUT"Channel: "C:OSCLI"CH"+STR$C:OSCLI"MAGAZINE "+STR$C
  150 INPUT"Enter Start Page: "P0:OSCLI"PAGE "+STR$P0
  160 OSCLI"MAGAZINE "+LEFT$(STR$P0,1)
  170 PRINT"Enter End Page"'"(or RETURN for just P";P0;:INPUT"): "P1
  180 PRINT"Save name";:IFP1<>0:PRINT" prefix";
  190 INPUT": "SP$
  200 :
  210 P=P0:REPEAT:CLS:PRINT''"Searching for P";P;:OSCLI"PAGE "+STR$P
  220   FORlp%=1 TO 99:pf%(lp%)=0:NEXT
  230   REPEATpg%=FNpage:UNTIL(pg%AND&FF00):pages%=pg%DIV256
  240   S$=SP$+LEFT$(STR$P,P1<>0)
  250   OSCLI"SAVE "+S$+" 0+"+STR$~(pages%*1024)+" FFFF7C00 FFFF7C00"
  260   pg%=pg%AND&FF:out%=OPENOUT(S$):PTR#out%=1023:BPUT#out%,pages%:PROCsave(pg%)
  270   REPEAT:CLS:VDU23;2,53;0;0;0
  280     PRINT"P";P:PROCtitle:FORlp%=1 TO pages%:IFpf%(lp%):VDU146 ELSE VDU151
  290       VDU47:IF(lp%MOD20)=0:PRINT'
  300     NEXT:VDU31,(2*pg%-1)MOD40,7+2*((pg%-1)DIV20),94,8
  310     IFpages%>1:REPEATpg%=FNpage AND&FF:UNTILpg%:IFpf%(pg%)=0:PROCsave(pg%)
  320     f%=0:FORlp%=1 TO pages%:f%=f%+pf%(lp%):NEXT
  330 UNTILf%>=pages%:PROCCloseOut:P=P+1:UNTILP>P1
  340 CLS:PROCtitle:PRINT'"Finished"
  350 *HOFF
  360 END
  370 :
  380 DEFFNpage
  390 *TRANSFER 7000
  400 *DISPLAY 7000
  410 REM VDU23;2,53;0;0;0
  420 add%=&7C49:REPEAT:!X%=!add%:X%!4=add%!4
  430   FORlp%=X%TOX%+6:?lp%=?lp%AND127:IF((?lp%+1)AND127)<33:?lp%=32
  440   NEXT:X%?7=13:A$=$X%:add%=add%+40
  450 I%=INSTR(A$,"/"):UNTILadd%>&8000 OR (I% AND (VALMID$(A$,I%-2)+VALMID$(A$,I%+1)<>0))
  460 IFadd%>&8000:PRINTTAB(0,24);"Can't find page index.";:=&101:REM :=0
  470 p%=VALMID$(A$,I%+1):IFp%=0 OR p%>99:PRINTTAB(0,24);"Invalid magazine size.";:=&101:REM :=0
  480 =p%*256+VALMID$(A$,I%-2)
  490 :
  500 DEFPROCsave(p%)
  510 PRINTTAB(0,0);P;"/";p%:CALL mcode%
  520 ?X%=out%:X%!1=&FFFF7C28:X%!5=920:X%!9=1024*(p%-1):A%=1:CALL &FFD1
  530 FORM%=&7000 TO &7067 STEP4:!M%=0:NEXT
  540 ?X%=out%:X%!1=&FFFF7000:X%!5=104:X%!9=1024*(p%-1)+920
  550 CALL &FFD1:pf%(p%)=1:ENDPROC
  560 :
  570 DEFPROCCloseOut:out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  580 ENDPROC
  590 :
  600 DEFPROCtitle
  610 PRINTTAB(0,1);CHR$132;CHR$157;CHR$131;CHR$141;SPC(5)"Teletext Page Downloader"'CHR$132;CHR$157;CHR$131;CHR$141;SPC(5)"Teletext Page Downloader"
  620 PRINT" "CHR$157;CHR$132;"  (C)1988,2000 J.G.Harston. V"ver$''
  630 ENDPROC
  640 :
  650 DEFPROCassem
  660 DIM mcode% 50
  670 FOR pass%=0 TO 1
  680   P%=mcode%
  690   [OPT pass%*2
  700   LDA #0:STA &70:TAY
  710   LDA #&7C:STA &71
  720   .loop
  730   LDA (&70),Y
  740   CMP #163:BEQ stay
  750   CMP #223:BEQ stay
  760   CMP #224:BEQ stay
  770   CMP #255:BEQ stay
  780   AND #&7F:CMP #32:BCS stay
  790   ORA #&80
  800   .stay
  810   STA (&70),Y:INY:BNE loop
  820   INC &71:BPL loop
  830   RTS
  840 ]NEXT:ENDPROC
  850 :
  860 DEFPROCerr:PRINTTAB(0,24)SPC(39);
  870 PRINTTAB(0,23);:REPORT:ON ERROR REPORT:PRINT" at line ";ERL;:END
  880 PROCCloseOut:*HOFF
  890 END