?login_element?

Subversion Repositories NedoOS

Rev

Rev 1132 | 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.         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. sendcmd_waitDRQ
  312.         ld bc,hddcmd
  313.         out (C),a
  314. waitDRQ
  315.         ;ld a,(sys_timer)
  316.         ;add a,2
  317.         ;ld (waitDRQmaxtime),a
  318.         ld bc,hddstat
  319. waitDRQ0
  320.        ;ld a,(sys_timer)
  321. waitDRQmaxtime=$+1
  322.        ;cp 0
  323.        ;ret z
  324.         in a,(C)
  325.         and 0x88
  326.         cp 0x08
  327.         jr nz,waitDRQ0 ;ожидание готовности передачи данных
  328.         ret
  329.  
  330. readsectorsIDE
  331. ;b+a=head+device
  332. ;c=cylHI
  333. ;d=cylLO
  334. ;e=sec
  335. ;a'=count
  336.     add a,b
  337.         ld b,a
  338. ;b=head
  339. ;c=cylHI
  340. ;d=cylLO
  341. ;e=sec
  342. ;a'=count
  343.         call setblockparsIDE
  344.         exa  
  345.         ld a,0x20
  346.         call sendcmd_waitDRQ
  347.         exa  
  348. readsectorsIDE0
  349.         exa  
  350.         call readsecIDE
  351.         ld bc,hddstat
  352. nobsy0
  353.         in a,(C)
  354.         and 0x80
  355.         jr nz,nobsy0
  356.         exa  
  357.         dec a
  358.         jr nz,readsectorsIDE0
  359.         jr lda0
  360.  
  361. writesectorsIDE
  362. ;b+a=head+device
  363. ;c=cylHI
  364. ;d=cylLO
  365. ;e=sec
  366. ;a'=count
  367.         add a,b
  368.         ld b,a
  369. ;b=head
  370. ;c=cylHI
  371. ;d=cylLO
  372. ;e=sec
  373. ;a'=count
  374.         call setblockparsIDE
  375.         exa  
  376.         ld a,0x30
  377.         call sendcmd_waitDRQ
  378.         exa
  379. writesectorsIDE0
  380.         exa  
  381.         call writesecIDE
  382.         ;inc h
  383.         ;inc h
  384.         ld bc,hddstat
  385. nobsy01
  386.         in a,(C)
  387.         and 0x80
  388.         jr nz,nobsy01
  389.         exa  
  390.         dec a
  391.         jr nz,writesectorsIDE0
  392. lda0   
  393.         xor a;ld a,0x00
  394.         ret
  395.  
  396. readsecIDE
  397.         ;jr $
  398.         xor a;ld a,0
  399. readsecIDE0
  400.         ld bc,hdddatlo
  401.         in e,(C)
  402.         ld bc,hdddathi
  403.         in d,(C)
  404.         ld (hl),e
  405.         inc hl
  406.         ld (hl),d
  407.         inc hl
  408.         dec a
  409.         jr nz,readsecIDE0
  410.         ret
  411.        
  412. writesecIDE
  413.         if (hdddatlo != 0x10)
  414.         xor a
  415. writesecIDE0
  416.         ld e,(hl)
  417.         inc hl
  418.         ld d,(hl)
  419.         inc hl
  420.         ld bc,hdddathi
  421.         out (c),d
  422.         ld bc,hdddatlo
  423.         out (c),e
  424.         dec a
  425.         jr nz,writesecIDE0
  426.         else
  427.         ld bc,0x0000 + hdddathi
  428. writesecIDE0
  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.         ld a,(hl)
  442.         inc hl
  443.         outi
  444.         out (hdddatlo),a
  445.         jr nz,writesecIDE0
  446.         endif
  447.         ret
  448.        
  449. setblockparsIDE
  450. ;b=head
  451. ;c=cylHI
  452. ;d=cylLO
  453. ;e=sec
  454. ;a'=count      
  455.         push de
  456.         ld d,b
  457.         ld e,c
  458.         ;ld bc,0xff00+hddhead ;зачем ff???
  459.         ld bc,hddhead
  460.         out (C),d ;head
  461.         ld bc,hddstat
  462. nobsy02
  463.         in a,(C)
  464.         and 0x80
  465.         jr nz,nobsy02
  466.         ld bc,hddcylhi
  467.         out (C),e ;cylHI
  468.         pop de
  469.         ld bc,hddcyllo
  470.         out (C),d ;cylLo
  471.         ld bc,hddsec
  472.         out (C),e ;sec
  473.         ld bc,hddcount
  474.         exa  
  475.         out (C),a ;count
  476.         ret
  477.        
  478. readidentIDE
  479.         ;ld bc,0xff00+hddhead ;зачем ff???
  480.         ;потому что неучаствующие биты в единице обычно
  481.         ld bc,hddhead
  482.         out (C),a
  483.         ld bc,hddstat
  484.         ld d,0x1a
  485. LL7c06  ;ei  
  486.         halt  
  487.         ;di  
  488.         dec d
  489.         jr z,ldaff
  490.         in a,(C)
  491.         bit 7,a
  492.         jr nz,LL7c06
  493.         and a
  494.         jr z,ldaff
  495.         inc a
  496.         jr z,ldaff
  497.         xor a
  498.         ld bc,hddcylhi
  499.         out (C),a
  500.         ld bc,hddcyllo
  501.         out (C),a
  502.         ld a,0xec
  503.         ld bc,hddcmd
  504.         out (C),a
  505.         ld bc,hddstat
  506. LL7c29  in a,(C)
  507.         and a
  508.         jr z,ldaff
  509.         inc a
  510.         jr z,ldaff
  511.         dec a
  512.         rrca  
  513.         jr c,LL7c3c
  514.         rlca  
  515.         and 0x88
  516.         cp 0x08
  517.         jr nz,LL7c29
  518. LL7c3c  ld bc,hddcyllo
  519.         in e,(C)
  520.         ld bc,hddcylhi
  521.         in d,(C)
  522.         ld a,d
  523.         or e
  524.         jp z,readsecIDE
  525.         ld hl,0xeb14 ;???
  526.         sbc hl,de
  527.         ld a,0x01
  528.         ret z
  529. ldaff  
  530.         ld a,0xff
  531.         ret  
  532.        
  533. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Z-Controller (SD-card) ;;;;;;;;;;;;;;;;
  534.  
  535. SD_INIT
  536.         call cs_highSD ;включаем питание карты при снятом выборе
  537.         ld bc,0x0057
  538.         ld de,0x20ff
  539. LL7c5d  out (C),e
  540.         dec d
  541.         jr nz,LL7c5d ;записываем в порт много единичек
  542.         xor a
  543.         exa  
  544. LL7c64  ld hl,cmd00SD ;GO_IDLE_STATE ;команда сброса и перевода карты в SPI режим после включения питания
  545.         call outcom_hlSD ;этой командой карточка переводится в режим SPI
  546.         call read32byteswaitnoffSD
  547.         exa  
  548.         dec a
  549.         jp z,errexitSD ;если карта 256 раз не ответила, то карты нет
  550.         exa  
  551.         dec a
  552.         jr nz,LL7c64
  553.         ld hl,cmd08SD ;SEND_IF_COND ;запрос поддерживаемых напряжений
  554.         call outcom_hlSD
  555.         call read32byteswaitnoffSD
  556.         in h,(C)
  557.         NOPSDCARD  
  558.         in h,(C)
  559.         NOPSDCARD  
  560.         in h,(C)
  561.         NOPSDCARD  
  562.         in h,(C)
  563.         ld hl,0
  564.         bit 2,a
  565.         jr nz,LL7c92
  566.         ld h,0x40
  567. LL7c92  ld a,0x77 ;запускаем процесс внутренней инициализации
  568.         call outcom_zeroparsSD
  569.         call read32byteswaitnoffSD
  570.        ifndef KOE
  571.         in f,(c)
  572.         NOPSDCARD
  573.         in f,(c)
  574.         NOPSDCARD
  575.        endif
  576.         ld a,0x69
  577.         out (C),a ;бит 6 установлен для инициализации SDHC карты
  578.         NOPSDCARD  
  579.         out (C),h
  580.         NOPSDCARD  
  581.         out (C),l
  582.         NOPSDCARD  
  583.         out (C),l
  584.         NOPSDCARD  
  585.         out (C),l
  586.         NOPSDCARD
  587.         ld a,0xff
  588.         out (C),a
  589.         call read32byteswaitnoffSD ;ждем перевода карты в режим готовности
  590.         and a ;время ожидания примерно 1 секунда
  591.         jr nz,LL7c92
  592. LL7cb4  ld a,0x7b ;принудительно отключаем CRC16
  593.         call outcom_zeroparsSD
  594.         call read32byteswaitnoffSD
  595.         and a
  596.         jr nz,LL7cb4
  597. LL7cbf  ld hl,cmd16SD ;SET_BLOCKEN ;команда изменения размера блока
  598.         call outcom_hlSD ;принудительно задаем размер блока 512 байт
  599.         call read32byteswaitnoffSD
  600.         and a
  601.         jr nz,LL7cbf
  602.        
  603.         ;запомним размер блока
  604.         ld a,0x7a ;READ_OCR
  605.         ld bc,0x0057
  606.         call outcom_zeroparsSD
  607.         call read32byteswaitnoffSD
  608.         in a,(C)
  609.         NOPSDCARD  
  610.         in h,(C)
  611.         NOPSDCARD  
  612.         in h,(C)
  613.         NOPSDCARD  
  614.         in h,(C)
  615.         and 0x40
  616.         ld (zsd_blsize),a
  617.        
  618. ;включение питания карты при снятом сигнале выбора карты
  619. cs_highSD
  620.         push af
  621.         ld a,0x03
  622.         ld bc,0x8057
  623.         out (C),a ;включаем питание, снимаем выбор карты
  624.         xor a
  625.         dec b
  626.         out (C),a ;обнуляем порт данных
  627. ;обнуление порта можно не делать, просто последний записанный бит всегда 1, а при сбросе через вывод данных карты напряжение попадает на вывод питания карты и светодиод на питании подсвечивается
  628.         pop af
  629.         xor a;ld a,0x00
  630.         ret  
  631.  
  632. errexitSD
  633.         call SD_OFF
  634.         ld a,0x03
  635.         ret  
  636.  
  637. SD_OFF
  638.         xor a
  639.         ld bc,0x8057
  640.         out (C),a ;выключение питания карты
  641.         dec b
  642.         out (C),a ;обнуление порта данных
  643.         ret  
  644.  
  645. ;выбираем карту сигналом 0
  646. cs_lowSD
  647.         push af
  648.         ld a,0x01
  649.         ld bc,0x8057
  650.         out (C),a
  651.         pop af
  652.         ret  
  653.  
  654. ;запись в карту команды с неизменяемым параметром из памяти
  655. ;адрес команды в HL
  656. outcom_hlSD
  657.     call cs_lowSD
  658.         ld bc,0x0657
  659.         otir  
  660.         ret  
  661.  
  662. ;запись в карту команды с нулевыми аргументами
  663. ;А=код команды, аргумент команды равен 0
  664. outcom_zeroparsSD
  665.     call cs_lowSD
  666.         ld b,0x0057
  667.        ifndef KOE
  668.         in f,(c)
  669.         NOPSDCARD
  670.         in f,(c)
  671.         NOPSDCARD
  672.        endif
  673.         out (C),a
  674.         NOPSDCARD
  675.     xor a
  676.         out (C),a
  677.         NOPSDCARD  
  678.         out (C),a
  679.         NOPSDCARD  
  680.         out (C),a
  681.         NOPSDCARD  
  682.         out (C),a
  683.         NOPSDCARD
  684.         dec a
  685.         out (C),a
  686.         ret  
  687. zsd_blsize
  688.         DEFB 0
  689. ;запись команды чтения/записи с номером сектора в BCDE для карт стандартного размера
  690. ;при изменяемом размере сектора номер сектора нужно умножать на его размер, для карт
  691. ;SDHC, мини и микро размер сектора не требует умножения
  692. setcmdparsSD
  693.         push hl
  694.         push de
  695.         push bc
  696.         push af
  697. ;       push bc
  698. ;       ld a,0x7a ;READ_OCR
  699. ;       ld bc,0x0057
  700. ;       call outcom_zeroparsSD
  701. ;       call read32byteswaitnoffSD
  702. ;       in a,(C)
  703. ;       NOPSDCARD  
  704. ;       in h,(C)
  705. ;       NOPSDCARD  
  706. ;       in h,(C)
  707. ;       NOPSDCARD  
  708. ;       in h,(C)
  709. ;       bit 6,a ;проверяем 30 бит регистра OCR (6 бит в "А")
  710. ;       pop hl       ;при установленном бите умножение номера сектора
  711.         ld h,b
  712.         ld l,c
  713.         call cs_lowSD
  714.         ld bc,0x0057
  715.         ld a,(zsd_blsize)
  716.         or a
  717.         jr nz,SECN200 ;не требуется
  718.         ex de,hl       ;при сброшенном бите соответственно
  719.         add hl,hl ;умножаем номер сектора на 512 (0x200)
  720.         ex de,hl  
  721.         adc hl,hl
  722.         ld h,l
  723.         ld l,d
  724.         ld d,e
  725.         ld e,0x00
  726. SECN200 pop af ;заготовленный номер сектора находится в HLDE
  727.        ifndef KOE
  728.         in f,(c)
  729.         NOPSDCARD
  730.         in f,(c)
  731.         NOPSDCARD
  732.        endif
  733.         out (C),a ;команда
  734.         NOPSDCARD  
  735.         out (C),h ;;пишем номер сектора от старшего
  736.         NOPSDCARD  
  737.         out (C),l
  738.         NOPSDCARD  
  739.         out (C),d
  740.         NOPSDCARD  
  741.         out (C),e ;до младшего байта
  742.         NOPSDCARD
  743.         ld a,0xff
  744.         out (C),a ;пишем пустой CRC7 и стоповый бит
  745.         pop bc
  746.         pop de
  747.         pop hl
  748.         ret
  749.        
  750. ;чтение ответа карты до 32 раз, если ответ не 0xFF - немедленный выход
  751. read32byteswaitnoffSD
  752.         push de
  753.         ld de,0x20ff
  754.         ld bc,0x0057
  755. LL7d5e  in a,(C)
  756.         cp e
  757.         jr nz,LL7d66
  758.         dec d
  759.         jr nz,LL7d5e
  760. LL7d66  pop de
  761.         ret  
  762.  
  763. cmd00SD
  764. ;GO_IDLE_STATE
  765. ;команда сброса и перевода карты в SPI режим после включения питания
  766.         db 0x40
  767.         db 0x00
  768.         db 0x00
  769.         db 0x00
  770.         db 0x00
  771.         db 0x95
  772. cmd08SD
  773. ;SEND_IF_COND
  774. ;запрос поддерживаемых напряжений
  775.         db 0x48
  776.         db 0x00
  777.         db 0x00
  778.         db 0x01
  779.         db 0xaa
  780.         db 0x87
  781. cmd16SD
  782. ;SET_BLOCKEN
  783. ;команда изменения размера блока
  784.         db 0x50
  785.         db 0x00
  786.         db 0x00
  787.         db 0x02
  788.         db 0x00
  789.         db 0xff
  790.  
  791. readsectorsSD
  792.         ld a,0x52
  793.         call setcmdparsSD
  794.         exa  
  795. LL7dbd  exa  
  796. LL7dbe  call read32byteswaitnoffSD
  797.         cp 0xfe
  798.         jr nz,LL7dbe
  799.         ;call readsecSDcard
  800. readsecSDcard  
  801.     ;push bc
  802.         ld bc,0x7f57
  803.         inir  
  804.         ld b,0x7f
  805.         inir  
  806.         ld b,0x7f
  807.         inir  
  808.         ld b,0x7f
  809.         inir  
  810.         ld b,0x04
  811.         inir  
  812.         NOPSDCARD  
  813.         in a,(C)
  814.         NOPSDCARD  
  815.         in a,(C)
  816.         ;pop bc
  817.        
  818.         exa  
  819.         dec a
  820.         jr nz,LL7dbd
  821.         ld a,0x4c
  822.         call outcom_zeroparsSD
  823. readsectorsSD_q
  824.         call read32byteswaitnoffSD_loopnoff
  825.         jp cs_highSD
  826.  
  827. read32byteswaitnoffSD_loopnoff
  828.         call read32byteswaitnoffSD
  829.         inc a
  830.         jr nz,read32byteswaitnoffSD_loopnoff
  831.         ret
  832.  
  833. writesectorsSD
  834.         ld a,0x59
  835.         call setcmdparsSD
  836. ;LL7ddf call read32byteswaitnoffSD
  837. ;       inc a
  838. ;       jr nz,LL7ddf
  839.         call read32byteswaitnoffSD_loopnoff
  840.         EX AF,AF'  
  841. WRMULT1 EX AF,AF'  
  842.         ld a,0xfc
  843. ;       call writesecSDcard
  844. writesecSDcard 
  845.     ;push bc
  846.         ld bc,0x0057
  847.         out (C),a
  848.         ld b,0x80
  849.         otir  
  850.         ld b,0x80
  851.         otir  
  852.         ld b,0x80
  853.         otir  
  854.         ld b,0x80
  855.         otir  
  856.         NOPSDCARD
  857.         ld a,0xff
  858.         out (C),a
  859.         NOPSDCARD  
  860.         out (C),a
  861.         ;pop bc
  862. ;LL7dec call read32byteswaitnoffSD
  863. ;       inc a
  864. ;       jr nz,LL7dec
  865.         call read32byteswaitnoffSD_loopnoff
  866.         EX AF,AF'  
  867.         dec a
  868.         jr nz,WRMULT1
  869.         ld c,0x57
  870.         ld a,0xfd
  871.         out (C),a
  872. ;LL7dfc call read32byteswaitnoffSD
  873. ;       inc a
  874. ;       jr nz,LL7dfc
  875.         ;call read32byteswaitnoffSD_loopnoff
  876.         ;jp cs_highSD
  877.         jr readsectorsSD_q
  878.  
  879.    
  880.        include "portsngs.asm"
  881.        include "ngssddrv.asm"
  882.    
  883.  
  884. get_fattime:
  885. ;de=buf
  886.                 if atm==1
  887.                         call readtime
  888.                 endif
  889.        ld hl,sys_time_date
  890.                 ld bc,4
  891.        ldir
  892.        ret
  893.  
  894.         if INETDRV == 1
  895.                 include "sl811.asm"
  896.         endif
  897.