Subversion Repositories pentevo

Rev

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

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