?login_element?

Subversion Repositories NedoOS

Rev

Rev 170 | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;tilemask содержит адреса процедур для каждой клетки:
  2. ;copychr или skipchr
  3. ;cl=screen addr
  4. ;bl=attr addr
  5. ;в стеке лежат значения VALID0,VALID1, из которых образуются адреса процедур
  6. ;в конце строки лежит validnext (2 байта)
  7. valid00
  8.         ;inc l
  9.         ;inc l
  10.         ret
  11. valid00_size=$-valid00
  12. valid10
  13.         ld l,-2
  14.         add hl,sp
  15.         ld h,b
  16.         ld e,l
  17.         ld d,hx
  18.         dup 7
  19.         ld a,(hl)
  20.         ld (de),a
  21.         inc h
  22.         inc d
  23.         edup
  24.         ld a,(hl)
  25.         ld (de),a
  26.         ld h,c
  27.         ld d,lx
  28.         ld a,(hl)
  29.         ld (de),a
  30.         inc l
  31.         inc l
  32.         ret
  33. valid10_size=$-valid10
  34. valid01
  35.         ld l,-1
  36.         add hl,sp
  37.         ;inc l
  38.         ld h,b
  39.         ld e,l
  40.         ld d,hx
  41.         dup 7
  42.         ld a,(hl)
  43.         ld (de),a
  44.         inc h
  45.         inc d
  46.         edup
  47.         ld a,(hl)
  48.         ld (de),a
  49.         ld h,c
  50.         ld d,lx
  51.         ld a,(hl)
  52.         ld (de),a
  53.         inc l
  54.         ret
  55. valid01_size=$-valid10
  56. valid11
  57.         ld l,-2
  58.         add hl,sp
  59.        if 1==1 ;381t, 62b
  60.         ld e,l
  61.         ld d,lx
  62.         ld h,c
  63.         ;ld a,d
  64.         ;add a,+(0x40-(scrbuf/256))&0xff
  65.         ;ld h,a
  66.         ldi       ;attr(left)
  67.         ld a,(hl)
  68.         ld (de),a ;attr(right)
  69.         ld h,b
  70.         ld d,hx
  71.         dup 3
  72.         ldd
  73.         ld a,(hl)
  74.         ld (de),a
  75.         inc h
  76.         inc d
  77.         ldi
  78.         ld a,(hl)
  79.         ld (de),a
  80.         inc h
  81.         inc d
  82.         edup
  83.         ldd
  84.         ld a,(hl)
  85.         ld (de),a
  86.         inc h
  87.         inc d
  88.         ldi
  89.         ldi
  90.         ld a,c
  91.         add a,10
  92.         ld c,a
  93.         ret
  94.        else ;426t, 78b
  95.         ld e,l
  96.         ld d,hx
  97.         ld h,b
  98.         dup 7
  99.         ld a,(hl)
  100.         ld (de),a
  101.         inc h
  102.         inc d
  103.         edup
  104.         ld a,(hl)
  105.         ld (de),a ;scr(left)
  106.         ld h,c
  107.         ld d,lx
  108.         ld a,(hl)
  109.         ld (de),a ;attr(left)
  110.         inc l
  111.         inc e
  112.         ld a,(hl)
  113.         ld (de),a ;attr(right)
  114.         ld h,b
  115.         ld d,hx
  116.         dup 7
  117.         ld a,(hl)
  118.         ld (de),a
  119.         inc h
  120.         inc d
  121.         edup
  122.         ld a,(hl)
  123.         ld (de),a ;scr(right)
  124.         inc l
  125.         ret
  126.        endif
  127. valid11_size=$-valid11
  128.  
  129. prvalid
  130.         ld (prvalidsp),sp
  131.         ld sp,validmap
  132.         ;ld l,0 ;начало экрана
  133.         ld bc,scrbuf/256*256+(scrbuf/256+0x18)
  134.         ld ix,0x4058 ;scr,attr
  135.         ret
  136. clearvalid
  137.         ld (prvalidsp),sp
  138.         ld sp,validmap+(validmaplinesize*tilemaphgt)
  139. validq
  140.         ld hl,validq
  141.         ld de,VALID00
  142.         ld b,tilemaphgt
  143. clearvalid0
  144.         push hl ;validq или validnext
  145.         dup validmaplinesize/2-1
  146.         push de
  147.         edup
  148.         ld hl,validnext
  149.         djnz clearvalid0
  150. prvalidsp=$+1
  151.         ld sp,0
  152.         ret
  153.  
  154. validnext
  155.         ld l,-1
  156.         add hl,sp
  157.         ;inc l
  158.         inc l
  159.         ret nz
  160.         ld a,b
  161.         add a,8
  162.         ld b,a
  163.         add a,+(0x40-(scrbuf/256))&0xff
  164.         ld hx,a
  165.         inc c
  166.         ld a,c
  167.         add a,+(0x40-(scrbuf/256))&0xff
  168.         ld lx,a
  169.         ret
  170.  
  171. prlives
  172. ;печатаем lives сердечек и далее один пробел
  173.         ld de,0x401f;scrbuf+0x1f
  174.         ld a,(lives)
  175.         inc a
  176.         ld c,a
  177. prlives0
  178.         push de
  179.         ld a,c
  180.         dec a
  181.         ld hl,sprlife
  182.         jr nz,$+5
  183.         ld hl,sprnolife
  184.         ld b,8
  185. prlives1
  186.         ld a,(hl)
  187.         ld (de),a
  188.         inc hl
  189.         inc d
  190.         djnz prlives1
  191.         pop de
  192.         call nextlinede
  193.         dec c
  194.         jr nz,prlives0
  195.         ret
  196.        
  197. sprnolife
  198.         ds 8
  199. sprlife
  200.         db %00000000
  201.         db %00110110
  202.         db %01111111
  203.         db %01111111
  204.         db %00111110
  205.         db %00011100
  206.         db %00001000
  207.         db %00000000
  208.  
  209. nextlinede
  210.         ld a,e
  211.         add a,32
  212.         ld e,a
  213.         ret nc
  214.         ld a,d
  215.         add a,8
  216.         ld d,a
  217.         ret
  218.  
  219. prmap
  220.         ld hl,tilemap
  221.         ld de,scrbuf
  222.         ld hx,d
  223.         ld lx,scrbuf/256+0x18
  224.         exx
  225.         ld c,tilemaphgt
  226. prmaplines
  227.         exx
  228.         push de
  229.         exx
  230.         ld b,tilemapwid
  231. prmapline
  232.         exx
  233.         ld c,(hl)
  234.         inc hl
  235.         ld b,tilepic/256
  236.         ld d,hx
  237.         dup 7
  238.         ld a,(bc)
  239.         ld (de),a
  240.         inc c
  241.         inc d
  242.         edup
  243.         ld a,(bc)
  244.         ld (de),a
  245.         inc c
  246.         ld d,lx
  247.         ld a,(bc)
  248.         ld (de),a
  249.         inc e
  250.         exx
  251.         djnz prmapline
  252.         exx
  253.         ld de,tilemaplinesize-tilemapwid
  254.         add hl,de
  255.         pop de
  256.         ld a,e
  257.         add a,32
  258.         ld e,a
  259.         jr nc,prmapnewlineq
  260.         ld a,hx
  261.         add a,8
  262.         ld hx,a
  263.         inc lx
  264. prmapnewlineq
  265.         exx
  266.         dec c
  267.         jr nz,prmaplines
  268. ;сделать невалидными выведенные ячейки
  269.         ld hl,validmap
  270.         ld a,tilemaphgt
  271. prmap_invalidatelines
  272.         ld bc,tilemapwid-1
  273.         ld d,h
  274.         ld e,l
  275.         inc de
  276.         ld (hl),VALID1
  277.         ldir
  278.         ld bc,validmaplinesize-(tilemapwid-1)
  279.         add hl,bc
  280.         dec a
  281.         jr nz,prmap_invalidatelines
  282.         ret
  283.  
  284. probjlist
  285.         ld ix,objlist
  286.         ld b,0
  287. probjlist0
  288.         ld a,(ix+(obj_x+1))
  289.         cp TERMINATOR
  290.         ret z
  291.         ld l,(ix+obj_objaddr)
  292.         ld h,(ix+(obj_objaddr+1))
  293.         ;hl=адрес описателя объекта (в начале лежит указатель на список анимаций)
  294.         ld a,(hl)
  295.         inc hl
  296.         ld h,(hl)
  297.         ld l,a
  298.         ;hl=указатель на список анимаций
  299.         ld c,(ix+obj_anim) ;номер анимации
  300.         ;ld b,0
  301.         add hl,bc
  302.         add hl,bc
  303.         ld a,(hl)
  304.         inc hl
  305.         ld h,(hl)
  306.         ld l,a
  307.         ;hl=указатель на анимацию
  308.         ld c,(ix+obj_animphase) ;номер фазы анимации
  309.         ;ld b,0
  310.         add hl,bc
  311.         add hl,bc
  312.         add hl,bc
  313.          inc hl ;пропустили время фазы
  314.         ld a,(hl)
  315.         inc hl
  316.         ld h,(hl)
  317.         ld l,a
  318.         ;hl=адрес views для данной фазы анимации
  319.         ld c,(ix+obj_dir) ;номер направления 0..3
  320.         ;ld b,0
  321.         add hl,bc
  322.         add hl,bc
  323.         ld a,(hl)
  324.         inc hl
  325.         ld h,(hl)
  326.         ld l,a
  327.         ;hl=адрес спрайта
  328.         exx
  329.         ld c,(ix+obj_x)
  330.         ld a,(ix+(obj_x+1))
  331.         if coordsfactor !=4
  332.         display "coordsfactor!=4"
  333.         endif
  334.         rra
  335.         rr c
  336.         rra
  337.         rr c
  338.         ld b,(ix+obj_y)
  339.         ld a,(ix+(obj_y+1))
  340.         if coordsfactor !=4
  341.         display "coordsfactor!=4"
  342.         endif
  343.         rra
  344.         rr b
  345.         rra
  346.         rr b
  347. writereobjaddr=$+1
  348.         ld hl,reobjlist
  349.         ld (hl),c
  350.         inc hl
  351.         ld (hl),b
  352.         inc hl
  353.         ld (writereobjaddr),hl
  354. ;сделать невалидными выведенные ячейки
  355.         ;ld (validxy),bc
  356.         CALCvalidmapaddr_bcyx_tohl
  357.         ld a,VALID1
  358.         ld de,validmaplinesize-2
  359.         ld (hl),a
  360.         inc l
  361.         ld (hl),a
  362.         inc l
  363.         ld (hl),a
  364.         add hl,de
  365.         ld (hl),a
  366.         inc l
  367.         ld (hl),a
  368.         inc l
  369.         ld (hl),a
  370.         add hl,de
  371.         ld (hl),a
  372.         inc l
  373.         ld (hl),a
  374.         inc l
  375.         ld (hl),a
  376.         call prspr ;на выходе b=0
  377.         if 1==0
  378. ;сделать невалидными выведенные ячейки
  379. validxy=$+1
  380.         ld hl,0
  381.         CALCvalidmapaddr_hlyx_tohl
  382.         ld a,VALID1
  383.         ld c,validmaplinesize-2
  384.         ld (hl),a
  385.         inc l
  386.         ld (hl),a
  387.         inc l
  388.         ld (hl),a
  389.         add hl,bc
  390.         ld (hl),a
  391.         inc l
  392.         ld (hl),a
  393.         inc l
  394.         ld (hl),a
  395.         add hl,bc
  396.         ld (hl),a
  397.         inc l
  398.         ld (hl),a
  399.         inc l
  400.         ld (hl),a
  401.         endif
  402.         ld c,objsize
  403.         add ix,bc
  404.         jp probjlist0
  405.  
  406. prbulletlist
  407.         ld ix,bulletlist
  408.         ld de,objsize
  409. prbulletlist0
  410.         ld a,(ix+(obj_x+1))
  411.         cp TERMINATOR
  412.         ret z
  413.         ld c,(ix+obj_x)
  414.         ld a,(ix+(obj_x+1))
  415.         if coordsfactor !=4
  416.         display "coordsfactor!=4"
  417.         endif
  418.         rra
  419.         rr c
  420.         rra
  421.         rr c
  422.         ld b,(ix+obj_y)
  423.         ld a,(ix+(obj_y+1))
  424.         if coordsfactor !=4
  425.         display "coordsfactor!=4"
  426.         endif
  427.         rra
  428.         rr b
  429.         rra
  430.         rr b
  431. writerebulletaddr=$+1
  432.         ld hl,rebulletlist
  433.         ld (hl),c
  434.         inc hl
  435.         ld (hl),b
  436.         inc hl
  437.         ld (writerebulletaddr),hl
  438.         CALCvalidmapaddr_bcyx_tohl
  439.         ld (hl),VALID1
  440.         COORDSBC_TOSCRHL
  441. ;hl=screen addr
  442.         ld a,c
  443.         and 7 ;a=shift right 0..7
  444.         inc a
  445.         ld b,a ;b=shift right 1..8
  446.         ld a,0x01
  447.         rrca
  448.         djnz $-1
  449.         or (hl)
  450.         ld (hl),a
  451.         ;ld de,objsize
  452.         add ix,de
  453.         jp prbulletlist0
  454.  
  455. cls
  456.         ld hl,0x4000
  457.         call clshl
  458.         ;красим жизни
  459.         ld de,0x581f;scrbuf+0x1800+0x1f
  460.         ld b,maxlives
  461. clscrbuf0
  462.         ld a,0x42 ;bright red
  463.         ld (de),a
  464.         ld a,e
  465.         add a,32
  466.         ld e,a
  467.         djnz clscrbuf0
  468.         ret
  469. clshl
  470.         ld d,h
  471.         ld e,l
  472.         inc de
  473.         ld bc,0x1800
  474.         ld (hl),0;0xff
  475.         ldir
  476.         ld (hl),emptyattr
  477.         ld bc,767
  478.         ldir
  479.         ret
  480. clscrbuf
  481.         ld hl,scrbuf
  482.         call clshl
  483.         ret
  484.  
  485. displaycollisionmap
  486.         ld hl,collisionmap
  487.         ld de,0x5800
  488.         ld b,collisionmaphgt
  489. displaycollisionmap0
  490.         push bc
  491.         ld b,collisionmapwid
  492. displaycollisionmap1
  493.         ld a,(hl)
  494.         inc hl
  495.         add a,7
  496.         or 7
  497.         ld (de),a
  498.         inc de
  499.         djnz displaycollisionmap1
  500.         ld bc,collisionmaplinesize-collisionmapwid
  501.         add hl,bc
  502.         ex de,hl
  503.         ld bc,32-collisionmapwid
  504.         add hl,bc
  505.         ex de,hl
  506.         pop bc
  507.         djnz displaycollisionmap0
  508.         ret
  509.  
  510. restoreobjects
  511.         ld hl,(writereobjaddr)
  512.         ld de,reobjlist
  513.         or a
  514.         sbc hl,de
  515.         jp z,restoreobjects_clear
  516.         ex de,hl
  517.         srl d
  518.         rr e
  519.         ld hx,e
  520. restoreobjects0
  521.         ld c,(hl) ;x
  522.         inc hl
  523.         ld a,(hl) ;y
  524.         and 0xf8
  525.         ld b,a ;округлить!
  526.         inc hl
  527.         push hl
  528.         COORDSBC_TOSCRDE ;de=scrbuf+
  529.         ld a,b
  530.         rra
  531.         rra
  532.         rra
  533.         and 0x1f
  534.         ld l,a ;y (в знакоместах)
  535.         ld a,c
  536.         rra
  537.         rra
  538.         rra
  539.         and 0x1f ;x (в знакоместах)
  540.         call calctilemapaddr_a_l ;hl=tilemapaddr
  541.        
  542.         call restoretile
  543.         inc l ;tilemap
  544.         inc e ;scrbuf
  545.         call restoretile
  546.         inc l ;tilemap
  547.         inc e ;scrbuf
  548.         call restoretile
  549.         ld bc,tilemaplinesize-2
  550.         add hl,bc
  551.         ld a,e
  552.         add a,32-2
  553.         ld e,a
  554.         jr nc,$+6
  555.         ld a,d
  556.         add a,8
  557.         ld d,a
  558.         call restoretile
  559.         inc l ;tilemap
  560.         inc e ;scrbuf
  561.         call restoretile
  562.         inc l ;tilemap
  563.         inc e ;scrbuf
  564.         call restoretile
  565.         ld bc,tilemaplinesize-2
  566.         add hl,bc
  567.         ld a,e
  568.         add a,32-2
  569.         ld e,a
  570.         jr nc,$+6
  571.         ld a,d
  572.         add a,8
  573.         ld d,a
  574.         call restoretile
  575.         inc l ;tilemap
  576.         inc e ;scrbuf
  577.         call restoretile
  578.         inc l ;tilemap
  579.         inc e ;scrbuf
  580.         call restoretile
  581.        
  582.         pop hl
  583.         dec hx
  584.         jp nz,restoreobjects0
  585. restoreobjects_clear
  586.         ld hl,reobjlist
  587.         ld (writereobjaddr),hl
  588.         ret
  589.        
  590. restorebullets
  591.         ld hl,(writerebulletaddr)
  592.         ld de,rebulletlist
  593.         or a
  594.         sbc hl,de
  595.         jp z,restorebullets_clear
  596.         ex de,hl
  597.         srl d
  598.         rr e
  599.         ld hx,e
  600. restorebullets0
  601.         ld c,(hl) ;x
  602.         inc hl
  603.         ld a,(hl) ;y
  604.         and 0xf8
  605.         ld b,a ;округлить!
  606.         inc hl
  607.         push hl
  608.         COORDSBC_TOSCRDE ;de=scrbuf+
  609.         ld a,b
  610.         rra
  611.         rra
  612.         rra
  613.         and 0x1f
  614.         ld l,a ;y (в знакоместах)
  615.         ld a,c
  616.         rra
  617.         rra
  618.         rra
  619.         and 0x1f ;x (в знакоместах)
  620.         call calctilemapaddr_a_l ;hl=tilemapaddr
  621.         call restoretile
  622.         pop hl
  623.         dec hx
  624.         jp nz,restorebullets0
  625. restorebullets_clear
  626.         ld hl,rebulletlist
  627.         ld (writerebulletaddr),hl
  628.         ret
  629.  
  630. restoretile
  631. ;hl=tilemap+
  632. ;de=scrbuf+
  633.         push de ;scrbuf+
  634.         push hl ;tilemap+
  635.         ld l,(hl)
  636.         ld h,tilepic/256 ;hl=tile gfx
  637.         dup 7
  638.         ld a,(hl)
  639.         ld (de),a ;restore scr (y=+0..6)
  640.         inc l
  641.         inc d
  642.         edup
  643.         ld a,(hl)
  644.         ld (de),a ;restore scr (y=+7)
  645.         inc l
  646.         ld a,d ;'scrbuf+7, 'scrbuf+0xf, 'scrbuf+0x17
  647.         ;sub scrbuf/256
  648.         rrca ;0x80+'scrbuf/2+3, 0x80+'scrbuf/2+7, 0x80+'scrbuf/2+0xb
  649.         rrca ;0xc0+'scrbuf/4+1, 0xc0+'scrbuf/4+3, 0xc0+'scrbuf/4+5
  650.         rrca ;0xe0+'scrbuf/8+0, 0xe0+'scrbuf/8+1, 0xe0+'scrbuf/8+2
  651.         ;and 3
  652.         add a,scrbuf/256+0x18 - (0xe0+scrbuf/0x800)
  653.         ld d,a ;de=attraddr
  654.         ld a,(hl)
  655.         ld (de),a ;restore attr
  656.         pop hl ;tilemap+
  657.         ld a,h
  658.         add a,+(validmap-tilemap)/256
  659.         ld d,a
  660.         ld e,l
  661.         ld a,VALID1 ;невалиден, надо перерисовать
  662.         ld (de),a
  663.         pop de ;scrbuf+
  664.         ret
  665.  
  666. prnum
  667.         ld bc,10000
  668.         call prdig
  669.         ld bc,1000
  670.         call prdig
  671.         ld bc,100
  672.         call prdig
  673.         ld bc,10
  674.         call prdig
  675.         ld bc,1
  676. prdig
  677.         ld a,'0'-1
  678. prdig0
  679.         inc a
  680.         or a
  681.         sbc hl,bc
  682.         jr nc,prdig0
  683.         add hl,bc
  684.         ;push hl
  685.         call prchar
  686.         ;pop hl
  687.         ret
  688.        
  689. prcharin
  690.         ld l,a
  691.         ld h,0
  692.         add hl,hl
  693.         add hl,hl
  694.         add hl,hl
  695.         ld bc,font-256;0x3c00
  696.         add hl,bc
  697.         ld b,8
  698. prchar0
  699.         ld a,(hl) ;font
  700.         ld (de),a ;scr
  701.         inc hl
  702.         inc d ;+256
  703.         djnz prchar0
  704.         ret
  705.  
  706. prchar
  707. ;a=code
  708. ;de=screen
  709.         push de
  710.         push hl
  711.         call prcharin
  712.         pop hl
  713.         pop de
  714.         inc e
  715.         ret
  716.        
  717. prtext
  718. ;bc=координаты
  719. ;hl=text
  720. prtext0
  721.         ld a,(hl)
  722.         or a
  723.         ret z
  724.         call prcharxy
  725.         inc hl
  726.         inc c
  727.         jr prtext0
  728.        
  729. calcscrbufaddr
  730. ;de=scrbuf + (y&0x18)+((y*32)&0xff+x)
  731.         ld a,b ;y
  732.         and 0x18
  733.         add a,scrbuf/256
  734.         ld d,a
  735.         ld a,b ;y
  736.         add a,a ;*2
  737.         add a,a ;*4
  738.         add a,a ;*8
  739.         add a,a ;*16
  740.         add a,a ;*32
  741.         add a,c ;x
  742.         ld e,a
  743.         ret
  744.        
  745. calcscraddr
  746. ;de=0x4000 + (y&0x18)+((y*32)&0xff+x)
  747.         ld a,b ;y
  748.         and 0x18
  749.         add a,0x40
  750.         ld d,a
  751.         ld a,b ;y
  752.         add a,a ;*2
  753.         add a,a ;*4
  754.         add a,a ;*8
  755.         add a,a ;*16
  756.         add a,a ;*32
  757.         add a,c ;x
  758.         ld e,a
  759.         ret
  760.        
  761. calcattraddr
  762.         call calcscraddr
  763.         ;call calcattraddr_fromscr
  764. calcattraddr_fromscr
  765. ;de=0x5800 + (y&0x18)/8+((y*32)&0xff+x)
  766.         ld a,d
  767.         ;sub 0x40
  768.         rra
  769.         rra
  770.         rra
  771.         and 3
  772.         add a,0x58
  773.         ld d,a ;de=attraddr
  774.         ret
  775.  
  776. prcharxy
  777. ;a=code
  778. ;bc=yx
  779.         push bc
  780.         push de
  781.         push hl
  782.         push af
  783.         call calcscraddr
  784.         pop af
  785.         push de
  786.         call prcharin
  787.         pop de
  788.         call calcattraddr_fromscr
  789. curattr=$+1
  790.         ld a,0
  791.         ld (de),a
  792.         pop hl
  793.         pop de
  794.         pop bc
  795.         ret
  796.        
  797.         include "sprite.asm"
  798.         include "sprset.ast"
  799.         align 256
  800.         include "tileset.ast"
  801.