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 / INITHARD.S < prev   
Text File  |  1992-12-07  |  16KB  |  484 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;                                                                         ;
  4. ;                 o Sauvegarde des registres Hardware                     ;
  5. ;                 o Installation d'exceptions "maison"                    ;
  6. ;                 o Changements de résolution synchronisés                ;
  7. ;                   (Par défaut, passage en basse pendant InitHard)       ;
  8. ;                 o Primitives de gestion du hard                         ;
  9. ;                 o Si label TT défini, pas de 50Hz                       ;
  10. ;                 o Si label NO_SYS définie, pas d'appel system           ;
  11. ;                   (pour effacer buffer clavier + Alt, Shift et Ctrl)    ;
  12. ;                 o Si étiquette NO_KBD définie, pas de reset clavier en  ;
  13. ;                   InitHard&ExitHard                                     ;
  14. ;                                                                         ;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. ;;;;;;;;;;;;;;;;;;;;(C)oderight NULLOS//DNT 1990/91/92;;;;;;;;;;;;;;;;;;;;;
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18.     SECTION    TEXT
  19.     include    hard_sys.s
  20. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. ;                     Structure du buffer de sauvegarde                   ;
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23.     RSRESET
  24. __sync_    rs.b    1
  25. __resol_    rs.b    1
  26. __vbase_    rs.b    3
  27. __hscroll_    rs.b    1
  28. __linewid_    rs.b    1
  29. __yamaha_    rs.b    15
  30. __colors_    rs.w    16
  31. __aer_    rs.b    1
  32. __ddr_    rs.b    1
  33. __iera_    rs.b    1
  34. __ierb_    rs.b    1
  35. __ipra_    rs.b    1
  36. __iprb_    rs.b    1
  37. __isra_    rs.b    1
  38. __isrb_    rs.b    1
  39. __imra_    rs.b    1
  40. __imrb_    rs.b    1
  41. __vr_    rs.b    2
  42. __tacr_    rs.b    1
  43. __tbcr_    rs.b    1
  44. __tcdcr_    rs.b    2
  45. __tadr_    rs.b    1
  46. __tbdr_    rs.b    1
  47. __tcdr_    rs.b    1
  48. __tddr_    rs.b    4
  49. __ucr_    rs.b    1
  50.  
  51. __inter_    rs.l    24
  52. __ih_size_    rs.b    0
  53. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  54. ;                  Initialisation du Hard et des exceptions               ;
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56. InitHard    move.w    #$2700,sr        ;
  57.     movem.l    d0-a6,-(sp)    ;
  58.     bsr    UnsetAcia        ;coupe l'ACIA
  59.     lea    SaveRegBuffer(pc),a1    ;Adresse de sauvegarde
  60.     move.b    v_synch.w,(a1)+    ;sauve tous les paramètres
  61.     move.b    v_resol.w,(a1)+    ;vidéo
  62.     move.b    v_base_h.w,(a1)+    ;
  63.     move.b    v_base_m.w,(a1)+    ;
  64.     move.b    v_base_l.w,(a1)+    ;
  65.     move.b    v_hscroll.w,(a1)+    ;
  66.     move.b    v_linewid.w,(a1)+    ;
  67.  
  68.     moveq    #$e,d0        ;Puis ce qui concerne le
  69. IH_yam    move.b    d0,yam_ctrl.w    ;Yamaha: tous ses registres
  70.     move.b    yam_read.w,(a1)+    ;
  71.     dbf    d0,IH_yam        ;
  72.  
  73.     movem.l    v_color.w,d0-d7    ;Maintenant, les couleurs
  74.     movem.l    d0-d7,(a1)        ;
  75.  
  76.     lea    MFP_base.w,a3
  77.     movep.l    AER(a3),d0        ;AER,DDR,IERA,IERB
  78.     movep.l    IPRA(a3),d1    ;IPRA,IPRB,ISRA,ISRB
  79.     movep.l    IMRA(a3),d2    ;IMRA,IMRB,VR,(TACR)
  80.     move.b    UCR(a3),d5        ;UCR
  81.     moveq    #0,d4        ;On enleve tout
  82.     movep.w    d4,IERA(a3)    ;empèche les IRQ pour ne pas
  83.     movep.w    d4,IMRA(a3)    ;gêner notre détection de TxDR
  84.     move.b    d4,GPIP(a3)    ;Flush le registre I/O
  85.     move.b    #$40,VR(a3)    ;Mode AEI,vecteurs en $100
  86.     lea    TADR(a3),a4    ;premier compteur
  87.     lea    TACR(a3),a5    ;et son controleur
  88.     bsr.s    .idg_TxDR        ;recupère TimerA
  89.     bsr.s    .idg_TxDR        ;puis B
  90.     bsr.s    .idg_TxDR        ;puis C
  91.     subq.l    #2,a5        ;à cause de TCDCR...
  92.     bsr.s    .idg_TxDR        ;et enfin D
  93.     movem.l    d0-d5,32(a1)    ;D4=TxDR{ABCD}/D3=TxCR{ABC0}
  94.                 ;     !!!!!WARNING!!!!!~~>0<~~~
  95.     movem.l    $60.w,d0-d7    ;
  96.     movem.l    d0-d7,56(a1)    ;toutes les IRQ.
  97.     movem.l    $100.w,d0-d7    ;
  98.     movem.l    d0-d7,88(a1)    ;plus tout le MFP
  99.     movem.l    $120.w,d0-d7    ;
  100.     movem.l    d0-d7,120(a1)    ;MFP 2ème...
  101.  
  102.     bsr    InstallExcept    ;Installe les bombes
  103.  
  104.     move.w    #$2300,sr        ;retour à la normale
  105.     bsr    ResetAcia        ;remettre l'ACIA
  106.     IFND    NO_KBD        ;
  107.     bsr    ResetKbd        ;
  108.     ENDC            ;
  109.     bsr    ResetShifter    ;Un p'tit reset shifter
  110.     bsr    ResetYamaha    ;et yamaha (->coupe le son)
  111.     movem.l    (sp)+,d0-a6    ;
  112.     rts            ;
  113.  
  114. ;Récupère le TxDR d'un Timer en attendant son passage à 1 (fin de Timer)
  115. ;puis un passage par une plus grande valeur (si 0,sortie immédiate)
  116. ;(si 1,sortie après un temps d'attente correspondant à la plus grande
  117. ;période).
  118. .idg_TxDR            ;En A4=TxDR,A5=TxCR
  119.     move.l    d0,-(sp)    ;En sortie,D4.b={TxDR},D3.b={TxCR}
  120.     lsl.l    #8,d4    ;prépare D3-4 à recevoir les nouvelles
  121.     lsl.l    #8,d3    ;données
  122.     move.b    (a5),d3    ;et A4-5 incrémentés
  123.     beq.s    .idgt_2    ;Si pas de compteur
  124.     move.b    #$44,(a5)    ;diviseur 50 ($44 pour TCDCR)
  125.     moveq    #8,d0    ;8*28=224 cycles (>8E6/(2457600/50))
  126. .idgt_0    cmpi.b    #1,(a4)    ;compteur en fin de parcours ??
  127.     bhi.s    .idgt_0    ;non,pas encore.
  128. .idgt_1    move.b    (a4),d4    ;récupère le TxDR        ;8
  129.     cmpi.b    #1,d4    ;Encore à 1 ??        ;8
  130.     dbne    d0,.idgt_1    ;Si Oui,alors boucle jusqu'à fin    ;12
  131. .idgt_2    clr.b    (a5)    ;Timer OFF
  132.     addq.l    #2,a4    ;timer suivant
  133.     addq.l    #2,a5    ;
  134.     move.l    (sp)+,d0
  135.     rts
  136. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  137. ExitHard    move.w    #$2700,sr        ;opération inverse.
  138.     IFND    NO_KBD        ;Si c'est autorisé
  139.     reset            ;Reset hardware
  140.     ENDC            ;
  141.     bsr    UnsetAcia        ;vire l'ACIA
  142.     movem.l    d0-a6,-(sp)    ;
  143.     lea    SaveRegBuffer+2(pc),a1;ne restaure pas sync+resol
  144.     bsr    ResetYamaha    ;coupe le yamaha
  145.  
  146.     bsr    RestoreExcept    ;remettre les anciennes bombes
  147.  
  148.     move.b    (a1)+,v_base_h.w    ;restitue adresse écran
  149.     move.b    (a1)+,v_base_m.w    ;et tutti quanti
  150.     move.b    (a1)+,v_base_l.w    ;
  151.     move.b    (a1)+,v_hscroll.w    ;
  152.     move.b    (a1)+,v_linewid.w    ;
  153.     moveq    #$e,d0        ;
  154. .EH_yam    move.b    d0,yam_ctrl.w    ;Remettre le yamaha comme
  155.     move.b    (a1)+,yam_write.w    ;avant
  156.     dbf    d0,.EH_yam        ;
  157.     movem.l    (a1)+,d0-d7    ;puis les couleurs
  158.     movem.l    d0-7,v_color.w    ;
  159.     lea    MFP_base.w,a3    ;
  160.     movem.l    (a1)+,d0-d5    ;Au tour du MFP
  161.     clr.b    GPIP(a3)        ;
  162.     movep.l    d0,AER(a3)        ;
  163.     movep.l    d1,IPRA(a3)    ;
  164.     movep.l    d2,IMRA(a3)    ;
  165.     moveq    #0,d0        ;
  166.     movep.l    d0,TACR(a3)    ;Coupe les timer pour restituer
  167.     movep.l    d4,TADR(a3)    ;les TxDR juste après
  168.     ror.w    #8,d3        ;
  169.     move.b    d3,TCDCR(a3)    ;Puis relance les Timers
  170.     swap    d3        ;selon la sauvegarde
  171.     movep.w    d3,TACR(a3)    ;
  172.     move.b    d5,UCR(a3)        ;
  173.     movem.l    (a1)+,d0-d7    ;Restitue maintenant les
  174.     movem.l    d0-d7,$60.w    ;vecteurs d'interruption
  175.     movem.l    (a1)+,d0-d7    ;
  176.     movem.l    d0-d7,$100.w    ;
  177.     movem.l    (a1)+,d0-d7    ;
  178.     movem.l    d0-d7,$120.w    ;
  179.     bsr    ResetAcia        ;
  180.     IFND    NO_KBD        ;
  181.     bsr    ResetKbd        ;méchant reset clavier
  182.     move.b    #$08,KBD_data.w    ;souris ON
  183.     ENDC            ;
  184.  
  185.     IFND    NO_SYS        ;Si on peut appeler le système
  186.     move.l    #$000bffff,-(sp)    ;mise à zéro du buffer clavier
  187.     trap    #13        ;
  188.     andi.w    #$00f0,d0        ;D'abord, annule l'état
  189.     move.w    d0,-(sp)        ;shift/alt/ctrl
  190.     move.w    #$000b,-(sp)    ;
  191.     trap    #13        ;
  192.     move.l    #$000e0001,-(sp)    ;Puis mise à zéro du
  193.     trap    #14        ;du buffer clavier
  194.     movea.l    d0,a0        ;
  195.     move.w    6(a0),8(a0)    ;
  196.     move.w    #34,-(sp)        ;demande les vecteurs claviers
  197.     trap    #14        ;
  198.     movea.l    d0,a0        ;
  199.     clr.b    109(a0)        ;Annule touche pressée
  200.     lea    14(sp),sp        ;
  201.     ENDC
  202.  
  203.     move.w    #$2300,sr        ;réautorise les ITs
  204.     bsr    ResetShifter    ;initialise le shifter
  205.     move.w    SaveRegBuffer(pc),d0    ;restitue fréquence+résolution
  206.     bsr    ChangeResol    ;
  207.  
  208.     movem.l    (sp)+,d0-a6
  209.     rts
  210. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  211. ;                     Détournement des exceptions                         ;
  212. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  213. InstallExcept
  214.     movem.l    d0-d7/a0/a1,-(sp)    ;Installation des bombes.
  215.     lea    $8.w,a0        ;
  216.     lea    Save_except(pc),a1    ;
  217.     movem.l    (a0),d0-d7        ;
  218.     movem.l    d0-d7,(a1)        ;
  219.     lea    _2_Bombes(pc),a1    ;
  220.     moveq    #8-1,d0        ;8 vecteurs
  221. .IE_bcl    move.l    a1,(a0)+        ;
  222.     lea    10(a1),a1        ;
  223.     dbf    d0,.IE_bcl        ;
  224.     movem.l    (sp)+,d0-d7/a0/a1    ;
  225.     rts            ;
  226.  
  227. RestoreExcept
  228.     movem.l    d0-d7/a0/a1,-(sp)    ;Sens inverse..
  229.     lea    $8.w,a0        ;
  230.     lea    Save_except(pc),a1    ;
  231.     movem.l    (a1),d0-d7        ;
  232.     movem.l    d0-d7,(a0)        ;
  233.     movem.l    (sp)+,d0-d7/a0/a1    ;
  234.     rts
  235.  
  236.  
  237. Save_except    dcb.l    8,0
  238.  
  239. ;plan de sauvegarde:    _ERRx
  240. ;        _SRxxxx
  241. ;        _PCxxxxxxxx
  242. ;        _OFxxxxxxxx
  243. ;        _D0-7/A0-7
  244. ;Les infos sont sauvées à partir de $200.
  245. _2_Bombes    move.l    #"ERR2",$200.w
  246.     bra.s    .Plantage
  247. .3_Bombes    move.l    #"ERR3",$200.w
  248.     bra.s    .Plantage
  249. .4_Bombes    move.l    #"ERR4",$200.w
  250.     bra.s    .Plantage
  251. .5_Bombes    move.l    #"ERR5",$200.w
  252.     bra.s    .Plantage
  253. .6_Bombes    move.l    #"ERR6",$200.w
  254.     bra.s    .Plantage
  255. .7_Bombes    move.l    #"ERR7",$200.w
  256.     bra.s    .Plantage
  257. .8_Bombes    move.l    #"ERR8",$200.w
  258.     bra.s    .Plantage
  259. .9_Bombes    move.l    #"ERR9",$200.w
  260.  
  261. .Plantage    move.w    #$2700,sr        ;enlève les IT
  262.     movem.l    d0-d7,$21c.w    ;Sauve tous les registres
  263.     movem.l    a0-a7,$23c.w    ;
  264.     move.l    usp,a0        ;sans oublier la pile usp
  265.     move.l    a0,$25c.w        ;
  266.  
  267.     clr.l    $426.w        ;Déconnecte le reset
  268.     lea    $204.w,a0        ;
  269.     moveq    #-1,d0        ;
  270.     moveq    #-1,d1        ;
  271.     cmpi.b    #"3",$203.w    ;Type d'erreur >3 ?
  272.     bgt.s    .plant0        ;Oui
  273.     move.l    (sp)+,d0        ;Non,contexte supplémentaire
  274.     move.l    (sp)+,d1        ;
  275. .plant0    move.l    d0,(a0)+        ;
  276.     move.l    d1,(a0)+        ;
  277.     move.w    #"SR",(a0)+    ;message SR+valeur.w
  278.     move.w    (sp)+,(a0)+    ;
  279.     move.w    #"PC",(a0)+    ;message PC+valeur.l
  280.     move.l    (sp)+,d0        ;
  281.     move.l    d0,(a0)+        ;
  282.     move.w    #"OF",(a0)+    ;message OF+valeur.l
  283.     IFD    start        ;Si le label start existe alors
  284.     subi.l    #start,d0        ;on calcule la distance du bug
  285.     ELSEIF            ;
  286.     move.l    $4f2.w,a1        ;Sinon on calcule la distance
  287.     move.l    40(a1),a1        ;par rapport à la page de base.
  288.     sub.l    (a1),d0        ;(TOS >=1.2 uniquement!!)
  289.     ENDC            ;
  290.     move.l    d0,(a0)+        ;stocke le résultat.
  291.  
  292.     lea    68(a0),a0        ;on se place après les registres
  293.     btst    #5,-6(sp)        ;Exception depuis superviseur ?
  294.     bne.s    .plant1        ;
  295.     move.l    usp,sp        ;non=>La pile est utilisateur
  296. .plant1                ;Ici, rajouter par exemple
  297.                 ;un dump de la pile, etc...
  298.                 ;C'est vous qui voyez !
  299.  
  300.     lea    v_color0.w,a0    ;Boucle sans fin
  301.     move.w    #$2,(a0)        ;
  302. .plant2    addq.w    #4,(a0)        ;C'est un pseudo colorshock
  303.     bra.s    .plant2        ;Faire reset pour quitter !..
  304.  
  305.  
  306.  
  307. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  308. ;                   Primitives de gestion du clavier                      ;
  309. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  310. ;NE DOIVENT JAMAIS ETRE APPELEES EN INTERRUPTION !!
  311. ;(leurs temps d'éxécution sont longs et variables)
  312.  
  313. ResetAcia    move.b    #$03,KBD_ctrl.w    ;master reset
  314.     move.b    #$96,KBD_ctrl.w    ;interruptions autorisées
  315.     rts            ;
  316. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  317. UnsetAcia    move.b    #$03,KBD_ctrl.w    ;master reset
  318.     move.b    #$16,KBD_ctrl.w    ;pas d'interrutions
  319.     rts
  320. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  321. ResetKbd    move.w    d0,-(sp)        ;
  322.     bsr.s    WaitKbdIn        ;
  323.     move.b    #$80,KBD_data.w    ;
  324.     bsr.s    WaitKbdIn        ;SofReset=$80+$01
  325.     move.b    #$01,KBD_data.w    ;
  326.     bra.s    FlushKbd+2        ;Attend que le clavier se calme
  327. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  328. StopKbdOut    bsr.s    WaitKbdIn        ;Coupe les transferts 6301
  329.     move.b    #$13,KBD_data.w    ;$13=PauseOutput
  330. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  331. FlushKbd    move.w    d0,-(sp)        ;
  332.     move.w    #$47ff,d0        ;délai ENORME !!
  333.     tst.l    KBD_stat.w        ;lire status+data -> flush
  334.     dbf    d0,*-4        ;yeah man.
  335.     move.w    (sp)+,d0        ;
  336.     rts            ;
  337. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  338. WaitKbdIn                ;attend que le clavier soit
  339.     btst    #1,KBD_stat.w    ;prêt à recevoir
  340.     beq.s    WaitKbdIn        ;
  341.     move.w    d0,-(sp)        ;
  342.     move.w    #950,d0        ;boucle d'attente pour laisser
  343. .wki_wait    bsr.s    DummyRTS        ;respirer ce bon vieux clavier
  344.     dbf    d0,.wki_wait    ;
  345.     move.w    (sp)+,d0        ;
  346. DummyRTS    rts            ;
  347. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  348. WaitKbdOut                ;attend que le clavier envoie
  349.     btst    #0,KBD_stat.w    ;une donnée
  350.     beq.s    WaitKbdOut        ;
  351.     rts
  352. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  353. ;A0=chaine à envoyer.
  354. ;La longueur de la chaine est dans le premier octet,
  355. ;Le mode doit être dans le 2eme octet, suivi de ses paramètres.
  356. ;A la suite doivent OBLIGATOIREMENT figurer une valeur de test du clavier
  357. ;et la valeur attendue en retour.
  358. ;Ne sont vraiment valables que:
  359. ;Commandes:$08,$09,$0f,$10,$12,$14,$15,$1a
  360. ;Test     :$88,$88,$8f,$8f,$92,$94,$94,$9a
  361. ;Retour   :$08,$09,$0f,$10,$12,$14,$15,$1a
  362. ;
  363. ;Par exemple, pour passer en souris absolue avec des coordonnées
  364. ;maxi de 319 et 199, il faut utiliser la chaine:
  365. ;$05,$09,$01,$3f,$00,$c7,$88,$09=[5 oct,mode 9,319,199,tst $88,result $09]
  366. ChangeKbdMode
  367.     movem.l    d0/a0-a1,-(sp)    ;
  368.     lea    KBD_data.w,a1    ;
  369. .CKM_0    movea.l    4(sp),a0        ;Reprend la chaine.
  370.     moveq    #0,d0        ;
  371.     move.b    (a0)+,d0        ;La taille voulue+1 pour test
  372.     bsr    StopKbdOut        ;couper les transferts.
  373. .CKM_1    bsr.s    WaitKbdIn        ;
  374.     move.b    (a0)+,(a1)        ;octet suivant à envoyer
  375.     dbf    d0,.CKM_1        ;
  376.     bsr.s    WaitKbdOut        ;Attendre réponse du clavier
  377.     move.b    (a1),d0        ;après le test
  378. .CKM_2    cmpi.b    #$f6,d0        ;Début d'un paquet d'état ?
  379.     bne.s    .CKM_0        ;non, recommence tout
  380.     bsr.s    WaitKbdOut        ;
  381.     move.b    (a1),d0        ;
  382.     cmp.b    (a0),d0        ;Mode correctement fixé ?
  383.     bne.s    .CKM_2        ;Non, tentative suivante
  384.     movem.l    (sp)+,d0/a0-a1    ;
  385.     rts
  386.  
  387.  
  388.  
  389. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  390. ;         Changer la resolution de l'écran,en synchro avec l'ecran        ;
  391. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  392. ;D0=(frequence.b|résolution.b).w
  393. ChangeResol
  394.     move.w    sr,-(sp)        ;Routine sortie presque
  395.     movem.l    d0-d4/a0/a1,-(sp)    ;telle quelle de la ROM
  396.     move.w    #$2700,sr        ;Elle assure un changement
  397.     lea    MFP_base.w,a0    ;parfait de résolution
  398.     lea    TBDR(a0),a1    ;et de fréquence.
  399.     move.b    IERA(a0),d1    ;La preuve ?:votre ST a-t-il
  400.     move.b    TBCR(a0),d2    ;déjà foiré les bitplans
  401.     bclr    #0,IERA(a0)    ;après un Reset ?...
  402.     move.b    #$10,TBCR(a0)    ;Bloque le timer B, et mise à
  403.     moveq    #1,d4        ;zéro de son entrée hbl.
  404.     clr.b    TBCR(a0)        ;
  405.     move.b    #240,(a1)        ;240 lignes
  406.     move.b    #8,TBCR(a0)    ;Compteur de lignes
  407. .chres_0    cmp.b    (a1),d4        ;Attend que 240-1 lignes 
  408.     bne.s    .chres_0        ;soient passées.
  409. ;On ne peut sortir de cette boucle qu'à la fin d'une ligne affichée
  410. ;(car sortie provoquée par TBDR qui passe à 1, donc qui change, donc
  411. ;fin de ligne!). De plus, attendre 239 lignes provoque donc une pause
  412. ;de plus d'une VBL, par sécurité (stabilisation après bourrage reset)
  413.  
  414. .chres_1    move.b    (a1),d4        ;Valeur actuelle pour tester
  415.     move.w    #$267,d3        ;attente=$268*28=17248 cycles
  416. .chres_2    cmp.b    (a1),d4        ;8 cycles
  417.     bne.s    .chres_1        ;8
  418.     dbf    d3,.chres_2    ;12 =>28 cycles par boucle
  419. ;Sortie si pendant 17248 cycles, pas d'affichage=>33/34 lignes après le
  420. ;bas de l'écran =>juste avant la VBL en 50/60 Hz.
  421.  
  422.     move.b    #$10,TBCR(a0)    ;Remet le Timer B à zéro
  423.     move.b    d0,v_resol.w    ;Maintenant, la résolution
  424.     lsr.w    #8,d0        ;et la synchro peuvent être
  425.     move.b    d0,v_synch.w    ;changée sans risque
  426.     move.b    d1,IERA(a0)    ;
  427.     move.b    d2,TBCR(a0)    ;Restitue touskifo.
  428.     movem.l    (sp)+,d0-d4/a0/a1    ;
  429. DummyVBL    rte            ;restitue le sr empilé + haut
  430. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  431. ;          Effectuer un Reset Shifter en sortie d'overscan              ;
  432. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  433. ResetShifter
  434.     move.w    d0,-(sp)        ;Reset-shifter, pour
  435.     move.w    d1,-(sp)        ;remettre la vidéo dans
  436.     move.l    $70.w,-(sp)    ;le droit chemin après
  437.     move.l    #FlagVBL,$70.w    ;un overscan notament
  438.     moveq    #4,d0        ;On le bourre 5 fois
  439.     moveq    #1,d1        ;on attend 2 VBL
  440.     clr.w    Flag        ;init le flag
  441. .rs_bcl    cmp.w    Flag(pc),d1    ;
  442.     bcc.s    .rs_bcl        ;
  443.     moveq    #-1,d1        ;
  444.     move.b    #1,v_resol.w    ;On bourre la vidéo
  445.     ror.l    d1,d1        ;en passant en moyenne/basse
  446.     clr.b    v_resol.w        ;
  447.     IFND    TT        ;Si ce n'est pas un TT
  448.     ror.l    d1,d1        ;on bourre aussi la synchro
  449.     clr.b    v_synch.w        ;
  450.     ror.l    d1,d1        ;
  451.     move.b    #2,v_synch.w    ;
  452.     ENDC            ;
  453.     move.w    Flag(pc),d1    ;
  454.     dbf    d0,.rs_bcl        ;VBL suivante
  455.     move.l    (sp)+,$70.w    ;
  456.     move.w    (sp)+,d1        ;
  457.     move.w    (sp)+,d0        ;
  458.     rts            ;
  459.  
  460. FlagVBL    addq.w    #1,Flag        ;indique le passage de la VBL
  461.     rte
  462. Flag    dc.w    0
  463.  
  464.  
  465.  
  466. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  467. ;                       Reset du Yamaha                       ;
  468. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  469. ResetYamaha
  470.     movem.l    d0/a0-a1,-(sp)    ;Valeur par défaut:
  471.     lea    yam_ctrl.w,a1    ;son totallement coupé
  472.     lea    .yaminit+1(pc),a0    ;drive éteint
  473.     moveq    #14,d0        ;
  474. .yamr_0    move.b    d0,(a1)        ;
  475.     move.b    (a0)+,2(a1)    ;
  476.     dbf    d0,.yamr_0        ;
  477.     movem.l    (sp)+,d0/a0-a1    ;
  478.     rts
  479. .yaminit
  480.     dc.b    $00,$27,$00,$00,$00,$00,$00,$00
  481.     dc.b    $ff,$00,$ff,$ff,$ff,$ff,$ff,$ff
  482.  
  483. SaveRegBuffer dcb.b    __ih_size_,0
  484.