Login

Subversion Repositories NedoOS

Rev

Rev 1643 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

;кодировка 866
;опознаётся неправильно
;поэтому напишем много текста кириллицей
;LAST UPDATE: 30.06.2019 savelij

;АДРЕС ЦИКЛА ОБЩЕНИЯ СО СПЕКОМ
COMINT_         EQU 0X026E

_DEV_READ=2
_DEV_WRITE=3


;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА NeoGS
SETUPSD         EQU 0X5B00

;ДРАЙВЕР SD-CARD ДЛЯ NGS

;ВХОДНЫЕ ПАРАМЕТРЫ ОБЩИЕ:
;HL-АДРЕС ЗАГРУЗКИ В ПАМЯТЬ
;BCDE-32-Х БИТНЫЙ НОМЕР СЕКТОРА
;A-КОЛИЧЕСТВО БЛОКОВ (БЛОК=512 БАЙТ)
;ТОЛЬКО ДЛЯ МНОГОБЛОЧНОЙ ЗАПИСИ/ЧТЕНИИ

;ОШИБКИ ВЫДАВАЕМЫЕ НА ВЫХОДЕ:
;A=0-ИНИЦИАЛИЗАЦИЯ ПРОШЛА УСПЕШНО
;A=1-КАРТА НЕ НАЙДЕНА ИЛИ НЕ ОТВЕТИЛА

;ЗАПИСЬ "A" СЕКТОРОВ
;SDWRMUL                EX AF,AF'
writesectorsGS
                LD A,_DEV_WRITE
                CALL COMM2SD
                EX AF,AF'
                PUSH DE
                PUSH BC
                LD BC,GSDAT
SDWRSN1         EX AF,AF'

                OUT (GSCOM),A
                CALL WC_
                LD DE,0X0200
SDWRSN2         OUTI
                CALL WD_
                DEC DE
                LD A,D
                OR E
                JR NZ,SDWRSN2
                EX AF,AF'
                DEC A
                JR NZ,SDWRSN1
                CALL WN_
                IN A,(GSDAT)
                ;CP 0X99                                ;КАРТА ПОТЕРЯЛАСЬ ПО ВРЕМЯ ЧТЕНИЯ/ЗАПИСИ
                ;JP Z,SD_CARD_LOST
                POP BC
                POP DE
                XOR A
                RET

;ЧТЕНИЕ "A" СЕКТОРОВ
;SDRDMUL                EX AF,AF'

readsectorsGS
                LD A,_DEV_READ
                CALL COMM2SD
                EX AF,AF'
                PUSH DE
                PUSH BC
                ;LD D,A
                ;LD A,IYL
                ;BIT 1,A
                ;JR NZ,SDRDSN3
                ;AND A
                ;JR NZ,SDRDSN5
;SDRDSN3               
;               LD A,(R_7FFD)
                ;READ_7FFD
                ;AND 0X10
                ;LD BC,(B0_CPU2)
                ;JR Z,SDRDSN4
                ;LD BC,(B1_CPU2)
;SDRDSN4
                ;LD A,0X37
                ;OR B
                ;LD B,A
                ;LD A,C
                ;LD C,LOW (WIN_A0)
                ;OUT (C),A
;SDRDSN5
                ;LD A,D
                LD BC,GSDAT
SDRDSN1         EX AF,AF'

                OUT (GSCOM),A   ;FC
                IN A,(GSCOM)
                RRA
                JR C,$-3
                LD DE,0X0200                    ;ПРОДОЛЖАЕМ ЕСЛИ ВСЕ В ПОРЯДКЕ
SDRDSN2         IN A,(GSCOM)
                RLA
                JR NC,$-3
                INI
                DEC DE
                LD A,D
                OR E
                JR NZ,SDRDSN2
                EX AF,AF'
                DEC A
                JR NZ,SDRDSN1
                IN A,(GSCOM)
                RLA
                JR NC,$-3
                IN A,(GSDAT)
                CP 0X99                         ;КАРТА ПОТЕРЯЛАСЬ ПО ВРЕМЯ ЧТЕНИЯ/ЗАПИСИ
                ;JP Z,SD_CARD_LOST
                ;LD BC,WIN_P6
                XOR A
                ;OUT (C),A
                POP BC
                POP DE
                RET
               
                display "GS_INIT ",$
GS_INIT
        XOR A
        OUT (GSDAT),A
        ld a,0x23 ;Get number of RAM Pages
        OUT (GSCOM),A
        halt
        halt
        IN A,(GSDAT)
        inc a
        cp 3+1
        jr c,SD_NO ;не может быть <3 pages or 0xff pages
               
                ;в еве драйвер уже установлен ЕРСом
                if atm != 1
        JP INSTSDD
                endif

;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
GSDINIT         XOR A
GSDINIT1        CALL COMM2SD
                CALL WN_
GSDINIT2        IN A,(GSDAT)
GSDINIT3        ;CP 0X99                                ;КАРТА ПОТЕРЯЛАСЬ ПО ВРЕМЯ ЧТЕНИЯ/ЗАПИСИ
                ;JP Z,SD_CARD_LOST
                CP 0X77
                JR NZ,SD_NO
                XOR A
                RET

SD_NO           LD A,1
                RET

;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
COMM2SD         OUT (GSDAT),A           ;УШЛА КОМАНДА ДРАЙВЕРУ
                LD A,0X1E
                OUT (GSCOM),A
                CALL WC_                ;УШЛА КОМАНДА ПРОШИВКЕ
                bit 6,a ;ждет ли команда данные
                jr z,SD_DRV_PRESENT
                pop af ;снимем со стека адрес возврата
                xor a
                JR SD_NO ;если команда не ждет данные, то считаем что драйвер не установлен
SD_DRV_PRESENT:
                LD A,B
                OUT (GSDAT),A
                CALL WD_                ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ ;savelij13: тут виснет
                LD A,C
                OUT (GSDAT),A
                CALL WD_                ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
                LD A,D
                OUT (GSDAT),A
                CALL WD_                ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
                LD A,E
                OUT (GSDAT),A
                CALL WD_                ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
                EX AF,AF'

                OUT (GSDAT),A
                EX AF,AF'
                ds 9,0
                RET                     ;УШЛО КОЛ-ВО СЕКТОРОВ

;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
WD_             IN A,(GSCOM)
                RLA
                JR C,$-3
                RET

;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
WN_             IN A,(GSCOM)
                RLA
                JR NC,$-3
                RET

;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
WC_             IN A,(GSCOM)
                RRA
                JR C,$-3
                RET

                if atm != 1
;УСТАНОВЩИК ДРАЙВЕРА НА NeoGS
INSTSDD
                LD BC,GSCFG0
                IN A,(C)
                CP 0xFF
                JP NZ,NEOGSINIT
;ИНИЦИАЛИЗАЦИЯ ОРИГИНАЛЬНОГО GS ПОКА НИЧЕГО НЕ ДЕЛАЕМ, 2МБ версия может резетится 10 секунд, нужно выждать перед повторным сбросом и после, перед следующими коммандами.
ORGGSINIT
;               LD A,0xF4
;               OUT (GSCOM),A                   ;ПОЛНЫЙ СБРОС GS
                JP SD_NO
;ИНИЦИАЛИЗАЦИЯ NeoGS
NEOGSINIT
                LD A,0X80
                OUT (GSCTR),A                   ;ПОЛНЫЙ СБРОС NEOGS
                ;EI
                HALT
                ;EI
                HALT
                ;EI
                HALT
                ;DI
                LD A,0XF3
                OUT (GSCOM),A
                LD B,0X30
ISDD1           ;EI
                HALT
                ;DI
                DEC B
                JR Z,SD_NO
                IN A,(GSCOM)
                RRA
                JR C,ISDD1
                LD BC,GSDAT
                IN A,(C)
                LD DE,0X0300
                LD HL,SETUPSD
                OUT (C),E
                LD A,0X14
                OUT (GSCOM),A
                CALL WC_
                OUT (C),D
                CALL WD_
                OUT (C),L
                CALL WD_
                OUT (C),H
                CALL WD_
                LD HL,UKLAD1
ISDD3           OUTI
                CALL WD_
                DEC DE
                LD A,D
                OR E
                JR NZ,ISDD3
                LD HL,SETUPSD
                OUT (C),L
                LD A,0X13
                OUT (GSCOM),A
                CALL WC_
                OUT (C),H
                ;EI
                HALT
                ;EI
                HALT
                ;DI
                LD B,3
                IN A,(GSDAT)
                DEC B
                JP Z,SD_NO
                CP 0X77
                JP NZ,SD_NO
                XOR A
                JP GSDINIT

UKLAD1  ;ОТКУДА КОД НА НГС ЗАКИДЫВАТЬ
        incbin "ngssd.bin"
       
                endif