?login_element?

Subversion Repositories NedoOS

Rev

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

  1. MODULE SAVELIJ  ;15950
  2.   PUBLIC disk_initialize
  3.   PUBLIC disk_read
  4.   PUBLIC disk_write
  5.   PUBLIC disk_status
  6.   EXTERN dio_par
  7.  
  8.   RSEG NEAR_Z
  9.  
  10.   RSEG CODE
  11.                
  12. ds_m:
  13.         DEFB 1,1,1,1
  14.                
  15. disk_status:
  16.         ld d,0
  17.         ld hl,ds_m
  18.         add hl,de
  19.         ld a,(hl)
  20.                 ret
  21.                
  22. disk_initialize:
  23.                 call disk_status
  24.         or a
  25.         ret z
  26.         ld h,b
  27.         ld l,c
  28.         LD A,e
  29.         or a
  30.         jr nz,di_l1
  31.         call zsd_init
  32.         ld (ds_m),a
  33.         ret
  34. di_l1   dec a
  35.         jr nz,di_l2
  36.         ld a,0xe0
  37.         call nemo_init
  38.         ld (ds_m+1),a
  39.         ret
  40. di_l2   dec a
  41.         jr nz,di_l3
  42.         ld a,0xf0
  43.         call nemo_init
  44.         ld (ds_m+2),a
  45.         ret
  46. di_l3   dec a
  47.         jr nz,di_l4
  48.         call GSDINIT
  49.         ld (ds_m+3),a
  50.         ret
  51. di_l4   ld a,1
  52.         ret
  53.  
  54.        
  55. get_params
  56.         ld hl,(dio_par+3)
  57.         ld e,(hl)
  58.         inc hl
  59.         ld d,(hl)
  60.         inc hl
  61.         ld c,(hl)
  62.         inc hl
  63.         ld b,(hl)
  64.         ld hl,(dio_par+1)
  65.         ld a,(dio_par+5)
  66.         ex af,af
  67.         ld a,(dio_par)
  68.         or a
  69.         ret
  70.        
  71. disk_read:
  72.         call get_params
  73.         jp z,zsd_read
  74.         dec a
  75.         jr nz,disk_read_nomaster
  76.         ld a,$e0
  77.         jp nemo_read
  78. disk_read_nomaster
  79.         dec a
  80.         jr nz,disk_read_nonemo
  81.         ld a,$f0
  82.         jp nemo_read
  83. disk_read_nonemo
  84.         dec a
  85.         jp z,SDRDMUL
  86.         ld a,1
  87.         ret
  88.        
  89. disk_write:
  90.         call get_params
  91.         jp z,zsd_write
  92.         dec a
  93.         jr nz,disk_write_nomaster
  94.         ld a,$e0
  95.         jp nemo_write
  96. disk_write_nomaster
  97.         dec a
  98.         jr nz,disk_write_nonemo
  99.         ld a,$f0
  100.         jp nemo_write
  101. disk_write_nonemo
  102.         dec a
  103.         jp z,SDWRMUL
  104.         ld a,1
  105.         ret
  106. ;Входные параметры общие:
  107. ;HL-адрес загрузки в память
  108. ;BCDE-32-х битный номер сектора
  109. ;A-количество блоков (блок=512 байт)
  110. ;только для многоблочной записи/чтении
  111.  
  112. P_1F7   EQU 0xF0                        ;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
  113. P_1F6   EQU 0xD0                        ;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
  114. P_1F5   EQU 0xB0                        ;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
  115. P_1F4   EQU 0x90                        ;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
  116. P_1F3   EQU 0x70                        ;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
  117. P_1F2   EQU 0x50                        ;СЧЕТЧИК СЕКТОРОВ
  118. P_1F1   EQU 0x30                        ;ПОРТ ОШИБОК/СВОЙСТВ
  119. P_1F0   EQU 0x10                        ;ПОРТ ДАННЫХ
  120. P_3F6   EQU 0xC8                        ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
  121. P_HI    EQU 0x11                        ;СТАРШИЕ 8 БИТ
  122. PRT_RW  EQU P_1F0*256+P_HI      ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
  123.  
  124. ;НА ВЫХОДЕ:
  125. ;H-ДЛЯ MASTER 0-HDD, 1-CDROM, 0xFF-NONE
  126. ;L-ДЛЯ SLAVE  0-HDD, 1-CDROM, 0xFF-NONE
  127. nemo_init:
  128.                 PUSH HL
  129.                 CALL ID_DEV
  130.                 POP HL
  131.                 AND A
  132.                 CALL Z,INIT_91
  133. nemo_off:
  134.                 RET
  135.  
  136. INIT_91:
  137.                 PUSH HL
  138.                 ld d,h
  139.                 ld e,l
  140.                 LD hl,49*2+1
  141.                 add hl,de
  142.                 LD A,(HL)
  143.                 AND 2
  144.                 JR Z,INI_912
  145.                 LD BC,0xFF00+P_1F2
  146.                 LD hl,0x0C
  147.                 add hl,de
  148.                 LD A,(HL)
  149.                 OUT (C),A
  150.                 LD hl,6
  151.                 LD C,P_1F6
  152.                 add hl,de
  153.                 LD A,(HL)
  154.                 DEC A
  155.                 OUT (C),A
  156.                 LD C,P_1F7
  157.                 LD A,0x91
  158.                 OUT (C),A
  159.                 LD DE,0x1000
  160. INI_911:
  161.                 DEC DE
  162.                 LD A,D
  163.                 OR E
  164.                 JR Z,INI_912
  165.                 IN A,(C)
  166.                 AND 0x80
  167.                 JR NZ,INI_911
  168.                 POP HL
  169.                 RET
  170.  
  171. INI_912:
  172.                 LD A,0xFF
  173.                 POP HL
  174.                 RET
  175.  
  176. ;READ "A" SECTORS HDD
  177. nemo_read:        
  178.                 add a,b
  179.                 ld b,a
  180.                 CALL SETHREG
  181.                 EX AF,AF
  182.                 LD C,0xf0
  183.                 LD A,0x20
  184.                 OUT (C),A
  185.                 LD C,0xf0
  186. HDDRD1:
  187.                 IN A,(C)
  188.                 AND 0x88
  189.                 CP 8
  190.                 JR NZ,HDDRD1
  191.                 EX AF,AF
  192. HDDRD2:
  193.                 EX AF,AF
  194.                 CALL READSEC
  195.                 LD C,0xf0
  196. HDDRD3:
  197.                 IN A,(C)
  198.                 AND 0x80
  199.                 JR NZ,HDDRD3
  200.                 EX AF,AF
  201.                 DEC A
  202.                 JR NZ,HDDRD2
  203.                 JR EXITNHD
  204.  
  205. ;WRITE "A" SECTORS HDD
  206. nemo_write:
  207.                 add a,b
  208.                 ld b,a
  209.                 CALL SETHREG
  210.                 EX AF,AF
  211.                 LD C,P_1F7
  212.                 LD A,0x30
  213.                 OUT (C),A
  214.                 LD C,P_1F7
  215. HDDWR1:
  216.                 IN A,(C)
  217.                 AND 0x88
  218.                 CP 8
  219.                 JR NZ,HDDWR1
  220.                 EX AF,AF
  221. HDDWR2:
  222.                
  223.                 EX AF,AF
  224.                 CALL WRITSEC
  225.                 inc h
  226.                 inc h
  227.                 LD C,P_1F7
  228. HDDWR3:
  229.                 IN A,(C)
  230.                 AND 0x80
  231.                 JR NZ,HDDWR3
  232.                 EX AF,AF
  233.                 DEC A
  234.                 JR NZ,HDDWR2
  235. EXITNHD:
  236.                 ld a,0
  237.                 RET
  238.  
  239. ;READ SECTOR (512 BYTES)
  240. READSEC:
  241.                 LD A,0x40
  242.                 LD C,P_1F0      ;HI
  243. READSC1:
  244.                 IN E,(C)
  245.                 INC C
  246.                 IN D,(C)
  247.                 DEC C
  248.                 LD (HL),E
  249.                 INC HL
  250.                 LD (HL),D
  251.                 INC HL
  252.                 IN E,(C)
  253.                 INC C
  254.                 IN D,(C)
  255.                 DEC C
  256.                 LD (HL),E
  257.                 INC HL
  258.                 LD (HL),D
  259.                 INC HL
  260.                 IN E,(C)
  261.                 INC C
  262.                 IN D,(C)
  263.                 DEC C
  264.                 LD (HL),E
  265.                 INC HL
  266.                 LD (HL),D
  267.                 INC HL
  268.                 IN E,(C)
  269.                 INC C
  270.                 IN D,(C)
  271.                 DEC C
  272.                 LD (HL),E
  273.                 INC HL
  274.                 LD (HL),D
  275.                 INC HL
  276.                 DEC A
  277.                 JR NZ,READSC1
  278.                 RET
  279.  
  280. ;SAVE SECTOR (512 BYTES)
  281. WRITSEC:
  282.                 PUSH HL
  283.                 LD (WR_SEC_SP+1),SP
  284.                 LD SP,HL
  285.                 LD A,0x40
  286.                 LD HL,PRT_RW
  287. WR_SEC1:
  288.                 POP DE
  289.                 LD C,L
  290.                 OUT (C),D
  291.                 LD C,H
  292.                 OUT (C),E
  293.                 POP DE
  294.                 LD C,L
  295.                 OUT (C),D
  296.                 LD C,H
  297.                 OUT (C),E
  298.                 POP DE
  299.                 LD C,L
  300.                 OUT (C),D
  301.                 LD C,H
  302.                 OUT (C),E
  303.                 POP DE
  304.                 LD C,L
  305.                 OUT (C),D
  306.                 LD C,H
  307.                 OUT (C),E
  308.                 DEC A
  309.                 JR NZ,WR_SEC1
  310. WR_SEC_SP       LD SP,0
  311.                 POP HL
  312.                 RET
  313.  
  314. ;SET HDD PORTS
  315. SETHREG:
  316.                 PUSH DE
  317.                 LD D,B
  318.                 LD E,C
  319.                 LD BC,0xffd0
  320.                 OUT (C),D
  321.                 LD C,0xf0
  322. SETHRE1:
  323.                 IN A,(C)
  324.                 AND 0x80
  325.                 JR NZ,SETHRE1
  326.                 LD C,0xb0
  327.                 OUT (C),E
  328.                 POP DE
  329.                 LD C,0x90
  330.                 OUT (C),D
  331.                 LD C,0x70
  332.                 OUT (C),E
  333.                 LD C,0x50
  334.                 EX AF,AF
  335.                 OUT (C),A
  336.                 RET
  337.  
  338. ;HL-АДРЕС БУФЕРА СЕКТОРА ИДЕНТИФИКАЦИИ
  339. ;A=E0-ДЛЯ MASTER, A=F0-ДЛЯ SLAVE
  340. ID_DEV:
  341.                 LD BC,0xFF00+P_1F6
  342.                 OUT (C),A
  343.                 LD C,P_1F7
  344.                 LD D,26
  345. ID_DEV3:
  346.                 HALT
  347.                 DEC D
  348.                 JR Z,NO_DEV
  349.                 IN A,(C)
  350.                 BIT 7,A
  351.                 JR NZ,ID_DEV3
  352.                 AND A
  353.                 JR Z,NO_DEV
  354.                 INC A
  355.                 JR Z,NO_DEV
  356.                 XOR A
  357.                 LD C,P_1F5
  358.                 OUT (C),A
  359.                 LD C,P_1F4
  360.                 OUT (C),A
  361.                 LD A,0xEC
  362.                 LD C,P_1F7
  363.                 OUT (C),A
  364.                 LD C,P_1F7
  365. ID_DEV1:
  366.                 IN A,(C)
  367.                 AND A
  368.                 JR Z,NO_DEV
  369.                 INC A
  370.                 JR Z,NO_DEV
  371.                 DEC A
  372.                 RRCA
  373.                 JR C,ID_DEV2
  374.                 RLCA
  375.                 AND 0x88
  376.                 CP 8
  377.                 JR NZ,ID_DEV1
  378. ID_DEV2:
  379.                 LD C,P_1F4
  380.                 IN E,(C)
  381.                 LD C,P_1F5
  382.                 IN D,(C)
  383.                 LD A,D
  384.                 OR E
  385.                 JP Z,READSEC
  386.                 LD HL,0xEB14
  387.                 SBC HL,DE
  388.                 LD A,1
  389.                 RET Z
  390. NO_DEV:
  391.                 LD A,0xFF
  392.                 RET
  393.  
  394.  
  395. ;Драйвер SD карты
  396. ;LAST UPDATE 14.04.2009 savelij
  397. ;Входные параметры общие:
  398. ;HL-адрес загрузки в память
  399. ;BCDE-32-х битный номер сектора
  400. ;A-количество блоков (блок=512 байт) - только для многоблочной записи/чтения
  401. ;Ошибки выдаваемые на выходе:
  402. ;A=0 - инициализация прошла успешно
  403. ;A=1 - карта не найдена или не ответила
  404. ;A=2 - карта защищена от записи
  405. ;A=3 - попытка записи в сектор 0 карты
  406. P_DATA    EQU 0x0057    ;порт данных
  407. P_CONF    EQU 0x8057    ;порт конфигурации
  408. CMD_12    EQU 0x4C    ;STOP_TRANSMISSION
  409. CMD_17    EQU 0x51    ;READ_SINGLE_BLOCK
  410. CMD_18    EQU 0x52    ;READ_MULTIPLE_BLOCK
  411. CMD_24    EQU 0x58    ;WRITE_BLOCK
  412. CMD_25    EQU 0x59    ;WRITE_MULTIPLE_BLOCK
  413. CMD_55    EQU 0x77    ;APP_CMD
  414. CMD_58    EQU 0x7A    ;READ_OCR
  415. CMD_59    EQU 0x7B    ;CRC_ON_OFF
  416. ACMD_41   EQU 0x69   ;SD_SEND_OP_COND
  417.  
  418. zsd_init
  419.     CALL CS_HIGH    ;включаем питание карты при снятом выборе
  420.     LD BC,P_DATA
  421.     LD DE,0x20FF    ;бит выбора карты в <1>
  422. SD_INITloop
  423.     OUT (C),E    ;записываем в порт много единичек
  424.     DEC D    ;количество единичек несколько больше
  425.     JR NZ,SD_INITloop    ;чем надо
  426.     XOR A    ;запускаем счетчик на 256
  427.     EX AF,AF    ;для ожидания инициализации карты
  428. ZAW001    
  429.     LD HL,CMD00    ;даем команду сброса
  430.     CALL OUTCOM    ;этой командой карточка переводится в режим SPI
  431.     CALL IN_OOUT    ;читаем ответ карты
  432.     EX AF,AF
  433.     DEC A
  434.     JR Z,ZAW003    ;если карта 256 раз не ответила, то карты нет
  435.     EX AF,AF
  436.     DEC A
  437.     JR NZ,ZAW001    ;ответ карты <1>, перевод в SPI прошел успешно
  438.     LD HL,CMD08    ;запрос на поддерживаемые напряжения
  439.     CALL OUTCOM    ;команда поддерживается начиная со спецификации
  440.     CALL IN_OOUT    ;версии 2.0 и только SDHC, мини и микро SD картами
  441.     IN H,(C)    ;в A=код ответа карты
  442.     NOP    ;считываем 4 байта длинного ответа
  443.     IN H,(C)    ;но не используем
  444.     NOP
  445.     IN H,(C)
  446.     NOP
  447.     IN H,(C)
  448.     LD HL,0    ;HL=аргумент для команды инициализации
  449.     BIT 2,A    ;если бит 2 установлен, то карта стандартная
  450.     JR NZ,ZAW006    ;стандартная карта выдаст <ошибка команды>
  451.     LD H,0x40    ;если ошибки не было, то карта SDHC, мини или микро SD
  452. ZAW006    
  453.     LD A,CMD_55    ;запускаем процесс внутренней инициализации
  454.     CALL OUT_COM    ;для карт MMC здесь должна быть другая команда
  455.     CALL IN_OOUT    ;соответственно наличие в слоте MMC-карты
  456.     LD A,ACMD_41    ;вызовет зависание драйвера, от применения
  457.     OUT (C),A    ;общей команды запуска инициализации я отказался
  458.     NOP    ;бит 6 установлен для инициализации SDHC карты
  459.     OUT (C),H    ;для стандартной сброшен
  460.     NOP
  461.     OUT (C),L
  462.     NOP
  463.     OUT (C),L
  464.     NOP
  465.     OUT (C),L
  466.     LD A,0xFF
  467.     OUT (C),A
  468.     CALL IN_OOUT    ;ждем перевода карты в режим готовности
  469.     AND A    ;время ожидания примерно 1 секунда
  470.     JR NZ,ZAW006
  471. ZAW004    LD A,CMD_59    ;принудительно отключаем CRC16
  472.     CALL OUT_COM
  473.     CALL IN_OOUT
  474.     AND A
  475.     JR NZ,ZAW004
  476. ZAW005    LD HL,CMD16    ;принудительно задаем размер блока 512 байт
  477.     CALL OUTCOM
  478.     CALL IN_OOUT
  479.     AND A
  480.     JR NZ,ZAW005
  481. ;включение питания карты при снятом сигнале выбора карты
  482. CS_HIGH    
  483.     PUSH AF
  484.     LD A,3
  485.     ld bc,P_CONF
  486.     OUT (c),A    ;включаем питание, снимаем выбор карты
  487.     XOR A
  488.     dec b       ; P_DATA
  489.     OUT (c),A    ;обнуляем порт данных
  490.     POP AF    ;обнуление порта можно не делать, просто последний
  491.     ld a,0
  492.     RET    ;записанный бит всегда 1, а при сбросе через вывод
  493.         ;данных карты напряжение попадает на вывод питания
  494.         ;карты и светодиод на питании подсвечивается
  495. ;возврат при не ответе карты с кодом ошибки 1
  496. ZAW003    
  497.     CALL zsd_off
  498.     ld a,3
  499.     RET
  500. zsd_off    ;patch
  501.     XOR A
  502.         ld bc,P_CONF
  503.     OUT (c),A    ;выключение питания карты
  504.         dec b           ;P_DATA
  505.     OUT (c),A    ;обнуление порта данных
  506.     RET
  507. ;выбираем карту сигналом 0
  508. CS__LOW    ;patch
  509.     PUSH AF
  510.     LD A,1
  511.         ld bc,P_CONF
  512.     OUT (c),A
  513.     POP AF
  514.     RET
  515. ;запись в карту команды с неизменяемым параметром из памяти
  516. ;адрес команды в <HL>
  517. OUTCOM    ;patch
  518.     CALL CS__LOW
  519.     LD BC,0x600+P_DATA
  520.     OTIR    ;передаем 6 байт команды из памяти
  521.     RET
  522. ;запись в карту команды с нулевыми аргументами
  523. ;А-код команды, аргумент команды равен 0
  524. OUT_COM    ;patch
  525.     CALL CS__LOW
  526.     LD BC,P_DATA
  527.     OUT (C),A
  528.     XOR A
  529.     OUT (C),A
  530.     NOP
  531.     OUT (C),A
  532.     NOP
  533.     OUT (C),A
  534.     NOP
  535.     OUT (C),A
  536.     DEC A
  537.     OUT (C),A    ;пишем пустой CRC7 и стоповый бит
  538.     RET
  539. ;запись команды чтения/записи с номером сектора в BCDE для карт стандартного размера
  540. ;при изменяемом размере сектора номер сектора нужно умножать на его размер, для карт
  541. ;SDHC, мини и микро размер сектора не требует умножения
  542. SECM200    PUSH HL  ;patch
  543.     PUSH DE
  544.     PUSH BC
  545.     PUSH AF
  546.     PUSH BC
  547.     LD A,CMD_58
  548.     LD BC,P_DATA
  549.     CALL OUT_COM
  550.     CALL IN_OOUT
  551.     IN A,(C)
  552.     NOP
  553.     IN H,(C)
  554.     NOP
  555.     IN H,(C)
  556.     NOP
  557.     IN H,(C)
  558.     BIT 6,A    ;проверяем 30 бит регистра OCR (6 бит в <А>)        
  559.     POP HL    ;при установленном бите умножение номера сектора
  560.     JR NZ,SECN200    ;не требуется
  561.     EX DE,HL    ;при сброшенном бите соответственно
  562.     ADD HL,HL    ;умножаем номер сектора на 512 (0x200)
  563.     EX DE,HL
  564.     ADC HL,HL
  565.     LD H,L
  566.     LD L,D
  567.     LD D,E
  568.     LD E,0
  569. SECN200    
  570.     POP AF    ;заготовленный номер сектора находится в <HLDE>
  571.     OUT (C),A    ;пишем команду из <А> на SD карту
  572.     NOP    ;записываем 4 байта аргумента
  573.     OUT (C),H    ;пишем номер сектора от старшего
  574.     NOP
  575.     OUT (C),L
  576.     NOP
  577.     OUT (C),D
  578.     NOP
  579.     OUT (C),E    ;до младшего байта
  580.     LD A,0xFF
  581.     OUT (C),A    ;пишем пустой CRC7 и стоповый бит
  582.     POP BC
  583.     POP DE
  584.     POP HL
  585.     RET
  586. ;чтение ответа карты до 32 раз, если ответ не 0xFF - немедленный выход
  587. IN_OOUT    ;patch
  588.     push de
  589.     LD DE,0x20FF
  590.         ld bc,P_DATA
  591. IN_WAIT    IN A,(c)
  592.     CP E
  593.     JR NZ,IN_EXIT
  594. IN_NEXT    DEC D
  595.     JR NZ,IN_WAIT
  596. IN_EXIT    POP DE
  597.     RET
  598. CMD00    DEFB  0x40,0x00,0x00,0x00,0x00,0x95 ;GO_IDLE_STATE
  599.     ;команда сброса и перевода карты в SPI режим после включения питания
  600. CMD08    DEFB  0x48,0x00,0x00,0x01,0xAA,0x87 ;SEND_IF_COND
  601.     ;запрос поддерживаемых напряжений
  602. CMD16    DEFB 0x50,0x00,0x00,0x02,0x00,0xFF ;SET_BLOCKEN
  603.     ;команда изменения размера блока
  604. ;читаем один сектор из карты в память, адрес чтения в <HL>
  605. RD_SECT    PUSH BC
  606.     LD BC,P_DATA+0x7F00
  607.     INIR
  608.     LD B,0x7F
  609.     INIR
  610.     LD B,0x7F
  611.     INIR
  612.     LD B,0x7F
  613.     INIR
  614.     LD B,0x04
  615.     INIR
  616.     NOP
  617.     IN A,(C)
  618.     NOP
  619.     IN A,(C)
  620.     POP BC
  621.     RET
  622. ;записываем один сектор из памяти в карту, адрес записи в <HL>
  623. WR_SECT    PUSH BC
  624.     LD BC,P_DATA
  625.     OUT (C),A
  626.     LD B,0x80
  627.     OTIR
  628.     LD B,0x80
  629.     OTIR
  630.     LD B,0x80
  631.     OTIR
  632.     LD B,0x80
  633.     OTIR
  634.     LD A,0xFF
  635.     OUT (C),A
  636.     NOP
  637.     OUT (C),A
  638.     POP BC
  639.     RET
  640. ;многосекторное чтение
  641. zsd_read ld a,1
  642.     out (0xbf),a
  643.     LD A,CMD_18
  644.     CALL SECM200    ;даем команду многосекторного чтения
  645.     EX AF,AF
  646. RDMULT1    EX AF,AF
  647. RDMULT2
  648.     CALL IN_OOUT
  649.     CP 0xFE
  650.     JR NZ,RDMULT2    ;ждем маркер готовности 0xFE для начала чтения
  651.     CALL RD_SECT    ;читаем сектор
  652.     EX AF,AF
  653.     DEC A
  654.     JR NZ,RDMULT1    ;продолжаем пока не обнулится счетчик
  655.     LD A,CMD_12    ;по окончании чтения даем команду карте <СТОП>
  656.     CALL OUT_COM    ;команда мультичтения не имеет счетчика и
  657. RDMULT3
  658.     CALL IN_OOUT    ;должна останавливаться здесь командой 12
  659.     INC A
  660.     JR NZ,RDMULT3    ;ждем освобождения карты
  661.     JP CS_HIGH    ;снимаем выбор с карты и выходим с кодом 0
  662.  
  663. ;многосекторная запись
  664. zsd_write ld a,1
  665.     out (0xbf),a
  666.     LD A,CMD_25 ;даем команду мультисекторной записи
  667.     CALL SECM200
  668. WRMULTI2
  669.     CALL IN_OOUT
  670.     INC A
  671.     JR NZ,WRMULTI2 ;ждем освобождения карты
  672.     EX AF,AF
  673. WRMULT1 EX AF,AF
  674.     LD A,0xFC ;пишем стартовый маркер, сам блок и пустое CRC16
  675.     CALL WR_SECT
  676. WRMULTI3
  677.     CALL IN_OOUT
  678.     INC A
  679.     JR NZ,WRMULTI3 ;ждем освобождения карты
  680.     EX AF,AF
  681.     DEC A
  682.     JR NZ,WRMULT1 ;продолжаем пока счетчик не обнулится
  683.     LD C,P_DATA
  684.     LD A,0xFD
  685.     OUT (C),A ;даем команду остановки записи
  686. WRMULTI4
  687.     CALL IN_OOUT
  688.     INC A
  689.     JR NZ,WRMULTI4 ;ждем освобождения карты
  690.     JP CS_HIGH ;снимаем выбор карты и выходим с кодом 0
  691.    
  692.    
  693. ;------------------------------------------------------
  694. ;---------------------------=NeoGS=--------------------
  695. ;------------------------------------------------------
  696.  
  697.  
  698.  
  699. GSCOM           EQU 0XBB        ; write-only, command for NGS
  700. GSDAT           EQU 0XB3        ; read-write
  701. GSCTR           EQU 0X33        ; write-only, control register for NGS:
  702. ;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА NeoGS
  703. SETUPSD         EQU 0x5B00
  704.  
  705. ;NGSSDT         DEFW GSDINIT            ;ИНИТ SD КАРТЫ
  706. ;               DEFW GSDOFF             ;ОТКЛЮЧЕНИЕ SD КАРТЫ
  707. ;               DEFW SDRDSIN            ;ЧИТАТЬ 1 СЕКТОР
  708. ;               DEFW SDRDMUL            ;ЧИТАТЬ "A" СЕКТОРОВ
  709. ;               DEFW SDWRSIN            ;ПИСАТЬ 1 СЕКТОР
  710. ;               DEFW SDWRMUL            ;ПИСАТЬ "A" СЕКТОРОВ
  711.  
  712. ;ЗАПИСЬ "A" СЕКТОРОВ
  713. SDWRMUL         LD A,5
  714. SDWRSN3         CALL COMM2SD
  715.                 EX AF,AF
  716.                 PUSH DE
  717.                 PUSH BC
  718.                 LD BC,GSDAT
  719. SDWRSN1         EX AF,AF
  720.                 OUT (GSCOM),A
  721.                 CALL WC_
  722.                 LD DE,0x0200
  723. SDWRSN2         OUTI
  724.                 CALL WD_
  725.                 DEC DE
  726.                 LD A,D
  727.                 OR E
  728.                 JR NZ,SDWRSN2
  729.                 EX AF,AF
  730.                 DEC A
  731.                 JR NZ,SDWRSN1
  732.                 CALL WN_
  733.                 IN A,(C)
  734.                 CP 0x77
  735.                 JR NZ,$-4
  736.                 POP BC
  737.                 POP DE
  738.                 XOR A
  739.                 RET
  740.  
  741. ;ЧТЕНИЕ "A" СЕКТОРОВ
  742. SDRDMUL         LD A,3
  743. SDRDSN3         CALL COMM2SD
  744.                 EX AF,AF
  745.                 PUSH DE
  746.                 PUSH BC
  747.                 LD BC,GSDAT
  748. SDRDSN1         EX AF,AF
  749.                 OUT (GSCOM),A
  750.                 CALL WC_
  751.                 LD DE,0x0200
  752. SDRDSN2         CALL WN_
  753.                 INI
  754.                 DEC DE
  755.                 LD A,D
  756.                 OR E
  757.                 JR NZ,SDRDSN2
  758.                 EX AF,AF
  759.                 DEC A
  760.                 JR NZ,SDRDSN1
  761.                 CALL WN_
  762.                 IN A,(C)
  763.                 CP 0x77
  764.                 JR NZ,$-4
  765.                 POP BC
  766.                 POP DE
  767.                 XOR A
  768.                 RET
  769.  
  770. ;ОТКЛЮЧЕНИЕ ВЫБОРА КАРТОЧКИ
  771. GSDOFF          LD A,1
  772.                 JR GSDINIT+1
  773.  
  774. ;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
  775. GSDINIT         CALL INSTSDD
  776.                 OR A
  777.                 RET NZ
  778.                 XOR A
  779.                 CALL COMM2SD
  780.                 CALL WN_
  781.                 IN A,(GSDAT)
  782.                 CP 0x77
  783.                 JR NZ,SD_NO
  784.                 XOR A
  785.                 RET
  786.  
  787. SD_NO           LD A,1
  788.                 RET
  789.  
  790. ;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
  791. COMM2SD         OUT (GSDAT),A                   ;УШЛА КОМАНДА ДРАЙВЕРУ
  792.                 LD A,0x1E
  793.                 OUT (GSCOM),A
  794.                 CALL WC_                        ;УШЛА КОМАНДА ПРОШИВКЕ
  795.                 LD A,B
  796.                 OUT (GSDAT),A
  797.                 CALL WD_                        ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ
  798.                 LD A,C
  799.                 OUT (GSDAT),A
  800.                 CALL WD_                        ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
  801.                 LD A,D
  802.                 OUT (GSDAT),A
  803.                 CALL WD_                        ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
  804.                 LD A,E
  805.                 OUT (GSDAT),A
  806.                 CALL WD_                        ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
  807.                 EX AF,AF
  808.                 OUT (GSDAT),A
  809.                 EX AF,AF
  810.                 DEFS 9
  811.                 RET                             ;УШЛО КОЛ-ВО СЕКТОРОВ
  812.  
  813. ;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
  814. WD_             IN A,(GSCOM)
  815.                 RLA
  816.                 JR C,$-3
  817.                 RET
  818.  
  819. ;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
  820. WN_             IN A,(GSCOM)
  821.                 RLA
  822.                 JR NC,$-3
  823.                 RET
  824.  
  825. ;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
  826. WC_             IN A,(GSCOM)
  827.                 RRA
  828.                 JR C,$-3
  829.                 RET
  830.  
  831. ;УСТАНОВЩИК ДРАЙВЕРА НА NeoGS
  832. INSTSDD         LD A,0x80
  833.                 OUT (GSCTR),A
  834.                 HALT
  835.                 HALT
  836.                 LD A,0xF3
  837.                 LD B,0x30
  838.                 OUT (GSCOM),A
  839. ISDD1   HALT
  840.                 DEC B
  841.                 JR Z,SD_NO
  842.                 IN A,(GSCOM)
  843.                 RRA
  844.                 JR C,ISDD1
  845.                 LD BC,GSDAT
  846.                 IN A,(C)
  847.                 LD DE,0x0300
  848.                 LD HL,SETUPSD
  849.                 OUT (C),E
  850.                 LD A,0x14
  851.                 OUT (GSCOM),A
  852.                 CALL WC_
  853.                 OUT (C),D
  854.                 CALL WD_
  855.                 OUT (C),L
  856.                 CALL WD_
  857.                 OUT (C),H
  858.                 CALL WD_
  859.                 LD HL,(0x0006)
  860. ISDD3           OUTI
  861.                 CALL WD_
  862.                 DEC DE
  863.                 LD A,D
  864.                 OR E
  865.                 JR NZ,ISDD3
  866.                 LD HL,SETUPSD
  867.                 OUT (C),L
  868.                 LD A,0x13
  869.                 OUT (GSCOM),A
  870.                 CALL WC_
  871.                 OUT (C),H
  872.                 HALT
  873.                 HALT
  874.                 IN A,(GSDAT)
  875.                 CP 0x77
  876.                 JP NZ,SD_NO
  877.                 XOR A
  878.                 RET
  879.  
  880.  
  881.  
  882. ENDMOD
  883. END
  884.  
  885.  
  886.