1000 '
1010 INIT:CLS:DEFINT A-Z
1020 '
1030 DIM CDB(12),BUF(512)
1040 TLEN=0 'Transfer Length
1050 SCSIID=7 'X1turbo SCSI ID
1060 '
1070 PORT=&HF70 'MB89352 BASE Address
1080 BDID=PORT+0:SCTL=PORT+1:SCMD=PORT+2:NAZO=PORT+3:INRS=PORT+4
1090 PSNS=PORT+5:SDGC=PORT+5:SSTS=PORT+6:SERR=PORT+7:PCTL=PORT+8
1100 MBC=PORT+9:DREG=PORT+&HA:TEMP=PORT+&HB
1110 TCH=PORT+&HC:TCM=PORT+&HD:TCL=PORT+&HE
1120 '
1130 GOTO "MAIN"
1140 '
1150 '
1160 LABEL"SETTLEN"
1170 OUT TCH,0
1180 OUT TCM,(TLEN AND &HFF00)\&H100
1190 OUT TCL,TLEN AND &HFF
1200 WAIT PSNS,&B10000000 'Wait REQ Assert
1210 RETURN
1220 '
1230 LABEL"WAITCC"
1240 WAIT INRS,&HFF:R=INP(INRS) XOR &B10000:OUT INRS,&HFF
1250 RETURN
1260 '
1270 LABEL"INITSPC"
1280 OUT SCTL,&B10010000 'SPC Reset & Disable
1290 OUT BDID,SCSIID 'X1turbo SCSI ID
1300 OUT SCMD,0
1310 OUT PCTL,0
1320 OUT TEMP,0
1330 OUT TCH,0
1340 OUT TCM,0
1350 OUT TCL,0
1360 OUT SCTL,&B10000 'SPC Enable, Arbitration Enable
1370 RETURN
1380 '
1390 LABEL"SRST"
1400 OUT INRS,&HFF
1410 OUT SCMD,&B10000 'RST On
1420 OUT SCMD,&B0 'RST Off
1430 RETURN
1440 '
1450 LABEL"SELECT"
1460 OUT PCTL,&H0 'START Selection Phase
1470 WAIT SSTS,&B11110000,&B11111111 'BusFree待ち
1480 OUT SCTL,(INP(SCTL) OR &B10000) 'Arbitration Enable
1490 OUT TEMP,(INP(BDID) OR 2^TARGET)
1500 OUT TCH,&HF
1510 OUT TCM,&H46
1520 OUT TCL,&H4
1530 OUT INRS,&HFF 'Reset Interrupt
1540 OUT SCMD,&B100000 'Command Code = Select
1550 "WAITCC"
1560 'IF R THEN PRINT"Selection Error[";BIN$(R);"]":GOTO"ERR"
1570 RETURN
1580 '
1590 LABEL"COMMAND"
1600 "SETTLEN"
1610 IF (INP(PSNS) AND &B111)<>&B10 THEN PRINT"Command Phase Error":GOTO"ERR"
1620 OUT PCTL,&B10 'Set Command Phase
1630 OUT INRS,&HFF 'Reset Interrupt
1640 OUT SCMD,&B10000100 'Command Code = Transfer
1650 FOR X=0 TO TLEN-1
1660 WAIT SSTS,&B10,&B10 'Check FIFO Full
1670 OUT DREG,CDB(X)
1680 NEXT
1690 "WAITCC"
1700 IF R THEN PRINT"Command Tx Error[";BIN$(R);"]":GOTO"ERR"
1710 RETURN
1720 '
1730 LABEL"DATIN"
1740 "SETTLEN"
1750 IF (INP(PSNS) AND &B111)<>&B1 THEN PRINT"Data In Phase Error":GOTO"ERR"
1760 OUT PCTL,&B1 'Set Data In Phase
1770 OUT INRS,&HFF 'Reset Interrupt
1780 OUT SCMD,&B10000100 'Command Code = Transfer
1790 FOR X=0 TO TLEN-1
1800 WAIT SSTS,&B1,&B1 'Check FIFO Empty
1810 BUF(X)=INP(DREG)
1820 NEXT
1830 "WAITCC"
1840 IF R THEN PRINT"Data In Error[";BIN$(R);"]":GOTO"ERR"
1850 RETURN
1860 '
1870 LABEL"STSMSG"
1880 WAIT PSNS,&B10000000 'Wait REQ Assert
1890 IF (INP(PSNS) AND &B111)<>&B11 THEN PRINT"Status Phase Error":GOTO"ERR"
1900 OUT PCTL,&B11 'Set Status Phase
1910 OUT SCMD,&B11100100 'Set ACK/REQ
1920 WAIT PSNS,&B10000000,&B10000000 'Wait REQ Negate
1930 STAT=INP(TEMP)
1940 OUT SCMD,&B11000100 'Reset ACK/REQ
1950 WAIT PSNS,&B10000000 'Wait REQ Assert
1960 IF (INP(PSNS) AND &B111)<>&B111 THEN PRINT"Message Phase Error":GOTO"ERR"
1970 OUT PCTL,&B111 'Set Message In Phase
1980 OUT SCMD,&B11100100 'Set ACK/REQ
1990 WAIT PSNS,&B10000000,&B10000000 'Wait REQ Negate
2000 MESG=INP(TEMP)
2010 OUT SCMD,&B11000100 'Reset ACK/REQ
2020 RETURN
2030 '
2040 LABEL"ERR":PRINT"SCSI ERROR"
2050 BEEP:"INITSPC":"SRST"
2060 END
2070 '
2080 LABEL"SETCDB"
2090 READ TLEN:FOR R=0 TO TLEN-1:READ CDB(R):NEXT:RETURN
2100 '
2110 LABEL"TESTUNIT"
2120 DATA 6,0,0,0,0,0,0 'testunit
2130 RESTORE"TESTUNIT"
2140 "SETCDB"
2150 "SELECT"
2160 IF R THEN RETURN
2170 "COMMAND"
2180 "STSMSG"
2190 RETURN
2200 '
2210 LABEL"INQUIRY"
2220 DATA 6,&h12,0,0,0,36,0 'inquiry
2230 RESTORE"INQUIRY"
2240 "SETCDB"
2250 "SELECT"
2260 "COMMAND"
2270 TLEN=CDB(4)
2280 "DATIN"
2290 "STSMSG"
2300 RETURN
2310 '
2320 LABEL"DISPDEV"
2330 "INQUIRY"
2340 R$="":FOR R=8 TO 15:R$=R$+CHR$(BUF(R)):NEXT:PRINT R$;" ";
2350 R$="":FOR R=16 TO 31:R$=R$+CHR$(BUF(R)):NEXT:PRINT R$;" ";
2360 R$="":FOR R=32 TO 35:R$=R$+CHR$(BUF(R)):NEXT:PRINT R$;" ";
2370 PRINT "SCSI";HEX$(BUF(2) AND &B111);" ";
2380 ON (BUF(3) AND &B1111)+2 GOTO 2390,2400,2410,2420
2390 PRINT"Nazo ";:GOTO2430
2400 PRINT"SCSI1 ";:GOTO2430
2410 PRINT"CSS ";:GOTO2430
2420 PRINT"SCSI2 ";:GOTO2430
2430 IF (BUF(0) AND &HF)<&HA THEN PRINT DTYPE$(BUF(0) AND &HF); ELSE PRINT"謎";
2440 PRINT
2450 RETURN
2460 '
2470 LABEL"NODEV"
2480 PRINT "-------- ";STRING$(16,"-");" ---- ----- ----- -- 未接続 --"
2490 RETURN
2500 '
2510 LABEL"MAIN"
2520 PRINT"SCSI BUS DEVICE LIST"
2530 RESTORE"MAIN"
2540 FOR R=0 TO 9:READ N$:DTYPE$(R)=N$:NEXT
2550 DATA "ハ-ドディスク","テ-プ","プリンタ","プロセッサ","WONCE","CDROM","スキャナ","光磁気ディスク","メディアチェンジャ","通信"
2560 "INITSPC"
2570 PRINT"--- -------- ---------------- ---- ----- ----- -------------------"
2580 PRINT"No. 製造者 製品名 Rev. 分類"
2590 PRINT"--- -------- ---------------- ---- ----- ----- -------------------"
2600 FOR TARGET=0 TO 6
2610 PRINT"ID";HEX$(TARGET);":";
2620 COLOR5:CFLASH1:PRINT"接続確認中";STRING$(10,&H1D);:CFLASH0:COLOR7
2630 "TESTUNIT"
2640 IF R=0 THEN GOSUB"DISPDEV" ELSE GOSUB"NODEV"
2650 NEXT
2660 PRINT"ID7:SHARP X1TURBO 0085 SCSI1 CSS プロセッサ"
2670 PRINT"--- -------- ---------------- ---- ----- ----- -------------------"