; ページングなしの環境、137GB超のHDの1台のみをPrimary masterに接続
; BIOSでUDMA2に指定、BIOS有効
; 32GB超のHDにてハングするのは、8GBしか利用できない古いBIOSを使うなどして回避
; I/O アドレスの配置は、Bus Dev Func Class Base address
; [0]:[xx] SCSI H/A 6000h 6008h 6010h 600Ch C000h ROM(xxxxh) これに限る。
org 100h ; for MS-DOS .COM file
start:
0100 BA 00 60 83 C2 06 B0 E0-EE BB F0 01 C1 EB 04 8C
0110 D8 03 C3 8B D8 C1 E3 04-89 1E E0 01 C1 E8 04 88
0120 26 E2 01 BB E0 01 C1 EB-04 8C D8 03 C3 8B D8 C1
0130 E3 04 89 1E E8 01 C1 E8-04 88 26 EA 01 BA 00 C0
0140 83 C2 04 A1 E8 01 EF 83-C2 02 A1 EA 01 EF BA 00
0150 C0 B0 08 EE BA 08 60 83-C2 02 EC A8 80 0F 85 F9
0160 FF BA 00 C0 EC 24 FE EE-BA 00 C0 83 C2 02 B0 04
0170 EE BA 00 60 42 B0 00 EE-42 B0 00 EE 42 B0 0F EE
0180 42 B0 00 EE 42 B0 00 EE-42 83 EA 04 B0 02 EE 42
0190 B0 FF EE 42 B0 FF EE 42-B0 FF EE 42 B0 E0 EE 42
01A0 B0 25 EE 42 BA 00 C0 EC-0C 01 EE BA 08 60 83 C2
01B0 02 EC A8 80 0F 85 10 00-EC A8 01 0F 84 09 00 B0
01C0 65 CD 29 B8 01 4C CD 21-BA 00 C0 EC 24 FE EE B8
01D0 00 4C CD 21
prddata label byte
01E0 00 00 00 00 00 04 00 80-00 00 00 00 00 00 00 00
readbuffer label byte
01F0 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF
; このあたりは、全部 ff です。
05E0 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF
end start
UIDE-98 でも、Bigdrives のHD を扱えるじゃないか! ドライバ作れ(怒)!
怒りの会話でした。
いじょ。
役に立ちそうなのでage!
;上のは、U-DMA READ ext のサンプルなので、今回は、U-DMA WRITE ext のサンプルなどを。実行条件は、上と同じ。
code SEGMENT BYTE PUBLIC
org 100h ; for MS-DOS .COM file
start:
; device select
mov dx,06000h
add dx,6
mov al,0e0h ; master
out dx,al ; device register
; making PRD
lea bx,[buffer]
shr bx,4
mov ax,ds
add ax,bx ; pysical linear address
mov bx,ax
shl bx,4
mov word ptr [prddata],bx
shr ax,4
mov byte ptr [prddata+2],ah
; calculate pysical linear address at PRD
mov bx,offset prddata
shr bx,4
mov ax,ds
add ax,bx ; pysical linear address
mov bx,ax
shl bx,4
mov word ptr [linearprd],bx
shr ax,4
mov byte ptr [linearprd+2],ah
; set PRD on UIDEcard
mov dx,0c000h
add dx,4
mov ax,word ptr [linearprd]
out dx,ax
add dx,2
mov ax,word ptr [linearprd + 2]
out dx,ax
; set read/write control
mov dx,0c000h
mov al,0
out dx,al ; read write control
; check alternate status register
mov dx,6008h
add dx,2
@@: in al,dx
test al,080h
jnz @b
; clear busmaster start bit
mov dx,0c000h
in al,dx
and al,0feh
out dx,al
; clear Interrupt flag
mov dx,0c000h
add dx,2
mov al,4
out dx,al ; This bits is cleared
; when '1' is written to it by software.
; set command block registers
mov dx,06000h
inc dx
mov al,00h
out dx,al ; features register(dummy data)
inc dx
mov al,00h
out dx,al ; sector count previous register
inc dx
mov al,0fh
out dx,al ; LBA low previous register
inc dx
mov al,00h
out dx,al ; LBA mid previous register
inc dx
mov al,00h
out dx,al ; LBA high previous register
inc dx
sub dx,4
mov al,02h
out dx,al ; sector count current register
inc dx
mov al,0ffh
out dx,al ; LBA low current register
inc dx
mov al,0ffh
out dx,al ; LBA mid current register
inc dx
mov al,0ffh
out dx,al ; LBA high current register
inc dx
mov al,0e0h
out dx,al ; device head register
inc dx
mov al,035h ; 25h:Read, 35h:Write DMA ext
out dx,al ; command register
inc dx
; set busmaster start bit
mov dx,0c000h
in al,dx
or al,1
out dx,al
; check alternate status register
mov dx,06008h
add dx,2
@@: in al,dx
test al,80h
jnz @f ; 手抜き
in al,dx
test al,01h
jz @f
mov al,'e' ; エラー
int 29h
mov ax,4c01h
int 21h
@@:
; clear busmaster bit
mov dx,0c000h
in al,dx
and al,0feh
out dx,al
; normal end
mov ax,4c00h
int 21h
code ENDS
data SEGMENT PARA PUBLIC
prddata dd 00000000h ; PYSICAL ADDRESS
dw 0400h ; transfar_bytes ; (200h以上32k未満)
dw 8000h ; EndOfTransfar
linearprd dd 00000000h
data ENDS
work SEGMENT PARA PUBLIC
buffer db 400h dup (011h) ; 書きこむデータ
work ENDS
end start
; コレを実行後、上のU-DMA READ ext をexdeb で実行すると、readbufferの内容が、U-DMA WRITE extで
;書きこんだとおりになるので、Bigdrives 読み書き可である。で、結論は、ドライバ作れよ(怒)となるわけだ。
(誤) jnz @f ; 手抜き
--------------------------------
(正) jnz @b ; 手抜き