8086アセンブラで会話しよう。

このエントリーをはてなブックマークに追加
149ナイコンさん
; ページングなしの環境、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 を扱えるじゃないか! ドライバ作れ(怒)!
怒りの会話でした。
いじょ。
150ナイコンさん:03/01/20 06:56
役に立ちそうなのでage!
151その1:03/01/20 23:00
;上のは、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
152その2:03/01/20 23:01
    ; 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
153その3:03/01/20 23:02
    ; 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
154その4:03/01/20 23:03
    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
155その5:03/01/20 23:04
    ; 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
@@:    
156その6:03/01/20 23:10
    ; 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 読み書き可である。で、結論は、ドライバ作れよ(怒)となるわけだ。
157間違えた。:03/01/20 23:17
(誤) jnz   @f  ; 手抜き
--------------------------------
(正) jnz   @b  ; 手抜き