?login_element?

Subversion Repositories NedoOS

Rev

Rev 391 | Rev 720 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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