home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / DNTPAPER / DNT_04.MSA / ARCHIVES.DNT / SOURCES.ZIP / BOOTSECT / GAMEBOOT.S < prev    next >
Text File  |  1992-12-07  |  10KB  |  311 lines

  1. ;                       Ze Cubik's Rub Boot-sector
  2. ;
  3. ;(C)oderight NulloS//DNT-Crew 1992
  4. ;
  5. ;Petit jeu nul en boot-sector. La chose la plus inutile depuis l'invention
  6. ;de l'acnée juvénile.
  7. ;
  8.     OPT    o+
  9. TEST    equ    1
  10. LEVEL    equ    96
  11. Forme    equ    5
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. ;Les différentes formes à obtenir, de la plus facile à la plus compliquée.
  14. ;Faites un LEVEL equ 0 pour voir la forme avec vos yeux...
  15. ;Forme=0..... Stop
  16. ;      1..... Demi-portion !
  17. ;      2..... X-tasy
  18. ;      3..... Croix-Rouge
  19. ;      4..... Ca se corse
  20. ;      5..... Koiceca ?
  21. ;      6..... Arrêtez, j'avoue tout!
  22. ;
  23.     IFEQ    Forme
  24. f1    equ    %11110000111100001111000011110000
  25. f2    equ    %11110000111100001111000011110000
  26.     ENDC
  27.     IFEQ    Forme-1
  28. f1    equ    %00000000000000000000000001111110
  29. f2    equ    %01111110000000000000000000000000
  30.     ENDC
  31.     IFEQ    Forme-2
  32. f1    equ    %10111101101111011011110111000011
  33. f2    equ    %11000011101111011011110110111101
  34.     ENDC
  35.     IFEQ    Forme-3
  36. f1    equ    %11100111111001111110011100000000
  37. f2    equ    %00000000111001111110011111100111
  38.     ENDC
  39.     IFEQ    Forme-4
  40. f1    equ    %01000010111111110100001001011010
  41. f2    equ    %01011010010000101111111101000010
  42.     ENDC
  43.     IFEQ    Forme-5
  44. f1    equ    %01111111001110010001100100001111
  45. f2    equ    %00000111011000110110000100000000
  46.     ENDC
  47.     IFEQ    Forme-6
  48. f1    equ    %10101010010101011010101001010101
  49. f2    equ    %10101010010101011010101001010101
  50.     ENDC
  51.  
  52.     
  53.     IFEQ    TEST        ;si test depuis GENST
  54.     clr.l    -(sp)        ;superviseur
  55.     move.w    #$20,-(sp)        ;
  56.     trap    #1        ;
  57.     move.l    d0,2(sp)        ;
  58.  
  59.     moveq    #-1,d0        ;
  60.     clr.w    -(sp)        ;passe en basse résolution
  61.     move.l    d0,-(sp)        ;
  62.     move.l    d0,-(sp)        ;
  63.     move.w    #5,-(sp)        ;
  64.     trap    #14        ;hop!
  65.     addq.l    #8,sp        ;rétablit en partie la pile
  66.     move.l    $432.w,(sp)    ;sauve _membot
  67.     move.l    #buff,$432.w    ;remplace par notre buffer
  68.     movem.l    $ffff8240.w,d0-d7    ;
  69.     movem.l    d0-d7,-(sp)    ;sauve la palette système
  70.     movem.l    standard(pc),d0-d7    ;installe celle du boot
  71.     movem.l    d0-d7,$ffff8240.w    ;
  72.     
  73.     bsr.s    MAIN        ;éxécute
  74.  
  75.     movem.l    (sp)+,d0-d7    ;Restitue tout !
  76.     movem.l    d0-d7,$ffff8240.w    ;
  77.     move.l    (sp)+,$432.w    ;
  78.  
  79.     trap    #1        ;repasse en utilisateur
  80.     clr.w    (sp)        ;et cassos
  81.     trap    #1        ;
  82.  
  83. standard    dc.w    $fff,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$555;palette au boot
  84.     dc.w    $333,$f33,$3f3,$ff3,$33f,$f3f,$3ff,$000;
  85.     ENDC
  86. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  87.     RSRESET
  88. cur_x    rs.w    1        ;position curseur
  89. cur_y    rs.w    1        ;
  90. damier    rs.b    8        ;damier actuel
  91. figure    rs.b    8        ;figure de référence
  92. dsize    rs.b    0        ;
  93.  
  94. MAIN    tst.b    $44c.w        ;résolution ok ?
  95.     beq.s    M_ok        ;
  96.     rts            ;
  97.  
  98. M_ok    pea    Welcome(pc)    ;Un p'tit bonjours..
  99.     move.w    #9,-(sp)        ;Fonction Cconws
  100.     trap    #1        ;La pile est corrigée au finish
  101.  
  102. M_game    lea    $ffff8240.w,a0    ;
  103.     move.w    #$001,(a0)+    ;Fond bleu (mega-classe !)
  104.     move.l    #$04100621,(a0)+    ;installe les couleurs
  105.     move.l    #$0f430444,(a0)+    ;qui vont bien
  106.     move.w    #$0555,6(a0)    ;
  107.     st    14(a0)        ;
  108.     st    20(a0)        ;Texte en blanc
  109.  
  110.     movea.l    $432.w,a6        ;adresse variables
  111.     movea.l    a6,a5        ;adresse du damier
  112.     clr.l    (a5)+        ;curseur en 0,0
  113.  
  114.     move.l    #f1,d6        ;la forme désirée..
  115.     move.l    #f2,d7        ;
  116.     move.l    d6,d4        ;On initialise les tableaux
  117.     move.l    d7,d5        ;figure (l'original)
  118.     movem.l    d4-d7,(a5)        ;et damier (l'aire de jeu)
  119.  
  120.     IFNE    LEVEL        ;Si niveau défini..
  121.     moveq    #LEVEL-1,d6    ;Selon le niveau de jeu
  122. .M_shaker    move.w    #17,(sp)        ;tire un nombre au hasard
  123.     trap    #14        ;
  124.     move.l    d0,d7        ;
  125.     swap    d7        ;On se sert des résultats
  126.     moveq    #7,d3        ;pour construire D0,D1
  127.     and.w    d3,d0        ;coordonnées, et D7 commande
  128.     and.w    d3,d1        ;de rotation
  129.     bsr    Rotate_Damier    ;
  130.     dbf    d6,.M_shaker    ;
  131.     ENDC            ;
  132.  
  133. .M_reaff    moveq    #7,d0        ;8 lignes de damier
  134. .M_line    move.b    0(a5,d0.w),d3    ;récupère la ligne courante
  135.     moveq    #7,d1        ;(= 1 octet). 8 jetons dedans
  136. .M_col    moveq    #0,d2        ;offset écran pour rouge/bleu
  137.     lsl.b    #1,d3        ;fait sortir un bit (l'ordre
  138.     addx.w    d2,d2        ;des bits est l'inverse de l'
  139.     lsl.w    #2,d2        ;ordre d'affichage !!).
  140. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  141. ;D0=No de ligne du damier
  142. ;D1=No de colonne du damier
  143. ;D2=offset couleur (0 pour boule blanche, 4 pour boule rouge)
  144. .Put_Boule    movem.l    d0-a6,-(sp)    ;
  145.     bsr.s    .Centrage        ;
  146.     lea    Boule(pc),a1    ;adresse boule
  147.     moveq    #13,d0        ;14 lignes/boule
  148. .PB_bcl    clr.l    (a0)+        ;commence par effacer
  149.     clr.l    (a0)+        ;l'emplacement de la boule
  150.     move.l    (a1)+,-8(a0,d2.w)    ;puis on l'affiche
  151.     lea    160-8(a0),a0    ;
  152.     dbf    d0,.PB_bcl        ;
  153.     movem.l    (sp)+,d0-a6    ;
  154.     dbf    d1,.M_col        ;colonne suivante.
  155.     dbf    d0,.M_line        ;ligne suivante.
  156.  
  157.     movem.w    (a6),d0-d1        ;emplacement pointeur
  158.     bsr.s    .Centrage        ;on l'affiche oukifo
  159.     moveq    #15,d0        ;
  160.     ror.w    #2,d0        ;D0=$0000c003
  161.     or.l    d0,2(a0)        ;go !
  162.     or.l    d0,13*160+2(a0)    ;
  163.  
  164.     IFEQ    LEVEL        ;Si voir seulement, alors
  165.     bra.s    .WaitKey        ;pas de test "fin de partie"
  166.     ELSE
  167. .TestDamier
  168.     movem.l    (a5),d0-d3        ;on compare le damier à
  169.     cmp.l    d2,d0        ;la référence.
  170.     bne.s    .WaitKey        ;Si pas égal, alors
  171.     cmp.l    d3,d1        ;attend des ordres.
  172.     bne.s    .WaitKey        ;
  173.     moveq    #-1,d0        ;Solution trouvée !!!
  174. .Yeah    addi.w    #1,$ffff8240.w    ;petit slide de couleurs
  175.     subq.w    #1,d0        ;boucle lente pour qu'on
  176.     bne.s    .Yeah        ;ait le temps de voir qqch!!
  177.     bra    M_game        ;recommencer depuis le début
  178.     ENDC
  179. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  180. ;Centrage écran selon D0-D1 coordonnées damier
  181. .Centrage    mulu    #160*16,d0        ;position écran selon ligne
  182.     lsl.w    #3,d1        ;et colonne du damier
  183.     add.w    d1,d0        ;
  184.     movea.w    d0,a0        ;
  185.     adda.l    $44e.w,a0        ;hop, sur l'écran
  186.     lea    41*160+6*8(a0),a0    ;centrage...
  187.     rts            ;Ce RTS sert aussi à sortir
  188.                 ;du boot...
  189.  
  190. .WaitKey    move.w    #7,(sp)        ;Attendre une touche
  191.     trap    #1        ;
  192.     move.l    d0,d7        ;conserve en D7
  193.     move.l    #$000bffff,(sp)    ;puis demande l'état shift
  194.     trap    #13        ;
  195.     swap    d7        ;récupère le scan-code
  196.     subq.w    #1,d7        ;Escape ?
  197.     bne.s    .TstArrows        ;non, alors keltouche ?
  198.     addq.l    #6,sp        ;rétablit la pile (enfin !!)
  199.     rts            ;et hop.
  200.  
  201. .TstArrows    subi.w    #$47,d7        ;Fleche haute ?
  202.     beq.s    .M_10        ;-> d7=%10
  203.     subq.w    #3,d7        ;Fleche gauche ?
  204.     beq.s    .M_00        ;-> d7=%00
  205.     subq.w    #2,d7        ;  "    droite ?
  206.     beq.s    .M_01        ;-> d7=%01
  207.     subq.w    #3,d7        ;  "    bas ?
  208.     bne.s    .WaitKey        ;-> d7=%11
  209.  
  210. .M_11    addq.w    #1,d7        ;Selon la flèche...
  211. .M_10    addq.w    #1,d7        ;
  212. .M_01    addq.w    #1,d7        ;
  213. .M_00    lsl.b    #7,d0        ;bit1 devient C, bit0 devient N
  214.     bcs.s    .M_rot        ;
  215.     bmi.s    .M_rot        ;Si C=1 ou N=1 alors shift
  216.  
  217. .M_dep    lea    cur_x(a6),a0    ;par défaut,dép. sur ligne 
  218.     lsl.b    #7,d7        ;effectiement sur ligne ??
  219.     bcs.s    .M_dep0        ;
  220.     addq.l    #2,a0        ;non, colonne (conserve CCR)
  221. .M_dep0    bmi.s    .M_dep1        ;faut avancer ?
  222.     subq.w    #2,(a0)        ;non, recule
  223. .M_dep1    addq.w    #1,(a0)        ;avance par défaut
  224.     andi.w    #7,(a0)        ;clipping final.
  225.     bra    .M_reaff        ;réaffichage..
  226.  
  227. .M_rot    movem.w    cur_x(a6),d0-d1    ;prendre coord curseur
  228.     bsr.s    Rotate_Damier    ;et rotation comme désiré.
  229.     bra    .M_reaff        ;raffraichit le damier
  230. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  231. ;D0=No de ligne du damier
  232. ;D1=No de colonne du damier
  233. ;D7=type de rotation du damier: bit1=ligne/colonne
  234. ;                               bit0=(gauche-droite)/(haut-bas)
  235. ; Ne pas oublier que l'on voit à l'écran les boules de gauche à droite
  236. ;dans l'ordre des bits faibles à fort, donc la représentation binaire
  237. ;est symétriquement inverse de ce que l'on voit.Donc la case la plus
  238. ;à gauche (colonne 0) correspond au bit 0 (d'où le bset, plus bas).
  239. ;Et si on demande de tourner graphiquement à gauche, il faut faire
  240. ;une rotation à droite (d'où le ror.b).
  241. ;Seul D6 est sauvegardé car Rotate_damier est appelé juste avant le
  242. ;réaffichage (aucun registre n'a besoin d'être sauvegardé), et pendant
  243. ;le brassage au hasard du damier (d6 sert de compteur).
  244. Rotate_Damier
  245.     move.l    d6,-(sp)        ;
  246.     moveq    #1,d5        ;rotations par défaut
  247.     moveq    #6,d6        ;sur les lignes et colonnes
  248.     lsl.b    #7,d7        ;vers la droite et le haut
  249.     bcs.s    .RD_col        ;
  250.  
  251. .RD_line    bpl.s    .RD_l0        ;sens inverse ?
  252.     moveq    #8-1,d5        ;alors rotation à gauche
  253. .RD_l0    lea    0(a5,d0.w),a0    ;ligne voulue, puis procède à
  254.     move.b    (a0),d0        ;la rotation (si d5=1, rotation
  255.     ror.b    d5,d0        ;à droite,si d5=8-1 rotation à
  256.     move.b    d0,(a0)        ;gauche...si si,vérifiez!)
  257.     bra.s    .RD_end        ;cassos
  258.  
  259. .RD_col    bmi.s    .RD_c0        ;sens inverse ?
  260.     moveq    #0,d6        ;alors rotation vers le bas
  261. .RD_c0    movem.l    (a5),d3-d4        ;récupère les octets du damier
  262.     moveq    #0,d0        ;
  263.     bset    d1,d0        ;fixe le bit de la colonne
  264.     ror.w    #8,d0        ;dans chaque octet de d0
  265.     bset    d1,d0        ;
  266.     move.w    d0,d1        ;
  267.     swap    d0        ;
  268.     move.w    d1,d0        ;
  269.     and.l    d0,d3        ;isole ce bit de colonne dans
  270.     and.l    d0,d4        ;les octets du damier
  271.     not.l    d0        ;inverse le masque
  272.     and.l    d0,(a5)+        ;=>mise à zéro de la colonne
  273.     and.l    d0,(a5)+        ;dans les 8 octets
  274. .RD_c1    rol.l    #8,d3        ;rotation à gauche:
  275.     rol.l    #8,d4        ;D3=(b0:b1:b2:b3)⇨(b1:b2:b3:b0)
  276.     eor.b    d3,d4        ;D4=(b4:b5:b6:b7)⇨(b5:b6:b7:b4)
  277.     eor.b    d4,d3        ;puis échange l'octet bas
  278.     eor.b    d3,d4        ;ce qui donne en D3-D4:
  279.     dbf    d6,.RD_c1        ;(b1:b2:b3:b4)-(b5:b6:b7:b0)
  280.     or.l    d4,-(a5)        ;après d6 rotations à gauche,
  281.     or.l    d3,-(a5)        ;fixe les bits colonne comifo
  282. .RD_end    move.l    (sp)+,d6        ;
  283.     rts    
  284.     SECTION    TEXT
  285.  
  286. Boule    dc.w    %0000001111000000,%0000001110000000
  287.     dc.w    %0000111000110000,%0000111111000000
  288.     dc.w    %0001100000001000,%0001111111110000
  289.     dc.w    %0011000000000100,%0011111111111000
  290.     dc.w    %0010000000000100,%0011111111111000
  291.     dc.w    %0110000000000110,%0111111111111000
  292.     dc.w    %0100000000000110,%0111111111111000
  293.     dc.w    %0100000000000110,%0111111111111000
  294.     dc.w    %0100000000001110,%0011111111110000
  295.     dc.w    %0010000000001100,%0001111111110000
  296.     dc.w    %0010000000011100,%0001111111100000
  297.     dc.w    %0001000001111000,%0000111110000000
  298.     dc.w    %0000111111110000,%0000000000000000
  299.     dc.w    %0000001111000000,%0000000000000000
  300.  
  301. Welcome    dc.b    "®DNT 92"
  302.     dc.b    27,'Y',32+1,32+13,"Ze Cubik's Rub"
  303.     dc.b    $d,$a,0
  304.  
  305.  
  306.  
  307.     IFEQ    TEST
  308.     SECTION    BSS
  309.     EVEN
  310. buff    ds.b    40000
  311.     ENDC