!"#()*+012389:; $%&',-./4567 !"#$%&'01234567 ()*+,-./89:;<=>? ͭexͭ :  : 2x Wy'OxGzð''Ox0_y a{  0_*.*.O*.!O*.$*.': 7.* CompuPro COPY Utility Version 2.4.$ Do you want to copy: SYSTEM tracks only? (type S) DATA tracks only? (type D) ALL of the disk? (type A) Exit back to System (type X) $ Source drive? (A, B, C, OR D) $ Destination drive? (A, B, C, OR D) $ Put source disk on A Put destination disk on B Then type $ $ Track $ Disk have incompatible formats.$ COPY complete.$ Do you want to COPY again? (Y/N) $ Read error on drive $ Write error on drive $ track $ sector $ Compare error Track $ Sector $ Byte $ Permanent error.$ Remount system disk on A: and type RETURN.$    !$%(),-01 "#&'*+./23\ OK - Load Screen 20dec83mcs 1 11 +thru exit \ DISK2 - Load Screen MAR 16 84 BLK @ LIST 1 27 +THRU DEFINE JVD2DIAG.BLK FROM JVD2DIAG.BLK 1 LOAD 256 HERE CP/M SAVE DIAG.COM FORTH CR CR .( DIAG.COM file saved.) EXIT This screen loads test drivers for the DISK2 and SELECTOR channels. our "A"). a. "Prot" only, no directory. 4 Switc 1- wa ohme ou alon wit switc 1-7 t mak sur it was working. Switch 1-8 selects sector size of 512 and switch 1-7 selects sector size of 1024. Dual is using sector size of 512. RESULTS 1 board passe al th abov test wit n proble th firs time Tw board failed bot o whic ha bee i th "won' forma har dis" category On o thes board passe productio test wit bot Compupr an Dua switc settings formattin th firs 2 cylinder o th har disk bu i faile th MP/ tes b failin t boo MP/M Th othe boar woul no communicat wit th har disk givin ou "har dis no ready o th director an hangin u o th "prot test. On o th faile boards th on whic woul no boo MP/M turne ou t hav pi o pro ben unde makin intermitte\ DISK2 - Port Equates & Constants 14nov83mcsHEX C8 CONSTANT CTL \ DISK2 Control/Status Port CTL 1+ CONSTANT DATA \ DISK2 Data Port 0 CONSTANT DRV \ DRV reg# 8 CONSTANT CYL \ CYL reg# 10 CONSTANT HD \ HD reg# 18 CONSTANT SEC \ SEC reg# F0 CONSTANT SEL \ SELECTOR CHANN 25 CONSTANT SEL-BYTE \ 1's comp of priority + 20h 10 CONSTANT NTRY \ Number of tries DECIMAL \ DISK2 - Drive Characteristics 30nov83mcs 11 CONSTANT SEC/TRK \ Sectors per track 8 CONSTANT #HEADS \ Number of heads 245 CONSTANT #TRKS \ Number of cylinders VARIABLE MAXSEC \ Sectors per disk SEC/TRK #HEADS * #TRKS * MAXSEC ! EXIT \ DISK2 - Variables 11nov83mcs VARIABLE DRIVE \ Drive Number VARIABLE SECTOR \ Sector Number VARIABLE HEAD \ Head Number VARIABLE TRACK \ Cylinder Number VARIABLE CONTROL \ Control Byte CREATE BUF B/BUF ALLOT EXIT \ DISK2 - SET WAIT-DONE COMMAND 14nov83mcsHEX : SET ( c reg# -- ) CTL P! DATA P! ; : WAIT-DONE ( -- ) BEGIN KEY? ABORT" Command Aborted" CTL P@ 80 AND 0= UNTIL ; : COMMAND ( c --- ) 8 * C0 + DRIVE @ + CTL P! WAIT-DONE ; DECIMAL EXIT \ DISK2 - HOME (SEEK) SEEK 14nov83mcsHEX : HOME ( -- ) 80 ( step out ) 4 OR DRIVE @ OR CTL P! BEGIN CTL P@ 1 AND WHILE DATA P@ ( step ) DROP 2 MSEC REPEAT 0 TRACK ! ; CODE (SEEK) ( N -- ) D POP BEGIN DATA IN E DCR 0= UNTIL NEXT C; : SEEK ( TRK -- ) TRACK @ OVER TRACK ! - ?DUP IF ( NEW ) DUP 0< IF 80 ELSE A0 THEN DRIVE @ OR CTL P! ABS (SEEK) BEGIN CTL P@ 4 AND 0= UNTIL 28 MSEC THEN ; DECIMAL \ DISK2 - SET-DRIVE SET-TRACK SET-HEAD SET-SECTOR 11nov83mcsHEX : SET-DRIVE ( n --- ) DUP DRIVE ! PWR2 10 * HEAD @ OR DRV SET ; : SET-TRACK ( n -- ) DUP CYL SET SEEK ; : SET-HEAD ( n -- ) DUP HD SET HEAD ! DRIVE @ PWR2 10 * HEAD @ OR DRV SET ; : SET-SECTOR ( n -- ) DUP SEC SET SECTOR ! ; DECIMAL EXIT \ DISK2 - CHAN-BUF LOAD-CHAN SET-ADDR 14nov83mcs CREATE CHAN-BUF 4 ALLOT CHAN-BUF 4 ERASE : LOAD-CHAN ( -- ) SEL P@ DROP CHAN-BUF 4 BOUNDS DO I C@ SEL P! LOOP ; : SET-ADDR ( adr -- ) FLIP CHAN-BUF 1+ ! ; EXIT \ DISK2 - T&SCALC 11nov83mcs SEC/TRK #HEADS * CONSTANT SEC/CYL : T&SCALC ( D --- ) SEC/CYL UM/MOD SET-TRACK SEC/TRK /MOD SET-HEAD SET-SECTOR ; EXIT \ DISK2 - STAT. TRY 14nov83mcsHEX : STAT. ( n -- ) BASE @ SWAP HEX CR ." Disk Error = " . SPACE TRACK ? HEAD ? SECTOR ? TRACK @ #HEADS * HEAD @ + SEC/TRK * SECTOR @ + SPACE DECIMAL . CR BASE ! ; : TRY 0 DO LOAD-CHAN CONTROL @ CTL P! WAIT-DONE CTL P@ DUP 7E AND 2 - DUP DISK-ERROR ! DRIVE @ 0 SET-DRIVE SET-DRIVE IF STAT. ELSE DROP LEAVE THEN LOOP ; DECIMAL EXIT \ DISK2 - DHR/W HR/W 11nov823mcHEX : DHR/W ( ADDR BLOCK R/W --- ) >R T&SCALC SET-ADDR R> SEL-BYTE OVER IF 80 OR THEN CHAN-BUF 3 + C! ( SEL CTL BYTE ) IF C8 ELSE D0 THEN DRIVE @ OR CONTROL ! NTRY TRY DISK-ERROR @ IF ( ERROR ) TRACK @ HOME SEEK ( RECALIBRATE & SEEK ) NTRY TRY THEN DISK-ERROR @ ABORT" Disk Error" ; : HR/W ( ADDR BLOCK R/W --- ) 0 SWAP DHR/W ; DECIMAL \ DISK2 - RD WR RH RD X XX W 30nov83mcsHEX : RD SEL-BYTE 80 OR CHAN-BUF 3 + C! ; : WR SEL-BYTE CHAN-BUF 3 + C! ; : Y RD BUF SET-ADDR LOAD-CHAN 4 COMMAND ; \ HEADER : Z RD BUF SET-ADDR LOAD-CHAN 1 COMMAND ; \ SECTOR : X CR ." STATUS = " BASE @ HEX CTL P@ . CR BUF DLN 63F0 DLN BASE ! ; : XX X BUF 400 BOUNDS DO I DUMP 100 +LOOP ; : W WR BUF SET-ADDR LOAD-CHAN 2 COMMAND ; \ SECTOR DECIMAL \ DISK2 FORMAT - TDATA SDATA BUILD 11nov83mcsHEX : TDATA ( C ADDR --- ) SEC/TRK 0 DO 2DUP C! 3 + LOOP 2DROP ; : SDATA ( ADDR --- ) SEC/TRK 1 - 0 DO ( FOR N - 1 SECTORS ) I 1+ OVER I 3 * + C! LOOP ( WRITE 1 - N ) SEC/TRK 1 - 3 * + 0 SWAP C! ; ( AND 0 ) : BUILD TRACK @ BUF TDATA HEAD @ BUF 1+ TDATA BUF 2 + SDATA ; DECIMAL \ DISK2 FORMAT - (FORMAT) FMTTRK 30nov83mcsHEX CODE (FORMAT) ( CNT CMD --- ) D POP H POP E A MOV 10 ADI CTL OUT ( SEND TIMEOUT COMMAND ) BEGIN CTL IN 80 ANI 0= UNTIL ( WAIT DONE ) BEGIN E A MOV CTL OUT ( SEND WRITE HEADER ) BEGIN CTL IN 80 ANI 0= UNTIL ( WAIT DONE ) L DCR 0= UNTIL NEXT C; ( LOOP CNT TIMES ) : FMTTRK ( -- ) BUF SET-ADDR SEL-BYTE CHAN-BUF 3 + C! LOAD-CHAN HEAD @ BUF 1+ TDATA SEC/TRK D8 DRIVE @ OR (FORMAT) ; DECIMAL \ DISK2 FORMAT - FMTCYL FORMAT 11nov83mcsHEX : FMTCYL ( TRK --- ) ASCII . EMIT SEEK TRACK @ BUF TDATA #HEADS 0 DO I SET-HEAD FMTTRK LOOP ; : FORMAT ( DRV --- ) SET-DRIVE HOME BUF 2 + SDATA #TRKS 0 DO I FMTCYL LOOP ; DECIMAL \ DISK2 FORMAT - (CHKFMT) CHKFMT 11nov83mcsHEX CODE (CHKFMT) ( CNT CMD --- ) D POP H POP E A MOV C7 ANI CTL OUT ( SEND TIMEOUT COMMAND ) BEGIN CTL IN 80 ANI 0= UNTIL ( WAIT DONE ) BEGIN E A MOV CTL OUT ( SEND READ HEADER ) BEGIN CTL IN 80 ANI 0= UNTIL ( WAIT DONE ) L DCR 0= UNTIL NEXT C; ( LOOP CNT TIMES ) : CHKFMT RD LOAD-CHAN SEC/TRK E0 DRIVE @ OR (CHKFMT) ; DECIMAL \ DISK2 TEST - SECTOR UNIQUENESS 11nov83mcsHEX : WDATA 15 0 DO BUF 200 I FILL ( FILL WITH SECTOR NUMBER ) BUF 37 I + 0 HR/W ( WRITE THE SECTOR ) LOOP ; : RDATA 15 0 DO BUF 37 I + 1 HR/W BUF DUMP LOOP ; : -TEXT ( A1 A2 N --- FLAG ) DUP 0 DO DROP OVER I + C@ OVER I + C@ - DUP IF LEAVE THEN LOOP SWAP DROP SWAP DROP ; DECIMAL \ DISK2 TEST - DRWTEST HEX-NIB DTEST 30nov83mcsHEX : DRWTEST ( DSECTOR --- ) DUP BUF B/BUF + SWAP 0 HR/W ( WRITE FROM BUF+400H ) DUP BUF SWAP 1 HR/W ( READ INTO BUF ) BUF DUP B/BUF + B/BUF -TEXT ( COMPARE SECTOR BYTES ) IF ." ERROR IN SECTOR NUMBER " . BEEP ELSE DROP THEN ; : HEX-NIB DUP 0A < IF ASCII 0 ELSE 0A - ASCII A THEN + ; : DTEST ( TEST ENTIRE DISK ) BUF 800 BOUNDS DO I F AND HEX-NIB I C! LOOP ( WRITE DATA ) #TRKS 0 DO SEC/CYL 0 DO CR ." SECTOR " I J *D 2DUP D. DRWTEST LOOP KEY? IF LEAVE THEN LOOP ; DECIMAL \ DISK2 TEST - RWTEST HEX-NIB DTEST 30nov83mcsHEX : RWTEST ( SECTOR --- ) DUP BUF 400 + SWAP 0 HR/W ( WRITE FROM BUF+400H ) DUP BUF SWAP 1 HR/W ( READ INTO BUF ) [ BUF 3FF + ] LITERAL C@ FF = IF ." ERROR IN SECTOR NUMBER " . BEEP ELSE DROP THEN ; : HEX-NIB DUP A < IF ASCII 0 ELSE A - ASCII A THEN + ; DECIMAL EXIT : DTEST ( TEST ENTIRE DISK ) BUF 800 BOUNDS DO I F AND HEX-NIB I C! LOOP ( WRITE DATA ) SEC/TRK #HEADS #TRKS * * SWAP DO CR ." SECTOR " I DUP . RWTEST KEY? IF LEAVE THEN LOOP ; DECIMAL \ DISK2 TEST - FEW-FORMAT DATACHK FILBUF FEW-WIPE T 12nov83mcsHEX : FEW-FORMAT BUF 2 + SDATA 16 0 DO I FMTCYL LOOP ; : DATACHK \ ( DATA BYTE -- ) 400 0 DO BUF I + C@ OVER - ABORT" BAD DATA " LOOP ; : FILBUF BUF 400 ROT FILL ; : FEW-WIPE 500 21 DO BUF I 0 HR/W ." ." KEY? IF LEAVE THEN LOOP ; : T 0 SET-DRIVE HOME BUF 1000 1 HR/W FEW-FORMAT E5 FILBUF FEW-WIPE BUF 400 ERASE BUF 21 1 HR/W BUF 400 DUMP E5 DATACHK 1A FILBUF FEW-WIPE BUF 400 ERASE BUF 21 1 HR/W BUF 400 DUMP 1A DATACHK FMTTRK ( TRASH TRACK) BEEP ; DECIMAL DECIMAL \ DISK2 TEST - LD CLD BLD ERASER FDATA PF PS 11nov83mcs HEX : LD BUF 64 DUMP ; : CLD CHKFMT BUF 64 DUMP ; : BLD BUILD BUF 64 DUMP ; : ERASER BUF 400 ERASE BUF 64 DUMP ; : FDATA BUF 400 FF FILL BUF 64 DUMP ; : PF CTL P@ . ; : PS CTL P! ; DECIMAL \ DISK2 TEST - BI DEC DEX SECR SECW REPORT BOOFL LOGSE11nov83mcsHEX : BI 2 BASE ! ; : DEC DECIMAL ; : DEX DEC ; : SECR BUF SWAP 1 HR/W LD ; : SECW BUF SWAP 0 HR/W LD ; : REPORT CR ." TRACK: " TRACK ? ." HEAD: " HEAD ? ." SECTOR: " SECTOR ? CR CR ; : BOOTFL 33 0 DO BUF I 0 HR/W LOOP ; : LOGSEC ( TRACK HEAD SECTOR -- BLOCK ) ROT ROT SEC/TRK * SWAP SEC/CYL * + + ; DECIMAL \ DISK2 TEST - PRODUCTION TEST FOR DISK 2 11nov83mcsDECIMAL ( VAR AND CONSTANT DICTIONARY FOLLOWS) 33 CONSTANT START0 129 CONSTANT END0 7920 CONSTANT START1 8016 CONSTANT END1 17600 CONSTANT START2 17696 CONSTANT END2 21120 CONSTANT START3 21216 CONSTANT END3 VARIABLE TBYTE HEX : BS ( COUNT -- ) 0 DO 08 EMIT LOOP ; : WRBLK ( END START -- ) CR ." WRITING SECTOR " DO I 5 U.R BUF I 0 HR/W 5 BS 0C +LOOP ; : CHKBLK ( END START -- ) BUF 400 ERASE CR ." CHECKING SECTOR " DO I 5 U.R BUF I 1 HR/W TBYTE C@ DATACHK 5 BS 0C +LOOP ; DECIMAL \ DISK2 TEST - MORE DISK2 PRODUCTION TEST BCH 14nov83mcsHEX : WRMANY END0 START0 WRBLK END1 START1 WRBLK END2 START2 WRBLK END3 START3 WRBLK ; : CHKMANY END0 START0 CHKBLK END1 START1 CHKBLK END2 START2 CHKBLK END3 START3 CHKBLK ; : PROT 0 SET-DRIVE HOME BUF 1000 1 HR/W CR ." FORMATTING FIRST 22 CYLINDERS" FEW-FORMAT E5 FILBUF E5 TBYTE ! WRMANY CHKMANY 1A FILBUF 1A TBYTE ! WRMANY CHKMANY 0 SET-TRACK 4 SET-HEAD FMTTRK BEEP CR CR ." THIS BOARD PASSES THE TEST " ; DECIMAL \ DISK2 TEST - READ WRITE TEST SOFTWARE 11nov83mcsEXIT : RWTEST ( SECTOR --- ) DUP BUF 400 + SWAP 0 HR/W ( WRITE FROM BUF+400H ) DUP BUF SWAP 1 HR/W ( READ INTO BUF ) BUF DUP 400 + 400 -TEXT ( COMPARE 1024 BYTES ) IF ." ERROR IN SECTOR NUMBER " . ELSE DROPTHEN ; : DTEST ( TEST ENTIRE DISK ) BUF 800 55 FILL ( DATA TO BE WRITEN ) SEC/TRK #HEADS #TRKS * * 0 DO CR ." SECTOR " I DUP . RWTEST LOOP ; DECIMAL \ DISK2 TEST - FNUM FILLBYTE WT 12nov83mcsHEX : FNUM DUP 10 * SWAP NEGATE F AND OR ; : FILLBYTE ( BYTE -- ) BUF 400 ROT FILL ; : WT ( TSTBYTE -- ) DUP FILLBYTE 10 1 DO BUF I FNUM SEC/CYL * SEC/CYL 0 DO 2DUP I + DUP . 0 HR/W LOOP LOOP ; DECIMAL \ DISK2 TEST - WARETEST 12nov83mcsHEX : WARETEST BUF 2 + SDATA 10 1 DO I FNUM FMTCYL LOOP E5 WT 1A WT ; DECIMAL CR CR .( DISK2 words loaded.) EXIT