*************************************** * Moniteur 68HC11 V1.3 * * Par: Sylvain Bissonnette * 8382 De Fougeray * Anjou, Que. * H1K 1K6 *************************************** *************************************** * Etiquette pour ACIA de communication *************************************** REGS: EQU $1000 BAUD: EQU $2B SCCR1: EQU $2C SCCR2: EQU $2D SCSR: EQU $2E SCDR: EQU $2F TMSK2: EQU $24 OPTION: EQU $39 *************************************** * Etiquette de la Ram du system *************************************** * Registre des pseudo vecteurs PSSCI: EQU $C1 PSSPI: EQU $C4 PSPAI: EQU $C7 PSPAO: EQU $CA PSTO: EQU $CD PSTOC5: EQU $D0 PSTOC4: EQU $D3 PSTOC3: EQU $D6 PSTOC2: EQU $D9 PSTOC1: EQU $DC PSTIC3: EQU $DF PSTIC2: EQU $E2 PSTIC1: EQU $E5 PSRTI: EQU $E8 PSIRQ: EQU $EB PSXIRQ: EQU $EE PSSWI: EQU $F1 PSIOT: EQU $F4 PSCOPF: EQU $F7 PSCOPC: EQU $FA PSRESET: EQU $FD * Registre de l'utilisateur REGCCR: EQU $B6 REGB: EQU $B7 REGA: EQU $B8 REGX: EQU $B9 REGY: EQU $BB REGPC: EQU $BD REGST: EQU $BF * Restart RESTART: EQU $A0 * Buffer getkey QIN: EQU $A1 * 2 BYTE BUFFER: EQU $A3 * 4 BYTE * Valeur du prescaler PRESCALE: EQU $A7 * 1 BYTE * Variable d'initialisation STARTUP: EQU $A8 * 1 BYTE * Stack STACK: EQU $0080 * MEMOIRE DU SYSTEM MEM: EQU $0000 *************************************** * Programme principal *************************************** ORG $E000 RESET: NOP NOP LDX #REGS BSET OPTION,X %00001000 * RESET ON STOP CLOCK LDAA STARTUP CMPA #%10101010 BNE RESET1 LDAA PRESCALE * SET LE PRESCALER AVEND 64xE ANDA #%00000011 LDX #REGS STAA TMSK2,X RESET1: SEI * Masque IRQ & FIRQ TPA ANDA #%01111111 * Permet les STOP TAP LDS #STACK * Initialisation du stack LDY #MEM LDAA #%10101010 STAA STARTUP LDAA #$00 STAA RESTART,Y * Met RESTART a $00 quand power on JSR INIVEC * Initialisation des pseudo vecteur JSR INISCI * Initialisation de l'acia de communication JSR SNDCRLF JSR MENU * Affiche le menu BOUCLE: JSR WAITCOM * Va attendre une commande BRA BOUCLE *************************************** * Attend une commande du terminal * et l'execute *************************************** WAITCOM: JSR INCAR CMPA #'S' * Download S1S9 BEQ GO1 CMPA #'G' * Execution de programme en ram BEQ GO2 CMPA #'R' * Reset du system BEQ GO3 CMPA #'M' * Menu des commandes BEQ GO4 CMPA #'C' * Continuer apres un SWI BEQ GO5 CMPA #'E' * Examein de memoire BEQ GO6 CMPA #'P' * Ajustement du prescaler BEQ GO7 RTS GO1: JSR S1S9 RTS GO2: JSR EXEC RTS GO3: JSR RESET RTS GO4: LDY #MEM LDAA #$00 STAA RESTART,Y JSR MENU RTS GO5: JSR SNDCRLF LDX #GOMSG1 JSR SNDMSG JSR SNDCRLF RTS GO6: JSR MEMEX RTS GO7: JSR PSCALE RTS GOMSG1: FCC '!! IMPOSIBLE DE CONTINUER IL N`Y A PAS EU DE SWI !!' FCB $04 *************************************** * Menu *************************************** MENU: JSR SNDCRLF LDX #MENUMSG * Affiche l'entete JSR SNDMSG LDY #MEM LDAA #%10101010 CMPA RESTART,Y BNE MENU2 RTS MENU2: LDX #MENUMSG2 JSR SNDMSG * Affiche le menu des commandes JSR SNDCRLF LDY #MEM LDAA #%10101010 STAA RESTART,Y RTS MENUMSG: FCC '****************************************' FCB $0D,$0A FCC '* MONITEUR POUR 68HC11 EVBU++ V1.3 *' FCB $0D,$0A FCC '* *' FCB $0D,$0A FCC '* Par: Sylvain Bissonnette *' FCB $0D,$0A FCC '****************************************' FCB $0D,$0A,$0A,$0A FCB $04 MENUMSG2: FCC 'G-> Execution de programme en RAM' FCB $0D,$0A FCC 'R-> Reset du system' FCB $0D,$0A FCC 'M-> Menu des commandes' FCB $0D,$0A FCC 'C-> Pour continuer apres un SWI' FCB $0D,$0A FCC 'E-> Examein de memoire' FCB $0D,$0A FCC 'P-> Ajustement du prescaler' FCB $0D,$0A,$04 *************************************** * Initialisation de l'acia de * communication * 9600 bps, 8 bit, pas de parity, 1 sb * * Reg aff: A,CCR *************************************** INISCI: LDX #REGS LDAA #$30 * 9600 BPS STAA BAUD,X LDAA #$00 * 8 BIT, NO WAKE UP, 1 STOP BIT STAA SCCR1,X LDAA #$0C * PAS INTERRUPT, TX ENABLE, RX ENABLE STAA SCCR2,X RTS *************************************** * Initialisation des pseudo vecteur *************************************** INIVEC: LDX #VECTAB LDY #PSSCI INIVEC2: LDA ,X INX CMPA #$04 BEQ INIVEC3 STA ,Y INY BRA INIVEC2 INIVEC3: RTS VECTAB: FCB $7E * SCI FDB SCI FCB $7E * SPI FDB SPI FCB $7E * PAI FDB PAI FCB $7E * PAO FDB PAO FCB $7E * TOV FDB TOV FCB $7E * TOC5 FDB TOC5 FCB $7E * TOC4 FDB TOC4 FCB $7E * TOC3 FDB TOC3 FCB $7E * TOC2 FDB TOC2 FCB $7E * TOC1 FDB TOC1 FCB $7E * TIC3 FDB TIC3 FCB $7E * TIC2 FDB TIC2 FCB $7E * TIC1 FDB TIC1 FCB $7E * RTI FDB RTI FCB $7E * IRQ FDB IRQ FCB $7E * XIRQ FDB XIRQ FCB $7E * SWI FDB SWII FCB $7E * IOT FDB IOTT FCB $7E * COPF FDB COPF FCB $7E * COPC FDB COPC FCB $7E * RESET FDB RESET FCB $04 *************************************** * Interuption de type SWI *************************************** SWI: TSX LDY #REGCCR SWI2: LDAA ,X INX STAA ,Y INY CMPY #REGST BNE SWI2 STX REGST JSR SWIRES SWI3: JSR SNDCRLF LDX #SWIMSG JSR SNDMSG JSR INCAR CMPA #'C' BNE SWI3 RTI SWIMSG: FCC 'APPUYER SUR C POUR CONTINUER' FCB $0D,$0A,$04 *************************************** * Interruption de type IOT *************************************** IOT: TSX LDY #REGCCR IOT2: LDAA ,X INX STAA ,Y INY CMPY #REGST BNE IOT2 STX REGST JSR SWIRES TSX * Ajustement de l'adresse de retour LDAB #$08 ABX LDAA ,X ADDA #$01 STAA ,X RTI ************** SWIRES: JSR SNDCRLF * TITRE LDX #SWMSG1 JSR SNDMSG JSR SNDCRLF LDX #SWMSG2 * REG A JSR SNDMSG LDAA REGA JSR OUT2HA LDX #SWMSG3 * REG B JSR SNDMSG LDAA REGB JSR OUT2HA LDX #SWMSG4 * REG X JSR SNDMSG LDX REGX JSR OUT4HX LDX #SWMSG5 * REG Y JSR SNDMSG LDX REGY JSR OUT4HX LDX #SWMSG6 * REG S JSR SNDMSG LDX REGST JSR OUT4HX LDX #SWMSG7 * REG PC JSR SNDMSG LDX REGPC JSR OUT4HX JSR SNDCRLF JSR SNDCRLF LDX #SWMSG8 * REG CC JSR SNDMSG JSR SNDCRLF LDX #SWMSG9 JSR SNDMSG LDAB REGCCR LDX #$0000 SWIRES1: LSLB BCS SWIRES2 LDAA #'0' BRA SWIRES3 SWIRES2: LDAA #'1' SWIRES3: JSR OUTCAR LDAA #' ' JSR OUTCAR INX CMPX #$08 BNE SWIRES1 JSR SNDCRLF JSR SNDCRLF LDX #SWMSG10 JSR SNDMSG TSX LDAB #$08 ABX JSR OUT4HX JSR SNDCRLF RTS SWMSG1: FCC ' ' FCC ' V A L E U R D E S' FCC ' R E G I S T R E S' FCB $0D,$0A FCC '-----------------------------' FCC '--------------------' FCC '--------------------' FCB $0D,$0A,$04 SWMSG2: FCC ' A=' FCB $04 SWMSG3: FCC ' B=' FCB $04 SWMSG4: FCC ' X=' FCB $04 SWMSG5: FCC ' Y=' FCB $04 SWMSG6: FCC ' S=' FCB $04 SWMSG7: FCC ' PC=' FCB $04 SWMSG8: FCC ' ' FCC ' ' FCC 'S X H I N Z V C' FCB $04 SWMSG9: FCC ' ' FCC ' ' FCB $04 SWMSG10: FCC ' ' FCC ' ' FCC 'STACK = ' FCB $04 *************************************** * Message d'interruption *************************************** SCI: LDX #SCIMSG BRA MESSINT SPI: LDX #SPIMSG BRA MESSINT PAI: LDX #PAIMSG BRA MESSINT PAO: LDX #PAOMSG BRA MESSINT TOV: LDX #TOVMSG BRA MESSINT TOC5: LDX #TOC5MSG BRA MESSINT TOC4: LDX #TOC4MSG BRA MESSINT TOC3: LDX #TOC3MSG BRA MESSINT TOC2: LDX #TOC2MSG BRA MESSINT TOC1: LDX #TOC1MSG BRA MESSINT TIC3: LDX #TIC3MSG BRA MESSINT TIC2: LDX #TIC2MSG BRA MESSINT TIC1: LDX #TIC1MSG BRA MESSINT RTI: LDX #RTIMSG BRA MESSINT IRQ: LDX #IRQMSG BRA MESSINT XIRQ: LDX #XIRQMSG BRA MESSINT SWII: LDX #SWIIMSG BRA MESSINT2 IOTT: LDX #IOTTMSG BRA MESSINT3 COPF: LDX #COPFMSG BRA MESSINT4 COPC: LDX #COPCMSG BRA MESSINT4 RES: LDX #RESMSG BRA MESSINT MESSINT: JSR SNDCRLF JSR SNDMSG JSR SNDCRLF RTI MESSINT2: JSR SNDCRLF JSR SNDMSG JSR SNDCRLF JMP SWI MESSINT3: JSR SNDCRLF JSR SNDMSG JSR SNDCRLF JMP IOT MESSINT4: JSR SNDCRLF JSR SNDMSG JSR SNDCRLF JMP RESET SCIMSG: FCC '!!! INTERRUPTION SCI !!!' FCB $04 SPIMSG: FCC '!!! INTERRUPTION SPI !!!' FCB $04 PAIMSG: FCC '!!! INTERRUPTION PAI !!!' FCB $04 PAOMSG: FCC '!!! INTERRUPTION PAO !!!' FCB $04 TOVMSG: FCC '!!! INTERRUPTION TO !!!' FCB $04 TOC5MSG: FCC '!!! INTERRUPTION TOC5 !!!' FCB $04 TOC4MSG: FCC '!!! INTERRUPTION TOC4 !!!' FCB $04 TOC3MSG: FCC '!!! INTERRUPTION TOC3 !!!' FCB $04 TOC2MSG: FCC '!!! INTERRUPTION TOC2 !!!' FCB $04 TOC1MSG: FCC '!!! INTERRUPTION TOC1 !!!' FCB $04 TIC3MSG: FCC '!!! INTERRUPTION TIC3 !!!' FCB $04 TIC2MSG: FCC '!!! INTERRUPTION TIC2 !!!' FCB $04 TIC1MSG: FCC '!!! INTERRUPTION TIC1 !!!' FCB $04 RTIMSG: FCC '!!! INTERRUPTION RTI !!!' FCB $04 IRQMSG: FCC '!!! INTERRUPTION IRQ !!!' FCB $04 XIRQMSG: FCC '!!! INTERRUPTION XIRQ !!!' FCB $04 SWIIMSG: FCC '!!! INTERRUPTION SWI !!!' FCB $04 IOTTMSG: FCC '!!! INTERRUPTION Illegal Opcode Trap !!!' FCB $04 COPFMSG: FCC '!!! INTERRUPTION COP Failure !!!' FCB $04 COPCMSG: FCC '!!! INTERRUPTION COP Clock Monitor Fail !!!' FCB $04 RESMSG: FCC '!!! INTERRUPTION RESET !!!' FCB $04 *************************************** * Examen de memoire *************************************** MEMEX: JSR SNDCRLF LDX #EXMSG1 JSR SNDMSG JSR GET4HX MEMEX2: JSR SNDCRLF JSR OUT4HX LDAA #':' JSR OUTCAR LDAA ,X JSR OUT2HA MEMEX3: JSR INCAR CMPA #'+' BEQ MEMEX4 CMPA #'-' BEQ MEMEX5 CMPA #'/' BEQ MEMEX6 CMPA #$0D BEQ MEMEX7 BRA MEMEX3 MEMEX4: INX BRA MEMEX2 MEMEX5: DEX BRA MEMEX2 MEMEX6: LDAA #' ' JSR OUTCAR LDAA #'/' JSR OUTCAR JSR GET2HA STAA ,X BRA MEMEX2 MEMEX7: JSR INCAR JSR MENU RTS EXMSG1: FCC ' EXAMEIN DE MEMOIRE' FCB $0D,$0A,$0D,$0A FCC '(+) ou (-) Pour avancer ou reculer en memoire' FCB $0D,$0A FCC '(/) Pour modifier le contenu de la memoire' FCB $0D,$0A FCC '(ENTER) Pour sortir de l`examen de memoire' FCB $0D,$0A FCC 'QUELLE ADRESSE:' FCB $04 *************************************** * Ajustement du prescaler *************************************** PSCALE: LDX #PSCALEM JSR SNDCRLF JSR SNDMSG JSR GET1HA STAA PRESCALE NOP STOP PSCALEM: FCC 'Pour diviser par x entrer' FCB $0D,$0A FCC ' 1 -> 0' FCB $0D,$0A FCC ' 4 -> 1' FCB $0D,$0A FCC ' 8 -> 2' FCB $0D,$0A FCC '16 -> 3' FCB $0D,$0A,$0D,$0A,$04 *************************************** * Envoie le contenu de A sur le port * seriel * * Reg aff:CCR *************************************** OUTCAR: PSHB PSHX LDX #REGS OUTCAR2: LDAB SCSR,X BITB #%10000000 BEQ OUTCAR2 STAA SCDR,X PULX PULB RTS *************************************** * Routine qui transmet la valeur de * A au terminal sous la forme ASCII. * * Reg aff:CCR *************************************** OUT2HA: PSHA PSHA LSRA LSRA LSRA LSRA JSR HEXASC *conversion JSR OUTCAR *transmet le MSB PULA ANDA #$0F JSR HEXASC *conversion JSR OUTCAR *transmet le LSB PULA RTS *************************************** * Routine qui transmet la valeur de B * au terminal sous la forme ASCII. * * Reg aff:CCR *************************************** OUT2HB: PSHA TBA JSR OUT2HA PULA RTS *************************************** * Routine qui transmet le nombre contenu * dans X au terminal sous la forme ASCII. * * Reg aff:CCR *************************************** OUT4HX: PSHA PSHB PSHX XGDX JSR OUT2HA TBA JSR OUT2HA PULX PULB PULA RTS *************************************** * Transmet un retour de chariot * * Reg aff: CCR *************************************** SNDCRLF: PSHA LDAA #$0D JSR OUTCAR LDAA #$0A JSR OUTCAR PULA RTS *************************************** * Envoie une chaine de caractere * sur le port serie. Fin avec $04 * * X= Adresse de la chaine * * Reg aff:A,X,CC *************************************** SNDMSG: LDAA ,X INX CMPA #$04 BEQ SNDMSG2 JSR OUTCAR BRA SNDMSG SNDMSG2: RTS *************************************** * LOOKCAR * * Lit le port serie, mais attend pas * la reception du caractere * * Z=1, pas de car. * Z=0, car. recu dans A * * Reg Aff: A,CCR *************************************** LOOKCAR: PSHB PSHX LDX #REGS LDAB SCSR,X BITB #%00100000 BEQ LOOKCAR1 LDAA SCDR,X PSHA TPA ANDA #%11111011 TAP PULA LOOKCAR1: PULX PULB RTS *************************************** * INCAR * * Lit le port serie, et attend un * caractere * * Reg Aff: A,CCR *************************************** INCAR: JSR LOOKCAR BEQ INCAR RTS *************************************** * Routine pour lire un chiffre * hexa --> LSB de acc.A * * Reg aff:A,CCR *************************************** IN1HA: JSR INCAR JSR ASCHEX RTS *************************************** * Routine pour lire un nombre * hexa --> acc.A * * Reg aff:A,CCR *************************************** IN2HA: PSHY JSR IN1HA ASLA ASLA ASLA ASLA PSHA JSR IN1HA TSY ORAA ,Y INS PULY RTS *************************************** * Routine qui attend du terminal * une nombre hexa. de 16 bits (4 touches) * Le nombre est place dans le reg.X * * Reg aff:X,CCR *************************************** IN4HX: PSHA PSHB JSR IN2HA PSHA JSR IN2HA TAB PULA XGDX PULB PULA RTS *************************************** * Routine pour lire un chiffre * hexadecimal provenant du terminal. * par.d'entree: acc.A = qte de car. * a recevoir. * maximum = 4 * par.de sortie:BUFFER contient * les car. recus *************************************** GETHEX: PSHX PSHY PSHB LDY #MEM LDX #BUFFER TAB ABX STX QIN,Y LDX #BUFFER *adr. du dernier car a recevoir. GETHEX0: JSR INCAR JSR MAJUS CMPA #$08 *BACKSPACE ? BNE GETHEX3 CPX #BUFFER BEQ GETHEX0 DEX JSR OUTCAR *echo du backspace BRA GETHEX0 GETHEX3: CMPA #$0D *RETURN ? BNE GETHEX4 CPX QIN,Y *teste si recu tous les car. BEQ GETHEX5 *oui, ok BRA GETHEX0 *non, attend les autres car. GETHEX4: CMPA #'0' *decode si le car. est hexa. BLO GETHEX0 CMPA #'F' BHI GETHEX0 CMPA #'9' BLS GETHEX1 CMPA #'A' BHS GETHEX1 BRA GETHEX0 *si pas hexa, recommence GETHEX1: CMPX QIN,Y *si tous les car. sont recus, BEQ GETHEX0 *attend la touche RETURN JSR OUTCAR *echo du car. SUBA #$30 *conversion de ASCII-->hexa CMPA #$09 BLS GETHEX2 SUBA #$07 *ajustement pour code de A a F GETHEX2: STAA ,X *sauve le chiffre dans le buffer INX BRA GETHEX0 *attend prochain car. GETHEX5: PULB PULY PULX RTS *************************************** * Routine pour lire un chiffre * hexa --> LSB de acc. A * * Reg Aff: A,CCR *************************************** GET1HA: LDAA #$01 JSR GETHEX LDAA BUFFER RTS *************************************** * Assemble 2 chiffres hexa dans le * buffer et les places dans A *************************************** ASS2HEX: PSHY LDAA ,X INX ASLA ASLA ASLA ASLA PSHA LDAA ,X INX TSY ORAA ,Y INS PULY RTS *************************************** * Routine pour lire un nombre hexa * --> acc. A * * Reg Aff: A,CCR *************************************** GET2HA: PSHX LDAA #$02 JSR GETHEX LDX #BUFFER JSR ASS2HEX PULX RTS *************************************** * Routine qui attend du terminal * un nombre hexa de 16 bits (4 touches) * le nombre est placer dans le reg. X * * Reg Aff: X,CCR **************************************** GET4HX: PSHA PSHB LDAA #$04 JSR GETHEX LDX #BUFFER JSR ASS2HEX PSHA JSR ASS2HEX PSHA PULB PULA XGDX PULB PULA RTS *************************************** * Convertion de ASCII->HEXA *************************************** ASCHEX: SUBA #$30 CMPA #$09 BLS ASCHEX2 SUBA #$07 ASCHEX2: RTS *************************************** * Routine de conversion HEXA-->ASCII *************************************** HEXASC: ADDA #$30 CMPA #'9' BLS HEXAS ADDA #7 HEXAS: RTS *************************************** * Conversion en majuscule *************************************** MAJUS: CMPA #'a' BLO MAJUS2 CMPA #'z' BHI MAJUS2 SUBA #$20 MAJUS2: TSTA RTS *************************************** * Transfert de fichier, format S1S9 *************************************** S1S9: JSR INCAR CMPA #'0' BEQ S1 CMPA #'1' BEQ S1 CMPA #'9' BEQ S9 RTS S1: JSR IN2HA TAB SUBB #$03 JSR IN4HX S1A: JSR IN2HA STAA ,X INX DECB BNE S1A JSR IN2HA RTS S9: JSR IN4HX JSR IN4HX RTS *************************************** * Execute un programme en ram *************************************** EXEC: JSR SNDCRLF LDX #EXECMSG JSR SNDMSG JSR GET4HX LDY #RESET PSHY PSHX RTS EXECMSG: FCC 'EXECUTE A QUELLE ADRESSE?:' FCB $04 *************************************** * Adresse des sous-routine *************************************** ORG $FF00 FDB OUTCAR * FF00 FDB OUT2HA * FF03 FDB OUT2HB * FF06 FDB OUT4HX * FF09 FDB LOOKCAR * FF0C FDB INCAR * FF0F FDB IN1HA * FF10 FDB IN2HA * FF13 FDB IN4HX * FF16 FDB GET1HA * FF19 FDB GET2HA * FF1C FDB GET4HX * FF1F FDB SNDCRLF * FF20 FDB SNDMSG * FF23 FDB RESET * FF26 FDB RESET * FF29 FDB RESET * FF2C FDB RESET * FF2F *************************************** * VECTEUR RESET *************************************** ORG $FFD6 * * FFC0 a FFD5 Reserve par 68hc11 FDB PSSCI * FFD6 FDB PSSPI * FFD8 FDB PSPAI * FFDA FDB PSPAO * FFDC FDB PSTO * FFDE FDB PSTOC5 * FFE0 FDB PSTOC4 * FFE2 FDB PSTOC3 * FFE4 FDB PSTOC2 * FFE6 FDB PSTOC1 * FFE8 FDB PSTIC3 * FFEA FDB PSTIC2 * FFEC FDB PSTIC1 * FFEE FDB PSRTI * FFF0 FDB PSIRQ * FFF2 FDB PSXIRQ * FFF4 FDB PSSWI * FFF6 FDB PSIOT * FFF8 FDB PSCOPF * FFFA FDB RESET * FFFC FDB RESET * FFFE