Bios LIsa

Voici le Bios de la carte LIsa, tel qu'il est compilable par ED! .


Essai de Bios 68000 - SF96/97 - SOUS WINDOWS

;

; 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= 800 Bps)

; 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-

VECTEUR

SSP $00010FF0

RAM $00010000

ROM $00000400

CONST

OUT = $00020001 ; Out

LCD = $00030001 ; Ecran LCD - config -

LCDat= $00030003 ; Ecran LCD - caractŠres -

ORA = $00040001 ; PIA A

DDRA = $00040001

CRA = $00040003

ORB = $00040005 ; PIA B

DDRB = $00040005

CRB = $00040007

TCR13= $00060001 ; CR1-CR3 Timer MC6840, F=Clk 68000/10

TCR2 = $00060003 ; CR2 et SR Timer

Tmsb1= $00060005 ; MSB Timer 1

Tlsb1= $00060007 ; LSB Timer 1

Tmsb2= $00060009 ; MSB Timer 2

Tlsb2= $0006000B ; LSB Timer 2

Tmsb3= $0006000D ; MSB Timer 3

Tlsb3= $0006000F ; LSB Timer 3

Acia = $00050001 ; CR et SR ACIA MC6850

TdrRdr=$00050003 ; TDR et RDR ACIA

Pile = $00010E00 ; Pile de sauvegarde g‚n‚rale - en plus du stack -

Kb0 = $00010C00 ; Buffer r‚ception s‚rie clavier

KbDrv= $00010B30 ; Driver Clavier PC -> Ascii

Rx232= $00010A00 ; Pile r‚ception RS232

OrgUsr=$00010100

1200Bds = $14 ; (800KHz/(1200*16)-1)/2=$0014

2400Bds = $09 ; 2400 Bds x 16 = 38400 Hz => $0009

St232a = "12345678 ^" ; Chaines de l'auto test RS232

St232b = "ABCDEFGH ^"

St1 = "Autotest ^" ; ^ = $5E: End of String

St2 = " 68000 ^"

St3 = " Ready ^"

St4 = " RS 232 ^"

St5 = "1200 Bds ^"

St6 = "2400 Bds ^"

StHs = " HS ^"

StOk = "RS232 ok ^"

StUsr= " User ^"

StSys= " System ^"

StWait="Waiting! ^"

VAR

AdrPrg.L

KbDat.B ; Donn‚e re‡ue du clavier, sans d‚codage

NbBitKb.B ; Nb de bits re‡us du clavier

OkDat.B ; Flag donn‚e re‡ue du clavier valide

CarRdy.B ; et prˆte … ˆtre trait‚e

KbUp.B ; Flag pour traitement code Break clavier

Hi232.B ; Vitesse RS232

Lo232.B

UserPrg.B ; Flag de lancement programme utilisateur

MAIN

; Programme principal

JsR @Init ; Init Stack et Variables

Jsr @IniLCD ; Init LCD

JSR @MsgIni ; Msg d'init

JSR @IniOut ; Init Sorties

JSR @PiaB ; Init PIA B

JSR @PiaA ; Init PIA A

JSR @AutoOff ; Raz bouchon RS232

JSR @DipSw ; Lecture Switches config Pia A

JSR @IniPTM ; Init Timers

JSR @IniACIA ; Init ACIA

JSR @IniDrv ; Init Driver Keyb -> Ascii

ANDI #$F8FF, SR ; Autorise IT tous niveaux dans SR

JSR @Auto232 ; Lance l'autotest RS232

JSR @MsgUser ; User ou System suivant switch

JSR @MsgRdy ; Msg Ready ou Waiting

JSR @Tempo

JSR @BipBip

JSR @AkiUser ; Acquisition du SP utilisateur en RS232

@Loop JSR @AkiKb

JSR @GereKb

JSR @GereUser ; Lance le SP utilisateur au besoin

JMP @Loop

JMP @Init

@Init LEA Pile, A0 ; Init Pointeur Pile A0

LEA kb0, A1 ; Init Pointeur pile clavier PC/AT

LEA Rx232, A5 ; Init Pointeur pile r‚ception RS232

CLR.B OUT ; Clear OUT

CLR.B KbDat ; Clear KeyDat

CLR.B NbBitKb ; Clear Nbre de bit Kb lus

CLR.B OkDat

CLR.B CarRdy

CLR.B KbUp

CLR.W D4 ; Nbre de caractŠres Emis en RS232

CLR.W D5 ; Nbre de caractŠres Re‡us en RS232

CLR.B UserPrg ; Flag UserProg … g‚rer ou non

CLR.L AdrPrg ; Adresse du UserPrg en Ram

RTS

@GereUser MOVE.L D0, (A0)+ ; Lance le programme t‚l‚charg‚

MOVE.B UserPrg, D0 ; si on l'a demand‚ par le Switch 1

CMP.B #$FF, D0

BNE @GereU0

MOVE.L AdrPrg, A2

JSR (A2)

@GereU0 MOVE.L -(A0), D0

RTS

@IniOut MOVEQ #$55, D0 ; Init Sorties

MOVE.B D0, OUT

JSR @Tempo

NOT.B D0

MOVE.B D0, OUT

JSR @Tempo

RTS

@PiaB MOVE.L D0, (A0)+ ; Push D0

CLR.B CRB ; AccŠs DDRB

MOVEQ #$5F, D0 ; %0101.1111: Pb7 NC, Auto232 S, KbDat E,

MOVE.B D0, DDRB ; Buzzer S, E2CS S, E2DATA S, E2SK S, ITEN\ S

MOVEQ #$04, D0 ; AccŠs ORB, sans ITs

MOVE.B D0, CRB

CLR.B ORB ; ITEN\=0, Buzzer=0, Relais Autotest 232 off.

MOVE.L -(A0), D0 ; Pull D0

RTS

@PiaA MOVE.L D0, (A0)+ ; Push D0

CLR.B CRA ; AccŠs DDRA

CLR.B DDRA ; ORA en entr‚es, dip switches

MOVEQ #$05,D0 ; %0000.0101: IRQA par CA1, CA1\, masqu‚e CA2,

MOVE.B D0, CRA ; CA2 entr‚e\ et accŠs ORA

MOVE.L -(A0), D0 ; Pull D0

RTS

@IniPTM MOVE.L D0, (A0)+ ; Init Timers

MOVEQ #$01, D0 ; AccŠs CR1

MOVE.B D0, TCR2

CLR.B TCR13 ; Init tous Timers

CLR.B TCR2 ; AccŠs CR3

MOVEQ #$83, D0 ; Monostable 16 bits,

MOVE.B D0, TCR13 ; T div 8, pas d'IT, sortie masqu‚e

MOVEQ #$F4, D0 ; Chargement MSB

MOVE.B D0, Tmsb3 ; demi p‚riode 0,5s

MOVEQ #$23, D0 ; Chargement LSB et Start

MOVE.B D0, Tlsb3

JSR @Ini232 ; Init Timer2 RS232

MOVE.L -(A0), D0

RTS

@Ini232 MOVE.L D0, (A0)+ ; Init vitesse ACIA

MOVEQ #$82, D0 ; CR2: 16 bits, pas d'IT, sortie active

MOVE.B D0, TCR2

MOVE.B Hi232, D0 ; vitesse RS232 Hi

MOVE.B D0, Tmsb2

MOVE.B Lo232, D0 ; vitesse RS232 Lo

MOVE.B D0, Tlsb2

MOVE.L -(A0), D0

RTS

@Ptr232 CLR.W D5 ; R‚init pointeur r‚ception Acia

LEA Rx232, A5 ; Init pointeur r‚ception

RTS

@Auto232 JSR @AutoOn ; Ferme le relais Autotest RS232

JSR @Tempo ; Anti rebonds relais

MOVE.W #$0008, D4

LEA St232a, A4 ; Envoie '12345678' sur l'Acia

JSR @StrAcia

JSR @Tempo ; Attend

CMP.W D4, D5 ; et regarde Re‡us=Emis par IT R‚ception Acia

BEQ @Auto2a

JMP @Hs232 ; Si non, Msg RS232 HS

@Auto2a JSR @Ptr232

MOVE.W #$0008,D4

LEA St232b, A4 ; et envoie 'ABCDEFGH'

JSR @StrAcia

JSR @Tempo

CMP.W D4, D5 ; Idem.

BEQ @Auto2b

JMP @Hs232

@Auto2b JSR @Ptr232

JSR @Ok232 ; Qd test fini, l'affiche

JSR @AutoOff ; et ouvre le relais.

RTS

@Ok232 LEA StOk, A2 ; Affiche la chaine 'RS232 OK'

JSR @Lg2Lcd

JSR @StrLcd

JSR @Tempo

JSR @Tempo

JSR @Tempo

RTS

@MsgUser MOVE.L D0, (A0)+ ; En autotest, affiche ‚tat Switch User

MOVE.B UserPrg, D0

CMP.B #$FF, D0

BEQ @MsgUs0

LEA StSys, A2

BRA @MsgUs1

@MsgUs0 LEA StUsr, A2

@MsgUs1 JSR @Lg2Lcd

JSR @StrLcd

JSR @Tempo

JSR @Tempo

JSR @Tempo

MOVE.L -(A0), D0

RTS

@AkiUser MOVE.L D0, (A0)+ ; T‚l‚chargement du programme User

MOVE.L D1, (A0)+

MOVE.B UserPrg, D0

CMP.B #$FF, D0

BNE @AkiU0

LEA Rx232, A2

@AkiU1 CMP.W #$0002, D5

BNE @AkiU1

MOVE.W (A2)+, D1

@AkiU2 CMP.W #$0006, D5

BNE @AkiU2

MOVE.L (A2)+, D0

MOVE.L D0, AdrPrg

ANDI #$FFFF, SR

LEA OrgUsr, A5

ANDI #$F8FF,SR

@AkiU3 CMP.W D1, D5

BNE @AkiU3

@AkiU0 MOVE.L -(A0), D1

MOVE.L -(A0), D0

RTS

@Hs232 JSR @ClrLcd ; Affiche 'RS232 HS'

LEA St4, A2 ; et se met en boucle.

JSR @StrLcd

JSR @Lg2Lcd

LEA StHs, A2

JSR @StrLcd

JSR @Tempo

JSR @Tempo

JSR @BipBip

BRA @Hs232

@AutoOn MOVE.L D0, (A0)+ ; Relais Autotest RS232 On

MOVE.B ORB, D0

ORI.B #$40, D0

MOVE.B D0, ORB

MOVE.L -(A0), D0

RTS

@AutoOff MOVE.L D0,(A0)+ ; Relais Autotest RS232 Off

MOVE.B ORB, D0

ANDI.B #$BF, D0

MOVE.B D0, ORB

MOVE.L -(A0), D0

RTS

@BusyOn MOVE.L D0, (A0)+ ; Active Led Busy du timer

CLR.B TCR2 ; AccŠs CR3

MOVEQ #$83, D0 ; Monostable 16 bits,

MOVE.B D0, TCR13 ; T div 8, pas d'IT, sortie active

MOVE.L -(A0), D0

RTS

@BusyOf MOVE.L D0, (A0)+ ; D‚sactive Led Busy du Timer

CLR.B TCR2 ; AccŠs CR3

MOVEQ #$03, D0 ; Monostable 16 bits,

MOVE.B D0, TCR13 ; T div 8, pas d'IT, sortie masqu‚e

MOVE.L -(A0), D0

RTS

@IniAcia MOVE.L D0, (A0)+ ; Init ACIA

MOVE.B #$03, D0 ; Master Reset

MOVE.B D0, Acia

MOVE.B #$95, D0 ; IT R‚ception, pas d'IT ‚mission,

MOVE.B D0, Acia ; 8 bits - pas de parit‚ - 1 Stop, Clk 1/16

MOVE.L -(A0), D0

RTS

@WrAcia MOVE.L D1, (A0)+ ; Emission du caractŠre de D0 sur ACIA

@WrAci1 MOVE.B Acia, D1 ; Lecture SR Acia

BTST #$01, D1 ; Test de TDRE (SR1)

BEQ @WrAci1 ; Si TDRE=0, TDR pas vide, on boucle.

MOVE.B D0, TdrRdr

MOVE.L -(A0), D1

RTS

@StrAcia MOVE.L D0, (A0)+ ; Ecrit la chaine point‚e par A4 sur ACIA

MOVE.L D1, (A0)+ ; Le nbre … envoyer est dans D4.W

CLR.W D1

@StrAc1 MOVE.B (A4)+, D0 ; Envoie le caractŠre en cours … @WrAcia

JSR @WrAcia

ADD.W #$0001, D1 ; Incr‚mente le nb ‚mis

CMP.W D1, D4 ; et regarde si tout a ‚t‚ envoy‚.

BNE @StrAc1 ; Si non, on reboucle

MOVE.L -(A0), D1

MOVE.L -(A0), D0

RTS

@DipSw MOVE.L D0, (A0)+ ; Lit l'‚tat des Dip-Switches

MOVE.L D1, (A0)+

MOVE.B ORA, D0

NOT.B D0 ; Entr‚es compl‚ment‚es

MOVE.B D0, OUT ; Affichage config sur Out.

BTST #$00, D0 ; Test Dip nø0: vitesse RS232

BNE @DipSw1 ; Si <> On, 1200 bds.

LEA St5, A2

MOVE.B #1200Bds, D1 ; 1200 Bds

BRA @DipSw2

@DipSw1 MOVE.B #2400Bds, D1 ; ou 2400 Bds

LEA St6, A2

@DipSw2 CLR.B Hi232

MOVE.B D1, Lo232

JSR @Lg2Lcd

JSR @StrLcd

BTST #$01, D0 ; Test Dip nø1: Lancement UserPrg

BEQ @DipSw3 ; Si <> On, pas de lancement UserPrg

MOVEQ #$FF, D1

MOVE.B D1, UserPrg ; Sinon, positionne flag User

@DipSw3 MOVE.L -(A0), D1

MOVE.L -(A0), D0

RTS

@IniDrv LEA KbDrv, A3 ; A3: Pointeur Driver Keyb -> Ascii

MOVE.L #$7069727A, (A3)+ ; 0123

MOVE.L #$6B73746C, (A3)+ ; 4567

MOVE.L #$757D4941, (A3)+ ; 89:;

MOVE.L #$6155613A, (A3)+ ; <=>?

MOVE.L #$45153221, (A3)+ ; @ABC

MOVE.L #$23242B34, (A3)+ ; DEFG

MOVE.L #$33433B42, (A3)+ ; HIJK

MOVE.L #$4B4C3144, (A3)+ ; LMNO

MOVE.L #$4D1C2D1B, (A3)+ ; PQRS

MOVE.L #$2C3C2A1A, (A3)+ ; TUVW

MOVE.L #$22351D2E, (A3)+ ; XYZ[

MOVE.B #$00, (A3)+ ; 00 -> Fin de la table

RTS

@MsgIni LEA St1, A2 ; Msg "Autotest 68000"

JSR @StrLcd

JSR @Lg2Lcd

LEA St2, A2

JSR @StrLcd

JSR @Tempo

RTS

@MsgRdy MOVE.L D0, (A0)+ ; Msg "68000 Ready" ou "68000 Waiting!"

JSR @ClrLCD

LEA St2, A2

JSR @StrLcd

JSR @Lg2Lcd

MOVE.B UserPrg, D0

CMP.B #$FF, D0

BNE @MsgRd0

LEA StWait, A2

BRA @MsgRd1

@MsgRd0 LEA St3, A2

@MsgRd1 JSR @StrLcd

MOVE.L -(A0), D0

RTS

@BuzOn MOVE.L D0, (A0)+ ; Buzzer On

MOVE.B ORB, D0

ORI.B #$10, D0

MOVE.B D0, ORB

MOVE.L -(A0), D0

RTS

@BuzOff MOVE.L D0,(A0)+ ; Buzzer Off

MOVE.B ORB, D0

ANDI.B #$EF, D0

MOVE.B D0, ORB

MOVE.L -(A0), D0

RTS

@BipBip JSR @BuzOn ; Bip-bip

JSR @Tempo

JSR @BuzOff

JSR @Tempo

JSR @BuzOn

JSR @Tempo

JSR @BuzOff

RTS

@IniLCD MOVE.L D0,(A0)+ ; Init LCD

MOVEQ #$38, D0 ; 2 lignes, 5x7 dots, 8 bits

MOVE.B D0, LCD

JSR @WaiLcd ; Tempo reset LCD

JSR @CursOf ; Curseur Off

JSR @ClrLCD ; Efface ‚cran

MOVE.L -(A0), D0

RTS

@CursOn MOVE.L D0, (A0)+ ; Display On, Curseur on, not Blink

MOVEQ #$0E, D0

MOVE.B D0, LCD

JSR @WaiLCD

MOVE.L -(A0), D0

RTS

@CursOf MOVE.L D0, (A0)+ ; Display On, Curseur off, not Blink

MOVEQ #$0C, D0

MOVE.B D0, LCD

JSR @WaiLCD

MOVE.L -(A0), D0

RTS

@ClrLCD MOVE.L D0, (A0)+ ; Efface l'‚cran LCD

MOVEQ #$01, D0 ; Clear screen

MOVE.B D0, LCD

JSR @WaiLCD

MOVEQ #$02, D0 ; Return Home

MOVE.B D0, LCD

JSR @WaiLCD

MOVE.L -(A0), D0

RTS

@WaiLcd MOVE.L D0, (A0)+ ; Tempo d'init du LCD

MOVE.L #$00004FFF, D0

@WaiLc1 DBF D0, @WaiLc1

MOVE.L -(A0), D0

RTS

@CarLcd MOVE.L D1, (A0)+ ; Ecrit le caractŠre de (D0) sur le LCD

@CarLc1 MOVE.B LCD, D1

ANDI.B #$80, D1

BNE @CarLc1 ; Attente Busy Flag= 0

MOVE.B D0, LCDat

MOVE.L -(A0), D1

RTS

@StrLcd MOVE.L D0, (A0)+ ; Ecrit la chaine point‚e par A2 sur LCD

@StrLc2 MOVE.B (A2)+, D0 ; Envoie le caractŠre en cours … @CarLcd

CMP.B #$5E, D0 ; tant qu'on ne pointe pas sur ^: EoString.

BEQ @StrLc1

JSR @CarLcd

BRA @StrLc2

@StrLc1 MOVE.L -(A0), D0

RTS

@Lg1Lcd MOVE.L D0, (A0)+ ; Lcd: Ligne 1

JSR @WaiLCD

MOVE.B #$80, D0

MOVE.B D0, LCD

JSR @WaiLCD

MOVE.L -(A0), D0

RTS

@Lg2Lcd MOVE.L D0, (A0)+ ; Lcd: Ligne 2

JSR @WaiLCD

MOVE.B #$C0, D0

MOVE.B D0, LCD

JSR @WaiLCD

MOVE.L -(A0), D0

RTS

@HexAsc CLR.L D0 ; Octet Hexa -> Ascii D‚cimal 3 digits

DIVU #$000A, D1 ; Ex: $84 => $31 $33 $32 (132)

MOVE.W D1, D0

DIVU #$000A, D0

OR.L #$00300000, D1 ; D1.L_low : X-- High

SWAP D1 ; D0.L_high: -X- Medium

OR.L #$00300030, D0 ; D0.L_low : --X Low

RTS

@AffHex JSR @HexAsc ; Affiche l'Hexa contenu dans D1 en Ascii

CMP.B #$30, D0 ; Le r‚sultat dans D0 est affich‚

BEQ @AffHe1 ; Les 0 de gauche ne sont pas affich‚s

JSR @CarLcd ; Ex: 008 => 8

@AffHe1 SWAP D0

CMP.B #$30, D0

BEQ @AffHe2

JSR @CarLcd

@AffHe2 EXG D1, D0

JSR @CarLcd

RTS

@DivB CLR.L D2 ; Division … virgule de D1.b/D0.b

DIVU D0, D1 ; r‚sultat dans D2.L: High: d‚cimale

SWAP D1 ; Low : entier

MOVE.L D1, D2

SWAP D1

CLR.W D1

SWAP D1

MULU #$0A, D1

DIVU D0, D1

MOVE.W D1, D2

SWAP D2

RTS

@AffDiv CLR.L D1 ; Affiche le r‚sultat de la division

MOVE.B D2, D1 ; dont le r‚sultat est dans D2

JSR @AffHex

MOVE.B #$05, D7

MOVE.B #$2C, D0 ; ","

TRAP #$00

SWAP D2

CLR.L D1

MOVE.B D2, D1

JSR @AffHex

RTS

@Tempo MOVE.L D0, (A0)+ ; Tempo g‚n‚rale

MOVE.L #$0000FFFF, D0

@T1 DBF D0, @T1

MOVE.L -(A0), D0

RTS

@GereKb MOVE.L D0, (A0)+ ; D‚codage des touches du clavier PC/AT

MOVE.B CarRdy, D0

BEQ @GereK1 ; Regarde d'abord si touche non-ascii

MOVE.B KbUp, D0 ; Regarde si code break recu precedement

BEQ @GereK5

CLR.B KbUp

BRA @GereK2 ; Si oui, on sort

@GereK5 JSR @KbFonc

MOVE.B KbDat, D0 ; On avait un non-Ascii, on sort

BEQ @GereK2

CMP.B #$F0, D0 ; Code Break, touche relach‚e

BNE @GereK4

MOVE.B #$FF, D0 ; donc pose flag

MOVE.B D0, KbUp

BRA @GereK2 ; et sort.

@GereK4 LEA KbDrv, A3 ; Charge pointeur Driver Ascii

@GereK3 MOVE.B (A3)+, D1

BEQ @GereK2

CMP.B D1, D0

BNE @GereK3

MOVE.W A3, D0 ; Pointeur-1 = Code Ascii

SUB.B #$01, D0

JSR @CarLcd ; pour affichage

@GereK2 CLR.B NbBitKb ; Clear Nbre de bit Kb lus

CLR.B OkDat

CLR.B CarRdy

@GereK1 MOVE.L -(A0), D0

RTS

@KbFonc MOVE.L D0, (A0)+ ; Gestion des non-Ascii

MOVE.B KbDat, D0

CMP.B #$76, D0 ; * Escape ?

BNE @KbFon1

JSR @ClrLCD ; -> Clear LCD

CLR.B KbDat ; Traitement effectu‚ pour GereKb

BRA @KbFon0

@KbFon1 CMP.B #$5A, D0 ; * Enter ?

BNE @KbFon2

JSR @Lg2Lcd ; -> Curseur en ligne 2

CLR.B KbDat ; Traitement effectu‚ pour GereKb

BRA @KbFon0

@KbFon2 CMP.B #$05, D0 ; * F1 ?

BNE @KbFon0

CLR.B KbDat ; Traitement effectu‚ pour GereKb

@KbFon0 MOVE.L -(A0), D0

RTS

@AkiKb MOVE.L D0, (A0)+ ; D‚s‚rialisation clavier

MOVE.L D1, (A0)+

MOVE.L D2, (A0)+

MOVE.B OkDat, D0 ; Si r‚ception pas finie, on sort.

BEQ @AkiK0

ANDI #$FFFF, SR ; Interdit les IT

CLR.B KbDat

LEA kb0, A1 ; Charge buffer r‚ception clavier

MOVE.B (A1)+, D0

CLR.B D1

@AkiK1 MOVE.B (A1)+, D0

ANDI.B #$20, D0 ; Isole le bit re‡u dans l'octet

ROL.B #$02, D0 ; et le met en b7

MOVE.B KbDat, D2

ROR.B #$01, D2 ; Rol du traitement pr‚c‚dent

MOVE.B D2, KbDat

OR.B D0, KbDat ; pour y ins‚rer le bit en cours

ADDI.B #$01, D1

CMP.B #$08, D1 ; Si on n'a pas trait‚ les 8 bits, continue.

BNE @AkiK1

LEA kb0, A1 ; Qd fini, init du pointeur buffer pour IT

MOVEQ #$FF, D0

MOVE.B D0, CarRdy ; Flag traitement Ok.

@AkiK3 ANDI #$F8FF, SR

@AkiK0 MOVE.L -(A0), D2

MOVE.L -(A0), D1

MOVE.L -(A0), D0

RTS

@IT31 MOVE.L D0, (A0)+ ; IT Clavier PC/AT

MOVE.B OkDat, D0

BNE @_IT31a

MOVE.B ORB, D0

MOVE.B D0, (A1)+

ADDI.B #$01, NbBitKb

CMPI.B #$09, NbBitKb

BNE @_IT31a

MOVEQ #$FF, D0

MOVE.B D0, OkDat

@_IT31a MOVE.B ORA, D0 ; Raz IT Pia

MOVE.L -(A0), D0

RTE

@IT29 MOVE.L D0, (A0)+ ; IT R‚ception ACIA

MOVE.B TdrRdr, D0 ; Charge le caractŠre re‡u

MOVE.B D0, (A5)+ ; et l'empile.

ADD.W #$0001, D5 ; Incr‚mente le compteur R‚ception

MOVE.B Acia, D0 ; Lecture du SR Acia pour Raz Rdrf

MOVE.L -(A0), D0

RTE

@IT32 CMP.B #$00, D7 ; Trap #$00: Gestion LCD

BNE @_IT32a

JSR @ClrLcd ; Fct 00: ClrLcd

BRA @_IT32z

@_IT32a CMP.B #$01, D7

BNE @_IT32b

JSR @Lg1Lcd ; Fct 01: Ligne 1 Lcd

BRA @_IT32z

@_IT32b CMP.B #$02, D7

BNE @_IT32c

JSR @Lg2Lcd ; Fct 02: Ligne 2 Lcd

BRA @_IT32z

@_IT32c CMP.B #$03, D7

BNE @_IT32d

JSR @CursOn ; Fct 03: Curseur On

BRA @_IT32z

@_IT32d CMP.B #$04, D7

BNE @_IT32e

JSR @CursOf ; Fct 04: Curseur Off

BRA @_IT32z

@_IT32e CMP.B #$05, D7

BNE @_IT32f

JSR @CarLcd ; Fct 05: Ecriture CaractŠre Lcd (par D0)

BRA @_IT32z

@_IT32f CMP.B #$06, D7

BNE @_IT32g

JSR @StrLcd ; Fct 06: Ecriture String Lcd (par A2)

BRA @_IT32z

@_IT32g CMP.B #$07, D7

BNE @_IT32z

JSR @AffHex ; Fct 07: Affiche un Hexa.b converti en Ascii

@_IT32z NOP

RTE

@IT33 CMP.B #$00, D7 ; Trap #$01: Gestion Buzzer

BNE @_IT33b

JSR @BuzOn ; Fct 00: Buzzer On

BRA @_IT33z

@_IT33b CMP.B #$01, D7

BNE @_IT33c

JSR @BuzOff ; Fct 01: Buzzer Off

BRA @_IT33z

@_IT33c CMP.B #$02, D7

BNE @_IT33z

JSR @BipBip ; Fct 02: Bip-Bip

@_IT33z NOP

RTE

@IT34 CMP.B #$00, D7 ; Trap #$02: Gestion Acia

BNE @_IT34b

JSR @WrAcia ; Fct 00: Emission CaractŠre (par D0)

BRA @_IT34z

@_IT34b CMP.B #$01, D7

BNE @_IT34z

JSR @StrAcia ; Fct 01: Emission String (par A4-D4)

@_IT34z NOP

RTE

@IT35 CMP.B #$00, D7 ; Trap #$03: Tempos

BNE @_IT35b

JSR @Tempo ; 1 x Tempo

BRA @_IT35z

@_IT35b CMP.B #$01, D7

BNE @_IT35z

JSR @Tempo ; 2 x Tempo

JSR @Tempo

@_IT35z NOP

RTE

@IT36 CMP.B #$00, D7 ; Trap #$04: Conversions

BNE @_IT36z

JSR @HexAsc ; Fct 00: Octet Hexa -> 3 digits Ascii

@_IT36z NOP

RTE

@IT37 CMP.B #$00, D7 ; Trap #$05: Maths

BNE @_IT37b

JSR @DivB ; Fct 00: Division … virgule sur Byte

BRA @_IT37z

@_IT37b CMP.B #$01, D7

BNE @_IT37z

JSR @AffDiv ; Fct 01: Affiche r‚sultat division

@_IT37z NOP

RTE


Le code étant relativement bien commenté, je le laisserai tel quel pour l'instant.

La particularité est que les Trap sont utilisée pour avoir un fonctionnement comparable aux INT du Bios PC ou Dos, à savoir que l'on fait appel à un Trap en lui mettant des paramètres en entrée pour effectuer des opérations de bas niveau.