home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / misc / gms_dev.lha / GMS / Source / Asm / Demos / Pobs.s < prev    next >
Encoding:
Text File  |  1997-02-16  |  9.6 KB  |  429 lines

  1. ;-------T-------T------------------------T----------------------------------;
  2. ;POBS DEMO
  3. ;---------
  4. ;This demo originally came from the HowToCode series.
  5. ;
  6. ;This demo took just 15 minutes in being converted to a multi-tasking demo,
  7. ;there is no speed loss in run-time.
  8.  
  9.     INCDIR    "INCLUDES:"
  10.     INCLUDE    "exec/exec_lib.i"
  11.     INCLUDE    "games/games_lib.i"
  12.     INCLUDE    "games/games.i"
  13.  
  14. CALL    MACRO
  15.     jsr    _LVO\1(a6)
  16.     ENDM
  17.  
  18. width    EQU    40
  19. height    EQU    256
  20.  
  21.     SECTION    "Pobs",CODE
  22.  
  23. ;==========================================================================;
  24. ;                             INITIALISE DEMO
  25. ;==========================================================================;
  26.  
  27. Start:    MOVEM.L    A0-A6/D1-D7,-(SP)
  28.     move.l    ($4).w,a6
  29.     lea    GMS_Name(pc),a1
  30.     moveq    #$00,d0
  31.     CALL    OpenLibrary
  32.     move.l    d0,GMS_Base
  33.     beq.s    .Error_GMS
  34.  
  35.     move.l    GMS_Base(pc),a6
  36.     sub.l    a0,a0
  37.     CALL    SetUserPrefs
  38.  
  39.     lea    Screen(pc),a0
  40.     CALL    AddScreen
  41.     tst.l    d0
  42.     bne.s    .Error_Screen
  43.  
  44.     CALL    ShowScreen
  45.  
  46.     bsr.s    Main
  47.  
  48. .ReturnToDOS
  49.     move.l    GMS_Base(pc),a6
  50.     lea    Screen(pc),a0
  51.     CALL    DeleteScreen
  52. .Error_Screen
  53.     move.l    GMS_Base(pc),a1
  54.     move.l    ($4).w,a6
  55.     CALL    CloseLibrary
  56. .Error_GMS
  57.     MOVEM.L    (SP)+,A0-A6/D1-D7
  58.     moveq    #$00,d0
  59.     rts
  60.  
  61. ;==========================================================================;
  62. ;                                MAIN LOOP
  63. ;==========================================================================;
  64.  
  65. Main:    bsr.s    InPtabs
  66.     bsr.w    Rmasks
  67.  
  68. .loop    move.l    GMS_Base(pc),a6
  69.     CALL    WaitSVBL
  70.     lea    Screen(pc),a0
  71.     CALL    SwapBuffers
  72.  
  73.     moveq    #BUFFER3,d0
  74.     CALL    ClrScreen
  75.  
  76.     bsr.w    Calc
  77.     bsr.w    Put
  78.  
  79.     cmp.w    #293-1,number
  80.     beq.b    .mouse
  81.     addq.w    #1,number
  82.  
  83. .mouse    move.l    GMS_Base(pc),a6
  84.     moveq    #JPORT1,d0
  85.     CALL    ReadMouse
  86.     btst    #MB_LMB,d0
  87.     beq.s    .loop
  88.     rts
  89.  
  90. ;===========================================================================;
  91. ;                            SET UP POB TABLES
  92. ;===========================================================================;
  93.  
  94. InPtabs    lea    pob_xbuffer,a0    ;a0 = Ptr to XBuffer.
  95.     moveq    #$00,d0    ;d0 = 00.
  96. .xloop    move.w    d0,d1
  97.     and.w    #$000f,d1    ;d1 = $000x
  98.     lsl.w    #6,d1    ;d1 = <<6
  99.     move.w    d1,(a0)+    ;a0 = +d1
  100.     move.w    d0,d1
  101.     and.w    #$fff0,d1    ;d2 = $xxx0
  102.     ror.w    #3,d1    ;d2 = $?xxx
  103.     move.w    d1,(a0)+    ;a0 = +d2
  104.     addq.w    #1,d0    ;d0 = ++1
  105.     cmp.w    #width*8,d0    ;d0 > Is d0 == ScreenWidth?
  106.     bne.b    .xloop
  107.  
  108.     lea    pob_ybuffer,a0
  109.     moveq    #$00,d0
  110. .yloop    move.w    d0,d1
  111.     mulu    #width,d1
  112.     move.l    d1,(a0)+
  113.     addq.w    #1,d0
  114.     cmp.w    #height,d0
  115.     bne.b    .yloop
  116.     rts
  117.  
  118. ;===========================================================================;
  119. ;
  120. ;===========================================================================;
  121.  
  122. Rmasks:    moveq    #0,d7
  123.     lea    shape_buffer,a1
  124. .loop1    lea    pob_shape(pc),a0
  125.     move.w    #16,d6
  126. .loop2    move.l    (a0)+,d0
  127.     ror.l    d7,d0
  128.     move.l    d0,(a1)+
  129.     subq.w    #1,d6
  130.     bne.b    .loop2
  131.     addq.w    #1,d7
  132.     cmpi.w    #16,d7
  133.     bne.b    .loop1
  134.     rts
  135.  
  136. ;===========================================================================;
  137. ;                       ADJUST POB SCREEN POSITIONS
  138. ;===========================================================================;
  139.  
  140. Calc:    move.w    #$eeee,d0
  141.     move.w    #720,d6
  142.     lea    sinx_pointer1(pc),a0
  143.  
  144.     movem.l    (a0),a2/a3/a4/a5
  145.     movem.w    sinx_add1(pc),d2/d3/d4/d5
  146.  
  147.     adda.w    d2,a2
  148.     cmp.w    (a2),d0
  149.     bne.b    .bkip1
  150.     suba.w    d6,a2
  151.  
  152. .bkip1:    adda.w    d3,a3
  153.     cmp.w    (a3),d0
  154.     bne.b    .bkip2
  155.     suba.w    d6,a3
  156.  
  157. .bkip2:    adda.w    d4,a4
  158.     cmp.w    (a4),d0
  159.     bne.b    .bkip3
  160.     suba.w    d6,a4
  161.  
  162. .bkip3:    adda.w    d5,a5
  163.     cmp.w    (a5),d0
  164.     bne.b    .bkip4
  165.     suba.w    d6,a5
  166.  
  167. .bkip4:    movem.l    a2/a3/a4/a5,(a0)
  168.     lea    coord_stack,a0
  169.     movem.w    sinx_dist1(pc),d3-d4/a1/a6
  170.     move.w    d0,d5
  171.     move.w    number(pc),d7    ;d7 = Number of Pobs.
  172. .loop    add.w    d3,a2
  173.     add.w    d4,a3
  174.     cmp.w    (a2),d5
  175.     bne.b    .not_x1
  176.     suba.w    d6,a2
  177. .not_x1    cmp.w    (a3),d5
  178.     bne.b    .not_x2
  179.     suba.w    d6,a3
  180. .not_x2    move.w    (a2),d0
  181.     add.w    (a3),d0
  182.     add.w    a1,a4
  183.     add.w    a6,a5
  184.     cmp.w    (a4),d5
  185.     bne.b    .not_y1
  186.     suba.w    d6,a4
  187. .not_y1    cmp.w    (a5),d5
  188.     bne.b    .not_y2
  189.     suba.w    d6,a5
  190. .not_y2    move.w    (a4),d1
  191.     add.w    (a5),d1
  192.     move.w    d0,(a0)+
  193.     move.w    d1,(a0)+
  194.     dbf    d7,.loop
  195.     rts
  196.  
  197. ;===========================================================================;
  198. ;                          PLACE POBS ON SCREEN
  199. ;===========================================================================;
  200.  
  201. Put:    lea    pob_xbuffer,a0
  202.     lea    pob_ybuffer,a1
  203.     lea    shape_buffer,a4
  204.     move.l    Active(pc),a6
  205.     lea    coord_stack,a5
  206.  
  207.     move.w    number(pc),d7
  208. .loop    movem.w    (a5)+,d0/d1    ;d0 = X, d1 = Y
  209.     add.w    d0,d0
  210.     add.w    d0,d0    ;d0 = (XCoord)*4
  211.     add.w    d1,d1
  212.     add.w    d1,d1    ;d1 = (YCoord)*4
  213.     move.l    (a0,d0.w),d0
  214.     lea    width(a6,d0.w),a3
  215.     add.l    (a1,d1.w),a3
  216.     swap    d0
  217.     lea    (a4,d0.w),a2
  218.     movem.l    (a2),d0-d5    ;d0..d5 = POB Gfx Data. 
  219.     or.l    d0,(a3)
  220.     or.l    d1,width(a3)
  221.     or.l    d2,width*2(a3)
  222.     or.l    d3,width*3(a3)
  223.     or.l    d4,width*4(a3)
  224.     or.l    d5,width*5(a3)
  225.     dbf    d7,.loop
  226.     rts
  227.  
  228. ;===========================================================================;
  229. ;
  230. ;===========================================================================;
  231.  
  232. sinx_pointer1:
  233.     dc.l    sin_xtab
  234. sinx_pointer2:
  235.     dc.l    sin_xtab
  236. siny_pointer1:
  237.     dc.l    sin_ytab
  238. siny_pointer2:
  239.     dc.l    sin_ytab
  240. sinx_add1:
  241.     dc.w    1*2    ;change values here to obtain
  242. sinx_add2:
  243.     dc.w    5*2    ;new patterns
  244. siny_add1:
  245.     dc.w    3*2
  246. siny_add2:
  247.     dc.w    2*2
  248. sinx_dist1:
  249.     dc.w    4*2
  250. sinx_dist2:
  251.     dc.w    3*2
  252. siny_dist1:
  253.     dc.w    1*2
  254. siny_dist2:
  255.     dc.w    2*2
  256. number:    dc.w    0            ;number of 'pobs'
  257.  
  258. sin_xtab:
  259.     dc.w    75,76,78,79,80,82,83,84
  260.     dc.w    85,87,88,89,91,92,93,94
  261.     dc.w    96,97,98,99,101,102,103,104
  262.     dc.w    106,107,108,109,110,111,112,114
  263.     dc.w    115,116,117,118,119,120,121,122
  264.     dc.w    123,124,125,126,127,128,129,130
  265.     dc.w    131,132,132,133,134,135,136,136
  266.     dc.w    137,138,139,139,140,141,141,142
  267.     dc.w    142,143,144,144,145,145,145,146
  268.     dc.w    146,147,147,147,148,148,148,149
  269.     dc.w    149,149,149,149,150,150,150,150
  270.     dc.w    150,150,150,150,150,150,150,150
  271.     dc.w    150,149,149,149,149,149,148,148
  272.     dc.w    148,147,147,147,146,146,145,145
  273.     dc.w    145,144,144,143,142,142,141,141
  274.     dc.w    140,139,139,138,137,136,136,135
  275.     dc.w    134,133,132,132,131,130,129,128
  276.     dc.w    127,126,125,124,123,122,121,120
  277.     dc.w    119,118,117,116,115,114,113,111
  278.     dc.w    110,109,108,107,106,104,103,102
  279.     dc.w    101,99,98,97,96,94,93,92
  280.     dc.w    91,89,88,87,85,84,83,82
  281.     dc.w    80,79,78,76,75,74,72,71
  282.     dc.w    70,68,67,66,65,63,62,61
  283.     dc.w    59,58,57,56,54,53,52,51
  284.     dc.w    49,48,47,46,44,43,42,41
  285.     dc.w    40,39,38,36,35,34,33,32
  286.     dc.w    31,30,29,28,27,26,25,24
  287.     dc.w    23,22,21,20,19,18,18,17
  288.     dc.w    16,15,14,14,13,12,11,11
  289.     dc.w    10,9,9,8,8,7,6,6
  290.     dc.w    5,5,5,4,4,3,3,3
  291.     dc.w    2,2,2,1,1,1,1,1
  292.     dc.w    0,0,0,0,0,0,0,0
  293.     dc.w    0,0,0,0,0,1,1,1
  294.     dc.w    1,1,2,2,2,3,3,3
  295.     dc.w    4,4,5,5,5,6,6,7
  296.     dc.w    8,8,9,9,10,11,11,12
  297.     dc.w    13,14,14,15,16,17,18,18
  298.     dc.w    19,20,21,22,23,24,25,26
  299.     dc.w    27,28,29,30,31,32,33,34
  300.     dc.w    35,36,37,39,40,41,42,43
  301.     dc.w    44,46,47,48,49,51,52,53
  302.     dc.w    54,56,57,58,59,61,62,63
  303.     dc.w    65,66,67,68,70,71,72,74
  304.     dc.w    75
  305.     dc.w    $eeee,$eeee,$eeee,$eeee
  306.     dc.w    $eeee,$eeee,$eeee,$eeee
  307.     dc.w    $eeee,$eeee,$eeee,$eeee
  308.     dc.w    $eeee,$eeee,$eeee,$eeee
  309.     dc.w    $eeee,$eeee,$eeee,$eeee
  310.     dc.w    $eeee,$eeee,$eeee,$eeee
  311.     dc.w    $eeee,$eeee,$eeee,$eeee
  312.     dc.w    $eeee,$eeee,$eeee,$eeee
  313.     dc.w    $eeee,$eeee,$eeee,$eeee
  314.     dc.w    $eeee,$eeee,$eeee,$eeee
  315.  
  316. sin_ytab:
  317.     dc.w    57,59,60,61,62,63,64,65
  318.     dc.w    66,66,67,68,69,70,71,72
  319.     dc.w    73,74,75,76,77,78,79,80
  320.     dc.w    81,82,83,84,84,85,86,87
  321.     dc.w    88,89,90,90,91,92,93,94
  322.     dc.w    94,95,96,97,97,98,99,100
  323.     dc.w    100,101,102,102,103,103,104,105
  324.     dc.w    105,106,106,107,107,108,108,109
  325.     dc.w    109,110,110,110,111,111,112,112
  326.     dc.w    112,112,113,113,113,114,114,114
  327.     dc.w    114,114,114,115,115,115,115,115
  328.     dc.w    115,115,115,115,115,115,115,115
  329.     dc.w    115,115,114,114,114,114,114,114
  330.     dc.w    113,113,113,112,112,112,112,111
  331.     dc.w    111,110,110,110,109,109,108,108
  332.     dc.w    107,107,106,106,105,105,104,103
  333.     dc.w    103,102,102,101,100,100,99,98
  334.     dc.w    97,97,96,95,94,94,93,92
  335.     dc.w    91,90,90,89,88,87,86,85
  336.     dc.w    84,84,83,82,81,80,79,78
  337.     dc.w    77,76,75,74,73,72,71,70
  338.     dc.w    69,68,67,66,66,65,64,63
  339.     dc.w    62,61,60,59,58,56,55,54
  340.     dc.w    53,52,51,50,49,49,48,47
  341.     dc.w    46,45,44,43,42,41,40,39
  342.     dc.w    38,37,36,35,34,33,32,31
  343.     dc.w    31,30,29,28,27,26,25,25
  344.     dc.w    24,23,22,21,21,20,19,18
  345.     dc.w    18,17,16,15,15,14,13,13
  346.     dc.w    12,12,11,10,10,9,9,8
  347.     dc.w    8,7,7,6,6,5,5,5
  348.     dc.w    4,4,3,3,3,3,2,2
  349.     dc.w    2,1,1,1,1,1,1,0
  350.     dc.w    0,0,0,0,0,0,0,0
  351.     dc.w    0,0,0,0,0,0,1,1
  352.     dc.w    1,1,1,1,2,2,2,3
  353.     dc.w    3,3,3,4,4,5,5,5
  354.     dc.w    6,6,7,7,8,8,9,9
  355.     dc.w    10,10,11,12,12,13,13,14
  356.     dc.w    15,15,16,17,18,18,19,20
  357.     dc.w    21,21,22,23,24,25,25,26
  358.     dc.w    27,28,29,30,31,31,32,33
  359.     dc.w    34,35,36,37,38,39,40,41
  360.     dc.w    42,43,44,45,46,47,48,49
  361.     dc.w    49,50,51,52,53,54,55,56
  362.     dc.w    57
  363.     dc.w    $eeee,$eeee,$eeee,$eeee
  364.     dc.w    $eeee,$eeee,$eeee,$eeee
  365.     dc.w    $eeee,$eeee,$eeee,$eeee
  366.     dc.w    $eeee,$eeee,$eeee,$eeee
  367.     dc.w    $eeee,$eeee,$eeee,$eeee
  368.     dc.w    $eeee,$eeee,$eeee,$eeee
  369.     dc.w    $eeee,$eeee,$eeee,$eeee
  370.     dc.w    $eeee,$eeee,$eeee,$eeee
  371.     dc.w    $eeee,$eeee,$eeee,$eeee
  372.     dc.w    $eeee,$eeee,$eeee,$eeee
  373.  
  374. pob_shape:
  375.     dc.w    %0000000110000000,0
  376.     dc.w    %0000000110000000,0
  377.     dc.w    %0000011111100000,0
  378.     dc.w    %0000011111100000,0
  379.     dc.w    %0000000110000000,0
  380.     dc.w    %0000000110000000,0
  381.  
  382. ;===========================================================================;
  383. ;                                  DATA
  384. ;===========================================================================;
  385.  
  386. GMS_Name:
  387.     dc.b    "games.library",0
  388.     even
  389. GMS_Base:
  390.     dc.l    0
  391.  
  392. AMT_PLANES =    1
  393.  
  394. Screen:    dc.l    GSV1,0
  395.     dc.l    ScreenMem    ;Screen memory 1.
  396. Active    dc.l    ScreenMem+height*width    ;Screen memory 2.
  397.     dc.l    ScreenMem+height*width*2 ;Screen memory 3.
  398.     dc.l    0    ;Screen link.
  399.     dc.l    .Palette    ;Address of screen palette.
  400.     dc.l    0    ;Address of rasterlist.
  401.     dc.l    0    ;Amount of colours in palette.
  402.     dc.w    320,256    ;Screen Width and Height.
  403.     dc.w    0,0,0    ;Picture Width/8 and Height.
  404.     dc.w    AMT_PLANES    ;Amount of planes
  405.     dc.w    0,0    ;X/Y screen offset.
  406.     dc.w    0,0    ;X/Y picture offset.
  407.     dc.l    TPLBUFFER    ;Special attributes.
  408.     dc.w    LORES|COL12BIT    ;Screen mode.
  409.     dc.w    PLANAR    ;Screen type
  410.  
  411. .Palette
  412.     dc.w    $0000,$0ff0
  413.  
  414.  
  415.     SECTION    Screens,BSS_C
  416.  
  417. ScreenMem:
  418.     ds.b    (height*width*3)+(width*50)
  419.  
  420. shape_buffer:
  421.     ds.l    256
  422. pob_xbuffer:
  423.     ds.l    (width*8)
  424. pob_ybuffer:
  425.     ds.l    height
  426.  
  427. coord_stack:
  428.     ds.l    1500
  429.