home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / LEDGERS / LEDG_05.MSA / SOURCE / SPRITES.S next >
Text File  |  1987-04-22  |  15KB  |  520 lines

  1.  
  2. ;Sprite tutorial number 2
  3.  
  4. ;Source code listing for the Untouchables disk magazine.
  5. ;Coded by Ninja of the Enterprise on the 9th November '91
  6. ;Sprite font by Technotron
  7.  
  8. ;Neither the Untouchables or myself take any responsibility for the
  9. ;accuracy or efficiency of this source code listing.
  10. ;It does exactly what it was designed to do and it is possible to
  11. ;write a faster method but this was designed to teach the basics
  12. ;of sprite masking to those who have no knowledge of that topic.
  13. ;If you require further help then please write to either myself
  14. ;or the Untouchables and they will forward the letter to me.  I
  15. ;hope you can learn something from my work and thanks for being
  16. ;interested in it.
  17.  
  18. ;Well here goes for some equates that make my routines sprite
  19. ;indipendant... just change these values.. (see article for how.)
  20.  
  21. no_blocks = 8
  22. length_in_words = no_blocks*4
  23. height = 29
  24.  
  25. ;Note: The first section of this code is identical to my last article.
  26. ;This is because it is a standard 'demo' initalize method I always use.
  27. ;Feel free to use it in your own code, its a compliment after all!
  28.  
  29.  
  30.  
  31. ;Set the system up for supervisor mode...
  32.     clr.l    -(sp)
  33.     move.w    #$20,-(sp)
  34.     trap    #1
  35.     addq.l    #6,sp
  36.     move.l    d0,stack
  37.     
  38.     bsr    store_and_install_screen_setup
  39.  
  40.     pea    screen_note
  41.     move.w    #9,-(sp)
  42.     trap    #1
  43.     addq.l    #6,sp
  44.     
  45.     move.l    current,a0
  46.     move.l    other,a1
  47.     move.w    #8000,d1        ensure that the both screens
  48. shift    move.l    (a0)+,(a1)+        have the screen note.
  49.     dbf    d1,shift
  50.     
  51.  
  52. ;everything upto this point should have been staright
  53. ;forward and easy to understand (that also includes the contents
  54. ;of 'the store_and_install_screen_setup' subroutine).
  55. ;So now we move onto the tutorial bit...
  56.  
  57. ;As there is an article in the magazine I won't go into
  58. ;to much detail but I will explain the actual routines...
  59.  
  60. ;First we need to set up both the logo and mask buffers...
  61.     bsr    setup_logo_buffers
  62.     bsr    setup_mask_buffers
  63.  
  64. ;So we now have everything ready to go, so here comes the main loop...
  65.  
  66. main_loop
  67.     move.w    #$25,-(sp)
  68.     trap    #14
  69.     addq.l    #2,sp            wait for the vbl
  70.  
  71.     move.l    other,d0
  72.     move.l    current,other        swap the screen buffers
  73.     move.l    d0,current        around.
  74.  
  75.         lsr.w   #8,d0            and now move it directly into
  76.         move.l  d0,$ffff8200.w        the screen hardware registers
  77.  
  78.     bsr    draw_new_sprite        a bit obvious!?!
  79.  
  80.     cmp.b    #$39,$fffffc02.w    'Space' key been pressed yet?...
  81.     bne    main_loop        If not loop again....
  82.  
  83.  
  84. ;So now I close down the program and restore everything
  85. ;back to what it was before this program was executed....
  86.  
  87. ;First the screen address and resolution
  88.     move.w    screen_resolution,-(sp)
  89.     move.l    logical_screen,-(sp)
  90.     move.l    physical_screen,-(sp)
  91.     move.w    #5,-(sp)
  92.     trap    #14
  93.     lea    12(sp),sp
  94.  
  95. ;restore the palette
  96.     movem.l    palette_store,d0-7
  97.     movem.l    d0-7,$ff8240
  98.  
  99.  
  100. ;return to user mode
  101.     move.l    stack,-(sp)
  102.     move.w    #$20,-(sp)
  103.     trap    #1
  104.     addq.l    #6,sp
  105.  
  106.  
  107. ;and terminate the program.
  108.     clr.w    -(sp)
  109.     trap    #1
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117. store_and_install_screen_setup
  118. ;store the current screen state...
  119.     move.w    #2,-(sp)
  120.     trap    #14
  121.     addq.l    #2,sp
  122.     move.l    d0,physical_screen
  123.     move.w    #3,-(sp)
  124.     trap    #14
  125.     addq.l    #2,sp
  126.     move.l    d0,logical_screen
  127.     move.w    #4,-(sp)
  128.     trap    #14
  129.     addq.l    #2,sp
  130.     move.w    d0,screen_resolution
  131.  
  132. ;and also store the palette...
  133.     movem.l    $ff8240,d0-7
  134.     movem.l    d0-7,palette_store
  135.  
  136.  
  137. ;and now I can set the ST to low resolution and my own screen
  138. ;buffer at the end of the program...
  139.  
  140.     move.l    #end_of_program,d0
  141.     add.l    #256,d0            set d0 to a 256 boundary
  142.     clr.b    d0            after the end of the program.
  143.  
  144.     move.l    d0,current
  145.     move.l    d0,other
  146.     add.l    #$8000,other
  147.  
  148.     move.l    d0,a0
  149.     move.w    #$4000,d1        ensure that the new screens
  150. .wipe    move.l    #0,(a0)+        buffer is clean.
  151.     dbf    d1,.wipe
  152.  
  153.     clr.w    -(sp)
  154.     move.l    d0,-(sp)
  155.     move.l    (sp),-(sp)
  156.     move.w    #5,-(sp)        make the resolution and
  157.     trap    #14            screen address changes.
  158.     lea    12(sp),sp
  159.  
  160. ;and install my new palette...
  161.     movem.l    logo_palette,d0-7
  162.     movem.l    d0-7,$ff8240
  163.  
  164.     rts
  165.  
  166.  
  167.  
  168. setup_logo_buffers
  169.     lea    logo_sprite_map,a2
  170.     moveq    #15-1,d0        I need 15 'new' sprites
  171.  
  172. shift_logo
  173. ;get the start of the sprite to be copied and shifted...
  174.     move.l    (a2)+,a0
  175. ;get the start of where the 'new' sprite will be writen...
  176.     move.l    (a2),a1
  177.  
  178.     moveq    #height-1,d1        the sprite is 'height' rows high.
  179. do_next_line
  180.     moveq    #4-1,d2            the sprite has 4 planes.
  181. do_next_plane
  182.  
  183.  
  184. bc    set    0
  185.     rept    no_blocks
  186.     move    bc(a0),bc(a1)        copy the 'bc' 16 pixels in plane.
  187. bc    set    bc+8
  188.     endr
  189.     
  190. bs    set    0
  191.     rept    no_blocks
  192.     roxr    bs(a1)            shift the 'bs' 16 pixels in plane.
  193. bs    set    bs+8
  194.     endr
  195.  
  196.  
  197.     addq    #2,a0            next plane of source sprite.
  198.     addq    #2,a1            next plane of destination sprite.
  199.     dbf    d2,do_next_plane
  200.     lea    (no_blocks-1)*8(a0),a0    next line of source sprite.
  201.     lea    (no_blocks-1)*8(a1),a1    next line of destination sprite.
  202.  
  203.     dbf    d1,do_next_line        do the next line...
  204.     dbf    d0,shift_logo        make another logo...
  205.     rts
  206.  
  207.  
  208.  
  209.  
  210.  
  211. setup_mask_buffers
  212.     lea    logo_sprite_map,a3
  213.     lea    logo_mask_map,a2
  214.     moveq    #16-1,d0        I need 16 masks
  215.  
  216. .mask_a_buffer
  217. ;get the start of the sprite to generate the mask...
  218.     move.l    (a3)+,a0
  219. ;get the start of where the mask will be written...
  220.     move.l    (a2)+,a1
  221.  
  222.     moveq    #height-1,d1        the sprite is 'height' rows high.
  223. .do_next_line
  224.     move.w    #no_blocks-1,d3        the number of blocks in a line.
  225. .do_the_next_block
  226.     clr.l    d6
  227.     move.w    (a0),d6            get plane 1
  228.     or.w    2(a0),d6        or plane 2
  229.     or.w    4(a0),d6        or plane 3
  230.     or.w    6(a0),d6        or plane 4
  231.     swap    d6
  232.     move.w    (a0)+,d6        get plane 1        
  233.     or.w    (a0)+,d6        or plane 2
  234.     or.w    (a0)+,d6        or plane 3
  235.     or.w    (a0)+,d6        or plane 4
  236.     not.l    d6            flip the bits
  237.     move.l    d6,(a1)+        store a mask block
  238.     dbf    d3,.do_the_next_block    
  239.     dbf    d1,.do_next_line    
  240.  
  241.     dbf    d0,.mask_a_buffer    
  242.     rts
  243.  
  244.  
  245. draw_new_sprite
  246. ;First, I need to update the X and Y pointers...
  247.     move.l    x_map_pos,a0
  248.     move.w    (a0)+,x_coord
  249.     cmp.l    #xend,a0
  250.     bls    x_okay
  251.     move.l    #xnew,a0
  252. x_okay    move.l    a0,x_map_pos
  253.     move.l    y_map_pos,a0
  254.     move.w    (a0)+,y_coord
  255.     cmp.l    #yend,a0
  256.     bls    y_okay
  257.     move.l    #ynew,a0
  258. y_okay    move.l    a0,y_map_pos
  259.     bsr    display_sprite
  260.     rts
  261.         
  262.  
  263. display_sprite
  264.     move.l    other,a1    get the new screen
  265.     add.l    #26*160,a1    move to the offset
  266.  
  267. ;unlike last time, the X and Y co-ords are already known, so I can
  268. ;remove a section of the code from the previuos article.
  269.  
  270.     move.w    x_coord,d0
  271.     add.w    #16,d0
  272.     move.w    d0,d4            duplicate the x-axis co-ord.
  273.  
  274. ;decide which of the 16 sprites and masks I will need...
  275.     and    #$f,d4            only want the 1st 4 bits.
  276. ;Get the 16 bit boundary offset...
  277.     and.w    #$fff0,d0        don't want the 1st 4 bits.
  278.  
  279. ;convert x co-ord from an artist co-ord to a coder co-ord..
  280.     ror    d0
  281.  
  282. ;add new x co-ord to the screen..
  283.     lea    (a1,d0.w),a1
  284.  
  285. ;This time, we are going to use the y co-ord also...
  286.     move.w    y_coord,d0
  287.     muls.w    #160,d0            160 bytes to a line remember!?!
  288.     lea    (a1,d0.w),a1
  289.  
  290.  
  291. ;select the sprite from the buffer
  292.     lsl.w    #2,d4            quick multiply by 4
  293.     lea    logo_sprite_map,a0    a0 now points to the table
  294.     move.l    0(a0,d4.w),a0        a0 now points to the sprite.
  295.  
  296. ;select the mask from the buffer
  297.     lea    logo_mask_map,a2    a2 now points to the table
  298.     move.l    0(a2,d4.w),a2        a2 now points to the mask.
  299.  
  300.  
  301. ;So, here comes the bit you've all been waiting for...
  302. ;Yes!! The mask to the screen routine!!!!
  303.  
  304.     move.w    #height-1,d0        'height' number of lines
  305. shift_a_line
  306.     rept    no_blocks
  307.     move.l    (a1),d1            read planes 1 & 2 from the screen.
  308.     and.l    (a2),d1            and the block mask into the above.
  309.     or.l    (a0)+,d1        or sprite planes 1 & 2 as above.
  310.     move.l    d1,(a1)+        write new planes 1 & 2 to screen.
  311.  
  312.     move.l    (a1),d1            read planes 3 & 4 from the screen.
  313.     and.l    (a2)+,d1        and the block mask into the above.
  314.     or.l    (a0)+,d1        or sprite planes 3 & 4 as above.
  315.     move.l    d1,(a1)+        write new planes 3 & 4 to screen.
  316.     endr
  317.     add.l    #160-(8*no_blocks),a1    goto the offset on the next line.
  318.     dbf    d0,shift_a_line
  319.  
  320.     rts
  321.     
  322.         
  323.  
  324.  
  325.  
  326. ;the variables....
  327.  
  328. stack            dc.l    0
  329. physical_screen        dc.l    0
  330. logical_screen        dc.l    0
  331. screen_resolution    dc.w    0
  332. palette_store        ds.w    16
  333. current            dc.l    0
  334. other            dc.l    0
  335.  
  336.  
  337. screen_note
  338.     dc.b    "The 'NINJA' sprite is being masked onto",10,13
  339.     dc.b    "the old copies of itself.",10,13
  340.     dc.b    "Press 'Space' to finish.",10,13
  341.     dc.b    10,10,10,10,10,10,10,10,10,10
  342.     dc.b    10,10,10,10,10,10,10,10,10,10
  343.     dc.b    "Coded by the Ninja of the Enterprise",10,13
  344.     dc.b    "Sprite font by Technotron"
  345.     dc.b    0
  346. x_map
  347.     dc.w    -1
  348. logo_palette
  349.     dc.w    0,$555,$444,$333,$222,0,0,0
  350.     dc.w    0,0,0,0,0,0,0,$777
  351.  
  352. ynew    dc.w    0,1,2,3,4,5,7,9,$B,$D,$F,$12,$15,$18,$1B,$1E
  353.     dc.w    $22,$26,$2A,$2E,$32,$37,$3C,$41,$46,$4B,$4F,$53
  354.     dc.w    $57,$5B,$5F,$62,$65,$68,$6B,$6E,$70,$72,$74,$76
  355.     dc.w    $78,$79,$7A,$7B,$7C,$7D,$7C,$7B,$7A,$79,$78,$76
  356.     dc.w    $74,$72,$70,$6E,$6B,$68,$65,$62,$5F,$5B,$57,$53
  357.     dc.w    $4F,$4B,$46,$41,$3C,$37,$32,$2E,$2A,$26,$22,$1E
  358.     dc.w    $1B,$18,$15,$12,$F,$D,$B,9,7,5,4,3,2,1
  359. yend    dc.w    0
  360.  
  361. xnew    dc.w    1,2,3,4,5,7,9,$B,$D,$F,$12,$15,$18,$1B,$1E,$22
  362.     dc.w    $26,$2A,$2E,$32,$37,$3C,$41,$46,$4B,$51,$57,$5D
  363.     dc.w    $63,$69,$6E,$73,$78,$7D,$82,$86,$8A,$8E,$92,$96
  364.     dc.w    $99,$9C,$9F,$A2,$A5,$A7,$A9,$AB,$AD,$AF,$B0,$B1
  365.     dc.w    $B2,$B3,$B4,$B3,$B2,$B1,$B0,$AF,$AD,$AB,$A9,$A7
  366.     dc.w    $A5,$A2,$9F,$9C,$99,$96,$92,$8E,$8A,$86,$82,$7D
  367.     dc.w    $78,$73,$6E,$69,$63,$5D,$57,$51,$4B,$46,$41,$3C
  368.     dc.w    $37,$32,$2E,$2A,$26,$22,$1E,$1B,$18,$15,$12,$F
  369.     dc.w    $D,$B,9,7,5,4,3,2
  370. xend    dc.w    1
  371.  
  372.  
  373.  
  374. y_map_pos  dc.l    ynew+30
  375. x_map_pos  dc.l    xnew+20
  376.  
  377. x_coord    dc.w    0
  378. y_coord    dc.w    0
  379.  
  380.  
  381. logo_sprite_map
  382.     dc.l    logo0,logo1,logo2,logo3,logo4,logo5,logo6,logo7
  383.     dc.l    logo8,logo9,logo10,logo11,logo12,logo13,logo14,logo15
  384.  
  385. logo_mask_map
  386.     dc.l    mask0,mask1,mask2,mask3,mask4,mask5,mask6,mask7
  387.     dc.l    mask8,mask9,mask10,mask11,mask12,mask13,mask14,mask15
  388.  
  389.  
  390. logo_data
  391. logo0
  392. data_buf
  393. ;line 1
  394.     dc.w    $FC01,0,0,0,$F87E,0,0,0,$1F80,0,0,0,$3F00,0,0,0
  395.     dc.w    $F,0,0,0,$C001,0,0,0,$F800,0,0,0,0,0,0,0
  396. ;line 2
  397.     dc.w    $F801,$8601,0,0,$F07C,$842,0,0,$1F00,$10C0,0,0,$3E00,$2100,0,0
  398.     dc.w    $F,8,0,0,$8001,$4001,0,0,$F000,$800,0,0,0,0,0,0
  399. ;line 3
  400.     dc.w    $F001,$CE01,0,0,$E078,$9866,0,0,$1E00,$19C0,0,0,$3C00,$3300,0,0
  401.     dc.w    $F,$C,0,0,1,$C001,0,0,$E000,$9800,0,0,0,0,0,0
  402. ;line 4
  403.     dc.w    $E001,$FF01,0,0,$C070,$F87E,0,0,$1C00,$1FE0,0,0,$3800,$3F00,0,0
  404.     dc.w    $E,$F,0,0,3,$C003,0,0,$A000,$FC00,0,0,0,0,0,0
  405. ;line 5
  406.     dc.w    $E001,$FF01,0,0,$C070,$F87E,0,0,$1C00,$1FE0,0,0,$3800,$3F00,0,0
  407.     dc.w    $E,$F,0,0,3,$C003,0,0,$A000,$FC00,0,0,0,0,0,0
  408. ;line 6
  409.     dc.w    $E001,$FF81,0,0,$C070,$F87E,0,0,$1C00,$1FF0,0,0,$3800,$3F00,0,0
  410.     dc.w    $E,$F,0,0,3,$C003,0,0,$A000,$FC00,0,0,0,0,0,0
  411. ;line 7
  412.     dc.w    $E001,$FF81,0,0,$C070,$F87E,0,0,$1C00,$1FF0,0,0,$3800,$3F00,0,0
  413.     dc.w    $E,$F,0,0,7,$C007,0,0,$3000,$FE00,0,0,0,0,0,0
  414. ;line 8
  415.     dc.w    $E001,$FDC1,$200,0,$C070,$F87E,0,0,$1C00,$1FB8,$40,0,$3800,$3F00,0,0
  416.     dc.w    $E,$F,0,0,7,$C007,0,0,$3000,$FE00,0,0,0,0,0,0
  417. ;line 9
  418.     dc.w    $E001,$FDC1,$200,0,$C070,$F87E,0,0,$1C00,$1FB8,$40,0,$3800,$3F00,0,0
  419.     dc.w    $E,$F,0,0,7,$C007,0,0,$3000,$FE00,0,0,0,0,0,0
  420. ;line 10
  421.     dc.w    $E001,$FCE1,$300,0,$C070,$F87E,0,0,$1C00,$1F9C,$60,0,$3800,$3F00,0,0
  422.     dc.w    $E,$F,0,0,$E,$C00F,0,0,$3800,$FF00,0,0,0,0,0,0
  423. ;line 11
  424.     dc.w    $E001,$FCE1,$300,0,$C070,$F87E,0,0,$1C00,$1F9C,$60,0,$3800,$3F00,0,0
  425.     dc.w    $E,$F,0,0,$E,$C00F,0,0,$3800,$FF00,0,0,0,0,0,0
  426. ;line 12
  427.     dc.w    $E001,$FC71,$380,0,$C070,$F87E,0,0,$1C00,$1F8E,$70,0,$3800,$3F00,0,0
  428.     dc.w    $E,$F,0,0,$E,$C00F,0,0,$3800,$FF00,0,0,0,0,0,0
  429. ;line 13
  430.     dc.w    $E001,$FC71,$380,0,$C070,$F87E,0,0,$1C00,$1F8E,$70,0,$3800,$3F00,0,0
  431.     dc.w    $E,$F,0,0,$1C,$C01F,0,0,$1C00,$9F80,0,0,0,0,0,0
  432. ;line 14
  433.     dc.w    $E001,$FC39,$1C0,0,$C070,$F87E,0,0,$1C00,$1F87,$38,0,$3800,$3F00,0,0
  434.     dc.w    $E,$F,0,0,$1C,$C01F,0,0,$1C00,$9F80,0,0,0,0,0,0
  435. ;line 15
  436.     dc.w    $E001,$FC39,$1C0,0,$C070,$F87E,0,0,$1C00,$1F87,$38,0,$3800,$3F00,0,0
  437.     dc.w    $E,$F,0,0,$1C,$C01F,0,0,$1C00,$9F80,0,0,0,0,0,0
  438. ;line 16
  439.     dc.w    $E001,$FC1D,$E0,0,$C070,$F87E,0,0,$1C00,$1F83,$1C,0,$3800,$BF00,0,0
  440.     dc.w    $E,$F,0,0,$38,$C03F,0,0,$E00,$FC0,0,0,0,0,0,0
  441. ;line 17
  442.     dc.w    $E001,$FC1D,$E0,0,$C070,$F87E,0,0,$1C00,$1F83,$1C,0,$380F,$BF00,0,0
  443.     dc.w    $C00E,$F,0,0,$3B,$C03C,0,0,$FE00,$3C0,0,0,0,0,0,0
  444. ;line 18
  445.     dc.w    $E001,$FC0F,$70,0,$C070,$F87E,0,0,$1C00,$1F81,$E,0,$380F,$FF08,0,0
  446.     dc.w    $800E,$400F,0,0,$77,$C078,0,0,$FF00,$1E0,0,0,0,0,0,0
  447. ;line 19
  448.     dc.w    $E001,$FC0F,$70,0,$C070,$F87E,0,0,$1C00,$1F81,$E,0,$380F,$FF0C,0,0
  449.     dc.w    $E,$C00F,0,0,$7F,$C070,0,0,$FF00,$E0,0,0,0,0,0,0
  450. ;line 20
  451.     dc.w    $E001,$FC07,$38,0,$C070,$F87E,0,0,$1C00,$1F80,7,0,$380E,$FF0F,0,0
  452.     dc.w    $E,$C00F,0,0,$70,$C070,$F,0,0,$E0,$FF00,0,0,0,0,0
  453. ;line 21
  454.     dc.w    $E001,$FC07,$38,0,$C070,$F87E,0,0,$1C00,$1F80,7,0,$380E,$FF0F,0,0
  455.     dc.w    $E,$C00F,0,0,$E0,$C0F0,$F,0,$80,$F0,$FF00,0,0,0,0,0
  456. ;line 22
  457.     dc.w    $E001,$FC03,$1C,0,$C070,$F87E,0,0,$1C00,$1F80,3,0,$380E,$7F0F,$8000,0
  458.     dc.w    $E,$C00F,0,0,$E0,$C0F8,7,0,$180,$1F0,$FE00,0,0,0,0,0
  459. ;line 23
  460.     dc.w    $E001,$FC03,$1C,0,$C070,$F87E,0,0,$1C00,$1F80,3,0,$380E,$7F0F,$8000,0
  461.     dc.w    $E,$C00F,0,0,$E0,$C0FC,0,0,$380,$3F0,0,0,0,0,0,0
  462. ;line 24
  463.     dc.w    $E001,$FC01,$E,0,$C070,$F87E,0,0,$1C00,$1F80,1,0,$380E,$3F0F,$C000,0
  464.     dc.w    $7FFE,$800F,0,0,$1C0,$C1F8,0,0,$1C0,$1F8,0,0,0,0,0,0
  465. ;line 25
  466.     dc.w    $E001,$FC01,$E,0,$C070,$F87E,0,0,$1C00,$1F80,1,0,$380E,$3F0F,$C000,0
  467.     dc.w    $FFFE,7,0,0,$1C0,$C1F8,0,0,$1C0,$1F8,0,0,0,0,0,0
  468. ;line 26
  469.     dc.w    $E001,$FC01,6,0,$C070,$F87E,0,0,$1C00,$1F80,0,0,$380F,$3F0E,$C000,0
  470.     dc.w    $FFFE,3,0,0,$1C0,$C1F8,0,0,$1C0,$1F8,0,0,0,0,0,0
  471. ;line 27
  472.     dc.w    $C001,$CC01,$3006,0,$8060,$9866,$6018,0,$1800,$1980,$600,0,$300C,$330C,$CC03,0
  473.     dc.w    0,0,$FFFF,0,$300,$C338,$C0,0,$C0,$CC,$30,0,0,0,0,0
  474. ;line 28
  475.     dc.w    $8001,$8401,$7802,0,$40,$842,$F03C,0,$1000,$1080,$F00,0,$2008,$2108,$5E07,0
  476.     dc.w    0,0,$FFFF,0,$200,$4210,$81E0,0,$80,$84,$78,0,0,0,0,0
  477. ;line 29
  478.     dc.w    0,0,$FC03,0,0,0,$F87E,0,0,0,$1F80,0,0,0,$7F0F,0
  479.     dc.w    0,0,$FFFF,0,0,0,$C3F0,0,0,0,$FC,0,0,0,0,0
  480.  
  481.  
  482. logo1    ds.w    length_in_words*height
  483. logo2    ds.w    length_in_words*height
  484. logo3    ds.w    length_in_words*height
  485. logo4    ds.w    length_in_words*height
  486. logo5    ds.w    length_in_words*height
  487. logo6    ds.w    length_in_words*height
  488. logo7    ds.w    length_in_words*height
  489. logo8    ds.w    length_in_words*height
  490. logo9    ds.w    length_in_words*height
  491. logo10    ds.w    length_in_words*height
  492. logo11    ds.w    length_in_words*height
  493. logo12    ds.w    length_in_words*height
  494. logo13    ds.w    length_in_words*height
  495. logo14    ds.w    length_in_words*height
  496. logo15    ds.w    length_in_words*height
  497.  
  498.  
  499. mask_data
  500. mask0    ds.l    no_blocks*height
  501. mask1    ds.l    no_blocks*height
  502. mask2    ds.l    no_blocks*height
  503. mask3    ds.l    no_blocks*height
  504. mask4    ds.l    no_blocks*height
  505. mask5    ds.l    no_blocks*height
  506. mask6    ds.l    no_blocks*height
  507. mask7    ds.l    no_blocks*height
  508. mask8    ds.l    no_blocks*height
  509. mask9    ds.l    no_blocks*height
  510. mask10    ds.l    no_blocks*height
  511. mask11    ds.l    no_blocks*height
  512. mask12    ds.l    no_blocks*height
  513. mask13    ds.l    no_blocks*height
  514. mask14    ds.l    no_blocks*height
  515. mask15    ds.l    no_blocks*height
  516.  
  517. end_of_program
  518.  
  519.  
  520.