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.