Electronics
Btrieve
Motorcycling
Software
10 REM IDE Diagnostics and demos v1.0
20 REM ITMP - IDE temporary data
30 REM BASE - controller base address
40 REM LBA - logical block address to access
45 REM LBASECS - total number of accessible LBA sectors for device
50 REM ICS - IDE controller status
60 REM ICE - IDE controller error if lsb of ICS is set
70 REM CMD - command to send to controller
80 REM IHI,ILO - data bytes read from IDE
90 REM IX,IX1,IX2,IX3,IX4 - LBA conversion temp vars
1000 BASE=0E000H
1010 GOSUB 13000
1020 PRINT : PRINT : PRINT "1. Reset device"
1021 PRINT "2. Sleep device"
1022 PRINT "3. Idle device"
1023 PRINT "4. Standby device"
1024 PRINT "5. Query power mode"
1025 PRINT "6. Execute diagnostics" : PRINT "7. Identify device"
1026 PRINT "8. Recalibrate" : PRINT "9. Test read"
1027 PRINT : PRINT "Choose one?",
1028 I=GET : IF I=0 THEN GOTO 1028
1029 I=I-49 : PRINT I+1
1030 IF I<0 THEN GOTO 1020
1040 ON I GOSUB 2100,2200,2300,2400,2500,2600,2700,2800,2900
1050 GOTO 1020
2100 REM do reset
2110 GOSUB 13000
2120 RETURN 
2200 REM go to sleep
2210 CMD=0E6H : XBY(BASE+7)=CMD
2220 RETURN 
2300 REM go to idle mode
2310 CMD=0E1H : GOSUB 11000
2320 RETURN 
2400 REM go to standby mode
2410 CMD=0E0H : GOSUB 11000
2420 RETURN 
2500 REM query device power mode
2510 CMD=0E5H : GOSUB 11000
2520 I=XBY(BASE+2)
2525 PRINT "Device is in ",
2530 IF I=0 THEN PRINT "standby", : GOTO 2560
2540 IF I=255 THEN PRINT "active", : GOTO 2560
2550 PRINT "unknown",
2560 PRINT " mode"
2570 RETURN 
2600 REM execute diagnostics
2610 CMD=90H : GOSUB 11000
2620 PRINT "Diagnostics response ",XBY(BASE+1)
2630 RETURN 
2700 REM identify device (hex dump of the data)
2705 CMD=0ECH : GOSUB 11000
2720 FOR BC=0 TO 255 : ITMP=BC.AND.7 : IF ITMP=0 THEN PRINT : PH1. BC*2,
2740 GOSUB 12000 : PH0. IHI,ILO, : NEXT 
2770 PRINT : RETURN 
2800 REM recalibrate device (seek to 0)
2805 LBA=0 : GOSUB 10000
2810 CMD=10H : GOSUB 11000
2820 RETURN 
2900 REM test read
2920 FOR LBA=0 TO LBASECS-1
2922 PRINT "Reading sector#",LBA
2925 GOSUB 10000
2930 CMD=20H : GOSUB 11000
2940 GOSUB 2720
2950 PRINT : PRINT 
2955 IF GET<>0 THEN LBA=LBASECS
2960 NEXT 
2970 RETURN 
10000 REM Set LBA block number and sector count of 1
10005 IX=LBA : IX1=IX.AND.255
10020 IX=IX/256 : IX2=IX.AND.255
10040 IX=IX/256 : IX3=IX.AND.255
10060 IX=IX/256 : IX4=IX.AND.255
10075 XBY(BASE+6)=IX4+0E0H : XBY(BASE+3)=IX1 : XBY(BASE+4)=IX2
10080 XBY(BASE+5)=IX3 : XBY(BASE+2)=1
10100 RETURN 
11000 REM send a command to device, ensuring that device is ready
11010 ICS=XBY(BASE+7) : IF ICS.AND.040H<>040H THEN GOTO 11010
11030 XBY(BASE+7)=CMD
11040 ICS=XBY(BASE+7) : IF ICS>127 THEN GOTO 11040
11060 ITMP=ICS.AND.1 : IF ITMP=0 THEN RETURN 
11070 ICE=XBY(BASE+1) : PRINT "IDE ERROR#", : PH0. ICE
11090 RETURN 
12000 REM read one data word, return it in ILO and IHI
12005 ICS=XBY(BASE+7) : IF ICS.AND.040H=0 THEN GOTO 12005
12010 ILO=XBY(BASE+0) : IHI=XBY(BASE+16) : RETURN 
13000 REM reset device
13010 XBY(BASE+14)=6 : FOR ICS=0 TO 10 : NEXT 
13020 XBY(BASE+14)=2
13030 ICS=XBY(BASE+7) : IF ICS>127 THEN GOTO 13030
13050 REM read identification data and initialize device parameters
13055 PRINT "Please wait, configuring drive..."
13060 CMD=0ECH : GOSUB 11000
13070 FOR ITMP=0 TO 3 : GOSUB 12000 : NEXT 
13080 HEADS=IHI*256+ILO : GOSUB 12000 : GOSUB 12000 : GOSUB 12000
13090 SECS=IHI*256+ILO : FOR ITMP=7 TO 255 : GOSUB 12000 : NEXT 
13100 XBY(BASE+6)=HEADS-1+0E0H : XBY(BASE+2)=SECS : CMD=91H : GOSUB 11000
13110 CMD=0ECH : GOSUB 11000 : FOR ITMP=0 TO 53 : GOSUB 12000 : NEXT 
13120 GOSUB 12000 : CYLS=IHI*256+ILO
13130 GOSUB 12000 : HEADS=IHI*256+ILO
13140 GOSUB 12000 : SECS=IHI*256+ILO
13150 GOSUB 12000 : LBASECS=IHI*256+ILO
13160 GOSUB 12000 : LBASECS=(IHI*256+ILO)*65536+LBASECS
13170 FOR I=59 TO 255 : GOSUB 12000 : NEXT 
13190 PRINT CYLS,"Cylinders,",HEADS,"Heads,",SECS,"Sectors,",LBASECS,"Total"
13200 RETURN 
 
  

Copyright © Madis Kaal 2000-