Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 16.01.2023 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
  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,.RD_MEM
  377.                 AND A
  378.                 JR NZ,.RD_MEM2
  379. ; внешний вызов. чтение сектора в память вызвавшего
  380. .RD_MEM
  381.         READ_7FFD
  382.                 AND 0x10
  383.                 LD BC,(B0_CPU2)
  384.                 JR Z,.RD_MEM1
  385.                 LD BC,(B1_CPU2)
  386. .RD_MEM1        LD A,0x37
  387.                 OR B
  388.                 LD B,A
  389.                 LD A,C
  390.                 LD C,LOW (WIN_A0)
  391.                 OUT (C),A
  392. ; внутренний вызов. чтение сектора во внутреннний буфер
  393. .RD_MEM2        LD BC,PN_1F0
  394.         IF ENABLE_INIR
  395.                 INIR
  396.                 INIR
  397.         ELSE
  398.                 LD A,0x40
  399.                 LD C,PN_1F0
  400. .READSC1
  401.         REPT 4
  402.                 IN E,(C)
  403.                 INC C
  404.                 IN D,(C)
  405.                 DEC C
  406.                 LD (HL),E
  407.                 INC HL
  408.                 LD (HL),D
  409.                 INC HL
  410.         ENDM
  411.                 DEC A
  412.                 JR NZ,.READSC1
  413.         ENDIF
  414.                 LD BC,WIN_P6
  415.                 XOR A
  416.                 OUT (C),A
  417.                 RET
  418.  
  419. ; save sector (512 bytes)
  420. ;       switch (HDDTYPE)
  421. ;       case _NEMO
  422. .WRITSEC        LD A,IYL
  423.                 BIT 1,A
  424.                 JR NZ,.WR_MEM
  425.                 AND A
  426.                 JR NZ,.WR_MEM2
  427. ; внешний вызов. запись сектора из памяти вызвавшего
  428. .WR_MEM
  429.         READ_7FFD
  430.                 AND 0x10
  431.                 LD BC,(B0_CPU2)
  432.                 JR Z,.WR_MEM1
  433.                 LD BC,(B1_CPU2)
  434. .WR_MEM1        LD A,0x37
  435.                 OR B
  436.                 LD B,A
  437.                 LD A,C
  438.                 LD C,LOW (WIN_A0)
  439.                 OUT (C),A
  440. ; внутренний вызов. запись сектора из внутреннего буфера
  441. .WR_MEM2        EXX
  442.                 LD HL,0
  443.                 ADD HL,SP                       ; сохранение стека
  444.                 EXX
  445.                 LD SP,HL                        ; адрес буфера
  446.                 LD A,0x40
  447.                 LD HL,PRTN_RW
  448. .WR_SEC1
  449.         REPT 4
  450.                 POP DE
  451.                 LD C,L
  452.                 OUT (C),D
  453.                 LD C,H
  454.                 OUT (C),E
  455.         ENDM
  456.                 DEC A
  457.                 JR NZ,.WR_SEC1
  458.                 LD HL,0
  459.                 ADD HL,SP                       ; новый адрес буфера записи
  460.                 EXX
  461.                 LD SP,HL                        ; возврат адреса стека
  462.                 EXX
  463.                 LD BC,WIN_P6
  464.                 XOR A
  465.                 OUT (C),A
  466.                 RET
  467.