Subversion Repositories pentevo

Rev

Rev 1056 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 10.02.2024 savelij
  3.  
  4. HDD_TIME_OUT    EQU 0x8000
  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.         LD H,A
  95.         LD L,0xFF
  96. .HDDINIT_5
  97. ;               PUSH DE
  98. ;               LD IX,_IDENTIFY_DEVICE << 8 + 1
  99. ;               PUSH HL
  100. ;               LD BC,0xF000
  101. ;               LD DE,0
  102. ;               CALL .READ_ID_TEST
  103. ;               POP HL
  104. ;               CP 7
  105. ;               JR NZ,.HDDINIT_3
  106. ;               POP HL
  107. ;               LD L,1
  108. ;               JR .HDDINIT_4
  109.  
  110. ;.HDDINIT_3     AND A
  111. ;               JR Z,.HDDINIT_2
  112. ;               LD A,0XFF
  113. ;.HDDINIT_2     CALL Z,.INIT_91
  114. ;               POP HL
  115. ;               LD L,A
  116. .HDDINIT_4      XOR A
  117.                 POP BC
  118.                 POP DE
  119.                 POP IX
  120.                 RET
  121.  
  122. .INIT_91        PUSH HL
  123.                 PUSH BC
  124.                 LD A,IYL
  125.                 AND A
  126.                 JR NZ,.INIT91_1
  127.         EVOPORT WIN_P6,ZXSTD_CPU2
  128. .INIT91_1       LD L,49 * 2 + 1
  129.                 LD A,(HL)
  130.                 AND 2
  131.                 JR Z,.INI_912
  132.                 LD BC,0XFF00+PN_1F2
  133.                 LD L,0x0C
  134.                 LD A,(HL)
  135.                 OUT (C),A
  136.                 LD L,6
  137.                 LD C,PN_1F6
  138.                 LD A,(HL)
  139.                 DEC A
  140.                 OUT (C),A
  141.                 LD C,PN_1F7
  142.                 LD A,_INIT_DEVICE_PARAMETERS
  143.                 OUT (C),A
  144.                 LD DE,0x4000
  145. .INI_911        DEC DE
  146.                 LD A,D
  147.                 OR E
  148.                 JR Z,.INI_912
  149.                 IN A,(C)
  150.                 AND 0x80
  151.                 JR NZ,.INI_911
  152.                 LD L,A
  153.                 LD A,IYL
  154.                 AND A
  155.                 LD A,L
  156.                 JR NZ,.INIT91_2
  157.                 LD BC,WIN_P6
  158.                 XOR A
  159.                 OUT (C),A
  160. .INIT91_2       POP BC
  161.                 POP HL
  162.                 RET
  163.  
  164. .INI_912        LD BC,WIN_P6
  165.                 XOR A
  166.                 OUT (C),A
  167.                 LD A,0xFF
  168.                 POP BC
  169.                 POP HL
  170.                 RET
  171.  
  172. .SEND_CMD_TEST  PUSH HL
  173.                 PUSH DE
  174.                 LD D,B
  175.                 LD E,C
  176.                 JR .SEND_CMD_1
  177.  
  178. ; установка регистров HDD
  179. ; на входе:
  180. ;               IXH = команда для HDD
  181. ;               BCDE = LBA номер сектора
  182. ;               A = количество секторов
  183. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  184. .SEND_CMD       LD IXL,A
  185.                 CALL ICOM_DEV
  186.                 DB _SET_DEVICE
  187.                 PUSH HL
  188.                 PUSH DE
  189.                 LD D,B
  190.                 LD E,C
  191. .SEND_CMD_1
  192. ;               LD BC,0XFF<<8+PN_3F6
  193. ;               LD A,%00001010
  194. ;               OUT (C),A
  195.                 LD C,PN_1F6
  196.                 LD A,D
  197.                 AND 0xF0
  198.                 OUT (C),A
  199.                 LD C,PN_1F7
  200.                 LD HL,HDD_TIME_OUT
  201. .SEND_WAIT      DEC HL
  202.                 LD A,H
  203.                 OR L
  204.                 JR Z,.SEND_ERROR1
  205.                 IN A,(C)
  206. ;               AND A
  207. ;               JR Z,.SEND_CMD_2;.SEND_ERROR7
  208.                 BIT 7,A
  209.                 JR NZ,.SEND_WAIT
  210.                 BIT 6,A
  211.                 JR Z,.SEND_WAIT
  212. .SEND_CMD_2     LD C,PN_1F6
  213.                 OUT (C),D
  214.                 LD C,PN_1F5
  215.                 OUT (C),E
  216.                 POP DE
  217.                 LD C,PN_1F4
  218.                 OUT (C),D
  219.                 LD C,PN_1F3
  220.                 OUT (C),E
  221.                 LD C,PN_1F2
  222.                 LD A,IXL
  223.                 OUT (C),A
  224.                 LD C,PN_1F1
  225.                 XOR A
  226.                 OUT (C),A
  227.                 LD C,PN_1F7
  228.                 LD A,IXH
  229.                 OUT (C),A
  230.                 POP HL
  231. .DRIVER_CHECK_DEVICE
  232.                 XOR A
  233. .HDDOFF         RET
  234.  
  235. .SEND_ERROR7    LD A,7                          ; обнаружен CD/DVD
  236.                 JR .SEND_ERROR
  237.  
  238. .SEND_ERROR1    LD A,1                          ; ошибка HDD TIMEOUT
  239. .SEND_ERROR     POP HL
  240.                 POP HL
  241.                 RET
  242.  
  243. .READ_ID_TEST   PUSH IX
  244.                 PUSH DE
  245.                 PUSH BC
  246. ;               LD IXH,_IDENTIFY_DEVICE
  247.                 CALL .SEND_CMD_TEST
  248.                 JR .READID_WAIT_
  249.  
  250. ; чтение сектора идентификации винта
  251. ; на входе:
  252. ;               HL = адрес буфера для чтения
  253. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  254. .DRIVER_READ_ID
  255.                 PUSH IX
  256.                 PUSH DE
  257.                 PUSH BC
  258.                 LD DE,0
  259.                 LD C,E
  260.                 EX AF,AF'
  261.                 BIT 0,A
  262.                 LD B,0xE0
  263.                 JR Z,.DRVRDID1
  264.                 LD B,0xF0
  265. .DRVRDID1       LD IXH,_IDENTIFY_DEVICE
  266.                 CALL .SEND_CMD_TEST
  267. .READID_WAIT_   AND A
  268.                 JR NZ,.READID_ERROR
  269.                 LD DE,HDD_TIME_OUT
  270. .READID_WAIT    DEC DE
  271.                 LD A,D
  272.                 OR E
  273.                 JR Z,.READID_ERROR1
  274. ;               LD BC,0XFF << 8 + PN_1F4
  275. ;               IN E,(C)
  276. ;               LD C,PN_1F5
  277. ;               IN D,(C)
  278. ;               PUSH HL
  279. ;               LD HL,0XEB14
  280. ;               AND A
  281. ;               SBC HL,DE
  282. ;               POP HL
  283. ;               JR Z,.SEND_ERROR7
  284.                 LD BC,0XFF << 8 + PN_1F7
  285.                 IN A,(C)
  286.                 BIT 7,A
  287.                 JR NZ,.READID_WAIT
  288.                 BIT 1,A
  289.                 JR NZ,.READID_ERROR6
  290.                 BIT 3,A
  291.                 JR Z,.READID_WAIT
  292.                 CALL .READSEC
  293.                 XOR A
  294.                 JR .READID_ERROR
  295.  
  296. .READID_ERROR6  LD A,6                          ; ошибка выполнения команды
  297.                 JR .READID_ERROR
  298.  
  299. .READID_ERROR1  LD A,1                          ; ошибка таймаут
  300. .READID_ERROR
  301.                 POP BC
  302.                 POP DE
  303.                 POP IX
  304.                 RET
  305.  
  306. ; чтение секторов HDD
  307. ; на входе:
  308. ;               HL = адрес чтения
  309. ;               BCDE = номер сектора
  310. ;               A = количество секторов
  311. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  312. .DRIVER_READ_SECTORS
  313.                 PUSH IX
  314.                 PUSH DE
  315.                 PUSH BC
  316.                 LD IXL,A
  317.                 LD IXH,_READ_SECTORS
  318.                 CALL .SEND_CMD
  319.                 AND A
  320.                 JR NZ,.READID_ERROR
  321. .READ_WAIT1     LD DE,HDD_TIME_OUT
  322. .READ_WAIT      DEC DE
  323.                 LD A,D
  324.                 OR E
  325.                 JR Z,.READID_ERROR1
  326.                 LD BC,0xFF << 8 + PN_1F7
  327.                 IN A,(C)
  328.                 BIT 7,A
  329.                 JR NZ,.READ_WAIT
  330.                 BIT 1,A
  331.                 JR NZ,.READID_ERROR6
  332.                 BIT 3,A
  333.                 JR Z,.READ_WAIT
  334.                 CALL .READSEC
  335.                 DEC IXL
  336.                 JR NZ,.READ_WAIT1
  337.                 XOR A
  338.                 JR .READID_ERROR
  339.  
  340. ; запись секторов HDD
  341. ; на входе:
  342. ;               HL = адрес записи
  343. ;               BCDE = номер сектора
  344. ;               A = количество секторов
  345. ;               A' = номер устройства (бит 0 = 0/1 - master/slave)
  346. .DRIVER_WRITE_SECTORS
  347.                 PUSH IX
  348.                 PUSH DE
  349.                 PUSH BC
  350.                 LD IXL,A
  351.                 LD IXH,_WRITE_SECTORS
  352.                 CALL .SEND_CMD
  353.                 AND A
  354.                 JR NZ,.READID_ERROR
  355. .WRITE_WAIT1    LD DE,HDD_TIME_OUT
  356. .WRITE_WAIT     DEC DE
  357.                 LD A,D
  358.                 OR E
  359.                 JR Z,.READID_ERROR1
  360.                 LD BC,0xFF << 8 + PN_1F7
  361.                 IN A,(C)
  362.                 BIT 7,A
  363.                 JR NZ,.WRITE_WAIT
  364.                 BIT 1,A
  365.                 JR NZ,.READID_ERROR6
  366.                 BIT 3,A
  367.                 JR Z,.WRITE_WAIT
  368.                 CALL .WRITSEC
  369.                 DEC IXL
  370.                 JR NZ,.WRITE_WAIT1
  371.                 XOR A
  372.                 JR .READID_ERROR
  373.  
  374. ; read sector (512 bytes)
  375. ;       switch (HDDTYPE)
  376. ;       case _NEMO
  377. .READSEC        LD A,IYL
  378.                 BIT 1,A
  379.                 JR NZ,.RD_MEM
  380.                 AND A
  381.                 JR NZ,.RD_MEM2
  382. ; внешний вызов. чтение сектора в память вызвавшего
  383. .RD_MEM
  384.         READ_7FFD
  385.                 AND 0x10
  386.                 LD BC,(B0_CPU2)
  387.                 JR Z,.RD_MEM1
  388.                 LD BC,(B1_CPU2)
  389. .RD_MEM1        LD A,0x37
  390.                 OR B
  391.                 LD B,A
  392.                 LD A,C
  393.                 LD C,LOW (WIN_A0)
  394.                 OUT (C),A
  395. ; внутренний вызов. чтение сектора во внутреннний буфер
  396. .RD_MEM2        LD BC,PN_1F0
  397.         IF ENABLE_INIR
  398.                 INIR
  399.                 INIR
  400.         ELSE
  401.                 LD A,0x40
  402.                 LD C,PN_1F0
  403. .READSC1
  404.         REPT 4
  405.                 IN E,(C)
  406.                 INC C
  407.                 IN D,(C)
  408.                 DEC C
  409.                 LD (HL),E
  410.                 INC HL
  411.                 LD (HL),D
  412.                 INC HL
  413.         ENDM
  414.                 DEC A
  415.                 JR NZ,.READSC1
  416.         ENDIF
  417.                 LD BC,WIN_P6
  418.                 XOR A
  419.                 OUT (C),A
  420.                 RET
  421.  
  422. ; save sector (512 bytes)
  423. ;       switch (HDDTYPE)
  424. ;       case _NEMO
  425. .WRITSEC        LD A,IYL
  426.                 BIT 1,A
  427.                 JR NZ,.WR_MEM
  428.                 AND A
  429.                 JR NZ,.WR_MEM2
  430. ; внешний вызов. запись сектора из памяти вызвавшего
  431. .WR_MEM
  432.         READ_7FFD
  433.                 AND 0x10
  434.                 LD BC,(B0_CPU2)
  435.                 JR Z,.WR_MEM1
  436.                 LD BC,(B1_CPU2)
  437. .WR_MEM1        LD A,0x37
  438.                 OR B
  439.                 LD B,A
  440.                 LD A,C
  441.                 LD C,LOW (WIN_A0)
  442.                 OUT (C),A
  443. ; внутренний вызов. запись сектора из внутреннего буфера
  444. .WR_MEM2        EXX
  445.                 LD HL,0
  446.                 ADD HL,SP                       ; сохранение стека
  447.                 EXX
  448.                 LD SP,HL                        ; адрес буфера
  449.                 LD A,0x40
  450.                 LD HL,PRTN_RW
  451. .WR_SEC1
  452.         REPT 4
  453.                 POP DE
  454.                 LD C,L
  455.                 OUT (C),D
  456.                 LD C,H
  457.                 OUT (C),E
  458.         ENDM
  459.                 DEC A
  460.                 JR NZ,.WR_SEC1
  461.                 LD HL,0
  462.                 ADD HL,SP                       ; новый адрес буфера записи
  463.                 EXX
  464.                 LD SP,HL                        ; возврат адреса стека
  465.                 EXX
  466.                 LD BC,WIN_P6
  467.                 XOR A
  468.                 OUT (C),A
  469.                 RET
  470.