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 / ZOOMBOOT.S < prev   
Text File  |  1992-12-07  |  9KB  |  282 lines

  1. ;                        Ze Text-Zoomer Boot-sector
  2. ;
  3. ;
  4. ;(C)oderight NulloS//DNT-Crew 1992
  5. ;
  6. TEST    equ    01
  7.     OPT    o+
  8.  
  9.     IFEQ    TEST        ;si test depuis GENST
  10.     clr.l    -(sp)        ;superviseur
  11.     move.w    #$20,-(sp)        ;
  12.     trap    #1        ;
  13.     move.l    d0,2(sp)        ;
  14.  
  15.     moveq    #-1,d0        ;
  16.     clr.w    -(sp)        ;passe en basse résolution
  17.     move.l    d0,-(sp)        ;
  18.     move.l    d0,-(sp)        ;
  19.     move.w    #5,-(sp)        ;
  20.     trap    #14        ;hop!
  21.     addq.l    #8,sp        ;rétablit en partie la pile
  22.     move.l    $432.w,(sp)    ;sauve _membot
  23.     move.l    #buff,$432.w    ;remplace par notre buffer
  24.     movem.l    $ffff8240.w,d0-d7    ;
  25.     movem.l    d0-d7,-(sp)    ;sauve la palette système
  26.     movem.l    standard(pc),d0-d7    ;installe celle du boot
  27.     movem.l    d0-d7,$ffff8240.w    ;
  28.     
  29.     bsr.s    MAIN        ;éxécute
  30.  
  31.     movem.l    (sp)+,d0-d7    ;Restitue tout !
  32.     movem.l    d0-d7,$ffff8240.w    ;
  33.     move.l    (sp)+,$432.w    ;
  34.  
  35.     trap    #1        ;repasse en utilisateur
  36.     clr.w    (sp)        ;et cassos
  37.     trap    #1        ;
  38.  
  39. standard    dc.w    $fff,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$555;palette au boot
  40.     dc.w    $333,$f33,$3f3,$ff3,$33f,$f3f,$3ff,$000;
  41.     ENDC
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43. MAIN    tst.b    $44c.w        ;résolution ok ?
  44.     beq.s    .M_ok        ;
  45.     rts            ;
  46.  
  47. .GB_bcl    move.w    #$3144,(a1)+    ;move.w d4,d(a0)
  48.     move.w    d5,(a1)+        ;
  49.     addq.w    #8,d5        ;avance dans la ligne
  50. .GB_copy    dbf     d4,.GB_bcl        ;
  51.     rts              ;
  52.  
  53.     RSRESET
  54. ad_ecran1    rs.l    1
  55. ad_ecran2    rs.l    1
  56. swap    rs.w    1
  57. code    rs.b    922
  58. cls    rs.b    16002
  59. dsize    rs.b    0
  60.  
  61. .M_ok    lea    VAR(pc),a6        ;variables
  62.     movea.l    $432.w,a5        ;bss
  63.  
  64.     movea.l    a5,a0        ;
  65.     movea.l    $044E.w,a2        ;écran1=écran système
  66.     move.l    a2,(a0)+        ;
  67.     lea    dsize+256(a5),a1    ;écran2=dans la zone a5
  68.     move.l    a1,d0        ;
  69.     clr.b    d0        ;
  70.     move.l    d0,(a0)+        ;
  71.     clr.w    (a0)+        ;init le swapping
  72. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  73. ;Génère le code de remplissage. A0=adresse de génération
  74. ;En sortie, A1 pointe sur la fin du code
  75. .Genere_Box
  76.     lea    20*4(a0),a1    ;20 adresses de routines
  77.     move.l    #$81504E75,d7    ;or.w d0,(a0)
  78.     move.l    a1,(a0)+        ;
  79.     move.w    #$C041,(a1)+    ;and.w d1,d0
  80.     move.l    d7,(a1)+        ;
  81.     moveq    #18,d6        ;encore 19 routines
  82. .GB_0    move.l    a1,(a0)+        ;
  83.     moveq    #$8,d5        ;offset écran de départ
  84.     moveq    #18,d4        ;
  85.     sub.w    d6,d4        ;largeur ligne actuelle
  86.     bsr.s    .GB_copy        ;génère ligne: move.w d4,d(a0)
  87.     move.w    #$8368,(a1)+    ;or.w d1,d(a0)
  88.     move.w    d5,(a1)+        ;
  89.     move.l    d7,(a1)+        ;puis or.w d0,(a0)
  90.     dbf     d6,.GB_0        ;
  91.     moveq.l    #0,d5        ;commence au début de l'écran
  92.     move.w    #$0FA0,d4        ;Tout l'écran en move.w d4,d(a0)
  93.     bsr.s    .GB_copy        ;cela donne un cls !
  94.     move.w    d7,(a1)+        ;ne pas oublier le RTS !!!
  95. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  96.     move.l    #$0008067F,$ffff8240.w;les couleurs 0&1 et 14&15
  97.     move.l    #$046506FF,$ffff825c.w;sont les seules utilisées
  98.  
  99.     movea.l    d0,a3        ;
  100.     bsr.s    .M_end        ;le texte à zoomer
  101.     move.w    #$1F3F,d0        ;recopier sur l'écran 2
  102. .M_0    move.l    (a2)+,(a3)+    ;
  103.     dbf     d0,.M_0        ;
  104. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  105. ;Boucle principale d'affichage
  106. ;
  107. .M_sync    move.w    #$0025,-(sp)    ; Vsync
  108.     trap    #14        ; Xbios
  109.     addq.l    #2,sp        ;
  110.     movea.l    ad_ecran1(a5),a0    ;Prend l'écran virtuel
  111.     moveq    #$00,d4        ;on l'efface sauvagement
  112.     jsr    cls(a5)        ;A0=écran virtuel, maintenant
  113.     movea.l    a6,a4        ;
  114.     bsr.s    Put_Car        ;affiche premier caractère
  115.     bsr.s    Put_Car        ;et deuxième dans la foulée
  116.  
  117.     movea.l    a5,a4        ;procède au swapping écran
  118.     move.l    (a4)+,d0        ;
  119.     move.l    (a4),(a5)        ;
  120.     move.l    d0,(a4)+        ;
  121.     lsr.w    #8,d0        ;l'écran logique devient
  122.     move.l    d0,$ffff8200.w    ;donc l'écran physyique.
  123.     not.w    (a4)+        ;nb d'affichage pair?
  124.     beq.s    .M_sync        ;oui, attendre
  125.     cmpi.w    #12*8*160+103,goff2(a6);dernier caractère atteint ?
  126.     sne    d0        ;->non=$FF
  127.     and.b    $fffffc02.w,d0    ;clavier pas appuyé->%10000000
  128.     bmi.s    .M_sync        ;=>
  129. .M_end    pea    message(pc)    ;
  130.     move.w    #$0009,-(sp)    ; Cconws
  131.     trap    #1        ; Gemdos
  132.     addq.l    #6,sp        ;
  133.     rts              ;cassos
  134. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  135. ;A0=adresse écran virutel
  136. ;A4=lettre courante
  137. ;A5=variables inutilisées ici
  138. ;A6=paramètres globaux du texte
  139. T_X    set    5280
  140. SPEED    set    4
  141.  
  142. Put_Car    move.w    #160,d7        ;160 est souvent utilisé
  143.     subq.w    #SPEED,(a4)    ;avance sur Z
  144.     bgt.s    .PC_ok        ;pas encore fini
  145.     lea    12(a4),a3        ;si, 1er caractère sort
  146.     movem.l    (a3),d0-d2        ;de l'écran.Le 2ème prend
  147.     movem.l    d0-d2,(a4)        ;sa place.
  148.     move.w    #256,(a3)+        ;repart du fond de l'écran
  149.     addq.w    #1,(a3)        ;avance de 8 pixels sur le gfx
  150.     lsr    (a3)        ;bit de parité
  151.     bcs.s    .PC_0        ;pair->impair:ok
  152.     addq.w    #3,(a3)        ;impair->pair:16 pixels + loin
  153. .PC_0    roxl    (a3)+        ;reprend bit de parité
  154.     subi.w    #T_X,(a3)+        ;translation modifiée
  155.     addq.w    #8,(a3)        ;X de base augmenté
  156.     move.w    (a3)+,(a3)+    ;realx initialisé avec cette
  157.     clr.w    (a3)        ;nouvelle base
  158.  
  159. .PC_ok    move.w    (a4)+,d6        ;prend le Z de la lettre
  160.     movea.w    (a4)+,a3        ;emplacement de son
  161.     adda.l    a0,a3        ;graphisme
  162.     asl.w    #7,d6        ;Z->(coeff de profondeur/2)
  163.     clr.l    -(sp)        ;Y de départ
  164.     subq.w    #4,(sp)        ;
  165.     movem.w    (a4)+,d0-d1    ;D0=addx // D1=bazx (inutile)
  166.     add.l    d0,(a4)        ;translate la lettre sur X
  167.     moveq    #$07,d5        ;8 lignes de haut
  168. .PC_y    move.l    (sp),d1        ;prend le Y haut
  169.     addq.w    #1,(sp)        ;descend d'un cran
  170.     move.l    (sp),d3        ;ca donne le Y bas
  171.     divs    d6,d1        ;transformé directement
  172.     divs    d6,d3        ;en y écran.
  173.     asr.w    #1,d1        ;corrige le coeff/2
  174.     asr.w    #1,d3        ;
  175.     moveq    #100,d0        ;centrage écran
  176.     add.w    d0,d1        ;
  177.     add.w    d0,d3        ;
  178.     moveq    #$07,d4        ;8 pixels par ligne
  179. .PC_x    move.l    (a4),d0        ;X gauche
  180.     addq.w    #1,(a4)        ;avance d'un cran
  181.     move.l    (a4),d2        ;X droit
  182.     btst    d4,(a3)        ;le pixel existe ?
  183.     beq.s    .PC_nx        ;non,suivant
  184.     divs    d6,d0        ;oui, transforme les X
  185.     divs    d6,d2        ;en x écran.
  186.     asr.w    #1,d0        ;corrige encore une fois
  187.     asr.w    #1,d2        ;le coeff/2
  188.     movem.l    d0-d7/a0-a6,-(sp)    ;sauve tout le monde
  189.     add.w    d7,d0        ;centrage écran sur x
  190.     add.w    d7,d2        ;
  191. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  192. ;Affichage d'une boite (x0,y0)-(x1,y1) = (d0,d1)-(d2,d3)
  193. ;Pour amélioré vitesse et rendu, comme les X droits et Y bas deviennent
  194. ;X gauches et Y haut, ils sont en commun à deux boites successives
  195. ;correspondants à deux pixels de suite => on décrémente x1,y1 pour
  196. ;éviter cela.
  197. .Put_Box    subq.w    #1,d2        ;X droit dans l'écran ?
  198.     bmi.s    .PB_end        ;
  199.     subq.w    #1,d3        ;et Y bas ?
  200.     bmi.s    .PB_end        ;
  201.     move.w    #319,d4        ;servent plusieurs fois
  202.     move.w    #199,d5        ;
  203.     cmp.w    d4,d0        ;X gauche dans l'écran ?
  204.     bgt.s    .PB_end        ;
  205.     cmp.w    d5,d1        ;
  206.     bgt.s    .PB_end        ;et Y haut ?
  207.  
  208.     tst.w    d0        ;X gauche déborde l'écran ?
  209.     bpl.s    *+4        ;
  210.     moveq    #0,d0        ;oui, alors corrige
  211.     tst.w    d1        ;Tests similaires
  212.     bpl.s    *+4        ;sur les autres coordonnées
  213.     moveq    #$00,d1        ;
  214.     cmp.w    d4,d2        ;
  215.     ble.s    *+4        ;
  216.     move.w    d4,d2        ;
  217.     cmp.w    d5,d3        ;
  218.     ble.s    *+4        ;
  219.     move.w    d5,d3        ;
  220.     moveq    #15,d4        ;
  221.     moveq    #15,d5        ;méthode la plus courte
  222.     and.w    d0,d4        ;modulo 16 des deux x
  223.     and.w    d2,d5        ;
  224.     sub.w    d4,d0        ;=>No du groupe de 16
  225.     sub.w    d5,d2        ;pixels des deux x
  226.     sub.w    d0,d2        ;largeur box en groupe de
  227.     lsr.w    #1,d0        ;16 pixels // offset écran x
  228.     sub.w    d1,d3        ;hauteur de la box
  229.     mulu    d7,d1        ;offset écran y
  230.     add.w    d1,d0        ;cumule les deux
  231.     adda.w    d0,a0        ;hop, adresse écran kivabien
  232.     moveq    #-1,d0        ;calcule les masques gauche
  233.     move.w    #-$8000,d1        ;et droit d'affichage
  234.     lsr.w    d4,d0        ;
  235.     asr.w    d5,d1        ;
  236.     asr.w    #2,d2        ;largeur réduite à un
  237.     bmi.s    .PB_end        ;multiple de 4. largeur <0 ??
  238.     moveq    #-1,d4        ;remplissage de tous les bits
  239.     movea.l    code(a5,d2.w),a1    ;adresse de la routine
  240. .PB_bcl    jsr    (a1)        ;go!
  241.     adda.w    d7,a0        ;ligne suivante
  242.     dbf     d3,.PB_bcl        ;
  243. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  244. .PB_end    movem.l    (sp)+,d0-d7/a0-a6    ;restitue tout le monde
  245. .PC_nx    dbf     d4,.PC_x        ;pixel suivant
  246.     subq.w    #8,(a4)        ;revient en début de ligne
  247.     adda.w    d7,a3        ;ligne graphique suivante
  248.     dbf     d5,.PC_y        ;hop
  249.     addq.l    #4,a4        ;saute sur le caractère
  250.     addq.l    #4,sp        ;suivant,rétablit la pile
  251.     rts              ;bye bye
  252. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  253.     SECTION    DATA
  254. message    dc.b    27,'E',27,'Y',32+12,32+16,"DNT",240,"Crew",$d,$a,0
  255.     EVEN
  256. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  257.     RSRESET            ;structure paramètres
  258. z1    rs.w    1        ;z courant de la lettre
  259. goff1    rs.w    1        ;offset graphique de la lettre
  260. addx1    rs.w    1        ;translation courante
  261. bazx1    rs.w    1        ;position X de base
  262. realx1    rs.l    1        ;et X courant dans une lettre
  263.  
  264. z2    rs.w    1        ;Y'a deux lettres...
  265. goff2    rs.w    1        ;
  266. addx2    rs.w    1        ;
  267. bazx2    rs.w    1        ;
  268. realx2    rs.l    1        ;
  269.  
  270. VAR    dc.w    1024>>3,12*8*160+63
  271.     dc.w    T_X*9/2,-(5*8*8>>3)
  272.     dc.l    -(5*8*8<<13)
  273.     
  274.     dc.w    2048>>3,12*8*160+70
  275.     dc.w    T_X*7/2,-(4*8*8>>3)
  276.     dc.l    -(4*8*8<<13)
  277.  
  278.     IFEQ    TEST
  279.     EVEN
  280.     SECTION    BSS
  281. buff    ds.b    40000
  282.     ENDC