?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2. ;    include "ports_ngs.asm"
  3. ;    include "sdcomand.asm"
  4.         ORG 0X5B00
  5. START
  6. COMINT_         EQU 0X026E      ;АДРЕС ЦИКЛА ОБЩЕНИЯ СО СПЕКОМ
  7.  
  8. SCTRL           EQU 0X11                ; Serial ConTRoL: read-write, read:
  9.                                 ; current state of below bits, write - see GS_info
  10. ZXDATWR         EQU 0X03                ; write-only, ZX DATa WRite: a byte
  11.                                 ; written here is available for ZX in
  12.                                 ; GSDAT upon writing here, data bit is set
  13. CLRCBIT         EQU 0X05                ; read-write, upon either reading or
  14.                                 ; writing this port, the Command BIT is CLeaRed
  15. GSCFG0          EQU 0X0F                ; read-write, GS ConFiG port 0: acts as
  16.                                 ; memory cell, reads previously written
  17.                                 ; value. Bits and fields follow:
  18. B_RAMRO         EQU 1           ; =1 - ram absolute adresses 0X0000-7FFF
  19.                                 ; (zeroth big page) are write-protected
  20. ZXDATRD         EQU 0X02                ; read-only, ZX DATa ReaD: a byte
  21.                                 ; written by ZX into GSDAT appears here
  22.                                 ; upon reading this port, data bit is cleared
  23. SD_RSTR         EQU 0X14                ; SD card Read and STaRt, read-only,
  24.                                 ; reads previously received byte and
  25.                                 ; starts new byte transfer with 0XFF
  26. SD_SEND         EQU 0X13                ; SD card SEND, write-only, when
  27.                                 ; written, byte transfer starts with
  28.                                 ; written byte
  29. ZXSTAT          EQU 0X04                ; read-only, read ZX STATus: command and
  30.                                 ; data bits. positions are defined by
  31.                                 ; *_CBIT and *_DBIT above
  32. M_SDNCS         EQU 1
  33. M_SNCLR         EQU 0X80                ; M_SETNCLR
  34. ;САМ УСТАНОВЩИК ДРАЙВЕРА ДЛЯ NeoGS
  35.                 DI
  36.                 LD A,0X9C
  37.                 OUT (SCTRL),A           ;КОНФИГУРАТОР NeoGS
  38.                 CALL AVTODET
  39.                 AND A
  40.                 LD A,0X77               ;0X77-NeoGS НАЙДЕН
  41.                 JR Z,$+4
  42.                 LD A,0XCC               ;0XCC-НАЙДЕН OLDGS
  43.                 OUT (ZXDATWR),A
  44.                 OUT (CLRCBIT),A
  45.                 JP NZ,COMINT_
  46.                 DI
  47.                 IN A,(GSCFG0)
  48.                 RES B_RAMRO,A
  49.                 OUT (GSCFG0),A
  50.                 LD HL,0X1D00
  51.                 LD (0X0300+(0X1E*2)),HL
  52.                 LD DE,UKLAD2
  53.                 LD BC,GSDDRVE-GSDDRV
  54.                 EX DE,HL
  55.                 LDIR
  56.                 IN A,(GSCFG0)
  57.                 SET B_RAMRO,A
  58.                 OUT (GSCFG0),A
  59.                 JP COMINT_
  60.  
  61. ;ПРОВЕРКА ЧТО ЭТО NeoGS И ВКЛЮЧЕНИЕ ЧАСТОТЫ 24MHz
  62. AVTODET         IN A,(GSCFG0)
  63.                 AND 0XCF
  64.                 OUT (GSCFG0),A          ;ОБРАТНАЯ ЗАПИСЬ В ПОРТ СО СБРОШЕННЫМИ
  65.                                         ;БИТАМИ 5-4 ВКЛЮЧАЕТ ЧАСТОТУ ПРОЦЕССОРА
  66.                                         ;РАВНЫМ 24 МГц
  67.                 LD D,A
  68.                 IN A,(GSCFG0)
  69.                 CP D
  70.                 LD A,0
  71.                 RET Z
  72.                 DEC A
  73.                 RET
  74.  
  75. UKLAD2  ;ОТКУДА КОД ПЕРЕКИДЫВАТЬ
  76.  
  77. CMD_09          EQU 0X49        ;SEND_CSD
  78. CMD_12          EQU 0X4C        ;STOP_TRANSMISSION
  79. CMD_17          EQU 0X51        ;READ_SINGLE_BLOCK
  80. CMD_18          EQU 0X52        ;READ_MULTIPLE_BLOCK
  81. CMD_24          EQU 0X58        ;WRITE_BLOCK
  82. CMD_25          EQU 0X59        ;WRITE_MULTIPLE_BLOCK
  83. CMD_55          EQU 0X77        ;APP_CMD
  84. CMD_58          EQU 0X7A        ;READ_OCR
  85. CMD_59          EQU 0X7B        ;CRC_ON_OFF
  86. ACMD_41         EQU 0X69        ;SD_SEND_OP_COND
  87.                 DISP 0X1D00
  88.  
  89. ;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С SD КАРТОЙ
  90. GSDDRV          DI
  91.                 IN A,(ZXDATRD)          ;ПРИЕМ КОМАНДЫ ДРАЙВЕРА
  92.                 OUT (CLRCBIT),A         ;СБРОС COMANDBIT
  93.                 LD HL,COMINT_
  94.                 PUSH HL
  95.                 PUSH IY
  96.                 LD IYH,0X77
  97.                 ADD A,A
  98.                 LD E,A
  99.                 LD D,0
  100.                 LD HL,TABLSDG
  101.                 ADD HL,DE
  102.                 LD E,(HL)
  103.                 INC HL
  104.                 LD D,(HL)
  105.                 EX DE,HL
  106.                 CALL WDY
  107.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 31-24 ПАРАМЕТРА
  108.                 LD B,A
  109.                 CALL WDY
  110.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 23-16 ПАРАМЕТРА
  111.                 LD C,A
  112.                 CALL WDY
  113.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 15-8 ПАРАМЕТРА
  114.                 LD D,A
  115.                 CALL WDY
  116.                 IN A,(ZXDATRD)          ;ПРИЕМ БИТОВ 7-0 ПАРАМЕТРА
  117.                 LD E,A
  118.                 CALL WDY
  119.                 IN A,(ZXDATRD)          ;ПРИЕМ КОЛ-ВО СЕКТОРОВ
  120.                 JP (HL)
  121.  
  122. TABLSDG         DW SDINITG              ;0 ПАРАМЕТРОВ НЕ ТРЕБУЕТ, НА ВЫХОДЕ A
  123.                                         ;СМОТРИ ВЫШЕ ПЕРВЫЕ 2 ЗНАЧЕНИЯ
  124.                 DW SDCMPG               ;1 ПРОВЕРКА НАЛИЧИЯ SD КАРТЫ
  125.                 DW RDMULG               ;2 ЧИТАТЬ "A" СЕКТОРОВ
  126.                 DW WRMULG               ;3 ПИСАТЬ "A" СЕКТОРОВ
  127.  
  128. SDCMPG
  129.                 LD A,CMD_58
  130.                 LD BC,SD_RSTR
  131.                 CALL OUT_COG
  132.                 CALL INOOUTG
  133.                 IN A,(C)
  134.                 NOP
  135.                 IN H,(C)
  136.                 NOP
  137.                 IN H,(C)
  138.                 NOP
  139.                 IN H,(C)
  140.                 INC A
  141.                 JP NZ,OK_WORK
  142.                 LD IYH,0X88                     ;КАРТА НЕ ПРОШЛА ПРОВЕРКУ НА НАЛИЧИЕ
  143.                 JP OK_WORK
  144.  
  145. ZAW003G         LD IYH,0XEE                     ;КАРТА НЕОБНАРУЖЕНА
  146.                 JP OK_WORK
  147.  
  148. SDINITG         CALL CSHIGHG
  149.                 LD BC,SD_SEND
  150.                 LD DE,0X20FF
  151.                 OUT (C),E
  152.                 DEC D
  153.                 JR NZ,$-3
  154.                 LD BC,SD_RSTR
  155.                 XOR A
  156.                 EX AF,AF'
  157. ZAW001G         LD HL,CMD00G
  158.                 CALL OUTCOMG
  159.                 CALL INOOUTG
  160.                 EX AF,AF'
  161.                 DEC A
  162.                 JR Z,ZAW003G
  163.                 EX AF,AF'
  164.                 DEC A
  165.                 JR NZ,ZAW001G
  166.                 LD HL,CMD08G
  167.                 CALL OUTCOMG
  168.                 CALL INOOUTG
  169.                 IN H,(C)
  170.                 NOP
  171.                 IN H,(C)
  172.                 NOP
  173.                 IN H,(C)
  174.                 NOP
  175.                 IN H,(C)
  176.                 LD HL,0
  177.                 BIT 2,A
  178.                 JR NZ,ZAW006G
  179.                 LD H,0X40
  180. ZAW006G         LD A,CMD_55
  181.                 CALL OUT_COG
  182.                 CALL INOOUTG
  183.                 LD BC,SD_SEND
  184.                 LD A,ACMD_41
  185.                 OUT (C),A
  186.                 NOP
  187.                 OUT (C),H
  188.                 NOP
  189.                 OUT (C),L
  190.                 NOP
  191.                 OUT (C),L
  192.                 NOP
  193.                 OUT (C),L
  194.                 LD A,0XFF
  195.                 OUT (C),A
  196.                 CALL INOOUTG
  197.                 AND A
  198.                 JR NZ,ZAW006G
  199. ZAW004G         LD A,CMD_59
  200.                 CALL OUT_COG
  201.                 CALL INOOUTG
  202.                 AND A
  203.                 JR NZ,ZAW004G
  204. ZAW005G         LD HL,CMD16G
  205.                 CALL OUTCOMG
  206.                 CALL INOOUTG
  207.                 AND A
  208.                 JR NZ,ZAW005G
  209.                 JP OK_WORK
  210.  
  211. CSHIGHG         PUSH AF
  212.                 LD A,M_SDNCS+M_SNCLR    ;0X81
  213.                 OUT (SCTRL),A
  214.                 POP AF
  215.                 RET
  216.  
  217. CSLOWG          PUSH AF
  218.                 LD A,M_SDNCS            ;1
  219.                 OUT (SCTRL),A
  220.                 POP AF
  221.                 RET
  222.  
  223. OUTCOMG         CALL CSLOWG
  224.                 PUSH BC
  225.                 LD BC,0X0600+SD_SEND
  226.                 OTIR
  227.                 POP BC
  228.                 RET
  229.  
  230. OUT_COG         PUSH BC
  231.                 CALL CSLOWG
  232.                 LD BC,SD_SEND
  233.                 OUT (C),A
  234.                 XOR A
  235.                 OUT (C),A
  236.                 NOP
  237.                 OUT (C),A
  238.                 NOP
  239.                 OUT (C),A
  240.                 NOP
  241.                 OUT (C),A
  242.                 DEC A
  243.                 OUT (C),A
  244.                 POP BC
  245.                 RET
  246.  
  247. SECM20G         PUSH HL
  248.                 PUSH DE
  249.                 PUSH BC
  250.                 PUSH AF
  251.                 PUSH BC
  252.                 LD A,CMD_58
  253.                 LD BC,SD_RSTR
  254.                 CALL OUT_COG
  255.                 CALL INOOUTG
  256.                 IN A,(C)
  257.                 NOP
  258.                 IN H,(C)
  259.                 NOP
  260.                 IN H,(C)
  261.                 NOP
  262.                 IN H,(C)
  263.                 INC A
  264.                 JR NZ,SECN20G1
  265.                 LD IYH,0X99                     ;КАРТА ПОТЕРЯЛАСЬ
  266. SECN20G1        DEC A
  267.                 BIT 6,A
  268.                 POP HL
  269.                 JR NZ,SECN20G
  270.                 EX DE,HL
  271.                 ADD HL,HL
  272.                 EX DE,HL
  273.                 ADC HL,HL
  274.                 LD H,L
  275.                 LD L,D
  276.                 LD D,E
  277.                 LD E,0
  278. SECN20G         POP AF
  279.                 LD BC,SD_SEND
  280.                 OUT (C),A
  281.                 NOP
  282.                 OUT (C),H
  283.                 NOP
  284.                 OUT (C),L
  285.                 NOP
  286.                 OUT (C),D
  287.                 NOP
  288.                 OUT (C),E
  289.                 LD A,0XFF
  290.                 OUT (C),A
  291.                 POP BC
  292.                 POP DE
  293.                 POP HL
  294.                 RET
  295.  
  296. INOOUTG         PUSH DE
  297.                 LD DE,0X80FF
  298. INWAITG         IN A,(SD_RSTR)
  299.                 CP E
  300.                 JR NZ,INEXITG
  301.                 DEC D
  302.                 JR NZ,INWAITG
  303. INEXITG         POP DE
  304.                 RET
  305.  
  306. CMD00G          DB 0X40,0X00,0X00,0X00,0X00,0X95        ;GO_IDLE_STATE
  307. CMD08G          DB 0X48,0X00,0X00,0X01,0XAA,0X87        ;SEND_IF_COND
  308. CMD16G          DB 0X50,0X00,0X00,0X02,0X00,0XFF        ;SET_BLOCKEN
  309.  
  310. ;ПЕРЕДАЧА ОДНОГО СЕКТОРА В SD КАРТУ
  311. WRSECTG         LD BC,SD_SEND
  312.                 OUT (SD_SEND),A
  313.                 IN A,(ZXSTAT)
  314.                 RRA
  315.                 JR NC,$-3
  316.                 OUT (CLRCBIT),A
  317.                 LD HL,0X0200
  318. WRSECTG1        CALL WDY
  319.                 IN A,(ZXDATRD)
  320.                 DEC HL
  321.                 OUT (C),A
  322.                 LD A,H
  323.                 OR L
  324.                 JR NZ,WRSECTG1
  325.                 LD A,0XFF
  326.                 OUT (C),A
  327.                 NOP
  328.                 OUT (C),A
  329.                 RET
  330.  
  331. ;ПЕРЕДАЧА ОДНОГО СЕКТОРА НА СПЕК
  332. RDSECTG         IN A,(ZXSTAT)
  333.                 RRA
  334.                 JR NC,$-3
  335.                 OUT (CLRCBIT),A
  336.                 LD BC,SD_RSTR
  337.                 LD HL,0X0200
  338. RDSECTG1        IN A,(C)
  339.                 DEC HL
  340.                 OUT (ZXDATWR),A
  341.                 CALL WDN
  342.                 LD A,H
  343.                 OR L
  344.                 JR NZ,RDSECTG1
  345.                 IN A,(C)
  346.                 NOP
  347.                 IN A,(C)
  348.                 RET
  349.  
  350. ;ЗАПИСЬ "A" СЕКТОРОВ
  351. WRMULG          EX AF,AF'
  352.                 LD A,CMD_25
  353.                 CALL SECM20G
  354.                 LD A,IYH
  355.                 CP 0X99
  356.                 JR Z,ERR_WR_LOST
  357. WRMULG3         CALL INOOUTG
  358.                 INC A
  359.                 JR NZ,WRMULG3
  360.                 EX AF,AF'
  361. WRMULG1         EX AF,AF'
  362.                 LD A,0XFC
  363.                 CALL WRSECTG
  364. WRMULG2         CALL INOOUTG
  365.                 INC A
  366.                 JR NZ,WRMULG2
  367.                 EX AF,AF'
  368.                 DEC A
  369.                 JR NZ,WRMULG1
  370.                 LD C,SD_SEND
  371.                 LD A,0XFD
  372.                 OUT (C),A
  373.                 CALL INOOUTG
  374.                 INC A
  375.                 JR NZ,$-4
  376.                 JR OK_WORK
  377.  
  378. ERR_WR_LOST     LD BC,SD_SEND
  379.                 OUT (SD_SEND),A
  380.                 IN A,(ZXSTAT)
  381.                 RRA
  382.                 JR NC,$-3
  383.                 OUT (CLRCBIT),A
  384.                 LD HL,0X0200
  385. ERRWRLOST1      CALL WDY
  386.                 IN A,(ZXDATRD)
  387.                 DEC HL
  388.                 LD A,H
  389.                 OR L
  390.                 JR NZ,ERRWRLOST1
  391.                 JP OK_WORK
  392.  
  393. ERR_RD_LOST     IN A,(ZXSTAT)
  394.                 RRA
  395.                 JR NC,$-3
  396.                 OUT (CLRCBIT),A
  397.                 LD BC,SD_RSTR
  398.                 LD HL,0X0200
  399. ERRRDLOST1      XOR A
  400.                 OUT (ZXDATWR),A
  401.                 CALL WDN
  402.                 DEC HL
  403.                 LD A,H
  404.                 OR L
  405.                 JR NZ,ERRRDLOST1
  406.                 JP OK_WORK
  407.  
  408. ;ЗАГРУЗКА "A" СЕКТОРОВ
  409. RDMULG          EX AF,AF'
  410.                 LD A,CMD_18
  411.                 CALL SECM20G
  412.                 LD A,IYH
  413.                 CP 0X99
  414.                 JR Z,ERR_RD_LOST
  415.                 EX AF,AF'
  416. RDMULG1         EX AF,AF'
  417.                 CALL INOOUTG
  418.                 CP 0XFE
  419.                 JR NZ,$-5
  420. RDMULG5         CALL RDSECTG
  421.                 EX AF,AF'
  422.                 DEC A
  423.                 JR NZ,RDMULG1
  424.                 LD A,CMD_12
  425.                 CALL OUT_COG
  426. RDMULG3         CALL INOOUTG
  427.                 INC A
  428.                 JR NZ,RDMULG3
  429.  
  430. OK_WORK         CALL CSHIGHG
  431.                 LD A,IYH
  432.                 POP IY
  433.  
  434. OUTSTAT         OUT (ZXDATWR),A
  435.  
  436. ;ОЖИДАНИЕ КОГДА СПЕК ЗАБЕРЕТ БАЙТ ДАННЫХ
  437. WDN             IN A,(ZXSTAT)
  438.                 RLA
  439.                 JR C,$-3
  440.                 RET
  441.  
  442. ;ОЖИДАНИЕ КОГДА СПЕК ДАСТ БАЙТ ДАННЫХ
  443. WDY             IN A,(ZXSTAT)
  444.                 RLA
  445.                 JR NC,$-3
  446.                 RET
  447. GSDDRVE
  448.                 ENT
  449.  
  450. ENDPROG
  451.         SAVEBIN "ngssd.bin",START,ENDPROG-START
  452.  
  453.