Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 01.05.2013 savelij
  3.  
  4. BUF_512_        EQU DRV_VAR                     ;200 БУФЕР СЕКТОРА
  5. NUM_DEVICE      EQU DRV_VAR+0X2FF               ;1 НОМЕР УСТРОЙСТВА ДЛЯ ЗАПУСКА КОДА
  6. MAS_SLA         EQU NUM_DEVICE-1                ;1 МАСКА ДЛЯ MASTER/SLAVE
  7. LOADSCS1        EQU MAS_SLA-2                   ;2 АДРЕС ВЫЗЫВАЕМОГО ДРАЙВЕРА
  8. LENGHT          EQU LOADSCS1-2                  ;2 ДЛИНА ФАЙЛА В БАЙТАХ
  9.  
  10. ;НА ВХОДЕ: A-НОМЕР ВЫБРАННОГО УСТРОЙСТВА
  11. ;       BCDE-НОМЕР КЛАСТЕРА ЗАПУСКАЕМОГО ФАЙЛА
  12.                 DI
  13.                 LD A,(NUM_DEVICE)
  14.                 AND A
  15.                 LD HL,READ_SD                   ;4 ДРАЙВЕР SD ZC КАРТЫ         
  16.                 JR Z,SETLOADER
  17.                 DEC A
  18.                 LD HL,READNGS                   ;5 ДРАЙВЕР SD NGS КАРТЫ
  19.                 JR Z,SETLOADER
  20.                 DEC A
  21.                 LD HL,RD_HDDN                   ;6 ДРАЙВЕР HDD NEMO
  22.                 JR Z,SETLOADER
  23.                 DEC A
  24.                 LD HL,RD_HDDS                   ;7 ДРАЙВЕР HDD SMUC
  25.                 JR Z,SETLOADER
  26.                 DEC A
  27.                 LD HL,RD_HDDD                   ;8 ДРАЙВЕР HDD DIVIDE
  28.                 JR Z,SETLOADER
  29.                 LD HL,RD_HDDP
  30. SETLOADER       LD (LOADSCS1),HL                ;УСТАНОВИЛИ АДРЕС ЧИТАЛКИ СЕКТОРОВ
  31.                 LD A,(MAS_SLA)
  32.                 AND A
  33.                 LD A,0XE0
  34.                 JR Z,SETMASL
  35.                 LD A,0XF0
  36. SETMASL         LD (MAS_SLA),A
  37.                 LD HL,(FILE_SRC+0X14)
  38.                 LD (AFILCLS+2),HL
  39.                 LD HL,(FILE_SRC+0X1A)
  40.                 LD (AFILCLS),HL
  41.                 LD A,(FILE_SRC+8)
  42.                 CP "S"
  43.                 JP Z,RUNSPG2                    ;ПЕРЕХОД НА ЗАПУСК SPG ФАЙЛА
  44.                 CALL REALSEC                    ;ПРЕОБРАЗОВАЛИ В НОМЕР СЕКТОРА
  45.                 CALL LOADLST                    ;ЗАГРУЗИЛИ В БУФЕР
  46.                 EXX
  47.                 LD HL,(BUF_512_+9)
  48.                 LD (0X5D45),HL                  ;АДРЕС СТАРТА КОДА
  49.                 LD HL,(BUF_512_+0X0B)
  50.                 LD (LENGHT),HL                  ;УСТАНОВКА ДЛИНЫ ФАЙЛА В БАЙТАХ
  51.                 LD DE,0X11
  52.                 ADD HL,DE                       ;ПРОПУСК HOBETA ЗАГОЛОВКА
  53.                 LD A,L
  54.                 AND A
  55.                 JR Z,READ01                     ;ЕСЛИ МЛАДШИЙ БАЙТ НЕ 0
  56.                 INC H                           ;СТАРШИЙ +1
  57. READ01          LD A,H
  58.                 SRL A                           ;ДЕЛИМ НА 2 ИБО НА ФАТЕ СЕКТОР 512 БАЙТ
  59.                 ADC A,0                         ;УЧИТЫВАЕМ ЧЕТ/НЕЧЕТ
  60.                 DEC A                           ;ПЕРВЫЙ СЕКТОР ЗАГРУЖЕН, ГРУЗИТЬ НА 1 МЕНЬШЕ
  61.                 EXX
  62.                 JP Z,LDIRBUF                    ;ЕСЛИ СЕКТОР 1 ПЕРЕНОС И ЗАПУСК
  63.                 LD IXL,A                        ;ЗАПОМНИЛИ КОЛИЧЕСТВО СЕКТОРОВ-1
  64.                 EXX
  65.                 CALL LD_ONES                    ;ПЕРЕНОС ОСТАТКОВ ПЕРВОГО СЕКТОРА
  66.                 PUSH DE                         ;АДРЕС КУДА ДАЛЕЕ ГРУЗИТЬ
  67.                 EXX
  68.                 LD HL,1                         ;ОДИН СЕКТОР УЖЕ ЗАГРУЖЕН
  69.                 ADD HL,DE                       ;ДАЛЕЕ ГРУЗИТЬ СО СЛЕДУЮЩЕГО СЕКТОРА
  70.                 EX DE,HL
  71.                 JR NC,READ04
  72.                 INC BC                          ;BCDE=BCDE+1
  73. READ04          POP HL                          ;В HL АДРЕС ДЛЯ ПРОДОЛЖЕНИЯ ЗАГРУЗКИ
  74.                 LD IY,(BYTSSEC)                 ;LY=КОЛ-ВО СЕКТОРОВ В КЛАСТЕРЕ
  75.                 LD A,IXL
  76.                 CP IYL                          ;СЕКТОРОВ ОСТАЛОСЬ МЕНЬШЕ ЧЕМ В КЛАСТЕРЕ
  77.                 JR C,READ02                     ;ПЕРЕХОД НА ДОЗАГРУЗКУ ОСТАТКА СЕКТОРОВ
  78.                 INC IXL
  79.                 LD A,IYL
  80.                 CP 2
  81.                 JR C,READ07
  82.                 DEC A
  83.                 JR READ05
  84.  
  85. READ07          PUSH HL
  86.                 CALL RDFATZP                    ;ПОЛУЧИТЬ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  87.                 CALL LST_CLS                    ;ПРОВЕРКА НА ОКОНЧАНИЕ FAT ЦУПОЧКИ
  88.                 POP HL
  89.                 JR C,RUNLOAD                    ;ЕСЛИ КЛАСТЕРА ЗАКОНЧИЛИСЬ, ТО ЗАПУСКА ЗАГРУЖЕННОГО
  90.                 PUSH HL
  91.                 CALL REALSEC                    ;ПРЕОБРАЗОВАНИЕ НОМЕРА КЛАСТЕРА В НОМЕР СЕКТОРА
  92.                 POP HL
  93.                 LD A,IXL                        ;СКОЛЬКО СЕКТОРОВ ОСТАЛОСЬ ЗАГРУЗИТЬ
  94.                 CP IYL                          ;СРАВНИВАЕМ С РАЗМЕРОМ КЛАСТЕРА
  95.                 JR C,READ02                     ;ЕСЛИ ОСТАЛОСЬ ЗАГРУЗИТЬ СЕКТОРОВ МЕНЬШЕ ЧЕМ В КЛАСТЕРЕ, ТО ДОЗАГРУЖАЕМ ОСТАТОК
  96.                 LD A,IYL                        ;СКОЛЬКО СЕКТОРОВ ЗАГРУЖАТЬ
  97. READ05          CALL LOADSCS                    ;ЗАГРУЗКА СЕКТОРОВ
  98.                 LD A,IXL                        ;СКОЛЬКО СЕКТОРОВ ВСЕГО ЗАГРУЖАТЬ
  99.                 SUB IYL                         ;МИНУС СКОЛЬКО СЕКТОРОВ ТОЛЬКО ЧТО ЗАГРУЗИЛИ
  100.                 JR Z,RUNLOAD                    ;СЕКТОРА КОНЧИЛИСЬ, ПЕРЕХОДИМ НА ЗАПУСК
  101.                 LD IXL,A                        ;СКОЛЬКО СЕКТОРОВ ОСТАЛОСЬ ЗАГРУЗИТЬ
  102.                 JR READ07                       ;ПРОДОЛЖАЕМ ЗАГРУЗКУ
  103.  
  104. ;ЗАГРУЗКА КОЛИЧЕСТВА СЕКТОРОВ, ЕСЛИ ОСТАЛОСЬ МЕНЕЕ РАЗМЕРА КЛАСТЕРА
  105. READ02          AND A
  106.                 JR Z,READ03
  107.                 CALL LOADSCS
  108. READ03          PUSH HL
  109.                 LD A,IXL
  110.                 DEC A
  111.                 LD L,A
  112.                 LD H,0
  113.                 ADD HL,DE
  114.                 EX DE,HL
  115.                 JR NC,READ06
  116.                 INC BC
  117. READ06          CALL LOADLST
  118.                 LD BC,(LENGHT)
  119.                 EX DE,HL
  120.                 LD HL,0X11
  121.                 ADD HL,BC
  122.                 LD B,H
  123.                 LD C,L
  124.                 EX DE,HL
  125.                 POP DE
  126.                 LD A,B
  127.                 AND 1
  128.                 LD B,A
  129.                 OR C
  130.                 JR Z,RUNLOAD
  131.                 LDIR
  132. ;ЗАПУСК ЗАГРУЖЕННОГО
  133. RUNLOAD         LD HL,0X2758
  134.                 EXX
  135.                 LD IY,0X5C3A
  136.                 EI
  137.                 JP 0X1B7D                       ;ЗАПУСК ПЕРЕНЕСЕННОЙ БЕЙСИК ПРОГИ
  138.  
  139. LDIRBUF         LD HL,0X200-0X11
  140.                 LD DE,(BUF_512_+0X0B)
  141.                 AND A
  142.                 SBC HL,DE
  143.                 JR NC,LDIRBUF1
  144.                 CALL LD_ONES
  145.                 JP RUNLOAD
  146.  
  147. LDIRBUF1        LD HL,BUF_512_+0X11
  148.                 LD DE,(BUF_512_+9)
  149.                 LD BC,(BUF_512_+0X0B)
  150.                 LDIR
  151.                 JP RUNLOAD
  152.  
  153. ;ПЕРЕНОС КУСКА ИЗ УЖЕ ЗАГРУЖЕННОГО СЕКТОРА, ЕСЛИ ФАЙЛ=501 БАЙТ И МЕНЕЕ
  154. LD_ONES         LD HL,BUF_512_+0X11
  155.                 LD DE,(BUF_512_+9)
  156.                 LD BC,0X200-0X11
  157.                 LDIR
  158.                 RET
  159.  
  160. ;ЗАГРУЗИТЬ СЕКТОРА С ВЫБРАННОГО УСТРОЙСТВА
  161. LOADSCS         PUSH HL
  162.                 LD HL,(LOADSCS1)
  163.                 EX (SP),HL
  164.                 RET
  165.  
  166. ;LX-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  167. ;HX-РАЗМЕР КЛАСТЕРА
  168. ;LY-TEMP VAR
  169. ;HY-СМЕЩЕНИЕ В КЛАСТЕРЕ
  170.  
  171. ;IXL-РАЗМЕР КЛАСТЕРА
  172. ;IXH-TEMP VAR        
  173. ;IYL-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  174. ;IYH-СМЕЩЕНИЕ В КЛАСТЕРЕ
  175. LD_FILE         PUSH BC                         ;СТАРШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
  176.                 PUSH DE                         ;МЛАДШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
  177.                 PUSH HL                         ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  178.                 CALL REALSEC                    ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
  179.                 LD IX,(BYTSSEC)
  180.                 LD A,IYH        ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
  181.                 LD L,A
  182.                 LD H,0
  183.                 ADD HL,DE
  184.                 EX DE,HL
  185.                 JR NC,LDFILE1
  186.                 INC BC                          ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
  187. LDFILE1         LD A,IYL;IXL            ;LX КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  188.                 CP IXL;IXH              ;HX РАЗМЕР КЛАСТЕРА
  189.                 JP C,LDFILE2
  190.                 LD A,IXL;IXH            ;HX РАЗМЕР КЛАСТЕРА
  191. LDFILE2         ADD A,IYH               ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
  192.                 CP IXL;IXH                      ;HX РАЗМЕР КЛАСТЕРА
  193.                 LD A,IYL;IXL            ;LX КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  194.                 JP C,LDFILE5
  195.                 LD A,IXL;IXH            ;HX РАЗМЕР КЛАСТЕРА
  196.                 SUB IYH                 ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
  197. LDFILE5         LD IXH,A;IYL,A          ;LY,A TEMP VAR                          ;СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
  198.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  199.                 CALL LOADSCS                    ;ЗАГРУЗИЛИ СЕКТОРА
  200.                 POP DE
  201.                 POP BC                          ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  202.                 LD A,IYH                ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
  203.                 ADD A,IXH;IYL           ;LY TEMP VAR
  204.                 CP IXL;IXH                      ;HX РАЗМЕР КЛАСТЕРА
  205.                 JP C,LDFILE3
  206.                 SUB IXL;IXH                     ;HX РАЗМЕР КЛАСТЕРА
  207. LDFILE3         LD IYH,A                ;HY,A СМЕЩЕНИЕ В КЛАСТЕРЕ
  208.                 JP C,LDFILE4
  209.                 PUSH HL                         ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  210.                 CALL RDFATZP                    ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  211.                 CALL LST_CLS                    ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
  212.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  213.                 RET C                           ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
  214. LDFILE4         LD A,IYL;IXL            ;LX КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  215.                 SUB IXH;IYL                     ;LY TEMP VAR
  216.                 RET Z
  217.                 LD IYL,A;IXL,A          ;LX,A КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  218.                 JP NZ,LD_FILE
  219.                 RET
  220.  
  221. LST_CLS         LD A,(CAL_FAT)
  222.                 AND A
  223.                 JR NZ,LST_CL1
  224.                 LD HL,0X0FF7
  225.                 SBC HL,DE
  226.                 RET
  227.  
  228. LST_CL1         DEC A
  229.                 JR NZ,LST_CL2
  230.                 LD HL,0XFFF7
  231.                 SBC HL,DE
  232.                 RET
  233.  
  234. LST_CL2         LD HL,0X0FFF
  235.                 SBC HL,BC
  236.                 RET NZ
  237.                 LD HL,0XFFF7
  238.                 SBC HL,DE
  239.                 RET
  240.  
  241. RDFATZP         LD BC,(AFILCLS+2)
  242.                 LD DE,(AFILCLS)
  243.                 LD A,(CAL_FAT)
  244.                 AND A
  245.                 JR Z,RDFATS0
  246.                 DEC A
  247.                 JR Z,RDFATS1
  248.                 EX DE,HL
  249.                 ADD HL,HL
  250.                 EX DE,HL
  251.                 LD HL,0
  252.                 ADC HL,BC
  253.                 ADD HL,BC
  254.                 LD A,E
  255.                 LD E,D
  256.                 LD D,L
  257.                 LD C,H
  258.                 LD B,0
  259.                 CALL RDFATS2
  260.                 INC HL
  261.                 LD C,(HL)
  262.                 INC HL
  263.                 LD B,(HL)
  264. RDFATS5         LD (AFILCLS+2),BC
  265.                 LD (AFILCLS),DE
  266.                 RET
  267.  
  268. RDFATS1         LD BC,0
  269.                 LD A,E
  270.                 LD E,D
  271.                 LD D,C
  272. RDFATS2         PUSH AF
  273.                 PUSH BC
  274.                 LD HL,FATSTR
  275.                 CALL BCDEHLP
  276.                 CALL LOADLST
  277.                 POP BC
  278.                 POP AF
  279.                 LD E,A
  280.                 LD D,0
  281.                 ADD HL,DE
  282.                 ADD HL,DE
  283.                 LD E,(HL)
  284.                 INC HL
  285.                 LD D,(HL)
  286.                 JR RDFATS5
  287.  
  288. RDFATS0         LD H,D
  289.                 LD L,E
  290.                 ADD HL,HL
  291.                 ADD HL,DE
  292.                 SRL H
  293.                 RR L
  294.                 LD A,E
  295.                 LD E,H
  296.                 LD D,0
  297.                 LD B,D
  298.                 LD C,D
  299.                 SRL E
  300.                 PUSH AF
  301.                 PUSH HL
  302.                 LD HL,FATSTR
  303.                 CALL BCDEHLP
  304.                 CALL LOADLST
  305.                 POP BC
  306.                 LD A,B
  307.                 AND 1
  308.                 LD B,A
  309.                 ADD HL,BC
  310.                 LD B,(HL)
  311.                 INC HL
  312.                 LD A,H
  313.                 CP HIGH (BUF_512_)+2
  314.                 JR NZ,RDFATS4
  315.                 PUSH BC
  316.                 LD BC,0
  317.                 INC DE
  318.                 CALL LOADLST
  319.                 POP BC
  320. RDFATS4         POP AF
  321.                 LD D,(HL)
  322.                 LD E,B
  323.                 LD BC,0
  324.                 RRA
  325.                 JR NC,RDFATS3
  326.                 REPT 4
  327.                 SRL D
  328.                 RR E
  329.                 ENDM
  330. RDFATS3         LD A,D
  331.                 AND 0X0F
  332.                 LD D,A
  333.                 JR RDFATS5
  334.  
  335. ;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
  336. ;НА ВХОДЕ BCDE=НОМЕР FAT
  337. ;НА ВЫХОДЕ BCDE=АДРЕС СЕКТОРА
  338. REALSEC         LD BC,(AFILCLS+2)
  339.                 LD DE,(AFILCLS)
  340.                 LD A,B
  341.                 OR C
  342.                 OR D
  343.                 OR E
  344.                 JR NZ,REALSE1
  345.                 LD DE,(FATSTR)
  346.                 LD BC,(FATSTR+2)
  347.                 LD HL,SEC_FAT
  348.                 PUSH HL
  349.                 CALL BCDEHLP
  350.                 POP HL
  351.                 JP BCDEHLP
  352.  
  353. REALSE1         LD HL,0XFFFE
  354.                 EX DE,HL
  355.                 ADD HL,DE
  356.                 EX DE,HL
  357.                 INC HL
  358.                 ADC HL,BC                       ;НОМЕР КЛАСТЕРА-2
  359.                 LD A,(BYTSSEC)
  360.                 JR REALSE3
  361.  
  362. REALSE2         SLA E
  363.                 RL D
  364.                 RL L
  365.                 RL H
  366. REALSE3         RRCA
  367.                 JR NC,REALSE2                   ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
  368.                 LD B,H
  369.                 LD C,L
  370.                 LD HL,STARTRZ
  371.                 CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
  372.                 LD HL,FRSTDAT
  373.                 JP BCDEHLP                      ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
  374.  
  375. BCDE200         LD E,D
  376.                 LD D,C
  377.                 LD C,B
  378.                 LD B,0
  379.                 LD A,2
  380.                 JR BCDE_A
  381.  
  382. ;BCDE>>A=BCDE
  383. BCDE_A1         SRL B
  384.                 RR C
  385.                 RR D
  386.                 RR E
  387. BCDE_A          RRCA
  388.                 JR NC,BCDE_A1
  389.                 RET
  390.  
  391. ;(ADR)-BCDE=BCDE
  392. BCDEHLM         LD A,(HL)
  393.                 INC HL
  394.                 SUB E
  395.                 LD E,A
  396.                 LD A,(HL)
  397.                 INC HL
  398.                 SBC A,D
  399.                 LD D,A
  400.                 LD A,(HL)
  401.                 INC HL
  402.                 SBC A,C
  403.                 LD C,A
  404.                 LD A,(HL)
  405.                 SBC A,B
  406.                 LD B,A
  407.                 RET
  408.  
  409. ;(ADR)+BCDE=BCDE
  410. BCDEHLP         LD A,(HL)
  411.                 INC HL
  412.                 ADD A,E
  413.                 LD E,A
  414.                 LD A,(HL)
  415.                 INC HL
  416.                 ADC A,D
  417.                 LD D,A
  418.                 LD A,(HL)
  419.                 INC HL
  420.                 ADC A,C
  421.                 LD C,A
  422.                 LD A,(HL)
  423.                 ADC A,B
  424.                 LD B,A
  425.                 RET
  426.  
  427. ;HLDE+BC=HLDE
  428. HLDEPBC         EX DE,HL
  429.                 ADD HL,BC
  430.                 EX DE,HL
  431.                 LD BC,0
  432.                 ADC HL,BC
  433.                 RET
  434.  
  435. ;ЗАГРУЖАЕМ СЕКТОР В БУФЕР
  436. LOADLST         LD HL,BUF_512_
  437.                 PUSH HL
  438.                 LD A,1
  439.                 CALL LOADSCS
  440.                 POP HL
  441.                 RET
  442.  
  443. ;================ЗАГРУЗЧИК С ZC SD КАРТОЧКИ===================
  444. READ_SD         PUSH AF
  445.                 LD A,1
  446.                 OUT (P_CONF),A
  447.                 POP AF
  448.                 EX AF,AF'
  449.                 LD A,CMD_18
  450.                 CALL SECM200
  451.                 EX AF,AF'
  452. RDMULT1         EX AF,AF'
  453. RDMULT2         CALL IN_OOUT
  454.                 CP 0XFE
  455.                 JR NZ,RDMULT2
  456.                 PUSH BC
  457.                 LD BC,P_DATA
  458.                 INIR
  459.                 NOP
  460.                 INIR
  461.                 NOP
  462.                 IN A,(C)
  463.                 NOP
  464.                 IN A,(C)
  465.                 POP BC
  466.                 EX AF,AF'
  467.                 DEC A
  468.                 JR NZ,RDMULT1
  469.                 LD A,CMD_12
  470.                 CALL OUT_COM
  471. RDMULT3         CALL IN_OOUT
  472.                 INC A
  473.                 JR NZ,RDMULT3
  474.                 PUSH AF
  475.                 LD A,3
  476.                 OUT (P_CONF),A
  477.                 XOR A
  478.                 OUT (P_DATA),A
  479.                 POP AF
  480.                 RET
  481.  
  482. SECM200         PUSH HL
  483.                 PUSH DE
  484.                 PUSH BC
  485.                 PUSH AF
  486.                 PUSH BC
  487.                 LD A,CMD_58
  488.                 LD BC,P_DATA
  489.                 CALL OUT_COM
  490.                 CALL IN_OOUT
  491.                 IN A,(C)
  492.                 NOP
  493.                 IN H,(C)
  494.                 NOP
  495.                 IN H,(C)
  496.                 NOP
  497.                 IN H,(C)
  498.                 BIT 6,A
  499.                 POP HL
  500.                 JR NZ,SECN200
  501.                 EX DE,HL
  502.                 ADD HL,HL
  503.                 EX DE,HL
  504.                 ADC HL,HL
  505.                 LD H,L
  506.                 LD L,D
  507.                 LD D,E
  508.                 LD E,0
  509. SECN200         POP AF
  510.                 LD BC,P_DATA
  511.                 OUT (C),A
  512.                 NOP
  513.                 OUT (C),H
  514.                 NOP
  515.                 OUT (C),L
  516.                 NOP
  517.                 OUT (C),D
  518.                 NOP
  519.                 OUT (C),E
  520.                 LD A,0XFF
  521.                 OUT (C),A
  522.                 POP BC
  523.                 POP DE
  524.                 POP HL
  525.                 RET
  526.  
  527. OUT_COM         PUSH BC
  528.                 LD BC,P_DATA
  529.                 OUT (C),A
  530.                 XOR A
  531.                 OUT (C),A
  532.                 NOP
  533.                 OUT (C),A
  534.                 NOP
  535.                 OUT (C),A
  536.                 NOP
  537.                 OUT (C),A
  538.                 DEC A
  539.                 OUT (C),A
  540.                 POP BC
  541.                 RET
  542.  
  543. IN_OOUT         PUSH DE
  544.                 LD DE,0X20FF
  545. IN_WAIT         IN A,(P_DATA)
  546.                 CP E
  547.                 JR NZ,IN_EXIT
  548. IN_NEXT         DEC D
  549.                 JR NZ,IN_WAIT
  550. IN_EXIT         POP DE
  551.                 RET
  552. ;=========================================================
  553.  
  554. ;===============ЧТЕНИЕ С SD NEOGS=========================
  555. ;ЧТЕНИЕ "A" СЕКТОРОВ
  556. READNGS         EX AF,AF'
  557.                 LD A,_DEV_READ
  558.                 CALL COMM2SD
  559.                 EX AF,AF'
  560.                 PUSH DE
  561.                 PUSH BC
  562.                 LD BC,GSDAT
  563. SDRDSN1         EX AF,AF'
  564.                 OUT (GSCOM),A
  565.                 CALL WC_
  566.                 LD DE,0X0200
  567. SDRDSN2         CALL WN_
  568.                 INI
  569.                 DEC DE
  570.                 LD A,D
  571.                 OR E
  572.                 JR NZ,SDRDSN2
  573.                 EX AF,AF'
  574.                 DEC A
  575.                 JR NZ,SDRDSN1
  576.                 CALL WN_
  577. SDRDSN3         IN A,(C)
  578.                 CP 0X77
  579.                 JR NZ,SDRDSN3
  580.                 POP BC
  581.                 POP DE
  582.                 XOR A
  583.                 RET
  584.  
  585. ;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
  586. COMM2SD         OUT (GSDAT),A                   ;УШЛА КОМАНДА ДРАЙВЕРУ
  587.                 LD A,0X1E
  588.                 OUT (GSCOM),A                   ;УШЛА КОМАНДА ПРОШИВКЕ
  589.                 CALL WC_
  590.                 LD A,B
  591.                 OUT (GSDAT),A                   ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ
  592.                 CALL WD_
  593.                 LD A,C
  594.                 OUT (GSDAT),A                   ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
  595.                 CALL WD_
  596.                 LD A,D
  597.                 OUT (GSDAT),A                   ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
  598.                 CALL WD_
  599.                 LD A,E
  600.                 OUT (GSDAT),A                   ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
  601.                 CALL WD_
  602.                 EX AF,AF'
  603.                 OUT (GSDAT),A                   ;УШЛО КОЛ-ВО СЕКТОРОВ
  604.                 EX AF,AF'
  605.                 DUPL 9,0
  606.                 RET
  607.  
  608. ;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
  609. WD_             IN A,(GSCOM)
  610.                 RLA
  611.                 JR C,WD_
  612.                 RET
  613.  
  614. ;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
  615. WN_             IN A,(GSCOM)
  616.                 RLA
  617.                 JR NC,WN_
  618.                 RET
  619.  
  620. ;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
  621. WC_             IN A,(GSCOM)
  622.                 RRA
  623.                 JR C,WC_
  624.                 RET
  625. ;==========================================================
  626.  
  627. ;==================ЧТЕНИЕ С NEMO HDD=======================
  628. P_1F7           EQU 0XF0                        ;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
  629. P_1F6           EQU 0XD0                        ;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
  630. P_1F5           EQU 0XB0                        ;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
  631. P_1F4           EQU 0X90                        ;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
  632. P_1F3           EQU 0X70                        ;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
  633. P_1F2           EQU 0X50                        ;СЧЕТЧИК СЕКТОРОВ
  634. P_1F1           EQU 0X30                        ;ПОРТ ОШИБОК/СВОЙСТВ
  635. P_1F0           EQU 0X10                        ;ПОРТ ДАННЫХ
  636. P_3F6           EQU 0XC8                        ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
  637. P_HI            EQU 0X11                        ;СТАРШИЕ 8 БИТ
  638. PRT_RW          EQU P_1F0*256+P_HI              ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
  639.  
  640. RD_HDDN         PUSH BC
  641.                 PUSH DE
  642.                 PUSH DE
  643.                 EX AF,AF'
  644.                 LD A,(MAS_SLA)
  645.                 OR B
  646.                 LD E,C
  647.                 LD BC,0XFF00+P_1F6
  648.                 OUT (C),A
  649.                 LD C,P_1F5
  650.                 OUT (C),E
  651.                 POP DE
  652.                 LD C,P_1F4
  653.                 OUT (C),D
  654.                 LD C,P_1F3
  655.                 OUT (C),E
  656.                 LD C,P_1F2
  657.                 EX AF,AF'
  658.                 OUT (C),A
  659.                 EX AF,AF'
  660.                 LD C,P_1F7
  661.                 LD A,0X20
  662.                 OUT (C),A
  663.                 LD C,P_1F7
  664. HDDRD1          IN A,(C)
  665.                 AND 0X88
  666.                 CP 8
  667.                 JR NZ,HDDRD1
  668.                 EX AF,AF'
  669. HDDRD2          EX AF,AF'
  670.                 LD A,0X40
  671.                 LD C,P_1F0
  672. READSC1         IN E,(C)
  673.                 INC C
  674.                 IN D,(C)
  675.                 DEC C
  676.                 LD (HL),E
  677.                 INC HL
  678.                 LD (HL),D
  679.                 INC HL
  680.                 IN E,(C)
  681.                 INC C
  682.                 IN D,(C)
  683.                 DEC C
  684.                 LD (HL),E
  685.                 INC HL
  686.                 LD (HL),D
  687.                 INC HL
  688.                 IN E,(C)
  689.                 INC C
  690.                 IN D,(C)
  691.                 DEC C
  692.                 LD (HL),E
  693.                 INC HL
  694.                 LD (HL),D
  695.                 INC HL
  696.                 IN E,(C)
  697.                 INC C
  698.                 IN D,(C)
  699.                 DEC C
  700.                 LD (HL),E
  701.                 INC HL
  702.                 LD (HL),D
  703.                 INC HL
  704.                 DEC A
  705.                 JR NZ,READSC1
  706.                 LD C,P_1F7
  707. HDDRD3          IN A,(C)
  708.                 AND 0X80
  709.                 JR NZ,HDDRD3
  710.                 EX AF,AF'
  711.                 DEC A
  712.                 JR NZ,HDDRD2
  713.                 POP DE
  714.                 POP BC
  715.                 XOR A
  716.                 RET
  717. ;=============================================================
  718.  
  719. ;==================ЧТЕНИЕ СО СМУК ВИНТА=======================
  720. PS1F7           EQU 0XFF                        ;0XFFBE РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
  721. PS1F6           EQU 0XFE                        ;0XFEBE CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
  722. PS1F5           EQU 0XFD                        ;0XFDBE CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
  723. PS1F4           EQU 0XFC                        ;0XFCBE CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
  724. PS1F3           EQU 0XFB                        ;0XFBBE CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
  725. PS1F2           EQU 0XFA                        ;0XFABE СЧЕТЧИК СЕКТОРОВ
  726. PS1F1           EQU 0XF9                        ;0XF9BE ПОРТ ОШИБОК/СВОЙСТВ
  727. PS1F0           EQU 0XF8                        ;0XF8BE ПОРТ ДАННЫХ
  728. PS3F6           EQU 0XFE                        ;0XFEBE РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
  729. PSHI            EQU 0XD8                        ;0XD8BE СТАРШИЕ 8 БИТ
  730. PRTSRW          EQU PS1F0*256+PSHI              ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
  731. LOW_PRT         EQU 0XBE                        ;МЛАДШИЙ БАЙТ АДРЕСА SMUC IDE
  732. SMUCSYS         EQU 0XFFBA                      ;СИСТЕМНЫЙ ПОРТ SMUC
  733. SMUCVER         EQU 0X5FBA                      ;ПОРТ ВЕРСИИ SMUC
  734.  
  735. RD_HDDS         PUSH BC
  736.                 PUSH DE
  737.                 CALL SETSREG
  738.                 EX AF,AF'
  739.                 LD B,PS1F7
  740.                 LD A,0X20
  741.                 CALL SOUTPRT
  742. HDSRDM2         CALL SINPRT
  743.                 AND 0X88
  744.                 CP 8
  745.                 JR NZ,HDSRDM2
  746.                 EX AF,AF'
  747. HDSRDM1         PUSH AF
  748.                 LD DE,PRTSRW
  749.                 LD A,0X40
  750. RDCSSC1         EX AF,AF'
  751.                 LD B,D
  752.                 CALL SINPRT
  753.                 LD (HL),A
  754.                 INC HL
  755.                 LD B,E
  756.                 CALL SINPRT
  757.                 LD (HL),A
  758.                 INC HL
  759.                 LD B,D
  760.                 CALL SINPRT
  761.                 LD (HL),A
  762.                 INC HL
  763.                 LD B,E
  764.                 CALL SINPRT
  765.                 LD (HL),A
  766.                 INC HL
  767.                 LD B,D
  768.                 CALL SINPRT
  769.                 LD (HL),A
  770.                 INC HL
  771.                 LD B,E
  772.                 CALL SINPRT
  773.                 LD (HL),A
  774.                 INC HL
  775.                 LD B,D
  776.                 CALL SINPRT
  777.                 LD (HL),A
  778.                 INC HL
  779.                 LD B,E
  780.                 CALL SINPRT
  781.                 LD (HL),A
  782.                 INC HL
  783.                 EX AF,AF'
  784.                 DEC A
  785.                 JR NZ,RDCSSC1
  786.                 LD B,PS1F7
  787. HDSRDM3         CALL SINPRT
  788.                 AND 0X80
  789.                 JR NZ,HDSRDM3
  790.                 POP AF
  791.                 DEC A
  792.                 JR NZ,HDSRDM1
  793.                 POP DE
  794.                 POP BC
  795.                 RET
  796.        
  797. SETSREG         PUSH DE
  798.                 LD D,B
  799.                 LD E,C
  800.                 EX AF,AF'
  801.                 LD A,(MAS_SLA)
  802.                 OR D
  803.                 LD BC,(PS1F6*0X0100)+LOW_PRT
  804.                 CALL SOUTPRT
  805.                 LD B,PS1F5
  806.                 LD A,E
  807.                 CALL SOUTPRT
  808.                 POP DE
  809.                 LD B,PS1F4
  810.                 LD A,D
  811.                 CALL SOUTPRT
  812.                 LD B,PS1F3
  813.                 LD A,E
  814.                 CALL SOUTPRT
  815.                 LD B,PS1F2
  816.                 EX AF,AF'
  817.  
  818. SOUTPRT         PUSH HL
  819.                 LD HL,0X3FF0
  820.                 EX (SP),HL
  821.                 JP 0X3D2F
  822.  
  823. SINPRT          PUSH HL
  824.                 LD HL,0X3FF3
  825.                 EX (SP),HL
  826.                 JP 0X3D2F
  827. ;=============================================================
  828.  
  829. ;==================ЧТЕНИЕ С DIVIDE ВИНТА======================
  830. PV1F7           EQU 0XBF                        ;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
  831. PV1F6           EQU 0XBB                        ;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
  832. PV1F5           EQU 0XB7                        ;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
  833. PV1F4           EQU 0XB3                        ;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
  834. PV1F3           EQU 0XAF                        ;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
  835. PV1F2           EQU 0XAB                        ;СЧЕТЧИК СЕКТОРОВ
  836. PV1F1           EQU 0XA7                        ;ПОРТ ОШИБОК/СВОЙСТВ
  837. PV1F0           EQU 0XA3                        ;ПОРТ ДАННЫХ
  838. PV3F6           EQU 0XC8                        ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ (UNUSED ON DIVIDE)
  839. PVHI            EQU 0XA3                        ;СТАРШИЕ 8 БИТ
  840. PRTVRW          EQU PV1F0*256+PVHI              ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
  841.  
  842. RD_HDDD         PUSH BC
  843.                 PUSH DE
  844.                 CALL SETVREG
  845.                 EX AF,AF'
  846.                 LD C,PV1F7
  847.                 LD A,0X20
  848.                 OUT (C),A
  849.                 LD C,PV1F7
  850. HDVRD1          IN A,(C)
  851.                 AND 0X88
  852.                 CP 8
  853.                 JR NZ,HDVRD1
  854.                 EX AF,AF'
  855. HDVRD2          EX AF,AF'
  856.                 CALL READVSEC
  857.                 LD C,PV1F7
  858. HDVRD3          IN A,(C)
  859.                 AND 0X80
  860.                 JR NZ,HDVRD3
  861.                 EX AF,AF'
  862.                 DEC A
  863.                 JR NZ,HDVRD2
  864. EXITVHD         POP DE
  865.                 POP BC
  866.                 LD A,B
  867.                 AND 0X0F
  868.                 LD B,A
  869.                 XOR A
  870.                 RET
  871.  
  872. SETVREG         PUSH DE
  873.                 LD D,B
  874.                 LD E,C
  875.                 LD BC,0XFF00+PV1F6
  876.                 OUT (C),D
  877.                 EX AF,AF'
  878.                 LD C,PV1F7
  879. SETVRE1         IN A,(C)
  880.                 AND 0X80
  881.                 JR NZ,SETVRE1
  882.                 LD C,PV1F5
  883.                 OUT (C),E
  884.                 POP DE
  885.                 LD C,PV1F4
  886.                 OUT (C),D
  887.                 LD C,PV1F3
  888.                 OUT (C),E
  889.                 LD C,PV1F2
  890.                 EX AF,AF'
  891.                 OUT (C),A
  892.                 RET
  893.  
  894. ;READ SECTOR (512 BYTES)
  895. READVSEC        LD A,0X40
  896.                 LD C,PV1F0
  897. READVSC1        REPT 8
  898.                 INI
  899.                 INC B
  900.                 ENDM
  901.                 DEC A
  902.                 JR NZ,READVSC1
  903.                 RET
  904. ;==================ЧТЕНИЕ С DIVIDE ВИНТА======================
  905.  
  906. ;==================ЧТЕНИЕ С PROFI ВИНТА=======================
  907. PP_1F7W         EQU 0X07EB                      ;W РЕГИСТР КОМАНД
  908. PP_1F7R         EQU 0X07CB                      ;R РЕГИСТР СОСТОЯНИЯ
  909. PP_1F6W         EQU 0X06EB                      ;W CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
  910. PP_1F6R         EQU 0X06CB                      ;R CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
  911. PP_1F5W         EQU 0X05EB                      ;W CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
  912. PP_1F5R         EQU 0X05CB                      ;R CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
  913. PP_1F4W         EQU 0X04EB                      ;W CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
  914. PP_1F4R         EQU 0X04CB                      ;R CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
  915. PP_1F3W         EQU 0X03EB                      ;W CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
  916. PP_1F3R         EQU 0X03CB                      ;R CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
  917. PP_1F2W         EQU 0X02EB                      ;W СЧЕТЧИК СЕКТОРОВ
  918. PP_1F2R         EQU 0X02CB                      ;R СЧЕТЧИК СЕКТОРОВ
  919. PP_1F1W         EQU 0X01EB                      ;W ПОРТ СВОЙСТВ
  920. PP_1F1R         EQU 0X01CB                      ;R ПОРТ ОШИБОК
  921. PP_1F0W         EQU 0X00EB                      ;W ПОРТ ДАННЫХ МЛАДШИЕ 8 БИТ
  922. PP_1F0R         EQU 0X00CB                      ;R ПОРТ ДАННЫХ МЛАДШИЕ 8 БИТ
  923. PP_3F6          EQU 0X06AB                      ;W РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
  924. PP_HIW          EQU 0XFFCB                      ;W ПОРТ ДАННЫХ СТАРШИЕ 8 БИТ
  925. PP_HIR          EQU 0XFFEB                      ;R ПОРТ ДАННЫХ СТАРШИЕ 8 БИТ
  926.  
  927. RD_HDDP         PUSH BC
  928.                 PUSH DE
  929.                 PUSH AF
  930.                 PUSH BC
  931.                 LD BC,0XDFFD
  932.                 LD A,0X20
  933.                 OUT (C),A
  934.                 POP BC
  935.                 LD A,(MAS_SLA)
  936.                 OR B
  937.                 LD B,A
  938.                 POP AF
  939.                 CALL SETHPREG
  940.                 EX AF,AF'
  941.                 LD BC,PP_1F7W
  942.                 LD A,0X20
  943.                 OUT (C),A
  944.                 LD BC,PP_1F7R
  945. HDDPRD1         IN A,(C)
  946.                 AND 0X88
  947.                 CP 8
  948.                 JR NZ,HDDPRD1
  949.                 EX AF,AF'
  950. HDDPRD2         EX AF,AF'
  951.                 CALL READPSEC
  952.                 LD BC,PP_1F7R
  953. HDDPRD3         IN A,(C)
  954.                 AND 0X80
  955.                 JR NZ,HDDPRD3
  956.                 EX AF,AF'
  957.                 DEC A
  958.                 JR NZ,HDDPRD2
  959.                 LD BC,0XDFFD
  960.                 XOR A
  961.                 OUT (C),A
  962.                 POP DE
  963.                 POP BC
  964.                 LD A,B
  965.                 AND 0X0F
  966.                 LD B,A
  967.                 XOR A
  968.                 RET
  969.  
  970. SETHPREG        PUSH DE
  971.                 LD D,B
  972.                 LD E,C
  973.                 LD BC,PP_1F6W
  974.                 OUT (C),D
  975.                 EX AF,AF'
  976.                 LD BC,PP_1F7R
  977. SETHPRE1        IN A,(C)
  978.                 AND 0X80
  979.                 JR NZ,SETHPRE1
  980.                 LD BC,PP_1F5W
  981.                 OUT (C),E
  982.                 POP DE
  983.                 LD BC,PP_1F4W
  984.                 OUT (C),D
  985.                 LD BC,PP_1F3W
  986.                 OUT (C),E
  987.                 LD BC,PP_1F2W
  988.                 EX AF,AF'
  989.                 OUT (C),A
  990.                 RET
  991.  
  992. READPSEC        LD A,0X40
  993. READPSC1        REPT 4
  994.                 LD BC,PP_1F0R
  995.                 IN E,(C)
  996.                 LD BC,PP_HIR
  997.                 IN D,(C)
  998.                 LD (HL),E
  999.                 INC HL
  1000.                 LD (HL),D
  1001.                 INC HL
  1002.                 ENDM
  1003.                 DEC A
  1004.                 JR NZ,READPSC1
  1005.                 RET
  1006. ;==================ЧТЕНИЕ С PROFI ВИНТА=======================
  1007.