Voici un assembleur que j'ai développé il y a une vingtaine d'années: Ed!
Le but était pour moi d'apprendre ce processeur MC68000, mais n'ayant à l'époque ni compilateur ni connexion Internet, il m'a été impossible d'en obtenir un gratuitement.
Il a donc fallu se retrousser les manches et l'expérience a été très enrichissante...
Ed est écrit en Turbo Pascal, et a une interface TurboVision.
Vous le trouverez en téléchargement en bas de page.
Ed, assembleur sous MS-Dos
Il fonctionne sous MS DOS et je mettrai des exemples de code en ligne prochainement.
Voici retranscrit ci-dessous le fichier d'aide de Ed, qui comporte la syntaxe ASM du 68000.
Attention: Ed ne respecte pas la syntaxe Motorola pour ce qui est des Labels et des sauts !!!
Bienvenue dans Ed !
Il s'agit d'un éditeur comportant les facilités d'utilisations des systmes GUI qui vous permet entre autre de compiler un programme en assembleur.
Il permet également d'utiliser un autre compilateur externe de votre choix, Turbo Pascal (c) dans ses versions en ligne de commande (TPC.Exe par exemple), ou encore un assembleur iAP x86 et bien d'autres ...
Dans ce cas, vous pouvez également tester le programme généré (Titi.Exe par exemple) sans quitter Ed!
Cet éditeur/assembleur comporte aussi un économiseur d'écran original afin de préserver le tube cathodique de votre micro préféré...
Il est disponible en téléchargement au bas de cette page.
Exemple de la syntaxe
La syntaxe globale utilisée par Ed est la suivante:
__________________
; Exemple de syntaxe, addition BDC
VECTEUR
SSP $00010FFE
RAM $00010000
ROM $00000300
CONST
Valeur1=$2008
Valeur2=$2018
St1="68000"
St2="Exemple d'assemblage"
VAR
Variable1.B
Variable2.L
Tableau1:4.B
MAIN
; Programme principal
LEA Valeur1, A0 ;Init Source
LEA Valeur2, A1 ;Init Destination
CLR.B Variable1 ;Raz de variable1
MOVEQ #$02, D0 ;Init Compteur
@Boucle ABCD -(A0), -(A1) ;Addition BCD
JSR @Truc ;Appel du sous-programme @Truc
ADDQ.B #$01, Variable1 ;Exemple utilisation variable
DBF D0, @Boucle ;@Boucle si D0<>-1
LEA St1, A1 ;Utilisation de
LEA St2, A2 ;chaines de caractères
CLR.L Tableau1 ;ou d'un tableau
; Etc ...
; Interruption nø 15
@IT15 NOP
NOP
Clr.B Tableau1
RTE
@IT204 NOP
RTE
;Sous-programme Truc
@Truc NOP ;Ne fait rien ...
NOP ;A part donner un
RTS ;exemple de saut
VECTEUR Définition des Vecteurs
SSP Pointeur de pile SSP (SSP)
ROM Origine Rom du programme (PC)
RAM Origine mémoires Ram
CONST Définition des constantes en ROM, RAM, I/O, ...
Ex: Valeur1=$2008 Assigne la valeur $2008 à Valeur1
St1="68000" Chaine de caractères en ROM
St2="Exemple d'assemblage"
VAR Définition variables et tableaux en RAM
Ex: Variable1.B défini une variable sur un octet Byte
Variable2.W défini une variable sur un Word
Variable3.L défini une variable sur un Long Word
Tableau1:4.B défini un tableau de 4 Bytes
Tableau2:10.L défini un tableau de 10 Long Word
MAIN Début du programme
" " Défini une chaine de caractères ASCII en ROM
@ Label de saut ou de sous programme
@IT Définition d'une interruption
; Commentaire
Un Label (ou une étiquette) permet de spécifier l'endroit où doit s'effectuer un saut ou un branchement.
Un Label indique également le nom d'un sous-programme.
Les noms des labels doivent être uniques et commencent par le symbole Arobas @.
Par exemple:
; Sous programme de temporisation Tempo1
@Tempo1 Move.W #$FFFF, D1 ; Chargement valeur tempo
@Loop Dbf D1, @Loop ; Décrémentation tempo
Rts ; Retour de sous-programme
Dans cet exemple,
@Tempo1 indique le nom du sous programme de temporisation.
@Loop indique le nom de l'étiquette de branchement.
Voilà le listing généré par Ed après compilation pour le Bios de la carte LIsa. On retrouve les adresses, Codes Op, commentaires, bref tout ce qu'il faut ...
Projet 68000: Essai de Bios 68000 - SF96/97 -
Assemblé le Samedi 24/10/1998 à 11:09:59.
Vecteurs d'initialisation:
SSP: $00010FF0
PC : $00000482
ROM utilisée de $00000000 à $00001C75
RAM utilisée de $00010000 à $0001000C
Origine Programme ROM: $00000400
Origine Variables RAM: $00010000
Vecteurs Exception-Interruption:
IT31 (IT $1F) = $00000BF2
IT29 (IT $1D) = $00000C28
IT32 (IT $20) = $00000C40
IT33 (IT $21) = $00000CB2
IT34 (IT $22) = $00000CDE
IT35 (IT $23) = $00000CFC
IT36 (IT $24) = $00000D20
IT37 (IT $25) = $00000D30
Constantes:
OUT = $00020001
LCD = $00030001
LCDAT = $00030003
ORA = $00040001
DDRA = $00040001
CRA = $00040003
ORB = $00040005
DDRB = $00040005
CRB = $00040007
TCR13 = $00060001
TCR2 = $00060003
TMSB1 = $00060005
TLSB1 = $00060007
TMSB2 = $00060009
TLSB2 = $0006000B
TMSB3 = $0006000D
TLSB3 = $0006000F
ACIA = $00050001
TDRRDR = $00050003
PILE = $00010E00
KB0 = $00010C00
KBDRV = $00010B30
RX232 = $00010A00
ORGUSR = $00010100
1200BDS = $14
2400BDS = $09
ST232A = $00000400 : 12345678 ^
ST232B = $0000040A : ABCDEFGH ^
ST1 = $00000414 : Autotest ^
ST2 = $0000041E : 68000 ^
ST3 = $00000428 : Ready ^
ST4 = $00000432 : RS 232 ^
ST5 = $0000043C : 1200 Bds ^
ST6 = $00000446 : 2400 Bds ^
STHS = $00000450 : HS ^
STOK = $0000045A : RS232 ok ^
STUSR = $00000464 : User ^
STSYS = $0000046E : System ^
STWAIT = $00000478 : Waiting! ^
Variables Ram:
ADRPRG.L = $00010000
KBDAT.B = $00010004
NBBITKB.B = $00010005
OKDAT.B = $00010006
CARRDY.B = $00010007
KBUP.B = $00010008
HI232.B = $00010009
LO232.B = $0001000A
USERPRG.B = $0001000B
Labels:
@LOOP = $000004EC
@INIT = $00000504
@GEREUSER = $0000054C
@GEREU0 = $00000562
@INIOUT = $00000566
@PIAB = $00000584
@PIAA = $000005A6
@INIPTM = $000005C0
@INI232 = $000005F8
@PTR232 = $0000061E
@AUTO232 = $00000628
@AUTO2A = $00000654
@AUTO2B = $0000067A
@OK232 = $0000068E
@MSGUSER = $000006B4
@MSGUS0 = $000006CA
@MSGUS1 = $000006D0
@AKIUSER = $000006F2
@AKIU1 = $00000708
@AKIU2 = $00000710
@AKIU3 = $0000072C
@AKIU0 = $00000730
@HS232 = $00000736
@AUTOON = $0000076E
@AUTOOFF = $00000784
@BUSYON = $0000079A
@BUSYOF = $000007AE
@INIACIA = $000007C2
@WRACIA = $000007DC
@WRACI1 = $000007DE
@STRACIA = $000007F4
@STRAC1 = $000007FA
@DIPSW = $00000810
@DIPSW1 = $00000834
@DIPSW2 = $0000083E
@DIPSW3 = $00000864
@INIDRV = $0000086A
@MSGINI = $000008B8
@MSGRDY = $000008DE
@MSGRD0 = $0000090C
@MSGRD1 = $00000912
@BUZON = $0000091C
@BUZOFF = $00000932
@BIPBIP = $00000948
@INILCD = $00000974
@CURSON = $00000994
@CURSOF = $000009A8
@CLRLCD = $000009BC
@WAILCD = $000009DE
@WAILC1 = $000009E6
@CARLCD = $000009EE
@CARLC1 = $000009F0
@STRLCD = $00000A06
@STRLC2 = $00000A08
@STRLC1 = $00000A18
@LG1LCD = $00000A1C
@LG2LCD = $00000A38
@HEXASC = $00000A54
@AFFHEX = $00000A70
@AFFHE1 = $00000A82
@AFFHE2 = $00000A90
@DIVB = $00000A9A
@AFFDIV = $00000AB4
@TEMPO = $00000AD6
@T1 = $00000ADE
@GEREKB = $00000AE6
@GEREK5 = $00000B00
@GEREK4 = $00000B20
@GEREK3 = $00000B26
@GEREK2 = $00000B3A
@GEREK1 = $00000B4C
@KBFONC = $00000B50
@KBFON1 = $00000B6C
@KBFON2 = $00000B80
@KBFON0 = $00000B8C
@AKIKB = $00000B90
@AKIK1 = $00000BB2
@AKIK3 = $00000BE6
@AKIK0 = $00000BEA
@IT31 = $00000BF2
@_IT31A = $00000C1E
@IT29 = $00000C28
@IT32 = $00000C40
@_IT32A = $00000C4E
@_IT32B = $00000C5C
@_IT32C = $00000C6A
@_IT32D = $00000C78
@_IT32E = $00000C86
@_IT32F = $00000C94
@_IT32G = $00000CA2
@_IT32Z = $00000CAE
@IT33 = $00000CB2
@_IT33B = $00000CC0
@_IT33C = $00000CCE
@_IT33Z = $00000CDA
@IT34 = $00000CDE
@_IT34B = $00000CEC
@_IT34Z = $00000CF8
@IT35 = $00000CFC
@_IT35B = $00000D0A
@_IT35Z = $00000D1C
@IT36 = $00000D20
@_IT36Z = $00000D2C
@IT37 = $00000D30
@_IT37B = $00000D3E
@_IT37Z = $00000D4A
Listing:
;
; Interface Keyboard PC/AT avec IT courte, LCD et RS232 PC sur carte V1.1
; Générateur de Bauds: Timer 2 (F= Clk/10= 800KHz)
; AutoTest RS232 à l'init.
; Téléchargement RS232
; Appel au Sp Utilisateur par JSR (A2) si switch 1 positionné.
; Format: NNAAAADDD..D
; NN : Qté d'octets à recevoir (sur 2 octets)
; AAAA : Adresse du UserPrg (sur 4 octets)
; DD...D : Code du programme.
;
; Fonctions système par Trap #$xx, n° fonction dans D7.
;
; Trap #$00: Gestion LCD
; $00: ClrScr
; $01: Ligne 1 Lcd
; $02: Ligne 2 Lcd
; $03: Curseur On
; $04: Curseur Off
; $05: Ecriture Caractère (par D0)
; $06: Ecriture String (par A2)
; $07: Affiche un Byte Hexa en Ascii (par D1) -avec appel à HexAsc-
;
; Trap #$01: Gestion Buzzer
; $00: Buzzer On
; $01: Buzzer Off
; $02: Bip-Bip
;
; Trap #$02: Gestion Acia
; $00: Emission Caractère (par D0)
; $01: Emission String (par A4, Nb caractères par D4)
;
; Trap #$03: Tempos
; $00: Tempo générale (x1)
; $01: Tempo générale (x2)
;
; Trap #$04: Conversions
; $00: Octet Hexa -> 3 digits Ascii (pas d'affichage)
; Appel: D1.B: Octet à convertir
; Retour: D1.L_low : X-- High
; D0.L_high: -X- Medium
; D0.L_low : --X Low
;
; Trap #$05: Maths
; $00: Division à virgule de D1.B/D0.B,
; résultat dans D2.L, High: décimale & Low: entier
;
; FONCTIONNE !!!
;
; A1: Pointeur désérialisation Clavier
; A2: Pointeur chaine à afficher sur LCD ou Adresse UserPrg
; A3: Pointeur Driver Keyb -> Ascii
; A4: Pointeur chaine à envoyer sur RS232 -Nb Emis par D4.W-
; A5: Pointeur chaine reception RS232 -Nb Reçus par D5.W-
; Programme principal
00000482 4EB900000504 JSR @Init ; Init Stack et Variables
00000488 4EB900000974 JSR @IniLCD ; Init LCD
0000048E 4EB9000008B8 JSR @MsgIni ; Msg d'init
00000494 4EB900000566 JSR @IniOut ; Init Sorties
0000049A 4EB900000584 JSR @PiaB ; Init PIA B
000004A0 4EB9000005A6 JSR @PiaA ; Init PIA A
000004A6 4EB900000784 JSR @AutoOff ; Raz bouchon RS232
000004AC 4EB900000810 JSR @DipSw ; Lecture Switches config Pia A
000004B2 4EB9000005C0 JSR @IniPTM ; Init Timers
000004B8 4EB9000007C2 JSR @IniACIA ; Init ACIA
000004BE 4EB90000086A JSR @IniDrv ; Init Driver Keyb -> Ascii
000004C4 027CF8FF ANDI #$F8FF, SR ; Autorise IT tous niveaux dans SR
000004C8 4EB900000628 JSR @Auto232 ; Lance l'autotest RS232
000004CE 4EB9000006B4 JSR @MsgUser ; User ou System suivant switch
000004D4 4EB9000008DE JSR @MsgRdy ; Msg Ready ou Waiting
000004DA 4EB900000AD6 JSR @Tempo
000004E0 4EB900000948 JSR @BipBip
000004E6 4EB9000006F2 JSR @AkiUser ; Acquisition du SP utilisateur en RS232
000004EC 4EB900000B90 @LOOP JSR @AkiKb
000004F2 4EB900000AE6 JSR @GereKb
000004F8 4EB90000054C JSR @GereUser ; Lance le SP utilisateur au besoin
000004FE 4EF9000004EC JMP @Loop
00000504 41F900010E00 @INIT LEA Pile, A0 ; Init Pointeur Pile A0
0000050A 43F900010C00 LEA kb0, A1 ; Init Pointeur pile clavier PC/AT
00000510 4BF900010A00 LEA Rx232, A5 ; Init Pointeur pile réception RS232
00000516 423900020001 CLR.B OUT ; Clear OUT
0000051C 423900010004 CLR.B KbDat ; Clear KeyDat
00000522 423900010005 CLR.B NbBitKb ; Clear Nbre de bit Kb lus
00000528 423900010006 CLR.B OkDat
0000052E 423900010007 CLR.B CarRdy
00000534 423900010008 CLR.B KbUp
0000053A 4244 CLR.W D4 ; Nbre de caractères Emis en RS232
0000053C 4245 CLR.W D5 ; Nbre de caractères Reçus en RS232
0000053E 42390001000B CLR.B UserPrg ; Flag UserProg à gérer ou non
00000544 42B900010000 CLR.L AdrPrg ; Adresse du UserPrg en Ram
0000054A 4E75 RTS
0000054C 20C0 @GEREUSER MOVE.L D0, (A0)+ ; Lance le programme téléchargé
0000054E 10390001000B MOVE.B UserPrg, D0 ; si on l'a demandé par le Switch 1
00000554 B03C00FF CMP.B #$FF, D0
00000558 6608 BNE @GereU0
0000055A 247900010000 MOVE.L AdrPrg, A2
00000560 4E92 JSR (A2)
00000562 2020 @GEREU0 MOVE.L -(A0), D0
00000564 4E75 RTS
00000566 7055 @INIOUT MOVEQ #$55, D0 ; Init Sorties
00000568 13C000020001 MOVE.B D0, OUT
0000056E 4EB900000AD6 JSR @Tempo
00000574 4600 NOT.B D0
00000576 13C000020001 MOVE.B D0, OUT
0000057C 4EB900000AD6 JSR @Tempo
00000582 4E75 RTS
00000584 20C0 @PIAB MOVE.L D0, (A0)+ ; Push D0
00000586 423900040007 CLR.B CRB ; Accès DDRB
0000058C 705F MOVEQ #$5F, D0 ; %0101.1111: Pb7 NC, Auto232 S, KbDat E,
0000058E 13C000040005 MOVE.B D0, DDRB ; Buzzer S, E2CS S, E2DATA S, E2SK S, ITEN\ S
00000594 7004 MOVEQ #$04, D0 ; Accès ORB, sans ITs
00000596 13C000040007 MOVE.B D0, CRB
0000059C 423900040005 CLR.B ORB ; ITEN\=0, Buzzer=0, Relais Autotest 232 off.
000005A2 2020 MOVE.L -(A0), D0 ; Pull D0
000005A4 4E75 RTS
000005A6 20C0 @PIAA MOVE.L D0, (A0)+ ; Push D0
000005A8 423900040003 CLR.B CRA ; Accès DDRA
000005AE 423900040001 CLR.B DDRA ; ORA en entrées, dip switches
000005B4 7005 MOVEQ #$05,D0 ; %0000.0101: IRQA par CA1, CA1\, masquée CA2,
000005B6 13C000040003 MOVE.B D0, CRA ; CA2 entrée\ et accès ORA
000005BC 2020 MOVE.L -(A0), D0 ; Pull D0
000005BE 4E75 RTS
000005C0 20C0 @INIPTM MOVE.L D0, (A0)+ ; Init Timers
000005C2 7001 MOVEQ #$01, D0 ; Accès CR1
000005C4 13C000060003 MOVE.B D0, TCR2
000005CA 423900060001 CLR.B TCR13 ; Init tous Timers
000005D0 423900060003 CLR.B TCR2 ; Accès CR3
000005D6 7083 MOVEQ #$83, D0 ; Monostable 16 bits,
000005D8 13C000060001 MOVE.B D0, TCR13 ; T div 8, pas d'IT, sortie masquée
000005DE 70F4 MOVEQ #$F4, D0 ; Chargement MSB
000005E0 13C00006000D MOVE.B D0, Tmsb3 ; demi période 0,5s
000005E6 7023 MOVEQ #$23, D0 ; Chargement LSB et Start
000005E8 13C00006000F MOVE.B D0, Tlsb3
000005EE 4EB9000005F8 JSR @Ini232 ; Init Timer2 RS232
000005F4 2020 MOVE.L -(A0), D0
000005F6 4E75 RTS
000005F8 20C0 @INI232 MOVE.L D0, (A0)+ ; Init vitesse ACIA
000005FA 7082 MOVEQ #$82, D0 ; CR2: 16 bits, pas d'IT, sortie active
000005FC 13C000060003 MOVE.B D0, TCR2
00000602 103900010009 MOVE.B Hi232, D0 ; vitesse RS232 Hi
00000608 13C000060009 MOVE.B D0, Tmsb2
0000060E 10390001000A MOVE.B Lo232, D0 ; vitesse RS232 Lo
00000614 13C00006000B MOVE.B D0, Tlsb2
0000061A 2020 MOVE.L -(A0), D0
0000061C 4E75 RTS
0000061E 4245 @PTR232 CLR.W D5 ; Réinit pointeur réception Acia
00000620 4BF900010A00 LEA Rx232, A5 ; Init pointeur réception
00000626 4E75 RTS
00000628 4EB90000076E @AUTO232 JSR @AutoOn ; Ferme le relais Autotest RS232
0000062E 4EB900000AD6 JSR @Tempo ; Anti rebonds relais
00000634 383C0008 MOVE.W #$0008, D4
00000638 49F900000400 LEA St232a, A4 ; Envoie '12345678' sur l'Acia
0000063E 4EB9000007F4 JSR @StrAcia
00000644 4EB900000AD6 JSR @Tempo ; Attend
0000064A BA44 CMP.W D4, D5 ; et regarde Reçus=Emis par IT Réception Acia
0000064C 6706 BEQ @Auto2a
0000064E 4EF900000736 JMP @Hs232 ; Si non, Msg RS232 HS
00000654 4EB90000061E @AUTO2A JSR @Ptr232
0000065A 383C0008 MOVE.W #$0008,D4
0000065E 49F90000040A LEA St232b, A4 ; et envoie 'ABCDEFGH'
00000664 4EB9000007F4 JSR @StrAcia
0000066A 4EB900000AD6 JSR @Tempo
00000670 BA44 CMP.W D4, D5 ; Idem.
00000672 6706 BEQ @Auto2b
00000674 4EF900000736 JMP @Hs232
0000067A 4EB90000061E @AUTO2B JSR @Ptr232
00000680 4EB90000068E JSR @Ok232 ; Qd test fini, l'affiche
00000686 4EB900000784 JSR @AutoOff ; et ouvre le relais.
0000068C 4E75 RTS
0000068E 45F90000045A @OK232 LEA StOk, A2 ; Affiche la chaine 'RS232 OK'
00000694 4EB900000A38 JSR @Lg2Lcd
0000069A 4EB900000A06 JSR @StrLcd
000006A0 4EB900000AD6 JSR @Tempo
000006A6 4EB900000AD6 JSR @Tempo
000006AC 4EB900000AD6 JSR @Tempo
000006B2 4E75 RTS
000006B4 20C0 @MSGUSER MOVE.L D0, (A0)+ ; En autotest, affiche état Switch User
000006B6 10390001000B MOVE.B UserPrg, D0
000006BC B03C00FF CMP.B #$FF, D0
000006C0 6708 BEQ @MsgUs0
000006C2 45F90000046E LEA StSys, A2
000006C8 6006 BRA @MsgUs1
000006CA 45F900000464 @MSGUS0 LEA StUsr, A2
000006D0 4EB900000A38 @MSGUS1 JSR @Lg2Lcd
000006D6 4EB900000A06 JSR @StrLcd
000006DC 4EB900000AD6 JSR @Tempo
000006E2 4EB900000AD6 JSR @Tempo
000006E8 4EB900000AD6 JSR @Tempo
000006EE 2020 MOVE.L -(A0), D0
000006F0 4E75 RTS
000006F2 20C0 @AKIUSER MOVE.L D0, (A0)+ ; Téléchargement du programme User
000006F4 20C1 MOVE.L D1, (A0)+
000006F6 10390001000B MOVE.B UserPrg, D0
000006FC B03C00FF CMP.B #$FF, D0
00000700 662E BNE @AkiU0
00000702 45F900010A00 LEA Rx232, A2
00000708 BA7C0002 @AKIU1 CMP.W #$0002, D5
0000070C 66FA BNE @AkiU1
0000070E 321A MOVE.W (A2)+, D1
00000710 BA7C0006 @AKIU2 CMP.W #$0006, D5
00000714 66FA BNE @AkiU2
00000716 201A MOVE.L (A2)+, D0
00000718 23C000010000 MOVE.L D0, AdrPrg
0000071E 027CFFFF ANDI #$FFFF, SR
00000722 4BF900010100 LEA OrgUsr, A5
00000728 027CF8FF ANDI #$F8FF,SR
0000072C BA41 @AKIU3 CMP.W D1, D5
0000072E 66FC BNE @AkiU3
00000730 2220 @AKIU0 MOVE.L -(A0), D1
00000732 2020 MOVE.L -(A0), D0
00000734 4E75 RTS
00000736 4EB9000009BC @HS232 JSR @ClrLcd ; Affiche 'RS232 HS'
0000073C 45F900000432 LEA St4, A2 ; et se met en boucle.
00000742 4EB900000A06 JSR @StrLcd
00000748 4EB900000A38 JSR @Lg2Lcd
0000074E 45F900000450 LEA StHs, A2
00000754 4EB900000A06 JSR @StrLcd
0000075A 4EB900000AD6 JSR @Tempo
00000760 4EB900000AD6 JSR @Tempo
00000766 4EB900000948 JSR @BipBip
0000076C 60C8 BRA @Hs232
0000076E 20C0 @AUTOON MOVE.L D0, (A0)+ ; Relais Autotest RS232 On
00000770 103900040005 MOVE.B ORB, D0
00000776 00000040 ORI.B #$40, D0
0000077A 13C000040005 MOVE.B D0, ORB
00000780 2020 MOVE.L -(A0), D0
00000782 4E75 RTS
00000784 20C0 @AUTOOFF MOVE.L D0,(A0)+ ; Relais Autotest RS232 Off
00000786 103900040005 MOVE.B ORB, D0
0000078C 020000BF ANDI.B #$BF, D0
00000790 13C000040005 MOVE.B D0, ORB
00000796 2020 MOVE.L -(A0), D0
00000798 4E75 RTS
0000079A 20C0 @BUSYON MOVE.L D0, (A0)+ ; Active Led Busy du timer
0000079C 423900060003 CLR.B TCR2 ; Accès CR3
000007A2 7083 MOVEQ #$83, D0 ; Monostable 16 bits,
000007A4 13C000060001 MOVE.B D0, TCR13 ; T div 8, pas d'IT, sortie active
000007AA 2020 MOVE.L -(A0), D0
000007AC 4E75 RTS
000007AE 20C0 @BUSYOF MOVE.L D0, (A0)+ ; Désactive Led Busy du Timer
000007B0 423900060003 CLR.B TCR2 ; Accès CR3
000007B6 7003 MOVEQ #$03, D0 ; Monostable 16 bits,
000007B8 13C000060001 MOVE.B D0, TCR13 ; T div 8, pas d'IT, sortie masquée
000007BE 2020 MOVE.L -(A0), D0
000007C0 4E75 RTS
000007C2 20C0 @INIACIA MOVE.L D0, (A0)+ ; Init ACIA
000007C4 103C0003 MOVE.B #$03, D0 ; Master Reset
000007C8 13C000050001 MOVE.B D0, Acia
000007CE 103C0095 MOVE.B #$95, D0 ; IT Réception, pas d'IT émission,
000007D2 13C000050001 MOVE.B D0, Acia ; 8 bits - pas de parité - 1 Stop, Clk 1/16
000007D8 2020 MOVE.L -(A0), D0
000007DA 4E75 RTS
000007DC 20C1 @WRACIA MOVE.L D1, (A0)+ ; Emission du caractère de D0 sur ACIA
000007DE 123900050001 @WRACI1 MOVE.B Acia, D1 ; Lecture SR Acia
000007E4 08010001 BTST #$01, D1 ; Test de TDRE (SR1)
000007E8 67F4 BEQ @WrAci1 ; Si TDRE=0, TDR pas vide, on boucle.
000007EA 13C000050003 MOVE.B D0, TdrRdr
000007F0 2220 MOVE.L -(A0), D1
000007F2 4E75 RTS
000007F4 20C0 @STRACIA MOVE.L D0, (A0)+ ; Ecrit la chaine pointée par A4 sur ACIA
000007F6 20C1 MOVE.L D1, (A0)+ ; Le nbre à envoyer est dans D4.W
000007F8 4241 CLR.W D1
000007FA 101C @STRAC1 MOVE.B (A4)+, D0 ; Envoie le caractère en cours à @WrAcia
000007FC 4EB9000007DC JSR @WrAcia
00000802 D27C0001 ADD.W #$0001, D1 ; Incrémente le nb émis
00000806 B841 CMP.W D1, D4 ; et regarde si tout a été envoyé.
00000808 66F0 BNE @StrAc1 ; Si non, on reboucle
0000080A 2220 MOVE.L -(A0), D1
0000080C 2020 MOVE.L -(A0), D0
0000080E 4E75 RTS
00000810 20C0 @DIPSW MOVE.L D0, (A0)+ ; Lit l'état des Dip-Switches
00000812 20C1 MOVE.L D1, (A0)+
00000814 103900040001 MOVE.B ORA, D0
0000081A 4600 NOT.B D0 ; Entrées complémentées
0000081C 13C000020001 MOVE.B D0, OUT ; Affichage config sur Out.
00000822 08000000 BTST #$00, D0 ; Test Dip n°0: vitesse RS232
00000826 660C BNE @DipSw1 ; Si <> On, 1200 bds.
00000828 45F90000043C LEA St5, A2
0000082E 123C0014 MOVE.B #1200Bds, D1 ; 1200 Bds
00000832 600A BRA @DipSw2
00000834 123C0009 @DIPSW1 MOVE.B #2400Bds, D1 ; ou 2400 Bds
00000838 45F900000446 LEA St6, A2
0000083E 423900010009 @DIPSW2 CLR.B Hi232
00000844 13C10001000A MOVE.B D1, Lo232
0000084A 4EB900000A38 JSR @Lg2Lcd
00000850 4EB900000A06 JSR @StrLcd
00000856 08000001 BTST #$01, D0 ; Test Dip n°1: Lancement UserPrg
0000085A 6708 BEQ @DipSw3 ; Si <> On, pas de lancement UserPrg
0000085C 72FF MOVEQ #$FF, D1
0000085E 13C10001000B MOVE.B D1, UserPrg ; Sinon, positionne flag User
00000864 2220 @DIPSW3 MOVE.L -(A0), D1
00000866 2020 MOVE.L -(A0), D0
00000868 4E75 RTS
0000086A 47F900010B30 @INIDRV LEA KbDrv, A3 ; A3: Pointeur Driver Keyb -> Ascii
00000870 26FC7069727A MOVE.L #$7069727A, (A3)+ ; 0123
00000876 26FC6B73746C MOVE.L #$6B73746C, (A3)+ ; 4567
0000087C 26FC757D4941 MOVE.L #$757D4941, (A3)+ ; 89:;
00000882 26FC6155613A MOVE.L #$6155613A, (A3)+ ; <=>?
00000888 26FC45153221 MOVE.L #$45153221, (A3)+ ; @ABC
0000088E 26FC23242B34 MOVE.L #$23242B34, (A3)+ ; DEFG
00000894 26FC33433B42 MOVE.L #$33433B42, (A3)+ ; HIJK
0000089A 26FC4B4C3144 MOVE.L #$4B4C3144, (A3)+ ; LMNO
000008A0 26FC4D1C2D1B MOVE.L #$4D1C2D1B, (A3)+ ; PQRS
000008A6 26FC2C3C2A1A MOVE.L #$2C3C2A1A, (A3)+ ; TUVW
000008AC 26FC22351D2E MOVE.L #$22351D2E, (A3)+ ; XYZ[
000008B2 16FC0000 MOVE.B #$00, (A3)+ ; 00 -> Fin de la table
000008B6 4E75 RTS
000008B8 45F900000414 @MSGINI LEA St1, A2 ; Msg "Autotest 68000"
000008BE 4EB900000A06 JSR @StrLcd
000008C4 4EB900000A38 JSR @Lg2Lcd
000008CA 45F90000041E LEA St2, A2
000008D0 4EB900000A06 JSR @StrLcd
000008D6 4EB900000AD6 JSR @Tempo
000008DC 4E75 RTS
000008DE 20C0 @MSGRDY MOVE.L D0, (A0)+ ; Msg "68000 Ready" ou "68000 Waiting!"
000008E0 4EB9000009BC JSR @ClrLCD
000008E6 45F90000041E LEA St2, A2
000008EC 4EB900000A06 JSR @StrLcd
000008F2 4EB900000A38 JSR @Lg2Lcd
000008F8 10390001000B MOVE.B UserPrg, D0
000008FE B03C00FF CMP.B #$FF, D0
00000902 6608 BNE @MsgRd0
00000904 45F900000478 LEA StWait, A2
0000090A 6006 BRA @MsgRd1
0000090C 45F900000428 @MSGRD0 LEA St3, A2
00000912 4EB900000A06 @MSGRD1 JSR @StrLcd
00000918 2020 MOVE.L -(A0), D0
0000091A 4E75 RTS
0000091C 20C0 @BUZON MOVE.L D0, (A0)+ ; Buzzer On
0000091E 103900040005 MOVE.B ORB, D0
00000924 00000010 ORI.B #$10, D0
00000928 13C000040005 MOVE.B D0, ORB
0000092E 2020 MOVE.L -(A0), D0
00000930 4E75 RTS
00000932 20C0 @BUZOFF MOVE.L D0,(A0)+ ; Buzzer Off
00000934 103900040005 MOVE.B ORB, D0
0000093A 020000EF ANDI.B #$EF, D0
0000093E 13C000040005 MOVE.B D0, ORB
00000944 2020 MOVE.L -(A0), D0
00000946 4E75 RTS
00000948 4EB90000091C @BIPBIP JSR @BuzOn ; Bip-bip
0000094E 4EB900000AD6 JSR @Tempo
00000954 4EB900000932 JSR @BuzOff
0000095A 4EB900000AD6 JSR @Tempo
00000960 4EB90000091C JSR @BuzOn
00000966 4EB900000AD6 JSR @Tempo
0000096C 4EB900000932 JSR @BuzOff
00000972 4E75 RTS
00000974 20C0 @INILCD MOVE.L D0,(A0)+ ; Init LCD
00000976 7038 MOVEQ #$38, D0 ; 2 lignes, 5x7 dots, 8 bits
00000978 13C000030001 MOVE.B D0, LCD
0000097E 4EB9000009DE JSR @WaiLcd ; Tempo reset LCD
00000984 4EB9000009A8 JSR @CursOf ; Curseur Off
0000098A 4EB9000009BC JSR @ClrLCD ; Efface écran
00000990 2020 MOVE.L -(A0), D0
00000992 4E75 RTS
00000994 20C0 @CURSON MOVE.L D0, (A0)+ ; Display On, Curseur on, not Blink
00000996 700E MOVEQ #$0E, D0
00000998 13C000030001 MOVE.B D0, LCD
0000099E 4EB9000009DE JSR @WaiLCD
000009A4 2020 MOVE.L -(A0), D0
000009A6 4E75 RTS
000009A8 20C0 @CURSOF MOVE.L D0, (A0)+ ; Display On, Curseur off, not Blink
000009AA 700C MOVEQ #$0C, D0
000009AC 13C000030001 MOVE.B D0, LCD
000009B2 4EB9000009DE JSR @WaiLCD
000009B8 2020 MOVE.L -(A0), D0
000009BA 4E75 RTS
000009BC 20C0 @CLRLCD MOVE.L D0, (A0)+ ; Efface l'écran LCD
000009BE 7001 MOVEQ #$01, D0 ; Clear screen
000009C0 13C000030001 MOVE.B D0, LCD
000009C6 4EB9000009DE JSR @WaiLCD
000009CC 7002 MOVEQ #$02, D0 ; Return Home
000009CE 13C000030001 MOVE.B D0, LCD
000009D4 4EB9000009DE JSR @WaiLCD
000009DA 2020 MOVE.L -(A0), D0
000009DC 4E75 RTS
000009DE 20C0 @WAILCD MOVE.L D0, (A0)+ ; Tempo d'init du LCD
000009E0 203C00004FFF MOVE.L #$00004FFF, D0
000009E6 51C8FFFE @WAILC1 DBF D0, @WaiLc1
000009EA 2020 MOVE.L -(A0), D0
000009EC 4E75 RTS
000009EE 20C1 @CARLCD MOVE.L D1, (A0)+ ; Ecrit le caractère de (D0) sur le LCD
000009F0 123900030001 @CARLC1 MOVE.B LCD, D1
000009F6 02010080 ANDI.B #$80, D1
000009FA 66F4 BNE @CarLc1 ; Attente Busy Flag= 0
000009FC 13C000030003 MOVE.B D0, LCDat
00000A02 2220 MOVE.L -(A0), D1
00000A04 4E75 RTS
00000A06 20C0 @STRLCD MOVE.L D0, (A0)+ ; Ecrit la chaine pointée par A2 sur LCD
00000A08 101A @STRLC2 MOVE.B (A2)+, D0 ; Envoie le caractère en cours à @CarLcd
00000A0A B03C005E CMP.B #$5E, D0 ; tant qu'on ne pointe pas sur ^: EoString.
00000A0E 6708 BEQ @StrLc1
00000A10 4EB9000009EE JSR @CarLcd
00000A16 60F0 BRA @StrLc2
00000A18 2020 @STRLC1 MOVE.L -(A0), D0
00000A1A 4E75 RTS
00000A1C 20C0 @LG1LCD MOVE.L D0, (A0)+ ; Lcd: Ligne 1
00000A1E 4EB9000009DE JSR @WaiLCD
00000A24 103C0080 MOVE.B #$80, D0
00000A28 13C000030001 MOVE.B D0, LCD
00000A2E 4EB9000009DE JSR @WaiLCD
00000A34 2020 MOVE.L -(A0), D0
00000A36 4E75 RTS
00000A38 20C0 @LG2LCD MOVE.L D0, (A0)+ ; Lcd: Ligne 2
00000A3A 4EB9000009DE JSR @WaiLCD
00000A40 103C00C0 MOVE.B #$C0, D0
00000A44 13C000030001 MOVE.B D0, LCD
00000A4A 4EB9000009DE JSR @WaiLCD
00000A50 2020 MOVE.L -(A0), D0
00000A52 4E75 RTS
00000A54 4280 @HEXASC CLR.L D0 ; Octet Hexa -> Ascii Décimal 3 digits
00000A56 82FC000A DIVU #$000A, D1 ; Ex: $84 => $31 $33 $32 (132)
00000A5A 3001 MOVE.W D1, D0
00000A5C 80FC000A DIVU #$000A, D0
00000A60 82BC00300000 OR.L #$00300000, D1 ; D1.L_low : X-- High
00000A66 4841 SWAP D1 ; D0.L_high: -X- Medium
00000A68 80BC00300030 OR.L #$00300030, D0 ; D0.L_low : --X Low
00000A6E 4E75 RTS
00000A70 4EB900000A54 @AFFHEX JSR @HexAsc ; Affiche l'Hexa contenu dans D1 en Ascii
00000A76 B03C0030 CMP.B #$30, D0 ; Le résultat dans D0 est affiché
00000A7A 6706 BEQ @AffHe1 ; Les 0 de gauche ne sont pas affichés
00000A7C 4EB9000009EE JSR @CarLcd ; Ex: 008 => 8
00000A82 4840 @AFFHE1 SWAP D0
00000A84 B03C0030 CMP.B #$30, D0
00000A88 6706 BEQ @AffHe2
00000A8A 4EB9000009EE JSR @CarLcd
00000A90 C340 @AFFHE2 EXG D1, D0
00000A92 4EB9000009EE JSR @CarLcd
00000A98 4E75 RTS
00000A9A 4282 @DIVB CLR.L D2 ; Division à virgule de D1.b/D0.b
00000A9C 82C0 DIVU D0, D1 ; résultat dans D2.L: High: décimale
00000A9E 4841 SWAP D1 ; Low : entier
00000AA0 2401 MOVE.L D1, D2
00000AA2 4841 SWAP D1
00000AA4 4241 CLR.W D1
00000AA6 4841 SWAP D1
00000AA8 C2FC000A MULU #$0A, D1
00000AAC 82C0 DIVU D0, D1
00000AAE 3401 MOVE.W D1, D2
00000AB0 4842 SWAP D2
00000AB2 4E75 RTS
00000AB4 4281 @AFFDIV CLR.L D1 ; Affiche le résultat de la division
00000AB6 1202 MOVE.B D2, D1 ; dont le résultat est dans D2
00000AB8 4EB900000A70 JSR @AffHex
00000ABE 1E3C0005 MOVE.B #$05, D7
00000AC2 103C002C MOVE.B #$2C, D0 ; ","
00000AC6 4E40 TRAP #$00
00000AC8 4842 SWAP D2
00000ACA 4281 CLR.L D1
00000ACC 1202 MOVE.B D2, D1
00000ACE 4EB900000A70 JSR @AffHex
00000AD4 4E75 RTS
00000AD6 20C0 @TEMPO MOVE.L D0, (A0)+ ; Tempo générale
00000AD8 203C0000FFFF MOVE.L #$0000FFFF, D0
00000ADE 51C8FFFE @T1 DBF D0, @T1
00000AE2 2020 MOVE.L -(A0), D0
00000AE4 4E75 RTS
00000AE6 20C0 @GEREKB MOVE.L D0, (A0)+ ; Décodage des touches du clavier PC/AT
00000AE8 103900010007 MOVE.B CarRdy, D0
00000AEE 675C BEQ @GereK1 ; Regarde d'abord si touche non-ascii
00000AF0 103900010008 MOVE.B KbUp, D0 ; Regarde si code break recu precedement
00000AF6 6708 BEQ @GereK5
00000AF8 423900010008 CLR.B KbUp
00000AFE 603A BRA @GereK2 ; Si oui, on sort
00000B00 4EB900000B50 @GEREK5 JSR @KbFonc
00000B06 103900010004 MOVE.B KbDat, D0 ; On avait un non-Ascii, on sort
00000B0C 672C BEQ @GereK2
00000B0E B03C00F0 CMP.B #$F0, D0 ; Code Break, touche relachée
00000B12 660C BNE @GereK4
00000B14 103C00FF MOVE.B #$FF, D0 ; donc pose flag
00000B18 13C000010008 MOVE.B D0, KbUp
00000B1E 601A BRA @GereK2 ; et sort.
00000B20 47F900010B30 @GEREK4 LEA KbDrv, A3 ; Charge pointeur Driver Ascii
00000B26 121B @GEREK3 MOVE.B (A3)+, D1
00000B28 6710 BEQ @GereK2
00000B2A B001 CMP.B D1, D0
00000B2C 66F8 BNE @GereK3
00000B2E 300B MOVE.W A3, D0 ; Pointeur-1 = Code Ascii
00000B30 903C0001 SUB.B #$01, D0
00000B34 4EB9000009EE JSR @CarLcd ; pour affichage
00000B3A 423900010005 @GEREK2 CLR.B NbBitKb ; Clear Nbre de bit Kb lus
00000B40 423900010006 CLR.B OkDat
00000B46 423900010007 CLR.B CarRdy
00000B4C 2020 @GEREK1 MOVE.L -(A0), D0
00000B4E 4E75 RTS
00000B50 20C0 @KBFONC MOVE.L D0, (A0)+ ; Gestion des non-Ascii
00000B52 103900010004 MOVE.B KbDat, D0
00000B58 B03C0076 CMP.B #$76, D0 ; * Escape ?
00000B5C 660E BNE @KbFon1
00000B5E 4EB9000009BC JSR @ClrLCD ; -> Clear LCD
00000B64 423900010004 CLR.B KbDat ; Traitement effectué pour GereKb
00000B6A 6020 BRA @KbFon0
00000B6C B03C005A @KBFON1 CMP.B #$5A, D0 ; * Enter ?
00000B70 660E BNE @KbFon2
00000B72 4EB900000A38 JSR @Lg2Lcd ; -> Curseur en ligne 2
00000B78 423900010004 CLR.B KbDat ; Traitement effectué pour GereKb
00000B7E 600C BRA @KbFon0
00000B80 B03C0005 @KBFON2 CMP.B #$05, D0 ; * F1 ?
00000B84 6606 BNE @KbFon0
00000B86 423900010004 CLR.B KbDat ; Traitement effectué pour GereKb
00000B8C 2020 @KBFON0 MOVE.L -(A0), D0
00000B8E 4E75 RTS
00000B90 20C0 @AKIKB MOVE.L D0, (A0)+ ; Désérialisation clavier
00000B92 20C1 MOVE.L D1, (A0)+
00000B94 20C2 MOVE.L D2, (A0)+
00000B96 103900010006 MOVE.B OkDat, D0 ; Si réception pas finie, on sort.
00000B9C 674C BEQ @AkiK0
00000B9E 027CFFFF ANDI #$FFFF, SR ; Interdit les IT
00000BA2 423900010004 CLR.B KbDat
00000BA8 43F900010C00 LEA kb0, A1 ; Charge buffer réception clavier
00000BAE 1019 MOVE.B (A1)+, D0
00000BB0 4201 CLR.B D1
00000BB2 1019 @AKIK1 MOVE.B (A1)+, D0
00000BB4 02000020 ANDI.B #$20, D0 ; Isole le bit reçu dans l'octet
00000BB8 E518 ROL.B #$02, D0 ; et le met en b7
00000BBA 143900010004 MOVE.B KbDat, D2
00000BC0 E21A ROR.B #$01, D2 ; Rol du traitement précédent
00000BC2 13C200010004 MOVE.B D2, KbDat
00000BC8 813900010004 OR.B D0, KbDat ; pour y insérer le bit en cours
00000BCE 06010001 ADDI.B #$01, D1
00000BD2 B23C0008 CMP.B #$08, D1 ; Si on n'a pas traité les 8 bits, continue.
00000BD6 66DA BNE @AkiK1
00000BD8 43F900010C00 LEA kb0, A1 ; Qd fini, init du pointeur buffer pour IT
00000BDE 70FF MOVEQ #$FF, D0
00000BE0 13C000010007 MOVE.B D0, CarRdy ; Flag traitement Ok.
00000BE6 027CF8FF @AKIK3 ANDI #$F8FF, SR
00000BEA 2420 @AKIK0 MOVE.L -(A0), D2
00000BEC 2220 MOVE.L -(A0), D1
00000BEE 2020 MOVE.L -(A0), D0
00000BF0 4E75 RTS
00000BF2 20C0 @IT31 MOVE.L D0, (A0)+ ; IT Clavier PC/AT
00000BF4 103900010006 MOVE.B OkDat, D0
00000BFA 6622 BNE @_IT31a
00000BFC 103900040005 MOVE.B ORB, D0
00000C02 12C0 MOVE.B D0, (A1)+
00000C04 0639000100010005 ADDI.B #$01, NbBitKb
00000C0C 0C39000900010005 CMPI.B #$09, NbBitKb
00000C14 6608 BNE @_IT31a
00000C16 70FF MOVEQ #$FF, D0
00000C18 13C000010006 MOVE.B D0, OkDat
00000C1E 103900040001 @_IT31A MOVE.B ORA, D0 ; Raz IT Pia
00000C24 2020 MOVE.L -(A0), D0
00000C26 4E73 RTE
00000C28 20C0 @IT29 MOVE.L D0, (A0)+ ; IT Réception ACIA
00000C2A 103900050003 MOVE.B TdrRdr, D0 ; Charge le caractère reçu
00000C30 1AC0 MOVE.B D0, (A5)+ ; et l'empile.
00000C32 DA7C0001 ADD.W #$0001, D5 ; Incrémente le compteur Réception
00000C36 103900050001 MOVE.B Acia, D0 ; Lecture du SR Acia pour Raz Rdrf
00000C3C 2020 MOVE.L -(A0), D0
00000C3E 4E73 RTE
00000C40 BE3C0000 @IT32 CMP.B #$00, D7 ; Trap #$00: Gestion LCD
00000C44 6608 BNE @_IT32a
00000C46 4EB9000009BC JSR @ClrLcd ; Fct 00: ClrLcd
00000C4C 6060 BRA @_IT32z
00000C4E BE3C0001 @_IT32A CMP.B #$01, D7
00000C52 6608 BNE @_IT32b
00000C54 4EB900000A1C JSR @Lg1Lcd ; Fct 01: Ligne 1 Lcd
00000C5A 6052 BRA @_IT32z
00000C5C BE3C0002 @_IT32B CMP.B #$02, D7
00000C60 6608 BNE @_IT32c
00000C62 4EB900000A38 JSR @Lg2Lcd ; Fct 02: Ligne 2 Lcd
00000C68 6044 BRA @_IT32z
00000C6A BE3C0003 @_IT32C CMP.B #$03, D7
00000C6E 6608 BNE @_IT32d
00000C70 4EB900000994 JSR @CursOn ; Fct 03: Curseur On
00000C76 6036 BRA @_IT32z
00000C78 BE3C0004 @_IT32D CMP.B #$04, D7
00000C7C 6608 BNE @_IT32e
00000C7E 4EB9000009A8 JSR @CursOf ; Fct 04: Curseur Off
00000C84 6028 BRA @_IT32z
00000C86 BE3C0005 @_IT32E CMP.B #$05, D7
00000C8A 6608 BNE @_IT32f
00000C8C 4EB9000009EE JSR @CarLcd ; Fct 05: Ecriture Caractère Lcd (par D0)
00000C92 601A BRA @_IT32z
00000C94 BE3C0006 @_IT32F CMP.B #$06, D7
00000C98 6608 BNE @_IT32g
00000C9A 4EB900000A06 JSR @StrLcd ; Fct 06: Ecriture String Lcd (par A2)
00000CA0 600C BRA @_IT32z
00000CA2 BE3C0007 @_IT32G CMP.B #$07, D7
00000CA6 6606 BNE @_IT32z
00000CA8 4EB900000A70 JSR @AffHex ; Fct 07: Affiche un Hexa.b converti en Ascii
00000CAE 4E71 @_IT32Z NOP
00000CB0 4E73 RTE
00000CB2 BE3C0000 @IT33 CMP.B #$00, D7 ; Trap #$01: Gestion Buzzer
00000CB6 6608 BNE @_IT33b
00000CB8 4EB90000091C JSR @BuzOn ; Fct 00: Buzzer On
00000CBE 601A BRA @_IT33z
00000CC0 BE3C0001 @_IT33B CMP.B #$01, D7
00000CC4 6608 BNE @_IT33c
00000CC6 4EB900000932 JSR @BuzOff ; Fct 01: Buzzer Off
00000CCC 600C BRA @_IT33z
00000CCE BE3C0002 @_IT33C CMP.B #$02, D7
00000CD2 6606 BNE @_IT33z
00000CD4 4EB900000948 JSR @BipBip ; Fct 02: Bip-Bip
00000CDA 4E71 @_IT33Z NOP
00000CDC 4E73 RTE
00000CDE BE3C0000 @IT34 CMP.B #$00, D7 ; Trap #$02: Gestion Acia
00000CE2 6608 BNE @_IT34b
00000CE4 4EB9000007DC JSR @WrAcia ; Fct 00: Emission Caractère (par D0)
00000CEA 600C BRA @_IT34z
00000CEC BE3C0001 @_IT34B CMP.B #$01, D7
00000CF0 6606 BNE @_IT34z
00000CF2 4EB9000007F4 JSR @StrAcia ; Fct 01: Emission String (par A4-D4)
00000CF8 4E71 @_IT34Z NOP
00000CFA 4E73 RTE
00000CFC BE3C0000 @IT35 CMP.B #$00, D7 ; Trap #$03: Tempos
00000D00 6608 BNE @_IT35b
00000D02 4EB900000AD6 JSR @Tempo ; 1 x Tempo
00000D08 6012 BRA @_IT35z
00000D0A BE3C0001 @_IT35B CMP.B #$01, D7
00000D0E 660C BNE @_IT35z
00000D10 4EB900000AD6 JSR @Tempo ; 2 x Tempo
00000D16 4EB900000AD6 JSR @Tempo
00000D1C 4E71 @_IT35Z NOP
00000D1E 4E73 RTE
00000D20 BE3C0000 @IT36 CMP.B #$00, D7 ; Trap #$04: Conversions
00000D24 6606 BNE @_IT36z
00000D26 4EB900000A54 JSR @HexAsc ; Fct 00: Octet Hexa -> 3 digits Ascii
00000D2C 4E71 @_IT36Z NOP
00000D2E 4E73 RTE
00000D30 BE3C0000 @IT37 CMP.B #$00, D7 ; Trap #$05: Maths
00000D34 6608 BNE @_IT37b
00000D36 4EB900000A9A JSR @DivB ; Fct 00: Division à virgule sur Byte
00000D3C 600C BRA @_IT37z
00000D3E BE3C0001 @_IT37B CMP.B #$01, D7
00000D42 6606 BNE @_IT37z
00000D44 4EB900000AB4 JSR @AffDiv ; Fct 01: Affiche résultat division
00000D4A 4E71 @_IT37Z NOP
00000D4C 4E73 RTE
Fin de listing.
Voici donc le lien de téléchargement de Ed:
Voici donc Ed: