?login_element?

Subversion Repositories NedoOS

Rev

Rev 817 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;на входе ожидается pgstructs в c000. на выходе всегда ставить pgstructs
  2.  
  3. ;/* Results of Disk Functions */
  4. ;typedef enum {
  5. ;       RES_OK = 0,             /* 0: Successful */
  6. ;       RES_ERROR,              /* 1: R/W Error */
  7. ;       RES_WRPRT,              /* 2: Write Protected */
  8. ;       RES_NOTRDY,             /* 3: Not Ready */
  9. ;       RES_PARERR              /* 4: Invalid Parameter */
  10. ;} DRESULT;
  11.  
  12.          ifdef KOE
  13.         macro NOPSDCARD
  14.         ;ds 4
  15.         endm
  16.          else
  17.         macro NOPSDCARD
  18.         endm
  19.          endif
  20.        
  21. device_states
  22.         db 1
  23.         db 1
  24.         db 1
  25.         db 1
  26.         db 1
  27.  
  28. disk_status:
  29.         ld d,0
  30.         ld hl,device_states
  31.         add hl,de
  32.                 if INETDRV != 1
  33.                         ld a,(hl)
  34.                         ret
  35.                 else
  36.                         ld a,4
  37.                         cp e
  38.                         ld a,(hl)
  39.                         jr z,.isSL811
  40.                         ret
  41. .isSL811
  42.                         or a
  43.                         ret nz
  44.                         ld bc,0x82ab
  45.                         in a,(c)
  46.                         and 0xaf                ;хост-мод и сл811 в портах
  47.                         out (c),a      
  48.                         ld b,0x80
  49.                         ld a,0x0d
  50.                         out (c),a
  51.                         in a,(0xab)
  52.                         jr z,.resSL811
  53.                         and 0x40
  54.                         ret z
  55. .resSL811
  56.                         ld a,1
  57.                         ld (hl),a
  58.                         ret
  59.                 endif
  60. devices_init
  61. ;bc=?
  62. ;e=device number
  63. ;out: a=?
  64. ;        xor a
  65. ;        ld d,a
  66. ;       ld hl,device_states
  67. ;       add hl,de
  68. ;       cp (hl)
  69. ;       ret z
  70.         push bc
  71.         call disk_status
  72.         pop hl
  73.         or a
  74.         ret z
  75.         ld a,e ;a=e
  76.         or a
  77.         jr nz,devices_init_noIDEmaster
  78.         ld a,0xe0
  79.         call IDE_INIT
  80.         ld (device_states+0),a
  81.         ret  
  82. devices_init_noIDEmaster
  83.         dec a
  84.         jr nz,devices_init_noIDEslave
  85.         ld a,0xf0
  86.         call IDE_INIT
  87.         ld (device_states+1),a
  88.         ret  
  89. devices_init_noIDEslave
  90.         dec a
  91.         jr nz,devices_init_noSD
  92.         ifdef KOE
  93.          ifdef KOEDI
  94.                 di
  95.          endif
  96.                 call SD_INIT
  97.          ifdef KOEDI
  98.                 ei
  99.          endif
  100.         else
  101.     if (atm==3) || (atm==1)
  102.                 call SD_INIT
  103.     else
  104.         ld a,1
  105.     endif
  106.         endif
  107.         ld (device_states+2),a
  108.         ret  
  109. devices_init_noSD
  110.         dec a
  111.         jr nz,devices_init_noGS
  112.         ifdef NGSSD
  113.         call GS_INIT
  114.         else
  115.         ld a,1
  116.         endif
  117.         ld (device_states+3),a
  118.         ret  
  119. devices_init_noGS
  120.         if INETDRV == 1
  121.                 dec a
  122.                 jr nz,devices_init_noSL811
  123.                 call SL811.init
  124.                 ld (device_states+4),a
  125.                 ret
  126. devices_init_noSL811
  127.         endif
  128.         ld a,0x01 ;нет такого устройства
  129.         ret  
  130.  
  131. diskgetpars
  132.         ld hl,(fatfs_org+FFS_DRV.lba_ptr)
  133.         ld e,(hl)
  134.         inc hl
  135.         ld d,(hl)
  136.         inc hl
  137.         ld c,(hl)
  138.         inc hl
  139.         ld b,(hl)
  140.         ld hl,(fatfs_org+FFS_DRV.dma_addr)
  141.         ld a,(fatfs_org+FFS_DRV.count)
  142.         exa  
  143.         ld a,(fatfs_org+FFS_DRV.dio_drv)
  144.         ;or a
  145. ;hl=buffer
  146. ;a=drive
  147. ;bcde=sector
  148. ;a'=count
  149.         ret
  150.        
  151. ;?????????????????????????????? чтение секторов
  152. devices_read
  153.         call BDOS_setdepage
  154.         call devices_readnopg;devices_read_go
  155.         push af
  156.         call BDOS_setpgstructs
  157.         pop af ;error
  158.         ret
  159. devices_readnopg
  160.         ;call BDOS_setpgstructs
  161.         call diskgetpars
  162. devices_read_go_regs
  163.     ifdef KOEDI
  164.                 di
  165.                 call devices_read_go
  166.                 ei
  167.                 ret
  168. devices_read_go
  169.     endif
  170. ;hl=buffer
  171. ;a=drive
  172. ;bcde=sector
  173. ;a'=count
  174.          or a
  175.         jr nz,readsectors_noIDEmaster
  176.         ld a,0xe0 ;master ;почему bit6=1???
  177. ;b+a=head+device
  178. ;c=cylHI
  179. ;d=cylLO
  180. ;e=sec
  181. ;a'=count      
  182.         jp readsectorsIDE
  183. readsectors_noIDEmaster
  184.         dec a
  185.         jr nz,readsectors_noIDEslave
  186.         ld a,0xf0 ;slave ;почему bit6=1???
  187. ;b+a=head+device
  188. ;c=cylHI
  189. ;d=cylLO
  190. ;e=sec
  191. ;a'=count      
  192.         jp readsectorsIDE
  193. readsectors_noIDEslave
  194.         dec a
  195.         jp z,readsectorsSD
  196.         dec a
  197.         jp z,readsectorsGS
  198.         if INETDRV == 1
  199.                 dec a
  200.                 jp z,SL811.RBC_Read
  201.         endif
  202.         ld a,0x01
  203.         ret  
  204.  
  205. ;?????????????????????????????? запись секторов
  206. devices_write
  207.         call BDOS_setdepage
  208.         call devices_writenopg;devices_write_go
  209.         push af
  210.         call BDOS_setpgstructs
  211.         pop af ;error
  212.         ret
  213. devices_writenopg
  214.         ;call BDOS_setpgstructs
  215.         call diskgetpars
  216. devices_write_go_regs
  217.     ifdef KOEDI
  218.                 di
  219.                 call devices_write_go
  220.                 ei
  221.                 ret
  222. devices_write_go
  223.     endif
  224. ;hl=buffer
  225. ;a=drive
  226. ;bcde=sector
  227. ;a'=count
  228.          or a
  229.         jr nz,writesectors_noIDEmaster
  230.         ld a,0xe0 ;master ;почему bit6=1???
  231. ;b+a=head+device
  232. ;c=cylHI
  233. ;d=cylLO
  234. ;e=sec
  235. ;a'=count      
  236.         jp writesectorsIDE
  237. writesectors_noIDEmaster
  238.         dec a
  239.         jr nz,writesectors_noIDEslave
  240.         ld a,0xf0 ;slave ;почему bit6=1???
  241. ;b+a=head+device
  242. ;c=cylHI
  243. ;d=cylLO
  244. ;e=sec
  245. ;a'=count      
  246.         jp writesectorsIDE
  247. writesectors_noIDEslave
  248.         dec a
  249.         jp z,writesectorsSD
  250.         dec a
  251.         jp z,writesectorsGS
  252.         if INETDRV == 1
  253.                 dec a
  254.                 jp z,SL811.RBC_Write
  255.         endif
  256.         ld a,0x01
  257.         ret  
  258.  
  259. ;;;;;;;;;;;;;;;;;;;;;;;;;;; IDE
  260.        
  261. IDE_INIT
  262. ;a=device (0xe0/f0)
  263.         push hl
  264.         call readidentIDE
  265.         pop hl
  266.         and a
  267.         ret nz
  268.         ;jp checkidentIDE
  269. checkidentIDE
  270. ;зачем сохранять hl? TODO убрать
  271.         push hl
  272.         ;ld d,h
  273.         ;ld e,l
  274.         ex de,hl
  275.         ld hl,0x0063
  276.         add hl,de
  277.         ld a,(hl)
  278.         and 0x02
  279.         jr z,ldaff_pophl
  280.         ;ld bc,0xff00+hddcount;????
  281.         ld bc,hddcount
  282.         ld hl,0x000c
  283.         add hl,de
  284.         ld a,(hl) ;0x3f???
  285.         out (C),a
  286.         ld hl,0x0006
  287.         ld bc,hddhead
  288.         add hl,de
  289.         ld a,(hl)
  290.         dec a ;0x0f???
  291.         out (C),a
  292.         ld bc,hddcmd
  293.         ld a,0x91
  294.         out (C),a
  295.         ld de,0x1000
  296. nobsywithtimeout0
  297.         dec de
  298.         ld a,d
  299.         or e
  300.         jr z,ldaff_pophl
  301.         in a,(C)
  302.         and 0x80
  303.         jr nz,nobsywithtimeout0
  304.         pop hl
  305.         ret
  306. ldaff_pophl
  307.         ld a,0xff
  308.         pop hl
  309.         ret
  310.  
  311. readsectorsIDE
  312. ;b+a=head+device
  313. ;c=cylHI
  314. ;d=cylLO
  315. ;e=sec
  316. ;a'=count
  317.     add a,b
  318.         ld b,a
  319. ;b=head
  320. ;c=cylHI
  321. ;d=cylLO
  322. ;e=sec
  323. ;a'=count
  324.         call setblockparsIDE
  325.         exa  
  326.         ld bc,hddcmd
  327.         ld a,0x20
  328.         out (C),a
  329.         ld bc,hddstat
  330. waitDRQ0
  331.         in a,(C)
  332.         and 0x88
  333.         cp 0x08
  334.         jr nz,waitDRQ0 ;ожидание готовности передачи данных
  335.         exa  
  336. readsectorsIDE0
  337.         exa  
  338.         call readsecIDE
  339.         ld bc,hddstat
  340. nobsy0
  341.         in a,(C)
  342.         and 0x80
  343.         jr nz,nobsy0
  344.         exa  
  345.         dec a
  346.         jr nz,readsectorsIDE0
  347.         jr lda0
  348.  
  349. writesectorsIDE
  350. ;b+a=head+device
  351. ;c=cylHI
  352. ;d=cylLO
  353. ;e=sec
  354. ;a'=count
  355.         add a,b
  356.         ld b,a
  357. ;b=head
  358. ;c=cylHI
  359. ;d=cylLO
  360. ;e=sec
  361. ;a'=count
  362.         call setblockparsIDE
  363.         exa  
  364.         ld bc,hddcmd
  365.         ld a,0x30
  366.         out (C),a
  367.         ld bc,hddstat
  368. waitDRQ01
  369.         in a,(C)
  370.         and 0x88
  371.         cp 0x08
  372.         jr nz,waitDRQ01 ;ожидание готовности передачи данных
  373.         exa
  374. writesectorsIDE0
  375.         exa  
  376.         call writesecIDE
  377.         ;inc h
  378.         ;inc h
  379.         ld bc,hddstat
  380. nobsy01
  381.         in a,(C)
  382.         and 0x80
  383.         jr nz,nobsy01
  384.         exa  
  385.         dec a
  386.         jr nz,writesectorsIDE0
  387. lda0   
  388.         xor a;ld a,0x00
  389.         ret
  390.  
  391. readsecIDE
  392.         ;jr $
  393.         xor a;ld a,0
  394. readsecIDE0
  395.         ld bc,hdddatlo
  396.         in e,(C)
  397.         ld bc,hdddathi
  398.         in d,(C)
  399.         ld (hl),e
  400.         inc hl
  401.         ld (hl),d
  402.         inc hl
  403.         dec a
  404.         jr nz,readsecIDE0
  405.         ret
  406.        
  407. writesecIDE
  408.         if (hdddatlo != 0x10)
  409.         xor a
  410. writesecIDE0
  411.         ld e,(hl)
  412.         inc hl
  413.         ld d,(hl)
  414.         inc hl
  415.         ld bc,hdddathi
  416.         out (c),d
  417.         ld bc,hdddatlo
  418.         out (c),e
  419.         dec a
  420.         jr nz,writesecIDE0
  421.         else
  422.         ld bc,0x0000 + hdddathi
  423. writesecIDE0
  424.         ld a,(hl)
  425.         inc hl
  426.         outi
  427.         out (hdddatlo),a
  428.         ld a,(hl)
  429.         inc hl
  430.         outi
  431.         out (hdddatlo),a
  432.         ld a,(hl)
  433.         inc hl
  434.         outi
  435.         out (hdddatlo),a
  436.         ld a,(hl)
  437.         inc hl
  438.         outi
  439.         out (hdddatlo),a
  440.         jr nz,writesecIDE0
  441.         endif
  442.         ret
  443.        
  444. setblockparsIDE
  445. ;b=head
  446. ;c=cylHI
  447. ;d=cylLO
  448. ;e=sec
  449. ;a'=count      
  450.         push de
  451.         ld d,b
  452.         ld e,c
  453.         ;ld bc,0xff00+hddhead ;зачем ff???
  454.         ld bc,hddhead
  455.         out (C),d ;head
  456.         ld bc,hddstat
  457. nobsy02
  458.         in a,(C)
  459.         and 0x80
  460.         jr nz,nobsy02
  461.         ld bc,hddcylhi
  462.         out (C),e ;cylHI
  463.         pop de
  464.         ld bc,hddcyllo
  465.         out (C),d ;cylLo
  466.         ld bc,hddsec
  467.         out (C),e ;sec
  468.         ld bc,hddcount
  469.         exa  
  470.         out (C),a ;count
  471.         ret
  472.        
  473. readidentIDE
  474.         ;ld bc,0xff00+hddhead ;зачем ff???
  475.         ;потому что неучаствующие биты в единице обычно
  476.         ld bc,hddhead
  477.         out (C),a
  478.         ld bc,hddstat
  479.         ld d,0x1a
  480. LL7c06  ;ei  
  481.         halt  
  482.         ;di  
  483.         dec d
  484.         jr z,ldaff
  485.         in a,(C)
  486.         bit 7,a
  487.         jr nz,LL7c06
  488.         and a
  489.         jr z,ldaff
  490.         inc a
  491.         jr z,ldaff
  492.         xor a
  493.         ld bc,hddcylhi
  494.         out (C),a
  495.         ld bc,hddcyllo
  496.         out (C),a
  497.         ld a,0xec
  498.         ld bc,hddcmd
  499.         out (C),a
  500.         ld bc,hddstat
  501. LL7c29  in a,(C)
  502.         and a
  503.         jr z,ldaff
  504.         inc a
  505.         jr z,ldaff
  506.         dec a
  507.         rrca  
  508.         jr c,LL7c3c
  509.         rlca  
  510.         and 0x88
  511.         cp 0x08
  512.         jr nz,LL7c29
  513. LL7c3c  ld bc,hddcyllo
  514.         in e,(C)
  515.         ld bc,hddcylhi
  516.         in d,(C)
  517.         ld a,d
  518.         or e
  519.         jp z,readsecIDE
  520.         ld hl,0xeb14 ;???
  521.         sbc hl,de
  522.         ld a,0x01
  523.         ret z
  524. ldaff  
  525.         ld a,0xff
  526.         ret  
  527.        
  528. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Z-Controller (SD-card) ;;;;;;;;;;;;;;;;
  529.  
  530. SD_INIT
  531.         call cs_highSD ;включаем питание карты при снятом выборе
  532.         ld bc,0x0057
  533.         ld de,0x20ff
  534. LL7c5d  out (C),e
  535.         dec d
  536.         jr nz,LL7c5d ;записываем в порт много единичек
  537.         xor a
  538.         exa  
  539. LL7c64  ld hl,cmd00SD ;GO_IDLE_STATE ;команда сброса и перевода карты в SPI режим после включения питания
  540.         call outcom_hlSD ;этой командой карточка переводится в режим SPI
  541.         call read32byteswaitnoffSD
  542.         exa  
  543.         dec a
  544.         jp z,errexitSD ;если карта 256 раз не ответила, то карты нет
  545.         exa  
  546.         dec a
  547.         jr nz,LL7c64
  548.         ld hl,cmd08SD ;SEND_IF_COND ;запрос поддерживаемых напряжений
  549.         call outcom_hlSD
  550.         call read32byteswaitnoffSD
  551.         in h,(C)
  552.         NOPSDCARD  
  553.         in h,(C)
  554.         NOPSDCARD  
  555.         in h,(C)
  556.         NOPSDCARD  
  557.         in h,(C)
  558.         ld hl,0
  559.         bit 2,a
  560.         jr nz,LL7c92
  561.         ld h,0x40
  562. LL7c92  ld a,0x77 ;запускаем процесс внутренней инициализации
  563.         call outcom_zeroparsSD
  564.         call read32byteswaitnoffSD
  565.        ifndef KOE
  566.         in f,(c)
  567.         NOPSDCARD
  568.         in f,(c)
  569.         NOPSDCARD
  570.        endif
  571.         ld a,0x69
  572.         out (C),a ;бит 6 установлен для инициализации SDHC карты
  573.         NOPSDCARD  
  574.         out (C),h
  575.         NOPSDCARD  
  576.         out (C),l
  577.         NOPSDCARD  
  578.         out (C),l
  579.         NOPSDCARD  
  580.         out (C),l
  581.         NOPSDCARD
  582.         ld a,0xff
  583.         out (C),a
  584.         call read32byteswaitnoffSD ;ждем перевода карты в режим готовности
  585.         and a ;время ожидания примерно 1 секунда
  586.         jr nz,LL7c92
  587. LL7cb4  ld a,0x7b ;принудительно отключаем CRC16
  588.         call outcom_zeroparsSD
  589.         call read32byteswaitnoffSD
  590.         and a
  591.         jr nz,LL7cb4
  592. LL7cbf  ld hl,cmd16SD ;SET_BLOCKEN ;команда изменения размера блока
  593.         call outcom_hlSD ;принудительно задаем размер блока 512 байт
  594.         call read32byteswaitnoffSD
  595.         and a
  596.         jr nz,LL7cbf
  597.        
  598.         ;запомним размер блока
  599.         ld a,0x7a ;READ_OCR
  600.         ld bc,0x0057
  601.         call outcom_zeroparsSD
  602.         call read32byteswaitnoffSD
  603.         in a,(C)
  604.         NOPSDCARD  
  605.         in h,(C)
  606.         NOPSDCARD  
  607.         in h,(C)
  608.         NOPSDCARD  
  609.         in h,(C)
  610.         and 0x40
  611.         ld (zsd_blsize),a
  612.        
  613. ;включение питания карты при снятом сигнале выбора карты
  614. cs_highSD
  615.         push af
  616.         ld a,0x03
  617.         ld bc,0x8057
  618.         out (C),a ;включаем питание, снимаем выбор карты
  619.         xor a
  620.         dec b
  621.         out (C),a ;обнуляем порт данных
  622. ;обнуление порта можно не делать, просто последний записанный бит всегда 1, а при сбросе через вывод данных карты напряжение попадает на вывод питания карты и светодиод на питании подсвечивается
  623.         pop af
  624.         xor a;ld a,0x00
  625.         ret  
  626.  
  627. errexitSD
  628.         call SD_OFF
  629.         ld a,0x03
  630.         ret  
  631.  
  632. SD_OFF
  633.         xor a
  634.         ld bc,0x8057
  635.         out (C),a ;выключение питания карты
  636.         dec b
  637.         out (C),a ;обнуление порта данных
  638.         ret  
  639.  
  640. ;выбираем карту сигналом 0
  641. cs_lowSD
  642.         push af
  643.         ld a,0x01
  644.         ld bc,0x8057
  645.         out (C),a
  646.         pop af
  647.         ret  
  648.  
  649. ;запись в карту команды с неизменяемым параметром из памяти
  650. ;адрес команды в HL
  651. outcom_hlSD
  652.     call cs_lowSD
  653.         ld bc,0x0657
  654.         otir  
  655.         ret  
  656.  
  657. ;запись в карту команды с нулевыми аргументами
  658. ;А=код команды, аргумент команды равен 0
  659. outcom_zeroparsSD
  660.     call cs_lowSD
  661.         ld b,0x0057
  662.        ifndef KOE
  663.         in f,(c)
  664.         NOPSDCARD
  665.         in f,(c)
  666.         NOPSDCARD
  667.        endif
  668.         out (C),a
  669.         NOPSDCARD
  670.     xor a
  671.         out (C),a
  672.         NOPSDCARD  
  673.         out (C),a
  674.         NOPSDCARD  
  675.         out (C),a
  676.         NOPSDCARD  
  677.         out (C),a
  678.         NOPSDCARD
  679.         dec a
  680.         out (C),a
  681.         ret  
  682. zsd_blsize
  683.         DEFB 0
  684. ;запись команды чтения/записи с номером сектора в BCDE для карт стандартного размера
  685. ;при изменяемом размере сектора номер сектора нужно умножать на его размер, для карт
  686. ;SDHC, мини и микро размер сектора не требует умножения
  687. setcmdparsSD
  688.         push hl
  689.         push de
  690.         push bc
  691.         push af
  692. ;       push bc
  693. ;       ld a,0x7a ;READ_OCR
  694. ;       ld bc,0x0057
  695. ;       call outcom_zeroparsSD
  696. ;       call read32byteswaitnoffSD
  697. ;       in a,(C)
  698. ;       NOPSDCARD  
  699. ;       in h,(C)
  700. ;       NOPSDCARD  
  701. ;       in h,(C)
  702. ;       NOPSDCARD  
  703. ;       in h,(C)
  704. ;       bit 6,a ;проверяем 30 бит регистра OCR (6 бит в "А")
  705. ;       pop hl       ;при установленном бите умножение номера сектора
  706.         ld h,b
  707.         ld l,c
  708.         call cs_lowSD
  709.         ld bc,0x0057
  710.         ld a,(zsd_blsize)
  711.         or a
  712.         jr nz,SECN200 ;не требуется
  713.         ex de,hl       ;при сброшенном бите соответственно
  714.         add hl,hl ;умножаем номер сектора на 512 (0x200)
  715.         ex de,hl  
  716.         adc hl,hl
  717.         ld h,l
  718.         ld l,d
  719.         ld d,e
  720.         ld e,0x00
  721. SECN200 pop af ;заготовленный номер сектора находится в HLDE
  722.        ifndef KOE
  723.         in f,(c)
  724.         NOPSDCARD
  725.         in f,(c)
  726.         NOPSDCARD
  727.        endif
  728.         out (C),a ;команда
  729.         NOPSDCARD  
  730.         out (C),h ;;пишем номер сектора от старшего
  731.         NOPSDCARD  
  732.         out (C),l
  733.         NOPSDCARD  
  734.         out (C),d
  735.         NOPSDCARD  
  736.         out (C),e ;до младшего байта
  737.         NOPSDCARD
  738.         ld a,0xff
  739.         out (C),a ;пишем пустой CRC7 и стоповый бит
  740.         pop bc
  741.         pop de
  742.         pop hl
  743.         ret
  744.        
  745. ;чтение ответа карты до 32 раз, если ответ не 0xFF - немедленный выход
  746. read32byteswaitnoffSD
  747.         push de
  748.         ld de,0x20ff
  749.         ld bc,0x0057
  750. LL7d5e  in a,(C)
  751.         cp e
  752.         jr nz,LL7d66
  753.         dec d
  754.         jr nz,LL7d5e
  755. LL7d66  pop de
  756.         ret  
  757.  
  758. cmd00SD
  759. ;GO_IDLE_STATE
  760. ;команда сброса и перевода карты в SPI режим после включения питания
  761.         db 0x40
  762.         db 0x00
  763.         db 0x00
  764.         db 0x00
  765.         db 0x00
  766.         db 0x95
  767. cmd08SD
  768. ;SEND_IF_COND
  769. ;запрос поддерживаемых напряжений
  770.         db 0x48
  771.         db 0x00
  772.         db 0x00
  773.         db 0x01
  774.         db 0xaa
  775.         db 0x87
  776. cmd16SD
  777. ;SET_BLOCKEN
  778. ;команда изменения размера блока
  779.         db 0x50
  780.         db 0x00
  781.         db 0x00
  782.         db 0x02
  783.         db 0x00
  784.         db 0xff
  785.  
  786. readsectorsSD
  787.         ld a,0x52
  788.         call setcmdparsSD
  789.         exa  
  790. LL7dbd  exa  
  791. LL7dbe  call read32byteswaitnoffSD
  792.         cp 0xfe
  793.         jr nz,LL7dbe
  794.         ;call readsecSDcard
  795. readsecSDcard  
  796.     ;push bc
  797.         ld bc,0x7f57
  798.         inir  
  799.         ld b,0x7f
  800.         inir  
  801.         ld b,0x7f
  802.         inir  
  803.         ld b,0x7f
  804.         inir  
  805.         ld b,0x04
  806.         inir  
  807.         NOPSDCARD  
  808.         in a,(C)
  809.         NOPSDCARD  
  810.         in a,(C)
  811.         ;pop bc
  812.        
  813.         exa  
  814.         dec a
  815.         jr nz,LL7dbd
  816.         ld a,0x4c
  817.         call outcom_zeroparsSD
  818. readsectorsSD_q
  819.         call read32byteswaitnoffSD_loopnoff
  820.         jp cs_highSD
  821.  
  822. read32byteswaitnoffSD_loopnoff
  823.         call read32byteswaitnoffSD
  824.         inc a
  825.         jr nz,read32byteswaitnoffSD_loopnoff
  826.         ret
  827.  
  828. writesectorsSD
  829.         ld a,0x59
  830.         call setcmdparsSD
  831. ;LL7ddf call read32byteswaitnoffSD
  832. ;       inc a
  833. ;       jr nz,LL7ddf
  834.         call read32byteswaitnoffSD_loopnoff
  835.         EX AF,AF'  
  836. WRMULT1 EX AF,AF'  
  837.         ld a,0xfc
  838. ;       call writesecSDcard
  839. writesecSDcard 
  840.     ;push bc
  841.         ld bc,0x0057
  842.         out (C),a
  843.         ld b,0x80
  844.         otir  
  845.         ld b,0x80
  846.         otir  
  847.         ld b,0x80
  848.         otir  
  849.         ld b,0x80
  850.         otir  
  851.         NOPSDCARD
  852.         ld a,0xff
  853.         out (C),a
  854.         NOPSDCARD  
  855.         out (C),a
  856.         ;pop bc
  857. ;LL7dec call read32byteswaitnoffSD
  858. ;       inc a
  859. ;       jr nz,LL7dec
  860.         call read32byteswaitnoffSD_loopnoff
  861.         EX AF,AF'  
  862.         dec a
  863.         jr nz,WRMULT1
  864.         ld c,0x57
  865.         ld a,0xfd
  866.         out (C),a
  867. ;LL7dfc call read32byteswaitnoffSD
  868. ;       inc a
  869. ;       jr nz,LL7dfc
  870.         ;call read32byteswaitnoffSD_loopnoff
  871.         ;jp cs_highSD
  872.         jr readsectorsSD_q
  873.  
  874.    
  875.        include "portsngs.asm"
  876.        include "ngssddrv.asm"
  877.    
  878.  
  879. get_fattime:
  880. ;de=buf
  881.                 if atm==1
  882.                         call readtime
  883.                 endif
  884.        ld hl,sys_time_date
  885.                 ld bc,4
  886.        ldir
  887.        ret
  888.  
  889.         if INETDRV == 1
  890.                 include "sl811.asm"
  891.         endif
  892.