Subversion Repositories NedoOS

Rev

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