{ >ӓ: Ox+  UU[w!<4: =2 =!<[)4:<=2=Ͷ)z5)Ͷ)z/5)5):<: =5):<: 5)7: =ʽ)O  ¥)°) ʰ)5)?5): =©(! "+=5)7*½)"+=xʰ)ë)7*½)~,*#"+=**"+=y«)«)# *ð)ͻý) <ė 7*  &7* **+=+#~>G*T],Q*zW* >*#*+=z̗}O|G:= O Oė7 #~@w ~įwy,n*>Oç*f>; *+=+~# **ʮ*î*#"+= (—# '—O͢*0 # )ė: >2=;+2=;+2=;+O )+ )+  +~@w,O »+>2=>2=;+2=: >2=;+_+>_+:r@/o:<;+}2r@2=;+>2<;+2<;+>2<ͩ(2!=w#"$=:<ģ,+:=» *+=+3N,N=2=*+=~#"+=!, (—# '—O —'—# )—: :<:=Z,>=!B?G~¯w#f,pͶ, /—O Į,/—: #~¯~$w'+"=>2=!"=Ö&>2=:=O , ,~w#~d,~w,,͗,wͯ,~@@~w#w#w#wO ~Ի#~%-Ļ,"(=T-:=2=Ux©x 2=*(="$= x.h :>"(=~w|2=T-x©*(=,#~¯~@ w#s#r#*=s#r.zK:?\/:<č/!<4~=A.!B?~-!>~-!@#B?~# - -- - -!;?p#"$=ͣ'!N"@; (."$=~w#~@P/~.#^#Vͣ.*= ͣ *={ģn*+=h %!"="=}2=j!/!W?>|;T:=8j!=44!/!?>|;T͙/*<|ʭ.:@<2@?2@?ó.!1/͵/!4/͵/*<|.>,8L:@<>,İJ:@<2@?2@?!D/͵/͙/.}ͣ*>|/+.ͣ:q@(/8L>8L͝KKNo FatalWrror(s) Warning(s):=Gͣ.Ͳ/!k/͵/#Ù/REPT/IRP/IRPC/MACROUnterminated Ͳ/!/͵/#> T> T:@<> ͰJ> ðJ!/:@<ñFConditionalSymbols: Macros: !9*@͇ 3:?!"@" @*?0*@+<2?2?2?*@$͇ #0"?%4;0~<=W0:?<2?:?:?=2?<#~C0:?C0:?C07"?:?=2? &¶0*+=~ ʴ0 ʴ0O 0"+=´0>&2?#1&¶0:?»0>& :2?*?~0=0O+0 0x+~00:?*?~!1=1O+1 1x+~10<*+=O 0\1G~# A1 I1Ͷ051xͶ0G¨0&¨00 "+= u1 u10 {1Ͷ0b1ͫ P1Ê1ͫ P1Ͷ0Ä1 ;ʬ1Þ1ͫ:Ͷ0 ʃ: Þ1ͫ:ͫ: ʯ1 ʯ1:" @ʃ: ʃ:> :Ã::?1*@4.2*?~2G+2~/_1~+2=G+~+2ͽ32+<=(2+ 2~>.ͽ3ͽ3?*?O DEO g2=ʋ3%ʸ2,ʕ3 ʕ3 ʕ3;ʕ3!# ʲ3w+ y2"`3V3ͩ(:= 3:<32PX 2|2>:K3)073>)3073=23D#3E#3 >0K3x,3x0:73 K30:K3>0K3y*`3w+"`30 *`3ò2ͥ $ͥ =$> < > < ۀ >2 >2 >2 >2 ͱ  ͗ ͥ TST490: NO FLOPPY CONTROLLER FOUND, PROGRAM ABORTED$_] u Ɛ'@'< ! 0  O)))) à  ڲ  |ĩ {0< 0 ?))) O to abort or any key to continue $Z  ͗ ` ͗ *<> < >Nf > < × *<` >ړ ͗ Á × "<~#$Ͳ å *<\ʿ $ :>` > < &,}> .< "<~#$Ͳ a{ ~ # O N##!Z wʍ ʕʧ_ʧ/F`{ {wxw6~#< x+>< {/_>< ~ʟ#Õ#p# x~µ͵66 {w~> < ~6 Wxz< #~r~#~+ww6> < xW>< /~6> < #~x=x4~w=~ TwFw~ Tx~ `x~ lwxʑ+~# ʑ͑~ ʟÑ~ ʟG~#ʽ##í~#fo G~#  ~!^#VÙ:} <2} Q2} :| <2| C2| :{ <2{  42{ :AR ͗ ͥ < Test cycle complete >$>27=X!{ ~ !"| 2{ 2 2 2  ܼ͝:~ ?2~ : 2 : 2 y:~ ʧø: ʱø: ʺ>! O G>G~w:G: OG2:#2#: ??? U2$2)2+,: o: g77?R:: o: g;#"!:#Z)2 2 2 ɐO#͗ :{ l ͥ $:| l ͥ $:} l ͥ Type to abort or$ͦZ   ˜ͥ return to continue $ͥ break on $` > >< *<͗ :#0< ͗ :#0< × *<2͗ *!ͩ × *<D͗ :$o&ͩ ×  ͗ :0< :DGۗ2Nu2D0͗ :Nl  ͗ :Tʓͥ DMA$ͥ programmed I/O$ 8͗ :TʓË*< ͗ *W*< 8͗ *U|l }l ×  ͗ :Sl ͗ ::o&ͩ ͗ :8ͥ ON $$ͥ OFF$:96ͥ ABORT$ͥ $ 5͗ :?Zͥ ON$ͥ OFF$ɯ2M!>&6#=k!S 6#6>2S>2T!["Y!W"Uͱ > ӓ> ӓۗ !͗ ͥ ** PHOENIX IS NOT SELECTED **\Type or turn drive power on $> ӓ> ӓۗ !K  ۗ„ ͗ ͥ ** DRIVE IS NOT READY **\Type or Start drive and wait $ۗ„K n n)͗ ͥ ** CANNOT RECALIBRATE DRIVE **\type$ͦZ ! T ~Z)~# x2a>2?20Z) !U o"W"U{>2/ͱ 2>2D͗ ͥ PROG ID: TST490$(͗ ͥ REV 1.3$͗ ͥ Volume:$͗ ͥ Head:$(͗ ͥ Cylinder:$<͗ ͥ Sector:$,͗ ͥ Int Vector: $H(͗ ͥ Status:$W ͗ ͥ Read transfer:$x (͗ ͥ Write transfer:$ͦ ͗ ͥ Read address:$ͼ (͗ ͥ Write address:$ ͗ ͥ Format byte:$ (͗ ͥ Seek verify:$A͗ ͥ Free memory: $!U|,< #>< > < ͗ ͥ Command: $`  ͗ Z S=SECTOR S CYLINDER C HEAD H VOLUME IV IRAMBUF TRANSFER WT WERROR AE ASEEKTEST "SEEKVER MFORMAT &VERIFY >'DUMP tD tFILLBUF TESTBUF 8FILLMEM ENTER eREAD %R %W %WRITE %DISKTEST #INIT bI bHELP ,? ,IPL QUIT INT *!kñInvalid command, type "HELP" for command list$͗ :7` 27͙ >27 }!ñInvalid parameter$<+~,<+ͽ}2$,ͽÊ):#+ͽ>G!T ~Z)#!1ñHead-0 only on Volume-0$ͽ}Z)͗ ͥ Read$͗v!T>wx͗ ͥ Write$͗!TxG>wæͥ transfer mode (D= DMA, P= programmed I/O)? $` Z _ͫDP<<͗ ͥ Read$"Wͼ͗ ͥ Write$"Uͥ buffer address in hex: $` Z ̀ }< OFF eON l2?A>2?A21 BUF PAGE ̀ }.åͽe.ͱ ͗ ͥ SYSTEM MEMORY$ *Wåͱ ͗ ͥ CONTROLLER ON-BOARD BUFFER$>21Ӕӕ! | ͗ ͥ Page $l&ͩ ͥ \\$|l }l ͥ : $> < :1QۖR~l #}@ͥ $w y>.< lͥ \$}.ͥ \${*W6#{©>G>Ӕӕ!xӖ+}Ӕӕ!xӖ+}( ̀ }|Ex22͗ ͥ Beginning$B"4͗ ͥ Ending$B*4:2G6#p|5}5ͥ address? $` Z ̀ } ẁ }ͱ  ͗ ͥ Type in new memory value or return to skip.\Type in "." to end entry.\$zl {l ͥ : $l ͥ - $Z ~. ̀ }|}ͥ \$ͥ \Invalid hex value, re-type\$!"2ͱ  ͗ ͥ Testing controller on-board Memory\Errors are printed when they occur\$Ӕӕ:2G!xӖ+}Ӕӕ:2G!ۖ#|ڳ!24‘:3ͥ \Pass complete, buffer OK$ͥ \Type$ͦZ ͥ Address $|l }l ͥ : expected-$xl ͥ , observed-$l ͥ \$ Q::ñCLEAR ON OFF ABORT ::/_ͽ}Mñ2:!["Y!W"Uɯ28>28>29 y2;i&) )![͗ { :: ñͱ ͗ ͥ Examining error number: $ i&ͩ ͥ \\Error occured in $~ͫz   ,!A!!~#iͥ No interrupt recieved from operation\$ͥ Volume= $~0< ͥ , Head= $~#0< ͥ , Cylinder= $^#V#ͩ ͥ , Sector= $n&ͩ #ͥ \Drive status port at time of error: $F~l ͥ (hex)\\ERROR INTERPRETED AS FOLLOWS:\$>= ͥ Drive fault recieved\$>Y ͥ Unit is NOT READY\$> ͥ Unit cannot be selected\$ͥ DISK READING\$:>@ͥ CRC error detected\$ͥ DISK WRITING\$:>ͥ Drive is write protected\$ͥ SEEKING\$:>!ͥ Seek error condition\$>ͥ Unit not on cylinder\$ͥ RECALIBRATING\$ ͥ HEADER VERIFICATION\$::;Oi& )!Wͥ \Observed:\$ͥ Volume= $~0< ͥ , Head= $~0< #ͥ , Cylinder= $^#V#ͩ ͥ , Sector= $n&ͩ #ͥ DISKTEST BUFFER VERIFICATION\$:ͥ \Check individual sector\$ɯ2A2B O"ALL LOOP R"ALL J"LOOP W"!kñ>2B\">2B>2A͗ ͥ Seek Test, $:AŒ"ͥ Single pass, $Þ"ͥ Endless loop, $:B»"ͥ Single volume, $"ͥ All, $Ϳ͗ ͥ Test Counter: $":B""u :G:#2#Z)2#Z)ɯ2A2B F#ALL LOOP I#ALL A#LOOP N#!kñ>2BS#>2B>2A͗ ͥ Disk Test will write random data, continue (Y/N)? $` Z Y͗ ͥ Enter number of WRITE/READS per sector (1-9)? $` Z 1# #26͗ ͥ Disk Test, $:A$ͥ Single pass, $($ͥ Endless loop, $:BE$ͥ Single volume, $N$ͥ All, $Ϳͼ͗ ͥ Test Counter: $u:6*U:+Gp#{‰$)ͳ((y(p((*W:+G~ʷ$#{°$y+ =~$:B$r$:C$>2C:G:#2#Z){$2C2#Z)r$ %>2* ʲ%LOOP %ͽ}22*W:*;%*U"4*!"':$2)Ͳ%!25ʑ%:$<2$p%*!#ڑ%͊),:*ʇ%*U"UJ%*W"WJ%*'͊):)2$,*4:*ʮ%"U"W:*%ͳ((y(p((͗ ͥ Endless disk $:*%ͥ write$%ͥ read$ͥ loop,$ͿͲ% &2- Z&ALL BYTE 9&ALL U&BYTE >&Z&>2- ̀ }2SZ&>2-͗ ͥ FORMAT will erase current surface(s), continue (Y/N)? $` Z Y< :-&!S ~Z)&#ó&͗ ͥ Formatting current surface(s),$Ϳ>Ӕӕ:SGxӖ{&2$,!?(ͳ(y(:$<2$' *!#'l2-'2-2@l 'ALL HEADER 'ALL HDR 'ALL BYTE 'ALL 'HEADER 'HDR 'BYTE '>2-'>2- ̀ }2S'>2->2@:-'!S ~Z)'#'͗ ͥ Verifying current surface(s),$Ϳ2$,!?():@O(:$<2$( *!#(!͊):?2?͊)2?(*W+:SG#~]({+A>(>A*Ӑ>  ӓӐ:$ӑL+>  ӓy+ۗ+Ӕӕ!~Ӗ#½(>Ӕӕ: Oyͳ(*U:T)~Ӗ#{(ͣ(*W@:T)ۖw#{)> ӓӑ: O}y: O|y!: O}yx: Oy: O>Dy> ӓA*2#Ӑ>  ӓ>  ӓ:/=~)ۗ*!A*}Ӑ|ӑ> ӓ> ӓL+y+ۗ+"!:/:?p(Ӕӕ!ۖ)#)ɯӔӕۖۖOۖ)+A*>@Ӑӑ>  ӓ>  ӓL+y+ۗ+!"!:/2#:/ۗ Z*> ӓ> ӓۗy*>Ӑӑ>  ӓ>  ӓۗ*!:#)2#Ӑ>  ӓ>  ӓÍ)ͽ}2<++H ͗ ͥ Shunt must be at interrupt vector $:0< ͥ , hit any key to continue.$Z :'''2*&E!p+[>}|!E[>2M> ӓ:M[+: OyW> ӓW:Mʈ+2M͗ ͥ Unexpected interrupt$2M> ӓۗ+{·+>O> ӓ: Oy :8:/>::!*Bͱ ͗ ͥ LIST OF COMMANDS\\Cylinder Fillmem Quit Status\Disktest Format Rambuf Testbuf\Dump Head Read Transfer\Enter Init Sector Verify\Error Int Seektest Volume\Fillbuf Ipl Seekver Write$ ͗ ͥ Enter command for description or to exit: $`  0͗ Z  .V S/VOLUME S/H 0HEAD 0C 1CYLINDER 1S h2SECTOR h2RAMBUF %6STATUS y3E 7ERROR 7D :DUMP :SEEKTEST AFORMAT h@FILLMEM AFILLBUF ^CTESTBUF DR EREAD EW RGWRITE RGDISKTEST HENTER yKVERIFY NIPL MI PINIT PTRANSFER RINT SQUIT QU ͗ ͥ "V" "VOLUME [x]" \VOLUME is used to set the volume number on the drive. \[x] may be 0 or 1. Volume 0 will select the removeable \surface, volume 1 will select the fixed surface(s). \Note: There is only a head 0 on volume 0, so selecting \volume 0 will always set head 0.${  ͗ ͥ "H" "HEAD [x]" \HEAD is used to set the current head or surface to \access on the drive. [x] can only be 0 for volume 0; \for volume 1 [x] may be 0-$:0=< ͥ .${  ͗ ͥ "C" "CYLINDER [x]" \CYLINDER is used to set the current cylinder position on the\drive. [x] may be 0-822. Default is cylinder 0. \${  ͗ ͥ "S" "SECTOR [x]" \SECTOR is used to set the current sector for the next \read or write operation. Note that some test commands \manipulate the sector setting. \[x] may be 0-31.${  ͗ ͥ STATUS of the drive is displayed on \the screen. (There is no STATUS command). \Bit Definitions: \0 - DRIVE FAULT \1 - SEEK ERROR \2 - ON CYLINDER \3 - UNIT READY \4 - WRITE PROTECTED \5 - UNIT SELECTED \6 - CRC ERROR \7 - INTERRUPT REQUEST ${  ͗ ͥ "RAMBUF" \RAMBUF changes the current address of the read/write \buffer in system memory. You will be prompted for \the read buffer address, then the write buffer address. \Both must be entered in hexadecimal. \A return with no entry will not alter the current \addresses. ${  ͗ ͥ "E" "ERROR [x] [clear] [on] [off] [abort]" \When an error occurs, the error counter on the screen is \incremented. Use ERROR to examine the errors. \Error descriptions are stored in memory until cleared by \ERROR [clear] or INIT. \[x] is the error number to be examined. If [x] is not \entered, error one is assumed. Drive status at the time the \error occurred is displayed. Error logging is disabled by \ERROR [off] and restored by ERROR [on]. \ERROR [abort] causes testing to stop if an error occurs. \ERROR [abort] is reset by INIT. ${  ͗ ͥ "D" "DUMP [x] [page y] [buf]" \The DUMP command displays system memory or the on-board \memory of the 490 controller. [x] may be any hexadecimal \address. [page y] may be any decimal page (256 bytes) \from 0-255. [buf] will display the controller memory. \If no arguments are entered, DUMP will begin with the read \buffer address. \${  ͗ ͥ "SEEKTEST [loop] [all] [all loop]" \SEEKTEST will perform a table-driven seek to each sector \on the currently selected volume. \If SEEKTEST [loop] is entered, SEEKTEST will run until \terminated by pressing . \If [loop] is omitted, SEEKTEST will check each sector \once and then stop. \If SEEKTEST [all] is entered, SEEKTEST will check each \sector on the drive. (All surfaces, both volumes). \ \SEEKTEST will take several hours to complete one cycle. \${  ͗ ͥ "SEEKVER [on] [off]" \SEEKVER is used to enable/disable seek verification. \Verification is done by reading a sector after each seek. \The cylinder number in the header field is compared with \the desired cylinder. A seek verify error occurs when they \do not match. ${  ͗ ͥ "FORMAT [all] [byte x] [all byte x]" \FORMAT formats the currently selected surface. \[all] formats all existing surfaces on the drive. \[byte x] will set the sector fill byte to a new value. \[byte x] defaults to E5. After formatting, automatic \verification is performed. ${  ͗ ͥ "FILLMEM [x]" \FILLMEM is used to fill a section of system memory with \a constant [x]. [x] may be any hexadecimal byte value. After\entry of the command, you will be prompted for beginning and\ending memory addresses. Both addresses are included in the \fill. ${  ͗ ͥ "FILLBUF [x]" \FILLBUF is used to fill the on-board controller memory with\the constant [x]. [x] may be any hexadecimal byte value. ${  ͗ ͥ "TESTBUF" \TESTBUF begins a test of the on-board controller memory. \Memory verify errors are displayed on the console when \they occur. The relative memory address, the byte written, \and the byte read are displayed. \Control-S may be used to stop the display and examine the \error. TESTBUF takes about 15 seconds. ${  ͗ ͥ "R" "READ [x] [loop]" \READ is used to read the current sector from the drive \to the current read buffer. If [x] is omitted, one sector \is read, else [x] number of sectors are read. \[x] may be a decimal value from 1-127. \READ [loop] repeatedly reads the current sector. ${  ͗ ͥ "W" "WRITE [x] [loop]" \WRITE is used to write the current sector from the current \write buffer to the drive. If [x] is omitted, one sector is \written, else [x] number of sectors are written. \[x] may be a decimal value from 1-127. \WRITE [loop] repeatedly writes the current sector. ${  ͗ ͥ "DISKTEST [loop] [all] [all loop]" \DISKTEST performs a table-driven read/write/verify \of each sector on the currently selected volume. \DISKTEST [loop] will run until terminated by pressing .\If [loop] is omitted, DISKTEST will check each sector once \and then stop. \DISKTEST [all] will test each sector on the drive. \(All surfaces, both volumes). \DISKTEST will take several hours to complete one cycle. \ \Warning: DISKTEST will destroy all data on the disk. ${  ͗ ͥ "ENTER [x]" \ENTER is used to enter values directly into \system memory. [x] may be any hexadecimal address. \If [x] is omitted, ENTER defaults to address 0. \The current address is displayed first, then the \current value at that address. If a valid 8-bit hex \value is entered, a replacement is performed. \A return with no value will skip to the next address. \Enter a period to terminate ENTER. ${  ͗ ͥ "IPL" \IPL is used to exit the program and return to the \operating system. It enables and executes the IPL \(Initial Program Loader). ${  ͗ ͥ "VERIFY [all] [header] [hdr] [byte x] \ [all header] [all byte x]" \VERIFY will read each sector on the currently \selected surface. Each sector header is checked, \and the data bytes are checked to be all E5. \ \[all] will verify all existing surfaces on the drive. \[header] or [hdr] will verify only the headers. \[byte x] will check for data [byte x] instead of E5. ${  ͗ ͥ "I" "INIT" \INIT will initialize the program to the default \values used when the program was initially executed. \When the program first signs on, this command should \be entered before testing is begun. ${  ͗ ͥ "T" "TRANSFER" \TRANSFER is used to change the transfer mode for \read/writes to the controller on-board buffer. The \transfer can be done DMA or programmed I/O. A prompt \will be issued for the new transfer mode. Note that \DMA is used only with disk read/writes; all other \operations and tests use programmed I/O. \${  ͗ ͥ "INT [x]" \INT will change the 490 controller interrupt vector \used by the program. [x] may be 0-7. The vector shunt must \be at the newly-assigned vector position. \ \Default is interrupt vector 4. \${  ͗ ͥ "QUIT" \QUIT will exit the program by executing a warm-boot. \${ "QUIT"