Login

Subversion Repositories NedoOS

Rev

Rev 356 | Rev 1039 | Go to most recent revision | 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

P_DATA          EQU 0X57
P_CONF          EQU 0X77

CMD_09          EQU 0X49        ;SEND_CSD
CMD_12          EQU 0X4C        ;STOP_TRANSMISSION
CMD_17          EQU 0X51        ;READ_SINGLE_BLOCK
CMD_18          EQU 0X52        ;READ_MULTIPLE_BLOCK
CMD_24          EQU 0X58        ;WRITE_BLOCK
CMD_25          EQU 0X59        ;WRITE_MULTIPLE_BLOCK
CMD_55          EQU 0X77        ;APP_CMD
CMD_58          EQU 0X7A        ;READ_OCR
CMD_59          EQU 0X7B        ;CRC_ON_OFF
ACMD_41         EQU 0X69        ;SD_SEND_OP_COND

;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА 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
GS_INIT
        ;jr SD_NO ;savelij13: please fix
;ПРОВЕРКА НАЛИЧИЯ КАРТОЧКИ
;GSDCMP         ;LD H,CMOS_BYTE_01
                ;ROMCALL READCMOS,ROM_RST82
                ;LD A,L
                ;AND M_ACCESSSDG                        ;ПРОВЕРКА РАЗРЕШЕНИЯ ДОСТУПА К SD КАРТЕ NEOGS
                ;JR Z,SD_NO                     ;ВЫХОД ЕСЛИ ДОСТУП К КАРТОЧКЕ ЗАПРЕЩЕН
                ;LD A,(FLAGS_DRV)
                ;AND B_INST_SDG
                ;JR Z,SD_NO                     ;ВЫХОД ЕСЛИ ДРАЙВЕР НЕ УСТАНОВЛЕН
                XOR A
                OUT (GSDAT),A
                LD A,0X1D ;??? нет такой команды
                 ld a,0x23 ;Get number of RAM Pages
                OUT (GSCOM),A
                ;IN A,(GSCOM)
                ;RRA
                ;JR C,$-3
                 halt
                 halt
                IN A,(GSDAT)
                ;LD D,A
                ;AND 0X0F
                ;LD E,A
                ;LD A,D
                ;AND 0XF0
                ;RRCA
                ;RRCA
                ;RRCA
                ;RRCA
                ;CP E
                ;LD A,1
                ;JR NZ,GSDINIT1
                 inc a
                 cp 3+1
                 jr c,SD_NO ;не может быть <3 pages or 0xff pages
                CALL INSTSDD

;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
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_                ;УШЛА КОМАНДА ПРОШИВКЕ
                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

;УСТАНОВЩИК ДРАЙВЕРА НА NeoGS
INSTSDD         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
                RET

UKLAD1  ;ОТКУДА КОД НА НГС ЗАКИДЫВАТЬ

                ;PHASE SETUPSD
SETUPSD=$
;САМ УСТАНОВЩИК ДРАЙВЕРА ДЛЯ NeoGS
                ;DI
                LD A,0X9C
                OUT (SCTRL),A           ;КОНФИГУРАТОР NeoGS
                CALL AVTODET
                AND A
                LD A,0X77               ;0X77-NeoGS НАЙДЕН
                JR Z,$+4
                LD A,0XCC               ;0XCC-НАЙДЕН OLDGS
                OUT (ZXDATWR),A
                OUT (CLRCBIT),A
                JP NZ,COMINT_
                ;DI
                IN A,(GSCFG0)
                RES B_RAMRO,A
                OUT (GSCFG0),A
                LD HL,0X1D00
                LD (0X0300+(0X1E*2)),HL
                LD DE,UKLAD2
                LD BC,GSDDRVE-GSDDRV
                EX DE,HL
                LDIR
                IN A,(GSCFG0)
                SET B_RAMRO,A
                OUT (GSCFG0),A
                JP COMINT_

;ПРОВЕРКА ЧТО ЭТО NeoGS И ВКЛЮЧЕНИЕ ЧАСТОТЫ 24MHz
AVTODET         IN A,(GSCFG0)
                AND 0XCF
                OUT (GSCFG0),A          ;ОБРАТНАЯ ЗАПИСЬ В ПОРТ СО СБРОШЕННЫМИ
                                        ;БИТАМИ 5-4 ВКЛЮЧАЕТ ЧАСТОТУ ПРОЦЕССОРА
                                        ;РАВНЫМ 24 МГц
                LD D,A
                IN A,(GSCFG0)
                CP D
                LD A,0
                RET Z
                DEC A
                RET

UKLAD2  ;ОТКУДА КОД ПЕРЕКИДЫВАТЬ

                ;DEPHASE

                ;PHASE 0X1D00
_shift=0x1d00-$

;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С SD КАРТОЙ
GSDDRV=$+_shift
                DI
                IN A,(ZXDATRD)          ;ПРИЕМ КОМАНДЫ ДРАЙВЕРА
                OUT (CLRCBIT),A         ;СБРОС COMANDBIT
                LD HL,COMINT_
                PUSH HL
                PUSH IY
                LD IYH,0X77
                ADD A,A
                LD E,A
                LD D,0
                LD HL,TABLSDG
                ADD HL,DE
                LD E,(HL)
                INC HL
                LD D,(HL)
                EX DE,HL
                CALL WDY
                IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 31-24 ПАРАМЕТРА
                LD B,A
                CALL WDY
                IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 23-16 ПАРАМЕТРА
                LD C,A
                CALL WDY
                IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 15-8 ПАРАМЕТРА
                LD D,A
                CALL WDY
                IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 7-0 ПАРАМЕТРА
                LD E,A
                CALL WDY
                IN A,(ZXDATRD)          ;ПРИЕМ КОЛ-ВО СЕКТОРОВ
                JP (HL)

TABLSDG=$+_shift
                DW SDINITG              ;0 ПАРАМЕТРОВ НЕ ТРЕБУЕТ, НА ВЫХОДЕ A
                                        ;СМОТРИ ВЫШЕ ПЕРВЫЕ 2 ЗНАЧЕНИЯ
                DW SDCMPG               ;1 ПРОВЕРКА НАЛИЧИЯ SD КАРТЫ
                DW RDMULG               ;2 ЧИТАТЬ "A" СЕКТОРОВ
                DW WRMULG               ;3 ПИСАТЬ "A" СЕКТОРОВ

SDCMPG=$+_shift
                LD A,CMD_58
                LD BC,SD_RSTR
                CALL OUT_COG
                CALL INOOUTG
                IN A,(C)
                NOP
                IN H,(C)
                NOP
                IN H,(C)
                NOP
                IN H,(C)
                INC A
                JP NZ,OK_WORK
                LD IYH,0X88                     ;КАРТА НЕ ПРОШЛА ПРОВЕРКУ НА НАЛИЧИЕ
                JP OK_WORK

ZAW003G         LD IYH,0XEE                     ;КАРТА НЕ ОБНАРУЖЕНА
                JP OK_WORK

SDINITG=$+_shift
                CALL CSHIGHG
                LD BC,SD_SEND
                LD DE,0X20FF
                OUT (C),E
                DEC D
                JR NZ,$-3
                LD BC,SD_RSTR
                XOR A
                EX AF,AF'

ZAW001G         LD HL,CMD00G
                CALL OUTCOMG
                CALL INOOUTG
                EX AF,AF'
                DEC A
                JR Z,ZAW003G
                EX AF,AF'

                DEC A
                JR NZ,ZAW001G
                LD HL,CMD08G
                CALL OUTCOMG
                CALL INOOUTG
                IN H,(C)
                NOP
                IN H,(C)
                NOP
                IN H,(C)
                NOP
                IN H,(C)
                LD HL,0
                BIT 2,A
                JR NZ,ZAW006G
                LD H,0X40
ZAW006G         LD A,CMD_55
                CALL OUT_COG
                CALL INOOUTG
                LD BC,SD_SEND
                LD A,ACMD_41
                OUT (C),A
                NOP
                OUT (C),H
                NOP
                OUT (C),L
                NOP
                OUT (C),L
                NOP
                OUT (C),L
                LD A,0XFF
                OUT (C),A
                CALL INOOUTG
                AND A
                JR NZ,ZAW006G
ZAW004G         LD A,CMD_59
                CALL OUT_COG
                CALL INOOUTG
                AND A
                JR NZ,ZAW004G
ZAW005G         LD HL,CMD16G
                CALL OUTCOMG
                CALL INOOUTG
                AND A
                JR NZ,ZAW005G
                JP OK_WORK

CSHIGHG=$+_shift
                PUSH AF
                LD A,M_SDNCS+M_SNCLR    ;0X81
                OUT (SCTRL),A
                POP AF
                RET

CSLOWG=$+_shift
                PUSH AF
                LD A,M_SDNCS            ;1
                OUT (SCTRL),A
                POP AF
                RET

OUTCOMG=$+_shift
                CALL CSLOWG
                PUSH BC
                LD BC,0X0600+SD_SEND
                OTIR
                POP BC
                RET

OUT_COG=$+_shift
                PUSH BC
                CALL CSLOWG
                LD BC,SD_SEND
                OUT (C),A
                XOR A
                OUT (C),A
                NOP
                OUT (C),A
                NOP
                OUT (C),A
                NOP
                OUT (C),A
                DEC A
                OUT (C),A
                POP BC
                RET

SECM20G=$+_shift
                PUSH HL
                PUSH DE
                PUSH BC
                PUSH AF
                PUSH BC
                LD A,CMD_58
                LD BC,SD_RSTR
                CALL OUT_COG
                CALL INOOUTG
                IN A,(C)
                NOP
                IN H,(C)
                NOP
                IN H,(C)
                NOP
                IN H,(C)
                INC A
                JR NZ,SECN20G1
                LD IYH,0X99                     ;КАРТА ПОТЕРЯЛАСЬ
SECN20G1        DEC A
                BIT 6,A
                POP HL
                JR NZ,SECN20G
                EX DE,HL
                ADD HL,HL
                EX DE,HL
                ADC HL,HL
                LD H,L
                LD L,D
                LD D,E
                LD E,0
SECN20G         POP AF
                LD BC,SD_SEND
                OUT (C),A
                NOP
                OUT (C),H
                NOP
                OUT (C),L
                NOP
                OUT (C),D
                NOP
                OUT (C),E
                LD A,0XFF
                OUT (C),A
                POP BC
                POP DE
                POP HL
                RET

INOOUTG=$+_shift
                PUSH DE
                LD DE,0X80FF
INWAITG         IN A,(SD_RSTR)
                CP E
                JR NZ,INEXITG
                DEC D
                JR NZ,INWAITG
INEXITG         POP DE
                RET

CMD00G=$+_shift
                DB 0X40,0X00,0X00,0X00,0X00,0X95        ;GO_IDLE_STATE
CMD08G=$+_shift
                DB 0X48,0X00,0X00,0X01,0XAA,0X87        ;SEND_IF_COND
CMD16G=$+_shift
                DB 0X50,0X00,0X00,0X02,0X00,0XFF        ;SET_BLOCKEN

;ПЕРЕДАЧА ОДНОГО СЕКТОРА В SD КАРТУ
WRSECTG=$+_shift
                LD BC,SD_SEND
                OUT (SD_SEND),A
                IN A,(ZXSTAT)
                RRA
                JR NC,$-3
                OUT (CLRCBIT),A
                LD HL,0X0200
WRSECTG1        CALL WDY
                IN A,(ZXDATRD)
                DEC HL
                OUT (C),A
                LD A,H
                OR L
                JR NZ,WRSECTG1
                LD A,0XFF
                OUT (C),A
                NOP
                OUT (C),A
                RET

;ПЕРЕДАЧА ОДНОГО СЕКТОРА НА СПЕК
RDSECTG=$+_shift
                IN A,(ZXSTAT)
                RRA
                JR NC,$-3
                OUT (CLRCBIT),A
                LD BC,SD_RSTR
                LD HL,0X0200
RDSECTG1        IN A,(C)
                DEC HL
                OUT (ZXDATWR),A
                CALL WDN
                LD A,H
                OR L
                JR NZ,RDSECTG1
                IN A,(C)
                NOP
                IN A,(C)
                RET

;ЗАПИСЬ "A" СЕКТОРОВ
WRMULG=$+_shift
                EX AF,AF'
                LD A,CMD_25
                CALL SECM20G
                LD A,IYH
                CP 0X99
                JR Z,ERR_WR_LOST
WRMULG3         CALL INOOUTG
                INC A
                JR NZ,WRMULG3
                EX AF,AF'

WRMULG1         EX AF,AF'
                LD A,0XFC
                CALL WRSECTG
WRMULG2         CALL INOOUTG
                INC A
                JR NZ,WRMULG2
                EX AF,AF'

                DEC A
                JR NZ,WRMULG1
                LD C,SD_SEND
                LD A,0XFD
                OUT (C),A
                CALL INOOUTG
                INC A
                JR NZ,$-4
                JP OK_WORK

ERR_WR_LOST     LD BC,SD_SEND
                OUT (SD_SEND),A
                IN A,(ZXSTAT)
                RRA
                JR NC,$-3
                OUT (CLRCBIT),A
                LD HL,0X0200
ERRWRLOST1      CALL WDY
                IN A,(ZXDATRD)
                DEC HL
                LD A,H
                OR L
                JR NZ,ERRWRLOST1
                JP OK_WORK

ERR_RD_LOST     IN A,(ZXSTAT)
                RRA
                JR NC,$-3
                OUT (CLRCBIT),A
                LD BC,SD_RSTR
                LD HL,0X0200
ERRRDLOST1      XOR A
                OUT (ZXDATWR),A
                CALL WDN
                DEC HL
                LD A,H
                OR L
                JR NZ,ERRRDLOST1
                JP OK_WORK

;ЗАГРУЗКА "A" СЕКТОРОВ
RDMULG=$+_shift
                EX AF,AF'
                LD A,CMD_18
                CALL SECM20G
                LD A,IYH
                CP 0X99
                JR Z,ERR_RD_LOST
                EX AF,AF'

RDMULG1         EX AF,AF'
                CALL INOOUTG
                CP 0XFE
                JR NZ,$-5
RDMULG5         CALL RDSECTG
                EX AF,AF'

                DEC A
                JR NZ,RDMULG1
                LD A,CMD_12
                CALL OUT_COG
RDMULG3         CALL INOOUTG
                INC A
                JR NZ,RDMULG3

OK_WORK=$+_shift
                CALL CSHIGHG
                LD A,IYH
                POP IY

OUTSTAT=$+_shift
                OUT (ZXDATWR),A

;ОЖИДАНИЕ КОГДА СПЕК ЗАБЕРЕТ БАЙТ ДАННЫХ
WDN=$+_shift
                IN A,(ZXSTAT)
                RLA
                JR C,$-3
                RET

;ОЖИДАНИЕ КОГДА СПЕК ДАСТ БАЙТ ДАННЫХ
WDY=$+_shift
                IN A,(ZXSTAT)
                RLA
                JR NC,$-3
                RET
GSDDRVE=$+_shift
                ;DEPHASE