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
Wrap
Text File
|
1992-12-07
|
16KB
|
484 lines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; o Sauvegarde des registres Hardware ;
; o Installation d'exceptions "maison" ;
; o Changements de résolution synchronisés ;
; (Par défaut, passage en basse pendant InitHard) ;
; o Primitives de gestion du hard ;
; o Si label TT défini, pas de 50Hz ;
; o Si label NO_SYS définie, pas d'appel system ;
; (pour effacer buffer clavier + Alt, Shift et Ctrl) ;
; o Si étiquette NO_KBD définie, pas de reset clavier en ;
; InitHard&ExitHard ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;(C)oderight NULLOS//DNT 1990/91/92;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECTION TEXT
include hard_sys.s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Structure du buffer de sauvegarde ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RSRESET
__sync_ rs.b 1
__resol_ rs.b 1
__vbase_ rs.b 3
__hscroll_ rs.b 1
__linewid_ rs.b 1
__yamaha_ rs.b 15
__colors_ rs.w 16
__aer_ rs.b 1
__ddr_ rs.b 1
__iera_ rs.b 1
__ierb_ rs.b 1
__ipra_ rs.b 1
__iprb_ rs.b 1
__isra_ rs.b 1
__isrb_ rs.b 1
__imra_ rs.b 1
__imrb_ rs.b 1
__vr_ rs.b 2
__tacr_ rs.b 1
__tbcr_ rs.b 1
__tcdcr_ rs.b 2
__tadr_ rs.b 1
__tbdr_ rs.b 1
__tcdr_ rs.b 1
__tddr_ rs.b 4
__ucr_ rs.b 1
__inter_ rs.l 24
__ih_size_ rs.b 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Initialisation du Hard et des exceptions ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitHard move.w #$2700,sr ;
movem.l d0-a6,-(sp) ;
bsr UnsetAcia ;coupe l'ACIA
lea SaveRegBuffer(pc),a1 ;Adresse de sauvegarde
move.b v_synch.w,(a1)+ ;sauve tous les paramètres
move.b v_resol.w,(a1)+ ;vidéo
move.b v_base_h.w,(a1)+ ;
move.b v_base_m.w,(a1)+ ;
move.b v_base_l.w,(a1)+ ;
move.b v_hscroll.w,(a1)+ ;
move.b v_linewid.w,(a1)+ ;
moveq #$e,d0 ;Puis ce qui concerne le
IH_yam move.b d0,yam_ctrl.w ;Yamaha: tous ses registres
move.b yam_read.w,(a1)+ ;
dbf d0,IH_yam ;
movem.l v_color.w,d0-d7 ;Maintenant, les couleurs
movem.l d0-d7,(a1) ;
lea MFP_base.w,a3
movep.l AER(a3),d0 ;AER,DDR,IERA,IERB
movep.l IPRA(a3),d1 ;IPRA,IPRB,ISRA,ISRB
movep.l IMRA(a3),d2 ;IMRA,IMRB,VR,(TACR)
move.b UCR(a3),d5 ;UCR
moveq #0,d4 ;On enleve tout
movep.w d4,IERA(a3) ;empèche les IRQ pour ne pas
movep.w d4,IMRA(a3) ;gêner notre détection de TxDR
move.b d4,GPIP(a3) ;Flush le registre I/O
move.b #$40,VR(a3) ;Mode AEI,vecteurs en $100
lea TADR(a3),a4 ;premier compteur
lea TACR(a3),a5 ;et son controleur
bsr.s .idg_TxDR ;recupère TimerA
bsr.s .idg_TxDR ;puis B
bsr.s .idg_TxDR ;puis C
subq.l #2,a5 ;à cause de TCDCR...
bsr.s .idg_TxDR ;et enfin D
movem.l d0-d5,32(a1) ;D4=TxDR{ABCD}/D3=TxCR{ABC0}
; !!!!!WARNING!!!!!~~>0<~~~
movem.l $60.w,d0-d7 ;
movem.l d0-d7,56(a1) ;toutes les IRQ.
movem.l $100.w,d0-d7 ;
movem.l d0-d7,88(a1) ;plus tout le MFP
movem.l $120.w,d0-d7 ;
movem.l d0-d7,120(a1) ;MFP 2ème...
bsr InstallExcept ;Installe les bombes
move.w #$2300,sr ;retour à la normale
bsr ResetAcia ;remettre l'ACIA
IFND NO_KBD ;
bsr ResetKbd ;
ENDC ;
bsr ResetShifter ;Un p'tit reset shifter
bsr ResetYamaha ;et yamaha (->coupe le son)
movem.l (sp)+,d0-a6 ;
rts ;
;Récupère le TxDR d'un Timer en attendant son passage à 1 (fin de Timer)
;puis un passage par une plus grande valeur (si 0,sortie immédiate)
;(si 1,sortie après un temps d'attente correspondant à la plus grande
;période).
.idg_TxDR ;En A4=TxDR,A5=TxCR
move.l d0,-(sp) ;En sortie,D4.b={TxDR},D3.b={TxCR}
lsl.l #8,d4 ;prépare D3-4 à recevoir les nouvelles
lsl.l #8,d3 ;données
move.b (a5),d3 ;et A4-5 incrémentés
beq.s .idgt_2 ;Si pas de compteur
move.b #$44,(a5) ;diviseur 50 ($44 pour TCDCR)
moveq #8,d0 ;8*28=224 cycles (>8E6/(2457600/50))
.idgt_0 cmpi.b #1,(a4) ;compteur en fin de parcours ??
bhi.s .idgt_0 ;non,pas encore.
.idgt_1 move.b (a4),d4 ;récupère le TxDR ;8
cmpi.b #1,d4 ;Encore à 1 ?? ;8
dbne d0,.idgt_1 ;Si Oui,alors boucle jusqu'à fin ;12
.idgt_2 clr.b (a5) ;Timer OFF
addq.l #2,a4 ;timer suivant
addq.l #2,a5 ;
move.l (sp)+,d0
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ExitHard move.w #$2700,sr ;opération inverse.
IFND NO_KBD ;Si c'est autorisé
reset ;Reset hardware
ENDC ;
bsr UnsetAcia ;vire l'ACIA
movem.l d0-a6,-(sp) ;
lea SaveRegBuffer+2(pc),a1;ne restaure pas sync+resol
bsr ResetYamaha ;coupe le yamaha
bsr RestoreExcept ;remettre les anciennes bombes
move.b (a1)+,v_base_h.w ;restitue adresse écran
move.b (a1)+,v_base_m.w ;et tutti quanti
move.b (a1)+,v_base_l.w ;
move.b (a1)+,v_hscroll.w ;
move.b (a1)+,v_linewid.w ;
moveq #$e,d0 ;
.EH_yam move.b d0,yam_ctrl.w ;Remettre le yamaha comme
move.b (a1)+,yam_write.w ;avant
dbf d0,.EH_yam ;
movem.l (a1)+,d0-d7 ;puis les couleurs
movem.l d0-7,v_color.w ;
lea MFP_base.w,a3 ;
movem.l (a1)+,d0-d5 ;Au tour du MFP
clr.b GPIP(a3) ;
movep.l d0,AER(a3) ;
movep.l d1,IPRA(a3) ;
movep.l d2,IMRA(a3) ;
moveq #0,d0 ;
movep.l d0,TACR(a3) ;Coupe les timer pour restituer
movep.l d4,TADR(a3) ;les TxDR juste après
ror.w #8,d3 ;
move.b d3,TCDCR(a3) ;Puis relance les Timers
swap d3 ;selon la sauvegarde
movep.w d3,TACR(a3) ;
move.b d5,UCR(a3) ;
movem.l (a1)+,d0-d7 ;Restitue maintenant les
movem.l d0-d7,$60.w ;vecteurs d'interruption
movem.l (a1)+,d0-d7 ;
movem.l d0-d7,$100.w ;
movem.l (a1)+,d0-d7 ;
movem.l d0-d7,$120.w ;
bsr ResetAcia ;
IFND NO_KBD ;
bsr ResetKbd ;méchant reset clavier
move.b #$08,KBD_data.w ;souris ON
ENDC ;
IFND NO_SYS ;Si on peut appeler le système
move.l #$000bffff,-(sp) ;mise à zéro du buffer clavier
trap #13 ;
andi.w #$00f0,d0 ;D'abord, annule l'état
move.w d0,-(sp) ;shift/alt/ctrl
move.w #$000b,-(sp) ;
trap #13 ;
move.l #$000e0001,-(sp) ;Puis mise à zéro du
trap #14 ;du buffer clavier
movea.l d0,a0 ;
move.w 6(a0),8(a0) ;
move.w #34,-(sp) ;demande les vecteurs claviers
trap #14 ;
movea.l d0,a0 ;
clr.b 109(a0) ;Annule touche pressée
lea 14(sp),sp ;
ENDC
move.w #$2300,sr ;réautorise les ITs
bsr ResetShifter ;initialise le shifter
move.w SaveRegBuffer(pc),d0 ;restitue fréquence+résolution
bsr ChangeResol ;
movem.l (sp)+,d0-a6
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Détournement des exceptions ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InstallExcept
movem.l d0-d7/a0/a1,-(sp) ;Installation des bombes.
lea $8.w,a0 ;
lea Save_except(pc),a1 ;
movem.l (a0),d0-d7 ;
movem.l d0-d7,(a1) ;
lea _2_Bombes(pc),a1 ;
moveq #8-1,d0 ;8 vecteurs
.IE_bcl move.l a1,(a0)+ ;
lea 10(a1),a1 ;
dbf d0,.IE_bcl ;
movem.l (sp)+,d0-d7/a0/a1 ;
rts ;
RestoreExcept
movem.l d0-d7/a0/a1,-(sp) ;Sens inverse..
lea $8.w,a0 ;
lea Save_except(pc),a1 ;
movem.l (a1),d0-d7 ;
movem.l d0-d7,(a0) ;
movem.l (sp)+,d0-d7/a0/a1 ;
rts
Save_except dcb.l 8,0
;plan de sauvegarde: _ERRx
; _SRxxxx
; _PCxxxxxxxx
; _OFxxxxxxxx
; _D0-7/A0-7
;Les infos sont sauvées à partir de $200.
_2_Bombes move.l #"ERR2",$200.w
bra.s .Plantage
.3_Bombes move.l #"ERR3",$200.w
bra.s .Plantage
.4_Bombes move.l #"ERR4",$200.w
bra.s .Plantage
.5_Bombes move.l #"ERR5",$200.w
bra.s .Plantage
.6_Bombes move.l #"ERR6",$200.w
bra.s .Plantage
.7_Bombes move.l #"ERR7",$200.w
bra.s .Plantage
.8_Bombes move.l #"ERR8",$200.w
bra.s .Plantage
.9_Bombes move.l #"ERR9",$200.w
.Plantage move.w #$2700,sr ;enlève les IT
movem.l d0-d7,$21c.w ;Sauve tous les registres
movem.l a0-a7,$23c.w ;
move.l usp,a0 ;sans oublier la pile usp
move.l a0,$25c.w ;
clr.l $426.w ;Déconnecte le reset
lea $204.w,a0 ;
moveq #-1,d0 ;
moveq #-1,d1 ;
cmpi.b #"3",$203.w ;Type d'erreur >3 ?
bgt.s .plant0 ;Oui
move.l (sp)+,d0 ;Non,contexte supplémentaire
move.l (sp)+,d1 ;
.plant0 move.l d0,(a0)+ ;
move.l d1,(a0)+ ;
move.w #"SR",(a0)+ ;message SR+valeur.w
move.w (sp)+,(a0)+ ;
move.w #"PC",(a0)+ ;message PC+valeur.l
move.l (sp)+,d0 ;
move.l d0,(a0)+ ;
move.w #"OF",(a0)+ ;message OF+valeur.l
IFD start ;Si le label start existe alors
subi.l #start,d0 ;on calcule la distance du bug
ELSEIF ;
move.l $4f2.w,a1 ;Sinon on calcule la distance
move.l 40(a1),a1 ;par rapport à la page de base.
sub.l (a1),d0 ;(TOS >=1.2 uniquement!!)
ENDC ;
move.l d0,(a0)+ ;stocke le résultat.
lea 68(a0),a0 ;on se place après les registres
btst #5,-6(sp) ;Exception depuis superviseur ?
bne.s .plant1 ;
move.l usp,sp ;non=>La pile est utilisateur
.plant1 ;Ici, rajouter par exemple
;un dump de la pile, etc...
;C'est vous qui voyez !
lea v_color0.w,a0 ;Boucle sans fin
move.w #$2,(a0) ;
.plant2 addq.w #4,(a0) ;C'est un pseudo colorshock
bra.s .plant2 ;Faire reset pour quitter !..
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Primitives de gestion du clavier ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;NE DOIVENT JAMAIS ETRE APPELEES EN INTERRUPTION !!
;(leurs temps d'éxécution sont longs et variables)
ResetAcia move.b #$03,KBD_ctrl.w ;master reset
move.b #$96,KBD_ctrl.w ;interruptions autorisées
rts ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UnsetAcia move.b #$03,KBD_ctrl.w ;master reset
move.b #$16,KBD_ctrl.w ;pas d'interrutions
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetKbd move.w d0,-(sp) ;
bsr.s WaitKbdIn ;
move.b #$80,KBD_data.w ;
bsr.s WaitKbdIn ;SofReset=$80+$01
move.b #$01,KBD_data.w ;
bra.s FlushKbd+2 ;Attend que le clavier se calme
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
StopKbdOut bsr.s WaitKbdIn ;Coupe les transferts 6301
move.b #$13,KBD_data.w ;$13=PauseOutput
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FlushKbd move.w d0,-(sp) ;
move.w #$47ff,d0 ;délai ENORME !!
tst.l KBD_stat.w ;lire status+data -> flush
dbf d0,*-4 ;yeah man.
move.w (sp)+,d0 ;
rts ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitKbdIn ;attend que le clavier soit
btst #1,KBD_stat.w ;prêt à recevoir
beq.s WaitKbdIn ;
move.w d0,-(sp) ;
move.w #950,d0 ;boucle d'attente pour laisser
.wki_wait bsr.s DummyRTS ;respirer ce bon vieux clavier
dbf d0,.wki_wait ;
move.w (sp)+,d0 ;
DummyRTS rts ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitKbdOut ;attend que le clavier envoie
btst #0,KBD_stat.w ;une donnée
beq.s WaitKbdOut ;
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;A0=chaine à envoyer.
;La longueur de la chaine est dans le premier octet,
;Le mode doit être dans le 2eme octet, suivi de ses paramètres.
;A la suite doivent OBLIGATOIREMENT figurer une valeur de test du clavier
;et la valeur attendue en retour.
;Ne sont vraiment valables que:
;Commandes:$08,$09,$0f,$10,$12,$14,$15,$1a
;Test :$88,$88,$8f,$8f,$92,$94,$94,$9a
;Retour :$08,$09,$0f,$10,$12,$14,$15,$1a
;
;Par exemple, pour passer en souris absolue avec des coordonnées
;maxi de 319 et 199, il faut utiliser la chaine:
;$05,$09,$01,$3f,$00,$c7,$88,$09=[5 oct,mode 9,319,199,tst $88,result $09]
ChangeKbdMode
movem.l d0/a0-a1,-(sp) ;
lea KBD_data.w,a1 ;
.CKM_0 movea.l 4(sp),a0 ;Reprend la chaine.
moveq #0,d0 ;
move.b (a0)+,d0 ;La taille voulue+1 pour test
bsr StopKbdOut ;couper les transferts.
.CKM_1 bsr.s WaitKbdIn ;
move.b (a0)+,(a1) ;octet suivant à envoyer
dbf d0,.CKM_1 ;
bsr.s WaitKbdOut ;Attendre réponse du clavier
move.b (a1),d0 ;après le test
.CKM_2 cmpi.b #$f6,d0 ;Début d'un paquet d'état ?
bne.s .CKM_0 ;non, recommence tout
bsr.s WaitKbdOut ;
move.b (a1),d0 ;
cmp.b (a0),d0 ;Mode correctement fixé ?
bne.s .CKM_2 ;Non, tentative suivante
movem.l (sp)+,d0/a0-a1 ;
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Changer la resolution de l'écran,en synchro avec l'ecran ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;D0=(frequence.b|résolution.b).w
ChangeResol
move.w sr,-(sp) ;Routine sortie presque
movem.l d0-d4/a0/a1,-(sp) ;telle quelle de la ROM
move.w #$2700,sr ;Elle assure un changement
lea MFP_base.w,a0 ;parfait de résolution
lea TBDR(a0),a1 ;et de fréquence.
move.b IERA(a0),d1 ;La preuve ?:votre ST a-t-il
move.b TBCR(a0),d2 ;déjà foiré les bitplans
bclr #0,IERA(a0) ;après un Reset ?...
move.b #$10,TBCR(a0) ;Bloque le timer B, et mise à
moveq #1,d4 ;zéro de son entrée hbl.
clr.b TBCR(a0) ;
move.b #240,(a1) ;240 lignes
move.b #8,TBCR(a0) ;Compteur de lignes
.chres_0 cmp.b (a1),d4 ;Attend que 240-1 lignes
bne.s .chres_0 ;soient passées.
;On ne peut sortir de cette boucle qu'à la fin d'une ligne affichée
;(car sortie provoquée par TBDR qui passe à 1, donc qui change, donc
;fin de ligne!). De plus, attendre 239 lignes provoque donc une pause
;de plus d'une VBL, par sécurité (stabilisation après bourrage reset)
.chres_1 move.b (a1),d4 ;Valeur actuelle pour tester
move.w #$267,d3 ;attente=$268*28=17248 cycles
.chres_2 cmp.b (a1),d4 ;8 cycles
bne.s .chres_1 ;8
dbf d3,.chres_2 ;12 =>28 cycles par boucle
;Sortie si pendant 17248 cycles, pas d'affichage=>33/34 lignes après le
;bas de l'écran =>juste avant la VBL en 50/60 Hz.
move.b #$10,TBCR(a0) ;Remet le Timer B à zéro
move.b d0,v_resol.w ;Maintenant, la résolution
lsr.w #8,d0 ;et la synchro peuvent être
move.b d0,v_synch.w ;changée sans risque
move.b d1,IERA(a0) ;
move.b d2,TBCR(a0) ;Restitue touskifo.
movem.l (sp)+,d0-d4/a0/a1 ;
DummyVBL rte ;restitue le sr empilé + haut
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Effectuer un Reset Shifter en sortie d'overscan ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetShifter
move.w d0,-(sp) ;Reset-shifter, pour
move.w d1,-(sp) ;remettre la vidéo dans
move.l $70.w,-(sp) ;le droit chemin après
move.l #FlagVBL,$70.w ;un overscan notament
moveq #4,d0 ;On le bourre 5 fois
moveq #1,d1 ;on attend 2 VBL
clr.w Flag ;init le flag
.rs_bcl cmp.w Flag(pc),d1 ;
bcc.s .rs_bcl ;
moveq #-1,d1 ;
move.b #1,v_resol.w ;On bourre la vidéo
ror.l d1,d1 ;en passant en moyenne/basse
clr.b v_resol.w ;
IFND TT ;Si ce n'est pas un TT
ror.l d1,d1 ;on bourre aussi la synchro
clr.b v_synch.w ;
ror.l d1,d1 ;
move.b #2,v_synch.w ;
ENDC ;
move.w Flag(pc),d1 ;
dbf d0,.rs_bcl ;VBL suivante
move.l (sp)+,$70.w ;
move.w (sp)+,d1 ;
move.w (sp)+,d0 ;
rts ;
FlagVBL addq.w #1,Flag ;indique le passage de la VBL
rte
Flag dc.w 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Reset du Yamaha ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetYamaha
movem.l d0/a0-a1,-(sp) ;Valeur par défaut:
lea yam_ctrl.w,a1 ;son totallement coupé
lea .yaminit+1(pc),a0 ;drive éteint
moveq #14,d0 ;
.yamr_0 move.b d0,(a1) ;
move.b (a0)+,2(a1) ;
dbf d0,.yamr_0 ;
movem.l (sp)+,d0/a0-a1 ;
rts
.yaminit
dc.b $00,$27,$00,$00,$00,$00,$00,$00
dc.b $ff,$00,$ff,$ff,$ff,$ff,$ff,$ff
SaveRegBuffer dcb.b __ih_size_,0