home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 86 / asm / source / routines / ascr.h next >
Encoding:
Text File  |  2001-07-01  |  3.4 KB  |  132 lines

  1. ;----------------------------------------------------------------------------
  2. ;--------------------------- putsprite --------------------------------------
  3. ;----------------------------------------------------------------------------
  4. ;in:  de=(x,y); ix=sprite
  5. ;out: ix=behind sprite; hl:a=right below sprite; b=0; d=width; ce=destroyed
  6.  
  7. putsprite:
  8.     ld  a,d            ;a=X
  9.     bit 7,d            ;check sign bit of X
  10.     jr  z,CSpositive    ;X>=0
  11.  
  12.      neg            ;a=|X|
  13.     cp  (ix)        ;off screen?
  14.     ret nc            ;X<=-width: don't draw at all
  15.     ld  b,a            ;b=|X|mod 8=1..7=bits to draw
  16.     ld  a,%11111111        ;all bits set (draw everything)
  17. CSclipleft:
  18.     srl a            ;remove first bit in a for each b
  19.     dnz CSclipleft        ;b=1: a=%01111111
  20.                 ;b=2: a=%00111111
  21.                 ;b=3: a=%00011111
  22.                 ;b=4: a=%00001111
  23.                 ;b=5: a=%00000111
  24.                 ;b=6: a=%00000011
  25.                 ;b=7: a=%00000001
  26.     res 7,d            ;X+128 (right side of screen)
  27.     dec e            ;Y--
  28.     jr  CSdisplay        ;done clipping
  29.  
  30. CSpositive:
  31.     sub 129-8        ;minus (screen width - byte width)
  32.     ld  b,a
  33.     ld  a,%11111111        ;clipmask
  34.     jr  c,CSdisplay        ;x+width<128 then entire sprite is on screen
  35.     inc b            ;b = number of pixels off screen
  36. CSclipright:
  37.     add a,a            ;remove last bit in a for each b
  38.     dnz CSclipright        ;b=1: a=%11111110
  39.                 ;b=2: a=%11111100
  40.                 ;b=3: a=%11111000
  41.                 ;b=4: a=%11110000
  42.                 ;b=5: a=%11100000
  43.                 ;b=6: a=%11000000
  44.                 ;b=7: a=%10000000
  45.                 ;b>7: a=%00000000 = off screen
  46.  
  47. CSdisplay:            ;display the sprite ix at (d,e) masked
  48.     ld  (CSclipmask),a    ;set mask
  49.     cal findpixel        ;convert de to screen location hl:a
  50.     ld  (CSbitmask),a
  51.  
  52.     ld  d,(ix)        ;width
  53.     ld  b,(ix+1)        ;height
  54. CSyloop:
  55.     psh bc            ;save rows to go
  56.     psh hl            ;screen
  57.     ld  b,d            ;width
  58.     ld  a,(ix+2)        ;load image line
  59.     and 255            ;mask
  60. CSclipmask =$-1
  61.     ld  c,a            ;c=image
  62.     inc ix            ;next
  63. CSbitmask =$+1
  64.     ld  a,1            ;saved bitmask
  65. CSxloop:
  66.     sla c            ;test leftmost pixel
  67.     jr  nc,CSnodraw        ;don't draw if it's 0
  68.     ld  e,a            ;psh af: save bitmask
  69.     or  (hl)
  70.     ld  (hl),a        ;OR pixel with screen
  71.     ld  a,e            ;pop af
  72. CSnodraw:
  73.     rrca            ;next bit
  74.     jr  nc,CSbitdrawn    ;carry set if bit "jumped"
  75.     inc hl            ;next byte
  76. CSbitdrawn:
  77.     dnz CSxloop
  78.     pop hl            ;screen at x-offset=0
  79.     ld  bc,16
  80.     add hl,bc        ;next line
  81.     pop bc            ;rows counter
  82.     dnz CSyloop
  83. CSdone:    ret
  84.  
  85. ;------------------------------- findpixel ----------------------------------
  86. ;based upon CLEM's fp | 131 cycles | 28 bytes | in:(d,e); out:hla; destr:de
  87.  
  88. findpixel:
  89.     ld  a,e            ;a=e=Y
  90.     add a,a
  91.     add a,a            ;add a,a is 7 cycles faster than add hl,hl
  92.     ld  h,0            ;switch to hl now (Y<64)
  93.     ld  l,a            ;hl=4*Y
  94.     ld  a,d            ;a=d=X
  95.     rra            ;RRA: carry flag must be reset!
  96.     add hl,hl        ;that's what the adds are for :P
  97.     rra
  98.     add hl,hl        ;hl=16*Y
  99.     rra            ;a=X/8
  100.     or  l
  101.     ld  l,a            ;hl=hl+a
  102.     ld  a,d
  103.     and 7            ;a=X\8
  104.     cpl
  105.     rlca
  106.     rlca
  107.     rlca
  108.     ld (FPbit),a
  109.     xor a
  110. FPbit =$+1
  111.     set 0,a
  112.     ld  de,VIDEO_MEM    ;screen base position (where x+y=0)
  113. PutWhere =$-2
  114.     add hl,de
  115.     ret
  116.  
  117. ;May be replaced by any de-fp that doesn't destroy de
  118. ;Can be integrated in putsprite routine for better performance/smaller size
  119.  
  120. ;----------------------------------------------------------------------------
  121. ;------------------------------- sprites ------------------------------------
  122. ;----------------------------------------------------------------------------
  123. ;format: x-size<=8; y-size; sprite
  124.  
  125. spr_enemy01:
  126.     .db 6,6
  127.     .db %00111100            ;   ████
  128.     .db %01110000            ;  ███
  129.     .db %11110000            ; ████
  130.     .db %11110000            ; ████
  131.     .db %01110000            ;  ███
  132.     .db %00111100            ;   ████