Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 19.02.2010 savelij
  3.  
  4. ;АДРЕС ЦИКЛА ОБЩЕНИЯ СО СПЕКОМ
  5. COMINT_         EQU 0X026E
  6.  
  7. ;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА NeoGS
  8. SETUPSD         EQU 0X5B00
  9.  
  10. ;ДРАЙВЕР SD-CARD ДЛЯ NGS
  11.  
  12. ;Входные параметры общие:
  13. ;HL-адрес загрузки в память
  14. ;BCDE-32-х битный номер сектора
  15. ;A-количество блоков (блок=512 байт)
  16. ;только для многоблочной записи/чтении
  17.  
  18. ;Ошибки выдаваемые на выходе:
  19. ;A=0-инициализация прошла успешно
  20. ;A=1-карта не найдена или не ответила
  21.  
  22. COMSDG          EX AF,AF'
  23.                 LD A,IYL
  24.                 AND A
  25.                 LD A,(NEXTBYTERST8)
  26.                 JR Z,COMSDG1
  27.                 EX (SP),HL
  28.                 LD A,(HL)
  29.                 INC HL
  30.                 EX (SP),HL
  31. COMSDG1         ADD A,A
  32.                 PUSH HL
  33.                 LD HL,RET4SDG
  34.                 EX (SP),HL
  35.                 PUSH HL
  36.                 LD HL,NGSSDT
  37.                 ADD A,L
  38.                 LD L,A
  39.                 ADC A,H
  40.                 SUB L
  41.                 LD H,A
  42.                 LD A,(HL)
  43.                 INC HL
  44.                 LD H,(HL)
  45.                 LD L,A
  46.                 EX AF,AF'
  47.                 EX (SP),HL
  48.                 RET
  49.  
  50. RET4SDG         PUSH AF
  51.                 LD A,IYL
  52.                 AND A
  53.                 JR NZ,RET4SDG1
  54.                 LD (REG_L),HL
  55.                 EX (SP),HL
  56.                 LD (REG_F),HL
  57.                 EX (SP),HL
  58. RET4SDG1        POP AF
  59.                 RET
  60.  
  61.  
  62. NGSSDT          DW GSDINIT      ;ИНИТ SD КАРТЫ
  63.                 DW GSDOFF       ;ОТКЛЮЧЕНИЕ SD КАРТЫ
  64.                 DW SDRDSIN      ;ЧИТАТЬ 1 СЕКТОР
  65.                 DW SDRDMUL      ;ЧИТАТЬ "A" СЕКТОРОВ
  66.  
  67. ;ЧТЕНИЕ "A" СЕКТОРОВ
  68. SDRDMUL         EX AF,AF'
  69.                 LD A,3
  70.                 JR SDRDSN3
  71.  
  72. ;ЧТЕНИЕ ОДНОГО СЕКТОРА
  73. SDRDSIN         LD A,1
  74.                 EX AF,AF'
  75.                 LD A,2
  76. SDRDSN3         CALL COMM2SD
  77.                 EX AF,AF'
  78.                 PUSH DE
  79.                 PUSH BC
  80.                 LD BC,GSDAT
  81. SDRDSN1         EX AF,AF'
  82.                 OUT (GSCOM),A
  83.                 CALL WC_
  84.                 LD DE,0X0200
  85. SDRDSN2         CALL WN_
  86.                 INI
  87.                 DEC DE
  88.                 LD A,D
  89.                 OR E
  90.                 JR NZ,SDRDSN2
  91.                 EX AF,AF'
  92.                 DEC A
  93.                 JR NZ,SDRDSN1
  94.                 CALL WN_
  95.                 IN A,(C)
  96.                 CP 0X77
  97.                 JR NZ,$-4
  98.                 POP BC
  99.                 POP DE
  100.                 XOR A
  101.                 RET
  102.  
  103. ;ОТКЛЮЧЕНИЕ ВЫБОРА КАРТОЧКИ
  104. GSDOFF          LD A,1
  105.                 JR GSDINIT+1
  106.  
  107. ;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
  108. GSDINIT         XOR A
  109.                 CALL COMM2SD
  110.                 CALL WN_
  111.                 IN A,(GSDAT)
  112.                 CP 0X77
  113.                 JR NZ,SD_NO
  114.                 XOR A
  115.                 RET
  116.  
  117. SD_NO           LD A,1
  118.                 RET
  119.  
  120. ;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
  121. COMM2SD         OUT (GSDAT),A           ;УШЛА КОМАНДА ДРАЙВЕРУ
  122.                 LD A,0X1E
  123.                 OUT (GSCOM),A
  124.                 CALL WC_                ;УШЛА КОМАНДА ПРОШИВКЕ
  125.                 LD A,B
  126.                 OUT (GSDAT),A
  127.                 CALL WD_                ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ
  128.                 LD A,C
  129.                 OUT (GSDAT),A
  130.                 CALL WD_                ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
  131.                 LD A,D
  132.                 OUT (GSDAT),A
  133.                 CALL WD_                ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
  134.                 LD A,E
  135.                 OUT (GSDAT),A
  136.                 CALL WD_                ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
  137.                 EX AF,AF'
  138.                 OUT (GSDAT),A
  139.                 EX AF,AF'
  140.                 DUPL 9,0
  141.                 RET                     ;УШЛО КОЛ-ВО СЕКТОРОВ
  142.  
  143. ;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
  144. WD_             IN A,(GSCOM)
  145.                 RLA
  146.                 JR C,$-3
  147.                 RET
  148.  
  149. ;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
  150. WN_             IN A,(GSCOM)
  151.                 RLA
  152.                 JR NC,$-3
  153.                 RET
  154.  
  155. ;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
  156. WC_             IN A,(GSCOM)
  157.                 RRA
  158.                 JR C,$-3
  159.                 RET
  160.  
  161. ;УСТАНОВЩИК ДРАЙВЕРА НА NeoGS
  162. INSTSDD         LD A,0X80
  163.                 OUT (GSCTR),A
  164.                 EI
  165.                 HALT
  166.                 HALT
  167.                 DI
  168.                 LD A,0XF3
  169.                 LD B,0X30
  170.                 OUT (GSCOM),A
  171. ISDD1           EI
  172.                 HALT
  173.                 DI
  174.                 DEC B
  175.                 JR Z,SD_NO
  176.                 IN A,(GSCOM)
  177.                 RRA
  178.                 JR C,ISDD1
  179.                 LD BC,GSDAT
  180.                 IN A,(C)
  181.                 LD DE,0X0300
  182.                 LD HL,SETUPSD
  183.                 OUT (C),E
  184.                 LD A,0X14
  185.                 OUT (GSCOM),A
  186.                 CALL WC_
  187.                 OUT (C),D
  188.                 CALL WD_
  189.                 OUT (C),L
  190.                 CALL WD_
  191.                 OUT (C),H
  192.                 CALL WD_
  193.                 LD HL,UKLAD1
  194. ISDD3           OUTI
  195.                 CALL WD_
  196.                 DEC DE
  197.                 LD A,D
  198.                 OR E
  199.                 JR NZ,ISDD3
  200.                 LD HL,SETUPSD
  201.                 OUT (C),L
  202.                 LD A,0X13
  203.                 OUT (GSCOM),A
  204.                 CALL WC_
  205.                 OUT (C),H
  206.                 EI
  207.                 HALT
  208.                 HALT
  209.                 DI
  210.                 LD B,3
  211.                 IN A,(GSDAT)
  212.                 DEC B
  213.                 JP Z,SD_NO
  214.                 CP 0X77
  215.                 JP NZ,SD_NO
  216.                 XOR A
  217.                 RET
  218.  
  219. UKLAD1  ;ОТКУДА КОД НА НГС ЗАКИДЫВАТЬ
  220.  
  221.                 PHASE SETUPSD
  222.  
  223. ;САМ УСТАНОВЩИК ДРАЙВЕРА ДЛЯ NeoGS
  224.                 DI
  225.                 LD A,0X9C
  226.                 OUT (SCTRL),A           ;КОНФИГУРАТОР NeoGS
  227.                 CALL AVTODET
  228.                 AND A
  229.                 LD A,0X77               ;0X77-NeoGS НАЙДЕН
  230.                 JR Z,$+4
  231.                 LD A,0XCC               ;0XCC-НАЙДЕН OLDGS
  232.                 OUT (ZXDATWR),A
  233.                 OUT (CLRCBIT),A
  234.                 JP NZ,COMINT_
  235.                 DI
  236.                 IN A,(GSCFG0)
  237.                 RES B_RAMRO,A
  238.                 OUT (GSCFG0),A
  239.                 LD HL,0X1D00
  240.                 LD (0X0300+(0X1E*2)),HL
  241.                 LD DE,UKLAD2
  242.                 LD BC,GSDDRVE-GSDDRV
  243.                 EX DE,HL
  244.                 LDIR
  245.                 IN A,(GSCFG0)
  246.                 SET B_RAMRO,A
  247.                 OUT (GSCFG0),A
  248.                 JP COMINT_
  249.  
  250. ;ПРОВЕРКА ЧТО ЭТО NeoGS И ВКЛЮЧЕНИЕ ЧАСТОТЫ 24MHz
  251. AVTODET         IN A,(GSCFG0)
  252.                 AND 0XCF
  253.                 OUT (GSCFG0),A          ;ОБРАТНАЯ ЗАПИСЬ В ПОРТ СО СБРОШЕННЫМИ
  254.                                         ;БИТАМИ 5-4 ВКЛЮЧАЕТ ЧАСТОТУ ПРОЦЕССОРА
  255.                                         ;РАВНЫМ 24 МГц
  256.                 LD D,A
  257.                 IN A,(GSCFG0)
  258.                 CP D
  259.                 LD A,0
  260.                 RET Z
  261.                 DEC A
  262.                 RET
  263.  
  264. UKLAD2  ;ОТКУДА КОД ПЕРЕКИДЫВАТЬ
  265.  
  266.                 DEPHASE
  267.  
  268.                 PHASE 0X1D00
  269.  
  270. ;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С
  271. GSDDRV          DI
  272.                 IN A,(ZXDATRD)          ;ПРИЕМ КОМАНДЫ ДРАЙВЕРА
  273.                 OUT (CLRCBIT),A         ;СБРОС COMANDBIT
  274.                 LD HL,COMINT_
  275.                 PUSH HL
  276.                 ADD A,A
  277.                 LD E,A
  278.                 LD D,0
  279.                 LD HL,TABLSDG
  280.                 ADD HL,DE
  281.                 LD E,(HL)
  282.                 INC HL
  283.                 LD D,(HL)
  284.                 EX DE,HL
  285.                 CALL WDY
  286.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 31-24 ПАРАМЕТРА
  287.                 LD B,A
  288.                 CALL WDY
  289.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 23-16 ПАРАМЕТРА
  290.                 LD C,A
  291.                 CALL WDY
  292.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 15-8 ПАРАМЕТРА
  293.                 LD D,A
  294.                 CALL WDY
  295.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 7-0 ПАРАМЕТРА
  296.                 LD E,A
  297.                 CALL WDY
  298.                 IN A,(ZXDATRD)          ;ПРИЕМ КОЛ-ВО СЕКТОРОВ
  299.                 JP (HL)
  300.  
  301. TABLSDG         DW SDINITG              ;0 параметров не требует, на выходе A
  302.                                         ;смотри выше первые 2 значения
  303.                 DW SDOFFG               ;1 просто снятие выбора SD карты
  304.                 DW RDSING               ;2 ЧИТАТЬ 1 СЕКТОР
  305.                 DW RDMULG               ;3 ЧИТАТЬ "A" СЕКТОРОВ
  306.  
  307. ZAW003G         CALL CSHIGHG
  308.                 LD A,0XEE
  309.                 JP OUTSTAT
  310.  
  311. SDINITG         CALL CSHIGHG
  312.                 LD BC,SD_SEND
  313.                 LD DE,0X20FF
  314.                 OUT (C),E
  315.                 DEC D
  316.                 JR NZ,$-3
  317.                 LD BC,SD_RSTR
  318.                 XOR A
  319.                 EX AF,AF'
  320. ZAW001G         LD HL,CMD00G
  321.                 CALL OUTCOMG
  322.                 CALL INOOUTG
  323.                 EX AF,AF'
  324.                 DEC A
  325.                 JR Z,ZAW003G
  326.                 EX AF,AF'
  327.                 DEC A
  328.                 JR NZ,ZAW001G
  329.                 LD HL,CMD08G
  330.                 CALL OUTCOMG
  331.                 CALL INOOUTG
  332.                 IN H,(C)
  333.                 NOP
  334.                 IN H,(C)
  335.                 NOP
  336.                 IN H,(C)
  337.                 NOP
  338.                 IN H,(C)
  339.                 LD HL,0
  340.                 BIT 2,A
  341.                 JR NZ,ZAW006G
  342.                 LD H,0X40
  343. ZAW006G         LD A,CMD_55
  344.                 CALL OUT_COG
  345.                 CALL INOOUTG
  346.                 LD BC,SD_SEND
  347.                 LD A,ACMD_41
  348.                 OUT (C),A
  349.                 NOP
  350.                 OUT (C),H
  351.                 NOP
  352.                 OUT (C),L
  353.                 NOP
  354.                 OUT (C),L
  355.                 NOP
  356.                 OUT (C),L
  357.                 LD A,0XFF
  358.                 OUT (C),A
  359.                 CALL INOOUTG
  360.                 AND A
  361.                 JR NZ,ZAW006G
  362. ZAW004G         LD A,CMD_59
  363.                 CALL OUT_COG
  364.                 CALL INOOUTG
  365.                 AND A
  366.                 JR NZ,ZAW004G
  367. ZAW005G         LD HL,CMD16G
  368.                 CALL OUTCOMG
  369.                 CALL INOOUTG
  370.                 AND A
  371.                 JR NZ,ZAW005G
  372.  
  373. SDOFFG          JP OK_WORK
  374.  
  375. CSHIGHG         PUSH AF
  376.                 LD A,M_SDNCS+M_SNCLR    ;0X81
  377.                 OUT (SCTRL),A
  378.                 POP AF
  379.                 RET
  380.  
  381. CSLOWG          PUSH AF
  382.                 LD A,M_SDNCS            ;1
  383.                 OUT (SCTRL),A
  384.                 POP AF
  385.                 RET
  386.  
  387. OUTCOMG         CALL CSLOWG
  388.                 PUSH BC
  389.                 LD BC,0X0600+SD_SEND
  390.                 OTIR
  391.                 POP BC
  392.                 RET
  393.  
  394. OUT_COG         PUSH BC
  395.                 CALL CSLOWG
  396.                 LD BC,SD_SEND
  397.                 OUT (C),A
  398.                 XOR A
  399.                 OUT (C),A
  400.                 NOP
  401.                 OUT (C),A
  402.                 NOP
  403.                 OUT (C),A
  404.                 NOP
  405.                 OUT (C),A
  406.                 DEC A
  407.                 OUT (C),A
  408.                 POP BC
  409.                 RET
  410.  
  411. SECM20G         PUSH HL
  412.                 PUSH DE
  413.                 PUSH BC
  414.                 PUSH AF
  415.                 PUSH BC
  416.                 LD A,CMD_58
  417.                 LD BC,SD_RSTR
  418.                 CALL OUT_COG
  419.                 CALL INOOUTG
  420.                 IN A,(C)
  421.                 NOP
  422.                 IN H,(C)
  423.                 NOP
  424.                 IN H,(C)
  425.                 NOP
  426.                 IN H,(C)
  427.                 BIT 6,A
  428.                 POP HL
  429.                 JR NZ,SECN20G
  430.                 EX DE,HL
  431.                 ADD HL,HL
  432.                 EX DE,HL
  433.                 ADC HL,HL
  434.                 LD H,L
  435.                 LD L,D
  436.                 LD D,E
  437.                 LD E,0
  438. SECN20G         POP AF
  439.                 LD BC,SD_SEND
  440.                 OUT (C),A
  441.                 NOP
  442.                 OUT (C),H
  443.                 NOP
  444.                 OUT (C),L
  445.                 NOP
  446.                 OUT (C),D
  447.                 NOP
  448.                 OUT (C),E
  449.                 LD A,0XFF
  450.                 OUT (C),A
  451.                 POP BC
  452.                 POP DE
  453.                 POP HL
  454.                 RET
  455.  
  456. INOOUTG         PUSH DE
  457.                 LD DE,0X20FF
  458. INWAITG         IN A,(SD_RSTR)
  459.                 CP E
  460.                 JR NZ,INEXITG
  461.                 DEC D
  462.                 JR NZ,INWAITG
  463. INEXITG         POP DE
  464.                 RET
  465.  
  466. CMD00G          DB 0X40,0X00,0X00,0X00,0X00,0X95        ;GO_IDLE_STATE
  467. CMD08G          DB 0X48,0X00,0X00,0X01,0XAA,0X87        ;SEND_IF_COND
  468. CMD16G          DB 0X50,0X00,0X00,0X02,0X00,0XFF        ;SET_BLOCKEN
  469.  
  470. ;ПЕРЕДАЧА ОДНОГО СЕКТОРА НА СПЕК
  471. RDSECTG         IN A,(ZXSTAT)
  472.                 RRA
  473.                 JR NC,$-3
  474.                 OUT (CLRCBIT),A
  475.                 LD BC,SD_RSTR
  476.                 LD HL,0X0200
  477.                 IN A,(C)
  478.                 DEC HL
  479.                 OUT (ZXDATWR),A
  480.                 CALL WDN
  481.                 LD A,H
  482.                 OR L
  483.                 JR NZ,$-10
  484.                 IN A,(C)
  485.                 NOP
  486.                 IN A,(C)
  487.                 RET
  488.  
  489. ;ЗАГРУЗКА ОДНОГО СЕКТОРА
  490. RDSING          LD A,CMD_17
  491.                 CALL SECM20G
  492.                 CALL INOOUTG
  493.                 CP 0XFE
  494.                 JR NZ,$-5
  495.                 CALL RDSECTG
  496.                 CALL INOOUTG
  497.                 INC A  
  498.                 JR NZ,$-4
  499.                 JR OK_WORK
  500.  
  501. ;ЗАГРУЗКА "A" СЕКТОРОВ
  502. RDMULG          EX AF,AF'
  503.                 LD A,CMD_18
  504.                 CALL SECM20G
  505.                 EX AF,AF'
  506. RDMULG1         EX AF,AF'
  507.                 CALL INOOUTG
  508.                 CP 0XFE
  509.                 JR NZ,$-5
  510.                 CALL RDSECTG
  511.                 EX AF,AF'
  512.                 DEC A
  513.                 JR NZ,RDMULG1
  514.                 LD A,CMD_12
  515.                 CALL OUT_COG
  516.                 CALL INOOUTG
  517.                 INC A
  518.                 JR NZ,$-4
  519.  
  520. OK_WORK         CALL CSHIGHG
  521.                 LD A,0X77
  522.  
  523. OUTSTAT         OUT (ZXDATWR),A
  524.  
  525. ;ОЖИДАНИЕ КОГДА СПЕК ЗАБЕРЕТ БАЙТ ДАННЫХ
  526. WDN             IN A,(ZXSTAT)
  527.                 RLA
  528.                 JR C,$-3
  529.                 RET
  530.  
  531. ;ОЖИДАНИЕ КОГДА СПЕК ДАСТ БАЙТ ДАННЫХ
  532. WDY             IN A,(ZXSTAT)
  533.                 RLA
  534.                 JR NC,$-3
  535.                 RET
  536. GSDDRVE
  537.                 DEPHASE
  538.