DataMuseum.dk

Presents historical artifacts from the history of:

Bogika Butler

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Bogika Butler

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦078639358⟧ TextFile

    Length: 23040 (0x5a00)
    Types: TextFile
    Names: »OLDVC005.INC«

Derivation

└─⟦ec7c10e12⟧ Bits:30009789/_.ft.Ibm2.50007351.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »OLDVC005.INC« 

TextFile

(******************************************************************************)
(*                                                                            *)
(*   MAIN PROCEDURES                                                          *)
(*                                                                            *)
(******************************************************************************)

   PROCEDURE volume(VAR status: status_type
                   ;VAR error_out: text
                   ;VAR print_out: text
                   ;VAR oper_in: text
                   ;VAR oper_out: text
                   );

      PROCEDURE operator(VAR status: status_type
                        ;VAR oper_in: text
                        ;VAR oper_out: text
                        ;VAR v_file: v_file_type
                        ;VAR v_file_name: c_file_name_type
                        ;VAR first_file_no: integer
                        ;VAR usr_vidvol: string_4
                        );

         VAR
            ios_v_file: byte;

        BEGIN (* operator *)
         (* operator dialogue *)
         writeln(oper_out, 'Program VERSACON version 1.0.');
         writeln(oper_out);
         writeln(oper_out, '(1) Indsæt kildedisketten i A-drevet.');
         REPEAT
            writeln(oper_out, '(2) Angiv navnet på kildediskettens CP/M-fil med ',
                              'VersaDos-filsystem-kopien:');
            writeln(oper_out);
            readln(oper_in, v_file_name);
            writeln(oper_out);
            IF length(v_file_name) > 0 THEN
              BEGIN
               assign(v_file, v_file_name);
               (*$I-*)
               reset(v_file);
               (*$I+*)
               ios_v_file := ioresult;
               IF ios_v_file <> IO_succes THEN
                 BEGIN
                  writeln(oper_out, '*** Filåbningsfejl.');
                  writeln(oper_out);
                  status := fatal
                 END
               ELSE
                 status := succes
              END
            ELSE
               status := exit;
            IF test( (.t_1.) ) THEN
              BEGIN
               write(test_out, '===  operator-1 ====');
               write_status(test_out, status);
               write(test_out, '  ios_v_file: ', ios_v_file);
              END;
         UNTIL status in (.succes, exit.);

         IF status = succes THEN
           BEGIN
            writeln(oper_out, '(3) Angiv antal VersaDos-filer at overspringe:');
            writeln(oper_out);
            readln(oper_in, first_file_no);
            writeln(oper_out);
            writeln(oper_out, '(4) Angiv VersaDos-diskettens "volume-id":');
            writeln(oper_out);
            readln(oper_in, usr_vidvol);
            writeln(oper_out);
           END;
         IF test( (.t_1.) ) THEN
           BEGIN
            write(test_out, '===  operator >  ===');
            write_status(test_out, status);
            write(test_out, '  v_file_name: ',v_file_name:14);
            write(test_out, '  first_file_no: ',first_file_no);
            write(test_out, '  usr_vidvol: ',usr_vidvol);
            writeln(test_out);
           END;

        END;  (* operator *)

      PROCEDURE secondary(VAR status: status_type
                         ;VAR error_out: text
                         ;VAR print_out: text
                         ;VAR v_file: v_file_type
                         ;    sds_psn: psn_type
                         ;    first_file_no: integer
                         ;VAR current_file_no: integer
                         ;    path_name: path_name_type
                         );

         PROCEDURE primary(VAR status: status_type
                          ;VAR error_out: text
                          ;VAR print_out: text
                          ;VAR v_file: v_file_type
                          ;    pdp_psn: psn_type
                          ;    first_file_no: integer
                          ;VAR current_file_no: integer
                          ;    path_name: path_name_type
                          );

            PROCEDURE isam_dup(VAR status: status_type
                              ;VAR error_out: text
                              ;VAR v_file: v_file_type
                              ;VAR c_file: c_file_type
                              ;    pde_fs: psn_type
                              ;    pde_fe: psn_type
                              ;    pde_eof: psn_type
                              ;    pde_eor: psn_type
                              ;    pde_fab: byte
                              ;    pde_dat: byte
                              );


               PROCEDURE var_segment(VAR status: status_type
                                    ;VAR error_out: text
                                    ;VAR v_file: v_file_type
                                    ;VAR c_file: c_file_type
                                    ;    fsd: fsd_type
                                    ;    lsn_current: psn_type
                                    ;    lrn_current: psn_type
                                    );


                  PROCEDURE expand(VAR status: status_type
                                  ;VAR error_out: text
                                  ;VAR c_file: c_file_type
                                  ;    n: byte
                                  );

                    BEGIN (* expand *)
                     IF n > 127 THEN
                        write(c_file, ' ':(n mod 128) )
                     ELSE
                        write(c_file, chr(n):1)
                    END;  (* expand *)


                  PROCEDURE get_length(VAR dab: block_type
                                      ;    rec_ptr: byte_number
                                      ;VAR rec_length: byte_number
                                      );

                    BEGIN (* get_length *)
                     rec_length := dab.db(.rec_ptr.) * 256 +
                                   dab.db(.rec_ptr + 1.)
                    END;  (* get_length *)


                  VAR
                     dab: block_type;
                     rec_ptr: byte_number;
                     rec_length: byte_number;
                     fraction: byte_number;
                     residual: byte_number;
                     i: byte_number;

                 BEGIN (* var_segment *)
                  dab.kind := dab_tag;
                  WITH fsd DO
                    BEGIN
                     IF test( (..) ) THEN
                       BEGIN
                        write(test_out, '=== > var_segment ==');
                        write(test_out, '  PSN: ');
                        write_psn(test_out, psn);
                        write(test_out, '  REC: ', rec:6);
                        write(test_out, '  SGS: ', sgs:2);
                        write(test_out, '  KEY: ', key:2);
                        writeln(test_out);
                       END;
                     position(status, error_out, v_file, psn);
                     IF status = succes THEN
                       BEGIN
                        rec_ptr := 255;
                        fraction := 0;
                        residual := 0;
                        rec_length := 0;
                        REPEAT

                           (* copy from dab.db(.rec_ptr + fraction.)*)
                           FOR i := 0 TO fraction - 1 DO
                              expand(status, error_out, c_file,
                                     dab.db(.rec_ptr + i.) );

                           (* DAB exhausted *)
                           IF rec_ptr >= 255 THEN
                              IF sgs >= 0 THEN
                                BEGIN
                                 get_current_block(status, error_out, v_file,
                                                   recs_per_dab, dab);
                                 sgs := sgs - 1;
                                 rec_ptr := -1;
                                END
                              ELSE
                                BEGIN
                                 status := failure;
                                 writeln(error_out, 'Data segment exceeded.');
                                END;

                           (* record exhausted *)
                           IF residual <= 0 THEN
                             BEGIN
                              rec := rec -1;
                              IF odd(rec_length) THEN
                                 fraction := fraction + 1;
                              rec_ptr := rec_ptr + fraction + 2;
                              get_length(dab, rec_ptr, rec_length);
                             END;
                           IF rec_ptr + rec_length > 255 THEN (* spanning *)
                             BEGIN
                              fraction := 255 - rec_ptr;
                              residual := rec_length - fraction;
                             END
                           ELSE
                             BEGIN
                              fraction := rec_length;
                              residual := 0;
                             END;
                           IF test( (..) ) THEN
                             BEGIN
                              write(test_out, '=== var_segment-1 ==');
                              write(test_out, '  PTR: ', rec_ptr);
                              write(test_out, '  LENGTH: ', rec_length);
                              write(test_out, '  FRACTION: ', fraction);
                              write(test_out, '  RESIDUAL: ', residual);
                              write(test_out, '  REC: ', rec);
                              write(test_out, '  SGS: ', sgs);
                              writeln(test_out);
                             END
                        UNTIL (fraction = 0) or (status <> succes);
                       END;
                    END;
                  IF test( (..) ) THEN
                    BEGIN
                     write(test_out, '=== var_segment > ==');
                     write_status(test_out, status);
                     writeln(test_out);
                    END;
                 END;  (* var_segment *)



               VAR
                  flk: psn_type;
                  dab_number: byte;
                  fsd_number: byte;
                  fab: block_type;
                  dab: block_type;
                  lsn_current: psn_type;
                  lrn_current: psn_type;

              BEGIN (* isam_dup *)
               lsn_current := null_psn;
               lrn_current := null_psn;
               fab.kind := fab_tag;
               flk := pde_fs;
               REPEAT
                  IF test( (..) ) THEN
                    BEGIN
                     write(test_out, '=== > isam_dup   ===');
                     write(test_out, '  FS: '); write_psn(test_out, pde_fs);
                     write(test_out, '  FE: '); write_psn(test_out, pde_fe);
                     write(test_out, '  EOF: '); write_psn(test_out, pde_eof);
                     write(test_out, '  EOR: '); write_psn(test_out, pde_eor);
                     write(test_out, '  FAB: ', pde_fab);
                     write(test_out, '  DAT: ', pde_dat);
                     writeln(test_out);
                    END;
                  get_block(status, error_out, v_file, flk, recs_per_fab, fab);
                  IF status = succes THEN
                    BEGIN
                     flk := fab.fab.flk;
                     IF test( (..) ) THEN
                       BEGIN
                        write(test_out, '===  isam_dup-1  ===');
                        write(test_out, '  FLK: ');
                        write_psn(test_out, fab.fab.flk);
                        write(test_out, '  BLK: ');
                        write_psn(test_out, fab.fab.blk);
                        write(test_out, '  USE: ', fab.fab.use:2);
                        writeln(test_out);
                       END;
                     IF (fab.fab.use > 0) and (pde_fab = 1)
                                          and (pde_dat = 8) THEN
                       BEGIN
                        fsd_number := 0;
                        REPEAT
                           fsd_number := fsd_number + 1;
                           IF test( (..) ) THEN
                             BEGIN
                              write(test_out, '===  isam_dup-2  ===');
                              write(test_out, '  FSD NUMBER: ', fsd_number:2);
                              writeln(test_out);
                             END;
                           var_segment(status, error_out, v_file,
                                       c_file,fab.fab.fsd(.fsd_number.),
                                       lsn_current, lrn_current);
                        UNTIL (equal_psn(fab.fab.fsd(.fsd_number.).psn,
                                         null_psn
                                        )
                              ) or (status <> succes) or (fsd_number > 30);
                        inc_psn(pde_eof);
                        inc_psn(pde_eor);
                        IF not ( equal_psn(lsn_current, pde_eof)  and
                                 equal_psn(lrn_current, pde_eor) ) THEN
                          BEGIN
                          END;
                       END
                    END
                  ELSE
                    status := failure;
               UNTIL equal_psn(flk,null_psn) or (status <> succes);
              END;  (* isam_dup *)


            VAR
               fpt: psn_type;                  (* psn of next pdb (zero if none) *)
               pdb: block_type;                (* current pdb *)
               pde_number: 0..20;              (* index of pde in pdb *)
               c_file_name: c_file_name_type;  (* name of c_file *)
               c_file: c_file_type;            (* Cp/m file to write *)

           BEGIN (* primary *)
            pdb.kind := pdb_tag;
            fpt := pdp_psn;
            REPEAT
               get_block(status, error_out, v_file, fpt, recs_per_pdb, pdb);
               IF status = succes THEN
                 BEGIN
                  WITH path_name DO
                     pdb_clg := pdb.pdb.clg;
                  print_dir(status, print_out, path_name);
                  fpt := pdb.pdb.fpt;
                  pde_number := 0;
                  REPEAT
                     pde_number := pde_number + 1;
                     WITH pdb.pdb.pde(.pde_number.) DO
                       BEGIN
                        IF test( (.t_3.) ) THEN
                          BEGIN
                           write(test_out, '===  primary-1   ===');
                           write(test_out, '  PDE NUMBER: ', pde_number:2);
                           write(test_out, '  CURR. FILE NO: ', current_file_no:6);
                           write(test_out, '  ATT: ', hex_2(att) );
                           write(test_out, '  FPT: ');
                           write_psn(test_out, fpt);
                           writeln(test_out);
                          END;
                        IF true (* entry used *) THEN
                          BEGIN
                           current_file_no := current_file_no + 1;
                           IF current_file_no > first_file_no THEN
                             BEGIN
                              open_c_file(status, error_out, c_file, c_file_name,
                                          fil, ext);
                              IF status = succes THEN
                                BEGIN
                                 print_pre_file(status, print_out
                                                      , current_file_no
                                                      , fil, ext
                                                      , c_file_name
                                               );
                                 CASE (att mod 4) OF
                                    0: (* contiguous *)
                                       writeln(error_out, 'Contiguous files ',
                                                          'not implemented.');
                                    1: (* sequential Variable + Fixed *)
                                       writeln(error_out, 'Sequential files ',
                                                          'not implemented.');
                                    2: (* Keyed ISAM No duplicate keys *)
                                       writeln(error_out, 'Keyed ISAM files ',
                                                          '(no duplicate keys) ',
                                                          'not implemented.');
                                    3: (* Keyed ISAM Duplicate + Null keys *)
                                       IF (key = 0) and (lrl =0) THEN
                                         isam_dup(status, error_out,
                                                  v_file, c_file,
                                                  fs, fe,
                                                  pdb.pdb.pde(.pde_number.).eof,
                                                  eor, fab, dat);
                                 END; (* case *)
                                 close_erase_c_file(status, error_out, c_file,
                                                    status <> succes);
(*                                 print_post_file(status, print_out, recs, bytes);*)
                                END
                             END
                          END
                       END
                  UNTIL (pde_number >=20) or (status <> succes)
                 END
            UNTIL equal_psn(fpt, null_psn) or (status <> succes);
            IF test( (.t_2,t_3.) ) THEN
              BEGIN
               write(test_out, '===  primary >   ===');
               write_status(test_out, status);
               write(test_out, '  CURR. FILE NO: ', current_file_no:6);
               writeln(test_out);
              END;
           END;  (* primary *)

         VAR
            sdb: block_type;           (* current sdb *)
            fpt: psn_type;             (* psn of next sdb *)
            sde_number: 0..15;         (* index of sde in sdb *)

        BEGIN (* secondary *)
         sdb.kind := sdb_tag;
         fpt := sds_psn;
         REPEAT
            get_block(status, error_out, v_file, fpt, recs_per_sdb, sdb);
            IF status = succes THEN
              BEGIN
               fpt := sdb.sdb.fpt;
               sde_number := 0;
               REPEAT
                  sde_number := sde_number + 1;
                  WITH sdb.sdb.sde(.sde_number.) DO
                    BEGIN
                     IF test( (.t_2.) ) THEN
                       BEGIN
                        write(test_out, '=== secondary-1  ===');
                        write(test_out, '  SDE NUMBER: ', sde_number);
                        write(test_out, '  PDP: '); write_psn(test_out, pdp);
                        write(test_out, '  CLG: ', clg:8);
                        write(test_out, '  FPT: '); write_psn(test_out, fpt);
                        writeln(test_out);
                       END;
                     WITH path_name DO
                        sdb_clg := clg;
                     IF not( equal_psn(pdp, null_psn) ) THEN
                        primary(status, error_out, print_out, v_file, pdp,
                                first_file_no, current_file_no, path_name);
                    END
               UNTIL (sde_number >= 15) or (status <> succes)
              END;
         UNTIL equal_psn(fpt, null_psn) or (status <> succes);
         IF test( (.t_1,t_2.) ) THEN
           BEGIN
            write(test_out, '=== secondary >  ===');
            write_status(test_out, status);
            write(test_out, '  CURR. FILE NO: ', current_file_no);
            writeln(test_out);
           END;
        END;  (* secondary *)

      VAR
         vid: block_type;                  (* current and only vid *)
         sds: psn_type;                    (* psn of next (first) sdb *)
         v_file: v_file_type;              (* CP/M source file holding
                                              Versados file system *)
         v_file_name: c_file_name_type;    (* name of v_file *)
         first_file_no: integer;           (* name of first file to convert.
                                              Files numbered 0... *)
         current_file_no: integer;         (* number of current file *)
         usr_vidvol: string_4;             (* Volume label stated by operator
                                              to be verified against volume *)
         path_name: path_name_type;        (* path name of current file *)

     BEGIN (* volume *)
      vid.kind := vid_tag;
      operator(status, oper_in, oper_out, v_file, v_file_name,
               first_file_no, usr_vidvol);
      IF status = succes THEN
        BEGIN
         get_block(status, error_out, v_file, null_psn, recs_per_vid, vid);
         IF test( (.t_1.) ) THEN
           BEGIN
            write(test_out, '===   volume-1   ===');
            write_status(test_out,status);
            write(test_out, '  vid.vol: ', vid.vid.vol:4);
            writeln(test_out);
           END;
         IF status = succes THEN
            IF vid.vid.vol = usr_vidvol THEN
              BEGIN
               print_header(status, print_out, v_file_name, first_file_no);
               WITH path_name DO
                 BEGIN
                  vol := vid.vid.vol;
                  usn := vid.vid.usn;
                 END;
               current_file_no := 0;
               sds := vid.vid.sds;
               IF not equal_psn(sds, null_psn) THEN
                  secondary(status, error_out, print_out, v_file, sds,
                            first_file_no, current_file_no, path_name);
               writeln(oper_out, current_file_no - 1, ' files transferred.');
               (* should probably be printed as well *)
              END
            ELSE
              writeln(error_out, 'conflicting volume identifier.')
        END
     END;  (* volume *)

                     (********************)
(*

  BEGIN
   IF test( (..) ) THEN
     BEGIN
      write(test_out,'=== ===');
      write_status(test_out, status);
      write(test_out,' ');
      writeln(test_out);
     END;
  END;

*)
«eof»