Subversion Repositories pentevo

Rev

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

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