NEMO IDE DRIVER in FATALL:
Код:
;LAST UPDATE: 04.03.2010 savelij

Hddinit EQU 0
Hddoff  EQU 1
Hddrds  EQU 2
Hddrdm  EQU 3
Hddwrs  EQU 4
Hddwrm  EQU 5

;Ž�™?ź ’Ž—Š? ‚•Ž„? „‹ź �?�Ž’› ‘ HDD NEMO
        EXA
        EX (SP),HL
        LD A,(HL)
        INC HL
    EX (SP),HL
    ADD A,A
    PUSH HL
    LD HL,TBLHDDN
    ADD A,L
    LD L,A
    LD A,H
    ADC A,0
    LD H,A
    LD A,(HL)
    INC HL
    LD H,(HL)
    LD L,A
    EXA
    EX (SP),HL
    RET

TBLHDDN DW HDDINIT    ;INIT HDD
        DW HDDOFF
        DW HDDRDS    ;READ SINGLE SECTOR
        DW HDDRDM    ;READ MULTI SECTOR
        DW HDDWRS    ;SAVE SINGLE SECTOR
        DW HDDWRM    ;SAVE MULTI SECTOR

;‚室*ëĄ Ż*ŕ*¬Ąâŕë ®ˇé¨Ą:
;HL-*¤ŕĄá §*Łŕă§Ş¨ ˘ Ż*¬ďâě
;BCDE-32-ĺ ˇ¨â*ë© *®¬Ąŕ ᥪâ®ŕ*
;A-Ş®«¨çĄá⢮ ˇ«®Ş®˘ (ˇ«®Ş=512 ˇ*©â)
;⮫쪮 ¤«ď ¬*®Ł®ˇ«®ç*®© §*ݍá¨/çâĄ*¨¨

P_1F7   EQU #F0            ;�…ƒˆ‘’� ‘Ž‘’ŽźŤˆź/�…ƒˆ‘’� ŠŽŚ?Ť„
P_1F6   EQU #D0            ;CHS-ŤŽŚ…� ƒŽ‹Ž‚› ˆ “‘’�/LBA ?„�…‘ 24-27
P_1F5   EQU #B0            ;CHS-–ˆ‹ˆŤ„� 8-15/LBA ?„�…‘ 16-23
P_1F4   EQU #90            ;CHS-–ˆ‹ˆŤ„� 0-7/LBA ?„�…‘ 8-15
P_1F3   EQU #70            ;CHS-ŤŽŚ…� ‘…Š’Ž�?/LBA ?„�…‘ 0-7
P_1F2   EQU #50            ;‘—…’—ˆŠ ‘…Š’Ž�Ž‚
P_1F1   EQU #30            ;ŹŽ�’ Ž˜ˆ�ŽŠ/‘‚މ‘’‚
P_1F0   EQU #10            ;ŹŽ�’ „?ŤŤ›•
P_3F6   EQU #C8            ;�…ƒˆ‘’� ‘Ž‘’ŽźŤˆź/“Ź�?‚‹…Ťˆź
P_HI    EQU #11            ;‘’?�˜ˆ… 8 �ˆ’
PRT_RW  EQU P_1F0*256+P_HI    ;ŹŽ�’› —’…Ťˆź/‡?Źˆ‘ˆ Ž„ŤˆŚ ‘‹Ž‚ŽŚ

;Ť? ‚›•Ž„…:
;H-„‹ź MASTER 0-HDD, 1-CDROM, #FF-NONE
;L-„‹ź SLAVE  0-HDD, 1-CDROM, #FF-NONE
HDDINIT    LD A,#E0
    PUSH HL
    CALL ID_DEV
    POP HL
    AND A
    CALL Z,INIT_91
    LD D,A
    LD A,#F0
    PUSH DE
    PUSH HL
    CALL ID_DEV
    POP HL
    AND A
    CALL Z,INIT_91
    POP HL
    LD L,A
    XOR A

HDDOFF    RET

INIT_91    PUSH HL
    LD L,49*2+1,A,(HL)
    AND 2
    JR Z,INI_912
    LD BC,#FF00+P_1F2
    LD L,#0C
    LD A,(HL)
    OUT (C),A
    LD L,6
    LD C,P_1F6
    LD A,(HL)
    DEC A
    OUT (C),A
    LD C,P_1F7
    LD A,#91
    OUT (C),A
    LD DE,#1000
INI_911    DEC DE
    LD A,D
    OR E
    JR Z,INI_912
    IN A,(C)
    AND #80
    JR NZ,INI_911
    POP HL
    RET

INI_912    LD A,#FF
    POP HL
    RET

;READ 1 SECTOR HDD
HDDRDS    LD A,1

;READ "A" SECTORS HDD
HDDRDM    PUSH BC
    PUSH DE
    CALL SETHREG
    EXA
    LD C,P_1F7
    LD A,#20
    OUT (C),A
    LD C,P_1F7
HDDRD1    IN A,(C)
    AND #88
    CP 8
    JR NZ,HDDRD1
    EXA
HDDRD2    EXA
    CALL READSEC
    LD C,P_1F7
HDDRD3    IN A,(C)
    AND #80
    JR NZ,HDDRD3
    EXA
    DEC A
    JR NZ,HDDRD2
    JR EXITNHD

;WRITE 1 SECTOR HDD
HDDWRS    LD A,1

;WRITE "A" SECTORS HDD
HDDWRM    PUSH BC
    PUSH DE
    CALL SETHREG
    EXA
    LD C,P_1F7
    LD A,#30
    OUT (C),A
    LD C,P_1F7
HDDWR1    IN A,(C)
    AND #88
    CP 8
    JR NZ,HDDWR1
    EXA
HDDWR2    EXA
    CALL WRITSEC
    LD C,P_1F7
HDDWR3    IN A,(C)
    AND #80
    JR NZ,HDDWR3
    EXA
    DEC A
    JR NZ,HDDWR2
EXITNHD POP DE
    POP BC
    LD A,B
    AND #0F
    LD B,A
    XOR A
    RET

;READ SECTOR (512 BYTES)
READSEC    LD DE,PRT_RW
    LD A,#40
READSC1    LD C,D
    INI
    LD C,E
    INI
    LD C,D
    INI
    LD C,E
    INI
    LD C,D
    INI
    LD C,E
    INI
    LD C,D
    INI
    LD C,E
    INI
    DEC A
    JR NZ,READSC1
    RET

;SAVE SECTOR (512 BYTES)
WRITSEC    EXX
    PUSH HL
    LD HL,0
    ADD HL,SP
    EXX
    LD SP,HL
    LD A,#40
    LD HL,PRT_RW
WR_SEC1    POP DE
    LD C,L
    OUT (C),D
    LD C,H
    OUT (C),E
    POP DE
    LD C,L
    OUT (C),D
    LD C,H
    OUT (C),E
    POP DE
    LD C,L
    OUT (C),D
    LD C,H
    OUT (C),E
    POP DE
    LD C,L
    OUT (C),D
    LD C,H
    OUT (C),E
    DEC A
    JR NZ,WR_SEC1
    LD HL,0
    ADD HL,SP
    EXX
    LD SP,HL
    POP HL
    EXX
    RET

;SET HDD PORTS
SETHREG    PUSH DE
    LD D,B
    LD E,C
    LD BC,#FF00+P_1F6
    OUT (C),D
    EXA
    LD C,P_1F7
SETHRE1    IN A,(C)
    AND #80
    JR NZ,SETHRE1
    LD C,P_1F5
    OUT (C),E
    POP DE
    LD C,P_1F4
    OUT (C),D
    LD C,P_1F3
    OUT (C),E
    LD C,P_1F2
    EXA
    OUT (C),A
    RET

;HL-?„�…‘ �“”…�? ‘…Š’Ž�? ˆ„…Ť’ˆ”ˆŠ?–ˆˆ
;A=E0-„‹ź MASTER, A=F0-„‹ź SLAVE
ID_DEV    LD BC,#FF00+P_1F6
    OUT (C),A
    LD C,P_1F7
    LD D,26
ID_DEV3    EI
    HALT
    DI
    DEC D
    JR Z,NO_DEV
    IN A,(C)
    BIT 7,A
    JR NZ,ID_DEV3
    AND A
    JR Z,NO_DEV
    INC A
    JR Z,NO_DEV
    XOR A
    LD C,P_1F5
    OUT (C),A
    LD C,P_1F4
    OUT (C),A
    LD A,#EC
    LD C,P_1F7
    OUT (C),A
    LD C,P_1F7
ID_DEV1    IN A,(C)
    AND A
    JR Z,NO_DEV
    INC A
    JR Z,NO_DEV
    DEC A
    RRCA
    JR C,ID_DEV2
    RLCA
    AND #88
    CP 8
    JR NZ,ID_DEV1
ID_DEV2    LD C,P_1F4
    IN E,(C)
    LD C,P_1F5
    IN D,(C)
    LD A,D
    OR E
    JP Z,READSEC
    LD HL,#EB14
    SBC HL,DE
    LD A,1
    RET Z
NO_DEV    LD A,#FF
    RET