[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 22:13:01 Winchester Format - LDOS 5.1 Page 00001 00001 ;Hdform6/ASM - LDOS X.X - 02/07/84 00003 ;*=*=* 00004 ; Version equates 00005 ; set only 1 drive model TRUE (-1) 00006 ;*=*=* 0000 00007 ARM EQU 0 0000 00008 MTI EQU 0 0000 00009 LDI EQU 0 0000 00010 LSI EQU 0 FFFF 00011 TRS EQU -1 0000 00012 PDC EQU 0 00013 ;*=*=* FFFF 00014 RAM EQU -1 ;True for 6.x LDOS 0063 00015 RLS EQU 63H ;Release version # for GAT 00016 ;*=*=* 00017 ;Define FORM$ and HELLO$ 0000 00018 LOGON MACRO ; dummy macro definiton 0000 00019 DB '** Dummy Macro **' 0000 00020 ENDM 0000 00022 *GET BUILDVER/ASM:3 ;<631> 00023 ; 00024 ; Buildver/asm is a bit of a kludge since not all utilities can load 00025 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00026 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00027 ; for programs that can use that. 00028 ; FFFF 00029 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00030 ; These switches activate patches made since the 1B release. 00031 ; It is important that all earlier patches be enabled when a higher 00032 ; patch is enabled. 00033 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00034 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00035 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00036 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00037 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00038 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00039 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00040 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00041 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00042 ; 00043 ;End of BUILDVER/ASM 0000 00044 *GET HDFMT1/ASM:3 00045 ;HDFORMX/ASM - LDOS 5.1 or 6.x - 04/29/83 00046 ;*=*=* 00047 ; Change Log 00048 ;Moved all system routines to end 00049 ;For easier 5.1/6.x compatibility -LM 00050 ;Put WD FORMAT code here instead of in driver 00051 ;Update system DCT for DIR cyl when done-04/26/83 00052 ;*=*=* 00053 IF RAM 2400 00054 ORG 2400H 00055 ELSE 00056 ORG 5400H 00057 BEGIN EQU $ 00058 ENDIF 00059 ;***** 00060 ; FORMAT routine entry point 00061 ;***** 2400 E5 00062 USER PUSH HL ;Save cmdline ptr 2401 219C2C 00063 LD HL,HELLO$ ;Log on 2404 CD022B 00064 CALL @DSPLY ;Hello message 2407 E1 00065 POP HL ;Rcvr ptr to cmdline 00066 ;*=*=* 00067 ; Grab any parameters 00068 ;*=*=* 2408 E5 00069 PUSH HL ;Save again 2409 2B 00070 DEC HL 240A 23 00071 FNDPRN INC HL 240B 7E 00072 LD A,(HL) 240C FE0E 00073 CP CR+1 ;End of line? 240E 380D 00074 JR C,FMT1 ;No parms 2410 FE28 00075 CP '(' 2412 20F6 00076 JR NZ,FNDPRN 2414 119030 00077 LD DE,PARMTBL ;Parse any parameters 2417 CD142B 00078 CALL @PARAM 241A C2C72A 00079 JP NZ,PRMERR ;Jump on parm error 00080 ;*=*=* 00081 ; Scan for drivespec on command line 00082 ;*=*=* 241D E1 00083 FMT1 POP HL ;Cmd line again 241E 7E 00084 LD A,(HL) ;Ignore spaces 241F 23 00085 INC HL 2420 FE20 00086 CP 20H 2422 28F9 00087 JR Z,FMT1 2424 FE3A 00088 CP ':' ;Colon drive indicator? 2426 2013 00089 JR NZ,WHDRV 2428 7E 00090 LD A,(HL) ;P/u drive # 2429 D630 00091 SUB '0' ;Cvrt to ASCII 242B DAC72A 00092 JP C,PRMERR ;0 or larger 242E FE08 00093 CP 8 ;Make sure not > 7 2430 D2C72A 00094 JP NC,PRMERR 2433 32D329 00095 LD (DISKIO+1),A ;Stuff drive 2436 1816 00096 JR FMT2 ;Don't ask 00097 ;***** 00098 ; Drive not entered, prompt for it 00099 ;***** 2438 CDD12A 00100 WHDRV1 CALL ABTJCL ;No reprompt if JCL 243B 21AD2D 00101 WHDRV LD HL,WHDRV$ ;"which drive... 243E CD4D2A 00102 CALL GETARG ;Get one char 2441 D630 00103 SUB '0' ;Cvrt to binary 2443 DA3824 00104 JP C,WHDRV1 ;Error if < 0 2446 FE08 00105 CP 8 ;Error if > 7 2448 D23824 00106 JP NC,WHDRV1 244B 32D329 00107 LD (DISKIO+1),A ;Stuff drive 00108 ;*=*=* 00109 ; Get the DCT of the requested drive 00110 ;*=*=* 244E B7 00111 FMT2 OR A 244F CAB32A 00112 JP Z,NOTZER ;Can't do logical 0 2452 4F 00113 LD C,A ;Set in drive register 2453 CD262B 00114 CALL GETDCT@ ;Find DCT pointer 2456 FDE5 00115 PUSH IY 2458 E1 00116 POP HL ;Put in HL 2459 7E 00117 LD A,(HL) ;Be sure enabled 245A FEC9 00118 CP 0C9H ; a RET? 245C CAB72A 00119 JP Z,ILLEG ;Quit if disabled 245F 222A2C 00120 LD (DCTPTR),HL ;Save for later 2462 11FF30 00121 LD DE,FMTDCT ;Move SYSTEM DCT into 2465 D5 00122 PUSH DE 2466 010A00 00123 LD BC,10 ; FORMAT's buffer so we 2469 EDB0 00124 LDIR ; don't update the SYS 246B FDE1 00125 POP IY ;Use for FORMAT 00126 ; 00127 IF MTI!LSI!ARM!TRS!PDC 00128 ;*=*=* 00129 ; This format only for hard drive - check it 00130 ;*=*=* 246D FDCB035E 00131 BIT 3,(IY+3) ;Check if hard drive 00132 ENDIF 00133 ; 00134 IF LDI 00135 ;*=*=* 00136 ; This format only for alien drive - check it 00137 ;*=*=* 00138 BIT 4,(IY+4) ;Check if alien drive 00139 ENDIF 00140 ; 2471 CAC32A 00141 JP Z,NOTHARD ;Only HD format allowed 2474 FD6E01 00142 LD L,(IY+1) ;Check if on HD driver 2477 FD6602 00143 LD H,(IY+2) ; compatible with this 247A 23 00144 INC HL ; version of FORM... 247B 23 00145 INC HL ;Bump to start of name 247C 23 00146 INC HL 247D 23 00147 INC HL 247E 11972C 00148 LD DE,FORM$-1 ;Pt to which version 2481 0603 00149 LD B,3 ;Check 3 bytes 2483 23 00150 CKVER INC HL 2484 13 00151 INC DE 2485 1A 00152 LD A,(DE) ;Check if driver name 2486 BE 00153 CP (HL) ; is this version's 2487 C2AB2A 00154 JP NZ,DIFDVR ;Go if wrong version 248A 10F7 00155 DJNZ CKVER 00156 ;*=*=* 00157 ; Check on Pack Name entry 00158 ;*=*=* 248C 210000 00159 NPARM LD HL,0 ;Test if user entered 248F 7C 00160 LD A,H ; the NAME parameter 2490 B5 00161 OR L 2491 2826 00162 JR Z,DSKNAM ;Go if not 2493 3C 00163 INC A ;Was it just NAME? 2494 2823 00164 JR Z,DSKNAM ;Go if just NAME 2496 11D032 00165 LD DE,GATBUF+0D0H ;Yes, move name to field 2499 0608 00166 LD B,8 ;8-chars max 249B 7E 00167 MOVNAM LD A,(HL) ;P/u a char 249C FE22 00168 CP '"' ;Closing " 249E 282B 00169 JR Z,CKNAME ;Exit if end of parm 24A0 FE20 00170 CP 20H ;Permit all but controls 24A2 DACB24 00171 JP C,CKNAME 24A5 FE61 00172 CP 'a' 24A7 3806 00173 JR C,MOVNAM1 24A9 FE7B 00174 CP 'z'+1 24AB 3002 00175 JR NC,MOVNAM1 24AD EE20 00176 XOR 20H ;Turn off lc 24AF 12 00177 MOVNAM1 LD (DE),A 24B0 23 00178 INC HL 24B1 13 00179 INC DE 24B2 10E7 00180 DJNZ MOVNAM 24B4 1815 00181 JR CKNAME 00182 ;***** 00183 ; Prompt user for name parameter 00184 ;***** 24B6 CDD12A 00185 DSKNAM1 CALL ABTJCL 24B9 21CA2D 00186 DSKNAM LD HL,DSKNAM$ ;"diskette name? 24BC 0608 00187 LD B,8 24BE CD4F2A 00188 CALL GETARGX 24C1 28F3 00189 JR Z,DSKNAM1 ;Reprompt if none entered 24C3 48 00190 LD C,B ;Only move to name field 24C4 0600 00191 LD B,0 ; how many were entered 24C6 11D032 00192 LD DE,GATBUF+0D0H 24C9 EDB0 00193 LDIR 24CB 11D032 00194 CKNAME LD DE,GATBUF+0D0H 24CE CD1D2A 00195 CALL CKMPW0 24D1 C2A72A 00196 JP NZ,BADNAM 00197 ;*=*=* 00198 ; Get today's date 00199 ;*=*=* 24D4 21D832 00200 GETDAT LD HL,GATBUF+0D8H ;Get today's date & stuff 24D7 CD2A2B 00201 CALL @DATE 00202 ;*=*=* 00203 ; Check master password entry 00204 ;*=*=* 24DA 210000 00205 MPWPARM LD HL,0 ;Did user enter the MPW? 24DD 7C 00206 LD A,H 24DE B5 00207 OR L 24DF 2821 00208 JR Z,MPW ;Go prompt if not 24E1 3C 00209 INC A ;Test if just MPW 24E2 281E 00210 JR Z,MPW ;Go if just MPW 24E4 11532D 00211 LD DE,MPWBUF ;Shift to pswd field 24E7 0608 00212 LD B,8 24E9 7E 00213 MOVMPW LD A,(HL) 24EA FE30 00214 CP 30H ;No spaces permitted 24EC 381C 00215 JR C,PRSMPW ;End also on closing " 24EE FE61 00216 CP 'a' ;Need cvrt to UC? 24F0 3806 00217 JR C,MOVMPW1 24F2 FE7B 00218 CP 'z'+1 24F4 3002 00219 JR NC,MOVMPW1 24F6 CBAF 00220 RES 5,A ;Cvrt to UC 24F8 12 00221 MOVMPW1 LD (DE),A 24F9 13 00222 INC DE 24FA 23 00223 INC HL 24FB 10EC 00224 DJNZ MOVMPW 24FD 180B 00225 JR PRSMPW 00226 ; **** 00227 ; Prompt for master password 00228 ;***** 24FF CDD12A 00229 MPW1 CALL ABTJCL 2502 21F42D 00230 MPW LD HL,MPW$ ;"master... 2505 CD722A 00231 CALL INPMPW 2508 28F5 00232 JR Z,MPW1 ;Re-prompt on no entry 00233 ;***** 00234 ; Parse the password & stuff into GAT sector buf 00235 ;***** 250A 11532D 00236 PRSMPW LD DE,MPWBUF 250D CD0E2A 00237 CALL CKMPW ;Check for valid MPW 2510 20ED 00238 JR NZ,MPW1 ;Invalid entry 2512 22CE32 00239 LD (GATBUF+0CEH),HL ;Stuff it 00240 ;***** 00241 ; Routine to galculate the # of grans per logical 00242 ; cylinder so that the GAT byte can be constructed 00243 ;***** 2515 FD7E08 00244 CALCGPC LD A,(IY+8) ;P/u # of grans per cyl 2518 07 00245 RLCA ;Rotate to bits 0-2 2519 07 00246 RLCA 251A 07 00247 RLCA 251B E607 00248 AND 7 ;Strip off other data 251D 3C 00249 INC A ;Adj for zero offset 00250 ;*=*=* 00251 ; If double cylindering, double the count 00252 ;*=*=* 251E FDCB046E 00253 BIT 5,(IY+4) ;Double? 2522 2801 00254 JR Z,$+3 2524 87 00255 ADD A,A ;Count * 2 2525 01FFFF 00256 LD BC,0FFFFH ;Init GAT byte to ones 2528 CB20 00257 CGPC1 SLA B ;Now keep removing low 252A 3D 00258 DEC A ; order bits , 1 bit for 252B 20FB 00259 JR NZ,CGPC1 ; each available granule 252D 78 00260 LD A,B ;Save the default byte 252E 32C627 00261 LD (CALC1+1),A ; for dir test 2531 210032 00262 LD HL,GATBUF ;Pt to GAT buffer area 2534 FD7E06 00263 LD A,(IY+6) ;P/u highest # cylinder 2537 70 00264 CGPC2 LD (HL),B ;Stuff the GAT byte into 2538 2C 00265 INC L ; each position of the 2539 BD 00266 CP L ; Gat, one byte per 253A 30FB 00267 JR NC,CGPC2 ; cylinder 00268 ;*=*=* 00269 ; Test if we are at 202 first by ignoring the 00270 ; first two instructions with LD DE,xxxx 00271 ;*=*=* 253C 3ECB 00272 LD A,0CBH ;Continue to stuff GAT 253E 11 00273 DB 11H ; until cyl 202 253F 71 00274 CGPC3 LD (HL),C 2540 2C 00275 INC L 2541 BD 00276 CP L 2542 20FB 00277 JR NZ,CGPC3 00278 ;*=*=* 00279 ; Check if this pack is already formatted 00280 ;*=*=* 2544 FDE5 00281 PFMT3 PUSH IY ;Xfer DCT ptr to HL 2546 E1 00282 POP HL ; & move DCT again 2547 119D2A 00283 LD DE,TMPDCT 254A 010A00 00284 LD BC,10 254D EDB0 00285 LDIR 00286 ;*=*=* 00287 ; May be formatted, is there SYSTEM information? 00288 ;*=*=* 254F 210000 00289 LD HL,$-$ ;NOSTOP entered? 2550 00290 NOSTOP EQU $-2 ;Via param 2552 7C 00291 LD A,H 2553 B5 00292 OR L 2554 C2DB25 00293 JP NZ,PFMT6 ;No testing if set 2557 210034 00294 LD HL,HITBUF ;Pt to i/o buffer 255A 110000 00295 LD DE,0 ;Init to cyl 0, sect 0 255D CDB829 00296 CALL RDSEC ;Now try to read BOOT 2560 C2DB25 00297 JP NZ,PFMT6 ;Assume unformatted if err 2563 211D2E 00298 LD HL,HASDAT$ ;Init "disk contains data 2566 CD182B 00299 CALL @LOGOT 2569 21342E 00300 LD HL,NOFMT$ ;Init "non-std format 00301 ;*=*=* 00302 ; BOOT was read, is there a valid directory pointer 00303 ;*=*=* 256C 3A0234 00304 LD A,(HITBUF+2) ;P/u dir cyl # (possible) 256F FDBE06 00305 CP (IY+6) ;Check against max cyl # 2572 3053 00306 JR NC,PFMT5 ;Go if bigger (or =) 00307 ;*=*=* 00308 ; Read the assummed GAT & test it 00309 ;*=*=* 2574 210034 00310 LD HL,HITBUF 2577 5D 00311 LD E,L ;Tricky way to get a zero 2578 57 00312 LD D,A ;Pt to assumed GAT sector 2579 210034 00313 LD HL,HITBUF ;Pt to buffer 257C CDB829 00314 CALL RDSEC ;Read the sector 257F FE06 00315 CP 6 ;Dir errcod returned? 2581 2805 00316 JR Z,PFMT4 ;Jump if yes & grab data 2583 21492E 00317 LD HL,CANTRD$ ;Init "unreadable dir... 2586 183F 00318 JR PFMT5 2588 215F2E 00319 PFMT4 LD HL,NODIR$ ;Init "non-init dir 258B 3ADA34 00320 LD A,(HITBUF+0DAH) ;Check if date field 258E FE2F 00321 CP '/' ; is present 2590 2035 00322 JR NZ,PFMT5 00323 ;*=*=* 00324 ; The directory is readable - request its MPW 00325 ;*=*=* 2592 21D034 00326 PFMT4A LD HL,HITBUF+0D0H 2595 117F2E 00327 LD DE,PACKID$+5 ;Move name & date into 2598 010800 00328 LD BC,8 ;Display message field 259B EDB0 00329 LDIR 259D 118E2E 00330 LD DE,PACKID$+14H 25A0 0E08 00331 LD C,8 25A2 EDB0 00332 LDIR 25A4 217A2E 00333 LD HL,PACKID$ 25A7 CD182B 00334 CALL @LOGOT ;Log the id field 25AA CDD12A 00335 CALL ABTJCL ;Abort if in JCL 00336 ;*=*=* 00337 ; User must enter Current Pack's MPW to proceed 00338 ;*=*=* 25AD 21972E 00339 OLDMPW LD HL,OLDMPW$ ;"What's the old MPW? 25B0 CD722A 00340 CALL INPMPW ;Grab user input to match 25B3 28F8 00341 JR Z,OLDMPW 25B5 11532D 00342 LD DE,MPWBUF 25B8 CD1A2A 00343 CALL HASHMPW ;Hash user entry 00344 ;***** 00345 ; Routine to test master password for match 00346 ;***** 25BB EB 00347 EX DE,HL ;Xfer hashed MPW to DE 25BC 2ACE34 00348 LD HL,(HITBUF+0CEH) ;Else grab pack MPW 25BF AF 00349 XOR A ;Clear carry flag 25C0 ED52 00350 SBC HL,DE ;Did user enter pack MPW? 25C2 C2BB2A 00351 JP NZ,BADMPW ;Abort if no match 25C5 1814 00352 JR PFMT6 00353 ;*=*=* 00354 ; The directory was not readable - req assurance 00355 ;*=*=* 25C7 CD182B 00356 PFMT5 CALL @LOGOT ;Log "unreadable... 25CA CDD02A 00357 CALL ABTJCL1 ;Abort if JCL running 25CD 210930 00358 LD HL,SURE?$ ;"Are you sure?... 25D0 0603 00359 LD B,3 25D2 CD4F2A 00360 CALL GETARGX ;Give user chance to 25D5 7E 00361 LD A,(HL) ; proceed with format 25D6 FE59 00362 CP 'Y' 25D8 C2BF2A 00363 JP NZ,FMTABT 00364 ;*=*=* 00365 ; OK to format - Shift DCT to work area 00366 ;*=*=* 25DB FDE5 00367 PFMT6 PUSH IY ;Move drive code table 25DD D1 00368 POP DE ;Back into place 25DE 219D2A 00369 LD HL,TMPDCT 25E1 010A00 00370 LD BC,10 25E4 EDB0 00371 LDIR 00372 ;*=*=* 00373 ; allow user to lock out tracks manually 00374 ;*=*=* 00375 ; 25E6 FDCB035E 00376 BIT 3,(IY+3) ;Hard drive? 25EA CAB026 00377 JP Z,NOLCT ;Go if floppy 00378 ;Calc possible heads and adjust msg 25ED FD7E04 00379 LD A,(IY+4) ;Starting head # 25F0 E60F 00380 AND 00001111B ;Field 25F2 C630 00381 ADD A,30H ;ASCII offset 25F4 00 00382 NOP ;Possible DEC if hd # are 25F5 5F 00383 LD E,A ;Given starting w/0 25F6 3C 00384 INC A ;Make number 25F7 57 00385 LD D,A ;Save 25F8 32692C 00386 LD (PHYD1$),A ;1st possible head 25FB FD7E07 00387 LD A,(IY+7) ;# of heads 25FE 07 00388 RLCA 25FF 07 00389 RLCA 2600 07 00390 RLCA 2601 E607 00391 AND 7 ;Field 2603 3C 00392 INC A ;Real # 2604 327C26 00393 LD (HDNB),A ;Save 2607 1C 00394 HCLP INC E ;Start fm 1st hd # -1 2608 3D 00395 DEC A ;Get highest head # 2609 20FC 00396 JR NZ,HCLP ;By counting 260B 7B 00397 LD A,E 260C 326B2C 00398 LD (PHYD2$),A ; 260F ED534926 00399 LD (HDNBRS),DE ;Save valid range 00400 ; 00401 ;Set up trk number message 2613 2600 00402 LD H,0 2615 FD6E06 00403 LD L,(IY+6) ;Trk count to BC 2618 23 00404 INC HL ;Fix offset fm 0 2619 FDCB046E 00405 BIT 5,(IY+4) ;Double? 261D 2801 00406 JR Z,ISREAL 261F 29 00407 ADD HL,HL ;*2 2620 2B 00408 ISREAL DEC HL ;Back to offset fm 0 2621 226A26 00409 LD (HTRK),HL 2624 11902C 00410 LD DE,PHYT1$ ;Posn for # 2627 CD0C2B 00411 CALL HEXDEC ;Stuff ASCII 262A 1803 00412 JR LCQUES 00413 ;Ask question 262C CDD12A 00414 LCQUES1 CALL ABTJCL 262F 212C2C 00415 LCQUES LD HL,LOCK$ ;Lock out any... 2632 CD4D2A 00416 CALL GETARG 2635 FE59 00417 CP 'Y' 2637 2809 00418 JR Z,LCHD1 ;Yes.. 2639 FE4E 00419 CP 'N' 263B 2873 00420 JR Z,NOLCT ;Skip if not wanted 263D 18ED 00421 JR LCQUES1 263F CDD12A 00422 GTPHD CALL ABTJCL ;No errors allowed if JCL 2642 214D2C 00423 LCHD1 LD HL,PHYHD$ ;Which head... 2645 CD4D2A 00424 CALL GETARG 2648 210000 00425 LD HL,$-$ ;Range 2649 00426 HDNBRS EQU $-2 264B BC 00427 CP H 264C 38F1 00428 JR C,GTPHD ;Too low 264E 2C 00429 INC L 264F BD 00430 CP L 2650 30ED 00431 JR NC,GTPHD ;Too high 2652 328B26 00432 LD (LCHD),A ;Save track 2655 1803 00433 JR LCTR1 2657 CDD12A 00434 GTPHTR CALL ABTJCL 265A 216F2C 00435 LCTR1 LD HL,PHYTR$ ;Trk #.. 265D 0603 00436 LD B,3 265F CD4F2A 00437 CALL GETARGX 2662 CD082B 00438 CALL DECHEX ;Make binary in BC 2665 78 00439 LD A,B 2666 B1 00440 OR C 2667 28EE 00441 JR Z,GTPHTR ;Can't lock out 0 2669 210000 00442 LD HL,$-$ 266A 00443 HTRK EQU $-2 ;Highest trk # 266C B7 00444 OR A 266D ED42 00445 SBC HL,BC ;Entered >legal? 266F 38E6 00446 JR C,GTPHTR ;Number was too high 00447 ; 00448 ;Convert physical numbers to logical GAT posn 00449 ; 2671 FD7E08 00450 LD A,(IY+8) 2674 07 00451 RLCA 2675 07 00452 RLCA 2676 07 00453 RLCA 2677 E607 00454 AND 7 2679 3C 00455 INC A 267A 5F 00456 LD E,A ;E has grans/cyl (w/o double) 267B 3E00 00457 LD A,$-$ 267C 00458 HDNB EQU $-1 ;Number of heads 267D C5 00459 PUSH BC 267E D5 00460 PUSH DE ;Save grans/phys cyl 267F CD212B 00461 CALL DIVEA@ ;Grans/head 2682 D1 00462 POP DE 2683 53 00463 LD D,E ;Save grans/phys cyl 2684 5F 00464 LD E,A ;Keep grans/phys trk 2685 E1 00465 POP HL ;Trk # to HL 2686 3A692C 00466 LD A,(PHYD1$) 2689 4F 00467 LD C,A 268A 3E00 00468 LD A,$-$ ;Physical hd # 268B 00469 LCHD EQU $-1 ;Entered value 268C 91 00470 SUB C ;Minus starting offset 00471 ;A=trk offset fm logical start/D=grans/trk/HL=trk to lock 268D D5 00472 PUSH DE 268E CD1C2B 00473 CALL MULTEA@ ;A=gran offset fm start 2691 D1 00474 POP DE 2692 FDCB046E 00475 BIT 5,(IY+4) ;Double tracking? 2696 2807 00476 JR Z,N1 2698 CB2C 00477 SRA H 269A CB1D 00478 RR L ;Div trk # by 2 00479 ;HL=>logical trk c set if 1st of pair 269C 3001 00480 JR NC,N1 ;1st cyl-go 269E 82 00481 ADD A,D ;Else add in a cyls grans 269F 2632 00482 N1 LD H,GATBUF<-8 ; 26A1 43 00483 LD B,E ;#grans to lock 26A2 5E 00484 LD E,(HL) ;Get alloc byte 00485 ;A=grans before locked out trk 26A3 3D 00486 DEC A ;Offset fm 0 26A4 3C 00487 OFFS2 INC A ;Set a bit for each gran 26A5 F5 00488 PUSH AF 26A6 CD8D2A 00489 CALL SETBIT ;Of the physical track 26A9 F1 00490 POP AF 26AA 10F8 00491 DJNZ OFFS2 26AC 73 00492 LD (HL),E ;And put back GAT byte 26AD C32F26 00493 JP LCQUES ;Ask for more 00494 ; 26B0 21F22E 00495 NOLCT LD HL,DBL$ 26B3 FDCB046E 00496 BIT 5,(IY+4) ;Double tracking 26B7 C4022B 00497 CALL NZ,@DSPLY ;Notify user 00499 ; 26BA 00500 *GET HDFMT2/ASM:3 00501 ;HDFMT2/ASM - Hard format module - 10/31/83 00502 IF LDI 00503 ;*=*=* 00504 ; Begin the actual format - Check for "one" drive 00505 ;*=*=* 00506 XOR A ;Init the count 00507 EXX 00508 LD B,A 00509 EXX 00510 LD C,(IY+1) ;P/u the driver vector 00511 LD B,(IY+2) ; & ck for # parts 00512 LD HL,DCT$ 00513 TSTDCT PUSH HL 00514 LD A,(HL) ;Is this disabled? 00515 CP 0C9H 00516 JR Z,NOTRES 00517 INC HL 00518 LD E,(HL) ;P/u the driver vector 00519 INC HL 00520 LD D,(HL) 00521 XOR A 00522 EX DE,HL 00523 SBC HL,BC 00524 EX DE,HL 00525 JR NZ,NOTRES ;Go if not this driver 00526 INC HL 00527 INC HL 00528 INC HL ;Point to DCT+5 00529 LD A,(HL) 00530 CP (IY+5) ;Is this the same drive? 00531 JR NZ,NOTRES 00532 EXX 00533 INC B ;Bump the drive count 00534 EXX 00535 NOTRES POP HL 00536 LD DE,10 ;Advance to next one 00537 ADD HL,DE 00538 LD A,8*10+DCT$&0FFH 00539 CP L ;Done with DCTs? 00540 JR NZ,TSTDCT 00541 EXX ;Check how many drives! 00542 DEC B ;Is there only one? 00543 EXX 00544 JR NZ,HRDRV1 ;Only FORMAT if one!!! 00545 ;***** 00546 ; Hard drive format - most work done by controller 00547 ;***** 00548 HRDRV BIT 3,(IY+3) ;Check for floppy 00549 JR Z,AFLOP ;Go if a floppy 00550 LD HL,LAST$ ;Give one last chance to 00551 CALL GETARG ;Abort before wiping disk 00552 AND 5FH ;Make U/c 00553 CP 'Y' ;Must be yes to continue 00554 JP NZ,FMTABT 00555 AFLOP LD A,(SYSPRM+1) ;Bypass the formatting 00556 OR A ; if system info only 00557 JR NZ,HRDRV1 00558 LD HL,FMTG$ ;"formatting - be patient 00559 LD DE,0 ;Set up for no interleave 00560 BIT 3,(IY+3) ;Hard drive? 00561 JR NZ,GOFMT 00562 LD E,5 ;Set interleave for 5" 00563 BIT 5,(IY+3) ;5" floppy? 00564 JR Z,GOFMT 00565 LD E,5 ;Same, but patchable! 00566 GOFMT CALL FMTHD ;Format hard drive 00567 JP NZ,IOERR 00568 ENDIF 00569 ; 00570 ;*=*=* 00571 ; Clear out the BOOT space 00572 ;*=*=* 26BA 210033 00573 HRDRV1 LD HL,BOOT1 ;CLear the BOOT space 26BD 366D 00574 PATLP LD (HL),6DH ;Using 6DB6 pattern 26BF 2C 00575 INC L 26C0 36B6 00576 LD (HL),0B6H 26C2 2C 00577 INC L 26C3 7D 00578 LD A,L 26C4 FED0 00579 CP 208 26C6 20F5 00580 JR NZ,PATLP 00581 ;*=*=* 00582 ; Calculate sectors/track & sectors/cylinder 00583 ;*=*=* 26C8 FD7E07 00584 LD A,(IY+7) ;# of sectors/track 26CB 57 00585 LD D,A ;-> reg E 26CC E61F 00586 AND 1FH ;Strip # of heads 26CE 5F 00587 LD E,A 26CF 1C 00588 INC E ;Bump for 0 offset 26D0 320A31 00589 LD (SECTRK),A ;Stuff # sectors/track 26D3 AA 00590 XOR D 26D4 07 00591 RLCA ;Get # of heads 26D5 07 00592 RLCA ; into reg D 26D6 07 00593 RLCA 26D7 3C 00594 INC A ;Adjust for zero offset 26D8 CD1C2B 00595 CALL MULTEA@ 26DB FDCB046E 00596 BIT 5,(IY+4) ;Double tracking? 26DF 2801 00597 JR Z,$+3 26E1 87 00598 ADD A,A ;Twice the number 26E2 320931 00599 LD (SECCYL),A 00600 ;*=*=* 00601 ; Test if SYSTEM information only 00602 ;*=*=* 26E5 210000 00603 SYSPRM LD HL,0 ;P/u system info only 26E8 7C 00604 LD A,H ;Don't format if system 26E9 B5 00605 OR L ; info only is req 26EA C20E27 00606 JP NZ,DONTFMT 00607 ; 00608 IF LSI!MTI!ARM!TRS!PDC 00609 ;*=*=* 00610 ; Begin the formatting 00611 ;*=*=* 26ED 21222F 00612 LD HL,FMTCYL$ ;"formatting clinder... 26F0 CD022B 00613 CALL @DSPLY 26F3 1600 00614 BGNFMT LD D,0 ;Init to cyl 0 26F5 7A 00615 BFMT1 LD A,D ;P/u cylinder position 26F6 CDDE29 00616 CALL CVDEC ;Cvrt to decimal 26F9 D5 00617 PUSH DE ;Don't alter reg D 26FA CDF529 00618 CALL DSPCYL ;Display cyl # 26FD D1 00619 POP DE 00620 ENDIF 00621 ; 00622 IF MTI!TRS!PDC 26FE 210B31 00623 LD HL,SKEWDAT ;Point to skew table 00624 ENDIF 00625 ; 00626 IF LSI!MTI!ARM!TRS!PDC 2701 CDA629 00627 CALL WRCYL ;Cylinder write 2704 C2DB2A 00628 JP NZ,IOERR 2707 7A 00629 BFMT5 LD A,D ;Was this the last 2708 14 00630 INC D ; cylinder to format? 2709 FDBE06 00631 CP (IY+6) 270C 20E7 00632 JR NZ,BFMT1 00633 ENDIF 270E 00634 DONTFMT EQU $ 00635 ; 00636 IF LSI 00637 ;*=*=* 00638 ; Lockout the alternate cylinder 00639 ;*=*=* 00640 LD HL,ALTLO$ ;"Inhibiting... 00641 CALL @DSPLY 00642 LD HL,GATBUF+77 00643 LD (HL),0FFH 00644 ENDIF 00645 ; 00646 ;**** Lock out CYL #1 on TRS or PERCOM for diagnostics. 00647 IF TRS!PDC 270E 21C92E 00648 LD HL,DIAG$ 2711 CD022B 00649 CALL @DSPLY 2714 210132 00650 LD HL,GATBUF+1 2717 36FF 00651 LD (HL),0FFH 00652 ENDIF 00653 ; 2719 11FFFF 00654 VERPRM LD DE,-1 ;P/u verify parm 271C 7A 00655 LD A,D ;If 0, don't verify 271D B3 00656 OR E 271E CAB627 00657 JP Z,DONTVER 00658 ;***** 00659 ; Begin the verification process 00660 ;***** 2721 213B2F 00661 LD HL,VERCYL$ ;"Verifying cylinder... 2724 CD022B 00662 CALL @DSPLY 2727 1600 00663 LD D,0 ;Init cylinder ctr 2729 6A 00664 BVER1 LD L,D ;Pt to GAT byte for this 272A 2632 00665 LD H,GATBUF<-8 ; track & bypass verify 272C 7E 00666 LD A,(HL) ; if track not formatted 272D 3C 00667 INC A 272E 283F 00668 JR Z,BVER8 2730 7A 00669 LD A,D ;If this is the DIR cyl, 00670 ; 00671 IF MTI!LSI!ARM!TRS!PDC 2731 FDBE09 00672 CP (IY+9) ; use VERSYS, else VERSEC 2734 21AE29 00673 LD HL,WRSEC ;Init for reg sector 2737 2003 00674 JR NZ,$+5 2739 21B329 00675 LD HL,WRSYS ;Init for system sector 273C 225B27 00676 LD (BVER2W+1),HL ;Stuff vector 273F 21BD29 00677 LD HL,VERSEC 2742 2003 00678 JR NZ,$+5 2744 21C229 00679 LD HL,VERSYS 2747 225E27 00680 LD (BVER2V+1),HL 00681 ENDIF 00682 ; 274A CDDE29 00683 CALL CVDEC ;Cvrt to decimal 274D D5 00684 PUSH DE 274E CDF529 00685 CALL DSPCYL ;Display cylinder # 2751 D1 00686 POP DE 2752 AF 00687 XOR A ;Initialize starting 2753 326327 00688 LD (BVER5+1),A ; sector 2756 5F 00689 LD E,A 2757 210033 00690 BVER2 LD HL,BOOT1 ;Point to buffer 00691 ; 00692 IF LDI 00693 BIT 3,(IY+3) ;Only WRSEC a hard disk * 00694 CALL NZ,WRSEC ;Write first then... 00695 CALL Z,VERSEC ;SECtor or SYStem verify 00696 ENDIF 00697 ; 00698 IF MTI!LSI!ARM!TRS!PDC 275A CDAE29 00699 BVER2W CALL WRSEC ;Write first then... 275D CCBD29 00700 BVER2V CALL Z,VERSEC ;SECtor or SYStem verify 00701 ENDIF 00702 ; 2760 2016 00703 JR NZ,BVER9 ;Go on error 2762 3E00 00704 BVER5 LD A,0 ;P/u sector # 2764 3C 00705 INC A ;Bump it up 2765 326327 00706 BVER6 LD (BVER5+1),A ; and save new # 2768 5F 00707 LD E,A ;Xfer to sector register 2769 3A0931 00708 LD A,(SECCYL) ;Is this = a cyl? 276C BB 00709 CP E 276D 20E8 00710 JR NZ,BVER2 ;Go if cyl not done 00711 ;*=*=* 00712 ; Readjust for end of cylinder 00713 ;*=*=* 276F 7A 00714 BVER8 LD A,D ;P/u current cyl position 2770 14 00715 INC D ;Bump to next cyl 2771 FDBE06 00716 CP (IY+6) ;Cp to highest # cyl 2774 20B3 00717 JR NZ,BVER1 ;Go if more to verify 00718 ; 00719 IF LDI 00720 ;*=*=* 00721 ; If a floppy, then do the lockout table 00722 ;*=*=* 00723 BIT 3,(IY+3) ;If floppy, make a 00724 JR NZ,CALCDIR ; lockout, else skip * 00725 LD HL,GATBUF ;Allocation table 00726 LD DE,GATBUF+60H ;Lockout table 00727 LD B,0 ;High order length 00728 LD C,(IY+6) ;# of cyls 00729 INC C ;Adj for zero offset 00730 LDIR 00731 ENDIF 00732 ; 2776 183E 00733 JR CALCDIR ;Go start system info 00734 ;*=*=* 00735 ; Got verify error 00736 ;*=*=* 2778 00737 BVER9 EQU $ 00738 ; 00739 IF LDI 00740 BIT 3,(IY+3) ;If floppy, only l/o 00741 JR NZ,BVER9A ; error 4 & 5 00742 CP 5 ;Data rec not found? 00743 JR Z,BVER10 00744 CP 4 ;Parity error? 00745 JP NZ,IOERR 00746 JR BVER10 00747 BVER9A EQU $ 00748 ENDIF 00749 ; 2778 FE08 00750 CP 8 ;Hard, l/o all except 277A CADB2A 00751 JP Z,IOERR ; device not avail... 277D FE10 00752 CP 16 ; & all > 15 277F D2DB2A 00753 JP NC,IOERR 00754 ;*=*=* 00755 ; Lockout granule (hard) or cylinder (floppy) 00756 ;*=*=* 2782 D5 00757 BVER10 PUSH DE 2783 21542F 00758 LD HL,STAR$ ;Show the * lockout 2786 CD022B 00759 CALL @DSPLY 2789 D1 00760 POP DE 278A 6A 00761 LD L,D 278B 2632 00762 LD H,GATBUF<-8 278D FDCB035E 00763 BIT 3,(IY+3) ;If hard drive, then 2791 2004 00764 JR NZ,BVER11 ; only lockout gran 2793 36FF 00765 LD (HL),0FFH ;Lockout this cylinder 2795 18D8 00766 JR BVER8 ; its a floppy... 00767 ;*=*=* 00768 ; Bad sector on hard drive - Lockout the Granule 00769 ;*=*=* 2797 FD7E08 00770 BVER11 LD A,(IY+8) ;Get # of sectors/gran 279A D5 00771 PUSH DE ;Save this reg 279B E61F 00772 AND 1FH 279D 3C 00773 INC A ;Adj for zero offset 279E CD212B 00774 CALL DIVEA@ ;Calc which granule 27A1 F5 00775 PUSH AF ;Save gran # 27A2 5E 00776 LD E,(HL) ;P/u current GAT byte 27A3 CD8D2A 00777 CALL SETBIT ;Show gran allocated 27A6 73 00778 LD (HL),E ;Restuff into GAT 27A7 FD7E08 00779 LD A,(IY+8) ;Now point to next sector 27AA E61F 00780 AND 1FH 27AC 3C 00781 INC A 27AD 5F 00782 LD E,A ;Xfer SPG to reg E 27AE F1 00783 POP AF ;Rcvr # of bad gran 27AF 3C 00784 INC A ;Bump to start on next * 27B0 CD1C2B 00785 CALL MULTEA@ ;Calc 1st sector of 27B3 D1 00786 POP DE ; next gran & continue 27B4 18AF 00787 JR BVER6 ; 27B6 00788 DONTVER EQU $ 00789 ;***** 00790 ; Perform expanding binary search to find 00791 ; a cylinder available for the directory 00792 ; but start with suggested cylinder 00793 ;***** 27B6 3E0D 00794 CALCDIR LD A,CR ;Close the display line 27B8 CDFB2A 00795 CALL @DSP 00796 ; 00797 IF LSI ;Laredo must use this cyl 00798 LD L,(IY+9) ;P/u recommended dir cyl 00799 ENDIF 00800 ; 00801 IF .NOT.LSI 27BB FD6E06 00802 LD L,(IY+6) ;P/u highest # cyl 27BE 2C 00803 INC L ;Bump for 0 offset 27BF CB3D 00804 SRL L ;Find midpoint 00805 ENDIF 00806 ; 27C1 0E00 00807 LD C,0 ;Point to GAT byte for 27C3 2632 00808 LD H,GATBUF<-8 ; this cylinder 27C5 3E00 00809 CALC1 LD A,0 ;P/u default GAT byte 27C7 BE 00810 CP (HL) ;Is this cylinder locked? 27C8 2819 00811 JR Z,GENSYS ;Bypass if available 27CA 0C 00812 INC C ;Bump C 27CB 79 00813 LD A,C 27CC 0F 00814 RRCA ;Test if odd or even 27CD 7D 00815 LD A,L ;Get current test pos 27CE 3009 00816 JR NC,CALC2 ;Jump if C was even 27D0 81 00817 ADD A,C ;Add to previous pos 27D1 6F 00818 LD L,A 27D2 FDBE06 00819 CP (IY+6) ;Go over the top? 27D5 20EE 00820 JR NZ,CALC1 ;Loop if not 27D7 1804 00821 JR CALC3 ;Else abort 27D9 91 00822 CALC2 SUB C ;Try a lower cylinder # 27DA 6F 00823 LD L,A 27DB 20E8 00824 JR NZ,CALC1 ;At cylinder 0? 27DD 21592F 00825 CALC3 LD HL,NOCYL$ ;"No dir space avail... 27E0 C3BF2A 00826 JP FMTABT 00827 ;*=*=* 00828 ; Generate the system initialization 00829 ;*=*=* 27E3 FD7509 00830 GENSYS LD (IY+9),L ;Stuff the dir cyl 27E6 7D 00831 LD A,L 27E7 CDDE29 00832 CALL CVDEC ;Cvrt reg A to 3 dec digs 27EA ED43A42F 00833 LD (DIRASC$),BC ;Stuff into the message 27EE 32A62F 00834 LD (DIRASC$+2),A 27F1 217F2F 00835 LD HL,DIRCYL$ ;"Dir will be placed... 27F4 CD022B 00836 CALL @DSPLY 27F7 21A82F 00837 LD HL,IPLSYS$ ;"Initializing... 27FA CD022B 00838 CALL @DSPLY 27FD 210032 00839 LD HL,GATBUF 2800 7E 00840 LD A,(HL) ;P/u GAT byte for 1st 2801 F601 00841 OR 1 ;Cylinder & show 1st 2803 77 00842 LD (HL),A ;Gran in use for BOOTs 2804 FD7E09 00843 LD A,(IY+9) ;Dir cyl # into DIR/SYS 2807 32F530 00844 LD (DIRDIR+16H),A 280A 6F 00845 LD L,A ;Show entire directory 280B 36FF 00846 LD (HL),0FFH ;Cylinder locked out 00847 ;*=*=* 00848 ; Update BOOT for DIR 00849 ;*=*=* 280D 110000 00850 LD DE,0 ;Init for cyl 0, sect 0 2810 CDBD29 00851 CALL VERSEC ;Test if formatted 2813 C2AF2A 00852 JP NZ,NOTFMT ;Error if not 2816 210033 00853 LD HL,BOOT1 ;Pt to R/S E/I BOOT rtn 2819 0E00 00854 LD C,0 281B CD2E2B 00855 CALL RDSECT@ ;Read BOOT1 from Drive 0 281E C2DB2A 00856 JP NZ,IOERR 2821 FD7E09 00857 LD A,(IY+9) ;Dir cyl into BOOT 2824 320233 00858 LD (BOOT1+2),A 2827 CDAE29 00859 CALL WRSEC ;Write R/S BOOT sector 282A C2DB2A 00860 JP NZ,IOERR 282D CDBD29 00861 CALL VERSEC ;Verify after write 2830 C2DB2A 00862 JP NZ,IOERR 2833 CD982A 00863 CALL DOT ;Show "." 2836 110100 00864 LD DE,1 ;Pt to cyl 0, sector 1 2839 0E00 00865 LD C,0 ;Refer to drive 0 283B CD2E2B 00866 CALL RDSECT@ ;Read the real BOOT 283E C2DB2A 00867 JP NZ,IOERR 2841 FD7E09 00868 LD A,(IY+9) ;Dir cyl into BOOT 2844 320233 00869 LD (BOOT1+2),A 2847 CDAE29 00870 CALL WRSEC ;Write 0/1 284A C2DB2A 00871 JP NZ,IOERR 284D CDBD29 00872 CALL VERSEC ;Verify after write 2850 C2DB2A 00873 JP NZ,IOERR 2853 CD982A 00874 CALL DOT 00875 ;*=*=* 00876 ; Complete GAT construction 00877 ;*=*=* 2856 FD7E06 00878 LD A,(IY+6) ;P/u highest # cylinder 2859 D622 00879 SUB 22H ;Adj offset from 34 285B 32CC32 00880 LD (GATBUF+0CCH),A ;Stuff GAT cyl excess 285E FD7E04 00881 LD A,(IY+4) ;P/u sec siz & # of sides 2861 E6A0 00882 AND 80H+20H 2863 47 00883 LD B,A 2864 FD7E03 00884 LD A,(IY+3) ;P/u density 2867 E640 00885 AND 40H 2869 B0 00886 OR B 286A 47 00887 LD B,A 286B FD7E08 00888 LD A,(IY+8) ;P/u # of grans/cyl 286E 07 00889 RLCA 286F 07 00890 RLCA 2870 07 00891 RLCA 2871 E607 00892 AND 7 2873 323529 00893 LD (CYLGRN+1),A 2876 B0 00894 OR B ;Merge the two 00895 IF RAM 2877 F688 00896 OR 88H ;Set DATA disk bit 00897 ENDIF 2879 32CD32 00898 LD (GATBUF+0CDH),A ;Stuff into GAT 00899 ; 287C 11F532 00900 LD DE,GATBUF+255-10;6.2 Media Data Block 287F 219328 00901 LD HL,LSIID ;Point to header 2882 010400 00902 LD BC,04 ;Set length 2885 EDB0 00903 LDIR ; move it 2887 FDE5 00904 PUSH IY 2889 E1 00905 POP HL ;This drive's DCT 288A 23 00906 INC HL 288B 23 00907 INC HL 288C 23 00908 INC HL ;Bypass the JP addr 288D 0E07 00909 LD C,7 ; bytes to move 288F EDB0 00910 LDIR ; move it in 2891 1804 00911 JR WRGAT1 ;Skip around string 2893 03 00912 LSIID DB 03,'LSI' 4C 53 49 00913 ; 00914 ;*=*=* 00915 ; Write copy of GAT into 0/3 00916 ;*=*=* 00917 WRGAT1 2897 210032 00918 LD HL,GATBUF ;Pt to GAT buffer 289A 1600 00919 LD D,0 ;Write it out to 289C 1E03 00920 LD E,3 ;Cyl 0, sector 3 289E CDAE29 00921 CALL WRSEC ;Write 0/3 28A1 C2DB2A 00922 JP NZ,IOERR 28A4 CDBD29 00923 CALL VERSEC ;Verify after write 28A7 C2DB2A 00924 JP NZ,IOERR 28AA CD982A 00925 CALL DOT 00926 ;*=*=* 00927 ; Write the config sector 0/2 00928 ;*=*=* 28AD 210034 00929 LD HL,HITBUF ;Zero out buffer 28B0 3600 00930 GSYS1 LD (HL),0 28B2 2C 00931 INC L 28B3 20FB 00932 JR NZ,GSYS1 28B5 210034 00933 LD HL,HITBUF ;Set first byte to xx 28B8 3663 00934 LD (HL),RLS ;For release number 28BA 110200 00935 LD DE,2 ;Pt to cyl 0, sector 2 28BD CDAE29 00936 CALL WRSEC ;Write 0/2 28C0 C2DB2A 00937 JP NZ,IOERR 28C3 CDBD29 00938 CALL VERSEC ;Verify after write 28C6 C2DB2A 00939 JP NZ,IOERR 28C9 CD982A 00940 CALL DOT 00941 ;*=*=* 00942 ; Write the Granule Allocation Table 00943 ;*=*=* 28CC 210032 00944 LD HL,GATBUF ;Pt to GAT sector buffer 28CF FD5609 00945 LD D,(IY+9) ;P/u the dir cyl 28D2 1E00 00946 LD E,0 ;Denote sector 0 28D4 CDB329 00947 CALL WRSYS ;Write the GAT 28D7 C2DB2A 00948 JP NZ,IOERR 28DA CDC229 00949 CALL VERSYS ;Verify the GAT 28DD C2DB2A 00950 JP NZ,IOERR 28E0 CD982A 00951 CALL DOT 00952 ;*=*=* 00953 ; Construct the HIT 00954 ;*=*=* 28E3 210034 00955 LD HL,HITBUF ;Point to the HIT buffer 28E6 36A2 00956 LD (HL),0A2H ;Stuff BOOT/SYS hash code 28E8 23 00957 INC HL 28E9 36C4 00958 LD (HL),0C4H ;Stuff DIR/SYS hash code 28EB 2B 00959 DEC HL 28EC FD5609 00960 LD D,(IY+9) ;P/u dir cyl # 28EF 1E01 00961 LD E,1 ;Pt to sector 1 28F1 CDB329 00962 CALL WRSYS ;Write the HIT 28F4 C2DB2A 00963 JP NZ,IOERR 28F7 CDC229 00964 CALL VERSYS ;Verify after write 28FA C2DB2A 00965 JP NZ,IOERR 28FD CD982A 00966 CALL DOT 2900 110034 00967 LD DE,HITBUF ;Establish buffer for 2903 21BF30 00968 LD HL,BOOTDIR ;Dir records 2906 012000 00969 LD BC,32 ;Move BOOT/SYS dir record 2909 EDB0 00970 LDIR ; into 1st slot 290B FD5609 00971 LD D,(IY+9) ;P/u dir cyl 290E 1E02 00972 LD E,2 ;This will be sector 2 2910 210034 00973 LD HL,HITBUF ;Pt to buffer start 2913 CDB329 00974 CALL WRSYS ;Write the sector 2916 C2DB2A 00975 JP NZ,IOERR 2919 CDC229 00976 CALL VERSYS ;Verify after write 291C C2DB2A 00977 JP NZ,IOERR 291F CD982A 00978 CALL DOT 2922 3A0931 00979 LD A,(SECCYL) ;P/u # of records 2925 B7 00980 OR A ;If 256 SPC, then 2926 2804 00981 JR Z,USE34 ; the CP won't work 2928 FE23 00982 CP 35 292A 3805 00983 JR C,STUFSPC 292C 3E22 00984 USE34 LD A,34 ;Max # of sectors 292E 320931 00985 LD (SECCYL),A 2931 32F330 00986 STUFSPC LD (DIRDIR+14H),A ;& stuff into DIR/SYS 2934 3E00 00987 CYLGRN LD A,0 ;P/u # grans/cyl 2936 FDCB046E 00988 BIT 5,(IY+4) ;Test 2-sided 293A 2802 00989 JR Z,$+4 293C 87 00990 ADD A,A ;Double count on 2-sided 293D 3C 00991 INC A ;Plus 1 for 0 offset adj 293E 32F630 00992 LD (DIRDIR+23),A ;Stuff in DIR/SYS 2941 FD7E09 00993 LD A,(IY+9) ;P/u the dir cyl # & 2944 32F530 00994 LD (DIRDIR+16H),A ; stuff into the DIR rec 2947 21DF30 00995 LD HL,DIRDIR ;Pt to start of DIR data 294A 110034 00996 LD DE,HITBUF ;Pt to start of dir buf 294D 012000 00997 LD BC,32 ;Move DIR/SYS into buf 2950 EDB0 00998 LDIR 2952 FD5609 00999 LD D,(IY+9) ;P/u dir cyl # 2955 1E03 01000 LD E,3 ;Write as sector 3 2957 210034 01001 LD HL,HITBUF ;Pt to start of buffer 295A CDB329 01002 CALL WRSYS ;Write the sector 295D C2DB2A 01003 JP NZ,IOERR 2960 CDC229 01004 CALL VERSYS ;Verify after write 2963 C2DB2A 01005 JP NZ,IOERR 2966 CD982A 01006 CALL DOT 2969 210034 01007 LD HL,HITBUF ;Zero the 1st 32 bytes 296C 0620 01008 LD B,32 ;Of the buffer to clear 296E 3600 01009 GSYS2 LD (HL),0 ;Where we stuffed the 2970 23 01010 INC HL ;BOOT & DIR dir records 2971 10FB 01011 DJNZ GSYS2 2973 FD5609 01012 LD D,(IY+9) ;P/u dir cyl # 2976 1E04 01013 LD E,4 ;Cont writing at sect 4 2978 210034 01014 GSYS3 LD HL,HITBUF ;Pt to start of buffer 297B CDB329 01015 CALL WRSYS ;Write the sector 297E C2DB2A 01016 JP NZ,IOERR 2981 CDC229 01017 CALL VERSYS ;Verify the sector 2984 C2DB2A 01018 JP NZ,IOERR 01019 ;*=*=* 01020 ; Write the remaining directory 01021 ;*=*=* 2987 D5 01022 PUSH DE ;Save cyl/sect 2988 CD982A 01023 CALL DOT ;Display a dot for each 298B D1 01024 POP DE ;Directory sector 298C 1C 01025 INC E ;Bump the sector pointer 298D 3A0931 01026 LD A,(SECCYL) ;P/u highest # sector 2990 BB 01027 CP E ;Are we finished yet? 2991 20E5 01028 JR NZ,GSYS3 ;Loop if not 2993 DD2A2A2C 01029 LD IX,(DCTPTR) ;Real DCT for drive 2997 FD7E09 01030 LD A,(IY+9) ;DIR posn 299A DD7709 01031 LD (IX+9),A ;Update for system 01032 ;*=*=* 01033 ; exit procedures 01034 ;*=*=* 299D 21CA2F 01035 LD HL,FMTCAO$ ;"Formatting complete... 29A0 CD182B 01036 CALL @LOGOT 29A3 C3F62A 01037 JP @EXIT 01038 ;***** 01039 ; disk I/O requests 01040 ;***** 29A6 C5 01041 WRCYL PUSH BC 29A7 060F 01042 LD B,15 ;Write track 01043 IF TRS!PDC 29A9 CD542B 01044 CALL FMTDVR ;WRCYL code in formatter 29AC C1 01045 POP BC 29AD C9 01046 RET 01047 ELSE 01048 JR DISKIO 01049 ENDIF 01050 ; 01051 IF LDI 01052 FMTHD PUSH BC 01053 LD B,12 ;Format hard disk 01054 JR DISKIO 01055 ENDIF 01056 ; 29AE C5 01057 WRSEC PUSH BC 29AF 060D 01058 LD B,13 ;Write data sector 29B1 181F 01059 JR DISKIO 29B3 C5 01060 WRSYS PUSH BC 29B4 060E 01061 LD B,14 ;Write system sector 29B6 181A 01062 JR DISKIO 29B8 C5 01063 RDSEC PUSH BC 29B9 0609 01064 LD B,9 ;Read data sector 29BB 1815 01065 JR DISKIO 29BD C5 01066 VERSEC PUSH BC 29BE 060A 01067 LD B,10 ;Verify a sector 29C0 1810 01068 JR DISKIO 01069 ;***** 01070 ; Perform a verification to ensure system sector 01071 ;***** 29C2 CDBD29 01072 VERSYS CALL VERSEC ;Sector verify 29C5 2806 01073 JR Z,VERS1 ;Bypass if not system 29C7 D606 01074 SUB 6 ;Test read system retcod 29C9 C8 01075 RET Z ;Go if that's what it was 29CA C606 01076 ADD A,6 ;Restore orig retcod 29CC C9 01077 RET 29CD F601 01078 VERS1 OR 1 ;S/b system, found data 29CF 3E00 01079 LD A,0 29D1 C9 01080 RET 01081 ; 29D2 0EFF 01082 DISKIO LD C,-1 ;P/u drive # 29D4 3E20 01083 LD A,32 ;Init to illegal drive 29D6 B7 01084 OR A 29D7 CDDC29 01085 CALL GOIO ;Go after DCT vector 29DA C1 01086 POP BC 29DB C9 01087 RET 29DC FDE9 01088 GOIO JP (IY) ;Vector to DCT 01089 ; 01090 ;***** 01091 ; routine to convert reg A to 3 decimal digits 01092 ; in registers C B A 01093 ;***** 29DE 0E30 01094 CVDEC LD C,'0' ;Init to count 100's 29E0 D664 01095 CVD1 SUB 100 ;How many hundreds? 29E2 3803 01096 JR C,CVD2 ;Go if no more 29E4 0C 01097 INC C ;Else bump & loop 29E5 18F9 01098 JR CVD1 29E7 C664 01099 CVD2 ADD A,100 ;Adjust for underflow 29E9 0630 01100 LD B,30H 29EB D60A 01101 CVD3 SUB 10 ;How many 10s 29ED 3803 01102 JR C,CVD4 ;Go if underflow 29EF 04 01103 INC B ;Bump 10s 29F0 18F9 01104 JR CVD3 ;Loop for more 29F2 C63A 01105 CVD4 ADD A,3AH ;Adjust units place 29F4 C9 01106 RET 01107 ;*=*=* 01108 ; display cyl # 29F5 F5 01109 DSPCYL PUSH AF ;Save units place 29F6 C5 01110 PUSH BC ;Save tens/hundreds 29F7 0603 01111 LD B,3 29F9 3E08 01112 LD A,8 29FB CDFB2A 01113 BKUP CALL @DSP ;Backspace 3 29FE 10FB 01114 DJNZ BKUP 2A00 C1 01115 POP BC 2A01 79 01116 LD A,C 2A02 CDFB2A 01117 CALL @DSP ;Display hundreds 2A05 78 01118 LD A,B 2A06 CDFB2A 01119 CALL @DSP ;Display tens 2A09 F1 01120 POP AF ;Get back units 2A0A CDFB2A 01121 CALL @DSP ;Display units 2A0D C9 01122 RET 01123 ;***** 01124 ; Hash a diskette password 01125 ;***** 2A0E CD1D2A 01126 CKMPW CALL CKMPW0 2A11 C0 01127 RET NZ 2A12 CD1A2A 01128 CALL HASHMPW 01129 ; 01130 IF RAM 2A15 C2DB2A 01131 JP NZ,IOERR 01132 ENDIF 01133 ; 2A18 AF 01134 XOR A 2A19 C9 01135 RET 01136 ; 2A1A 3EE4 01137 HASHMPW LD A,0E4H 2A1C EF 01138 RST 28H 01139 ; 2A1D 0608 01140 CKMPW0 LD B,8 2A1F D5 01141 PUSH DE 2A20 E1 01142 POP HL 2A21 7E 01143 LD A,(HL) ;P/u 1st char 2A22 180E 01144 JR CKMPW2 ; & check2A24 23 01145 CKMPW1 INC HL 2A25 7E 01146 LD A,(HL) 2A26 FE20 01147 CP ' ' 2A28 2818 01148 JR Z,CKMPW7 2A2A FE30 01149 CP '0' 2A2C 3818 01150 JR C,INVMPW 2A2E FE3A 01151 CP '9'+1 2A30 3808 01152 JR C,CKMPW3 2A32 FE41 01153 CKMPW2 CP 'A' 2A34 3810 01154 JR C,INVMPW 2A36 FE5B 01155 CP 'Z'+1 2A38 300C 01156 JR NC,INVMPW 2A3A 10E8 01157 CKMPW3 DJNZ CKMPW1 2A3C AF 01158 XOR A ;All OK 2A3D C9 01159 RET 2A3E 23 01160 CKMPW5 INC HL 2A3F BE 01161 CP (HL) ;No imbedded spaces 2A40 2004 01162 JR NZ,INVMPW 2A42 10FA 01163 CKMPW7 DJNZ CKMPW5 2A44 AF 01164 XOR A ;All OK 2A45 C9 01165 RET 2A46 21DF2F 01166 INVMPW LD HL,BADMPW$ 2A49 3E3F 01167 LD A,63 ;Indicate extended error 2A4B B7 01168 OR A ;Set NZ 2A4C C9 01169 RET 01170 ;***** 01171 ; Routines to convert input strings to uc 01172 ;***** 2A4D 0601 01173 GETARG LD B,1 ;1 char input 2A4F CD022B 01174 GETARGX CALL @DSPLY ;B chars input 2A52 0E00 01175 LD C,0 2A54 210034 01176 LD HL,HITBUF ;Buffer area 2A57 CD102B 01177 INPT CALL @KEYIN ;Enter them 2A5A DABF2A 01178 JP C,FMTABT ;Break pressed! 2A5D 78 01179 LD A,B 2A5E B7 01180 OR A 2A5F C8 01181 RET Z ;No input 01182 ; convert input line to U/C 2A60 C5 01183 PUSH BC 2A61 E5 01184 PUSH HL 2A62 7E 01185 GETUC LD A,(HL) 2A63 FE61 01186 CP 'a' 2A65 3803 01187 JR C,UC2 2A67 E65F 01188 AND 5FH ;Make U/C 2A69 77 01189 LD (HL),A 2A6A 23 01190 UC2 INC HL 2A6B 10F5 01191 DJNZ GETUC ;Do entire input 2A6D E1 01192 POP HL 2A6E C1 01193 POP BC 2A6F 7E 01194 LD A,(HL) ;P/u one char 2A70 B7 01195 OR A ;Make NZ 2A71 C9 01196 RET 01197 ; 2A72 0608 01198 INPMPW LD B,8 ;Max chars 2A74 CD4F2A 01199 CALL GETARGX ;Input U/C into HITBUF 2A77 C8 01200 RET Z ;If no input 2A78 11532D 01201 LD DE,MPWBUF ;Then move to MPWBUF 2A7B D5 01202 PUSH DE 2A7C 3E09 01203 LD A,9 ;An extra char means we don't 2A7E 90 01204 SUB B ;Have to check for zero here 2A7F 48 01205 LD C,B 2A80 0600 01206 LD B,0 ;Xfer length 2A82 EDB0 01207 LDIR ;Move input 2A84 47 01208 LD B,A ;Chars needed 2A85 3E20 01209 LD A,' ' ;Load a blank 2A87 12 01210 FILLBLK LD (DE),A ;Padd response 2A88 13 01211 INC DE 2A89 10FC 01212 DJNZ FILLBLK 2A8B E1 01213 POP HL ;=>string 2A8C C9 01214 RET 01215 ; 01216 ;*=*=* 01217 ; Routine to set a bit 01218 ;*=*=* 2A8D 07 01219 SETBIT RLCA ;Shift to "b" field 2A8E 07 01220 RLCA 2A8F 07 01221 RLCA 2A90 F6C3 01222 OR 0C3H ;Establish as SET b,E 2A92 32962A 01223 LD (SBIT1+1),A ;Alter the OP code 2A95 CBC3 01224 SBIT1 SET 0,E ;Turn on the bit 2A97 C9 01225 RET 01226 ;*=*=* 01227 ; print one "." 01228 ;*=*=* 2A98 3E2E 01229 DOT LD A,'.' 2A9A C3FB2A 01230 JP @DSP 01231 ;***** 01232 ; Temporary storage space for format drive DCT 01233 ;***** 2A9D 01234 TMPDCT DS 10 01235 ;***** 01236 ; Parm error exit 01237 ;***** 2AA7 21DC2D 01238 BADNAM LD HL,BADNAM$ 2AAA DD 01239 DB 0DDH 2AAB 215430 01240 DIFDVR LD HL,DIFDVR$ ;Driver mismatch... 2AAE DD 01241 DB 0DDH 2AAF 213430 01242 NOTFMT LD HL,NOTFMT$ 2AB2 DD 01243 DB 0DDH 2AB3 218F2D 01244 NOTZER LD HL,NOTZER$ ;Can't format drive 0 2AB6 DD 01245 DB 0DDH 2AB7 217D30 01246 ILLEG LD HL,ILLEG$ ;Drive is disabled 2ABA DD 01247 DB 0DDH 2ABB 21DF2F 01248 BADMPW LD HL,BADMPW$ ;Wrong MPW entered 2ABE DD 01249 DB 0DDH 2ABF 21F92F 01250 FMTABT LD HL,FMTABT$ 2AC2 DD 01251 DB 0DDH 2AC3 216E2D 01252 NOTHARD LD HL,HARD$ 2AC6 DD 01253 DB 0DDH 2AC7 215D2D 01254 PRMERR LD HL,PRMERR$ 2ACA CD182B 01255 CALL @LOGOT 2ACD C3F22A 01256 JP @ABORT 01257 ;*=*=* 01258 ; abort if JCL running 01259 IF RAM 0000 01260 SFLAG$ EQU 0 ;Stuffed by init code 01261 ENDIF 2AD0 00 01262 ABTJCL1 NOP ;Patchable w/RET 2AD1 F5 01263 ABTJCL PUSH AF 2AD2 3A0000 01264 LD A,(SFLAG$) 2AD3 01265 SFLAG EQU $-2 ;RAM version sets address 2AD5 CB6F 01266 BIT 5,A 2AD7 20E6 01267 JR NZ,FMTABT ;Log out 2AD9 F1 01268 POP AF 2ADA C9 01269 RET 01270 ; 2ADB F5 01271 IOERR PUSH AF ;Save error code 2ADC 3E0D 01272 LD A,CR 2ADE CDFB2A 01273 CALL @DSP ;Do a CR first 2AE1 F1 01274 POP AF 2AE2 6F 01275 LD L,A 2AE3 2600 01276 LD H,0 2AE5 F6C0 01277 OR 0C0H ;Mask 2AE7 4F 01278 LD C,A 2AE8 CD322B 01279 CALL @ERROR 01280 IF .NOT.RAM 01281 JP @ABORT 01282 ENDIF 01283 ;*=*=* 01284 ; 6.x exit routine follows.... 01285 ; provide compatible I/O routines for 6.x LDOS 01286 ; accomodate EDAS's insistance on resolving labels 01287 ;With MACRO expansion inside of FALSE conditionals 01288 ;By not using SVCMAC here 01289 IF RAM 0000 01290 MOD1 EQU 0 ;Keep EDAS happy when 0000 01291 MOD3 EQU 0 ;Evaluating .NOT.RAM option 01292 ;*=*=* 01293 ; system routines for RAM version of HD formatters 01294 ;*=*=* 2AEB 310000 01295 QUIT LD SP,$-$ 2AEC 01296 SPSAV EQU $-2 2AEE 3E6A 01297 LD A,106 2AF0 EF 01298 RST 40 2AF1 C9 01299 RET 2AF2 21FFFF 01300 @ABORT LD HL,-1 2AF5 DD 01301 DB 0DDH ;Make next inst IX 2AF6 210000 01302 @EXIT LD HL,0 2AF9 18F0 01303 JR QUIT 01304 ; 2AFB 4F 01305 @DSP LD C,A 2AFC 3E02 01306 LD A,2 2AFE EF 01307 RST 28H 2AFF C8 01308 RET Z 2B00 18D9 01309 JR IOERR 2B02 3E0A 01310 @DSPLY LD A,10 2B04 EF 01311 RST 28H 2B05 C8 01312 RET Z 2B06 18D3 01313 JR IOERR 01314 ; 2B08 3E60 01315 DECHEX LD A,96 2B0A EF 01316 RST 28H 2B0B C9 01317 RET 2B0C 3E61 01318 HEXDEC LD A,97 2B0E EF 01319 RST 28H 2B0F C9 01320 RET 2B10 3E09 01321 @KEYIN LD A,9 2B12 EF 01322 RST 28H 2B13 C9 01323 RET 2B14 3E11 01324 @PARAM LD A,17 2B16 EF 01325 RST 28H 2B17 C9 01326 RET 2B18 3E0C 01327 @LOGOT LD A,12 2B1A EF 01328 RST 28H 2B1B C9 01329 RET 2B1C 4F 01330 MULTEA@ LD C,A 2B1D 3E5A 01331 LD A,90 2B1F EF 01332 RST 28H 2B20 C9 01333 RET 2B21 4F 01334 DIVEA@ LD C,A 2B22 3E5D 01335 LD A,93 2B24 EF 01336 RST 28H 2B25 C9 01337 RET 2B26 3E51 01338 GETDCT@ LD A,81 2B28 EF 01339 RST 28H 2B29 C9 01340 RET 2B2A 3E12 01341 @DATE LD A,18 2B2C EF 01342 RST 28H 2B2D C9 01343 RET 2B2E 3E31 01344 RDSECT@ LD A,49 2B30 EF 01345 RST 28H 2B31 C9 01346 RET 2B32 3E1A 01347 @ERROR LD A,26 2B34 EF 01348 RST 28H 2B35 C9 01349 RET 01350 ; 01351 ;*=*=* 01352 ; entry point if 6.x 01353 ;*=*=* 01354 ; 01355 BEGIN 2B36 3E6A 01356 LD A,106 2B38 EF 01357 RST 40 2B39 2804 01358 JR Z,BEGINA ;Continue if no break 2B3B 21FFFF 01359 LD HL,-1 2B3E C9 01360 RET ; else abort 01361 ; 2B3F ED73EC2A 01362 BEGINA LD (SPSAV),SP ;Save callers stack 2B43 E5 01363 PUSH HL 2B44 3E65 01364 LD A,101 ;@@FLAGS 2B46 EF 01365 RST 28H ;Find SFLAG$ 2B47 111200 01366 LD DE,'S'-'A' ;Offset 2B4A FD19 01367 ADD IY,DE ;Calc byte address 2B4C FD22D32A 01368 LD (SFLAG),IY ;Save for JCL test 2B50 E1 01369 POP HL 2B51 C30024 01370 JP USER ;To pgm start 01371 ENDIF 01372 ; 01373 ;*=*=* 01374 IF .NOT.RAM ;Get version equates... 01375 ;Get correct EQU file 01378 IF MOD1 01381 ENDIF 01382 IF MOD3 01384 ENDIF 01386 ; 01387 ;*=*=* 01388 ; Routine to convert ascii =>HL to number in BC 01389 ;*=*=* 01390 DECHEX LD DE,0 ;Clear to start 01391 CXDEC LD A,(HL) ;P/u char 01392 SUB 30H ;To BCD 01393 CP 10 ;Must be less 01394 JR NC,DONECON ;End if not digit 01395 PUSH HL ;Save ascii ptr 01396 LD H,D 01397 LD L,E ;Merge digit 01398 ADD HL,HL 01399 ADD HL,HL 01400 ADD HL,DE 01401 ADD HL,HL 01402 EX DE,HL 01403 ADD A,E 01404 LD E,A 01405 LD A,0 01406 ADC A,D 01407 LD D,A 01408 POP HL 01409 INC HL ;Next char 01410 JR CXDEC 01411 DONECON PUSH DE 01412 POP BC ;Put answer in BC 01413 RET 01414 ; 01415 HEXDEC LD A,' ' ;Blank 01416 PUSH HL 01417 LD HL,TENTBL 01418 HDC1 LD C,(HL) 01419 INC HL 01420 LD B,(HL) 01421 INC HL 01422 EX (SP),HL 01423 PUSH DE 01424 LD D,A 01425 XOR A 01426 HDC2 INC A 01427 ADD HL,BC 01428 JR C,HDC2 01429 SBC HL,BC 01430 LD B,D 01431 POP DE 01432 DEC A 01433 JR NZ,HDC3 01434 INC C 01435 JR Z,HDC5 01436 DEC C 01437 LD A,B 01438 LD (DE),A 01439 JR HDC4 01440 HDC5 DEC C 01441 HDC3 ADD A,'0' 01442 LD (DE),A 01443 LD A,'0' 01444 HDC4 INC DE 01445 INC C 01446 EX (SP),HL 01447 JR NZ,HDC1 01448 POP HL 01449 RET 01450 TENTBL DW -10000,-1000,-100,-10,-1 01451 ; 01452 ENDIF 2B54 01453 *GET HDFMT3/ASM:3 01454 ;HDFMT3/ASM - HARD FORMAT module - 02/07/84 01455 ;Adjusted for WD1010 controller 12/12/83 01456 IF TRS!PDC 01457 ;Driver to handle FMT command w/WD controller 01458 IF TRS 00C0 01459 HARDWP EQU 0C0H 00C1 01460 HDCONT EQU 0C1H 00C8 01461 DATA EQU 0C8H ;Data transfer port 01462 ENDIF 01463 IF PDC 01464 DATA EQU 78H 01465 ENDIF 01466 ;*=*=* 01467 ; Calling Sequence 01468 ; B => disk command 01469 ; C => logical drive number 01470 ; D => logical cylinder number 01471 ; E => logical sector number 01472 ; HL => sector I/O buffer address 01473 ; IY => drive code table address 01474 ;*=*=* 01475 ; bit 2 => wait enable 01476 ; bit 3 => device enable 01477 ; bit 4 => software reset 01478 ;*=*=* 00C9 01479 ERROR EQU DATA+1 ;Error code port 00C9 01480 WRP EQU DATA+1 ;Write precompensation port 00CA 01481 SECNT EQU DATA+2 ;Sector count 00CB 01482 SECNO EQU DATA+3 ;Sector number port 00CC 01483 CYLLO EQU DATA+4 ;Cylinder lo 00CD 01484 CYLHI EQU DATA+5 ;Cylinder hi 00CE 01485 SDH EQU DATA+6 ;Size/Drive/Head port 00CF 01486 STATUS EQU DATA+7 ;Status port 00CF 01487 COMMAND EQU DATA+7 ;Command port 01488 ;*=*=* 01489 ; Western Digital Controller OP codes 01490 ; 01491 ; 0001rrrr - Restore drive 01492 ; 0111rrrr - Seek sector/head/cyl 01493 ; 0010d000 - Read sector 01494 ; 00110000 - Write sector 01495 ; 01010000 - Format track 01496 ; 01497 ; rrrr = step rate 01498 ; d = 0=programmed I/O, 1=DMA 01499 ;*=*=* 01500 ; Driver start 01501 ;*=*=* 01502 FMTDVR 01503 ;*=*=* 01504 IF TRS 2B54 FD7E03 01505 LD A,(IY+3) ;P/u drive address 2B57 E603 01506 AND 3 ; & remove other junk 2B59 4F 01507 LD C,A ;Save for counter 2B5A DBC0 01508 IN A,(HARDWP) ;P/u the front panel WP 2B5C DC 01509 DB 0DCH ;Ignore next 2 by CALL C, 2B5D 07 01510 ALIGN RLCA ;Align hard WP bit to b7 2B5E 0D 01511 DEC C ; according to drive 2B5F 20FC 01512 JR NZ,ALIGN ; address 2B61 FDB603 01513 OR (IY+3) ;Merge software WP 01514 ENDIF 01515 ; 01516 IF PDC 01517 LD A,(IY+3) ;Just dct bit 01518 ENDIF 01519 ; 2B64 E680 01520 AND 10000000B ;Mask all but bit 7 2B66 CB27 01521 SLA A ;Write prot to carry 2B68 3004 01522 JR NC,DFMT 2B6A 3E0F 01523 LD A,15 ;WP error 2B6C B7 01524 OR A 2B6D C9 01525 RET 01526 ; 01527 ;*=*=* 01528 ; Disk FORMAT routine 01529 ;*=*=* 2B6E E5 01530 DFMT PUSH HL 2B6F D5 01531 PUSH DE 2B70 FD7E07 01532 LD A,(IY+7) ;P/u max sector/track 2B73 47 01533 LD B,A 2B74 E61F 01534 AND 1FH 2B76 5F 01535 LD E,A ;Set it for controller 2B77 A8 01536 XOR B ;Get # of heads into 2B78 07 01537 RLCA ; register B for 2B79 07 01538 RLCA ; loop count of # of 2B7A 07 01539 RLCA ; tracks to format in 2B7B 3C 01540 INC A ;Bump for zero offset 2B7C FDCB046E 01541 BIT 5,(IY+4) ; this cylinder 2B80 2801 01542 JR Z,$+3 ;Double the count if 2B82 87 01543 ADD A,A ; double cylindering 2B83 47 01544 LD B,A ; 01545 ; 2B84 C5 01546 DFMT1 PUSH BC ;Save loop counter 2B85 D5 01547 PUSH DE ;Save sector # 2B86 CDCA2B 01548 CALL SETUPF ;Go to it 2B89 E5 01549 PUSH HL ;Save pointer 2B8A 7E 01550 LD A,(HL) ;P/u sector count 2B8B D3CA 01551 OUT (SECNT),A 2B8D 23 01552 INC HL ;Point to buffer 2B8E 3E50 01553 LD A,50H ;Set the FORMAT OP code 2B90 CD172C 01554 CALL DOCMD ;Do the command 2B93 E1 01555 POP HL 2B94 D1 01556 POP DE 2B95 C1 01557 POP BC 2B96 2009 01558 JR NZ,WRERR 01559 ; 2B98 3E20 01560 LD A,20H ;Bump sector # for next 2B9A 83 01561 ADD A,E ; head in cylinder 2B9B 5F 01562 LD E,A ;Pass to sector reg 2B9C 10E6 01563 DJNZ DFMT1 ;Loop all heads this cyl 2B9E AF 01564 XOR A ;No error today 2B9F 180D 01565 JR NOERROR ;Exit 01566 ; 2BA1 21C12B 01567 WRERR LD HL,WRTBL ;Point to error xlate 01568 ; 01569 ENDERR 01570 IF TRS 2BA4 CDB12B 01571 CALL WD1010 ;Clear controller 01572 ENDIF 2BA7 DBC9 01573 IN A,(ERROR) ;Grab error code 2BA9 07 01574 ERR1 RLCA ;Find error TYPE 2BAA 23 01575 INC HL ;Bump counter 2BAB 30FC 01576 JR NC,ERR1 ;Loop for error byte 2BAD 7E 01577 LD A,(HL) ;P/u error code 01578 ; 2BAE 01579 NOERROR EQU $ 2BAE D1 01580 ERREXIT POP DE 2BAF E1 01581 POP HL 2BB0 B7 01582 OR A ;Set flag 01583 IF TRS 2BB1 F5 01584 WD1010 PUSH AF 2BB2 DBCF 01585 IN A,(STATUS) 2BB4 E602 01586 AND 00000010B 2BB6 2808 01587 JR Z,CLEAN 2BB8 3E10 01588 LD A,10H 2BBA D3C1 01589 OUT (HDCONT),A 2BBC 3E0C 01590 LD A,0CH 2BBE D3C1 01591 OUT (HDCONT),A 2BC0 F1 01592 CLEAN POP AF 01593 ENDIF 2BC1 C9 01594 RET 01595 ;*=*=* 01596 ; LDOS error conversion table 01597 ; Bit Error RD WR 01598 ; 7 Bad block detect 7 14 01599 ; 6 CRC - Data field 4 12 01600 ; 5 CRC - ID field 1 9 01601 ; 4 ID not found 5 13 01602 ; 3 Not used 127 127 01603 ; 2 Aborted command 8 8 01604 ; 1 TR000 error 2 10 01605 ; 0 DAM not found 3 11 01606 ;*=*=* 2BC1 01607 WRTBL EQU $-1 2BC2 0E 01608 DB 14,12,9,13,127,8,10,11 0C 09 0D 7F 08 0A 0B 01609 ;*=*=* 01610 ; SETUP disk 01611 ; IY= DCT 01612 ; D = Cylinder # (0-202) 01613 ; E = Sector # (0-255) 01614 ;*=*=* 2BCA 01615 SETUPF EQU $ ;Wait until not busy 01616 ;*=*=* 01617 ; Select routine 01618 ;*=*=* 2BCA E5 01619 PUSH HL ;Save buffer pointer 01620 ;*=*=* 01621 ; Recalc cyl, sector to head, sector, cyl 01622 ;*=*=* 2BCB 6A 01623 RECALC LD L,D ;Xfer cylinder 2BCC 2600 01624 LD H,0 01625 ; 2BCE FDCB046E 01626 BIT 5,(IY+4) ;Double track? 2BD2 2801 01627 JR Z,$+3 ;Go if not 2BD4 29 01628 ADD HL,HL ;Cyl * 2 01629 ;***** 01630 ; Check on track advance 01631 ;***** 2BD5 FD7E07 01632 LD A,(IY+7) ;P/u sectors/track 2BD8 D5 01633 PUSH DE 2BD9 57 01634 LD D,A ;Hang on to value 2BDA E61F 01635 AND 1FH ;Strip off other data 2BDC 5F 01636 LD E,A 2BDD 1C 01637 INC E ;Adj for zero offset 2BDE 4B 01638 LD C,E ;Keep sec per track 2BDF AA 01639 XOR D ;Get # of heads 2BE0 07 01640 RLCA ;Shift heads to 0-2 2BE1 07 01641 RLCA 2BE2 07 01642 RLCA 2BE3 3C 01643 INC A ;Adjust for zero offset 2BE4 C5 01644 PUSH BC 2BE5 CD1C2B 01645 CALL MULTEA@ 2BE8 C1 01646 POP BC 2BE9 3D 01647 DEC A ;Adjust for compare 2BEA D1 01648 POP DE ;Rcvr sector 2BEB BB 01649 CP E ;Is sector on this track? 2BEC 3004 01650 JR NC,REC1 ;Bypass if yes 2BEE 2F 01651 CPL ;Else subtract off a 2BEF 83 01652 ADD A,E ; track's # of sectors 2BF0 5F 01653 LD E,A ;Reset sector # 2BF1 23 01654 INC HL ; and bump cyl # 2BF2 79 01655 REC1 LD A,C 2BF3 D5 01656 PUSH DE 2BF4 CD212B 01657 CALL DIVEA@ ;Sector#/sectors per head 2BF7 D1 01658 POP DE 2BF8 57 01659 LD D,A ;Xfer head # needed 2BF9 FD7E04 01660 LD A,(IY+4) ;P/u starting head 2BFC E60F 01661 AND 0FH ;Strip off other data 2BFE 82 01662 ADD A,D ;Add in relative head 2BFF 57 01663 LD D,A ;Point to physical head 01664 ;***** 01665 ; Xfer head, sector, & cylinder data to WDC 01666 ;***** 2C00 FD7E03 01667 LD A,(IY+3) ;Grab the drive select 2C03 E603 01668 AND 3 2C05 07 01669 RLCA ;Shift to bits 3-4 2C06 07 01670 RLCA 2C07 07 01671 RLCA 2C08 B2 01672 OR D ;Merge in head select 2C09 D3CE 01673 OUT (SDH),A ;Transfer to WDC 2C0B 3E0F 01674 LD A,0FH ;For 256 byte sectors 2C0D D3CB 01675 OUT (SECNO),A 2C0F 7D 01676 LD A,L 2C10 D3CC 01677 OUT (CYLLO),A 2C12 7C 01678 LD A,H 2C13 D3CD 01679 OUT (CYLHI),A 2C15 E1 01680 POP HL ;Rcvr buffer pointer 2C16 C9 01681 RET 01682 ;*=*=* 01683 ; Routine to pass WRITE Command to WDC & do it 01684 ;*=*=* 2C17 D3CF 01685 DOCMD OUT (COMMAND),A ; & pass to WDC 01686 ; 2C19 01C800 01687 LD BC,0<8!DATA ;Set length &port 2C1C EDB3 01688 OTIR ;Output the data 2C1E E3 01689 DWR1 EX (SP),HL ;Delay time to settle 2C1F E3 01690 EX (SP),HL ; the controller 01691 ; 2C20 DBCF 01692 DWR2 IN A,(STATUS) ;Wait until controller 2C22 07 01693 RLCA ; is no longer busy 2C23 38FB 01694 JR C,DWR2 2C25 DBCF 01695 IN A,(STATUS) ;Read command end status 2C27 E601 01696 AND 1 ;NZ=error 2C29 C9 01697 RET 01698 ENDIF 01699 ; 2C2A 0000 01700 DCTPTR DW 0 ;Posn of DCT for drive 2C2C 4C 01701 LOCK$ DB 'Lock out track manually ? ',3 6F 63 6B 20 6F 75 74 20 74 72 61 63 6B 20 6D 61 6E 75 61 6C 6C 79 20 3C 59 2F 4E 3E 20 3F 20 03 2C4D 45 01702 PHYHD$ DB 'Enter physical head number <' 6E 74 65 72 20 70 68 79 73 69 63 61 6C 20 68 65 61 64 20 6E 75 6D 62 65 72 20 3C 2C69 20 01703 PHYD1$ DB ' -' 2D 2C6B 20 01704 PHYD2$ DB ' > ',3 3E 20 03 2C6F 45 01705 PHYTR$ DB 'Enter physical track number <1 -' 6E 74 65 72 20 70 68 79 73 69 63 61 6C 20 74 72 61 63 6B 20 6E 75 6D 62 65 72 20 3C 31 20 20 2D 2C90 20 01706 PHYT1$ DB ' > ',3 20 20 20 20 3E 20 03 01707 IF RAM ;Use CLIENT/ASM 01708 ;DB for FORM$ and HELLO$ 2C98 24 01709 FORM$ DB '$HD1' 48 44 31 2C9C 54 01710 HELLO$ DB 'TRSFORM6 - W/D 1000/1010 - Hard Drive Formatter',LF 52 53 46 4F 52 4D 36 20 2D 20 57 2F 44 20 31 30 30 30 2F 31 30 31 30 20 2D 20 48 61 72 64 20 44 72 69 76 65 20 46 6F 72 6D 61 74 74 65 72 0A 2CCC 56 01711 DB 'Version ' 65 72 73 69 6F 6E 20 2CD4 01712 *GET CLIENT:3 01713 ;CLIENT/ASM - File to establish sign-on headers 01714 ; and version numbers. 01715 ; 01716 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 01717 ; 01718 IF @BLD631 01719 ; 12345678901234567890123456789012345678901234567890 2CD4 20 01720 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 2D06 49 01721 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 01722 ELSE 01723 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 01724 DB 'ems, Inc. ',10 01725 ENDIF 01726 ; 01727 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 01728 ; DB 'Corporation.',10,13 01729 ; 01730 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 01731 ; DB 'STRIBUTE !! ',10,13 01732 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 01733 ; DB 'ukee, Wisc. ',10,13 2D13 41 01734 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 2D45 72 01735 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 01736 ELSE ;Use macro definition if 5.1 ver. 01737 LOGON 01738 ENDIF 2D53 20 01739 MPWBUF DB ' ' ; must be 9 chars 20 20 20 20 20 20 20 20 20 2D5D 50 01740 PRMERR$ DB 'Parameter error ',CR 61 72 61 6D 65 74 65 72 20 65 72 72 6F 72 20 0D 2D6E 54 01741 HARD$ DB 'This format for Hard Drive only.',CR 68 69 73 20 66 6F 72 6D 61 74 20 66 6F 72 20 48 61 72 64 20 44 72 69 76 65 20 6F 6E 6C 79 2E 0D 2D8F 48 01742 NOTZER$ DB 'Hard drive cannot be drive 0.',CR 61 72 64 20 64 72 69 76 65 20 63 61 6E 6E 6F 74 20 62 65 20 64 72 69 76 65 20 30 2E 0D 2DAD 57 01743 WHDRV$ DB 'Which drive is to be used ? ',3 68 69 63 68 20 64 72 69 76 65 20 69 73 20 74 6F 20 62 65 20 75 73 65 64 20 3F 20 03 2DCA 44 01744 DSKNAM$ DB 'Disk Pack name ? ',3 69 73 6B 20 50 61 63 6B 20 6E 61 6D 65 20 3F 20 03 2DDC 49 01745 BADNAM$ DB 'Invalid Disk Pack name.',CR 6E 76 61 6C 69 64 20 44 69 73 6B 20 50 61 63 6B 20 6E 61 6D 65 2E 0D 2DF4 4D 01746 MPW$ DB 'Master password ? ',3 61 73 74 65 72 20 70 61 73 73 77 6F 72 64 20 3F 20 03 2E07 57 01747 CANTWR$ DB 'Write protected disk.',CR 72 69 74 65 20 70 72 6F 74 65 63 74 65 64 20 64 69 73 6B 2E 0D 2E1D 44 01748 HASDAT$ DB 'Disk contains data -- ',3 69 73 6B 20 63 6F 6E 74 61 69 6E 73 20 64 61 74 61 20 2D 2D 20 03 2E34 4E 01749 NOFMT$ DB 'Non-standard format.',CR 6F 6E 2D 73 74 61 6E 64 61 72 64 20 66 6F 72 6D 61 74 2E 0D 2E49 55 01750 CANTRD$ DB 'Unreadable directory.',CR 6E 72 65 61 64 61 62 6C 65 20 64 69 72 65 63 74 6F 72 79 2E 0D 2E5F 4E 01751 NODIR$ DB 'Non-initialized directory.',CR 6F 6E 2D 69 6E 69 74 69 61 6C 69 7A 65 64 20 64 69 72 65 63 74 6F 72 79 2E 0D 2E7A 4E 01752 PACKID$ DB 'Name=XXXXXXXX Date=MM/DD/YY',CR 61 6D 65 3D 58 58 58 58 58 58 58 58 20 20 44 61 74 65 3D 4D 4D 2F 44 44 2F 59 59 0D 2E97 20 01753 OLDMPW$ DB ' Enter its Master Password' 20 45 6E 74 65 72 20 69 74 73 20 4D 61 73 74 65 72 20 50 61 73 73 77 6F 72 64 2EB2 20 01754 DB ' or to abort: ',3 6F 72 20 3C 42 52 45 41 4B 3E 20 74 6F 20 61 62 6F 72 74 3A 20 03 01755 ; 01756 IF LDI 01757 LAST$ DB LF,'*** Preparing to format ENTIRE ' 01758 DB 'hard drive ***',LF 01759 DB 'Are you sure you want to format it? ',3 01760 FMTG$ DB 'Formatting...',CR 01761 ENDIF 01762 ; 01763 IF LSI 01764 ALTLO$ DB LF,'Inhibiting Alternate cylinder <#77>...',CR 01765 ENDIF 01766 ; 01767 IF TRS!PDC 2EC9 0A 01768 DIAG$ DB LF,'Inhibiting Diagnostic Cylinder <#01>...',CR 49 6E 68 69 62 69 74 69 6E 67 20 44 69 61 67 6E 6F 73 74 69 63 20 43 79 6C 69 6E 64 65 72 20 3C 23 30 31 3E 2E 2E 2E 0D 01769 ENDIF 01770 ; 2EF2 0A 01771 DBL$ DB LF,'Note: Each cylinder equals 2 physical' 4E 6F 74 65 3A 20 45 61 63 68 20 63 79 6C 69 6E 64 65 72 20 65 71 75 61 6C 73 20 32 20 70 68 79 73 69 63 61 6C 2F18 20 01772 DB ' tracks.',LF,CR 74 72 61 63 6B 73 2E 0A 0D 2F22 1D 01773 FMTCYL$ DB 29,'Formatting cylinder ',3 46 6F 72 6D 61 74 74 69 6E 67 20 63 79 6C 69 6E 64 65 72 20 20 20 20 03 2F3B 1D 01774 VERCYL$ DB 29,'Verifying cylinder ',3 56 65 72 69 66 79 69 6E 67 20 20 63 79 6C 69 6E 64 65 72 20 20 20 20 03 2F54 2A 01775 STAR$ DB '* ',3 20 20 20 03 2F59 4E 01776 NOCYL$ DM 'No cylinders available for directory.',CR 6F 20 63 79 6C 69 6E 64 65 72 73 20 61 76 61 69 6C 61 62 6C 65 20 66 6F 72 20 64 69 72 65 63 74 6F 72 79 2E 0D 2F7F 44 01777 DIRCYL$ DB 'Directory will be placed on cylinder ' 69 72 65 63 74 6F 72 79 20 77 69 6C 6C 20 62 65 20 70 6C 61 63 65 64 20 6F 6E 20 63 79 6C 69 6E 64 65 72 20 2FA4 30 01778 DIRASC$ DB '000',CR 30 30 0D 2FA8 0A 01779 IPLSYS$ DB LF,'Initializing SYSTEM information ',3 49 6E 69 74 69 61 6C 69 7A 69 6E 67 20 53 59 53 54 45 4D 20 69 6E 66 6F 72 6D 61 74 69 6F 6E 20 03 2FCA 0A 01780 FMTCAO$ DB LF,'Formatting complete',CR 46 6F 72 6D 61 74 74 69 6E 67 20 63 6F 6D 70 6C 65 74 65 0D 2FDF 49 01781 BADMPW$ DB 'Invalid master password - ' 6E 76 61 6C 69 64 20 6D 61 73 74 65 72 20 70 61 73 73 77 6F 72 64 20 2D 20 2FF9 46 01782 FMTABT$ DB 'Format aborted.',CR 6F 72 6D 61 74 20 61 62 6F 72 74 65 64 2E 0D 3009 41 01783 SURE?$ DB 'Are you sure you want to format it ? ',3 72 65 20 79 6F 75 20 73 75 72 65 20 79 6F 75 20 77 61 6E 74 20 74 6F 20 66 6F 72 6D 61 74 20 69 74 20 3C 59 2C 4E 3E 3F 20 03 3034 43 01784 NOTFMT$ DB 'Can''t, Disk Pack not formatted.',CR 61 6E 27 74 2C 20 44 69 73 6B 20 50 61 63 6B 20 6E 6F 74 20 66 6F 72 6D 61 74 74 65 64 2E 0D 3054 46 01785 DIFDVR$ DB 'Formatter incompatible with disk driver.',CR 6F 72 6D 61 74 74 65 72 20 69 6E 63 6F 6D 70 61 74 69 62 6C 65 20 77 69 74 68 20 64 69 73 6B 20 64 72 69 76 65 72 2E 0D 307D 44 01786 ILLEG$ DB 'Drive is disabled.',CR 72 69 76 65 20 69 73 20 64 69 73 61 62 6C 65 64 2E 0D 01787 ; 01788 IF RAM ;Use new param format 3090 EF 01789 PARMTBL DB 'o'!80H 3091 73 01790 DB 73H,'MPW',0 4D 50 57 00 3096 DB24 01791 DW MPWPARM+1 3098 74 01792 DB 74H,'NAME',0 4E 41 4D 45 00 309E 8D24 01793 DW NPARM+1 30A0 56 01794 DB 56H,'SYSTEM',0 53 59 53 54 45 4D 00 30A8 E626 01795 DW SYSPRM+1 30AA 56 01796 DB 56H,'VERIFY',0 56 45 52 49 46 59 00 30B2 1A27 01797 DW VERPRM+1 30B4 76 01798 DB 76H,'NOSTOP',0 4E 4F 53 54 4F 50 00 30BC 5025 01799 DW NOSTOP 01800 ELSE 01801 PARMTBL DB 'MPW ' 01802 DW MPWPARM+1 01803 DB 'NAME ' 01804 DW NPARM+1 01805 DB 'N ' 01806 DW NPARM+1 01807 DB 'SYSTEM' 01808 DW SYSPRM+1 01809 DB 'S ' 01810 DW SYSPRM+1 01811 DB 'VERIFY' 01812 DW VERPRM+1 01813 DB 'V ' 01814 DW VERPRM+1 01815 DB 'NOSTOP' 01816 DW NOSTOP 01817 ENDIF 30BE 00 01818 NOP ;End of table 01819 ;***** 01820 ; Formatting data and tables 01821 ;***** 30BF 5E 01822 BOOTDIR DB 5EH,0,0,0,0,'BOOT SYS',0F6H,37H 00 00 00 00 42 4F 4F 54 20 20 20 20 53 59 53 F6 37 30D1 F5 01823 DB 0F5H,9CH,5,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1 9C 05 00 00 00 FF FF FF FF FF FF FF FF 30DF 5D 01824 DIRDIR DB 5DH,0,0,0,0,'DIR SYS',0F6H,37H 00 00 00 00 44 49 52 20 20 20 20 20 53 59 53 F6 37 30F1 96 01825 DB 96H,42H,10,0,11H,1,-1,-1,-1,-1,-1,-1,-1,-1 42 0A 00 11 01 FF FF FF FF FF FF FF FF 30FF 01826 FMTDCT DS 10 3109 01827 SECCYL DS 1 ;# of sectors per cyl 310A 01828 SECTRK DS 1 ;# of sectors per trk 01829 ; 01830 IF MTI!TRS!PDC 310B 20 01831 SKEWDAT DB 32 ;# sectors in table 310C 00 01832 DB 0,0,0,4,0,8,0,12,0,16,0,20,0,24,0,28 00 00 04 00 08 00 0C 00 10 00 14 00 18 00 1C 311C 00 01833 DB 0,1,0,5,0,9,0,13,0,17,0,21,0,25,0,29 01 00 05 00 09 00 0D 00 11 00 15 00 19 00 1D 312C 00 01834 DB 0,2,0,6,0,10,0,14,0,18,0,22,0,26,0,30 02 00 06 00 0A 00 0E 00 12 00 16 00 1A 00 1E 313C 00 01835 DB 0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31 03 00 07 00 0B 00 0F 00 13 00 17 00 1B 00 1F 01836 ENDIF 01837 ; 01838 ;*=*=* 01839 ; Patch area 01840 ;*=*=* 3200 01841 ORG $<-8+1<+8 3200 01842 GATBUF DS 203 ;GAT sector buffer 32CB 63 01843 DB RLS,0,0,0,0 ;Ver, cyl exc, type, pswd 00 00 00 00 32D0 20 01844 DB ' MM/DD/YY' 20 20 20 20 20 20 20 4D 4D 2F 44 44 2F 59 59 32E0 00 01845 DC 32,0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3300 01846 BOOT1 DS 208 ;BOOT 1 33D0 43 01847 DB 'Copyright(C)1982' 6F 70 79 72 69 67 68 74 28 43 29 31 39 38 32 33E0 4C 01848 DB 'Logical Systems ' 6F 67 69 63 61 6C 20 53 79 73 74 65 6D 73 20 33F0 49 01849 DB 'Incorporated (P)' 6E 63 6F 72 70 6F 72 61 74 65 64 20 28 50 29 3400 01850 HITBUF DS 256 000D 01851 CR EQU 0DH 000A 01852 LF EQU 0AH 2B36 01854 END BEGIN 2B36 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]