Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. hddstat         EQU 0XF0
  3. hddcmd          EQU 0XF0
  4. hddhead         EQU 0XD0
  5. hddcylhi        EQU 0XB0
  6. hddcyllo        EQU 0X90
  7. hddsec          EQU 0X70
  8. hddcount        EQU 0X50
  9. hdderr          EQU 0X30
  10. hdddatlo        EQU 0X10
  11. hdddathi        EQU 0X11
  12. hddupr          EQU 0XC8
  13. hdduprON        EQU 0
  14.  
  15. HDDBINI CALL SET_7FFD_0
  16.         LD HL,HDDREAD
  17.         LD DE,0XE800    ;0X5B60
  18.         LD B,8          ;BC,HDDRDLN
  19.         LDIR
  20.         RET
  21.  
  22. HDDBOOT DI
  23.         CALL HDDBINI
  24. INIT0   LD A,0XA0       ;MASTER+CHS АДРЕСАЦИЯ
  25.         LD (devnum),A
  26.         CALL SELDEVICE
  27.         LD A,0X0C
  28.         LD BC,hddupr
  29.         PUSH BC
  30.         CALL OUT_A      ;начинаем сброс
  31.         LD B,0
  32.         DJNZ $
  33.         LD A,8
  34.         POP BC
  35.         CALL OUT_A      ;сбросили!
  36.         CALL NO_BSY
  37.         LD A,0X10       ;Команда RECALIBRATE
  38.         CALL HDSC       ;Запись COMMAND
  39. INIT2   IN A,(LOW (hddstat))    ;Чтение STATUS REGISTER (0111)
  40.         BIT 7,A         ;Проверка бита BSY занятость HDD
  41.         JR NZ,INIT2     ;Переход если накопитель занят
  42.         AND 0XE9
  43.         CP 0X40
  44.         ;CP 0X50                ;Проверка битов DSC (уст-ка головок)
  45.                         ;и DRDY(готовность HDD)
  46.         JR NZ,INIT0     ;Если установлены - выход
  47.         JP 0XE800
  48. ;,**************************************************************
  49. ;ЧТЕНИЕ СЕКТОРОВ
  50. HDDREAD PHASE 0XE800
  51.         CALL NO_BSY     ;ЗАПИСАТЬ В РЕГИСТРЫ ЦИЛИНДРА,ГОЛОВКИ,СЕКТОРА
  52.         LD BC,hddhead   ;РЕГИСТР НАКОПИТЕЛЯ/ГОЛОВКИ
  53.         LD A,0XA0       ;ГОЛОВКА 0,ВИНТ MASTER 0XB0-SLAVE
  54.         CALL OUT_A
  55.         LD BC,hddcylhi  ;РЕГИСТР ЦИЛИНДРА (HI)
  56.         XOR A
  57.         CALL OUT_A
  58.         LD BC,hddcyllo  ;РЕГИСТР ЦИЛИНДРА (LOW)
  59.         CALL OUT_A
  60.         LD BC,hddsec    ;РЕГИСТР НОМЕРА СЕКТОРА
  61.         LD A,3          ;НОМЕР СЕКТОРА
  62.         CALL OUT_A
  63.         LD BC,hddcount  ;РЕГИСТР СЧЕТЧИКА СЕКТОРА
  64.         LD A,0X30       ;СКОЛЬКО СЕКТОРОВ  24K
  65.         CALL OUT_A
  66.         LD A,0X20
  67.         CALL HDSC       ;КОМАНДА "ЧИТАТЬ"
  68.         LD HL,0X6000
  69.         PUSH HL
  70.         LD B,0X30
  71. READ1   PUSH BC
  72.         CALL WAIT_DRQ
  73. ;ЧИТАЕМ СЕКТОР
  74.         LD B,0
  75. READ_1  PUSH BC
  76.         LD BC,hdddatlo  ;МЛАДШИЙ БАЙТ
  77.         INI
  78.         LD BC,hdddathi  ;СТАРШИЙ БАЙТ
  79.         INI
  80.         POP BC
  81.         DJNZ READ_1
  82.         POP         BC
  83.         DJNZ       READ1
  84.         RET    
  85.  
  86. ;ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАЧИ ДАННЫХ
  87. WAIT_DRQ
  88.         CALL    IN_HDDSTAT
  89.         BIT     3,A
  90.         RET     NZ
  91.         JR      WAIT_DRQ
  92.  
  93. ;ПОСЛАТЬ КОМАНДЫ НА ВИНТ
  94. HDSC    PUSH AF
  95.         CALL SELDEVICE
  96.         POP AF
  97.         LD BC,hddcmd
  98.         CALL OUT_A
  99. ;ОЖИДАНИЕ ОСВОБОЖДЕНИЯ УСТРОЙСТВА
  100. NO_BSY  CALL IN_HDDSTAT
  101.         RLCA
  102.         RET NC
  103.         JR NO_BSY
  104.  
  105. IN_HDDSTAT
  106.         CALL SELDEVICE
  107.         LD BC,hddstat
  108. IN_A    IN A,(C)
  109.         RET    
  110.  
  111. SELDEVICE
  112. devnum  EQU $+1
  113.         LD A,device
  114.         LD BC,hddhead
  115. OUT_A   OUT (C),A
  116.         RET
  117.  
  118. CDBOOTGO
  119.  
  120. ;загрузчик файла "AUTORUN.ZX" с CD по адресу 0X6000
  121. ;SP=0X6000, DI
  122. ;передает ему в регистрах:
  123. ;A=0XA0 (master) или 0XB0 (slave)
  124. ;B=тип компьютера:
  125.  ;0=PENTAGON, 1=ATM, 2=SCORPION, 3=PROFI, 4=SPRINTER
  126. ;C=тип контроллера IDE:
  127.  ;0=NEMO, 1=ATM, 2=SMUC, 3=PROFI, 4=SPRINTER
  128. ;D=язык:
  129.  ;0=ENGLISH, 1=РУССКИЙ
  130. ;E=адрес COVOX:
  131.  ;0XFB=ATM/PENTAGON, 0XFF=отсутствует
  132. ;HL=доступные видеорежимы (накладываются по OR)
  133.  ;1=512x192 BW VMG
  134.  ;2=384x304 ZX AC
  135.  ;4=256x192 15 AC
  136.  ;8=320x200 16 ATM
  137. device          EQU 0XB0
  138. comptype        EQU 0
  139. idetype         EQU 0
  140. language        EQU 1
  141. COVPORT         EQU 0XFB
  142. videomodes      EQU 4;8
  143.  
  144. ;===============ниже поддержаны только NEMO,SMUC,ATM============
  145. ;        IF     comptype-1
  146. ;atm=1
  147. ;        ELSE  
  148. ;atm=0
  149. ;        ENDIF 
  150. ;        IF     idetype-2
  151. ;smuc=1|atm
  152. ;        ELSE  
  153. ;smuc=atm
  154. ;        ENDIF 
  155. ;       IFN     smuc
  156. ;      IFN      atm
  157. ;схема ATM:
  158. ;hddstat=0XFEEF
  159. ;hddcmd=0XFEEF
  160. ;hddhead=0XFECF
  161. ;hddcylhi=0XFEAF
  162. ;hddcyllo=0XFE8F
  163. ;hddsec=0XFE6F
  164. ;hddcount=0XFE4F
  165. ;hdderr=0XFE2F
  166. ;hdddatlo=0XFE0F
  167. ;hdddathi=0XFF0F
  168. ;hddupr=0XFEBE ;при установленном b7 FFBA
  169. ;hdduprON=0XFFBA
  170. ;hddupr1=0XF7
  171. ;hddupr0=0X77
  172. ;      ELSE    
  173. ;схема SMUC:
  174. ;hddstat=0XFFBE
  175. ;hddcmd=0XFFBE
  176. ;hddhead=0XFEBE
  177. ;hddcylhi=0XFDBE
  178. ;hddcyllo=0XFCBE
  179. ;hddsec=0XFBBE
  180. ;hddcount=0XFABE
  181. ;hdderr=0XF9BE
  182. ;hdddatlo=0XF8BE
  183. ;hdddathi=0XD8BE
  184. ;hddupr=0XFEBE ;при установленном b7 FFBA
  185. ;hdduprON=0XFFBA
  186. ;hddupr1=0XF7
  187. ;hddupr0=0X77
  188. ;      ENDIF   
  189. ;       ELSE   
  190. ;схема Nemo:
  191. ;hddstat=0XF0
  192. ;hddcmd=0XF0
  193. ;hddhead=0XD0
  194. ;hddcylhi=0XB0
  195. ;hddcyllo=0X90
  196. ;hddsec=0X70
  197. ;hddcount=0X50
  198. ;hdderr=0X30
  199. ;hdddatlo=0X10
  200. ;hdddathi=0X11
  201. ;hddupr=0XC8
  202. ;hdduprON=0
  203. ;       ENDIF  
  204.  
  205. SECBUF          EQU 0X6000
  206.  
  207.         ;DISP           0XE800
  208. begin
  209. ;GO
  210. ;        LD     SP,0X6000
  211. ;        LD     (IY+1),0XCC
  212. ;        EI    
  213. ;        HALT  
  214. ;        XOR    A
  215. ;        OUT    (-2),A
  216. ;        LD     DE,0X5801
  217. ;        LD     H,D,L,A
  218. ;        LD     BC,767
  219. ;        LD     (HL),L
  220. ;        LDIR  
  221.  
  222. ;       IFN     atm
  223. ;        CALL   0X3D46   ;вызов "проверочной" точки в (v)TR-DOS
  224. ;        OR     A         ;если не 0,vTR-DOS нет и ПЗУ не подменяем
  225. ;        CALL   Z,0X3C98 ;вызов триггера подмены ПЗУ TRD/vTRD
  226. ;       ENDIF  
  227.  
  228. ;инициализация
  229. iniini
  230.       ; LD A,device ;0XB0=slave
  231.       ; LD BC,hddhead
  232.       ; CALL OUT_A ;есть внутри NO_BSY
  233.         CALL    NO_BSY
  234.     ;LD A,0XFE
  235.     ;IN A,(-2)
  236.     ;RRA
  237.     ;JNC SKIPINI
  238.       ;LD A,0X10        ;
  239.       ;CALL HDSC       ;ZET9 для HDD
  240.         LD      A,0X08        ;
  241.         CALL    HDSC       ;SMT для CD (сброс для ATAPI)
  242.       ;RET C ;ATAPI only
  243.       ; LD A,device ;0XB0=slave   ;
  244.       ; LD BC,hddhead            ;BUDDER
  245.       ; CALL OUT_A ;есть в HDSC  ;иначе при нераскрученном CD
  246.                                  ;не выдаст EB14!!!
  247.         LD      A,0XEC ;identify
  248.         CALL    HDSC
  249.       ;RET C ;для CD выдаст ошибку (VEGA)
  250.  
  251.         LD      B,30
  252.         HALT   
  253.         DJNZ    $-1
  254.  
  255.         CALL    LEN_TO_HL
  256.         LD      BC,0XEB14
  257.         OR      A
  258.         SBC     HL,BC
  259.        JP       NZ,iniini;0 ;HDD
  260.        ;LD A,1
  261.        ;OUT (-2),A
  262.  
  263.     LD  HL,AP_00
  264.     CALL        SEND_ATAPI ;VEGA
  265.  
  266.         LD      HL,AP_1x
  267.         CALL    SEND_ATAPI
  268.         LD      B,30
  269.         HALT   
  270.         DJNZ    $-1
  271. SKIPINI
  272.         DI     
  273.  
  274.        ;LD A,2
  275.        ;OUT (-2),A
  276.  
  277.       ;сейчас номер сектора=0,0,0,0
  278.         CALL    READCDSECBUF ;иначе не работает READTOC
  279.         LD      HL,AP_READTOC
  280.         CALL    SEND_ATAPI
  281.       ;RET C
  282.         CALL    NO_BSY
  283.       ;RET C
  284.         CALL    WAIT_DRQ
  285.       ;RET C
  286.         CALL    LEN_TO_HL
  287.         LD      B,H
  288.         LD C,L
  289.         LD      HL,SECBUF
  290.         CALL    TRANS_IN
  291.         CALL    NO_BSY
  292.  
  293.        ;LD A,3
  294.        ;OUT (-2),A
  295.  
  296.      ;берем посл сессию (предпосл запись)
  297.         LD      HL,SECBUF+1
  298.         LD      A,(HL)
  299.         ADD     A,-10
  300.         LD      L,A
  301.         LD      D,0X87
  302.        ;CY=1
  303.         CALL    LOADER ;грузим начало сессии (0X8800 байт)
  304.  
  305.         LD      BC,0X80A2
  306.         ADD     HL,BC
  307.        ;CY=0
  308.         CALL    LOADER ;грузим корневой каталог
  309.        ;HL=SECBUF
  310.  
  311.        ;LD A,4
  312.        ;OUT (-2),A
  313.  
  314. FNDIDLOOP
  315.        PUSH     HL
  316.         LD      C,33
  317.         ADD     HL,BC
  318.         LD      DE,autorunname
  319.         LD      C,autorunnamesz
  320. FNDID0  LD      A,(DE)
  321.         CPI    
  322.        JR NZ,FNDIDN
  323.         INC     DE
  324.         JP      PE,FNDID0
  325.        POP      HL
  326.         LD      C,6
  327.         ADD     HL,BC
  328.        ;CY=0
  329.  
  330.        ;LD A,5
  331.        ;OUT (-2),A
  332.  
  333.         CALL    LOADER ;грузим autorun.zx
  334.        PUSH     HL
  335.         LD      A,device ;0XB0=slave
  336.         LD      BC,comptype*256+idetype ;1=ATM,1=ATM
  337.         LD      DE,language*256+COVPORT ;1=RUS,0XFB
  338.         LD      HL,videomodes ;8=ATM
  339.        RET     
  340. FNDIDN
  341.        POP      HL
  342.         LD      C,(HL)
  343.         INC     HL
  344.         LD      B,(HL)
  345.         DEC     HL
  346.        LD       A,B
  347.        OR       C
  348.        JR NZ,NOPADDING
  349.         INC     H
  350.         LD      L,A
  351. NOPADDING
  352.         ADD     HL,BC
  353.         LD      A,H
  354.         CP      64
  355.        JR NC,FNDIDLOOP
  356.         RST     0
  357.  
  358. LOADER
  359. ;грузим файл
  360. ;HL указывает на поле координат файла в motorola порядке
  361. ;CY=1: размер в DE
  362. ;CY=0: размер в (HL+4)
  363.        PUSH     DE
  364.         LD      DE,SECTOR
  365.         LD      BC,4
  366.         LDIR   
  367.        POP      DE
  368.         JR C,$+5
  369.          LD     E,(HL)
  370.          INC    HL
  371.          LD     D,(HL)
  372.         EX DE,HL       
  373.         SCF    
  374.         LD      DE,2048
  375.         INC     B
  376.         SBC     HL,DE
  377.         JR NC,$-3
  378.         LD      HL,SECBUF
  379.        PUSH     HL
  380. LOADER0 PUSH    BC
  381.         CALL    READCD
  382.         PUSH    HL
  383.         LD      HL,SECTOR+3
  384.         INC     (HL)
  385.         DEC     HL
  386.         JR Z,$-2
  387.         POP     HL
  388.         POP     BC
  389.         DJNZ    LOADER0
  390.        POP      HL
  391.         RET    
  392.  
  393. ;***************************************************************
  394. ;OUT_A
  395. ;       IFN     smuc
  396. ;      IFN      atm
  397. ;        PUSH   AF,BC
  398. ;        CALL   OPENPORTS
  399. ;        POP    BC,AF
  400. ;        OUT    (C),A
  401. ;        JR     CLOSEPORTS
  402. ;OPENPORTS
  403. ;        LD     A,%10101011
  404. ;        LD     BC,0X2A53
  405. ;        PUSH   BC
  406. ;        LD     BC,0X4177
  407. ;        JP     0X3D2F
  408. ;      ELSE    
  409. ;        LD     IX,0X3FF0
  410. ;        PUSH   IX
  411. ;        JP     0X3D2F
  412. ;      ENDIF   
  413. ;       ELSE    ;nemo
  414. ;        OUT    (C),A
  415. ;        RET   
  416. ;       ENDIF  
  417.  
  418. ;IN_HDDSTAT
  419. ;      LD       A,device
  420. ;      LD       BC,hddhead
  421. ;      CALL     OUT_A
  422. ;        LD     BC,hddstat
  423. ;IN_A
  424. ;       IFN     smuc
  425. ;      IFN      atm
  426. ;        PUSH   BC
  427. ;        CALL   OPENPORTS
  428. ;        POP    BC
  429. ;        IN     A,(C)
  430. ;CLOSEPORTS
  431. ;        PUSH   AF,BC
  432. ;        LD     A,%10101011
  433. ;        LD     BC,0XFF77
  434. ;        OUT    (C),A
  435. ;        POP    BC,AF
  436. ;        RET   
  437. ;      ELSE    
  438. ;        LD     IX,0X3FF3
  439. ;        PUSH   IX
  440. ;        JP     0X3D2F
  441. ;      ENDIF   
  442. ;       ELSE   
  443. ;        IN     A,(C)
  444. ;        RET   
  445. ;       ENDIF  
  446.  
  447. ;ПОСЛАТЬ КОМАНДУ НА ВИНТ
  448. ;HDSC
  449. ;      PUSH     AF
  450. ;      LD       A,device
  451. ;      LD       BC,hddhead
  452. ;      CALL     OUT_A
  453. ;      POP      AF
  454. ;        LD     BC,hddcmd
  455. ;        CALL   OUT_A
  456. ;ОЖИДАНИЕ ОСВОБОЖДЕНИЯ УСТРОЙСТВА
  457. ;NO_BSY
  458. ;        CALL   IN_HDDSTAT
  459. ;        RLCA  
  460. ;       RET     NC
  461. ;        JR     NO_BSY
  462. ;ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАЧИ ДАННЫХ
  463. ;WAIT_DRQ
  464. ;        CALL   IN_HDDSTAT
  465. ;        BIT    3,A
  466. ;       RET     NZ
  467. ;        JR     WAIT_DRQ
  468.  
  469. ;ЧТЕНИE ЧИСЛА ИЗ РЕГИСТРА ЦИЛИНДРА
  470. LEN_TO_HL
  471.         LD      BC,hddcyllo
  472.         CALL    IN_A
  473.         LD      L,A
  474.         LD      BC,hddcylhi
  475.         CALL    IN_A
  476.         LD      H,A
  477.         RET    
  478.  
  479. ;IN:HL-АДРЕС ПРИЕМА ДАННЫХ
  480. ;   BC-КОЛ-ВО БАЙТ
  481. TRANS_IN
  482.         PUSH    BC
  483.         CALL    NO_BSY
  484.        ;POP BC
  485.       ;RET C
  486.        ;PUSH BC
  487.         CALL    WAIT_DRQ
  488.         POP     BC
  489.       ;RET C
  490.         INC     BC
  491.         SRL     B
  492.         RR      C
  493. TR_IN0  PUSH    BC
  494.         LD      BC,hdddatlo
  495.         CALL    IN_A
  496.         LD      (HL),A
  497.         INC     HL
  498.         LD      BC,hdddathi
  499.         CALL    IN_A
  500.         LD      (HL),A
  501.         POP     BC
  502.         CPI    
  503.         JP      PE,TR_IN0
  504.         RET    
  505.  
  506. ;ПЕРЕДАЧА ATAPI-ПАКЕТА
  507. SEND_ATAPI
  508.       ;LD A,device ;0XB0=slave
  509.       ;LD BC,hddhead
  510.       ;CALL OUT_A
  511.         LD      BC,hddcyllo
  512.         XOR     A
  513.         CALL    OUT_A
  514.         LD      BC,hddcylhi
  515.         LD      A,HIGH (2048)
  516.         CALL    OUT_A
  517.         LD      A,0XA0
  518.         CALL    HDSC
  519.       ;RET C
  520.         LD      B,6
  521. TR_OUT0 PUSH    BC
  522.         INC     HL
  523.         LD      A,(HL)
  524.         LD      BC,hdddathi
  525.         CALL    OUT_A
  526.         DEC     HL
  527.         LD      A,(HL)
  528.         LD      BC,hdddatlo
  529.         CALL    OUT_A
  530.         INC     HL
  531.         INC HL
  532.         POP     BC
  533.         DJNZ    TR_OUT0
  534.         RET    
  535. READCDSECBUF
  536.         LD      HL,SECBUF
  537. READCD
  538. ;ЧТЕНИЕ СЕКТОРА
  539. lOAD_SECTOR
  540.        PUSH     HL
  541.         LD      HL,AP_READ
  542.         CALL    SEND_ATAPI
  543.        POP      HL
  544.       ;RET C
  545. ;бывает ситуация,что CHECK CONDITION (D0 статуса)=0,
  546. ;а при этом DRQ не выдается!
  547.        ;CALL IN_HDDSTAT
  548.        ;RRA
  549.       ;RET C
  550.         CALL    NO_BSY ;иначе виснет при иниц-ции CD
  551.       ;RET C
  552.        ;CALL WAIT_DRQ ;здесь виснет, если инитить слишком рано
  553.       ;RET C     ;после выхода разгоняется, ждет кнопку и читает
  554.      ;ожидание DRQ по рецепту Budder'а
  555.         LD      DE,0
  556. RDCDDRQ CALL    IN_HDDSTAT
  557.         BIT     3,A
  558.        JR NZ,READ_P2
  559.         INC     DE
  560.         BIT     2,D ;4,D
  561.         JR Z,RDCDDRQ
  562.         PUSH    HL
  563.         LD      HL,AP_00
  564.         CALL    SEND_ATAPI
  565.         POP     HL
  566.         JR      lOAD_SECTOR
  567. READ_P2
  568.         LD      BC,2048
  569.         CALL    TRANS_IN
  570.         JP      NO_BSY
  571.  
  572. autorunname
  573.         DB      "AUTORUN.ZX"
  574. autorunnamesz   EQU $-autorunname
  575.  
  576. ;ATAPI-ПАКЕТ "ПУСТЫШКА"
  577. AP_00
  578.         DW      0
  579.         DUPL    10,0
  580.  
  581. ;ATAPI-ПАКЕТ "SPEED 1x"
  582. AP_1x
  583.         DW      0XBB
  584.         DB      0
  585.         DB      176 ;1x=176k/s
  586.         DUPL    8,0
  587.  
  588. ;ATAPI-ПАКЕТ "ЧТЕНИЕ"
  589. AP_READ
  590. ;       IFN     0
  591. ;        DW     0XBE   ;"READ CD"
  592. ;SECTOR  DB     0,0,0,0
  593. ;        DB     0
  594. ;        DB     0,1   ;=1 сектор
  595. ;        DB     0X10   ;читаем только данные
  596. ;        DB     0,0
  597. ;       ELSE   
  598.         DW      0X28   ;"READ(10)"
  599. SECTOR  DB      0,0,0,0
  600.         DB      0
  601.         DB      0,1   ;=1 сектор
  602.         DB      0
  603.         DB      0,0
  604. ;       ENDIF  
  605. AP_READTOC
  606.         DW      0X43   ;SCMSF=0,т.е.секторы,а не MSF
  607.         DB      0     ;FORMAT=0:все сессии
  608.         DUPL    3,0
  609.         DB      0     ;с 1-й сессии
  610.         DB      HIGH (2048) ;длина табл
  611.         DB      LOW (2048)
  612.         DB      0X00   ;FUNC
  613.         DUPL    2,0
  614.  
  615. ;end
  616. ;       DISPLAY end-begin
  617. ;        ORG    0X5CDD
  618. ;        DB     "boot    B"
  619. ;        INCLUDE        "mrip.a80"      ;,0XC0
  620.  
  621.         DEPHASE
  622.