Subversion Repositories ngs

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE 26.11.2024 savelij
  3.  
  4. ; SD & MP3 функции по номерам
  5.  INIT_VAR
  6.  SETVAR Sd_init         ; инит SD карты
  7.  SETVAR Sd__off         ; снятие выбора
  8.  SETVAR Rdsingl         ; читать 1 сектор
  9.  SETVAR Rdmulti         ; читать "A" сектор
  10.  SETVAR Wrsingl         ; записать 1 сектор - нету
  11.  SETVAR Wrmulti         ; записать "A" секторов - нету
  12.  SETVAR Avtodet         ; автодетект GS/NeoGS
  13.  SETVAR Freqnc          ; установка частоты
  14.  
  15. ; драйвер SD-CARD для NeoGS
  16. ; +драйвер для MP3-декодера
  17.  
  18. ; Входные параметры общие:
  19. ; HL-адрес загрузки в память
  20. ; BCDE-32-х битный номер сектора
  21. ; A-количество блоков (блок=512 байт)
  22. ; только для многоблочной записи/чтении
  23.  
  24. ; Ошибки выдаваемые на выходе:
  25. ; A=0-инициализация прошла успешно
  26. ; A=1-карта не найдена или не ответила
  27. ; A=2-карта защищена от записи
  28. ; A=3-попытка записи в сектор 0 карты
  29. ; A=0x80-карта перестала отвечать
  30.  
  31. ; общая точка входа для работы с SD картой
  32.                 CALL CMP_INT
  33.                 DI
  34.                 EXX
  35.                 PUSH HL                         ; сохранили HL'
  36.                 PUSH DE                         ; сохранили DE'
  37.                 LD HL,OK_SD
  38.                 PUSH HL                         ; возврат на все OK
  39.                 LD HL,0
  40.                 ADD HL,SP                       ; сохранили стек
  41.                 EX DE,HL
  42.                 LD HL,ERR_SD                    ; адрес перехода при ошибке
  43.                 EXX
  44.                 PUSH HL
  45.                 PUSH DE
  46.                 ADD A,A
  47.                 LD L,A
  48.                 LD H,0
  49.                 LD DE,TABL_SD
  50.                 ADD HL,DE
  51.                 EX AF,AF'
  52.                 LD E,(HL)
  53.                 INC HL
  54.                 LD D,(HL)
  55.                 EX DE,HL
  56.                 POP DE
  57.                 EX (SP),HL
  58.                 RET
  59.  
  60. OK_SD           EXX
  61. ERR_SD          EX DE,HL
  62.                 LD SP,HL
  63.                 POP DE
  64.                 POP DE
  65.                 POP HL
  66.                 EXX
  67.                 PUSH AF
  68.                 LD A,(INT_MODE)
  69.                 AND A
  70.                 JR Z,ERR_SD1
  71.                 EI
  72. ERR_SD1         POP AF
  73.                 RET
  74.  
  75. TABL_SD         DW SD_INIT              ; 00 параметров не требует, на выходе A смотри выше первые 2 значения
  76.                 DW SD__OFF              ; 01 просто снятие выбора SD карты
  77.                 DW RDSINGL              ; 02 читать 1 сектор
  78.                 DW RDMULTI              ; 03 читать "A" секторов
  79.                 DW EMPTY                ; 04 писать 1 сектор
  80.                 DW EMPTY                ; 05 писать "A" секторов
  81.                 DW AVTODET              ; 06-автодетект
  82.                 DW FREQNC               ; 07-установка частоты
  83.  
  84. ZAW003          CALL SD__OFF
  85.                 LD A,1
  86. EMPTY           RET
  87.  
  88. SD_INIT         CALL CS_HIGH
  89.                 LD BC,SD_SEND
  90.                 LD DE,0x20FF
  91.                 OUT (C),E
  92.                 DEC D
  93.                 JR NZ,$-3
  94.                 LD BC,SD_RSTR
  95.                 XOR A
  96.                 EX AF,AF'
  97. ZAW001          LD HL,CMD00
  98.                 CALL OUTCOM
  99.                 CALL IN_OOUT
  100.                 EX AF,AF'
  101.                 DEC A
  102.                 JR Z,ZAW003
  103.                 EX AF,AF'
  104.                 DEC A
  105.                 JR NZ,ZAW001
  106.                 LD HL,CMD08
  107.                 CALL OUTCOM
  108.                 CALL IN_OOUT
  109.                 IN H,(C)
  110.                 NOP
  111.                 IN H,(C)
  112.                 NOP
  113.                 IN H,(C)
  114.                 NOP
  115.                 IN H,(C)
  116.                 LD HL,0
  117.                 BIT 2,A
  118.                 JR NZ,ZAW006
  119.                 LD H,0x40
  120. ZAW006          LD A,CMD_55
  121.                 CALL OUT_COM
  122.                 CALL IN_OOUT
  123.                 in (c) ;in f,(c)
  124.                 in (c) ;in f,(c)
  125.                 LD BC,SD_SEND
  126.                 LD A,ACMD_41
  127.                 OUT (C),A
  128.                 NOP
  129.                 OUT (C),H
  130.                 NOP
  131.                 OUT (C),L
  132.                 NOP
  133.                 OUT (C),L
  134.                 NOP
  135.                 OUT (C),L
  136.                 LD A,0xFF
  137.                 OUT (C),A
  138.                 CALL IN_OOUT
  139.                 AND A
  140.                 JR NZ,ZAW006
  141. ZAW004          LD A,CMD_59
  142.                 CALL OUT_COM
  143.                 CALL IN_OOUT
  144.                 AND A
  145.                 JR NZ,ZAW004
  146. ZAW005          LD HL,CMD16
  147.                 CALL OUTCOM
  148.                 CALL IN_OOUT
  149.                 AND A
  150.                 JR NZ,ZAW005
  151.  
  152. SD__OFF
  153. CS_HIGH         PUSH AF
  154.                 LD A,M_SDNCS+M_SNCLR            ; 0x81
  155.                 OUT (SCTRL),A
  156.                 POP AF
  157.                 RET
  158.  
  159. CS__LOW         PUSH AF
  160.                 LD A,M_SDNCS                    ; 1
  161.                 OUT (SCTRL),A
  162.                 POP AF
  163.                 RET
  164.  
  165. OUTCOM          CALL CS__LOW
  166.                 PUSH BC
  167.                 LD BC,0x0600+SD_SEND
  168.                 OTIR
  169.                 POP BC
  170.                 RET
  171.  
  172. OUT_COM         PUSH BC
  173.                 CALL CS__LOW
  174.                 LD BC,SD_SEND
  175.                 in (c) ;in f,(c)
  176.                 in (c) ;in f,(c)
  177.                 OUT (C),A
  178.                 XOR A
  179.                 OUT (C),A
  180.                 NOP
  181.                 OUT (C),A
  182.                 NOP
  183.                 OUT (C),A
  184.                 NOP
  185.                 OUT (C),A
  186.                 DEC A
  187.                 OUT (C),A
  188.                 POP BC
  189.                 RET
  190.  
  191. SECM200         PUSH HL
  192.                 PUSH DE
  193.                 PUSH BC
  194.                 PUSH AF
  195.                 PUSH BC
  196.                 LD A,CMD_58
  197.                 LD BC,SD_RSTR
  198.                 CALL OUT_COM
  199.                 CALL IN_OOUT
  200.                 INC A
  201.                 JR NZ,SCM200
  202.                 EXX
  203.                 LD A,0x80
  204.                 JP (HL)
  205.  
  206. SCM200          IN A,(C)
  207.                 NOP
  208.                 IN H,(C)
  209.                 NOP
  210.                 IN H,(C)
  211.                 NOP
  212.                 IN H,(C)
  213.                 BIT 6,A
  214.                 POP HL
  215.                 JR NZ,SECN200
  216.                 EX DE,HL
  217.                 ADD HL,HL
  218.                 EX DE,HL
  219.                 ADC HL,HL
  220.                 LD H,L
  221.                 LD L,D
  222.                 LD D,E
  223.                 LD E,0
  224. SECN200         POP AF
  225.                 in (c) ;in f,(c)
  226.                 in (c) ;in f,(c)
  227.                 LD BC,SD_SEND
  228.                 OUT (C),A
  229.                 NOP
  230.                 OUT (C),H
  231.                 NOP
  232.                 OUT (C),L
  233.                 NOP
  234.                 OUT (C),D
  235.                 NOP
  236.                 OUT (C),E
  237.                 LD A,0xFF
  238.                 OUT (C),A
  239.                 POP BC
  240.                 POP DE
  241.                 POP HL
  242.                 RET
  243.  
  244. IN_OOUT         PUSH DE
  245.                 LD DE,0x30FF
  246. IN_WAIT         IN A,(SD_RSTR)
  247.                 CP E
  248.                 JR NZ,IN_EXIT
  249.                 DEC D
  250.                 JR NZ,IN_WAIT
  251. IN_EXIT         POP DE
  252.                 RET
  253.  
  254. CMD00           DB 0x40,0x00,0x00,0x00,0x00,0x95        ; GO_IDLE_STATE
  255. CMD08           DB 0x48,0x00,0x00,0x01,0xAA,0x87        ; SEND_IF_COND
  256. CMD16           DB 0x50,0x00,0x00,0x02,0x00,0xFF        ; SET_BLOCKEN
  257.  
  258. ; чтение одного сектора в память
  259. RD_SECT         PUSH BC
  260.                 PUSH DE
  261.                 LD BC,SD_RSTR
  262.                 INIR
  263.                 INIR
  264.                 IN A,(C)                        ; снятие CRC16
  265.                 NOP
  266.                 IN A,(C)
  267.                 POP DE
  268.                 POP BC
  269.                 RET
  270.  
  271. ; загрузка одного сектора в память
  272. RDSINGL         LD A,CMD_17
  273.                 CALL SECM200
  274. .L1             CALL IN_OOUT
  275.                 CP 0xFE
  276.                 JR NZ,.L1
  277.                 CALL RD_SECT
  278. .L2             CALL IN_OOUT
  279.                 INC A
  280.                 JR NZ,.L2
  281.                 JP CS_HIGH
  282.  
  283. RDMULTI         EX AF,AF'
  284.                 LD A,CMD_18
  285.                 CALL SECM200
  286.                 EX AF,AF'
  287. .L1             EX AF,AF'
  288. .L3             CALL IN_OOUT
  289.                 CP 0xFE
  290.                 JR NZ,.L3
  291.                 CALL RD_SECT
  292.                 EX AF,AF'
  293.                 DEC A
  294.                 JR NZ,.L1
  295.                 LD A,CMD_12
  296.                 CALL OUT_COM
  297. .L2             CALL IN_OOUT
  298.                 INC A
  299.                 JR NZ,.L2
  300.                 JP CS_HIGH
  301.  
  302. ; ожидание готовности SPI MP3 чипа
  303. NOPER
  304.         REPT 18
  305.                 NOP
  306.         ENDM
  307.                 RET
  308.  
  309. AVTODET         IN A,(GSCFG0)
  310.                 AND %11001111;0xCF
  311.                 OUT (GSCFG0),A
  312.                 LD D,A
  313.                 CALL NOPER
  314.                 IN A,(GSCFG0)
  315.                 CP D
  316.                 LD A,0
  317.                 RET Z
  318. NO_MP3          LD A,0xFF
  319.                 RET
  320.  
  321. FREQNC          LD A,E
  322.                 LD D,C_10MHZ                    ; 0x30
  323.                 AND 3
  324.                 JR Z,.L1
  325.                 LD D,C_12MHZ                    ; 0x10
  326.                 DEC A
  327.                 JR Z,.L1
  328.                 LD D,C_20MHZ                    ; 0x20
  329.                 DEC A
  330.                 JR Z,.L1
  331.                 LD D,C_24MHZ                    ; 0
  332. .L1             IN A,(GSCFG0)
  333.                 AND %11001111
  334.                 OR D
  335.                 OUT (GSCFG0),A
  336.                 RET
  337.  
  338. ; глушим громкость MOD портов
  339. VOL_MOD         XOR A
  340.                 OUT (VOL1),A
  341.                 OUT (VOL2),A
  342.                 OUT (VOL3),A
  343.                 OUT (VOL4),A
  344.                 OUT (VOL5),A
  345.                 OUT (VOL6),A
  346.                 OUT (VOL7),A
  347.                 OUT (VOL8),A
  348.                 RET
  349.  
  350. CMP_INT         PUSH AF
  351.                 LD A,R
  352.                 JP PE,CMP_INT1
  353.                 LD A,R
  354. CMP_INT1        LD A,0
  355.                 JP PO,CMP_INT2
  356.                 LD A,1
  357. CMP_INT2        LD (INT_MODE),A
  358.                 POP AF
  359.                 RET
  360.