     2   1    1:D     1 (*$L PRINTER: *)
     3   1    1:D     1 (* SWITCH "$S+" PRECEDES $L SWITCH *)
     4   1    1:D     1 (*$R-*)
     5   1    1:D     1 (*$I-*)
     6   1    1:D     1 (*$V-*)
     7   1    1:D     1 
     8   1    1:D     1 (*
     9   1    1:D     1   WIZARDRY 3, WIZUTIL.CODE
    10   1    1:D     1   REVERSE ENGINEERED BY:  THOMAS WILLIAM EWERS, 2012
    11   1    1:D     1 *)
    12   1    1:D     1 
    13   1    1:D     1 
    14   1    1:D     1 PROGRAM WIZBOOT;
    15   1    1:D     3 
    16  28    1:D     3 
    17  28    2:D     1   PROCEDURE SETCHAIN(TYTLE:STRING);
    18  28    3:D     1   PROCEDURE SETCVAL(VAL:STRING);
    19  28    4:D     1   PROCEDURE GETCVAL(VAR VAL:STRING);
    20  28    5:D     1   PROCEDURE SWAPON;
    21  28    6:D     1   PROCEDURE SWAPOFF;
    22  28    6:D     1   
    23   1    1:D     1   USES CHAINSTUFF;
    24   1    1:D     3 
    25   1    1:D     3   CONST
    26   1    1:D     3         DRIVE1 = 4;
    27   1    1:D     3         DRIVE2 = 5;
    28   1    1:D     3         SECTORSZ = 256;
    29   1    1:D     3         BLOCKSZ = 512;
    30   1    1:D     3         BLOCK2SZ = 1024;
    31   1    1:D     3         WIZDIRBL = 2;
    32   1    1:D     3         WIZDIRSZ = 338;
    33   1    1:D     3         SERIALBL = 5;
    34   1    1:D     3         BEL = 7;
    35   1    1:D     3         BS = 8;
    36   1    1:D     3         ESC = 27;
    37   1    1:D     3         VT = 11;
    38   1    1:D     3         HOMECLR = 12;
    39   1    1:D     3         CR = 13;
    40   1    1:D     3      
    41   1    1:D     3      
    42   1    1:D     3   TYPE
    43   1    1:D     3 
    44   1    1:D     3        TBLOCKRG = 0..511;
    45   1    1:D     3   
    46   1    1:D     3        DIRENTRY = RECORD
    47   1    1:D     3            FIRSTBLK : INTEGER;
    48   1    1:D     3            LASTBLK  : INTEGER;
    49   1    1:D     3            FILEKIND : PACKED RECORD
    50   1    1:D     3                FT : (VOLHEAD, BADBLK, MACH6502, TEXT, DEBUG,
    51   1    1:D     3                      DATA, GRAFFILE, FOTOFILE, SUBDIR);
    52   1    1:D     3              END;
    53   1    1:D     3            FILENAME : STRING[ 7];
    54   1    1:D     3            VOLLB    : INTEGER;
    55   1    1:D     3            FILECNT  : INTEGER;
    56   1    1:D     3            LOADTIM  : INTEGER;
    57   1    1:D     3            BOOTDATE : INTEGER;
    58   1    1:D     3            RES1     : INTEGER;
    59   1    1:D     3            RES2     : INTEGER;
    60   1    1:D     3          END;
    61   1    1:D     3   
    62   1    1:D     3        TWIZLONG = RECORD
    63   1    1:D     3            LOW  : INTEGER;
    64   1    1:D     3            MID  : INTEGER;
    65   1    1:D     3            HIGH : INTEGER;
    66   1    1:D     3          END;
    67   1    1:D     3          
    68   1    1:D     3        TRACE = (NORACE, HUMAN, ELF, DWARF, GNOME, HOBBIT);
    69   1    1:D     3        
    70   1    1:D     3        TCLASS = (FIGHTER, MAGE, PRIEST, THIEF,
    71   1    1:D     3                  BISHOP, SAMURAI, LORD, NINJA);
    72   1    1:D     3          
    73   1    1:D     3        TALIGN = (UNALIGN, GOOD, NEUTRAL, EVIL);
    74   1    1:D     3          
    75   1    1:D     3        TSTATUS = (OK, AFRAID, ASLEEP, PLYZE, 
    76   1    1:D     3                   STONED, DEAD, ASHES, LOST);
    77   1    1:D     3        
    78   1    1:D     3        TATTRIB = (STRENGTH, IQ, PIETY, VITALITY, AGILITY, LUCK);
    79   1    1:D     3        
    80   1    1:D     3        TSPELL7G = ARRAY[ 1..7] OF INTEGER;
    81   1    1:D     3        
    82   1    1:D     3        THPREC = RECORD
    83   1    1:D     3            LEVEL   : INTEGER;
    84   1    1:D     3            HPFAC   : INTEGER;
    85   1    1:D     3            HPMINAD : INTEGER;
    86   1    1:D     3          END;
    87   1    1:D     3                 
    88   1    1:D     3                 
    89   1    1:D     3        TCHAR = RECORD
    90   1    1:D     3            NAME     : STRING[ 15];
    91   1    1:D     3            PASSWORD : STRING[ 15];
    92   1    1:D     3            INMAZE   : BOOLEAN;
    93   1    1:D     3            RACE     : TRACE;
    94   1    1:D     3            CLASS    : TCLASS;
    95   1    1:D     3            AGE      : INTEGER;
    96   1    1:D     3            STATUS   : TSTATUS;
    97   1    1:D     3            ALIGN    : TALIGN;
    98   1    1:D     3            ATTRIB   : PACKED ARRAY[ STRENGTH..LUCK] OF 0..18;
    99   1    1:D     3            LUCKSKIL : PACKED ARRAY[ 0..4] OF 0..31;
   100   1    1:D     3            GOLD     : TWIZLONG;
   101   1    1:D     3            POSS     : RECORD
   102   1    1:D     3                POSSCNT : INTEGER;
   103   1    1:D     3                POSSESS : ARRAY[ 1..8] OF RECORD
   104   1    1:D     3                    EQUIPED : BOOLEAN;
   105   1    1:D     3                    CURSED  : BOOLEAN;
   106   1    1:D     3                    IDENTIF : BOOLEAN;
   107   1    1:D     3                    EQINDEX : INTEGER;
   108   1    1:D     3                  END;
   109   1    1:D     3              END;
   110   1    1:D     3            EXP      : TWIZLONG;
   111   1    1:D     3            MAXLEVAC : INTEGER;
   112   1    1:D     3            CHARLEV  : INTEGER;
   113   1    1:D     3            HPLEFT   : INTEGER;
   114   1    1:D     3            HPMAX    : INTEGER;
   115   1    1:D     3            SPELLSKN : PACKED ARRAY[ 0..49] OF BOOLEAN;
   116   1    1:D     3            MAGESP   : TSPELL7G;
   117   1    1:D     3            PRIESTSP : TSPELL7G;
   118   1    1:D     3            HPCALCMD : INTEGER;
   119   1    1:D     3            ARMORCL  : INTEGER;
   120   1    1:D     3            HEALPTS  : INTEGER;
   121   1    1:D     3            CRITHITM : BOOLEAN;
   122   1    1:D     3            SWINGCNT : INTEGER;
   123   1    1:D     3            HPDAMRC  : THPREC;
   124   1    1:D     3            WEPVSTY2 : PACKED ARRAY[ 0..1, 0..13] OF BOOLEAN;
   125   1    1:D     3            WEPVSTY3 : PACKED ARRAY[ 0..1, 0..6] OF BOOLEAN;
   126   1    1:D     3            WEPVSTYP : PACKED ARRAY[ 0..13] OF BOOLEAN;
   127   1    1:D     3            LOSTXYL  : RECORD CASE INTEGER OF
   128   1    1:D     3                1:  (LOCATION : ARRAY[ 1..4] OF INTEGER);
   129   1    1:D     3                2:  (POISNAMT : ARRAY[ 1..4] OF INTEGER);
   130   1    1:D     3                3:  (AWARDS   : ARRAY[ 1..4] OF INTEGER);
   131   1    1:D     3              END;
   132   1    1:D     3          END;
   133   1    1:D     3                 
   134   1    1:D     3                 
   135   1    1:D     3   VAR 
   136   1    1:D     3        INCHAR  : CHAR;
   137   1    1:D     4        BASE04  : INTEGER;
   138   1    1:D     5        RANDNUM : INTEGER;
   139   1    1:D     6        SERIAL  : STRING[ 7];
   140   1    1:D    10    
   140   1    1:D    10 (*$I WIZ3U:WIZUTILB *)
   141   7    1:D     1 SEGMENT PROCEDURE UTILS;  (* P050101 *)
   142   7    1:D     1 
   143   7    1:D     1   TYPE
   144   7    1:D     1 
   145   7    1:D     1         TSPEL012 = (GENERIC, PERSON, GROUP);
   146   7    1:D     1         
   147   7    1:D     1         TZSCN = (ZZERO, ZMAZE, ZENEMY, ZREWARD, ZOBJECT,
   148   7    1:D     1                         ZCHAR, ZSPCCHRS, ZEXP);
   149   7    1:D     1                    
   150   7    1:D     1         TSCNTOC = RECORD
   151   7    1:D     1             GAMENAME : STRING[ 40];
   152   7    1:D     1             RECPER2B : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   153   7    1:D     1             RECPERDK : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   154   7    1:D     1             UNUSEDXX : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   155   7    1:D     1             BLOFF    : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   156   7    1:D     1             RACE     : ARRAY[ NORACE..HOBBIT]         OF STRING[ 9];
   157   7    1:D     1             CLASS    : PACKED ARRAY[ FIGHTER..NINJA]  OF STRING[ 9];
   158   7    1:D     1             STATUS   : ARRAY[ OK..LOST]               OF STRING[ 8];
   159   7    1:D     1             ALIGN    : PACKED ARRAY[ UNALIGN..EVIL]   OF STRING[ 9];
   160   7    1:D     1             SPELLHSH : PACKED ARRAY[ 0..50] OF INTEGER;
   161   7    1:D     1             SPELLGRP : PACKED ARRAY[ 0..50] OF 0..7;
   162   7    1:D     1             SPELL012 : PACKED ARRAY[ 0..50] OF TSPEL012;
   163   7    1:D     1           END;
   164   7    1:D     1 
   165   7    1:D     1   VAR
   166   7    1:D     1   
   167   7    1:D     1     IOCACHE  : PACKED ARRAY[ 0..1023] OF CHAR;
   168   7    1:D   513     UNUSEDXX : INTEGER;
   169   7    1:D   514     CACHEBL  : INTEGER;
   170   7    1:D   515     SCNTOCBL : INTEGER;
   171   7    1:D   516     CACHEWRI : BOOLEAN;
   172   7    1:D   517     SCNTOC   : TSCNTOC;
   173   7    1:D   769     
   174   7    1:D   769     
   175   7    2:D     3     FUNCTION GETREC( DATATYPE : TZSCN;              (* P050102 *)
   176   7    2:D     4                      DATAINDX : INTEGER;
   177   7    2:D     5                      DATASIZE : INTEGER) : INTEGER;
   178   7    2:D     6                       
   179   7    2:D     6       VAR
   180   7    2:D     6            BUFFADDR : INTEGER;
   181   7    2:D     7            DSKBLOCK : INTEGER;
   182   7    2:D     8            
   183   7    2:0     0       BEGIN
   184   7    2:1     0         DSKBLOCK := SCNTOC.BLOFF[ DATATYPE] +
   185   7    2:1     8                     2 * (DATAINDX DIV SCNTOC.RECPER2B[ DATATYPE]);
   186   7    2:1    23         BUFFADDR := DATASIZE * (DATAINDX MOD SCNTOC.RECPER2B[ DATATYPE]);
   187   7    2:1    37         IF CACHEBL <> DSKBLOCK THEN
   188   7    2:2    45           BEGIN
   189   7    2:3    45             IF CACHEWRI THEN
   190   7    2:4    51               UNITWRITE( DRIVE1, IOCACHE, SIZEOF( IOCACHE),
   191   7    2:4    59                          CACHEBL + SCNTOCBL, 0);
   192   7    2:3    71             CACHEWRI := FALSE;
   193   7    2:3    76             CACHEBL := DSKBLOCK;
   194   7    2:3    81             UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE),
   195   7    2:3    89                       CACHEBL + SCNTOCBL, 0)
   196   7    2:2   101           END;
   197   7    2:1   101         GETREC := BUFFADDR
   198   7    2:0   101       END;
   199   7    2:0   116         
   200   7    2:0   116         
   201   7    3:D     3   FUNCTION PUTREC( DATATYPE : TZSCN;             (* P050103 *)
   202   7    3:D     4                    DATAINDX : INTEGER;
   203   7    3:D     5                    DATASIZE : INTEGER) : INTEGER;
   204   7    3:D     6                    
   205   7    3:D     6     VAR
   206   7    3:D     6          BUFFADDR : INTEGER;
   207   7    3:D     7          DSKBLOCK : INTEGER;
   208   7    3:D     8                     
   209   7    3:0     0     BEGIN
   210   7    3:1     0         DSKBLOCK := SCNTOC.BLOFF[ DATATYPE] +
   211   7    3:1     8                     2 * (DATAINDX DIV SCNTOC.RECPER2B[ DATATYPE]);
   212   7    3:1    23         BUFFADDR := DATASIZE * (DATAINDX MOD SCNTOC.RECPER2B[ DATATYPE]);
   213   7    3:1    37         IF CACHEBL <> DSKBLOCK THEN
   214   7    3:2    45           BEGIN
   215   7    3:3    45             IF CACHEWRI THEN
   216   7    3:4    51               UNITWRITE( DRIVE1, IOCACHE, SIZEOF( IOCACHE),
   217   7    3:4    59                          CACHEBL + SCNTOCBL, 0);
   218   7    3:3    71             CACHEBL := DSKBLOCK;
   219   7    3:3    76             UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE),
   220   7    3:3    84                       CACHEBL + SCNTOCBL, 0)
   221   7    3:2    96           END;
   222   7    3:1    96         CACHEWRI := TRUE;
   223   7    3:1   101         PUTREC := BUFFADDR
   224   7    3:0   101     END;
   225   7    3:0   116   
   226   7    3:0   116   
   227   7    4:D     1   PROCEDURE GETKEY;  (* P050104 *)
   228   7    4:D     1   
   229   7    4:0     0     BEGIN
   230   7    4:1     0       READ( INCHAR);
   231   7    4:1     8       IF EOLN THEN
   232   7    4:2    18         INCHAR := CHR( 13);
   233   7    4:1    21       RANDNUM := (RANDNUM + ORD( INCHAR)) MOD 1027
   234   7    4:0    24     END;
   235   7    4:0    42     
   236   7    4:0    42     
   237   7    5:D     3   FUNCTION FINDFILE( DRIVE    : INTEGER;             (*  P050105 *)
   238   7    5:D     4                      FILENAME : STRING) : INTEGER;
   239   7    5:D    46                     
   240   7    5:D    46     VAR
   241   7    5:D    46          DIR      : ARRAY[ 0..12] OF DIRENTRY;
   242   7    5:D   215          FILEIFND : INTEGER;
   243   7    5:D   216          FILEI    : INTEGER;
   244   7    5:D   217          FILECNT  : INTEGER;
   245   7    5:D   218 
   246   7    5:0     0     BEGIN
   247   7    5:1     0       UNITREAD( DRIVE, IOCACHE, SIZEOF( IOCACHE), WIZDIRBL, 0);
   248   7    5:1    17       IF IORESULT <> 0 THEN
   249   7    5:2    23           FINDFILE := -ABS( IORESULT)
   250   7    5:1    26       ELSE
   251   7    5:2    31         BEGIN
   252   7    5:3    31           MOVELEFT( IOCACHE, DIR, SIZEOF( DIR)); 
   253   7    5:3    43           IF (DIR[ 0].FILECNT < 0) OR (DIR[ 0].FILECNT > 12) THEN
   254   7    5:4    64             BEGIN
   255   7    5:5    64               FINDFILE := -1;
   256   7    5:5    68               EXIT( FINDFILE)
   257   7    5:4    72             END;
   258   7    5:3    72           FILEIFND := 0;
   259   7    5:3    76           FILEI := 1;
   260   7    5:3    80           FILECNT := DIR[ 0].FILECNT;
   261   7    5:3    90           WHILE FILEI <= FILECNT DO
   262   7    5:4    99             BEGIN
   263   7    5:5    99               IF (DIR[ FILEI].FILEKIND.FT >= BADBLK) AND
   264   7    5:5   113                  (DIR[ FILEI].FILEKIND.FT <= FOTOFILE)    THEN
   265   7    5:6   130                 BEGIN
   266   7    5:7   130                   IF DIR[ FILEI].FILENAME = FILENAME THEN
   267   7    5:8   145                     FILEIFND := FILEI
   268   7    5:6   145                 END;
   269   7    5:5   151               FILEI := FILEI + 1;
   270   7    5:4   159             END;
   271   7    5:3   161           IF FILEIFND = 0 THEN
   272   7    5:4   168             FINDFILE := -9
   273   7    5:3   168           ELSE
   274   7    5:4   174             FINDFILE := DIR[ FILEIFND].FIRSTBLK
   275   7    5:2   181         END
   276   7    5:0   184       END;
   277   7    5:0   200     
   278   7    5:0   200     
   279   7    6:D     1   PROCEDURE GETCR;  (* P050106 *)
   280   7    6:D     1   
   281   7    6:0     0     BEGIN
   282   7    6:1     0       REPEAT
   283   7    6:2     0         GOTOXY( 41, 0);
   284   7    6:2     5         GETKEY
   285   7    6:1     5       UNTIL INCHAR = CHR( CR)
   286   7    6:0     9     END;
   287   7    6:0    26   
   288   7    6:0    26   
   289   7    7:D     1   PROCEDURE EXITUTIL;  (* P050107 *)
   290   7    7:D     1   
   291   7    7:D     1     VAR
   292   7    7:D     1         FILEINDX : INTEGER;
   293   7    7:D     2         
   294   7    7:0     0     BEGIN
   295   7    7:1     0       FILEINDX := FINDFILE( DRIVE1, 'SYSTEM.CHARSET');
   296   7    7:1    24       WHILE FILEINDX <= 0 DO
   297   7    7:2    29         BEGIN
   298   7    7:3    29           WRITE( CHR( HOMECLR));
   299   7    7:3    37           GOTOXY( 0, 10);
   300   7    7:3    42           WRITE( 'PLACE BOOT DISK IN DRIVE 1, PRESS RETURN');
   301   7    7:3    92           GETCR;
   302   7    7:3    94           FILEINDX := FINDFILE( DRIVE1, 'SYSTEM.CHARSET')
   303   7    7:2   112         END;
   304   7    7:1   120       EXIT( UTILS)
   305   7    7:0   124     END;
   306   7    7:0   138 
   307   7    7:0   138 
   308   7    8:D     1   PROCEDURE RDSCNTC2;  (* P050108 *)
   309   7    8:D     1   
   310   7    8:0     0     BEGIN
   311   7    8:1     0       CACHEWRI := FALSE;
   312   7    8:1     5       CACHEBL := 0;
   313   7    8:1    10       UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE), SCNTOCBL);
   314   7    8:1    25       MOVELEFT( IOCACHE, SCNTOC, SIZEOF( SCNTOC))
   315   7    8:0    39     END;
   316   7    8:0    52   
   317   7    8:0    52   
   318   7    9:D     1   PROCEDURE RDSCNTOC( MSG : STRING);  (* P050109 *)
   319   7    9:D    43   
   320   7    9:D    43     VAR
   321   7    9:D    43         UNUSEDXX : INTEGER;
   322   7    9:D    44   
   323   7    9:0     0     BEGIN
   324   7    9:1     0       REPEAT
   325   7    9:2     5         WRITE( CHR( HOMECLR));
   326   7    9:2    13         GOTOXY( 20 - LENGTH( MSG) DIV 2, 8);
   327   7    9:2    25         WRITE( MSG);
   328   7    9:2    34         GOTOXY( 0, 10);
   329   7    9:2    39         WRITE( 'PLACE SCENARIO IN DRIVE 1, PRESS RETURN');
   330   7    9:2    88         UNITCLEAR( 1);
   331   7    9:2    91         GETCR;
   332   7    9:2    93         SCNTOCBL := FINDFILE( DRIVE1, 'SCENARIO.DATA')
   333   7    9:1   110       UNTIL (SCNTOCBL >= 0);
   334   7    9:1   126       RDSCNTC2
   335   7    9:0   126     END;
   336   7    9:0   142   
   337   7    9:0   142   
   338   7   10:D     1   PROCEDURE GETPASS( VAR PASSWD : STRING );  (* P05010A *)
   339   7   10:D     2   
   340   7   10:D     2     VAR
   341   7   10:D     2          UNUSEDXX : INTEGER;
   342   7   10:D     3          I        : INTEGER;
   343   7   10:D     4          PASSI    : INTEGER;
   344   7   10:D     5          
   345   7   10:0     0     BEGIN
   346   7   10:1     0       PASSI := 0;
   347   7   10:1     3       REPEAT
   348   7   10:2     3         GETKEY;
   349   7   10:2     5         IF INCHAR <> CHR( CR) THEN
   350   7   10:3    10           BEGIN
   351   7   10:4    10             WRITE( CHR( BS));
   352   7   10:4    18             FOR I := 0 TO RANDNUM MOD 2 DO
   353   7   10:5    31               WRITE( 'X')
   354   7   10:3    39           END;
   355   7   10:2    46         PASSI := PASSI + 1;
   356   7   10:2    51         PASSWD[ PASSI] := INCHAR
   357   7   10:1    53       UNTIL (INCHAR = CHR( CR)) OR (PASSI = 15);
   358   7   10:1    64       WRITELN;
   359   7   10:1    70       PASSWD[ 0] := CHR( PASSI - 1)
   360   7   10:0    75     END;
   361   7   10:0    92   
   362   7   10:0    92   
   363   7   11:D     1   PROCEDURE RDCHARAC( VAR CHARREC : TCHAR; CHARINDX : INTEGER);  (* P05010B *)
   364   7   11:D     3   
   365   7   11:0     0     BEGIN
   366   7   11:1     0       MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARINDX, SIZEOF( CHARREC))],
   367   7   11:1    12                 CHARREC,
   368   7   11:1    14                 SIZEOF( CHARREC)) 
   369   7   11:0    19     END;
   370   7   11:0    32   
   371   7   11:0    32   
   372   7   12:D     1   PROCEDURE WRCHARAC( VAR CHARREC : TCHAR; CHARINDX : INTEGER);  (* P05010C *)
   373   7   12:D     3   
   374   7   12:0     0     BEGIN
   375   7   12:1     0       MOVELEFT( CHARREC,
   376   7   12:1     2                 IOCACHE[ PUTREC(  ZCHAR, CHARINDX, SIZEOF( CHARREC))], 
   377   7   12:1    14                 SIZEOF( CHARREC)) 
   378   7   12:0    19     END;
   379   7   12:0    32     
   380   7   12:0    32     
   381   7   13:D     1   PROCEDURE WRICACHE;  (* P05010D *)
   382   7   13:D     1   
   383   7   13:0     0     BEGIN
   384   7   13:1     0       UNITWRITE( DRIVE1, IOCACHE, SIZEOF( IOCACHE), (CACHEBL + SCNTOCBL), 0);
   385   7   13:1    20       CACHEWRI := FALSE
   386   7   13:0    20     END;
   387   7   13:0    38     
   388   7   13:0    38     
   389   7   14:D     1   PROCEDURE PRESSRET;  (* P05010E *)
   390   7   14:D     1   
   391   7   14:0     0     BEGIN
   392   7   14:1     0       WRITELN;
   393   7   14:1     6       WRITE( 'PRESS [RET]' : 25);
   394   7   14:1    27       GETCR
   395   7   14:0    27     END;
   396   7   14:0    42     
   397   7   14:0    42     
   398   7   15:D     1   PROCEDURE TITLESCR( TITLESTR : STRING);    (* P05010F *)
   399   7   15:D    43   
   400   7   15:D    43     VAR
   401   7   15:D    43         I : INTEGER;
   402   7   15:D    44         
   403   7   15:0     0     BEGIN
   404   7   15:1     0       WRITE( CHR( HOMECLR));
   405   7   15:1    13       WRITELN( TITLESTR : (20 + LENGTH( TITLESTR) DIV 2));
   406   7   15:1    35       FOR I := 1 TO 40 DO 
   407   7   15:2    48         WRITE( '-');
   408   7   15:1    64       WRITELN;
   409   7   15:1    70       WRITELN
   410   7   15:0    70     END;
   411   7   15:0    90     
   412   7   15:0    90     
   413   7   16:D     3   FUNCTION  RTNESC( TITLESTR : STRING;             (* P050110 *)
   414   7   16:D     4                     TITLE2ST : STRING) : BOOLEAN;
   415   7   16:D    87   
   416   7   16:0     0     BEGIN
   417   7   16:1     0       TITLESCR( TITLESTR);
   418   7   16:1    14       WRITELN( TITLE2ST : (20 + LENGTH( TITLE2ST) DIV 2));
   419   7   16:1    36       WRITELN;
   420   7   16:1    42       WRITE( ' PRESS [RET] TO BEGIN OR [ESC] TO EXIT');
   421   7   16:1    90       REPEAT
   422   7   16:2    90         GOTOXY( 41, 0);
   423   7   16:2    95         GETKEY;
   424   7   16:2    97         IF INCHAR = CHR( CR) THEN
   425   7   16:3   102           BEGIN
   426   7   16:4   102             RTNESC := FALSE;
   427   7   16:4   105             EXIT( RTNESC)
   428   7   16:3   109           END
   429   7   16:2   109         ELSE
   430   7   16:3   111           BEGIN
   431   7   16:4   111             IF INCHAR = CHR( ESC) THEN
   432   7   16:5   116               BEGIN
   433   7   16:6   116                 RTNESC := TRUE;
   434   7   16:6   119                 EXIT( RTNESC)
   435   7   16:5   123               END
   436   7   16:3   123           END
   437   7   16:1   123       UNTIL FALSE
   438   7   16:0   123     END;
   439   7   16:0   140     
   440   7   16:0   140     
   441   7   17:D     1   PROCEDURE CHGNAMES;  (* P050111 *)
   442   7   17:D     1   
   443   7   17:D     1     VAR
   444   7   17:D     1         PASSWD   : STRING[ 40];
   445   7   17:D    22         TONAME   : STRING[ 40];
   446   7   17:D    43         FROMNAME : STRING[ 40];
   447   7   17:D    64         X        : INTEGER;
   448   7   17:D    65         CHARINDX : INTEGER;
   449   7   17:D    66         BADSTUFF : BOOLEAN;
   450   7   17:D    67         PLAYREC  : TCHAR;
   451   7   17:D   171         
   452   7   17:D   171         
   453   7   18:D     1     PROCEDURE GETNAME( VAR CHARNAME : STRING;  (* P050112 *)
   454   7   18:D     2                            VERT4SOL : INTEGER;
   455   7   18:D     3                            PROMPT   : STRING);
   456   7   18:D    45                            
   457   7   18:0     0       BEGIN
   458   7   18:1     0         REPEAT
   459   7   18:2     5           REPEAT
   460   7   18:3     5             REPEAT
   461   7   18:4     5               GOTOXY( 0, VERT4SOL);
   462   7   18:4    10               WRITE( CHR( VT));
   463   7   18:4    18               WRITE( PROMPT);
   464   7   18:4    27               READLN( CHARNAME);
   465   7   18:3    41             UNTIL LENGTH( CHARNAME) <= 15;
   466   7   18:3    48             IF CHARNAME = '' THEN
   467   7   18:4    56               EXIT( CHGNAMES);
   468   7   18:2    60           UNTIL LENGTH( CHARNAME) > 0;
   469   7   18:2    67           
   470   7   18:2    67           BADSTUFF := FALSE;
   471   7   18:2    71           FOR X := 1 TO LENGTH( CHARNAME) DO
   472   7   18:3    88             BADSTUFF := BADSTUFF OR 
   473   7   18:3    91                         (CHARNAME[ X] < ' ') OR (CHARNAME[ X] > '_')
   474   7   18:1   106         UNTIL NOT BADSTUFF
   475   7   18:0   120       END;
   476   7   18:0   146     
   477   7   18:0   146   
   478   7   17:0     0     BEGIN (* CHGNAMES *)
   479   7   17:1     0       IF RTNESC( 'NAME CHANGE', '') THEN
   480   7   17:2    23         EXIT( CHGNAMES);
   481   7   17:1    27       RDSCNTOC( 'NAME CHANGE');
   482   7   17:1    43       
   483   7   17:1    43       REPEAT
   484   7   17:2    43         TITLESCR( 'NAME CHANGE');
   485   7   17:2    59         WRITELN( 'ENTER THE CURRENT NAME OF  THE CHAR');
   486   7   17:2   110         WRITELN( '& THEN THE NEW NAME. OR PRESS [RET]');
   487   7   17:2   161         WRITELN( 'TO EXIT.');
   488   7   17:2   185         GETNAME( FROMNAME, 10, 'FROM NAME >');
   489   7   17:2   204         GETNAME( TONAME, 12, ' TO  NAME >');
   490   7   17:2   223         WRITELN;
   491   7   17:2   229         WRITELN;
   492   7   17:2   235         IF TONAME <> '' THEN
   493   7   17:3   244           BEGIN
   494   7   17:4   244             BADSTUFF := FALSE;
   495   7   17:4   247             FOR CHARINDX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
   496   7   17:5   271               BEGIN
   497   7   17:6   271                 RDCHARAC( PLAYREC, CHARINDX);
   498   7   17:6   277                 IF (PLAYREC.NAME = TONAME) AND (PLAYREC.STATUS <> LOST) THEN
   499   7   17:7   290                   BEGIN
   500   7   17:8   290                     WRITELN( 'NAME ALREADY IN USE');
   501   7   17:8   325                     BADSTUFF := TRUE
   502   7   17:7   325                   END
   503   7   17:5   328               END;
   504   7   17:5   336               
   505   7   17:4   336             IF NOT BADSTUFF THEN
   506   7   17:5   341               BEGIN
   507   7   17:6   341                 X := -1;
   508   7   17:6   345                 FOR CHARINDX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
   509   7   17:7   369                   BEGIN
   510   7   17:8   369                     RDCHARAC( PLAYREC, CHARINDX);
   511   7   17:8   375                     IF PLAYREC.NAME = FROMNAME THEN
   512   7   17:9   383                       X := CHARINDX
   513   7   17:7   383                   END;
   514   7   17:7   395                   
   515   7   17:6   395                 IF X = -1 THEN
   516   7   17:7   402                   WRITELN( 'CANT FIND CHAR')
   517   7   17:6   432                 ELSE
   518   7   17:7   434                   BEGIN
   519   7   17:8   434                     RDCHARAC( PLAYREC, X);
   520   7   17:8   440                     WRITE( 'PASSWORD >');
   521   7   17:8   460                     GETPASS( PASSWD);
   522   7   17:8   464                     WRITELN;
   523   7   17:8   470                     IF PASSWD <> PLAYREC.PASSWORD THEN
   524   7   17:9   478                       WRITELN( 'PASSWORDS DO NOT MATCH')
   525   7   17:8   516                     ELSE
   526   7   17:9   518                       BEGIN
   527   7   17:0   518                         PLAYREC.NAME := TONAME;
   528   7   17:0   524                         WRCHARAC( PLAYREC, X);
   529   7   17:0   530                         WRICACHE;
   530   7   17:0   532                         WRITELN( 'NAME CHANGED!');
   531   7   17:9   561                       END
   532   7   17:7   561                   END
   533   7   17:5   561               END;
   534   7   17:4   561             PRESSRET;
   535   7   17:3   563           END;
   536   7   17:1   563       UNTIL FALSE;
   537   7   17:0   566     END;  (* CHGNAMES *)
   538   7   17:0   588     
   539   7   17:0   588 (*$I WIZ3U:WIZUTILB *)
   539   7   17:0   588 (*$I WIZ3U:WIZUTILC *)
   540   7   19:D     1   PROCEDURE BACKUP;  (* P050113 *)
   541   7   19:D     1                
   542   7   19:D     1     VAR
   543   7   19:D     1          PLAY20BF : ARRAY[ 0..19] OF TCHAR;
   544   7   19:D  2081          SERIALBU : STRING[ 7];
   545   7   19:D  2085          SERIALXX : STRING[ 7];
   546   7   19:D  2089          UNUSEDXX : INTEGER;
   547   7   19:D  2090          CHARINDX : INTEGER;
   548   7   19:D  2091   
   549   7   19:D  2091   
   550   7   20:D     1     PROCEDURE FRBACKUP;  (* P050114 *)
   551   7   20:D     1     
   552   7   20:0     0       BEGIN
   553   7   20:1     0         WRITE( CHR( HOMECLR));
   554   7   20:1     8         WRITELN( 'PLACE BACKUP DISKETTE IN DRIVE 1,');
   555   7   20:1    57         PRESSRET;
   556   7   20:1    59         WRITE( CHR( HOMECLR));
   557   7   20:1    67         FOR CHARINDX := 0 TO 19 DO
   558   7   20:2    83           BEGIN
   559   7   20:3    83             GOTOXY( 20 * (CHARINDX MOD 2), CHARINDX DIV 2);
   560   7   20:3   100             UNITREAD( DRIVE1, PLAY20BF[ CHARINDX], SIZEOF( TCHAR),
   561   7   20:3   114                       CHARINDX, 0);
   562   7   20:3   121             IF PLAY20BF[ CHARINDX].STATUS <> LOST THEN
   563   7   20:4   136               WRITE( PLAY20BF[ CHARINDX].NAME)
   564   7   20:2   152           END;
   565   7   20:2   164           
   566   7   20:1   164         UNITREAD( DRIVE1, SERIALBU, 7, 20, 0);
   567   7   20:1   175         GOTOXY( 0, 20);
   568   7   20:1   180         WRITE( CHR( VT));
   569   7   20:1   188         WRITE( 'RECOVER THESE (Y/N) ? >');
   570   7   20:1   221         REPEAT
   571   7   20:2   221           GOTOXY (41, 0);
   572   7   20:2   226           GETKEY;
   573   7   20:2   228           IF INCHAR = 'N' THEN
   574   7   20:3   233             EXIT( BACKUP)
   575   7   20:1   237         UNTIL INCHAR = 'Y';
   576   7   20:1   242         
   577   7   20:1   242         RDSCNTOC( 'SCENARIO TO RECOVER TO');
   578   7   20:1   269         UNITREAD( DRIVE1, SERIALXX, 7, SERIALBL, 0);
   579   7   20:1   280         IF SERIALXX <> SERIALBU THEN
   580   7   20:2   292           BEGIN
   581   7   20:3   292             TITLESCR( 'CANT RECOVER ONTO DIFFERENT SCENARIO');
   582   7   20:3   333             WRITELN( 'SCENARIO MUST BE MADE OFF SAME MASTER');
   583   7   20:3   386             WRITELN( 'AS THE SCENARIO THE BACKUP WAS MADE');
   584   7   20:3   437             WRITELN( 'FROM.');
   585   7   20:3   458             PRESSRET;
   586   7   20:3   460             EXIT( BACKUP)
   587   7   20:2   464           END;
   588   7   20:2   464           
   589   7   20:1   464         TITLESCR( 'SAVING CHARS');
   590   7   20:1   481         FOR CHARINDX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
   591   7   20:2   506           WRCHARAC( PLAY20BF[ CHARINDX], CHARINDX);
   592   7   20:1   533         WRICACHE;
   593   7   20:1   535         TITLESCR( 'BACKUP RECOVERED');
   594   7   20:1   556         PRESSRET
   595   7   20:0   556       END;
   596   7   20:0   578       
   597   7   20:0   578       
   598   7   21:D     1     PROCEDURE TOBACKUP;  (* P050115 *)
   599   7   21:D     1     
   600   7   21:0     0       BEGIN
   601   7   21:1     0         RDSCNTOC( 'MAKING BACKUP');
   602   7   21:1    18         UNITREAD( DRIVE1, SERIALXX, 7, SERIALBL, 0);
   603   7   21:1    29         TITLESCR( 'LOADING CHARS');
   604   7   21:1    47         FOR CHARINDX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
   605   7   21:2    72           RDCHARAC( PLAY20BF[ CHARINDX], CHARINDX);
   606   7   21:1    99         WRITELN( 'LOADED! NOW PLACE A FORMATTED DISKETTE');
   607   7   21:1   153         WRITELN( 'IN DRIVE 1 AND PRESS [RET] TO SAVE.');
   608   7   21:1   204         WRITELN;
   609   7   21:1   210         GOTOXY( 41, 0);
   610   7   21:1   215         GETCR;
   611   7   21:1   217         
   612   7   21:1   217         IF FINDFILE( DRIVE1, 'WIZARDRY.CODE') >= 0 THEN
   613   7   21:2   242           BEGIN
   614   7   21:3   242             TITLESCR( 'CANT BACKUP ONTO A WIZARDRY DISK!');
   615   7   21:3   280             PRESSRET;
   616   7   21:3   282             EXIT( TOBACKUP)
   617   7   21:2   286           END;
   618   7   21:2   286           
   619   7   21:1   286         FOR CHARINDX := 0 TO SCNTOC.RECPERDK[ ZCHAR] -1 DO
   620   7   21:2   311           UNITWRITE( DRIVE1, PLAY20BF[ CHARINDX], SIZEOF( TCHAR),
   621   7   21:2   325                      CHARINDX, 0);
   622   7   21:1   344         UNITWRITE( DRIVE1, SERIALXX,  7, 20, 0);
   623   7   21:1   355         TITLESCR( 'BACKUP MADE');
   624   7   21:1   371         PRESSRET
   625   7   21:0   371       END;
   626   7   21:0   390 
   627   7   21:0   390 
   628   7   19:0     0     BEGIN  (* BACKUP *)
   629   7   19:1     0       IF RTNESC( 'CHAR BACKUP', '(INCOMPATIBLE WITH PREVIOUS VERSION)') THEN
   630   7   19:2    59         EXIT( BACKUP);
   631   7   19:1    63       TITLESCR( 'CHAR BACKUP');
   632   7   19:1    79       WRITELN;
   633   7   19:1    85       WRITE( 'T)O OR F)ROM BACKUP' : 30);
   634   7   19:1   114       GOTOXY( 41, 0);
   635   7   19:1   119       GETKEY;
   636   7   19:1   121       IF INCHAR = 'T' THEN
   637   7   19:2   126         TOBACKUP
   638   7   19:1   126       ELSE IF INCHAR = 'F' THEN
   639   7   19:3   135         FRBACKUP
   640   7   19:0   135     END;
   641   7   19:0   150     
   642   7   19:0   150     
   643   7   22:D     1   PROCEDURE RECOVER;  (* P050116 *)
   644   7   22:D     1   
   645   7   22:D     1     VAR
   646   7   22:D     1          CHARREC  : TCHAR;
   647   7   22:D   105          CHARINDX : INTEGER;
   648   7   22:D   106          UNUSEDXX : ARRAY[ 0..1] OF INTEGER;
   649   7   22:D   108   
   650   7   22:0     0     BEGIN;
   651   7   22:1     0       IF RTNESC( 'CHAR RECOVERY', 'NO 10 YEAR PENALTY') THEN
   652   7   22:2    43         EXIT( RECOVER);
   653   7   22:1    47       RDSCNTOC( 'INSERT SCENARIO WITH "OUT" CHARS');
   654   7   22:1    84       WRITE( CHR( HOMECLR));
   655   7   22:1    92       WRITELN( 'RECOVERING');
   656   7   22:1   118       WRITELN;
   657   7   22:1   124       
   658   7   22:1   124       FOR CHARINDX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
   659   7   22:2   146         BEGIN
   660   7   22:3   146           RDCHARAC( CHARREC, CHARINDX);
   661   7   22:3   152           IF CHARREC.INMAZE THEN
   662   7   22:4   156             BEGIN
   663   7   22:5   156               CHARREC.INMAZE := FALSE;
   664   7   22:5   159               WRCHARAC( CHARREC, CHARINDX);
   665   7   22:5   165               WRITE( CHARREC.NAME);
   666   7   22:5   174               WRITELN( ' SAVED');
   667   7   22:4   196             END
   668   7   22:2   196         END;
   669   7   22:1   204       WRICACHE;
   670   7   22:1   206       PRESSRET
   671   7   22:0   206     END;
   672   7   22:0   222     
   673   7   22:0   222     
   674   7   23:D     1   PROCEDURE TRANSFER;  (* P050117 *)
   675   7   23:D     1   
   676   7   23:D     1     VAR
   677   7   23:D     1          PLAYREC1 : TCHAR;
   678   7   23:D   105          PLAYREC2 : TCHAR;
   679   7   23:D   209          PLAYFRMI : INTEGER;
   680   7   23:D   210          PLAYINDX : INTEGER;
   681   7   23:D   211          MPD3     : CHAR;
   682   7   23:D   212          FRMRNDID : CHAR;
   683   7   23:D   213          FRMGAMNM : STRING;
   684   7   23:D   254          BL5BUFF  : PACKED ARRAY[ 0..511] OF CHAR;
   685   7   23:D   510          SERIALTO : STRING[ 7];
   686   7   23:D   514          SERIALFR : STRING[ 7];
   687   7   23:D   518          TODSKERR : BOOLEAN;
   688   7   23:D   519          
   689   7   23:D   519          
   690   7   24:D     1     PROCEDURE REMOVCHR;  (* P050118 *)
   691   7   24:D     1     
   692   7   24:D     1       VAR
   693   7   24:D     1            PASSFROM : STRING;
   694   7   24:D    42            UNUSEDXX : INTEGER;
   695   7   24:D    43            PLAYERI  : INTEGER;
   696   7   24:D    44     
   697   7   24:0     0       BEGIN
   698   7   24:1     0         REPEAT
   699   7   24:2     0           WRITE( CHR( HOMECLR));
   700   7   24:2     8           WRITE( SCNTOC.GAMENAME :
   701   7   24:2    15                                 (20 + (LENGTH( SCNTOC.GAMENAME) DIV 2)));
   702   7   24:2    28           FOR PLAYERI := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
   703   7   24:3    50             BEGIN
   704   7   24:4    50               GOTOXY( 20 * (PLAYERI MOD 2), 2 + (PLAYERI DIV 2));
   705   7   24:4    65               RDCHARAC( PLAYREC2, PLAYERI);
   706   7   24:4    72               IF PLAYREC2.STATUS = OK THEN
   707   7   24:5    79                 BEGIN
   708   7   24:6    79                   WRITE( CHR( ORD('A') + PLAYERI));
   709   7   24:6    90                   WRITE( ' - ');
   710   7   24:6   103                   WRITE( PLAYREC2.NAME);
   711   7   24:5   113                 END
   712   7   24:3   113             END;
   713   7   24:3   121           
   714   7   24:2   121           REPEAT
   715   7   24:3   121             REPEAT
   716   7   24:4   121               GOTOXY( 0, 18);
   717   7   24:4   126               WRITELN( 'NOTE - CHARS MUST BE LIVE & IN CASTLE');
   718   7   24:4   179               WRITELN;
   719   7   24:4   185               WRITELN( 'ENTER LETTER OF CHAR TO MOVE, OR');
   720   7   24:4   233               WRITE(   'OR PRESS [RET] TO EXIT');
   721   7   24:4   265               GOTOXY( 41, 0);
   722   7   24:4   270               GETKEY;
   723   7   24:4   272               IF INCHAR = CHR( CR) THEN
   724   7   24:5   277                 EXIT( TRANSFER);
   725   7   24:4   281               PLAYINDX := ORD( INCHAR) - ORD('A');
   726   7   24:3   288             UNTIL (PLAYINDX >= 0) AND (PLAYINDX < SCNTOC.RECPERDK[ ZCHAR]);
   727   7   24:3   310             RDCHARAC( PLAYREC2, PLAYINDX)
   728   7   24:2   317           UNTIL PLAYREC2.STATUS = OK;
   729   7   24:2   326           
   730   7   24:2   326           WRITE( CHR( HOMECLR));
   731   7   24:2   334           WRITE( 'MOVING ');
   732   7   24:2   351           WRITELN( PLAYREC2.NAME);
   733   7   24:2   367           WRITELN;
   734   7   24:2   373           WRITE( 'PASSWORD >');
   735   7   24:2   393           GETPASS( PASSFROM)
   736   7   24:1   395         UNTIL PASSFROM = PLAYREC2.PASSWORD;
   737   7   24:1   406         
   738   7   24:1   406         PLAYREC1 := PLAYREC2;
   739   7   24:1   414         PLAYREC1.STATUS := LOST;
   740   7   24:1   418         WRCHARAC( PLAYREC1, PLAYINDX);
   741   7   24:1   427         WRICACHE
   742   7   24:0   427       END;  (* REMOVCHR *)
   743   7   24:0   450       
   744   7   24:0   450       
   745   7   25:D     1     PROCEDURE TRANBAD;  (* P050119 *)
   746   7   25:D     1     
   747   7   25:0     0       BEGIN
   748   7   25:1     0         REPEAT
   749   7   25:2     0           REPEAT
   750   7   25:3     0             IF PLAYINDX = -1 THEN
   751   7   25:4     9               RDSCNTOC( 'DUPLICATE NAME - PUT IN SOURCE')
   752   7   25:3    42             ELSE IF PLAYINDX = SCNTOC.RECPERDK[ ZCHAR] THEN
   753   7   25:5    61               RDSCNTOC( 'ALL SLOTS USED - PUT IN SOURCE')
   754   7   25:4    94             ELSE IF TODSKERR THEN
   755   7   25:6   104               RDSCNTOC( 'WRITE PROTECTED - PUT IN SOURCE')
   756   7   25:5   138             ELSE
   757   7   25:6   142               RDSCNTOC( 'NOT A LOL DISK - PUT IN SOURCE');
   758   7   25:3   177             UNITREAD( DRIVE1, BL5BUFF, SIZEOF( BL5BUFF), SERIALBL, 0)
   759   7   25:2   190           UNTIL (SCNTOC.GAMENAME = FRMGAMNM) AND (FRMRNDID = BL5BUFF[ 12]);
   760   7   25:2   214           
   761   7   25:2   214           RDCHARAC( PLAYREC1, PLAYFRMI)
   762   7   25:2   221         
   763   7   25:1   221         UNTIL PLAYREC1.NAME = PLAYREC2.NAME;
   764   7   25:1   233         WRCHARAC( PLAYREC2, PLAYFRMI);
   765   7   25:1   242         WRICACHE;
   766   7   25:1   244         TITLESCR( 'CHAR HAS BEEN PUT BACK.');
   767   7   25:1   272         PRESSRET
   768   7   25:0   272       END;
   769   7   25:0   292       
   770   7   25:0   292       
   771   7   26:D     1     PROCEDURE TRANGOOD;  (* P05011A *)
   772   7   26:D     1     
   773   7   26:0     0       BEGIN
   774   7   26:1     0         IF PLAYREC2.POSS.POSSCNT > 0 THEN
   775   7   26:2     8           IF PLAYREC2.POSS.POSSESS[ 1].EQINDEX < 1000 THEN
   776   7   26:3    24             PLAYREC2.POSS.POSSCNT := 0;
   777   7   26:1    29         WRCHARAC( PLAYREC2, PLAYINDX);
   778   7   26:1    38         WRICACHE;
   779   7   26:1    40         TITLESCR( 'CHAR HAS BEEN MOVED');
   780   7   26:1    64         PRESSRET
   781   7   26:0    64       END;
   782   7   26:0    78          
   783   7   26:0    78          
   784   7   23:0     0     BEGIN  (* TRANSFER *)
   785   7   23:1     0       IF RTNESC( 'MOVE CHARS FROM A SCENARIO',
   786   7   23:1    29                  'TO LEGACY OF LLYLGAMYN ONLY!') THEN
   787   7   23:2    66         EXIT( TRANSFER);
   788   7   23:1    70       RDSCNTOC( 'INSERT SCENARIO WITH CHAR(S) TO BE MOVED');
   789   7   23:1   115       UNITREAD( DRIVE1, BL5BUFF, SIZEOF( BL5BUFF), SERIALBL, 0);
   790   7   23:1   127       MPD3 := BL5BUFF[ 10];
   791   7   23:1   135       MOVELEFT( BL5BUFF, SERIALFR, 7);
   792   7   23:1   146       BL5BUFF[ 12] := CHR( (ORD( BL5BUFF[ 12]) + RANDNUM) MOD 256);
   793   7   23:1   162       UNITWRITE( DRIVE1, BL5BUFF, SIZEOF( BL5BUFF), SERIALBL, 0);
   794   7   23:1   174       FRMRNDID := BL5BUFF[ 12];
   795   7   23:1   182       REMOVCHR;
   796   7   23:1   184       PLAYFRMI := PLAYINDX;
   797   7   23:1   190       FRMGAMNM := SCNTOC.GAMENAME;
   798   7   23:1   199       RDSCNTOC( 'INSERT SCENARIO TO MOVE CHAR(S) TO');
   799   7   23:1   238       UNITREAD( DRIVE1, BL5BUFF, SIZEOF( BL5BUFF), SERIALBL, 0);
   800   7   23:1   250       MOVELEFT( BL5BUFF, SERIALTO, 7);
   801   7   23:1   261       PLAYINDX := SCNTOC.RECPERDK[ ZCHAR];
   802   7   23:1   272       UNITWRITE( DRIVE1, BL5BUFF, SIZEOF( BL5BUFF), SERIALBL, 0);
   803   7   23:1   284       TODSKERR := IORESULT <> 0;
   804   7   23:1   291       IF  NOT TODSKERR AND (SERIALFR <> SERIALTO) THEN
   805   7   23:2   306         BEGIN
   806   7   23:3   306           FOR BASE04 := 0 TO (SCNTOC.RECPERDK[ ZCHAR] - 1) DO
   807   7   23:4   329             BEGIN
   808   7   23:5   329               RDCHARAC( PLAYREC1, BASE04);
   809   7   23:5   334               IF (PLAYREC1.NAME = PLAYREC2.NAME) AND
   810   7   23:5   340                  (PLAYREC1.STATUS <> LOST) THEN
   811   7   23:6   347                 PLAYINDX := -1
   812   7   23:5   347               ELSE
   813   7   23:6   354                 IF PLAYINDX = SCNTOC.RECPERDK[ ZCHAR] THEN
   814   7   23:7   368                   IF PLAYREC1.STATUS = LOST THEN
   815   7   23:8   374                     PLAYINDX := BASE04
   816   7   23:4   374             END;
   817   7   23:2   385         END;
   818   7   23:1   385       IF (PLAYINDX = - 1) OR
   819   7   23:1   391          (PLAYINDX = SCNTOC.RECPERDK[ ZCHAR]) OR
   820   7   23:1   404          (COPY( SCNTOC.GAMENAME, 1, 10) <> 'THE LEGACY') THEN
   821   7   23:2   437         TRANBAD
   822   7   23:1   437       ELSE
   823   7   23:2   441         TRANGOOD
   824   7   23:2   441         
   825   7   23:0   441     END;  (* TRANSFER *)
   826   7   23:0   458     
   827   7   23:0   458 
   828   7    1:0     0   BEGIN (* UTILS *)
   829   7    1:1     0     REPEAT
   830   7    1:2     0       TITLESCR( 'WIZARDRY UTILITIES');
   831   7    1:2    23       WRITELN;
   832   7    1:2    29       WRITELN(  'CHOOSE AN OPTION' : 28);
   833   7    1:2    61       WRITELN;
   834   7    1:2    67       WRITELN(  'R)ECOVER  T)RANSFER B)ACKUP' : 34);
   835   7    1:2   110       WRITELN;
   836   7    1:2   116       WRITELN(  'M)AKE SCENARIO DISK' : 26);
   837   7    1:2   151       WRITELN;
   838   7    1:2   157       WRITELN(  'C)HANGE NAMES       L)EAVE ' : 34);
   839   7    1:2   200       
   840   7    1:2   200       REPEAT
   841   7    1:3   200         GOTOXY( 41, 0);
   842   7    1:3   205         GETKEY
   843   7    1:2   205       UNTIL (INCHAR = 'R') OR (INCHAR = 'T') OR
   844   7    1:2   214             (INCHAR = 'L') OR (INCHAR = 'C') OR
   845   7    1:2   222             (INCHAR = 'B') OR (INCHAR = 'M');
   846   7    1:2   232       
   847   7    1:2   232       CASE INCHAR OF
   848   7    1:2   235       
   849   7    1:2   235         'L':  BEGIN
   850   7    1:4   235                 BASE04 := 0;
   851   7    1:4   238                 EXITUTIL
   852   7    1:3   238               END;
   853   7    1:3   242               
   854   7    1:2   242         'T':  TRANSFER;
   855   7    1:2   246         'R':  RECOVER;
   856   7    1:2   250         'C':  CHGNAMES;
   857   7    1:2   254         'B':  BACKUP;
   858   7    1:2   258         
   859   7    1:2   258         'M':  BEGIN
   860   7    1:4   258                 BASE04 := 1;
   861   7    1:4   261                 EXITUTIL
   862   7    1:3   261               END;
   863   7    1:2   265       END
   864   7    1:1   310     UNTIL FALSE
   865   7    1:0   310   END; (* UTILS *)
   866   7    1:0   330   
   867   7    1:0   330 (*$I WIZ3U:WIZUTILC *)
   867   7    1:0   330 (*$I WIZ3U:MAKESCEN *)
   868   8    1:D     1 SEGMENT PROCEDURE MAKESCEN;  (* P050201 *)
   869   8    1:D     1 
   870   8    1:D     1   VAR
   871   8    1:D     1        UNUSEDXX : INTEGER;
   872   8    1:D     2        DRIVECNT : INTEGER;
   873   8    1:D     3        UNUSEDYY : ARRAY[ 0..103] OF INTEGER;
   874   8    1:D   107        IOBUFF   : PACKED ARRAY[ TBLOCKRG] OF CHAR;
   875   8    1:D   363        
   876   8    1:D   363     
   877   8    2:D     3   FUNCTION FINDFILE( DRIVE    : INTEGER;            (* P050202 *)
   878   8    2:D     4                      FILENAME : STRING) : INTEGER;
   879   8    2:D    46   
   880   8    2:D    46     VAR
   881   8    2:D    46          DIR      : ARRAY[ 0..12] OF DIRENTRY;
   882   8    2:D   215          FILEIFND : INTEGER;
   883   8    2:D   216          FILEI    : INTEGER;
   884   8    2:D   217          
   885   8    2:0     0     BEGIN
   886   8    2:1     0       UNITREAD( DRIVE, DIR, SIZEOF( DIR), WIZDIRBL, 0);
   887   8    2:1    16       IF IORESULT <> 0 THEN
   888   8    2:2    22         FINDFILE := - ABS( IORESULT)
   889   8    2:1    25       ELSE
   890   8    2:2    30         BEGIN
   891   8    2:3    30           IF (DIR[ 0].FILECNT < 0) OR (DIR[ 0].FILECNT > 12) THEN
   892   8    2:4    51             BEGIN
   893   8    2:5    51               FINDFILE := - 1;
   894   8    2:5    55               EXIT( FINDFILE)
   895   8    2:4    59             END;
   896   8    2:3    59           FILEIFND := 0;
   897   8    2:3    63           FOR FILEI := 1 TO DIR[ 0].FILECNT DO
   898   8    2:4    86             IF (DIR[ FILEI].FILEKIND.FT >= BADBLK) AND
   899   8    2:4   100                (DIR[ FILEI].FILEKIND.FT <= FOTOFILE) THEN
   900   8    2:5   117               IF DIR[ FILEI].FILENAME = FILENAME THEN
   901   8    2:6   132                 FILEIFND := FILEI;
   902   8    2:3   148           IF FILEIFND = 0 THEN
   903   8    2:4   155             FINDFILE := -9
   904   8    2:3   155           ELSE
   905   8    2:4   161             FINDFILE := DIR[ FILEIFND].FIRSTBLK
   906   8    2:2   168         END
   907   8    2:0   171     END;
   908   8    2:0   188     
   909   8    2:0   188     
   910   8    3:D     1   PROCEDURE GETCR;  (* P050203 *)
   911   8    3:D     1   
   912   8    3:0     0     BEGIN
   913   8    3:1     0       REPEAT
   914   8    3:2     0         GOTOXY( 41, 0);
   915   8    3:2     5         READ( INCHAR)
   916   8    3:1    13       UNTIL EOLN
   917   8    3:0    13     END;
   918   8    3:0    38     
   919   8    3:0    38     
   920   8    4:D     1   PROCEDURE PRESSRET;  (* P050204 *)
   921   8    4:D     1   
   922   8    4:0     0     BEGIN
   923   8    4:1     0       WRITELN;
   924   8    4:1     6       WRITE( 'PRESS [RET]' : 25);
   925   8    4:1    27       GETCR
   926   8    4:0    27     END;
   927   8    4:0    42        
   928   8    4:0    42        
   929   8    5:D     1   PROCEDURE DSPTITLE( TITLE : STRING);   (* DSPTITLE *)
   930   8    5:D    43   
   931   8    5:D    43     VAR
   932   8    5:D    43          X : INTEGER;
   933   8    5:D    44   
   934   8    5:0     0     BEGIN
   935   8    5:1     0       WRITE( CHR( HOMECLR));
   936   8    5:1    13       WRITELN( TITLE : 20 + LENGTH( TITLE) DIV 2);
   937   8    5:1    35       FOR X := 1 TO 40 DO
   938   8    5:2    48         WRITE( '-');
   939   8    5:1    64       WRITELN;
   940   8    5:1    70       WRITELN
   941   8    5:0    70     END;
   942   8    5:0    90     
   943   8    5:0    90     
   944   8    6:D     1   PROCEDURE BOOTIN1( TITLE : STRING);  (* P050206 *)
   945   8    6:D    43   
   946   8    6:0     0     BEGIN
   947   8    6:1     0       BASE04 := 1;
   948   8    6:1     8       REPEAT
   949   8    6:2     8         DSPTITLE( TITLE);
   950   8    6:2    12         WRITELN( 'PLACE BOOT SIDE OF MASTER DISK IN DRIVE');
   951   8    6:2    67         WRITELN( '1, THEN PRESS [RET].');
   952   8    6:2   103         GETCR
   953   8    6:1   103       UNTIL FINDFILE( DRIVE1, 'SYSTEM.CHARSET') > 0
   954   8    6:0   127     END;
   955   8    6:0   146     
   956   8    6:0   146     
   957   8    7:D     1   PROCEDURE TWODRIVE;  (* P050207 *)
   958   8    7:D     1   
   959   8    7:0     0     BEGIN
   960   8    7:1     0       REPEAT
   961   8    7:2     0         REPEAT
   962   8    7:3     0           DSPTITLE( 'PLACE MASTER SCENARIO SIDE IN DRIVE 2');
   963   8    7:3    42           PRESSRET;
   964   8    7:3    44           UNITREAD(  DRIVE2, IOBUFF, SIZEOF( IOBUFF), 0, 0);
   965   8    7:3    56           UNITWRITE( DRIVE2, IOBUFF, SIZEOF( IOBUFF), 0, 0)
   966   8    7:2    68         UNTIL IORESULT <> 0
   967   8    7:2    70         
   968   8    7:1    70       UNTIL FINDFILE( DRIVE2, 'SCENARIO.DATA') > 0;
   969   8    7:1    99       
   970   8    7:1    99       REPEAT
   971   8    7:2    99         DSPTITLE( 'PLACE YOUR BLANK DISK IN DRIVE 1');
   972   8    7:2   136         PRESSRET;
   973   8    7:2   138         UNITREAD(  DRIVE1, IOBUFF, SIZEOF( IOBUFF), 0, 0);
   974   8    7:2   150         UNITWRITE( DRIVE1, IOBUFF, SIZEOF( IOBUFF), 0, 0)
   975   8    7:1   162       UNTIL IORESULT = 0
   976   8    7:0   164     END;
   977   8    7:0   186     
   978   8    7:0   186     
   979   8    8:D     1   PROCEDURE COPYSCEN;  (* P050208 *)
   980   8    8:D     1   
   981   8    8:D     1     VAR
   982   8    8:D     1          IOBLOCKS : INTEGER;
   983   8    8:D     2          IOBLKSZ  : INTEGER;
   984   8    8:D     3          SB10     : INTEGER;
   985   8    8:D     4          DSKBLKXX : INTEGER;
   986   8    8:D     5          HEAPBUFF : RECORD CASE BOOLEAN OF
   987   8    8:D     5              FALSE : (I : INTEGER);
   988   8    8:D     5              TRUE  : (P : ^INTEGER);
   989   8    8:D     5            END;
   990   8    8:D     6                 
   991   8    8:D     6          ENDBUFF  : RECORD CASE BOOLEAN OF
   992   8    8:D     6              FALSE : (I : INTEGER);
   993   8    8:D     6              TRUE  : (P : ^INTEGER);
   994   8    8:D     6            END;
   995   8    8:D     7                 
   996   8    8:D     7          BADSTUFF : BOOLEAN;
   997   8    8:D     8          SSB4BL5  : PACKED ARRAY[ 0..13] OF 0..255;
   998   8    8:D    15                 
   999   8    8:D    15          
  1000   8    9:D     1     PROCEDURE RESTORHP;  (* P050209 *)
  1001   8    9:D     1       
  1002   8    9:0     0       BEGIN
  1003   8    9:1     0         WRITE( CHR( HOMECLR));
  1004   8    9:1     8         RELEASE( HEAPBUFF.P)
  1005   8    9:0    11       END;
  1006   8    9:0    26       
  1007   8    9:0    26       
  1008   8   10:D     1     PROCEDURE CHKIOR;  (* P05020A *)
  1009   8   10:D     1     
  1010   8   10:0     0       BEGIN
  1011   8   10:1     0         IF IORESULT <> 0 THEN
  1012   8   10:2     6           BEGIN
  1013   8   10:3     6             RESTORHP;
  1014   8   10:3     8             WRITELN( 'DISK ERROR - PRESS [RET]');
  1015   8   10:3    48             GETCR;
  1016   8   10:3    50             EXIT( MAKESCEN)
  1017   8   10:2    54           END;
  1018   8   10:0    54       END;
  1019   8   10:0    66       
  1020   8   10:0    66       
  1021   8   11:D     1     PROCEDURE RDSCNBIG;  (* P05020B *)
  1022   8   11:D     1     
  1023   8   11:0     0       BEGIN
  1024   8   11:1     0         IF DRIVECNT = 1 THEN
  1025   8   11:2     7           BEGIN
  1026   8   11:3     7             REPEAT
  1027   8   11:4     7               REPEAT
  1028   8   11:5     7                 GOTOXY( 0, 10);
  1029   8   11:5    12                 WRITE( CHR( VT));
  1030   8   11:5    20                 WRITELN( 'PLACE "MASTER" IN DRIVE 1, PRESS [RET]');
  1031   8   11:5    74                 GETCR;
  1032   8   11:5    76                 BADSTUFF := FINDFILE( DRIVE1, 'SCENARIO.DATA') <= 0;
  1033   8   11:5   102                 IF  BADSTUFF THEN
  1034   8   11:6   107                   WRITE( CHR( BEL))
  1035   8   11:4   115               UNTIL NOT BADSTUFF;
  1036   8   11:4   121               
  1037   8   11:4   121               UNITREAD(  DRIVE1, IOBUFF, SIZEOF( IOBUFF), DSKBLKXX, 0);
  1038   8   11:4   135               UNITWRITE( DRIVE1, IOBUFF, SIZEOF( IOBUFF), DSKBLKXX, 0);
  1039   8   11:4   149               BADSTUFF := IORESULT = 0;
  1040   8   11:4   156               IF BADSTUFF THEN
  1041   8   11:5   161                 WRITE( CHR( BEL))
  1042   8   11:3   169             UNTIL NOT BADSTUFF
  1043   8   11:2   169           END;
  1044   8   11:2   175           
  1045   8   11:1   175         IF DSKBLKXX = 0 THEN
  1046   8   11:2   182           BEGIN
  1047   8   11:3   182             UNITREAD( 3 + DRIVECNT, SSB4BL5, SIZEOF( SSB4BL5), SERIALBL, 0);
  1048   8   11:3   196             CHKIOR;   
  1049   8   11:3   198             SB10 := SSB4BL5[ 11] + 1;
  1050   8   11:3   208             IF SB10 = 256 THEN
  1051   8   11:4   217               SB10 := 1;
  1052   8   11:3   221             SSB4BL5[ 10] := SB10;
  1053   8   11:3   229             SSB4BL5[ 11] :=  0;
  1054   8   11:3   235             SSB4BL5[ 12] := (SSB4BL5[ 12] + RANDNUM) MOD 256
  1055   8   11:2   246           END;
  1056   8   11:2   251           
  1057   8   11:1   251         UNITREAD( 3 + DRIVECNT,  HEAPBUFF.P^, BLOCKSZ * IOBLKSZ, DSKBLKXX, 0);
  1058   8   11:1   273         CHKIOR
  1059   8   11:0   273       END;
  1060   8   11:0   294     
  1061   8   11:0   294     
  1062   8   12:D     1     PROCEDURE WRSCNBIG;  (* P05020C *)
  1063   8   12:D     1     
  1064   8   12:0     0       BEGIN
  1065   8   12:1     0         IF DRIVECNT = 1 THEN
  1066   8   12:2     7           BEGIN
  1067   8   12:3     7             REPEAT
  1068   8   12:4     7               GOTOXY( 0, 10);
  1069   8   12:4    12               WRITE( CHR( VT));
  1070   8   12:4    20               WRITELN;
  1071   8   12:4    26               WRITELN( 'PLACE "BLANK" IN DRIVE 1, PRESS [RET]');
  1072   8   12:4    79               GETCR;
  1073   8   12:4    81               UNITREAD(  DRIVE1, IOBUFF, SIZEOF( IOBUFF), DSKBLKXX, 0);
  1074   8   12:4    95               UNITWRITE( DRIVE1, IOBUFF, SIZEOF( IOBUFF), DSKBLKXX, 0);
  1075   8   12:4   109               BADSTUFF := IORESULT <> 0;
  1076   8   12:4   116               IF BADSTUFF THEN
  1077   8   12:5   121                 WRITE( CHR( BEL))
  1078   8   12:3   129             UNTIL NOT BADSTUFF;
  1079   8   12:2   135           END;
  1080   8   12:1   135         UNITWRITE( DRIVE1, HEAPBUFF.P^, BLOCKSZ * IOBLKSZ, DSKBLKXX, 0);
  1081   8   12:1   153         CHKIOR;
  1082   8   12:1   155         IF DSKBLKXX = 0 THEN
  1083   8   12:2   162           BEGIN
  1084   8   12:3   162             UNITREAD(  DRIVE1, IOBUFF, SIZEOF( IOBUFF), SERIALBL, 0);
  1085   8   12:3   174             CHKIOR;
  1086   8   12:3   176             MOVELEFT( SSB4BL5, IOBUFF, SIZEOF( SSB4BL5));
  1087   8   12:3   187             UNITWRITE( DRIVE1, IOBUFF, SIZEOF( IOBUFF), SERIALBL, 0);
  1088   8   12:3   199             CHKIOR
  1089   8   12:2   199           END
  1090   8   12:0   201       END;
  1091   8   12:0   218          
  1092   8   12:0   218   
  1093   8    8:0     0     BEGIN  (* COPYSCEN *)
  1094   8    8:1     0       IOBLOCKS := (MEMAVAIL - 1500) DIV BLOCKSZ; 
  1095   8    8:1    12       MARK( HEAPBUFF.P);
  1096   8    8:1    16       ENDBUFF.I := HEAPBUFF.I + (BLOCKSZ * IOBLOCKS);
  1097   8    8:1    25       RELEASE( ENDBUFF.P);
  1098   8    8:1    29       DSKBLKXX := 0;
  1099   8    8:1    32       WHILE DSKBLKXX < 279 DO
  1100   8    8:2    39         BEGIN
  1101   8    8:3    39           GOTOXY( 15, 8);
  1102   8    8:3    44           WRITE( 'COPYING ');
  1103   8    8:3    62           WRITE( (279 - DSKBLKXX) DIV IOBLOCKS : 2);
  1104   8    8:3    76           IF DSKBLKXX + IOBLOCKS < 279 THEN
  1105   8    8:4    85             IOBLKSZ := IOBLOCKS
  1106   8    8:3    85           ELSE
  1107   8    8:4    90             IOBLKSZ := 279 - DSKBLKXX;
  1108   8    8:4    97             
  1109   8    8:3    97           RDSCNBIG;
  1110   8    8:3    99           WRSCNBIG;
  1111   8    8:3   101           DSKBLKXX := DSKBLKXX + IOBLKSZ
  1112   8    8:2   102         END;
  1113   8    8:1   108       RESTORHP
  1114   8    8:0   108     END;  (* COPYSCEN *)
  1115   8    8:0   124     
  1116   8    8:0   124     
  1117   8    8:0   124 
  1118   8    1:0     0   BEGIN  (* MAKESCEN  *)
  1119   8    1:1     0     REPEAT
  1120   8    1:2     0       WRITE( CHR( HOMECLR));
  1121   8    1:2     8       WRITE( 'DO YOU HAVE 1) OR 2) DRIVES ?');
  1122   8    1:2    47       READ( INCHAR);
  1123   8    1:1    55     UNTIL (INCHAR = '1') OR (INCHAR = '2');
  1124   8    1:1    64     DRIVECNT := ORD( INCHAR) - ORD( '0');
  1125   8    1:1    69     IF DRIVECNT = 2 THEN
  1126   8    1:2    74       TWODRIVE;
  1127   8    1:1    76     WRITE( CHR( HOMECLR));
  1128   8    1:1    84     WRITE( 'COPYING MASTER TO BLANK' : 31);
  1129   8    1:1   117     IF BASE04 = 1 THEN
  1130   8    1:2   122       BEGIN
  1131   8    1:3   122         GOTOXY( 0, 3);
  1132   8    1:3   127         WRITELN( 'INSERT AND REMOVE DISKS WHEN PROMPTED.');
  1133   8    1:3   181         WRITELN;
  1134   8    1:3   187         WRITELN( 'REMEMBER : "BLANK"  = YOUR BLANK DISK.');
  1135   8    1:3   241         WRITELN( '           "MASTER" = MASTER SCENARIO.');
  1136   8    1:2   295       END;
  1137   8    1:1   295     COPYSCEN;
  1138   8    1:1   297     BASE04 := 1;
  1139   8    1:1   300     BOOTIN1( 'ADDITIONAL SCENARIO MADE')
  1140   8    1:0   327   END;
  1141   8    1:0   346 
  1142   8    1:0   346 (*$I WIZ3U:MAKESCEN *)
  1142   8    1:0   346 (*$I WIZ3U:OPTIONS  *)
  1143   9    1:D     1 SEGMENT PROCEDURE OPTIONS;  (* P050301 *)
  1144   9    1:D     1 
  1145   9    1:D     1   CONST 
  1146   9    1:D     1         HOMECLR = 12;
  1147   9    1:D     1 
  1148   9    1:D     1   VAR   
  1149   9    1:D     1         IOBUFF : PACKED ARRAY[ 0..19] OF CHAR;
  1150   9    1:D    11     
  1151   9    1:0     0   BEGIN
  1152   9    1:0     0     
  1153   9    1:1     0     WRITE( CHR( HOMECLR));
  1154   9    1:1     8     WRITELN( '* SCENARIO 3 - THE LEGACY OF LLYLGAMYN *');
  1155   9    1:1    64     WRITELN;
  1156   9    1:1    70     WRITELN( 'COPYRIGHT (C)1981,1982,1983,  ALL RIGHTS');
  1157   9    1:1   126     WRITELN( 'RESERVED BY ANDREW GREENBERG, INC.,  AND');
  1158   9    1:1   182     WRITELN( 'ROBERT WOODHEAD, INC.   THIS PROGRAM  IS');
  1159   9    1:1   238     WRITELN( 'PROTECTED  UNDER THE LAWS  OF THE UNITED');
  1160   9    1:1   294     WRITELN( 'STATES AND OTHER COUNTRIES,  AND ILLEGAL');
  1161   9    1:1   350     WRITELN( 'DISTRIBUTION   MAY   RESULT   IN   CIVIL');
  1162   9    1:1   406     WRITELN( 'LIABILITY AND CRIMINAL PROSECUTION.');
  1163   9    1:1   457     
  1164   9    1:1   457     UNITREAD( DRIVE1, IOBUFF, 20, SERIALBL, 0);
  1165   9    1:1   466     MOVELEFT( IOBUFF, SERIAL, 8);
  1166   9    1:1   475     GOTOXY( 0, 12);
  1167   9    1:1   480     WRITE( 'VERSION   -4-   OF 04-MAY-83  SER:');
  1168   9    1:1   524     WRITELN( SERIAL);
  1169   9    1:1   539     WRITELN;
  1170   9    1:1   545     WRITELN;
  1171   9    1:1   551     WRITELN( '  S)TART GAME   U)TILITIES' : 32);
  1172   9    1:1   593     WRITELN;
  1173   9    1:1   599     WRITELN( 'NOTE - YOU MUST MAKE AN ADDITIONAL SCEN-');
  1174   9    1:1   655     WRITELN( '       ARIO DISKETTE BEFORE PLAYING. SEE');
  1175   9    1:1   711     WRITE  ( '       THE MANUAL FOR MORE DETAILS.'     );
  1176   9    1:1   756     
  1177   9    1:1   756     REPEAT
  1178   9    1:2   756       GOTOXY( 41, 0);
  1179   9    1:2   761       READ( INCHAR)
  1180   9    1:1   769     UNTIL (INCHAR = 'S') OR (INCHAR = 'U')
  1181   9    1:0   775   END;
  1182   9    1:0   792 (*$I WIZ3U:OPTIONS  *)
  1183   9    1:0   792 
  1184   1    2:D     3   FUNCTION COPYPROT : BOOLEAN; EXTERNAL;   (* P050002 *)
  1185   1    2:D     3   
  1186   1    2:D     3 
  1187   1    3:D     3   FUNCTION CHKCOPY : BOOLEAN;  (* P050003 *)
  1188   1    3:D     3   
  1189   1    3:D     3     VAR
  1190   1    3:D     3         BUFFER : PACKED ARRAY[ TBLOCKRG] OF CHAR;
  1191   1    3:D   259   
  1192   1    3:0     0     BEGIN
  1193   1    3:1     0       UNITREAD( DRIVE1, BUFFER, SIZEOF( BUFFER), SERIALBL, 0);
  1194   1    3:1    11       MOVELEFT( BUFFER, SERIAL, 7);
  1195   1    3:1    20       CHKCOPY := TRUE;
  1196   1    3:1    23       UNITREAD( DRIVE1, BUFFER, SIZEOF( BUFFER), 278, 0);
  1197   1    3:1    36       IF NOT COPYPROT THEN
  1198   1    3:2    43         BEGIN
  1199   1    3:3    43           CHKCOPY := COPYPROT
  1200   1    3:2    43         END
  1201   1    3:0    49     END;
  1202   1    3:0    62     
  1203   1    3:0    62     
  1204   1    4:D     1   PROCEDURE SVSERIAL;  (* P050004 *)
  1205   1    4:D     1 
  1206   1    4:D     1     TYPE 
  1207   1    4:D     1          BYTE = PACKED ARRAY [0..1] OF 0..255;
  1208   1    4:D     1     
  1209   1    4:D     1          MAGIC = RECORD CASE BOOLEAN OF
  1210   1    4:D     1              FALSE : (I : INTEGER);
  1211   1    4:D     1              TRUE  : (P : ^BYTE);
  1212   1    4:D     1            END;
  1213   1    4:D     1        
  1214   1    4:D     1     VAR 
  1215   1    4:D     1          BUFFER : PACKED ARRAY[ 0..8] OF 0..255;
  1216   1    4:D     6          X      : INTEGER;
  1217   1    4:D     7          SL7SCR : MAGIC;
  1218   1    4:D     8     
  1219   1    4:0     0     BEGIN
  1220   1    4:1     0       UNITREAD( DRIVE1, BUFFER, 8, SERIALBL, 0); 
  1221   1    4:1     9       SL7SCR.I := 4*256 + 7*16 + 15;
  1222   1    4:1    22       FOR X := 0 TO 7 DO
  1223   1    4:2    33         BEGIN
  1224   1    4:3    33           SL7SCR.P^ [0] := BUFFER[ X];
  1225   1    4:3    40           SL7SCR.I := SL7SCR.I + 128
  1226   1    4:2    41         END
  1227   1    4:0    47     END;
  1228   1    4:0    68     
  1229   1    4:0    68 
  1230   1    1:0     0 BEGIN  (* WIZUTIL *)
  1231   1    1:1     0   WRITE( CHR( ESC) );
  1232   1    1:1    13   WRITE( CHR( 21) );
  1233   1    1:1    21   IF NOT CHKCOPY THEN
  1234   1    1:2    28      BEGIN
  1235   1    1:3    28        IF NOT CHKCOPY THEN
  1236   1    1:4    35          REPEAT UNTIL FALSE
  1237   1    1:2    35      END;
  1238   1    1:1    38   SVSERIAL;
  1239   1    1:1    40   REPEAT
  1240   1    1:2    40     OPTIONS;
  1241   1    1:2    43     CASE INCHAR OF
  1242   1    1:2    46       'S':  BEGIN
  1243   1    1:4    46               SETCHAIN( 'WIZARDRY');
  1244   1    1:4    60               EXIT( WIZBOOT);
  1245   1    1:3    64             END;
  1246   1    1:3    66                
  1247   1    1:2    66       'U':  BEGIN
  1248   1    1:4    66               REPEAT
  1249   1    1:5    66                 UTILS;
  1250   1    1:5    69                 IF BASE04 > 0 THEN
  1251   1    1:6    74                     MAKESCEN
  1252   1    1:4    74               UNTIL BASE04 = 0
  1253   1    1:3    78             END;
  1254   1    1:2    84     END;
  1255   1    1:1    98   UNTIL FALSE
  1256   1    1:0    98 END.
