Subversion Repositories pentevo

Rev

Rev 789 | Rev 1056 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 11.11.2018 savelij
  3.  
  4. HDD_TIME_OUT    EQU 0X0000
  5.  
  6. ;входные параметры общие:
  7. ;HL-адрес загрузки в память
  8. ;BCDE-32-х битный номер сектора
  9. ;A-количество секторов (512 байт)
  10. ;только для многоблочной записи/чтении
  11.  
  12. ;выдаваеьые ошибки
  13. ; 0 - ok
  14. ; 1 - ошибка таймаут
  15. ; 6 - ошибка выполнения команды
  16. ; 7 - обнаружен CD/DVD
  17.  
  18. ;общая точка входа для работы с HDD NEMO
  19. COMHDDN         EX AF,AF'
  20.                 LD (NUMHDD),A
  21.                 LD A,IYL
  22.                 AND A
  23.                 LD A,(NEXTBYTERST8)
  24.                 JR Z,COMHDDN1
  25.                 EX (SP),HL
  26.                 LD A,(HL)
  27.                 INC HL
  28.                 EX (SP),HL
  29. COMHDDN1        ADD A,A
  30.                 PUSH HL
  31.                 LD HL,RET4NEMO
  32.                 EX (SP),HL
  33.                 PUSH HL
  34.                 LD HL,TBLHDDN
  35.                 ADD A,L
  36.                 LD L,A
  37.                 ADC A,H
  38.                 SUB L
  39.                 LD H,A
  40.                 LD A,(HL)
  41.                 INC HL
  42.                 LD H,(HL)
  43.                 LD L,A
  44.                 LD A,(NUMHDD)
  45.                 EX AF,AF'
  46.                 EX (SP),HL
  47.                 RET
  48.  
  49. RET4NEMO        PUSH AF
  50.                 LD A,IYL
  51.                 AND A
  52.                 JR NZ,RET4NEMO1
  53.                 LD (RREG_L),HL
  54.                 EX (SP),HL
  55.                 LD (RREG_F),HL
  56.                 EX (SP),HL
  57. RET4NEMO1       POP AF
  58.                 RET
  59.  
  60. TBLHDDN         DW .HDDINIT
  61.                 DW .HDDOFF
  62.                 DW .DRIVER_READ_SECTORS                 ;READ MULTI
  63.                 DW .DRIVER_WRITE_SECTORS                ;WRITE MULTI
  64.                 DW .DRIVER_READ_ID
  65.  
  66. ;Входные параметры общие:
  67. ;HL-адрес загрузки в память
  68. ;BCDE-32-х битный номер сектора
  69. ;A-количество блоков (блок=512 байт)
  70. ;только для многоблочной записи/чтении
  71. ;на выходе:
  72. ;H-для MASTER 0-HDD, 1-CD-ROM, 0XFF-none
  73. ;L-для SLAVE  0-HDD, 1-CD-ROM, 0XFF-none
  74. .HDDINIT        PUSH IX
  75.                 PUSH DE
  76.                 PUSH BC
  77.                 LD IX,0XEC << 8 + 1
  78.                 PUSH HL
  79.                 LD BC,0XE000
  80.                 LD DE,0
  81.                 CALL .READ_ID_TEST
  82.                 POP HL
  83.                 CP 7
  84.                 LD D,1
  85.                 JR Z,.HDDINIT_5
  86.                 AND A
  87.                 JR Z,.HDDINIT_1
  88.                 LD A,0XFF
  89. .HDDINIT_1      CALL Z,.INIT_91
  90.                 LD D,A
  91. .HDDINIT_5      PUSH DE
  92.                 LD IX,0XEC << 8 + 1
  93.                 PUSH HL
  94.                 LD BC,0XF000
  95.                 LD DE,0
  96.                 CALL .READ_ID_TEST
  97.                 POP HL
  98.                 CP 7
  99.                 JR NZ,.HDDINIT_3
  100.                 POP HL
  101.                 LD L,1
  102.                 JR .HDDINIT_4
  103.  
  104. .HDDINIT_3      AND A
  105.                 JR Z,.HDDINIT_2
  106.                 LD A,0XFF
  107. .HDDINIT_2      CALL Z,.INIT_91
  108.                 POP HL
  109.                 LD L,A
  110. .HDDINIT_4      XOR A
  111.                 POP BC
  112.                 POP DE
  113.                 POP IX
  114.                 RET
  115.  
  116. .INIT_91        PUSH HL
  117.                 PUSH BC
  118.                 LD A,IYL
  119.                 AND A
  120.                 JR NZ,.INIT91_1
  121.                 EVOPORT WIN_P6,ZXSTD_CPU2;0XFD
  122. .INIT91_1       LD L,49*2+1
  123.                 LD A,(HL)
  124.                 AND 2
  125.                 JR Z,.INI_912
  126.                 LD BC,0XFF00+PN_1F2
  127.                 LD L,0X0C
  128.                 LD A,(HL)
  129.                 OUT (C),A
  130.                 LD L,6
  131.                 LD C,PN_1F6
  132.                 LD A,(HL)
  133.                 DEC A
  134.                 OUT (C),A
  135.                 LD C,PN_1F7
  136.                 LD A,0X91
  137.                 OUT (C),A
  138.                 LD DE,0X4000
  139. .INI_911        DEC DE
  140.                 LD A,D
  141.                 OR E
  142.                 JR Z,.INI_912
  143.                 IN A,(C)
  144.                 AND 0X80
  145.                 JR NZ,.INI_911
  146.                 LD L,A
  147.                 LD A,IYL
  148.                 AND A
  149.                 LD A,L
  150.                 JR NZ,.INIT91_2
  151.                 LD BC,WIN_P6
  152.                 XOR A
  153.                 OUT (C),A
  154. .INIT91_2       POP BC
  155.                 POP HL
  156.                 RET
  157.  
  158. .INI_912        LD BC,WIN_P6
  159.                 XOR A
  160.                 OUT (C),A
  161.                 LD A,0XFF
  162.                 POP BC
  163.                 POP HL
  164.                 RET
  165.  
  166. .SEND_CMD_TEST  PUSH HL
  167.                 PUSH DE
  168.                 LD D,B
  169.                 LD E,C
  170.                 JR .SEND_CMD_1
  171.  
  172. ;[установка регистров HDD]
  173. ;на входе:
  174. ;               IXH = команда для HDD
  175. ;               BCDE = LBA номер сектора
  176. ;               A = количество секторов
  177. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  178. .SEND_CMD       LD IXL,A
  179.                 CALL ICOM_DEV
  180.                 DB _SET_DEVICE
  181.                 PUSH HL
  182.                 PUSH DE
  183.                 LD D,B
  184.                 LD E,C
  185. .SEND_CMD_1     LD BC,0XFF<<8+PN_3F6
  186.                 LD A,%00001010
  187.                 OUT (C),A
  188.                 LD C,PN_1F6
  189.                 LD A,D
  190.                 AND 0XF0
  191.                 OUT (C),A
  192.                 LD C,PN_1F7
  193.                 LD HL,HDD_TIME_OUT
  194. .SEND_WAIT      DEC HL
  195.                 LD A,H
  196.                 OR L
  197.                 JR Z,.SEND_ERROR1
  198.                 IN A,(C)
  199. ;               AND A
  200. ;               JR Z,.SEND_CMD_2;.SEND_ERROR7
  201.                 BIT 7,A
  202.                 JR NZ,.SEND_WAIT
  203.                 BIT 6,A
  204.                 JR Z,.SEND_WAIT
  205. .SEND_CMD_2     LD C,PN_1F6
  206.                 OUT (C),D
  207.                 LD C,PN_1F5
  208.                 OUT (C),E
  209.                 POP DE
  210.                 LD C,PN_1F4
  211.                 OUT (C),D
  212.                 LD C,PN_1F3
  213.                 OUT (C),E
  214.                 LD C,PN_1F2
  215.                 LD A,IXL
  216.                 OUT (C),A
  217.                 LD C,PN_1F1
  218.                 XOR A
  219.                 OUT (C),A
  220.                 LD C,PN_1F7
  221.                 LD A,IXH
  222.                 OUT (C),A
  223.                 POP HL
  224. .DRIVER_CHECK_DEVICE
  225.                 XOR A
  226. .HDDOFF         RET
  227.  
  228. .SEND_ERROR7    LD A,7          ;обнаружен CD/DVD
  229.                 JR .SEND_ERROR
  230.  
  231. .SEND_ERROR1    LD A,1          ;ошибка HDD TIMEOUT
  232. .SEND_ERROR     POP HL
  233.                 POP HL
  234.                 RET
  235.  
  236. .READ_ID_TEST   PUSH IX
  237.                 PUSH DE
  238.                 PUSH BC
  239.                 LD IXH,0XEC
  240.                 CALL .SEND_CMD_TEST
  241.                 JR .READID_WAIT_
  242.  
  243. ;[чтение сектора идентификации винта]
  244. ;на входе:
  245. ;               HL = адрес буфера для чтения
  246. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  247. .DRIVER_READ_ID
  248.                 PUSH IX
  249.                 PUSH DE
  250.                 PUSH BC
  251.                 LD DE,0
  252.                 LD C,E
  253.                 EX AF,AF'
  254.                 BIT 0,A
  255.                 LD B,0XE0
  256.                 JR Z,.DRVRDID1
  257.                 LD B,0XF0
  258. .DRVRDID1       LD IXH,0XEC
  259.                 CALL .SEND_CMD_TEST
  260. .READID_WAIT_   AND A
  261.                 JR NZ,.READID_ERROR
  262.                 LD DE,HDD_TIME_OUT
  263. .READID_WAIT    DEC DE
  264.                 LD A,D
  265.                 OR E
  266.                 JR Z,.READID_ERROR1
  267. ;               LD BC,0XFF << 8 + PN_1F4
  268. ;               IN E,(C)
  269. ;               LD C,PN_1F5
  270. ;               IN D,(C)
  271. ;               PUSH HL
  272. ;               LD HL,0XEB14
  273. ;               AND A
  274. ;               SBC HL,DE
  275. ;               POP HL
  276. ;               JR Z,.SEND_ERROR7
  277.                 LD BC,0XFF << 8 + PN_1F7
  278.                 IN A,(C)
  279.                 BIT 7,A
  280.                 JR NZ,.READID_WAIT
  281.                 BIT 1,A
  282.                 JR NZ,.READID_ERROR6
  283.                 BIT 3,A
  284.                 JR Z,.READID_WAIT
  285.                 CALL .READSEC
  286.                 XOR A
  287.                 JR .READID_ERROR
  288.  
  289. .READID_ERROR6  LD A,6          ;ошибка выполнения команды
  290.                 JR .READID_ERROR
  291.  
  292. .READID_ERROR1  LD A,1          ;ошибка таймаут
  293. .READID_ERROR
  294.                 POP BC
  295.                 POP DE
  296.                 POP IX
  297.                 RET
  298.  
  299. ;[чтение секторов HDD]
  300. ;на входе:
  301. ;               HL = адрес чтения
  302. ;               BCDE = номер сектора
  303. ;               A = количество секторов
  304. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  305. .DRIVER_READ_SECTORS
  306.                 PUSH IX
  307.                 PUSH DE
  308.                 PUSH BC
  309.                 LD IXL,A
  310.                 LD IXH,0X20
  311.                 CALL .SEND_CMD
  312.                 AND A
  313.                 JR NZ,.READID_ERROR
  314. .READ_WAIT1     LD DE,HDD_TIME_OUT
  315. .READ_WAIT      DEC DE
  316.                 LD A,D
  317.                 OR E
  318.                 JR Z,.READID_ERROR1
  319.                 LD BC,0XFF << 8 + PN_1F7
  320.                 IN A,(C)
  321.                 BIT 7,A
  322.                 JR NZ,.READ_WAIT
  323.                 BIT 1,A
  324.                 JR NZ,.READID_ERROR6
  325.                 BIT 3,A
  326.                 JR Z,.READ_WAIT
  327.                 CALL .READSEC
  328.                 DEC IXL
  329.                 JR NZ,.READ_WAIT1
  330.                 XOR A
  331.                 JR .READID_ERROR
  332.  
  333. ;[запись секторов HDD]
  334. ;на входе:
  335. ;               HL = адрес записи
  336. ;               BCDE = номер сектора
  337. ;               A = количество секторов
  338. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  339. .DRIVER_WRITE_SECTORS
  340.                 PUSH IX
  341.                 PUSH DE
  342.                 PUSH BC
  343.                 LD IXL,A
  344.                 LD IXH,0X30
  345.                 CALL .SEND_CMD
  346.                 AND A
  347.                 JR NZ,.READID_ERROR
  348. .WRITE_WAIT1    LD DE,HDD_TIME_OUT
  349. .WRITE_WAIT     DEC DE
  350.                 LD A,D
  351.                 OR E
  352.                 JR Z,.READID_ERROR1
  353.                 LD BC,0XFF << 8 + PN_1F7
  354.                 IN A,(C)
  355.                 BIT 7,A
  356.                 JR NZ,.WRITE_WAIT
  357.                 BIT 1,A
  358.                 JR NZ,.READID_ERROR6
  359.                 BIT 3,A
  360.                 JR Z,.WRITE_WAIT
  361.                 CALL .WRITSEC
  362.                 DEC IXL
  363.                 JR NZ,.WRITE_WAIT1
  364.                 XOR A
  365.                 JR .READID_ERROR
  366.  
  367. ;read sector (512 bytes)
  368. ;       switch (HDDTYPE)
  369. ;       case _NEMO
  370. .READSEC        LD A,IYL
  371.                 BIT 1,A
  372.                 JR NZ,.RD2MEM
  373.                 AND A
  374.                 JR NZ,.RD2MEM2                  ;ВНУТРЕННИЙ ВЫЗОВ. ЧТЕНИЕ СЕКТОРА ВО ВНУТРЕНННИЙ БУФЕР
  375. ;ВНЕШНИЙ ВЫЗОВ. ЧТЕНИЕ СЕКТОРА В ПАМЯТЬ ВЫЗВАВШЕГО
  376. .RD2MEM         READ_7FFD
  377.                 AND 0X10
  378.                 LD BC,(B0_CPU2)
  379.                 JR Z,.RD2MEM1
  380.                 LD BC,(B1_CPU2)
  381. .RD2MEM1        LD A,0X37
  382.                 OR B
  383.                 LD B,A
  384.                 LD A,C
  385.                 LD C,LOW (WIN_A0)
  386.                 OUT (C),A
  387. .RD2MEM2        LD BC,PN_1F0
  388.                 INIR
  389.                 INIR
  390.                 LD BC,WIN_P6
  391.                 XOR A
  392.                 OUT (C),A
  393.                 RET
  394.  
  395. ;save sector (512 bytes)
  396. ;       switch (HDDTYPE)
  397. ;       case _NEMO
  398. .WRITSEC        EXX
  399.                 PUSH HL
  400.                 LD HL,0
  401.                 ADD HL,SP
  402.                 EXX
  403.                 LD SP,HL
  404.                 LD A,0X40
  405.                 LD HL,PRTN_RW
  406. .WR_SEC1        REPT 4
  407.                 POP DE
  408.                 LD C,L
  409.                 OUT (C),D
  410.                 LD C,H
  411.                 OUT (C),E
  412.                 ENDM
  413.                 DEC A
  414.                 JR NZ,.WR_SEC1
  415.                 LD HL,0
  416.                 ADD HL,SP
  417.                 EXX
  418.                 LD SP,HL
  419.                 POP HL
  420.                 EXX
  421.                 RET
  422.