home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / VIDEOTEXT.LZX / VTsrc / VideoText.p < prev    next >
Encoding:
Text File  |  1996-04-27  |  22.2 KB  |  646 lines

  1. PROGRAM VideoText;
  2. FROM vt USES startup,info; {$opt q,s+,i+ }
  3. { Hauptprogramm/Ereignisverwaltung zum Projekt VideoText }
  4.  
  5. CONST version = '$VER: VideoText 5.05  (27.04.96)';
  6.  
  7. {          global       sys }
  8. {         /  |   \      /   }
  9. { pagelist decode cct  /    }
  10. {       \    |    /   /     }
  11. {        bildschirm _/      }
  12. {            |              }
  13. {          datei            }
  14. {            |              }
  15. {           jobs            }
  16. {          /   \            }
  17. {      info    startup      }
  18. {                           }
  19. {  HAUPTPROGRAMM VIDEOTEXT  }
  20.  
  21. CONST stacksize=10;
  22.  
  23. VAR l: Long;
  24.     stop,searching: Boolean;
  25.     roundrobin: Byte;
  26.     inputname: Str80;
  27.     j,toprequest,adip_count: Integer;
  28.     pgstack: ARRAY[1..stacksize] OF RECORD pg,sp: Integer; END;
  29.     stackptr,stackbot: Integer;
  30.  
  31. PROCEDURE push(seite: p_onepage);
  32. { "vergeßlicher" Stack: Überlauf führt nicht zum Abweisen der neuen }
  33. { Seitennummer, sondern zum Vergessen der ältesten. }
  34. BEGIN
  35.   IF seite<>Nil THEN BEGIN
  36.     pgstack[stackptr].pg := seite^.pg;
  37.     pgstack[stackptr].sp := seite^.sp;
  38.     Inc(stackptr); IF stackptr>stacksize THEN stackptr := 1;
  39.     IF stackptr=stackbot THEN BEGIN
  40.       Inc(stackbot); IF stackbot>stacksize THEN stackbot := 1;
  41.     END;
  42.   END;
  43. END;
  44.  
  45. FUNCTION pop: p_onepage;
  46. VAR seite: p_onepage;
  47. BEGIN
  48.   seite := Nil;
  49.   WHILE (stackptr<>stackbot) AND (seite=Nil) DO BEGIN
  50.     Dec(stackptr); IF stackptr=0 THEN stackptr := stacksize;
  51.     seite := hunt_in_list(pgstack[stackptr].pg,pgstack[stackptr].sp,True);
  52.   END;
  53.   IF seite=Nil THEN Write('Weiter zur}ck geht''s nicht.');
  54.   pop := seite;
  55. END;
  56.  
  57. PROCEDURE topcleaner;
  58. { entfernt unnötige TOP-Seiten aus der Seitenliste, je nachdem welche noch }
  59. { gebraucht werden. }
  60. VAR seite,hilf: p_onepage;
  61.     i: Integer;
  62.     refresh,kill: Boolean;
  63. BEGIN
  64.   refresh := False;
  65.   FOR i := $1F0 TO $1F4 DO BEGIN
  66.     seite := hunt_in_list(i,0,False);
  67.     IF (seite<>Nil) THEN IF seite^.pg<>i THEN seite := Nil;
  68.     CASE i OF
  69.       $1F0: kill := toprequest=0;
  70.       $1F1: kill := (toprequest AND 2)=0;
  71.       OTHERWISE kill := (toprequest AND 4)=0;
  72.     END;
  73.     IF kill AND (seite<>Nil) THEN BEGIN
  74.       IF seite=visblpage THEN refresh := True;
  75.       hilf := seite^.next; del_from_list(seite); update_list(hilf,-1);
  76.     END;
  77.   END;
  78.   IF refresh THEN writepage(thispage,True);
  79. END;
  80.  
  81. PROCEDURE topscan;
  82. { Schaut, was für TOP-Seiten schon eingetroffen sind, und führt ggf. die }
  83. { angeforderten Aktionen aus. }
  84. VAR pg: ARRAY[0..4] OF p_onepage;
  85.     i,n: Integer;
  86.     schluss: Boolean;
  87. BEGIN
  88.   FOR i := 0 TO 4 DO BEGIN
  89.     pg[i] := hunt_in_list($1F0+i,0,False);
  90.     IF (pg[i]<>Nil) THEN IF pg[i]^.pg<>$1F0+i THEN pg[i] := Nil;
  91.   END;
  92.   { Anzahl ADIP-Seiten (ADditional Info Page) aus 1F0 ermitteln: }
  93.   IF (pg[0]<>Nil) AND (toprequest AND 4<>0) AND (adip_count=0) THEN BEGIN
  94.     i := 840; schluss := False;
  95.     REPEAT
  96.       CASE topcode[pg[0]^.chars[i]] OF { Magazinnummer }
  97.         14: { Don't Care } ;
  98.         15: schluss := True;
  99.         16: { ungültige Ziffer } ;
  100.         OTHERWISE IF topcode[pg[0]^.chars[i+7]]=2 THEN Inc(adip_count);
  101.       END;
  102.       i := i + 8;
  103.     UNTIL (i=960) OR schluss;
  104.     IF adip_count>3 THEN adip_count := 3; { Nee, so geht's ja auch nicht! }
  105.     IF adip_count<3 THEN BEGIN  { zuviele Seiten angefordert }
  106.       cancel_job('1f4');
  107.       IF adip_count<2 THEN cancel_job('1f3');
  108.       redraw_queue(-1);
  109.     END;
  110.   END;
  111.   { Blockseiten (d. h. Themenbereichs-Leitseiten) anfordern: }
  112.   IF (pg[0]<>Nil) AND (toprequest AND 1<>0) THEN BEGIN
  113.     busy_pointer; topgrab(pg[0]); normal_pointer;
  114.     mainline; Write('Blockseiten angefordert');
  115.     toprequest := toprequest AND NOT 1; topcleaner;
  116.   END;
  117.   { TOP-Statistik: }
  118.   IF (pg[0]<>Nil) AND (pg[1]<>Nil) AND (toprequest AND 2<>0) THEN BEGIN
  119.     busy_pointer; mainline; Write('erstelle TOP-Statistik ...');
  120.     topinfo(pg[0],pg[1]); mainline; normal_pointer;
  121.     mark_list(False); thispage := hunt_in_list($999,1,False);
  122.     mark_list(True); writepage(thispage,True);
  123.     toprequest := toprequest AND NOT 2; topcleaner;
  124.   END;
  125.   { TOP-Text-Menue: }
  126.   n := 0; FOR i := 1 TO adip_count DO IF pg[i+1]<>Nil THEN Inc(n);
  127.   IF (pg[0]<>Nil) AND (n=adip_count) AND (toprequest AND 4<>0) THEN BEGIN
  128.     busy_pointer; mainline; Write('erstelle TOP-Men}s ...');
  129.     create_topmenu(pg[0],pg[2],pg[3],pg[4]); mainline; normal_pointer;
  130.     thispage := hunt_in_list($900,0,False);
  131.     redraw_list; writepage(thispage,True);
  132.     toprequest := toprequest AND NOT 4; topcleaner;
  133.   END;
  134. END;
  135.  
  136. PROCEDURE handle_menu(code: Long);
  137. { *die* zentrale Ereignisverarbeitung, viele Mausklick- und Tastatur- }
  138. { Ereignisse lassen sich hierauf abbilden! }
  139. VAR item,subitem: Word;
  140.     i,j: Integer;
  141.     l: Long;
  142.     s: str80;
  143.     pg1,pg2: p_onepage;
  144.     save_fifo,ok: Boolean;
  145. BEGIN
  146.   menupicked := False;
  147.   mainline;
  148.   item := code SHR 8;
  149.   subitem := code AND $FF;
  150.   CASE item OF
  151.     { *** Projekt *** }
  152.     $0101: say_hello(version);
  153.     $0102: helpme;
  154.     $0103: IF write_to_icon THEN Write('aktuelle Parameter gesichert')
  155.       ELSE Write(#155'2mFehler beim Schreiben der Parameter');
  156.     $0104: stop := True;
  157.     { *** Datei *** }
  158.     $0201: BEGIN { VT-Format laden }
  159.         sleep; IF fileselect('VT-Seiten laden',False,inputname) THEN
  160.           IF filetype(inputname)=1 THEN BEGIN
  161.             busy_pointer; Write(getpages(inputname,True)); normal_pointer;
  162.             Write(' Seiten gelesen'); redraw_list; writepage(thispage,True);
  163.           END ELSE
  164.             Write('keine VT-Seitendatei, sorry');
  165.         wakeup;
  166.       END;
  167.     $0202: BEGIN { Ausgabeformat }
  168.         asciifile := subitem=$01;
  169.         fileinfo;
  170.       END;
  171.     $0203: BEGIN { überschreiben }
  172.         overwrite := has_check($020300);
  173.         fileinfo;
  174.       END;
  175.     $0204: IF subitem=$01 THEN BEGIN { Dateinamen ändern }
  176.         sleep;
  177.         IF fileselect('Ausgabedatei festlegen',True,outputname) THEN;
  178.         fileinfo;
  179.         wakeup;
  180.       END ELSE BEGIN { Dateinamen aus Titelzeile }
  181.         namefrompage(outputname,visblpage); fileinfo;
  182.       END;
  183.     $0205: BEGIN { Icons erzeugen }
  184.         withicon := has_check($020500);
  185.         fileinfo;
  186.       END;
  187.     $0206: BEGIN { numerierte Dateien }
  188.         numbering := has_check($020600);
  189.         fileinfo;
  190.       END;
  191.     { *** Seiten *** }
  192.     $0301: BEGIN  { Rücksprung }
  193.         pg1 := pop; IF pg1<>Nil THEN BEGIN
  194.           mark_list(False); thispage := pg1;
  195.           mark_list(True); writepage(thispage,True);
  196.         END;
  197.       END;
  198.     $0302: BEGIN { Textausdruck }
  199.         IF incomplete THEN pg1 := thispage
  200.           ELSE pg1 := visblpage;
  201.         IF pg1<>Nil THEN BEGIN
  202.           sleep; busy_pointer;
  203.           Write('Seite wird gedruckt ... ');
  204.           IF printpage(pg1) THEN Write('OK.')
  205.           ELSE Write(#155'2mFehler!');
  206.           normal_pointer; wakeup;
  207.         END;
  208.       END;
  209.     $0303: BEGIN   { IFF-Bild }
  210.         sleep;
  211.         IF fileselect('IFF-Bild speichern',True,iffpicname) THEN BEGIN
  212.           IF filetype(iffpicname)<>-1 THEN BEGIN
  213.             j := Length(iffpicname);
  214.             IF j>30 THEN
  215.               s := '...'+Copy(iffpicname,j-26,27)
  216.             ELSE
  217.               s := iffpicname;
  218.             s := s+' überschreiben?'
  219.             ok := ja_nein(s);
  220.           END ELSE
  221.             ok := True;
  222.           IF ok THEN BEGIN
  223.             l := colperm;  colperm := $01234567;
  224.             s := colperms; colperms := '01234567';
  225.             REPEAT writepage(visblpage,concealed); newevent := False;
  226.             UNTIL NOT incomplete;
  227.             mainline; Write('IFF-Bild ... '); busy_pointer;
  228.             IF iffdump THEN Write('gespeichert')
  229.               ELSE Write(#155'2mDateifehler!');
  230.             normal_pointer;
  231.             colperm := l; colperms := s; writepage(visblpage,concealed);
  232.           END;
  233.         END;
  234.         wakeup;
  235.       END;
  236.     $0304: BEGIN  { Seite speichern }
  237.         sleep; { save_action enthält meist Rückfragen }
  238.         IF incomplete THEN j := save_action(thispage,subitem)
  239.           ELSE j := save_action(visblpage,subitem);
  240.         wakeup;
  241.       END;
  242.     $0305: BEGIN { Seite löschen }
  243.         CASE subitem OF
  244.           $01: IF thispage<>Nil THEN BEGIN
  245.               del_from_list(thispage); update_list(thispage,-1);
  246.             END;
  247.           $02: IF thispage<>Nil THEN BEGIN
  248.               i := 0; j := thispage^.pg; pg1 := root;
  249.               WHILE pg1<>Nil DO BEGIN
  250.                 pg2 := pg1; pg1 := pg1^.Next;
  251.                 IF pg2^.pg=j THEN BEGIN
  252.                   del_from_list(pg2); Inc(i);
  253.                 END;
  254.               END;
  255.               update_list(thispage,-i);
  256.             END;
  257.           $03: BEGIN kill_list; redraw_list; stackptr := stackbot; END;
  258.           OTHERWISE;
  259.         END;
  260.         writepage(thispage,True);
  261.       END;
  262.     { *** Anfordern *** }
  263.     $0401: BEGIN { Seite 100 }
  264.         add_job('100',True); redraw_queue(-1);
  265.       END;
  266.     $0402: IF thispage<>Nil THEN BEGIN { diese Seite nochmal }
  267.         s := hexstr(thispage^.pg,3); add_job(s,False); redraw_queue(-1);
  268.       END;
  269.     $0403: BEGIN { 1. Vorauswahl }
  270.         busy_pointer; getconfig(1); normal_pointer;
  271.       END;
  272.     $0404: BEGIN { 2. Vorauswahl }
  273.         busy_pointer; getconfig(2); normal_pointer;
  274.       END;
  275.     $0405: BEGIN  { Stichprobe }
  276.         IF thispage<>Nil THEN say_hello(version);
  277.         mainline; Write('Stichprobe l{uft ...');
  278.         busy_pointer; page_grabber(True); normal_pointer;
  279.         thispage := root; redraw_list; writepage(thispage,True);
  280.       END;
  281.     $0406: BEGIN { Vorauswahl editieren }
  282.         Write('Editor-Aufruf ... '); busy_pointer;
  283.         IF edconfig(subitem) THEN Write('abgeschlossen')
  284.           ELSE Write(#155'2mDOS-Fehler');
  285.         normal_pointer;
  286.       END;
  287.     $0407: IF root<>Nil THEN BEGIN { Seitennummern kopieren }
  288.         busy_pointer; dump_numbers; normal_pointer;
  289.         Write('Seitennummern als Clip gespeichert');
  290.       END;
  291.     $0408: IF subitem=$01 THEN BEGIN { TOP-Verzeichnis erstellen }
  292.         Write('TOP-Text-Seiten angefordert');
  293.         toprequest := toprequest OR 4; adip_count := 0;
  294.         hurricane;
  295.         save_fifo := fifo; fifo := False;
  296.         add_job('1f4',False); add_job('1f3',False); add_job('1f2',False);
  297.         add_job('1f0/*',False);
  298.         fifo := save_fifo;
  299.         redraw_queue(-1);
  300.       END ELSE BEGIN  { ... und löschen }
  301.         pg1 := visblpage; kill_topmenu; redraw_list;
  302.         IF thispage<>pg1 THEN writepage(thispage,True);
  303.       END;
  304.     $0409: BEGIN { TOP-Statistik }
  305.         Write('TOP-Seiten angefordert');
  306.         toprequest := toprequest OR 2;
  307.         save_fifo := fifo; fifo := False;
  308.         add_job('1f1',False); add_job('1f0/*',False);
  309.         fifo := save_fifo;
  310.         redraw_queue(-1);
  311.       END;
  312.     $040A: BEGIN { Blockseiten holen }
  313.         Write('TOP-Leitseite angefordert');
  314.         toprequest := toprequest OR 1;
  315.         save_fifo := fifo; fifo := False;
  316.         add_job('1f0/*',False);
  317.         fifo := save_fifo;
  318.         redraw_queue(-1);
  319.       END;
  320.     $040B: BEGIN  { Jobs löschen }
  321.         kill_queue; redraw_queue(-1);
  322.         toprequest := 0; topcleaner;
  323.       END;
  324.     $040C: BEGIN  { einen Job löschen }
  325.         j := thisjob; kill_job(thisjob);
  326.         IF j>=0 THEN  redraw_queue(j)  ELSE  redraw_queue(-1);
  327.       END;
  328.     $040D: BEGIN { FIFO }
  329.         fifo := has_check($040D00); redraw_queue(-1);
  330.       END;
  331.     { *** Extras *** }
  332.     $0501: writepage(visblpage,False); { Rätseltaste }
  333.     $0502: writepage(thispage,True); { Seite neu aufbauen }
  334.     $0503: BEGIN { Sendernamen zeigen }
  335.         IF activejobs[0].pg=0 THEN BEGIN
  336.           anfordern(0,100,0,%000);
  337.           j := 50; REPEAT Delay(1); Dec(j) UNTIL seite_da(0) or (j=0);
  338.         END;
  339.         gethead(0,s);
  340.         IF activejobs[0].pg=0 THEN sperren(0);
  341.         Write('Sender: '#155'2m',s);
  342.       END;
  343.     $0504: BEGIN  { Test/Uhr }
  344.         testing := has_check($050400); i2c_status := 0;
  345.         test(testing);
  346.         IF i2c_status<>0 THEN guru(i2c_status);
  347.       END;
  348.     $0505: IF testing THEN BEGIN  { VT-Zeit übernehmen }
  349.         sleep; { Uhrzeit umstellen kann 'Zeit kosten' }
  350.         gettime(aktspeicher,s); force_time(s);
  351.         wakeup; Write('Systemzeit von VT }bernommen');
  352.       END;
  353.     $0506: TV_display(3-subitem); { Fernsehdarstellung }
  354.     $0507: BEGIN { Decoder-Reset }
  355.         hurricane; init_CCT; Write('Decoder-Reset ausgef}hrt'); redraw_queue(-1);
  356.       END;
  357.     OTHERWISE;
  358.   END;
  359. END;
  360.  
  361. PROCEDURE write_checks;
  362. { Menuehäkchen an den Zustand der Programmvariablen anpassen }
  363. BEGIN
  364.   check($020201,asciifile);
  365.   check($020202,NOT asciifile);
  366.   check($020300,overwrite);
  367.   check($020500,withicon);
  368.   check($020600,numbering);
  369.   check($040D00,fifo);
  370.   check($050400,testing);
  371. END;
  372.  
  373. PROCEDURE handle_raw(code: Long);
  374. { für Sondertasten }
  375. VAR i: integer;
  376.     key: Byte;
  377.     pg1,pg2: p_onepage;
  378. VAR shift,ctrl,alt,comm: Boolean;
  379. BEGIN
  380.   key := (code SHR 16) AND $7F;
  381.   shift := (code AND $03)<>0; alt := (code AND $30)<>0;
  382.   ctrl := (code AND $08)<>0; comm := (code AND $80)<>0;
  383.   mainline;
  384.   IF key=$5F THEN helpme;  { Help }
  385.   IF key IN [$50..$59] THEN  { *** F-Tasten ... }
  386.     IF NOT shift THEN CASE key OF  { ... normal }
  387.       $53: handle_menu($040900); { F4 }
  388.       $54: handle_menu($040801); { F5 }
  389.       $55: handle_menu($040500); { F6 }
  390.       $56: handle_menu($040B00); { F7 }
  391.       $57: handle_menu($040200); { F8 }
  392.       $58: handle_menu($040601); { F9 }
  393.       $59: handle_menu($040300); { F10 }
  394.       OTHERWISE Write('F',key-$4F,': ???');
  395.     END ELSE CASE key OF  { ... geshiftet }
  396.       $53: handle_menu($040A00); { Shift-F4 }
  397.       $54: handle_menu($040802); { Shift-F5 }
  398.       $55: BEGIN  { Stichprobe, inklusive Pseudoseiten }
  399.         IF thispage<>Nil THEN say_hello(version);
  400.         mainline; Write('erweiterte Stichprobe l{uft ...');
  401.         busy_pointer; page_grabber(False); normal_pointer;
  402.         thispage := root; redraw_list; writepage(thispage,True);
  403.       END;
  404.       $56: handle_menu($040C00); { Shift-F7 }
  405.       $57: handle_menu($050700); { Shift-F8 }
  406.       $58: handle_menu($040602); { Shift-F9 }
  407.       $59: handle_menu($040400); { Shift-F10 }
  408.       OTHERWISE Write('Shift-F',key-$4F,': ???');
  409.     END;
  410.   IF key IN [$4C..$4F] THEN  { *** Cursor-Tasten }
  411.     IF jobcursor THEN BEGIN    { Warteschlange blättern }
  412.       mark_queue(False);
  413.       CASE key OF
  414.         $4C: IF shift THEN thisjob := thisjob + 5 ELSE Inc(thisjob);
  415.         $4D: IF shift THEN thisjob := thisjob - 5 ELSE Dec(thisjob);
  416.         $4E: thisjob := -queued;
  417.         $4F: thisjob := maxactive-1;
  418.         OTHERWISE;
  419.       END;
  420.       IF thisjob<-queued THEN thisjob := -queued;
  421.       IF thisjob>=maxactive-1 THEN thisjob := maxactive-1;
  422.       mark_queue(True);
  423.       IF thisjob>=0 THEN BEGIN
  424.         aktspeicher := thisjob; display_select(aktspeicher); END;
  425.     END ELSE IF thispage<>Nil THEN BEGIN     { Seitenliste blättern }
  426.       mark_list(False);
  427.       CASE key OF
  428.         $4C: IF alt THEN
  429.             thispage := prev_magazine(thispage)
  430.           ELSE IF shift THEN
  431.             WHILE (thispage^.prev<>Nil) AND thispage^.dejavu DO
  432.               thispage := thispage^.prev
  433.           ELSE
  434.             IF thispage^.prev<>Nil THEN thispage := thispage^.prev;
  435.         $4D: IF alt THEN
  436.             thispage := next_magazine(thispage)
  437.           ELSE IF shift THEN
  438.             WHILE (thispage^.next<>Nil) AND thispage^.dejavu DO
  439.               thispage := thispage^.next
  440.           ELSE
  441.             IF thispage^.next<>Nil THEN thispage := thispage^.next;
  442.         $4E: IF shift THEN
  443.             WHILE thispage^.next<>Nil DO thispage := thispage^.next
  444.           ELSE
  445.             FOR i := 1 TO colht DO
  446.               IF thispage^.next<>Nil THEN thispage := thispage^.next;
  447.         $4F: IF shift THEN
  448.             thispage := root
  449.           ELSE
  450.             FOR i := 1 TO colht DO
  451.               IF thispage^.prev<>Nil THEN thispage := thispage^.prev;
  452.         OTHERWISE;
  453.       END;
  454.       mark_list(True); writepage(thispage,True);
  455.     END;
  456. END;
  457.  
  458. PROCEDURE handle_key;
  459. { einzelne Eingabetaste untersuchen }
  460. VAR pg: p_onepage;
  461.     nr: Integer;
  462.     key: Char;
  463. BEGIN
  464.   key := taste; taste := #0;
  465.   mainline;
  466.   CASE key OF
  467.     '0'..'9','a'..'f','A'..'F','-','/','*','.','!':
  468.       IF Length(queue_input) < 8 THEN BEGIN
  469.         queue_input := queue_input + Upcase(key); queue_me;
  470.       END;
  471.     #8: IF Length(queue_input) > 0 THEN BEGIN
  472.         queue_input[Length(queue_input)] := #0; queue_me;
  473.       END;
  474.     #13: BEGIN
  475.         pg := Nil;
  476.         IF (Length(queue_input)=3) THEN BEGIN { Sprungbefehl? }
  477.           nr := hexval(queue_input); pg := hunt_in_list(nr,0,False);
  478.           IF pg<>Nil THEN IF pg^.pg<>nr THEN pg := Nil;
  479.           IF thispage<>Nil THEN IF thispage^.pg=nr THEN pg := Nil;
  480.         END;
  481.         IF pg<>Nil THEN BEGIN  { Seite nur anspringen }
  482.           queue_input := ''; queue_me;
  483.           jobcursor := False; hilite_crsr; push(thispage);
  484.           mark_list(False); thispage := pg; mark_list(True);
  485.           writepage(thispage,True);
  486.         END ELSE BEGIN    { Seite (neu) anfordern }
  487.           add_job(queue_input,True);
  488.           queue_input := ''; redraw_queue(-1);
  489.         END;
  490.       END;
  491.     #9: BEGIN  { Tab: Cursor zwischen Jobliste und Seitenliste umschalten }
  492.         jobcursor := NOT jobcursor; hilite_crsr;
  493.       END;
  494.     '#': BEGIN numbering := NOT numbering; write_checks; fileinfo; END;
  495.     'i','I': BEGIN withicon := NOT withicon; write_checks; fileinfo; END;
  496.     'n','N': handle_menu($050300);
  497.     #14: handle_menu($020402); { Ctrl-N }
  498.     's','S': handle_menu($030401);
  499.     #19: handle_menu($030403); { Ctrl-S }
  500.     't','T': BEGIN check($050400, NOT testing); handle_menu($050400); END;
  501.     ' ': writepage(thispage,True);
  502.     '?': writepage(visblpage,False);
  503.     #27: handle_menu($030100); { Esc }
  504.     #127: BEGIN { Del: erst noch die Qualifier abfragen }
  505.         IF (rawcode AND $08)<>0 THEN handle_menu($030503) { Ctrl }
  506.         ELSE IF (rawcode AND $03)<>0 THEN handle_menu($030502) { Shift }
  507.         ELSE handle_menu($030501);
  508.       END;
  509.     #155: handle_raw(rawcode);
  510.     OTHERWISE BEGIN
  511.         IF key>' ' THEN Write(key,'?')
  512.         ELSE Write('Ctrl-',Chr(Ord(key)+64),'?');
  513.         Delay(20); mainline;
  514.       END;
  515.   END;
  516. END;
  517.  
  518. PROCEDURE handle_click;
  519. { angeklickte Seitennummern aufsuchen/anfordern }
  520. VAR nr,max,j: Integer;
  521.     pg: p_onepage;
  522.     code: Char;
  523. BEGIN
  524.   mouseclicked := False;
  525.   mainline;
  526.   nr := number_from_page(clickedx,clickedy);
  527.   IF nr>=0 THEN BEGIN   { Nummer in einer Seite angeklickt }
  528.     pg := hunt_in_list(nr,0,False);
  529.     IF pg<>Nil THEN IF pg^.pg<>nr THEN pg := Nil;
  530.     IF thispage<>Nil THEN IF thispage^.pg=nr THEN pg := Nil;
  531.     IF pg<>Nil THEN BEGIN  { Seite nur anspringen }
  532.       jobcursor := False; hilite_crsr; push(thispage);
  533.       mark_list(False); thispage := pg; mark_list(True);
  534.       writepage(thispage,True);
  535.     END ELSE IF nr IN [$100..$899] THEN BEGIN    { Seite (neu) anfordern }
  536.       nr := get_bcd(nr); max := nr;
  537.       IF dblclicked THEN BEGIN
  538.         max := number_from_page(clickedx+4,clickedy);
  539.         IF max<0 THEN max := nr + 3 ELSE max := get_bcd(max);
  540.         IF max<nr THEN max := nr;
  541.         IF (max DIV 100)>(nr DIV 100) THEN max := 100*(nr DIV 100 + 1)-1;
  542.       END;
  543.       FOR j := nr TO max DO
  544.         add_job(IntStr(j),False);
  545.       redraw_queue(-1);
  546.     END;
  547.     Exit;
  548.   END;
  549.   pg := page_from_list(clickedx,clickedy);
  550.   IF pg<>Nil THEN BEGIN
  551.     IF (thispage<>pg) OR jobcursor THEN BEGIN
  552.       jobcursor := False; hilite_crsr;
  553.       mark_list(False); thispage := pg; mark_list(True);
  554.     END ELSE IF dblclicked THEN BEGIN
  555.       del_from_list(thispage); update_list(thispage,-1);
  556.     END;
  557.     writepage(thispage,True);
  558.     Exit;
  559.   END;
  560.   nr := pos_from_queue(clickedx,clickedy);
  561.   IF nr<maxactive THEN BEGIN
  562.     IF (thisjob<>nr) OR NOT jobcursor THEN BEGIN
  563.       jobcursor := True; hilite_crsr;
  564.       mark_queue(False); thisjob := nr; mark_queue(True);
  565.     END ELSE IF dblclicked THEN BEGIN
  566.       kill_job(thisjob);
  567.       IF thisjob>=0 THEN  redraw_queue(thisjob)  ELSE  redraw_queue(-1);
  568.     END;
  569.     Exit;
  570.   END;
  571.   code := click_action(clickedx,clickedy);
  572.   CASE code OF
  573.     'D': handle_menu($020401);
  574.     'F': BEGIN asciifile := NOT asciifile; write_checks; fileinfo; END;
  575.     'M': BEGIN overwrite := NOT overwrite; write_checks; fileinfo; END;
  576.     'N': BEGIN numbering := NOT numbering; write_checks; fileinfo; END;
  577.     'I': BEGIN withicon  := NOT withicon;  write_checks; fileinfo; END;
  578.     'J': BEGIN fifo := NOT fifo; write_checks; redraw_queue(-1); END;
  579.     '+': BEGIN jobcursor := False; hilite_crsr; handle_raw($4D0000); END;
  580.     '0': BEGIN jobcursor := False; hilite_crsr; handle_menu($030100); END;
  581.     '-': BEGIN jobcursor := False; hilite_crsr; handle_raw($4C0000); END;
  582.     'K': IF dblclicked THEN handle_menu($030503);
  583.     'T': BEGIN
  584.         check($050400, NOT testing); handle_menu($050400);
  585.         IF dblclicked THEN handle_menu($050300);
  586.       END;
  587.     'S': BEGIN
  588.         kill_queue;
  589.         IF dblclicked THEN getconfig(1);
  590.         redraw_queue(-1);
  591.       END;
  592.     'L': BEGIN
  593.         jobcursor := False; hilite_crsr;
  594.         IF dblclicked THEN handle_raw($4E0001)
  595.           ELSE handle_raw($4F0001);
  596.       END;
  597.     OTHERWISE;
  598.   END;
  599. END;
  600.  
  601. BEGIN  { Hauptprogramm }
  602.   { Eine Menge Variablen werden bereits in den Units, wo sie auch deklariert }
  603.   { sind, initialisiert. }
  604.   get_args; inputname := outputname; iffpicname := outputname;
  605.   stop := False;
  606.   colperm := $13567402; colperms := hexstr(colperm,8);
  607.   AddExitServer(sysclean); sysinit(version);
  608.   write_checks;
  609.   roundrobin := 0; toprequest := 0;
  610.   stackbot := 1; stackptr := stackbot;
  611.   init_CCT; { SAA 5246 initialisieren }
  612.   cursoroff; redraw_all; IF thispage=Nil THEN say_hello(version);
  613.   REPEAT
  614.     IF NOT newevent THEN event_scan;
  615.     IF newevent THEN BEGIN
  616.       newevent := False;
  617.       IF taste<>#0 THEN handle_key;
  618.       IF mouseclicked THEN handle_click;
  619.       IF menupicked THEN handle_menu(menucode);
  620.     END ELSE IF testing OR incomplete OR (visblpage=Nil) OR
  621.       (toprequest+queued+active>0) THEN BEGIN
  622.       Delay(5);  { Multitasking-freundlich, wir haben Zeit ... }
  623.       IF testing THEN test(True);
  624.       IF visblpage=Nil THEN say_hello(version)
  625.         ELSE IF incomplete THEN writepage(visblpage,True);
  626.       IF toprequest>0 THEN topscan;
  627.       searching := queued+active>0;
  628.       IF queued>0 THEN handle_queue;
  629.       IF active>0 THEN BEGIN
  630.         handle_jobs;
  631.         attempt_input(roundrobin);
  632.         roundrobin := (roundrobin+1) MOD maxactive;
  633.       END;
  634.       IF searching AND (queued+active=0) THEN showscreen(True); { fertig! }
  635.       IF (i2c_status<>0) AND NOT testing THEN BEGIN
  636.         testing := True; test(True);
  637.         guru(i2c_status);
  638.       END;
  639.     END ELSE   { nichts mehr zu tun :-) }
  640.       l := Wait(-1);
  641.   UNTIL stop;
  642.   SetStdIO(Nil); CloseConsole(Con);
  643.   kill_list; sysclean;
  644. END.
  645.  
  646.