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 >
Wrap
Text File
|
1992-12-07
|
10KB
|
311 lines
; Ze Cubik's Rub Boot-sector
;
;(C)oderight NulloS//DNT-Crew 1992
;
;Petit jeu nul en boot-sector. La chose la plus inutile depuis l'invention
;de l'acnée juvénile.
;
OPT o+
TEST equ 1
LEVEL equ 96
Forme equ 5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Les différentes formes à obtenir, de la plus facile à la plus compliquée.
;Faites un LEVEL equ 0 pour voir la forme avec vos yeux...
;Forme=0..... Stop
; 1..... Demi-portion !
; 2..... X-tasy
; 3..... Croix-Rouge
; 4..... Ca se corse
; 5..... Koiceca ?
; 6..... Arrêtez, j'avoue tout!
;
IFEQ Forme
f1 equ %11110000111100001111000011110000
f2 equ %11110000111100001111000011110000
ENDC
IFEQ Forme-1
f1 equ %00000000000000000000000001111110
f2 equ %01111110000000000000000000000000
ENDC
IFEQ Forme-2
f1 equ %10111101101111011011110111000011
f2 equ %11000011101111011011110110111101
ENDC
IFEQ Forme-3
f1 equ %11100111111001111110011100000000
f2 equ %00000000111001111110011111100111
ENDC
IFEQ Forme-4
f1 equ %01000010111111110100001001011010
f2 equ %01011010010000101111111101000010
ENDC
IFEQ Forme-5
f1 equ %01111111001110010001100100001111
f2 equ %00000111011000110110000100000000
ENDC
IFEQ Forme-6
f1 equ %10101010010101011010101001010101
f2 equ %10101010010101011010101001010101
ENDC
IFEQ TEST ;si test depuis GENST
clr.l -(sp) ;superviseur
move.w #$20,-(sp) ;
trap #1 ;
move.l d0,2(sp) ;
moveq #-1,d0 ;
clr.w -(sp) ;passe en basse résolution
move.l d0,-(sp) ;
move.l d0,-(sp) ;
move.w #5,-(sp) ;
trap #14 ;hop!
addq.l #8,sp ;rétablit en partie la pile
move.l $432.w,(sp) ;sauve _membot
move.l #buff,$432.w ;remplace par notre buffer
movem.l $ffff8240.w,d0-d7 ;
movem.l d0-d7,-(sp) ;sauve la palette système
movem.l standard(pc),d0-d7 ;installe celle du boot
movem.l d0-d7,$ffff8240.w ;
bsr.s MAIN ;éxécute
movem.l (sp)+,d0-d7 ;Restitue tout !
movem.l d0-d7,$ffff8240.w ;
move.l (sp)+,$432.w ;
trap #1 ;repasse en utilisateur
clr.w (sp) ;et cassos
trap #1 ;
standard dc.w $fff,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$555;palette au boot
dc.w $333,$f33,$3f3,$ff3,$33f,$f3f,$3ff,$000;
ENDC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RSRESET
cur_x rs.w 1 ;position curseur
cur_y rs.w 1 ;
damier rs.b 8 ;damier actuel
figure rs.b 8 ;figure de référence
dsize rs.b 0 ;
MAIN tst.b $44c.w ;résolution ok ?
beq.s M_ok ;
rts ;
M_ok pea Welcome(pc) ;Un p'tit bonjours..
move.w #9,-(sp) ;Fonction Cconws
trap #1 ;La pile est corrigée au finish
M_game lea $ffff8240.w,a0 ;
move.w #$001,(a0)+ ;Fond bleu (mega-classe !)
move.l #$04100621,(a0)+ ;installe les couleurs
move.l #$0f430444,(a0)+ ;qui vont bien
move.w #$0555,6(a0) ;
st 14(a0) ;
st 20(a0) ;Texte en blanc
movea.l $432.w,a6 ;adresse variables
movea.l a6,a5 ;adresse du damier
clr.l (a5)+ ;curseur en 0,0
move.l #f1,d6 ;la forme désirée..
move.l #f2,d7 ;
move.l d6,d4 ;On initialise les tableaux
move.l d7,d5 ;figure (l'original)
movem.l d4-d7,(a5) ;et damier (l'aire de jeu)
IFNE LEVEL ;Si niveau défini..
moveq #LEVEL-1,d6 ;Selon le niveau de jeu
.M_shaker move.w #17,(sp) ;tire un nombre au hasard
trap #14 ;
move.l d0,d7 ;
swap d7 ;On se sert des résultats
moveq #7,d3 ;pour construire D0,D1
and.w d3,d0 ;coordonnées, et D7 commande
and.w d3,d1 ;de rotation
bsr Rotate_Damier ;
dbf d6,.M_shaker ;
ENDC ;
.M_reaff moveq #7,d0 ;8 lignes de damier
.M_line move.b 0(a5,d0.w),d3 ;récupère la ligne courante
moveq #7,d1 ;(= 1 octet). 8 jetons dedans
.M_col moveq #0,d2 ;offset écran pour rouge/bleu
lsl.b #1,d3 ;fait sortir un bit (l'ordre
addx.w d2,d2 ;des bits est l'inverse de l'
lsl.w #2,d2 ;ordre d'affichage !!).
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;D0=No de ligne du damier
;D1=No de colonne du damier
;D2=offset couleur (0 pour boule blanche, 4 pour boule rouge)
.Put_Boule movem.l d0-a6,-(sp) ;
bsr.s .Centrage ;
lea Boule(pc),a1 ;adresse boule
moveq #13,d0 ;14 lignes/boule
.PB_bcl clr.l (a0)+ ;commence par effacer
clr.l (a0)+ ;l'emplacement de la boule
move.l (a1)+,-8(a0,d2.w) ;puis on l'affiche
lea 160-8(a0),a0 ;
dbf d0,.PB_bcl ;
movem.l (sp)+,d0-a6 ;
dbf d1,.M_col ;colonne suivante.
dbf d0,.M_line ;ligne suivante.
movem.w (a6),d0-d1 ;emplacement pointeur
bsr.s .Centrage ;on l'affiche oukifo
moveq #15,d0 ;
ror.w #2,d0 ;D0=$0000c003
or.l d0,2(a0) ;go !
or.l d0,13*160+2(a0) ;
IFEQ LEVEL ;Si voir seulement, alors
bra.s .WaitKey ;pas de test "fin de partie"
ELSE
.TestDamier
movem.l (a5),d0-d3 ;on compare le damier à
cmp.l d2,d0 ;la référence.
bne.s .WaitKey ;Si pas égal, alors
cmp.l d3,d1 ;attend des ordres.
bne.s .WaitKey ;
moveq #-1,d0 ;Solution trouvée !!!
.Yeah addi.w #1,$ffff8240.w ;petit slide de couleurs
subq.w #1,d0 ;boucle lente pour qu'on
bne.s .Yeah ;ait le temps de voir qqch!!
bra M_game ;recommencer depuis le début
ENDC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Centrage écran selon D0-D1 coordonnées damier
.Centrage mulu #160*16,d0 ;position écran selon ligne
lsl.w #3,d1 ;et colonne du damier
add.w d1,d0 ;
movea.w d0,a0 ;
adda.l $44e.w,a0 ;hop, sur l'écran
lea 41*160+6*8(a0),a0 ;centrage...
rts ;Ce RTS sert aussi à sortir
;du boot...
.WaitKey move.w #7,(sp) ;Attendre une touche
trap #1 ;
move.l d0,d7 ;conserve en D7
move.l #$000bffff,(sp) ;puis demande l'état shift
trap #13 ;
swap d7 ;récupère le scan-code
subq.w #1,d7 ;Escape ?
bne.s .TstArrows ;non, alors keltouche ?
addq.l #6,sp ;rétablit la pile (enfin !!)
rts ;et hop.
.TstArrows subi.w #$47,d7 ;Fleche haute ?
beq.s .M_10 ;-> d7=%10
subq.w #3,d7 ;Fleche gauche ?
beq.s .M_00 ;-> d7=%00
subq.w #2,d7 ; " droite ?
beq.s .M_01 ;-> d7=%01
subq.w #3,d7 ; " bas ?
bne.s .WaitKey ;-> d7=%11
.M_11 addq.w #1,d7 ;Selon la flèche...
.M_10 addq.w #1,d7 ;
.M_01 addq.w #1,d7 ;
.M_00 lsl.b #7,d0 ;bit1 devient C, bit0 devient N
bcs.s .M_rot ;
bmi.s .M_rot ;Si C=1 ou N=1 alors shift
.M_dep lea cur_x(a6),a0 ;par défaut,dép. sur ligne
lsl.b #7,d7 ;effectiement sur ligne ??
bcs.s .M_dep0 ;
addq.l #2,a0 ;non, colonne (conserve CCR)
.M_dep0 bmi.s .M_dep1 ;faut avancer ?
subq.w #2,(a0) ;non, recule
.M_dep1 addq.w #1,(a0) ;avance par défaut
andi.w #7,(a0) ;clipping final.
bra .M_reaff ;réaffichage..
.M_rot movem.w cur_x(a6),d0-d1 ;prendre coord curseur
bsr.s Rotate_Damier ;et rotation comme désiré.
bra .M_reaff ;raffraichit le damier
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;D0=No de ligne du damier
;D1=No de colonne du damier
;D7=type de rotation du damier: bit1=ligne/colonne
; bit0=(gauche-droite)/(haut-bas)
; Ne pas oublier que l'on voit à l'écran les boules de gauche à droite
;dans l'ordre des bits faibles à fort, donc la représentation binaire
;est symétriquement inverse de ce que l'on voit.Donc la case la plus
;à gauche (colonne 0) correspond au bit 0 (d'où le bset, plus bas).
;Et si on demande de tourner graphiquement à gauche, il faut faire
;une rotation à droite (d'où le ror.b).
;Seul D6 est sauvegardé car Rotate_damier est appelé juste avant le
;réaffichage (aucun registre n'a besoin d'être sauvegardé), et pendant
;le brassage au hasard du damier (d6 sert de compteur).
Rotate_Damier
move.l d6,-(sp) ;
moveq #1,d5 ;rotations par défaut
moveq #6,d6 ;sur les lignes et colonnes
lsl.b #7,d7 ;vers la droite et le haut
bcs.s .RD_col ;
.RD_line bpl.s .RD_l0 ;sens inverse ?
moveq #8-1,d5 ;alors rotation à gauche
.RD_l0 lea 0(a5,d0.w),a0 ;ligne voulue, puis procède à
move.b (a0),d0 ;la rotation (si d5=1, rotation
ror.b d5,d0 ;à droite,si d5=8-1 rotation à
move.b d0,(a0) ;gauche...si si,vérifiez!)
bra.s .RD_end ;cassos
.RD_col bmi.s .RD_c0 ;sens inverse ?
moveq #0,d6 ;alors rotation vers le bas
.RD_c0 movem.l (a5),d3-d4 ;récupère les octets du damier
moveq #0,d0 ;
bset d1,d0 ;fixe le bit de la colonne
ror.w #8,d0 ;dans chaque octet de d0
bset d1,d0 ;
move.w d0,d1 ;
swap d0 ;
move.w d1,d0 ;
and.l d0,d3 ;isole ce bit de colonne dans
and.l d0,d4 ;les octets du damier
not.l d0 ;inverse le masque
and.l d0,(a5)+ ;=>mise à zéro de la colonne
and.l d0,(a5)+ ;dans les 8 octets
.RD_c1 rol.l #8,d3 ;rotation à gauche:
rol.l #8,d4 ;D3=(b0:b1:b2:b3)⇨(b1:b2:b3:b0)
eor.b d3,d4 ;D4=(b4:b5:b6:b7)⇨(b5:b6:b7:b4)
eor.b d4,d3 ;puis échange l'octet bas
eor.b d3,d4 ;ce qui donne en D3-D4:
dbf d6,.RD_c1 ;(b1:b2:b3:b4)-(b5:b6:b7:b0)
or.l d4,-(a5) ;après d6 rotations à gauche,
or.l d3,-(a5) ;fixe les bits colonne comifo
.RD_end move.l (sp)+,d6 ;
rts
SECTION TEXT
Boule dc.w %0000001111000000,%0000001110000000
dc.w %0000111000110000,%0000111111000000
dc.w %0001100000001000,%0001111111110000
dc.w %0011000000000100,%0011111111111000
dc.w %0010000000000100,%0011111111111000
dc.w %0110000000000110,%0111111111111000
dc.w %0100000000000110,%0111111111111000
dc.w %0100000000000110,%0111111111111000
dc.w %0100000000001110,%0011111111110000
dc.w %0010000000001100,%0001111111110000
dc.w %0010000000011100,%0001111111100000
dc.w %0001000001111000,%0000111110000000
dc.w %0000111111110000,%0000000000000000
dc.w %0000001111000000,%0000000000000000
Welcome dc.b "®DNT 92"
dc.b 27,'Y',32+1,32+13,"Ze Cubik's Rub"
dc.b $d,$a,0
IFEQ TEST
SECTION BSS
EVEN
buff ds.b 40000
ENDC