Subversion Repositories pentevo

Rev

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

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