home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI07.ARJ / ictari.07 / ASSEMBLY / SPRITES / GRIDLOCK.S < prev    next >
Text File  |  1993-09-03  |  16KB  |  737 lines

  1.  
  2. ;Demonstration program of Neochrome-Master
  3. ;Sprite generator software by Peter D Hibbs
  4. ;Please send any comments to me at -
  5. ;63 Woolsbridge Road, Ringwood, Dorset BH24 2LX
  6.  
  7.     ttl    'GRIDLOCK word game'
  8.  
  9.     include    d:\devpac3\incdir\gemmacro.i    Change as reqd
  10.  
  11. replay    equ    26    replay button ident
  12. quit    equ    27    quit button ident
  13. tw    equ    19    tile width
  14.  
  15. ;The program proper
  16.  
  17. start_of_pgm    move.l    4(sp),a3    base page
  18.     move.l    #stack,sp    move SP
  19.     move.l    12(a3),d0    text len
  20.     add.l    20(a3),d0    data len
  21.     add.l    28(a3),d0    BSS len
  22.     add.l    #256,d0    basepage
  23.  
  24.     move.l    d0,-(sp)    shrink memory
  25.     move.l    a3,-(sp)
  26.     clr    -(sp)
  27.     move    #$4a,-(sp)
  28.     trap    #1
  29.     lea    12(sp),sp
  30.  
  31.     appl_init        initialise application
  32.     move    d0,ap_id    and store the app ident
  33.     graf_handle        fetch graf handle code
  34.     move    d0,current_handle  and store VDI handle
  35.  
  36.     lea    intin,a0    initialise intin array
  37.     moveq    #10-1,d0    
  38. shell1    move    #1,(a0)+    most params are 1
  39.     dbra    d0,shell1
  40.     move    #2,(a0)+    use RC system
  41.     v_opnvwk        open work station
  42.     v_hide_c        hide mouse
  43.     v_clrwk        clr screen
  44.     vs_clip    #1,#0,#0,#639,#399
  45.     vsl_color    #1
  46.  
  47.  
  48. shell2    bsr    main    run main program
  49.  
  50.  
  51.     v_show_c    #0    show mouse
  52. shell3    v_clsvwk        close workstation
  53.     appl_exit        close application
  54.  
  55.     clr    -(sp)    status code
  56.     move    #$4c,-(sp)    P_TERM
  57.     trap    #1    exit pgm
  58.  
  59.  
  60. ;--------------------- Main program sub-routine ------------------------
  61.  
  62. main    move    #4,-(sp)    chk resolution
  63.     trap    #14
  64.     add    #2,sp
  65.     tst    d0
  66.     bne    main7    bra if not LOW
  67.     
  68.     bsr    savepal    save palette
  69.     
  70.     lea    colours,a0    set new palette
  71.     bsr    palette
  72.     
  73.     bsr    ms_show
  74.     bsr    sprite_init  load sprite file
  75.     bmi    main8    bra if error
  76.  
  77.     
  78.     graf_mouse    #0    make arrow
  79.     bsr    ms_hide        hide mouse
  80.     
  81.     move    #87,d0    display title
  82.     move    #3,d1
  83.     move    #29,d2
  84.     bsr    s_sprite
  85.     
  86.     move    #10,d0    display 1st row tiles 
  87.     move    #34,d1
  88.     move    #1,d2
  89.     move    #13-1,d3
  90. main2    bsr    s_sprite
  91.     add    #1,d2
  92.     add    #25,d0
  93.     dbra    d3,main2
  94.  
  95.     move    #10,d0    display 2nd row tiles 
  96.     move    #59,d1
  97.     move    #13-1,d3
  98. main3    bsr    s_sprite
  99.     add    #1,d2
  100.     add    #25,d0
  101.     dbra    d3,main3
  102.  
  103.     move    #20,d0    display REPLAY button
  104.     move    #160,d1
  105.     move    #30,d2
  106.     bsr    s_sprite
  107.     
  108.     move    #252,d0    display QUIT button
  109.     move    #160,d1
  110.     move    #31,d2
  111.     bsr    s_sprite
  112.  
  113. main5    move    #97,d0    display board
  114.     move    #84,d1
  115.     move    #28,d2
  116.     bsr    s_sprite
  117.         
  118.     bsr    clr_board    erase board buffer
  119.     
  120.     bsr    ms_show
  121. main1    bsr    ms_posn    fetch mouse posn
  122.     tst    d2    and button state
  123.     beq    main1    
  124.     lea    butn_table,a3    access list
  125.     bsr    box_find    check mouse posn
  126.     cmp    #-1,d4        no buttons clicked
  127.     beq    main1
  128.     cmp    #replay,d4    REPLAY button ?
  129.     beq    main5
  130.     cmp    #quit,d4    QUIT button ?
  131.     beq    exit
  132.     cmp    #25,d4    Tiles A-Z ?
  133.     bgt    main1    No !    
  134.         
  135.     bsr    ms_hide
  136.     add    #1,d4    convert box to sprite
  137.     move    d4,d2    and copy to d2
  138.     bsr    m_sprite    display tile to move
  139.     bsr    ms_rlse    wait for button rlse
  140.  
  141. main4    bsr    ms_posn    fetch mouse data
  142.     bsr    vsync    wait for V Sync
  143.     move    d2,d7    d2=button state
  144.     move    d4,d2    d4=selctd tile sprite
  145.     bsr    m_sprite    display tile
  146.     tst    d7    any button pressed
  147.     beq    main4    no so loop
  148.     cmp    #2,d7    right button
  149.     beq    main6
  150.  
  151.     bsr    calc_brd    calc board square
  152.     cmp    #-1,d3    and return in d3
  153.     beq    main4    invalid
  154.  
  155.     lea    board,a0    access square
  156.     add    d3,a0
  157.     tst.b    (a0)    chk if square free
  158.     bne    main4    bra if not
  159.  
  160.     and.l    #$ffff,d3    clear high word d3
  161.     divu    #6,d3    calc square co-ords
  162.     move.l    d3,d0    calc x co-ord
  163.     swap    d0
  164.     mulu    #20,d0
  165.     add    #101+9,d0
  166.     
  167.     move    d3,d1    calc y co-ord
  168.     mulu    #18,d1
  169.     add    #88+8,d1
  170.  
  171.     bsr    m_sprite    copy tile to board
  172.     add    #'A'-1,d4    convert to ASCII
  173.     move.b    d4,(a0)    and store in board buffer
  174.  
  175.     clr.l    spr_buffer    clr buffer to stop redraw
  176.     bsr    ms_rlse    wait for button rlse
  177.     bsr    ms_show    re-show mouse
  178.     bra    main1    and loop
  179.     
  180. main6    move    #-1,d0    erase sprite
  181.     bsr    m_sprite
  182.     bsr    ms_show
  183.     bsr    ms_rlse    wait for button rlse
  184.     bra    main1    main loop
  185.  
  186. main7    bsr    ms_show    display wrong rez message
  187.     form_alert    #1,#alert_str
  188.     rts
  189.     
  190. exit    bsr    restpal    restore palette
  191.     rts        exit program
  192.  
  193. main8    bsr    ms_show
  194.     neg.l    d0
  195.     form_error    d0    display error No
  196.     bra    exit
  197.     
  198. alert_str    dc.b    '[3][| | This program only   |'
  199.     dc.b    '  runs in low rez][ SORRY ]',0
  200.     even
  201.  
  202. ;------- Program Sub-Routines -----------
  203.  
  204. ;Calculate board square from mouse co-ords
  205. ;ENTRY d0=x co-ord
  206. ;      d1=y co-ord
  207. ;EXIT  d3=grid no (0-35) or -1 if not on board
  208.  
  209. calc_brd    movem.l    d0-d2/a0,-(sp)
  210.     lea    board,a0    set a0 to start of grid buffer
  211.     move    #-1,d3
  212.     sub    #100,d0    chk left edge
  213.     bmi    calc_brd1
  214.     cmp    #20*6,d0    chk right edge
  215.     bgt    calc_brd1
  216.     sub    #87,d1    chk top edge
  217.     bmi    calc_brd1
  218.     cmp    #20*6,d1    chk bottom edge
  219.     bgt    calc_brd1
  220.     and.l    #$ffff,d0
  221.     and.l    #$ffff,d1
  222.     divu    #19+1,d0    d0=horiz square
  223.     divu    #17+1,d1    d1=vert square
  224.     mulu    #6,d1
  225.     move    d1,d3
  226.     add    d0,d3    d3=board square No
  227. calc_brd1    movem.l    (sp)+,d0-d2/a0
  228.     rts
  229.  
  230. ;Clear board buffer
  231. ;ENTRY -
  232. ;EXIT  board buffer cleared to 0
  233.  
  234. clr_board    movem.l    d0/a0,-(sp)
  235.     lea    board,a0
  236.     move    #36-1,d0
  237. clr_board1    clr.b    (a0)+
  238.     dbra    d0,clr_board1
  239.     movem.l    (sp)+,d0/a0
  240.     rts
  241.     
  242. ;------- Library Sub-Routines -----------
  243.  
  244. ;Initialise sprite data files and table
  245. ;For use with .OBJ files from Neochrome Master
  246. ;ENTRY 'sprite_file' string holds path and filename of sprite data file
  247. ;       Current disk drive and pathname set up
  248. ;EXIT  various registers corrupted
  249. ;      (screen) holds screen start address
  250. ;      (sprite_tab..) buffer holds table of sprite data
  251. ;      (sprite_data..) buffer holds sprite data
  252. ;      (sprite_mask..) buffer holds sprite mask data
  253. ;      d0 = 0 = file loaded OK or
  254. ;      d0 = negative value = file error (d0=error code)
  255.  
  256. sprite_init    move    #3,-(sp)       fetch screen address
  257.     trap    #14
  258.     addq.l    #2,sp
  259.     move.l    d0,screen       save screen start address
  260.  
  261.     move    #2,-(sp)       open sprite data file
  262.     pea    sprite_file   define path & filename
  263.     move    #$3d,-(sp)
  264.     trap    #1
  265.     addq.l    #8,sp
  266.     move    d0,file_handle
  267.     tst.l    d0
  268.     bmi    sprite_init3          quit if error
  269.  
  270.     lea    sprite_mask,a5    a5 points at mask data
  271.     lea    sprite_tab,a1    a1 points at sprite table
  272.  
  273.     pea    sprite_data    read sprite data
  274.     move.l    #$7fffffff,-(sp)      into sprite data buffer
  275.     move    file_handle,-(sp)
  276.     move    #$3f,-(sp)
  277.     trap    #1
  278.     add.l    #12,sp
  279.     tst.l    d0
  280.     bmi    sprite_init3    quit if error
  281.  
  282.     move    file_handle,-(sp)     close file
  283.     move    #$3e,-(sp)
  284.     trap    #1
  285.     addq.l    #4,sp
  286.     tst.l    d0
  287.     bmi    sprite_init3    quit if error
  288.  
  289.     lea    sprite_data+8,a0    calc No of sprites
  290.     add    (a0),a0
  291.     add    #2+4,a0    set a0 to 1st spr header
  292.     move    (a0)+,d5    fetch No of sprites &
  293.     sub    #1,d5    correct for dbra instr
  294.     move.l    a0,d4    save a0 in d4
  295.  
  296. sprite_init1    move    10(a0),(a1)+    copy width to sprite table
  297.     move    6(a0),d0    copy height-1 to sprite table
  298.     sub    #1,d0    
  299.     move    d0,(a1)+    
  300.     move.b    16(a0),d0
  301.     and    #$ff,d0
  302.     move    d0,(a1)+    copy x offset to table ?
  303.     move.b    17(a0),d0
  304.     move    d0,(a1)+    copy y offset to table ?
  305.     move.l    (a0),d0    copy sprite data address 
  306.     add.l    d4,d0    to sprite table
  307.     move.l    d0,(a1)+
  308.     move.l    d0,a2    and into a2
  309.     move    10(a0),d0    calc size of sprite data
  310.     mulu    6(a0),d0
  311.     move.l    a5,(a1)+    copy sprite mask address to table
  312.     lsr    #3,d0    calc width of mask-1
  313.     sub    #1,d0
  314. sprite_init2    clr    (a5)    generate mask data
  315.     move    (a2)+,d2
  316.     or    d2,(a5)    and copy to buffer
  317.     move    (a2)+,d2
  318.     or    d2,(a5)
  319.     move    (a2)+,d2
  320.     or    d2,(a5)
  321.     move    (a2)+,d2
  322.     or    d2,(a5)+
  323.     dbra    d0,sprite_init2    repeat
  324.     add.l    #20,a0    access next sprite
  325.     dbra    d5,sprite_init1    repeat for all sprites
  326.     clr.l    d0    file loaded OK (d0=0)
  327. sprite_init3    rts
  328.  
  329. ;Draw stationary sprite image 
  330. ;ENTRY d0=x co-ord of hot spot (0-319)
  331. ;      d1=y co-ord of hot spot (0-199)
  332. ;      d2=sprite number (1-n)
  333. ;      sprite_tab table initialised by sprite_init
  334. ;      (screen) holds screen or buffer addr
  335. ;EXIT  No regs changed
  336.  
  337. s_sprite    movem.l    d0-d5/a0-a3,-(sp)
  338.     lea    sprite_tab,a0    set table pointer
  339.     and.l    #$ffff,d2
  340.     sub    #1,d2
  341.     lsl    #4,d2
  342.     add.l    d2,a0
  343.  
  344.     move    (a0)+,d2    d2=width in bytes
  345.     move    (a0)+,d5    d5=No of scanlines-1
  346.     sub    (a0)+,d0    x hot spot
  347.     sub    (a0)+,d1    y hot spot
  348.     move.l    (a0)+,a1    a1=sprite data
  349.     move.l    (a0)+,a3    a3=mask data
  350.  
  351.     move.l    screen,a0    a0=screen start
  352.     move.l    a0,a2
  353.     add    #32000,a2    a2=screen end
  354.     mulu    #160,d1
  355.     add.l    d1,a0    a0=sprite line address
  356.     move    d0,d4
  357.     lsr    #4,d0
  358.     lsl    #3,d0
  359.     add    d0,a0    a0=sprite byte address
  360.     lsr    #3,d2
  361.     subq    #2,d2    d2=corrected width
  362.     and    #$0f,d4    d4=bit shift value
  363. s_sprite6    cmp.l    a2,a0    chk if sprite off bottom of scrn
  364.     bgt    s_sprite2
  365.     cmp.l    screen,a0    chk if sprite off top of scrn
  366.     blt    s_sprite2
  367.  
  368.     movem.l    d2/a0,-(sp) display left chunk
  369.     moveq    #0,d3
  370.     move    (a3),d3
  371.     lsr.l    d4,d3
  372.     not.l    d3
  373.     move    #4-1,d1
  374. s_sprite8    moveq    #0,d0
  375.     move    (a1)+,d0
  376.     lsr.l    d4,d0
  377.     and    d3,(a0)
  378.     or    d0,(a0)+
  379.     dbra    d1,s_sprite8
  380.     subq.l    #8,a1
  381.     cmp    #-1,d2
  382.     beq    s_sprite1
  383.  
  384. s_sprite7    move.l    (a3),d3    display centre chunks
  385.     lsr.l    d4,d3
  386.     not.l    d3
  387.     addq.l    #2,a3
  388.     move    #4-1,d1
  389. s_sprite9    move.l    (a1),d0
  390.     move    8(a1),d0
  391.     addq.l    #2,a1
  392.     lsr.l    d4,d0
  393.     and    d3,(a0)
  394.     or    d0,(a0)+
  395.     dbra    d1,s_sprite9
  396.     dbra    d2,s_sprite7
  397.  
  398. s_sprite1    move.l    (a3),d3    display right chunk
  399.     clr    d3
  400.     addq.l    #2,a3
  401.     lsr.l    d4,d3
  402.     not.l    d3
  403.     move    #4-1,d1
  404. s_sprite0    move.l    (a1),d0
  405.     clr    d0
  406.     addq.l    #2,a1
  407.     lsr.l    d4,d0
  408.     and    d3,(a0)
  409.     or    d0,(a0)+
  410.     dbra    d1,s_sprite0    
  411.     movem.l    (sp)+,d2/a0
  412.     add.l    #160,a0
  413.     dbra    d5,s_sprite6  repeat lines
  414. s_sprite2    movem.l    (sp)+,d0-d5/a0-a3
  415.     rts
  416.  
  417. ;Draw sprite and save backgrnd
  418. ;ENTRY d0=x co-ord (0-319)
  419. ;      d1=y co-ord (0-199)
  420. ;      d2=sprite No (1-nn)
  421. ;      (screen) holds screen addr
  422. ;      (spr_buffer) clear or holds data
  423. ;      (sprite_tab..) holds table
  424. ;EXIT  Old sprite restored and 
  425. ;      new sprite displayed
  426.  
  427. m_sprite    movem.l    d0-d5/a0-a4,-(sp)
  428.     lea    sprite_tab,a0    set table pointer
  429.     and.l    #$ffff,d2
  430.     sub    #1,d2
  431.     lsl    #4,d2
  432.     add.l    d2,a0
  433.  
  434.     move.l    screen,a4    a4=screen limit
  435.     add    #32000,a4    
  436.  
  437.     move    (a0)+,d2    d2=width in bytes
  438.     move    (a0)+,d5    d5=No of scanlines-1
  439.     sub    (a0)+,d0    x hot spot ??
  440.     sub    (a0)+,d1    y hot spot ??
  441.     move.l    (a0)+,a1    a1=sprite data
  442.     move.l    (a0)+,a3    a3=mask data
  443.     
  444.     lea    spr_buffer,a2
  445.     tst.l    (a2)
  446.     beq    m_sprite1    skip if no image stored
  447.     
  448.     move.l    (a2)+,a0    fetch scrn address
  449.     move    (a2)+,d6    fetch width (bytes)
  450.     move    (a2)+,d3    fetch height
  451.         
  452. m_sprite2    movem.l    d6/a0,-(sp)   copy buffer to scrn
  453. m_sprite3    move    (a2)+,(a0)+
  454.     dbra    d6,m_sprite3
  455.     movem.l    (sp)+,d6/a0
  456.     add.l    #160,a0
  457.     cmp.l    a4,a0
  458.     bgt    m_sprite13
  459.     dbra    d3,m_sprite2
  460. m_sprite13    lea    spr_buffer,a2
  461.     clr.l    (a2)    erase buffer
  462.  
  463. m_sprite1    cmp    #319,d0    exit if invalid co-ords
  464.     bhi    m_sprite10
  465.     cmp    #199,d1
  466.     bhi    m_sprite10
  467.     
  468.     move.l    screen,a0    calc sprite addr
  469.     mulu    #160,d1
  470.     add.l    d1,a0
  471.     
  472.     move    d0,d4
  473.     lsr    #4,d0
  474.     lsl    #3,d0
  475.     add    d0,a0
  476.     
  477.     move    d2,d3
  478.     lsr    #1,d3
  479.     addq    #4,d3
  480.     
  481.     move.l    a0,(a2)+    copy addr to buffer
  482.     move    d3,(a2)+    copy width to buffer
  483.     move    d5,(a2)+    copy height to buff
  484.     
  485.     movem.l    d5/a0,-(sp)  copy screen data to buffer
  486. m_sprite4    movem.l    d3/a0,-(sp)
  487. m_sprite5    move    (a0)+,(a2)+
  488.     dbra    d3,m_sprite5
  489.     movem.l    (sp)+,d3/a0
  490.     add.l    #160,a0
  491.     cmp.l    a4,a0
  492.     bgt    m_sprite12
  493.     dbra    d5,m_sprite4
  494. m_sprite12    movem.l    (sp)+,d5/a0
  495.     
  496.     lsr    #3,d2    
  497.     subq    #2,d2
  498.     and    #$0f,d4
  499. m_sprite6    cmp.l    a4,a0    chk end of screen    
  500.     bgt    m_sprite10
  501.     cmp.l    screen,a0    chk start of screen
  502.     blt    m_sprite10
  503.     
  504.     movem.l    d2/a0,-(sp)  display sprite
  505.     moveq    #0,d3
  506.     move    (a3),d3
  507.     lsr.l    d4,d3
  508.     not.l    d3
  509.     move    #4-1,d1
  510. m_sprite8    moveq    #0,d0
  511.     move    (a1)+,d0
  512.     lsr.l    d4,d0
  513.     and    d3,(a0)
  514.     or    d0,(a0)+
  515.     dbra    d1,m_sprite8
  516.     subq.l    #8,a1
  517.     cmp    #-1,d2
  518.     beq    m_sprite11
  519. m_sprite7    move.l    (a3),d3
  520.     lsr.l    d4,d3
  521.     not.l    d3
  522.     addq.l    #2,a3
  523.     move    #4-1,d1
  524. m_sprite9    move.l    (a1),d0
  525.     move    8(a1),d0
  526.     addq.l    #2,a1
  527.     lsr.l    d4,d0
  528.     and    d3,(a0)
  529.     or    d0,(a0)+
  530.     dbra    d1,m_sprite9
  531.     dbra    d2,m_sprite7
  532. m_sprite11    move.l    (a3),d3
  533.     clr    d3
  534.     addq.l    #2,a3
  535.     lsr.l    d4,d3
  536.     not.l    d3
  537.     move    #4-1,d1
  538. m_sprite0    move.l    (a1),d0
  539.     clr    d0
  540.     addq.l    #2,a1
  541.     lsr.l    d4,d0
  542.     and    d3,(a0)
  543.     or    d0,(a0)+
  544.     dbra    d1,m_sprite0    
  545.     movem.l    (sp)+,d2/a0
  546.     add.l    #160,a0
  547.     dbra    d5,m_sprite6
  548. m_sprite10    movem.l    (sp)+,d0-d5/a0-a4
  549.     rts
  550.  
  551. ;Fetch mouse co-ordinates
  552. ;EXIT  d0=x co-ords
  553. ;      d1=y co-ords
  554. ;      d2=mouse buttons status
  555.  
  556. ms_posn    movem.l    a0-a3,-(sp)
  557.     vq_mouse
  558.     move    ptsout,d0
  559.     move    ptsout+2,d1
  560.     move    intout,d2
  561.     movem.l    (sp)+,a0-a3
  562.     rts
  563.  
  564. ;waits till mouse button released
  565.  
  566. ms_rlse    movem.l    d0-d3,-(sp)
  567. msrlse1    bsr    ms_posn
  568.     tst    d2
  569.     bne    msrlse1
  570.     movem.l    (sp)+,d0-d3
  571.     rts
  572.  
  573. ;waits till mouse button operated
  574.  
  575. ms_optd    move    d2,-(sp)
  576. msoptd1    bsr    ms_posn
  577.     tst    d2
  578.     beq    msoptd1
  579.     move    (sp)+,d2
  580.     rts        
  581.  
  582. ;show mouse cursor
  583.                                                                       
  584. ms_show    movem.l    a0-a4/d0-d4,-(sp)
  585.     v_show_c    #1
  586.     movem.l    (sp)+,a0-a4/d0-d4
  587.     rts
  588.  
  589. ;hide mouse cursor
  590.  
  591. ms_hide    movem.l    a0-a4/d0-d4,-(sp)
  592.     v_hide_c
  593.     movem.l    (sp)+,a0-a4/d0-d4
  594.     rts
  595.  
  596. ;set up colours
  597. ;ENTRY a0=colour data address
  598. ;EXIT  No regs changed
  599. ;      Colours changed
  600.     
  601. palette    movem.l    d0-d2/a0-a2,-(sp)
  602.     move.l    a0,-(sp)
  603.     move    #6,-(sp)
  604.     trap    #14
  605.     addq.l    #6,sp
  606.     movem.l    (sp)+,d0-d2/a0-a2
  607.     rts
  608.  
  609. ;save colour palette to RAM
  610. ;ENTRY --
  611. ;EXIT  current palette in 'colbuff'
  612. ;      no regs changed
  613.  
  614. savepal    movem.l    d0-d2/a0-a2,-(sp)
  615.     clr    d1
  616.     move    #16-1,d2
  617.     lea    colbuff,a0
  618. savepl1    movem.l    d1/d2/a0,-(sp)
  619.     move    #-1,-(sp)
  620.     move    d1,-(sp)
  621.     move    #7,-(sp)
  622.     trap    #14
  623.     add.l    #6,sp
  624.     movem.l    (sp)+,d1/d2/a0
  625.     move    d0,(a0)+
  626.     add    #1,d1
  627.     dbra    d2,savepl1
  628.     movem.l    (sp)+,d0-d2/a0-a2
  629.     rts
  630.     
  631. ;restore colour palette
  632. ;ENTRY  colours saved in colbuff
  633. ;EXIT   palette restored
  634.  
  635. restpal    move.l    a0,-(sp)
  636.     lea    colbuff,a0
  637.     bsr    palette        
  638.     move.l    (sp)+,a0
  639.     rts
  640.         
  641. ;Finds a predefined box with mouse cursor
  642. ;ENTRY  a3=address of box list
  643. ;       d0=x co-ord of mouse
  644. ;       d1=y co-ord of mouse
  645. ;EXIT   d4=-1 (not valid) or box number (0-n)
  646.  
  647. box_find    move.l    a3,-(sp)    save a3
  648.     move    #-1,d4    set counter
  649.     sub.l    #8,a3    dec list pointer
  650. box_find1    add.l    #8,a3    inc list pointer
  651.     addq    #1,d4    inc counter
  652.     cmp    #-1,(a3)    end of list ?
  653.     beq    box_find2    bra if so
  654.     cmp    (a3),d0    
  655.     ble    box_find1    loop if to left
  656.     cmp    4(a3),d0
  657.     bge    box_find1    loop if to right
  658.     cmp    2(a3),d1
  659.     ble    box_find1    loop if above
  660.     cmp    6(a3),d1
  661.     bge    box_find1    loop if below
  662. box_find3    move.l    (sp)+,a3    must be in box, d4=box No
  663.     rts
  664.     
  665. box_find2    move    #-1,d4    d4=-1 if no box found
  666.     bra    box_find3
  667.  
  668. ;Waits for vertical sync pulse
  669.  
  670. vsync    movem.l    d0-d2/a0-a2,-(sp)
  671.     move    #37,-(sp)
  672.     trap    #14
  673.     addq.l    #2,sp
  674.     movem.l    (sp)+,d0-d2/a0-a2
  675.     rts
  676.  
  677.     
  678.     SECTION    data    global constants
  679.  
  680. sprite_file    dc.b    'D:\NEOCHROM.E\PICTURES\GRIDLOCK.OBJ',0    change as reqd
  681.     even
  682.  
  683. colours    dc.w    $0000,$0000,$0730,$0656,$0576,$0554,$0070,$0555
  684.     dc.w    $0764,$0057,$0111,$0633,$0775,$0444,$0423,$0700
  685.  
  686. butn_table    dc.w    0,25,0+tw,41    tile A
  687.     dc.w    25,25,25+tw,41    tile B
  688.     dc.w    50,25,50+tw,41    tile C
  689.     dc.w    75,25,75+tw,41    tile D
  690.     dc.w    100,25,100+tw,41    tile E
  691.     dc.w    125,25,125+tw,41    tile F
  692.     dc.w    150,25,150+tw,41    tile G
  693.     dc.w    175,25,175+tw,41    tile H
  694.     dc.w    200,25,200+tw,41    tile I
  695.     dc.w    225,25,225+tw,41    tile J
  696.     dc.w    250,25,250+tw,41    tile K
  697.     dc.w    275,25,275+tw,41    tile L
  698.     dc.w    300,25,300+tw,41    tile M
  699.     
  700.     dc.w    0,50,0+tw,66    tile N
  701.     dc.w    25,50,25+tw,66    tile O
  702.     dc.w    50,50,50+tw,66    tile P
  703.     dc.w    75,50,75+tw,66    tile Q
  704.     dc.w    100,50,100+tw,66    tile R
  705.     dc.w    125,50,125+tw,66    tile S
  706.     dc.w    150,50,150+tw,66    tile T
  707.     dc.w    175,50,175+tw,66    tile U
  708.     dc.w    200,50,200+tw,66    tile V
  709.     dc.w    225,50,225+tw,66    tile W
  710.     dc.w    250,50,250+tw,66    tile X
  711.     dc.w    275,50,275+tw,66    tile Y
  712.     dc.w    300,50,300+tw,66    tile Z
  713.         
  714.     dc.w    20,160,20+48,160+13    REPLAY
  715.     dc.w    252,160,252+48,160+13    QUIT
  716.     
  717.     dc.w    -1
  718.  
  719.     SECTION    bss    temporary data
  720.  
  721. ap_id        ds.w     1    application ident
  722. screen        ds.l    1    screen address
  723. colbuff        ds.w    16    palette data
  724. board        ds.b    6*6    board buffer
  725.  
  726. file_handle    ds.w    1    file handle
  727. sprite_data    ds.b    16698    sprite data size
  728. sprite_mask    ds.b    16698/4    sprite data divided by 4
  729. sprite_tab        ds.b    32*16    No of sprites=32
  730. spr_buffer        ds.b    2000    generous buffer for moveable spr
  731.  
  732.         ds.l    100    stack space (400 bytes)
  733. stack        ds.w    1    (stacks go backwards)
  734.  
  735.     include    d:\devpac3\incdir\aeslib.s    Change as reqd
  736.     include    d:\devpac3\incdir\vdilib.s    Change as reqd
  737.