?login_element?

Subversion Repositories NedoOS

Rev

Rev 284 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;------------Работа с картой (c #C000)
  2. ;align!!!
  3. MPsign  ;номера спрайтов для обычн уровней
  4.         DEFB 60
  5.         DEFS 6,18
  6.         DEFS 10,24
  7.         DEFS 13,18
  8.         DEFB 84,36,84,84,36,84,84,36,84
  9.         DEFS 3,96
  10.         DEFS 3,30
  11.         DEFS 3,96
  12.         DEFS 3,18
  13.         DEFB 18
  14.         DEFS 9,42
  15.         DEFS 3,48
  16.         DEFS 14,54
  17.         DEFB 18
  18.         DEFB 78
  19.         DEFS 14,66
  20.         DEFS 14,72
  21.         DEFB 78
  22.         DEFS 2,66
  23.         DEFS 2,72
  24.         DEFS 5,42
  25.         DEFS 2,42 ;?
  26.         DEFB 84,90,96,102,108,114,120,126
  27.  
  28. ;полезные данные в битах 7..5, но потом прокручиваются вправо и в следующий байт (MP_R2)
  29. MP_IMG  DEFW #E0,#80,#80 ;00 люди
  30.         DEFW #E0,#80,#A0 ;06 кунги
  31.         DEFW #E0,#C0,#A0 ;12 пленник
  32.         DEFW #E0,#E0,#E0 ;18 пусто
  33.         DEFW #E0,#A0,#E0 ;24 дорожки
  34.         DEFW #40,#40,#40 ;30 мост гор
  35.         DEFW #00,#E0,#00 ;36 мост вер
  36. water   DEFW #E0,#A0,#40 ;42 вода
  37.         DEFW #C0,#80,#00 ;48 лес
  38.         DEFW #A0,#40,#A0 ;54 забор
  39.         DEFW #00,#40,#00 ;60 рамка
  40.         DEFW #80,#40,#40 ;66 здания люди
  41.         DEFW #40,#20,#40 ;72 здания кунги
  42.         DEFW #00,#60,#00 ;78 строительство
  43.         DEFW #A0,#A0,#A0 ;84 |
  44.         DEFW #E0,#80,#A0 ;90 |~
  45.         DEFW #E0,#00,#E0 ;96  ~
  46.         DEFW #E0,#00,#C0 ;102 ~|
  47.         DEFW #C0,#C0,#C0 ;108  |
  48.         DEFW #C0,#C0,#00 ;114 _|
  49.         DEFW #E0,#E0,#00 ;120 _
  50.         DEFW #A0,#A0,#80 ;126|_
  51. MP_LEN  EQU $-MP_IMG
  52.  
  53. mnt     EQU 72 ;горы
  54. MPsig2  ;номера спрайтов для подземелий
  55.         DEFS 1,60
  56.         DEFS 3,18
  57.         DEFS 2,48
  58.         DEFS 1,18
  59.         DEFS 2,#0
  60.         DEFS 33,24
  61.         DEFS 10,#0
  62.         DEFS 2,30
  63.         DEFS 2,#0
  64.         DEFS 1,42
  65.         DEFS 2,mnt
  66.         DEFS 2,54
  67.         DEFS 1,30
  68.         DEFS 1,#0
  69.         DEFS 1,24
  70.         DEFS 15,#0
  71.         DEFS 9,54
  72.         DEFS 1,60 ;внутр гор
  73.         DEFS 14,mnt
  74.         DEFS 10,60
  75.         DEFS 1,42
  76.         DEFS 2,mnt
  77.         DEFS 2,54
  78.  
  79.  
  80. MPswap  ;сменить нумерацию спрайтов для подземелий
  81.         LD A,(LEV_T)
  82.         OR A
  83.         RET Z
  84.         LD HL,MPsign
  85.         LD DE,MPsig2
  86.         LD B,118
  87. MPsw0   LD A,(DE)
  88.         LD C,(HL)
  89.         LD (HL),A
  90.         LD A,C
  91.         LD (DE),A
  92.         INC L
  93.         INC E
  94.         DJNZ MPsw0
  95.         RET
  96.  
  97. MP_ANI  LD A,(isANI)
  98.         OR A
  99.         RET Z
  100.         LD DE,water
  101.         LD HL,water+2
  102.         LD A,(DE)
  103.         LDI
  104.         LDI
  105.         LDI
  106.         INC DE
  107.         LD (DE),A
  108.         LD HL,MP_IMG+10
  109.         CALL MP_an
  110.         LD HL,MP_IMG+14
  111.         CALL MP_an
  112.         INC HL
  113.         INC HL
  114. MP_an   LD A,(HL)
  115.         XOR #60
  116.         LD (HL),A
  117.         RET
  118.        
  119.         if EGA==0
  120.  
  121. MP_R1   PUSH HL
  122.         LD HL,MP_IMG
  123.         LD B,MP_LEN/2
  124. mp01    SRL (HL)
  125.         INC HL
  126.         INC HL
  127.         DJNZ mp01
  128.         POP HL
  129.         RET
  130.  
  131. MP_R2   PUSH HL
  132.         LD HL,MP_IMG
  133.         LD B,MP_LEN/2
  134. mp02    SRL (HL)
  135.         INC HL
  136.         RR (HL)
  137.         INC HL
  138.         DJNZ mp02
  139.         POP HL
  140.         RET
  141.        
  142.         endif
  143.  
  144. MP_OU1  ;HL -адр экр
  145. ;вывод столбца карты, если сдвинутое значение умещается в байт
  146.         LD C,64
  147. mp03    CALL MP_SPA ;->de адр спр
  148.         JR Z,mp041
  149.         if EGA
  150.         push bc
  151.         call setpgsscr40008000
  152.         pop bc
  153.         endif
  154.         LD B,3
  155. mp05
  156.         if EGA
  157.         push bc
  158.         push de
  159.         push hl
  160.         ld a,(de)
  161.         ld e,a
  162.         xor a
  163.         rl e
  164.         jr nc,$+4
  165.         or 0x47 ;L
  166.         rl e
  167.         jr nc,$+4
  168.         or 0xb8 ;R
  169.         XOR (HL)
  170.         LD (HL),A      
  171.         ld a,0x9f;0xa0
  172.         cp h
  173.         ld bc,0x4000
  174.         adc hl,bc
  175.         jp pe,MP_OU1column_noxor ;в половине случаев
  176. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  177.          inc a
  178.         xor h
  179.         ld h,a
  180. MP_OU1column_noxor      
  181.         rl e
  182.         jr nc,$+2+4
  183.          ld a,0x47 ;L
  184.          XOR (HL)
  185.          LD (HL),A
  186.         pop hl
  187.         pop de
  188.         pop bc
  189.         inc de
  190.         inc de
  191.                
  192.         else ;~EGA
  193.        
  194.         LD A,(DE)
  195.         XOR (HL)
  196.         LD (HL),A
  197.         INC DE
  198.         INC DE
  199.         endif
  200.        
  201.         if EGA
  202.         ld a,l
  203.         add a,40
  204.         ld l,a
  205.         jr nc,$+3
  206.         inc h
  207.         else
  208.         INC H
  209.         LD A,H
  210.         AND 7
  211.         JR NZ,mp04
  212.         LD A,L
  213.         ADD A,32
  214.         LD L,A
  215.         JR C,mp04
  216.         LD A,H
  217.         SUB 8
  218.         LD H,A
  219. mp04
  220.         endif
  221.         DJNZ mp05
  222.         if EGA
  223.         push bc
  224.         call setpgsmain40008000
  225.         pop bc
  226.         endif
  227. mp041   DEC C
  228.         JR NZ,mp03
  229.         RET
  230.  
  231. MP_OU2  ;HL -адр экр
  232. ;вывод столбца карты
  233.         LD C,64
  234. mp43    CALL MP_SPA ;->de адр спр
  235.         JR Z,mp441
  236.         if EGA
  237.         push bc
  238.         call setpgsscr40008000
  239.         pop bc
  240.         endif
  241.         LD B,3
  242. mp45
  243.         if EGA
  244.         push bc
  245.         push de
  246.         push hl
  247.         ld a,(de)
  248.         add a,a
  249.         ld e,a
  250.         jr nc,$+2+4
  251.          ld a,0xb8 ;R
  252.          XOR (HL)
  253.          LD (HL),A     
  254.         ld a,0x9f;0xa0
  255.         cp h
  256.         ld bc,0x4000
  257.         adc hl,bc
  258.         jp pe,MP_OU2column_noxor ;в половине случаев
  259. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  260.          inc a
  261.         xor h
  262.         ld h,a
  263. MP_OU2column_noxor      
  264.         xor a
  265.         rl e
  266.         jr nc,$+4
  267.         or 0x47 ;L
  268.         rl e
  269.         jr nc,$+4
  270.         or 0xb8 ;R
  271.         XOR (HL)
  272.         LD (HL),A
  273.         pop hl
  274.         pop de
  275.         pop bc
  276.         inc de
  277.         inc de
  278.        
  279.         else ;~EGA
  280.        
  281.         LD A,(DE)
  282.         XOR (HL)
  283.         LD (HL),A
  284.         INC DE
  285.         if EGA
  286.         inc hl
  287.         else
  288.         INC L
  289.         endif
  290.         LD A,(DE)
  291.         XOR (HL)
  292.         LD (HL),A
  293.         if EGA
  294.         dec hl
  295.         else
  296.         DEC L
  297.         endif
  298.         INC DE
  299.        
  300.         endif
  301.        
  302.         if EGA
  303.         ld a,l
  304.         add a,40
  305.         ld l,a
  306.         jr nc,$+3
  307.         inc h
  308.         else
  309.         INC H
  310.         LD A,H
  311.         AND 7
  312.         JR NZ,mp44
  313.         LD A,L
  314.         ADD A,32
  315.         LD L,A
  316.         JR C,mp44
  317.         LD A,H
  318.         SUB 8
  319.         LD H,A
  320. mp44
  321.         endif
  322.         DJNZ mp45
  323.         if EGA
  324.         push bc
  325.         call setpgsmain40008000
  326.         pop bc
  327.         endif
  328. mp441   DEC C
  329.         JR NZ,mp43
  330.         RET
  331.  
  332.         if EGA
  333. MP_OU32_64
  334.         LD (MP_sub+1),bc
  335.         LD B,32
  336. MP_OUT0
  337.         push bc
  338.         PUSH HL
  339.         PUSH DE
  340.         CALL MP_SET
  341. MP_sub  CALL MP_OU1
  342.         POP DE
  343.         POP HL
  344.         ld bc,0x4000
  345.         ld lx,3
  346. MP_OUT0_3
  347.         ld a,0x9f;0xa0
  348.         cp h
  349.         adc hl,bc
  350.         jp pe,MP_OUT0_noxor ;в половине случаев
  351. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  352.          inc a
  353.         xor h
  354.         ld h,a
  355. MP_OUT0_noxor
  356.         dec lx
  357.         jr nz,MP_OUT0_3
  358.         pop bc
  359.         inc e
  360.         inc e
  361.         DJNZ MP_OUT0
  362.         RET
  363.        
  364.         else ;~EGA
  365.  
  366. MP_OU8  PUSH HL
  367.         PUSH DE
  368.         LD B,8
  369. mp11    PUSH BC
  370.         PUSH HL
  371.         PUSH DE
  372.         CALL MP_SET
  373. MP_sub  CALL MP_OU1
  374.         POP DE
  375.         POP HL
  376.         POP BC
  377.         if EGA
  378.         inc hl
  379.         inc hl
  380.         inc hl
  381.         else
  382.         INC L
  383.         INC L
  384.         INC L
  385.         endif
  386.         LD A,E
  387.         ADD A,8
  388.         LD E,A
  389.         DJNZ mp11
  390.         POP DE
  391.         POP HL
  392.         RET
  393.        
  394.         endif
  395.  
  396. MP_OUT
  397.         CALL MPswap
  398.         CALL MP_OFF ;очистка
  399.         CALL MP_ANI
  400.        
  401.         if EGA
  402. ;00 01 11 22|23 33 44 45|55 66 67 77|
  403.         ;jr $
  404.         LD bc,MP_OU1
  405.         ld hl,scrbase;0x4000
  406.         LD DE,MAP
  407.         CALL MP_OU32_64
  408.         LD bc,MP_OU2
  409.         ld hl,scrbase+0x4000;0x8000
  410.         LD DE,MAP+1
  411.         CALL MP_OU32_64
  412.         JP MPswap
  413.        
  414.         else ;~EGA
  415.        
  416.         LD HL,DSCR
  417.         LD DE,MAP
  418.         LD B,6
  419. mp19    PUSH BC
  420.         CALL MP_OU8
  421.         if EGA
  422.         inc hl
  423.         else
  424.         INC L
  425.         endif
  426.         INC E
  427.         INC E
  428.         INC E
  429.         POP BC
  430.         PUSH BC
  431.         LD A,B
  432.         CP 1
  433.         PUSH AF
  434.         CALL NZ,MP_R1
  435.         POP AF
  436.         CALL Z,MP_R2
  437.         POP BC
  438.         LD A,B
  439.         CP 4
  440.         JR Z,mp17
  441.         CP 1
  442.         JR NZ,mp18
  443. mp17
  444.         if EGA
  445.         dec hl
  446.         dec hl
  447.         dec hl
  448.         else
  449.         DEC L
  450.         DEC L
  451.         DEC L
  452.         endif
  453.         LD A,E
  454.         SUB 8
  455.         LD E,A
  456. mp18    DJNZ mp19
  457.         LD BC,MP_OU2
  458.         LD (MP_sub+1),BC
  459.         CALL MP_OU8
  460.         CALL MP_R2
  461.         if EGA
  462.         inc hl
  463.         else
  464.         INC L
  465.         endif
  466.         INC E
  467.         INC E
  468.         INC E
  469.         CALL MP_OU8
  470.         CALL MP_R2
  471.         LD HL,MP_OU1
  472.         LD (MP_sub+1),HL
  473. ;MP_Re
  474.         LD HL,MP_IMG+1
  475.         LD DE,MP_IMG
  476.         LD BC,MP_LEN-1
  477.         LDIR
  478.         XOR A
  479.         LD (DE),A
  480.         JP MPswap
  481.        
  482.         endif
  483.  
  484.  
  485. MP_SET  ;уст.на карту (DE-адрес)
  486.         PUSH DE
  487.         EXX
  488.         POP HL
  489.         LD BC,64
  490.         EXX
  491.         RET
  492.  
  493.  
  494. MP_SPA  EXX     ;Z-невид; NZ-видим ;->DE adr
  495.         LD A,(HL)
  496.         RLCA
  497.         JR C,mpsN
  498.         SET 4,H ;MAP->MAP2
  499.         LD A,(HL)
  500.         RES 4,H
  501.         CP #80
  502.         JR NC,mpHE
  503.         LD A,(HL)
  504.         ADD HL,BC
  505.         EXX
  506.         LD D,#C0
  507.         LD E,A
  508.         LD A,(DE)
  509.         ADD A,#80
  510.         LD E,A
  511.         RET
  512. mpHE    ;герои
  513.         ADD HL,BC
  514.         CP #B0
  515.         JR NC,mpH1
  516.         EXX
  517.         LD DE,MP_IMG
  518.         RET
  519. mpH1    CP #E0
  520.         JR NC,mpH2
  521.         EXX
  522.         LD DE,MP_IMG+6
  523.         RET
  524. mpH2    EXX
  525.         LD DE,MP_IMG+12
  526.         AND A
  527.         RET
  528. mpsN    ADD HL,BC ;невидим поле
  529.         EXX
  530.         if EGA
  531.         ld a,l
  532.         add a,40*3
  533.         ld l,a
  534.         jr nc,$+3
  535.         inc h
  536.         else
  537.         LD A,H
  538.         ADD A,3
  539.         LD H,A
  540.         AND 7
  541.         CP 3
  542.         JR NC,mps4
  543.         LD A,L
  544.         ADD A,32
  545.         LD L,A
  546.         JR C,mps4
  547.         LD A,H
  548.         SUB 8
  549.         LD H,A
  550. mps4
  551.         endif
  552.         XOR A
  553.         RET
  554.  
  555.         display $,"<=0xc300"
  556.