Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 05.02.2014 savelij
  3.  
  4. ;сначала компилим atm=0, пакуем ZXRAR header=off
  5. ;потом компилим atm=1
  6. COVPORT         EQU 251
  7. sound           EQU 1
  8. ;atm            EQU 0
  9. smuc            EQU atm
  10. sectcycl        EQU 8 ;1 из них звуковой
  11.  
  12. reaction        EQU 5;4 ;время реакции
  13. z               EQU 6;5    ;задержка относительно Tих/1.7554
  14.  
  15.                 IF smuc=1;       IFN    smuc
  16.                 IF atm=1;      IFN      atm
  17. ;схема ATM:
  18. hddstat         EQU 0XFEEF
  19. hddcmd          EQU 0XFEEF
  20. hddhead         EQU 0XFECF
  21. hddcylhi        EQU 0XFEAF
  22. hddcyllo        EQU 0XFE8F
  23. hddsec          EQU 0XFE6F
  24. hddcount        EQU 0XFE4F
  25. hdderr          EQU 0XFE2F
  26. hdddatlo        EQU 0XFE0F
  27. hdddathi        EQU 0XFF0F
  28. hddupr          EQU 0XFEBE ;при установленном b7 FFBA
  29. hdduprON        EQU 0XFFBA
  30. hddupr1         EQU 0XF7
  31. hddupr0         EQU 0X77
  32.       ELSE     
  33. ;схема SMUC:
  34. hddstat         EQU 0XFFBE
  35. hddcmd          EQU 0XFFBE
  36. hddhead         EQU 0XFEBE
  37. hddcylhi        EQU 0XFDBE
  38. hddcyllo        EQU 0XFCBE
  39. hddsec          EQU 0XFBBE
  40. hddcount        EQU 0XFABE
  41. hdderr          EQU 0XF9BE
  42. hdddatlo        EQU 0XF8BE
  43. hdddathi        EQU 0XD8BE
  44. hddupr          EQU 0XFEBE ;при установленном b7 FFBA
  45. hdduprON        EQU 0XFFBA
  46. hddupr1         EQU 0XF7
  47. hddupr0         EQU 0X77
  48.       ENDIF    
  49.        ELSE    
  50. ;схема Nemo:
  51. hddstat         EQU 0XF0
  52. hddcmd          EQU 0XF0
  53. hddhead         EQU 0XD0
  54. hddcylhi        EQU 0XB0
  55. hddcyllo        EQU 0X90
  56. hddsec          EQU 0X70
  57. hddcount        EQU 0X50
  58. hdderr          EQU 0X30
  59. hdddatlo        EQU 0X10
  60. hdddathi        EQU 0X11
  61. hddupr          EQU 0XC8
  62. hdduprON        EQU 0
  63.        ENDIF   
  64.  
  65. SECBUF          EQU 0XB500
  66. LASTSND         EQU 0XB500
  67. SNDLEN          EQU 2048
  68. pusto           EQU 0XBF00
  69. PROUTBUF        EQU 0XBF00 ;32 bytes спрайт символа
  70. TY              EQU 0XBD00 ;512 ;обязательно для ATM A8=1!!!
  71. RARS            EQU 0X4000 ;для распаковки экранов
  72. addr            EQU 0X9F00 ;для распаковки экранов (<0XA000)
  73.  
  74.                 IF atm=1;       IFN     atm
  75. pgspr           EQU 0X10
  76. pgfnt           EQU 0X10
  77. pgIQ            EQU 0X10
  78. pgpic           EQU 0X14
  79. pgmuz           EQU 0X16
  80. p14             EQU 0X11 ;экр0 слой0
  81. p15             EQU 0X15 ;экр0 слой1
  82. p16             EQU 0X13 ;экр1 слой0 (выводится экр0)
  83. p17             EQU 0X17 ;экр1 слой1
  84. p1C             EQU 0X19 ;экр0 слой0 (выводится экр1)
  85.  
  86. xy2adr        MACRO;    xy2adr
  87. _a := _y*40+_x+0XC004
  88.         ENDM   
  89.        ELSE    
  90. pgspr           EQU 0X10
  91. pgfnt           EQU 0X10
  92. pgIQ            EQU 0X10
  93. pgpic           EQU 0X11
  94. pgmuz           EQU 0X13
  95. p14             EQU 0X14 ;экр0 слой0
  96. p15             EQU 0X15 ;экр0 слой1
  97. p16             EQU 0X16 ;экр1 слой0 (выводится экр0)
  98. p17             EQU 0X17 ;экр1 слой1
  99. p1C             EQU 0X1C ;экр0 слой0 (выводится экр1)
  100.  
  101. xy2adr        MACRO;    xy2adr
  102. _a := (_y&7)<<8+((_y&56)<<2)+((_y&192)<<5)+_x+0XC000
  103.         ENDM   
  104.        ENDIF   
  105.  
  106. outim           MACRO;  outi
  107.        IF       atm=0
  108.         CALL    pause
  109.        ENDIF   
  110.         OUTI   
  111.                 ENDM
  112.  
  113.         ORG     0X6000
  114. begin
  115.         JP      LOADPEX
  116. WASLOA
  117.                 binclude loa16.bin;        INCBIN       "loa16. "
  118. Lloa := $-WASLOA
  119. WASPENT
  120.                 binclude pent.bin;        INCBIN        "PENT. "
  121.                 DUPL 0X7F00-$,0;        DS      0X7F00-$
  122. LOADPEX
  123. ;B=тип компьютера:
  124.  ;0=PENTAGON, 1=ATM, 2=SCORPION, 3=PROFI, 4=SPRINTER
  125.         PUSH    BC
  126.         DEC     B
  127.         POP     BC
  128.         JP      Z,GO ;ATM
  129.        PUSH     AF
  130.        PUSH BC
  131.        PUSH DE
  132.        PUSH HL
  133.   ;depack PENT version
  134.         LD      HL,0X5800
  135.         LD      DE,0X5801
  136.         LD      BC,0X2FF
  137.         LD      (HL),L
  138.         LDIR   
  139.         LD      IX,WASPENT
  140.         LD      DE,0X8200
  141.         LD      HL,0X3E00
  142.         CALL    UNILDRAR ;распаковываем IX->DE (длина=HL)
  143.  
  144.        POP      HL
  145.        POP DE
  146.        POP BC
  147.        POP AF
  148.         JP      GO
  149.                 DUPL 0X8000-$,0;        DS      0X8000-$
  150.                 include smallunr.a80;        INCLUDE    "B:smallunr",0X44
  151.  
  152.   ;дальше заменяемая часть
  153.                 DUPL 0X8200-$,0;        DS      0X8200-$
  154. GO
  155. ;SP=0X6000, DI
  156. ;A=0XA0 (master) или 0XB0 (slave)
  157. ;C=тип контроллера IDE:
  158.  ;0=NEMO, 1=ATM, 2=SMUC, 3=PROFI, 4=SPRINTER
  159. ;D=язык:
  160.  ;0=ENGLISH, 1=РУССКИЙ
  161. ;E=адрес COVOX:
  162.  ;0XFB=ATM/PENTAGON
  163. ;H=доступные видеорежимы (накладываются по OR)
  164.  ;1=512x192 BW VMG
  165.  ;2=384x304 ZX AC
  166.  ;4=256x192 15 AC
  167.  ;8=320x200 16 ATM
  168.         LD      SP,0X8000
  169.        LD       (REG_SDH),A
  170.        LD       A,E
  171.        LD       (varcovport),A
  172.  
  173.       ;LD A,4
  174.       ;OUT (-2),A
  175.  
  176.         LD      BC,32765
  177.         LD      A,0X10
  178.         OUT     (C),A
  179.         LD      HL,WASLOA
  180.         LD      DE,loa
  181.         LD      BC,Lloa
  182.         LDIR   
  183.  
  184.         CALL    CLSATM
  185.  
  186.                 IF 1;      IFN  1
  187.         LD      BC,32765
  188.         LD      A,pgpic
  189.         OUT     (C),A
  190.         LD      HL,0X9F00
  191.         LD      DE,0XC000
  192.         LD      BC,0X2100
  193.         LDIR   
  194.         LD      BC,32765
  195.         LD      A,0X10
  196.         OUT     (C),A
  197.  
  198.       ;LD A,5
  199.       ;OUT (-2),A
  200.  
  201.         LD      HL,loa
  202.         LD      BC,Lloa
  203. ;включаем 2-й экран и стр. с картинками
  204.         LD      A,0X18
  205.         LD      (curplane),A
  206.        LD       IXH,0X00 ;черные поля экрана
  207.         CALL    DEPKS16
  208.  
  209.                 IF atm=1;       IFN     atm
  210.         LD      BC,0XFF77 ;выкл.теневые порты
  211.         LD      A,%10101000 ;EGA
  212.         CALL    OUTSHAD
  213.        ELSE    
  214.          LD     A,0XFE
  215.          IN     A,(0XFE)
  216.          RRA   
  217.         LD      BC,0XEFF7
  218.         LD      A,1
  219.         ;JNC $+4 ;CS - turbo for Pentagon 1024SL 2.2
  220.         ;OR 0X10 ;noturbo for ZX Evo
  221.         OUT     (C),A
  222.        ENDIF   
  223.  
  224.         LD      BC,32765
  225.         LD      A,pgpic
  226.         OUT     (C),A ;вкл 1-й экран
  227.         LD      HL,0XC000
  228.         LD      DE,0X9F00
  229.         LD      BC,0X2100
  230.         LDIR   
  231.         LD      A,0X17
  232.         LD      (curplane),A
  233.  
  234.        LD       DE,0
  235. WAIT1S          REPT 4; DUP     4
  236.        ADD      HL,HL
  237.                 ENDM;       EDUP       
  238.        DEC      DE
  239.        LD       A,D
  240.        OR       E
  241.        JR NZ,WAIT1S
  242.  
  243.       ENDIF    
  244.         LD      BC,32765
  245.         LD      A,0X10
  246.         OUT     (C),A
  247.  
  248.         LD      HL,AP_READTOC
  249.         CALL    SEND_ATAPI
  250.       ;RET C
  251.         CALL    NO_BSY
  252.       ;RET C
  253.         CALL    WAIT_DRQ
  254.       ;RET C
  255.         CALL    LEN_TO_HL
  256.         LD      B,H
  257.         LD C,L
  258.         LD      HL,SECBUF
  259.         CALL    TRANS_IN
  260.         CALL    NO_BSY
  261.  
  262.         CALL    SCANCAT
  263.       ;LD A,4
  264.       ;OUT (-2),A
  265.  
  266.         LD      HL,AP_1x
  267.         CALL    SEND_ATAPI
  268.       ;LD A,5
  269.       ;OUT (-2),A
  270.  
  271.         LD      HL,TY
  272.      ;для 2 битпланов (+0/64), +128 - код нового кадра
  273. MKTY
  274.         LD      A,L
  275.         AND     31
  276.         JR NZ,MKTYN0
  277.                 IF atm=1;      IFN      atm
  278.         LD      DE,0XC004
  279.       ELSE     
  280.         LD      DE,0XC000
  281.       ENDIF    
  282. MKTYN0
  283.          LD     A,L
  284.          AND    31
  285.          CP     24
  286.          JR C,$+5
  287.          LD     DE,0
  288.         LD      (HL),E
  289.         INC     H
  290.         LD      (HL),D
  291.         DEC     H
  292.                 IF atm=1;       IFN     atm
  293.         LD      A,E
  294.         ADD     A,LOW (40*8)
  295.         LD      E,A
  296.         JR NC,$+3
  297.         INC     D
  298.         INC     D
  299.        ELSE    
  300.         LD      A,E
  301.         ADD     A,32
  302.         LD      E,A
  303.         JR NC,$+6
  304.         LD      A,D
  305.         ADD     A,8
  306.         LD      D,A
  307.        ENDIF   
  308.         INC     L
  309.         JR NZ,MKTY
  310.  
  311.         CALL    CLSATM
  312.  
  313.                 IF atm=1;       IFN     atm
  314.         LD      A,%10101000 ;EGA
  315.         CALL    OPENPORTS_A
  316.         LD      A,0XED
  317.         LD      (IN_A),A
  318.         LD      (OUT_A),A
  319.         LD      A,0X78 ;in a,(c)
  320.         LD      (IN_A+1),A
  321.         INC     A    ;out (c),a
  322.         LD      (OUT_A+1),A
  323.         LD      A,0XC9
  324.         LD      (IN_A+2),A
  325.         LD      (OUT_A+2),A
  326.        ELSE    
  327.         LD      BC,0XEFF7
  328.         LD      A,1
  329.         OUT     (C),A
  330.        ENDIF   
  331.  
  332.         LD      DE,0XE00
  333. SHUT0   DEC     D
  334.         CALL    OUTAY
  335.         JR NZ,SHUT0
  336. ;играет тон с огибающей в канале B
  337.         LD      DE,0X7FD
  338.         CALL    OUTAY
  339.         LD      DE,0X910
  340.         CALL    OUTAY
  341.  
  342.        ;LD A,7
  343.        ;OUT (-2),A
  344.  
  345.         LD      HL,TFILES
  346. NEWVIDEO
  347.         LD      DE,SECTOR
  348.         LD      BC,4
  349.         LDIR   
  350.         LD      DE,CUREVENT
  351.         LDI     ;адрес скрипта
  352.         LDI     ;
  353.         LD      DE,CURENDOFVIDEO
  354.         LDI    
  355.         LDI    
  356.  
  357.         LD      HL,LASTSND
  358.         LD      DE,LASTSND+1
  359.         LD      BC,SNDLEN-1
  360.         LD      (HL),0X80
  361.         LDIR   
  362.  
  363.         CALL    READ_P1
  364.        XOR      A
  365.        OUT      (0XFE),A
  366.  
  367.         LD      HL,0
  368.         LD      (SOUNDFRAME),HL
  369.         LD      HL,(CUREVENT)
  370.         LD      E,(HL)
  371.         INC     HL
  372.         LD      D,(HL)
  373.         INC     HL
  374.         LD      (CUREVENT),HL
  375.         LD      (EVENTTIME),DE ;когда будет первое событие
  376.         LD      HL,NEWPLANEOK
  377.         LD      (JPENDOFVIDEO),HL ;после каждого кадра
  378.         XOR     A
  379.         LD      (CURKEY),A ;запрещаем кнопки, пока нет стрелки
  380.        LD       HL,BADBIBIK
  381.        LD       (keySND),HL
  382.  
  383.         EXX    
  384.         LD      HL,LASTSND
  385. varcovport := $+1
  386.         LD      C,COVPORT
  387.         EXX    
  388. SNDLOOP
  389.         CALL    INKEY
  390.         LD      A,C
  391. OLDKEY := $+1
  392.         CP      0
  393.         LD      (OLDKEY),A
  394.         JR Z,KEYOFF ;если сост. кнопок не менялось - обходим
  395. CURKEY := $+1
  396.         LD      A,-1
  397.         CP      -1
  398.         JR NZ,KEYOFF ;если уже нажимали что-то - обходим
  399.         LD      A,C
  400.         LD      (CURKEY),A
  401. NEEDKEY := $+1
  402.         CP      111
  403.         JR Z,KEYGOOD
  404.         INC     A
  405. keySND := $+1
  406.         CALL    NZBADBIBIK ;Z=отпустили, NZ=нажали
  407.                         ;а из интро выходить надо и так,и эдак
  408.         JR      KEYOFF
  409. KEYGOOD
  410.         CALL    GOODBIBIK
  411. KEYOFF
  412. SOUNDFRAME := $+1
  413.         LD      HL,0
  414. EVENTTIME := $+1
  415.         LD      DE,0
  416.         OR      A
  417.         SBC     HL,DE
  418.         ADD     HL,DE
  419.         INC     HL
  420.         LD      (SOUNDFRAME),HL
  421.         JR NZ,NOEVENT
  422. CUREVENT := $+1
  423.         LD      HL,0
  424.         LD      E,(HL) ;тип события
  425.         INC     HL    ;
  426.         LD      D,(HL) ;
  427.         INC     HL
  428.         LD      C,(HL) ;параметр события
  429.         INC     HL    ;
  430.         LD      B,(HL) ;
  431.         INC     HL
  432.         LD      (EVENTPARAM),BC
  433.        PUSH     HL
  434.         LD      ($+5),DE
  435.         CALL    0
  436.        POP      HL
  437.         LD      E,(HL) ;время следующего события
  438.         INC     HL    ;
  439.         LD      D,(HL) ;
  440.         INC     HL
  441.         LD      (EVENTTIME),DE
  442.         LD      (CUREVENT),HL
  443. NOEVENT
  444.  
  445.        IF       sound=0
  446.         LD      IXL,sectcycl-2 ;не -1!
  447.         JP      SECTLOOP
  448.        ENDIF   
  449.        ;чтение сектора звука и доигрывание остатка
  450.      ;доигрываем остаток звука без 128 байт (время чтения)
  451.         LD      C,LOW (hddstat)
  452.         LD      DE,-1
  453.          EXX   
  454.          outim
  455.          EXX   
  456.         LD      HL,pusto
  457. sldoigr
  458.                 IF atm=1;       IFN     atm
  459.         IN      A,(C)
  460.         LD      A,A
  461.          OR     A
  462.          JR C,$+2
  463.         LD      A,H
  464.        IN       A,(LOW (hddstat))
  465.         ADD     A,(HL)
  466.         INC     A
  467.         LD      A,(HL)
  468.         LD      A,A
  469.         ADC     A,H
  470.         SUB     L
  471.         LD      A,A
  472.     PUSH        HL
  473.                 REPT 7;        DUP      8
  474.         INI    
  475.         ADD     HL,DE
  476.                 ENDM;        EDUP      
  477.                 INI;        ORG $-1
  478.         EXX    
  479.         OUTI   
  480.         EXX    
  481.     SET 5,A
  482.                 REPT 7;        DUP      8
  483.         INI    
  484.         ADD     HL,DE
  485.                 ENDM;        EDUP      
  486.                 INI;        ORG $-1
  487.     POP HL
  488.         EXX    
  489.         OUTI   
  490.        ELSE     ;~atm
  491.         IN      A,(LOW (hddstat))
  492.         LD      A,A
  493.          OR     A
  494.          JR C,$+2
  495.        IN       A,(LOW (hddstat))
  496.         ADD     A,(HL)
  497.         INC     A
  498.         LD      A,(HL)
  499.                 REPT 7;        DUP      8
  500.         IN      A,(LOW (hddstat))
  501.         LD      A,(HL)
  502.         INC     H
  503.                 ENDM;        EDUP      
  504.         IN      A,(LOW (hddstat))
  505.         LD      A,(HL)
  506. ;        ORG    $-1
  507.     NOP
  508.         EXX    
  509.         outim
  510.         EXX    
  511.     LD  C,H
  512.     SET 5,A
  513.                 REPT 7;        DUP      8
  514.         IN      A,(LOW (hddstat))
  515.         LD      A,(HL)
  516.         INC     H
  517.                 ENDM;        EDUP      
  518.         IN      A,(LOW (hddstat))
  519.         LD      A,(HL)
  520. ;        ORG    $-1
  521.         EXX    
  522.         outim
  523.        ENDIF   
  524.         LD      A,H
  525.         EXX    
  526.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;        CP    'SNDLEN+'LASTSND-1
  527.         JR C,sldoigr
  528.         EXX    
  529.         LD      HL,LASTSND+SNDLEN-256
  530.         EXX    
  531.         LD      HL,LASTSND
  532.         LD      BC,LOW (hdddatlo+0X0000) ;B=0X00 (2*128)
  533.         LD      DE,0
  534. RDSND0
  535.                 IF atm=1;      IFN      atm
  536.         INC     B
  537.         IN      A,(C)
  538.         DEC     B
  539.          OR     A
  540.          JR C,$+2
  541.         EXX    
  542.         OUTI   
  543.         EXX    
  544.        IN       A,(LOW (hddstat))
  545.         ADD     A,(HL)
  546.         INC     A
  547.         LD      A,(HL)
  548.         LD      A,A
  549.         ADC     A,H
  550.         SUB     L
  551.         LD      A,A
  552.                 REPT 7;        DUP      8
  553.         INI    
  554.         ADD     HL,DE
  555.                 ENDM;        EDUP      
  556.                 INI;        ORG $-1
  557.     PUSH        HL
  558.     POP HL
  559.     SET 5,A
  560.         EXX    
  561.         OUTI   
  562.         EXX    
  563.                 REPT 7;        DUP      8
  564.         INI    
  565.         ADD     HL,DE
  566.                 ENDM;        EDUP      
  567.                 INI;        ORG $-1
  568.        ELSE     ;~atm
  569.         IN      A,(LOW (hddstat))
  570.          OR     A
  571.          JR C,$+2
  572.         EXX    
  573.         outim
  574.         EXX    
  575.        IN       A,(LOW (hddstat))
  576.         ADD     A,(HL)
  577.         INC     A
  578.         LD      A,A
  579.                 REPT 4;        DUP      4
  580.         IN      A,(LOW (hdddatlo))
  581.         LD      (HL),A
  582.         INC     L
  583.         IN      A,(LOW (hdddathi))
  584.         LD      (HL),A
  585.         INC     L
  586.                 ENDM;        EDUP      
  587.     LD  C,H
  588.     SET 5,A
  589.         EXX    
  590.         outim
  591.         EXX    
  592.                 REPT 3;        DUP      4
  593.         IN      A,(LOW (hdddatlo))
  594.         LD      (HL),A
  595.         INC     L
  596.         IN      A,(LOW (hdddathi))
  597.         LD      (HL),A
  598.         INC     L
  599.                 ENDM;        EDUP      
  600.         IN      A,(LOW (hdddatlo))
  601.         LD      (HL),A
  602.         INC     L
  603.         IN      A,(LOW (hdddathi))
  604.         LD      (HL),A
  605. ;        ORG    $-1
  606.         INC     HL
  607.        ENDIF   
  608.         LD      A,H
  609.                 CP HIGH (SNDLEN+LASTSND);        CP     'SNDLEN+'LASTSND
  610.         JR C,RDSND0
  611.         EXX    
  612.         LD      HL,LASTSND
  613.         outim
  614.         EXX    
  615.         LD      IXL,sectcycl
  616.         JP      LOOPNEXTSEC ;1-е знакоместо - с битом 7
  617. NEWPLANE
  618.        IF       atm=0
  619.        IN       A,(LOW (hdddathi))
  620.        ENDIF   
  621. curplane := $+1
  622.         LD      A,0X17
  623. ;порядок обработки: SCR0(lo,hi), SCR1(lo,hi)
  624.                        ;0X1C,0X1D      0X16,0X17
  625.                   ;ATM ;0X19,0X1D      0X13,0X17
  626.                 IF atm=1;      IFN      atm
  627.         XOR     4
  628.         BIT     2,A
  629.       ELSE     
  630.         XOR     1
  631.         BIT     0,A
  632.       ENDIF    
  633.         JR NZ,NONEWSCR
  634.         XOR     0X1C!0X16 ;=0X19!0X13 ;=0X0A
  635.         INC     L
  636.         JP      Z,ENDOFVIDEO
  637.         DEC     L
  638. JPENDOFVIDEO := $+1
  639.         JP      NEWPLANEOK ;ENDOFVIDEODEAD; ENDOFVIDEO
  640. NEWPLANEOK
  641. NONEWSCR
  642.         LD      (curplane),A
  643.        PUSH     BC
  644.         LD      BC,32765
  645.         OUT     (C),A
  646.        POP      BC
  647.         JP      NEWPLQ
  648. SECTLOOP
  649.                 IF atm=1;       IFN     atm
  650.         LD      BC,0XF20F ;B=0XF2 (18*113)
  651.         LD      DE,39
  652.        ELSE    
  653.         LD      B,113
  654.        ENDIF   
  655.          EXX   
  656.          outim
  657.          EXX   
  658. FRAMELOOP
  659.                 IF atm=1;       IFN     atm
  660.         IN      A,(C)
  661.        ELSE    
  662.         IN      A,(LOW (hdddatlo))
  663.        ENDIF   
  664.         LD      L,A
  665.          RLA   
  666.          JR C,NEWPLANE
  667. NEWPLQ  LD      H,HIGH (TY);'TY        ;22
  668.                 IF atm=1;       IFN     atm
  669.         LD      A,H
  670.        ENDIF   
  671.        IN       A,(LOW (hdddathi))
  672.         ADD     A,(HL)
  673.         INC     H
  674.         LD      H,(HL)
  675.         LD      L,A          ;33
  676.                 IF atm=1;       IFN     atm
  677.         ADC     A,H
  678.         SUB     L
  679.         LD      H,A
  680.     PUSH        HL
  681.        ELSE    
  682.     LD  C,H              ;4
  683.        ENDIF   
  684.      ;HL=screen
  685.                 IF atm=1;       IFN     atm
  686.                 REPT 7;        DUP      8
  687.         INI    
  688.         ADD     HL,DE
  689.                 ENDM;        EDUP      
  690.                 INI
  691.        ELSE    
  692.                 REPT 3;        DUP      4
  693.         IN      A,(LOW (hdddatlo))
  694.         LD      (HL),A
  695.         INC     H
  696.         IN      A,(LOW (hdddathi))
  697.         LD      (HL),A
  698.         INC     H
  699.                 ENDM;        EDUP      
  700.         IN      A,(LOW (hdddatlo))
  701.         LD      (HL),A
  702.         INC     H
  703.         IN      A,(LOW (hdddathi))
  704.         LD      (HL),A
  705.        ENDIF   
  706. ;        ORG    $-1
  707.                          ;172
  708.                 IF sound=1;       IFN   sound
  709.         EXX    
  710.         outim
  711.         EXX                  ;24
  712.        ENDIF   
  713.                 IF atm=1;       IFN     atm
  714.     POP HL
  715.        ELSE    
  716.     LD  H,C
  717.        ENDIF   
  718.     SET 5,H              ;12
  719.                 IF atm=1;       IFN     atm
  720.                 REPT 7;        DUP      8
  721.         INI    
  722.         ADD     HL,DE
  723.                 ENDM;        EDUP      
  724.                 INI
  725.        ELSE    
  726.                 REPT 3;        DUP      4
  727.         IN      A,(LOW (hdddatlo))
  728.         LD      (HL),A
  729.         INC     H
  730.         IN      A,(LOW (hdddathi))
  731.         LD      (HL),A
  732.         INC     H
  733.                 ENDM;        EDUP      
  734.         IN      A,(LOW (hdddatlo))
  735.         LD      (HL),A
  736.         INC     H
  737.         IN      A,(LOW (hdddathi))
  738.         LD      (HL),A
  739.        ENDIF   
  740. ;        ORG    $-1
  741.                          ;172
  742.                 IF atm=1;       IFN     atm
  743.         DEC     B ;для четности порта данных
  744.        ENDIF   
  745.                 IF sound=1;       IFN   sound
  746.         EXX    
  747.         outim
  748.         EXX                  ;24
  749.        ENDIF   
  750.         DJNZ    FRAMELOOP   ;13 ;476 PENT / 576 ATM
  751.       ;остаток сектора (14 байт)
  752.                 REPT 7;        DUP      7
  753.                 IF atm=1;       IFN     atm
  754.         IN      A,(C)
  755.        ELSE    
  756.         IN      A,(LOW (hdddatlo))
  757.        IN       A,(LOW (hdddathi)) ;ZX Evo fix
  758.        ENDIF   
  759.                 ENDM;        EDUP                   ;77 PENT / 84 ATM
  760. LOOPNEXTSEC
  761.         LD      HL,SECTOR+3
  762.         INC     (HL)
  763.         DEC     HL
  764.         JR Z,$-2           ;29*N-5 (можно считать 24)
  765.  
  766.    ;типы команд должны совпадать с теми, к-е в главном цикле
  767.         LD      C,LOW (hddstat)
  768.         LD      DE,-1
  769.         LD      HL,pusto
  770.         EXX    
  771.         outim
  772.         EXX                  ;24
  773. BSYDOATAPI
  774.                 IF atm=1;       IFN     atm
  775.         IN      A,(C)
  776.         LD      A,A
  777.         LD      A,H
  778.         INC     A
  779.         ADC     A,H
  780.         SUB     L
  781.         LD      A,A
  782.     PUSH        HL
  783.                 REPT 7;        DUP      8
  784.         INI    
  785.         ADD     HL,DE
  786.                 ENDM;        EDUP      
  787.                 INI;        ORG $-1
  788.         EXX    
  789.        LD       A,H
  790.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  791.        JR NC,$+4
  792.         OUTI   
  793.         EXX    
  794.                 REPT 7;        DUP      8
  795.         INI    
  796.         ADD     HL,DE
  797.                 ENDM;        EDUP      
  798.                 INI;        ORG $-1
  799.     POP HL
  800.         EXX    
  801.        LD       A,H
  802.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  803.        JR NC,$+4
  804.         OUTI   
  805.         EXX    
  806.         XOR     A
  807.        ELSE     ;~atm
  808.         IN      A,(LOW (hddstat))
  809.         LD      A,A
  810.                 REPT 7;        DUP      8
  811.         IN      A,(LOW (hddstat))
  812.         LD      A,(HL)
  813.         INC     H
  814.                 ENDM;        EDUP      
  815.         IN      A,(LOW (hddstat))
  816.         LD      A,(HL)
  817. ;        ORG    $-1
  818.         EXX    
  819.        NOP     
  820.        LD       A,H
  821.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  822.        JR NC,_nouti
  823.         outim
  824. _nouti
  825.         EXX    
  826.        SET      5,A
  827.                 REPT 7;        DUP      8
  828.         IN      A,(LOW (hddstat))
  829.         LD      A,(HL)
  830.         INC     H
  831.                 ENDM;        EDUP      
  832.         IN      A,(LOW (hddstat))
  833.         LD      A,(HL)
  834. ;        ORG    $-1
  835.         EXX    
  836.        LD       A,H
  837.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  838.        JR NC,_nouti2
  839.         outim
  840. _nouti2
  841.         EXX    
  842.        ENDIF   
  843.         IN      A,(LOW (hddstat))
  844.         BIT     7,A
  845.         JR NZ,BSYDOATAPI
  846.  
  847. ;SEND_ATAPI
  848.         LD      A,(REG_SDH)
  849.        ;AND 16
  850.        ;OR 0XA0
  851.         OUT     (LOW (hddhead)),A  ;38
  852.         XOR     A
  853.         OUT     (LOW (hddcyllo)),A ;15
  854.         LD      A,8
  855.         OUT     (LOW (hddcylhi)),A ;18
  856.         LD      A,0XA0
  857.         OUT     (LOW (hddcmd)),A   ;18
  858.  
  859.         LD      C,LOW (hddstat)
  860.         LD      DE,-1
  861.          EXX   
  862.          outim
  863.          EXX   
  864.         LD      HL,pusto
  865. sAdrq
  866.                 IF atm=1;       IFN     atm
  867.         IN      A,(C)
  868.         LD      A,A
  869.         LD      A,H
  870.         INC     A
  871.         ADC     A,H
  872.         SUB     L
  873.         LD      A,A
  874.     PUSH        HL
  875.                 REPT 7;        DUP      8
  876.         INI    
  877.         ADD     HL,DE
  878.                 ENDM;        EDUP      
  879.                 INI;        ORG $-1
  880.         EXX    
  881.        LD       A,H
  882.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  883.        JR NC,$+4
  884.         OUTI   
  885.         EXX    
  886.                 REPT 7;        DUP      8
  887.         INI    
  888.         ADD     HL,DE
  889.                 ENDM;        EDUP      
  890.                 INI;        ORG $-1
  891.     POP HL
  892.         EXX    
  893.        LD       A,H
  894.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  895.        JR NC,$+4
  896.         OUTI   
  897.         EXX    
  898.         XOR     A
  899.        ELSE     ;~atm
  900.         IN      A,(LOW (hddstat))
  901.         LD      A,A
  902.                 REPT 7;        DUP      8
  903.         IN      A,(LOW (hddstat))
  904.         LD      A,(HL)
  905.         INC     H
  906.                 ENDM;        EDUP      
  907.         IN      A,(LOW (hddstat))
  908.         LD      A,(HL)
  909. ;        ORG    $-1
  910.         EXX    
  911.        NOP     
  912.        LD       A,H
  913.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  914.        JR NC,_nouti3
  915.         outim
  916. _nouti3
  917.         EXX    
  918.        SET      5,A
  919.                 REPT 7;        DUP      8
  920.         IN      A,(LOW (hddstat))
  921.         LD      A,(HL)
  922.         INC     H
  923.                 ENDM;        EDUP      
  924.         IN      A,(LOW (hddstat))
  925.         LD      A,(HL)
  926. ;        ORG    $-1
  927.         EXX    
  928.        LD       A,H
  929.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  930.        JR NC,_nouti4
  931.         outim
  932. _nouti4
  933.         EXX    
  934.        ENDIF   
  935.         IN      A,(LOW (hddstat))
  936.         BIT     3,A
  937.         JR Z,sAdrq
  938.  
  939.         LD      HL,AP_READ
  940.                 REPT 2;       DUP       2
  941.                 IF atm=1;       IFN     atm
  942.         INC     HL
  943.         LD      A,(HL)
  944.         LD      BC,hdddathi
  945.         OUT     (C),A
  946.         DEC     HL
  947.         LD      A,(HL)
  948.         LD      BC,hdddatlo
  949.         OUT     (C),A
  950.         INC     HL
  951.         INC HL        ;117*2=244(+10)
  952.                 DUPL 7,0;        DS     7
  953.        ELSE    
  954.         LD      C,(HL)
  955.         INC     HL
  956.         LD      A,(HL)
  957.         OUT     (LOW (hdddathi)),A
  958.         LD      A,C
  959.         OUT     (LOW (hdddatlo)),A
  960.         INC     HL           ;52
  961.        ENDIF   
  962.                 ENDM;       EDUP       
  963.          EXX   
  964.          outim
  965.          EXX   
  966.                 REPT 2;       DUP       2
  967.                 IF atm=1;       IFN     atm
  968.         INC     HL
  969.         LD      A,(HL)
  970.         LD      BC,hdddathi
  971.         OUT     (C),A
  972.         DEC     HL
  973.         LD      A,(HL)
  974.         LD      BC,hdddatlo
  975.         OUT     (C),A
  976.         INC     HL
  977.         INC HL        ;117*2=244(+22)
  978.                 DUPL 7,0;        DS     7
  979.        ELSE    
  980.         LD      C,(HL)
  981.         INC     HL
  982.         LD      A,(HL)
  983.         OUT     (LOW (hdddathi)),A
  984.         LD      A,C
  985.         OUT     (LOW (hdddatlo)),A
  986.         INC     HL           ;52
  987.        ENDIF   
  988.                 ENDM;       EDUP       
  989.          EXX   
  990.          outim
  991.          EXX   
  992.  
  993.                 REPT 2;       DUP       2
  994.                 IF atm=1;       IFN     atm
  995.         INC     HL
  996.         LD      A,(HL)
  997.         LD      BC,hdddathi
  998.         OUT     (C),A
  999.         DEC     HL
  1000.         LD      A,(HL)
  1001.         LD      BC,hdddatlo
  1002.         OUT     (C),A
  1003.         INC     HL
  1004.         INC HL        ;
  1005.        ELSE    
  1006.         LD      C,(HL)
  1007.         INC     HL
  1008.         LD      A,(HL)
  1009.         OUT     (LOW (hdddathi)),A
  1010.         LD      A,C
  1011.         OUT     (LOW (hdddatlo)),A
  1012.         INC     HL           ;52
  1013.        ENDIF   
  1014.                 ENDM;       EDUP       
  1015.      ;(где-то 2000 тактов ищет)
  1016.      ;(точнее, 20000 каждый 10-й раз)
  1017.           ;XOR A
  1018.           ;IN A,(hddstat)
  1019.           ;RLCA       ;BSY
  1020.           ;JC $-4
  1021.         LD      C,LOW (hddstat)
  1022.         LD      DE,-1
  1023.          EXX   
  1024.          outim
  1025.          EXX   
  1026.         LD      HL,pusto
  1027. sldrq
  1028.                 IF atm=1;       IFN     atm
  1029.         IN      A,(C)
  1030.         LD      A,A
  1031.         LD      A,H
  1032.         INC     A
  1033.         ADC     A,H
  1034.         SUB     L
  1035.         LD      A,A
  1036.     PUSH        HL
  1037.                 REPT 7;        DUP      8
  1038.         INI    
  1039.         ADD     HL,DE
  1040.                 ENDM;        EDUP      
  1041.                 INI;        ORG $-1
  1042.         EXX    
  1043.        LD       A,H
  1044.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  1045.        JR NC,$+4
  1046.         OUTI   
  1047.         EXX    
  1048.                 REPT 7;        DUP      8
  1049.         INI    
  1050.         ADD     HL,DE
  1051.                 ENDM;        EDUP      
  1052.                 INI;        ORG $-1
  1053.     POP HL
  1054.         EXX    
  1055.        LD       A,H
  1056.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  1057.        JR NC,$+4
  1058.         OUTI   
  1059.         EXX    
  1060.         XOR     A
  1061.        ELSE     ;~atm
  1062.         IN      A,(hddstat)
  1063.         LD      A,A
  1064.                 REPT 7;        DUP      8
  1065.         IN      A,(hddstat)
  1066.         LD      A,(HL)
  1067.         INC     H
  1068.                 ENDM;        EDUP      
  1069.         IN      A,(hddstat)
  1070.         LD      A,(HL)
  1071. ;        ORG    $-1
  1072.         EXX    
  1073.        NOP     
  1074.        LD       A,H
  1075.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  1076.        JR NC,_nouti5
  1077.         outim
  1078. _nouti5
  1079.         EXX    
  1080.        SET      5,A
  1081.                 REPT 7;        DUP      8
  1082.         IN      A,(hddstat)
  1083.         LD      A,(HL)
  1084.         INC     H
  1085.                 ENDM;        EDUP      
  1086.         IN      A,(hddstat)
  1087.         LD      A,(HL)
  1088. ;        ORG    $-1
  1089.         EXX    
  1090.        LD       A,H
  1091.                 CP HIGH (SNDLEN)+HIGH (LASTSND)-1;       CP     'SNDLEN+'LASTSND-1
  1092.        JR NC,_nouti6
  1093.         outim
  1094. _nouti6
  1095.         EXX    
  1096.        ENDIF   
  1097.         IN      A,(LOW (hddstat))
  1098.         BIT     3,A
  1099.         JR Z,sldrq
  1100.  
  1101.         DEC     IXL
  1102.         JP      NZ,SECTLOOP
  1103.        IF       sound=0
  1104.         EXX    
  1105.         LD      HL,LASTSND
  1106.         EXX    
  1107.         LD      IXL,sectcycl-1
  1108.         LD      HL,SECTOR+3
  1109.         INC     (HL)
  1110.         DEC     HL
  1111.         JR Z,$-2           ;29*N-5 (можно считать 24)
  1112.         JP      SECTLOOP
  1113.        ELSE    
  1114.         JP      SNDLOOP
  1115.        ENDIF   
  1116.  
  1117. ENDOFVIDEO
  1118.         CALL    CLSATM
  1119.                 IF 0;       IFN 0
  1120.         LD      HL,LEVEL
  1121.         INC     (HL)
  1122.         LD      A,(HL)
  1123.         CP      16
  1124.         JR C,EOVNOPRINT
  1125.  
  1126.         LD      A,(LIVES)
  1127.         ADD     A,"0"
  1128.         LD      (TLIVESN),A
  1129.         LD      HL,TLIVES
  1130. _y := 96
  1131. _x := 9
  1132.         xy2adr
  1133.         LD      DE,_a
  1134.         CALL    PRW
  1135.  
  1136.         LD      A,(LEVEL)
  1137.         CALL    CODEDIG
  1138.         LD      A,(LIVES)
  1139.         CALL    CODEDIG
  1140.         LD      A,(SCORE)
  1141.         CALL    CODEDIG
  1142.         LD      A,(SCORE+1)
  1143.         CALL    CODEDIG
  1144.         LD      HL,(SCORE)
  1145.         LD      A,(LIVES)
  1146.         XOR     L
  1147.         XOR     H
  1148.         LD      L,A
  1149.         LD      A,(LEVEL)
  1150.         XOR     L
  1151.         CALL    CODEDIG
  1152.         LD      HL,TCODEN
  1153.         LD      B,8
  1154. TCODELET0
  1155.         LD      A,(HL)
  1156.         AND     31
  1157.         ADD     A,"0"
  1158.         CP      ":"
  1159.         JR C,$+4
  1160.         ADD A,0X41-0X3A;        A,"A"-":"
  1161.         LD      (HL),A
  1162.         INC     HL
  1163.         DJNZ    TCODELET0
  1164.  
  1165.         LD      HL,TCODE
  1166. _y := 80
  1167. _x := 9
  1168.         xy2adr
  1169.         LD      DE,_a
  1170.         CALL    PRW
  1171. EOVNOPRINT
  1172.        ENDIF   
  1173. ENDOFVIDEODEAD
  1174. CURENDOFVIDEO := $+1
  1175.         LD      HL,TFILES
  1176.        PUSH     HL
  1177.         LD      HL,LASTSND
  1178.         CALL    READ_P2
  1179.        POP      HL
  1180.         JP      NEWVIDEO
  1181.  
  1182. CODEDIG
  1183.         LD      HL,TCODEN
  1184.         LD      B,8
  1185. CODEDIG0
  1186.         RLA    
  1187.         RL      (HL)
  1188.         INC     HL
  1189.         DJNZ    CODEDIG0
  1190.         RET    
  1191.  
  1192. TLIVES  DB      "   LIVES: 0",0
  1193. TLIVESN := $-2
  1194. TCODE   DB      "CODE: 00000000",0
  1195. TCODEN := $-9
  1196.  
  1197. PRW
  1198. ;C=фоновый цвет (в виде атрибута)
  1199.         LD      C,0
  1200. ;IX=таблица раскраски буквы по строкам
  1201.         LD      IX,BUK_W
  1202.         CALL    PRTXT88
  1203.         LD      A,(curplane)
  1204.         LD      BC,32765
  1205.         OUT     (C),A
  1206.         RET    
  1207. INKEY
  1208. ;C=11LRDUBF (B=break)
  1209.         LD      A,254
  1210.         IN      A,(254)
  1211.         RRA    
  1212.         LD      A,239
  1213.         IN      A,(254)
  1214.         JR      C,UANOCAP
  1215.         LD      C,0XFF
  1216.         RRA         ;CS+"0" = "0"
  1217.         JR C,$+3
  1218.         DEC     C
  1219.         RRA    
  1220.         RRA         ;CS+"8"
  1221.         JR C,$+4
  1222.         RES     4,C
  1223.         RRA         ;CS+"7"
  1224.         JR C,$+4
  1225.         RES     2,C
  1226.         RRA         ;CS+"6"
  1227.         JR C,$+4
  1228.         RES     3,C
  1229.         LD      A,0XF7
  1230.         IN      A,(254)
  1231.         BIT     4,A ;CS+"5"
  1232.         JR NZ,$+4
  1233.         RES     5,C
  1234.         RLA         ;CS+"1"
  1235.         JR C,INKEYF
  1236.         RES     1,C
  1237.         JR      INKEYF
  1238. UANOCAP
  1239.         RRCA   
  1240.         RLA    
  1241.         RLA    
  1242.         OR      0XC2
  1243.         LD      C,A
  1244.         LD      A,0XDF
  1245.         IN      A,(254)
  1246.         RRA         ;"P"
  1247.         JR      C,$+4
  1248.         RES     4,C
  1249.         RRA         ;"O"
  1250.         JR      C,$+4
  1251.         RES     5,C
  1252.         LD      A,0XFB
  1253.         IN      A,(254)
  1254.         RRA         ;"Q"
  1255.         JR      C,$+4
  1256.         RES     2,C
  1257.         RRA    
  1258.         RRA         ;"E"
  1259.         JR      C,$+4
  1260.         RES     1,C
  1261.         LD      A,0XFD
  1262.         IN      A,(254)
  1263.         RRA         ;"A"
  1264.         JR C,$+4
  1265.         RES     3,C
  1266. INKEYF  LD      A,0X7F
  1267.         IN      A,(254)
  1268.         CPL    
  1269.         AND     31
  1270.         RET     Z
  1271.         RES     0,C
  1272.         RET    
  1273.  
  1274. CLSATM
  1275.                 REPT 2;       DUP       2
  1276. ;чистим невидимый экран
  1277.         CALL    CLSATMPLANE
  1278. ;переключаем экран
  1279.         LD      A,(curplane)
  1280.         XOR     8
  1281.         LD      (curplane),A
  1282.                 ENDM;       EDUP       
  1283.         RET    
  1284. ;чистим невидимый экран
  1285. CLSATMPLANE
  1286.         LD      A,(curplane)
  1287.         AND     0X18
  1288.         LD      C,A
  1289.         CPL    
  1290.         RRA    
  1291.         RRA    
  1292.         AND     2
  1293.         OR      C
  1294.         OR      5
  1295.         CALL    CLSPG
  1296.                 IF atm=1;       IFN     atm
  1297.         SUB     4
  1298.        ELSE    
  1299.         DEC     A
  1300.        ENDIF   
  1301. CLSPG   LD      BC,32765
  1302.         OUT     (C),A
  1303.         LD      HL,0XC000
  1304.         CALL    CLS7999
  1305.         LD      HL,0XE000
  1306. CLS7999 LD      BC,7999
  1307. CLSI1   LD      D,H
  1308.                 LD E,1
  1309.         LD      (HL),L
  1310.         LDIR   
  1311.         RET    
  1312.  
  1313. SCANCAT
  1314.      ;берем посл сессию (предпосл запись)
  1315.         LD      HL,SECBUF+1
  1316.         LD      A,(HL)
  1317.         ADD     A,-10
  1318.         LD      L,A
  1319. ;грузим начало сессии (17*0X800 байт)
  1320.         LD      D,7
  1321.         CALL    LOADER
  1322.         LD      B,16
  1323. SCANL0  PUSH    BC
  1324.         LD      B,1
  1325.         CALL    LOADERLOOP
  1326.         POP     BC
  1327.         DJNZ    SCANL0
  1328.         LD      C,0XA2
  1329.         ADD     HL,BC
  1330.        ;CY=0
  1331.         CALL    LOADER ;грузим корневой каталог
  1332.        ;HL=SECBUF
  1333.         LD      DE,TFILES
  1334. FNDNEWFILE
  1335.         LD      HL,SECBUF
  1336. FNDFILELOOP
  1337.        PUSH     HL
  1338.         LD      C,33
  1339.         ADD     HL,BC
  1340.         LD      C,4
  1341.        PUSH     DE
  1342. FNDFI0  LD      A,(DE)
  1343.         CPI    
  1344.        JR NZ,FNDFIN
  1345.         INC     DE
  1346.         JP      PE,FNDFI0
  1347.        POP      DE
  1348.        POP      HL
  1349.         LD      C,6
  1350.         ADD     HL,BC
  1351.         LD      C,4
  1352.         LDIR   
  1353. FNDFIOK         REPT 4
  1354.                 INC     DE
  1355.                 ENDM
  1356.         LD      A,D
  1357.                 CP HIGH (ENDFILES);        CP   'ENDFILES
  1358.         JR NZ,FNDNEWFILE
  1359.         LD      A,E
  1360.         CP      LOW (ENDFILES)
  1361.         JR NZ,FNDNEWFILE
  1362.         RET    
  1363. FNDFIN
  1364.        POP      DE
  1365.        POP      HL
  1366. PADDIN0 LD      C,(HL)
  1367.         INC     HL
  1368.         LD      B,(HL)
  1369.         DEC     HL
  1370.        LD       A,B
  1371.        OR       C
  1372.        JR NZ,NOPADDING
  1373.         INC     H
  1374.         LD      L,A
  1375. NOPADDING
  1376.        INC      B
  1377.        DJNZ     CATEND ;B<>0
  1378.         ADD     HL,BC
  1379.         LD      A,H
  1380.         CP      64
  1381.        JR NC,FNDFILELOOP
  1382. CATEND
  1383.         LD      A,-2 ;нет файла
  1384.         LD      (DE),A
  1385.                 REPT 4
  1386.         INC     DE
  1387.                 ENDM
  1388.         JR      FNDFIOK
  1389.  
  1390. LOADER
  1391. ;грузим файл
  1392. ;HL указывает на поле координат файла в motorola порядке
  1393. ;CY=1: размер в DE
  1394. ;CY=0: размер в (HL+4)
  1395.        PUSH     DE
  1396.         LD      DE,SECTOR
  1397.         LD      BC,4
  1398.         LDIR   
  1399.        POP      DE
  1400.         JR C,$+5
  1401.          LD     E,(HL)
  1402.          INC    HL
  1403.          LD     D,(HL)
  1404.         EX DE,HL       
  1405.         SCF    
  1406.         LD      DE,2048
  1407.         INC     B
  1408.         SBC     HL,DE
  1409.         JR NC,$-3
  1410. LOADERLOOP
  1411.         LD      HL,SECBUF
  1412.        PUSH     HL
  1413. LOADER0 PUSH    BC
  1414.         CALL    READCD
  1415.        CALL     READ_P2 ;!!! в буте он входит в READCD
  1416.        LD       BC,2048
  1417.        ADD      HL,BC
  1418.         PUSH    HL
  1419.         LD      HL,SECTOR+3
  1420.         INC     (HL)
  1421.         DEC     HL
  1422.         JR Z,$-2
  1423.         POP     HL
  1424.         POP     BC
  1425.         DJNZ    LOADER0
  1426.        POP      HL
  1427.         RET    
  1428.  
  1429. READ_P1
  1430.        PUSH     BC
  1431.        PUSH DE
  1432.        PUSH HL
  1433.         CALL    READCD
  1434.        POP      HL
  1435.        POP DE
  1436.        POP BC
  1437.         RET    
  1438. READ_P2
  1439.        PUSH     BC
  1440.        PUSH DE
  1441.        PUSH HL
  1442.         CALL    READ_S
  1443.         CALL    READ_S
  1444.         CALL    READ_S
  1445.         CALL    READ_S
  1446.         CALL    NO_BSY
  1447.        POP      HL
  1448.        POP DE
  1449.        POP BC
  1450.         RET    
  1451. NXTSEC
  1452.        PUSH     HL
  1453.         LD      HL,SECTOR+3
  1454.         INC     (HL)
  1455.         DEC     HL
  1456.         JR Z,$-2
  1457.        POP      HL
  1458.         RET    
  1459.  
  1460.                 IF atm=1;       IFN     atm
  1461. OUTSHAD
  1462.         LD      IX,10835
  1463.         PUSH    IX
  1464.         JP      0X3D2F
  1465.        ENDIF   
  1466.  
  1467. ;ЧТЕНИЕ 512 байт
  1468. READ_S
  1469.                 IF smuc=1;       IFN    smuc
  1470.         LD      B,0
  1471. READ_S0 PUSH    BC
  1472.         LD      BC,hdddatlo
  1473.         CALL    IN_A
  1474.         LD      (HL),A
  1475.         INC     HL
  1476.         LD      BC,hdddathi
  1477.         CALL    IN_A
  1478.         LD      (HL),A
  1479.         INC     HL
  1480.         POP     BC
  1481.         DJNZ    READ_S0
  1482.        ELSE     ;nemo
  1483.         LD      C,hdddatlo
  1484.                 REPT 256;        DUP    256
  1485.         INI    
  1486.         INC     C
  1487.         INI    
  1488.         DEC     C
  1489.                 ENDM;        EDUP      
  1490.        ENDIF   
  1491.         RET    
  1492.  
  1493. OUT_A
  1494.                 IF smuc=1;       IFN    smuc
  1495.                 IF atm=1;      IFN      atm
  1496.         PUSH    AF
  1497.         PUSH BC
  1498.         CALL    OPENPORTS
  1499.         POP     BC
  1500.         POP AF
  1501.         OUT     (C),A
  1502.         JR      CLOSEPORTS
  1503. OPENPORTS
  1504.         LD      A,%10101000;11
  1505. OPENPORTS_A
  1506.         LD      BC,0X2A53
  1507.         PUSH    BC
  1508.         LD      BC,0X4177
  1509.         JP      0X3D2F
  1510.       ELSE     
  1511.         LD      IX,0X3FF0
  1512.         PUSH    IX
  1513.         JP      0X3D2F
  1514.       ENDIF    
  1515.        ELSE     ;nemo
  1516.         OUT     (C),A
  1517.         RET    
  1518.        ENDIF   
  1519.  
  1520. IN_HDDSTAT
  1521.         LD      BC,hddstat
  1522. IN_A
  1523.                 IF smuc=1;       IFN    smuc
  1524.                 IF atm=1;      IFN      atm
  1525.         PUSH    BC
  1526.         CALL    OPENPORTS
  1527.         POP     BC
  1528.         IN      A,(C)
  1529. CLOSEPORTS
  1530.         PUSH    AF
  1531.         PUSH BC
  1532.         LD      A,%10101000;11
  1533.         LD      BC,0XFF77
  1534.         OUT     (C),A
  1535.         POP     BC
  1536.         POP AF
  1537.         RET    
  1538.       ELSE     
  1539.         LD      IX,0X3FF3
  1540.         PUSH    IX
  1541.         JP      0X3D2F
  1542.       ENDIF    
  1543.        ELSE    
  1544.         IN      A,(C)
  1545.         RET    
  1546.        ENDIF   
  1547.  
  1548. ;ПОСЛАТЬ КОМАНДУ НА ВИНТ
  1549. HDSC
  1550.         LD      BC,hddcmd
  1551.         CALL    OUT_A
  1552. ;ОЖИДАНИЕ ОСВОБОЖДЕНИЯ УСТРОЙСТВА
  1553. NO_BSY
  1554.         CALL    IN_HDDSTAT
  1555.         RLCA   
  1556.         RET     NC
  1557.         JR      NO_BSY
  1558. ;ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАЧИ ДАННЫХ
  1559. WAIT_DRQ
  1560.         CALL    IN_HDDSTAT
  1561.        OR       A
  1562.         BIT     3,A
  1563.         RET     NZ
  1564.         JR      WAIT_DRQ
  1565.  
  1566. ;ЧТЕНИE ЧИСЛА ИЗ РЕГИСТРА ЦИЛИНДРА
  1567. LEN_TO_HL
  1568.         LD      BC,hddcyllo
  1569.         CALL    IN_A
  1570.         LD      L,A
  1571.         LD      BC,hddcylhi
  1572.         CALL    IN_A
  1573.         LD      H,A
  1574.         RET    
  1575.  
  1576. ;IN:HL-АДРЕС ПРИЕМА ДАННЫХ
  1577. ;   BC-КОЛ-ВО БАЙТ
  1578. TRANS_IN
  1579.         PUSH    BC
  1580.         CALL    NO_BSY
  1581.         POP     BC
  1582.        RET      C
  1583.         PUSH    BC
  1584.         CALL    WAIT_DRQ
  1585.         POP     BC
  1586.        RET      C
  1587.         INC     BC
  1588.         SRL     B
  1589.         RR      C
  1590. TR_IN0  PUSH    BC
  1591.         LD      BC,hdddatlo
  1592.         CALL    IN_A
  1593.         LD      (HL),A
  1594.         INC     HL
  1595.         LD      BC,hdddathi
  1596.         CALL    IN_A
  1597.         LD      (HL),A
  1598.         POP     BC
  1599.         CPI    
  1600.         JP      PE,TR_IN0
  1601.         RET    
  1602.  
  1603. ;ПЕРЕДАЧА ATAPI-ПАКЕТА
  1604. SEND_ATAPI
  1605. REG_SDH := $+1
  1606.        LD       A,0XB0
  1607.        LD       BC,hddhead
  1608.        CALL     OUT_A
  1609.         LD      BC,hddcyllo
  1610.         XOR     A
  1611.         CALL    OUT_A
  1612.         LD      BC,hddcylhi
  1613.                 LD A,HIGH (2048);        LD     A,'2048
  1614.         CALL    OUT_A
  1615.         LD      A,0XA0
  1616.         CALL    HDSC
  1617.         LD      B,6
  1618. TR_OUT0 PUSH    BC
  1619.         INC     HL
  1620.         LD      A,(HL)
  1621.         LD      BC,hdddathi
  1622.         CALL    OUT_A
  1623.         DEC     HL
  1624.         LD      A,(HL)
  1625.         LD      BC,hdddatlo
  1626.         CALL    OUT_A
  1627.         INC     HL
  1628.         INC HL
  1629.         POP     BC
  1630.         DJNZ    TR_OUT0
  1631.         RET    
  1632.  
  1633. READCD
  1634. ;ЧТЕНИЕ СЕКТОРА
  1635. LOAD_SECTOR_
  1636.        PUSH     HL
  1637.         LD      HL,AP_READ
  1638.         CALL    SEND_ATAPI
  1639.        POP      HL
  1640. ;бывает ситуация,что CHECK CONDITION (D0 статуса)=0,
  1641. ;а при этом DRQ не выдается!
  1642.        ;CALL IN_HDDSTAT
  1643.        ;RRA
  1644.         CALL    NO_BSY ;иначе виснет при иниц-ции CD
  1645.        ;CALL WAIT_DRQ ;здесь виснет, если инитить слишком рано
  1646.                  ;после выхода разгоняется, ждет кнопку и читает
  1647.      ;ожидание DRQ по рецепту Budder'а
  1648.         LD      DE,0
  1649. RDCDDRQ CALL    IN_HDDSTAT
  1650.         BIT     3,A
  1651.        RET      NZ ;потом прочитаем
  1652.         INC     DE
  1653.         BIT     2,D ;4,D
  1654.         JR      Z,RDCDDRQ
  1655.         PUSH    HL
  1656.         LD      HL,AP_00
  1657.         CALL    SEND_ATAPI
  1658.         POP     HL
  1659.         JR      LOAD_SECTOR_
  1660.  
  1661. ;ATAPI-ПАКЕТ "ПУСТЫШКА"
  1662. AP_00
  1663.         DW      0
  1664.                 DUPL 10,0;        DS    10
  1665.  
  1666. ;ATAPI-ПАКЕТ "SPEED 1x"
  1667. AP_1x
  1668.         DW      0XBB
  1669.         DB      0
  1670.         DB      176 ;1x=176k/s
  1671.                 DUPL 8,0;        DS     8
  1672.  
  1673. ;ATAPI-ПАКЕТ "ЧТЕНИЕ"
  1674. AP_READ
  1675.                 IF 0;       IFN 0
  1676.         DW      0XBE   ;"READ CD"
  1677. SECTOR  DB      0,0,0,0
  1678.         DB      0
  1679.         DB      0,1   ;=1 сектор
  1680.         DB      0X10   ;читаем только данные
  1681.         DB      0,0
  1682.        ELSE    
  1683.         DW      0X28   ;"READ(10)"
  1684. SECTOR  DB      0,0,0,0
  1685.         DB      0
  1686.         DB      0,1   ;=1 сектор
  1687.         DB      0
  1688.         DB      0,0
  1689.        ENDIF   
  1690. AP_READTOC
  1691.         DW      0X43   ;SCMSF=0,т.е.секторы,а не MSF
  1692.         DB      0     ;FORMAT=0:все сессии
  1693.                 DUPL 3,0;        DS     3
  1694.         DB      0     ;с 1-й сессии
  1695.         DB      HIGH (2048);'2048 ;длина табл
  1696.         DB      LOW (2048)
  1697.         DB      0X00   ;FUNC
  1698.                 DUPL 2,0;        DS     2
  1699.  
  1700.        IF       atm=0
  1701. pause
  1702. ;162t - 17 (call) - 10 (ret) = 135
  1703.                 REPT 11;       DUP      11
  1704.         JR      $+2
  1705.                 ENDM;       EDUP       
  1706.         NOP     ;136
  1707.         RET    
  1708.        ENDIF   
  1709.  
  1710. evEMPTY
  1711.         RET    
  1712.  
  1713. evRIGHTOFF
  1714.         LD      DE,HINTOFF
  1715.         CALL    evRIGHTPM
  1716.         JR      UMER
  1717. evRIGHTON
  1718.         LD      A,%11101111
  1719.         LD      (NEEDKEY),A
  1720.         LD      A,-1
  1721.         LD      (CURKEY),A
  1722.         CALL    ASKBIBIK
  1723.         LD      DE,HINTRIGHT
  1724. evRIGHTPM
  1725. _y := 88
  1726. _x := 31
  1727.         xy2adr
  1728.         LD      HL,_a
  1729.         JR      evLRPM
  1730. evLEFTOFF
  1731.         LD      DE,HINTOFF
  1732.         CALL    evLEFTPM
  1733.         JR      UMER
  1734. evLEFTON
  1735.         LD      A,%11011111
  1736.         LD      (NEEDKEY),A
  1737.         LD      A,-1
  1738.         LD      (CURKEY),A
  1739.         CALL    ASKBIBIK
  1740.         LD      DE,HINTLEFT
  1741. evLEFTPM
  1742. _y := 88
  1743. _x := 0
  1744.         xy2adr
  1745.         LD      HL,_a
  1746. evLRPM
  1747.         LD      A,(curplane)
  1748.                        ;0X1C,0X1D 0X16,0X17
  1749.                    ;ATM;0X19,0X1D 0X13,0X17
  1750.         OR      7
  1751.        PUSH     AF
  1752.        PUSH     DE
  1753.        PUSH HL
  1754.         CALL    evSPR16PP
  1755.        POP      HL
  1756.        POP DE
  1757.        POP      AF
  1758.         SUB     2
  1759.         CALL    evSPR16PP
  1760.         LD      A,(curplane)
  1761.         LD      BC,32765
  1762.         OUT     (C),A
  1763.         RET    
  1764.  
  1765. evFIREOFF
  1766.         LD      DE,HINTOFF
  1767.         CALL    evFIREPM
  1768. UMER
  1769.         LD      A,(NEEDKEY)
  1770.         LD      C,A
  1771.         LD      A,(CURKEY)
  1772.         CP      C
  1773.         RET     Z
  1774.         INC     A
  1775.         CALL    Z,BADBIBIK ;не нажимали ничего - смерть
  1776. EVENTPARAM := $+1
  1777.         LD      HL,0
  1778.         LD      (CURENDOFVIDEO),HL
  1779.         LD      HL,ENDOFVIDEODEAD
  1780.         LD      (JPENDOFVIDEO),HL
  1781.         RET    
  1782. evFIREON
  1783.         LD      A,%11111110
  1784.         LD      (NEEDKEY),A
  1785.         LD      A,-1
  1786.         LD      (CURKEY),A
  1787.         CALL    ASKBIBIK
  1788.         LD      DE,HINTFIRE
  1789. evFIREPM
  1790. _y := 184
  1791. _x := 28
  1792.         xy2adr
  1793.         LD      HL,_a
  1794.         JR      evUDPM
  1795. evDOWNOFF
  1796.         LD      DE,HINTOFF
  1797.         CALL    evDOWNPM
  1798.         JR      UMER
  1799. evDOWNON
  1800.         LD      A,%11110111
  1801.         LD      (NEEDKEY),A
  1802.         LD      A,-1
  1803.         LD      (CURKEY),A
  1804.         CALL    ASKBIBIK
  1805.         LD      DE,HINTDOWN
  1806. evDOWNPM
  1807. _y := 184
  1808. _x := 15
  1809.         xy2adr
  1810.         LD      HL,_a
  1811.         JR      evUDPM
  1812. evUPOFF
  1813.         LD      DE,HINTOFF
  1814.         CALL    evUPPM
  1815.         JR      UMER
  1816. evUPON
  1817.         LD      A,%11111011
  1818.         LD      (NEEDKEY),A
  1819.         LD      A,-1
  1820.         LD      (CURKEY),A
  1821.         CALL    ASKBIBIK
  1822.         LD      DE,HINTUP
  1823. evUPPM
  1824. _y := 0
  1825. _x := 15
  1826.         xy2adr
  1827.         LD      HL,_a
  1828. evUDPM
  1829.         LD      A,(curplane)
  1830.                        ;0X1C,0X1D      0X16,0X17
  1831.                   ;ATM ;0X19,0X1D      0X13,0X17
  1832.         OR      7
  1833.         PUSH    AF
  1834.         PUSH HL
  1835.         CALL    evUD88
  1836.         POP     HL
  1837.         POP AF
  1838.         INC     HL
  1839. evUD88
  1840.        PUSH     AF
  1841.        PUSH     DE
  1842.        PUSH HL
  1843.         CALL    evSPR8PP
  1844.        POP      HL
  1845.        POP DE
  1846.        POP      AF
  1847.         SUB     2
  1848.         CALL    evSPR8PP
  1849.         LD      A,(curplane)
  1850.         LD      BC,32765
  1851.         OUT     (C),A
  1852.         RET    
  1853.  
  1854. evSPR16PP
  1855.         LD      BC,32765
  1856.         OUT     (C),A
  1857.        PUSH     AF
  1858.         PUSH    HL
  1859.         PUSH    HL
  1860.         CALL    HINTSTOLB
  1861.         POP     HL
  1862.         SET     5,H
  1863.         CALL    HINTSTOLB
  1864.         POP     HL
  1865.        POP      AF
  1866.                 IF atm=1;       IFN     atm
  1867.         SUB     4
  1868.        ELSE    
  1869.         DEC     A
  1870.        ENDIF   
  1871.         LD      BC,32765
  1872.         OUT     (C),A
  1873.         PUSH    HL
  1874.         CALL    HINTSTOLB
  1875.         POP     HL
  1876.         SET     5,H
  1877. HINTSTOLB
  1878.                 IF atm=1;       IFN     atm
  1879.         LD      BC,40
  1880.                 REPT 15;        DUP     16
  1881.         LD      A,(DE)
  1882.         INC     E
  1883.         LD      (HL),A
  1884.         ADD     HL,BC
  1885.                 ENDM;        EDUP      
  1886.         LD      A,(DE)
  1887.         INC     E
  1888.         LD      (HL),A
  1889.        ELSE    
  1890.                 REPT 7;        DUP      8
  1891.         LD      A,(DE)
  1892.         INC     E
  1893.         LD      (HL),A
  1894.         INC     H
  1895.                 ENDM;        EDUP      
  1896.         LD      A,(DE)
  1897.         INC     E
  1898.         LD      (HL),A
  1899. ;        ORG    $-1
  1900.         LD      A,L
  1901.         ADD     A,32
  1902.         LD      L,A
  1903.         LD      A,H
  1904.         SUB     7
  1905.         LD      H,A
  1906.                 REPT 7;        DUP      8
  1907.         LD      A,(DE)
  1908.         INC     E
  1909.         LD      (HL),A
  1910.         INC     H
  1911.                 ENDM;        EDUP      
  1912.         LD      A,(DE)
  1913.         INC     E
  1914.         LD      (HL),A
  1915.        ENDIF   
  1916. ;        ORG    $-1
  1917.         RET    
  1918. evSPR8PP
  1919.         LD      BC,32765
  1920.         OUT     (C),A
  1921.        PUSH     AF
  1922.         PUSH    HL
  1923.         PUSH    HL
  1924.         CALL    HINTSTOLB8
  1925.         POP     HL
  1926.         SET     5,H
  1927.         CALL    HINTSTOLB8
  1928.         POP     HL
  1929.        POP      AF
  1930.                 IF atm=1;       IFN     atm
  1931.         SUB     4
  1932.        ELSE    
  1933.         DEC     A
  1934.        ENDIF   
  1935.         LD      BC,32765
  1936.         OUT     (C),A
  1937.         PUSH    HL
  1938.         CALL    HINTSTOLB8
  1939.         POP     HL
  1940.         SET     5,H
  1941. HINTSTOLB8
  1942.                 IF atm=1;       IFN     atm
  1943.         LD      BC,40
  1944.                 REPT 7;        DUP      8
  1945.         LD      A,(DE)
  1946.         INC     E
  1947.         LD      (HL),A
  1948.         ADD     HL,BC
  1949.                 ENDM;        EDUP      
  1950.         LD      A,(DE)
  1951.         INC     E
  1952.         LD      (HL),A
  1953.        ELSE    
  1954.                 REPT 7;        DUP      8
  1955.         LD      A,(DE)
  1956.         INC     E
  1957.         LD      (HL),A
  1958.         INC     H
  1959.                 ENDM;        EDUP      
  1960.         LD      A,(DE)
  1961.         INC     E
  1962.         LD      (HL),A
  1963.        ENDIF   
  1964. ;        ORG    $-1
  1965.         RET    
  1966.  
  1967.                 IF 0;       IFN 0
  1968. CLSTOLB
  1969.                 IF atm=1;       IFN     atm
  1970.         LD      BC,40
  1971.         XOR     A
  1972.                 REPT 16;        DUP     16
  1973.         LD      (HL),A
  1974.         ADD     HL,BC
  1975.                 ENDM;        EDUP      
  1976.        ELSE    
  1977.                 REPT 7;        DUP      8
  1978.         LD      A,(DE)
  1979.         INC     E
  1980.         LD      (HL),A
  1981.         INC     H
  1982.                 ENDM;        EDUP      
  1983.         LD      A,(DE)
  1984.         INC     E
  1985.         LD      (HL),A
  1986. ;        ORG    $-1
  1987.         LD      A,L
  1988.         ADD     A,32
  1989.         LD      L,A
  1990.         LD      A,H
  1991.         SUB     7
  1992.         LD      H,A
  1993.                 REPT 7;        DUP      8
  1994.         LD      A,(DE)
  1995.         INC     E
  1996.         LD      (HL),A
  1997.         INC     H
  1998.                 ENDM;        EDUP      
  1999.         LD      A,(DE)
  2000.         INC     E
  2001.         LD      (HL),A
  2002.        ENDIF   
  2003. ;        ORG    $-1
  2004.         RET    
  2005.        ENDIF   
  2006. OUTA
  2007.        PUSH     BC
  2008.         LD      C,A
  2009.         LD      A,(curplane)
  2010.         AND     0X18
  2011.         OR      C
  2012.         LD      BC,32765
  2013.         OUT     (C),A
  2014.        POP      BC
  2015.         RET    
  2016.  
  2017.                 include galarr.a80;        INCLUDE      "GALARR",0X84
  2018. SCORE   DW      0
  2019. LIVES   DB      0
  2020. LEVEL   DB      0
  2021.  
  2022.                 include galscrip.a80;        INCLUDE    "GALSCRIP",0XC4
  2023. ;       DISPLAY $
  2024.                 DUPL LOW (-$),0;        DS      .(-$)
  2025. f88             binclude 88kriv.bin,0,0X800;     INCBIN "88kriv$",0X800
  2026. loa
  2027. end
  2028.                 IF 0
  2029.                 DUPL 0XC000-$,0;        DS      0XC000-$
  2030. ;       DISPLAY /T,end
  2031.         ORG     0X5B00
  2032. ObjTab  DB      "AUTORUN "
  2033.         DB      "Z"
  2034.         DW      begin,end-begin
  2035.         DB      16
  2036.         DB      "X "
  2037.        IF       atm
  2038.         DB      "PENT    "
  2039.         DB      "C"
  2040.         DW      0X8200,0X3E00
  2041.         DB      16
  2042.         DB      "  "
  2043.        ENDIF   
  2044.                 ENDIF
  2045. ;               include saveobj5.a80;        INCLUDE    "SAVEOBJ*",0XC0
  2046.