RAM EQU $0 ;RAM section VT EQU RAM STACK EQU RAM+$800 ;Stack section PGM EQU RAM+$C00 ;Program start ROM EQU $800000 ;ROM section QILR EQU $FFFC04 ;Interrupt Level Register + Interrupt Vector Register QSMCR EQU $FFFC00 ;QSM-Configuration Register ** 68332 global registerdefinitions *** SCCR0 EQU $FFFC08 ;SCI - Control Register 0 SCCR1 EQU $FFFC0A ;SCI - Control Register 1 SCSR EQU $FFFC0C ;SCI - Status - Register SCDR EQU $FFFC0E ;SCI - Daten - Register SIMCR EQU $FFFA00 ;SIM Configuration Register SYPCR EQU $FFFA20 ;System Protection Register CSBARBT EQU $FFFA48 ;Chip Select Base Address Boot Register CSBAR0 EQU $FFFA4C ;Chip Select Base Address Register 0 PEPAR EQU $FFFA16 ;Pin Assignment Register DDRE EQU $FFFA14 ;Data Direction Register PORTE EQU $FFFA12 ;Port E is decoded on 2 PFPAR EQU $FFFA1E ;Pin Assignment Register DDRF EQU $FFFA1C ;Data Direction Register PORTF EQU $FFFA1A ;Port F is decoded on 2 PICR EQU $FFFA22 ;PIT Control Register PITR EQU $FFFA24 ;PIT Timer Register SL EQU 1024 ;Stack length *** Init Presets ********************************************************* *** Place FEPROM at $800000, because unused * ORG CSBARBT ;set on CSBARBT DC.W $8003 ;at 8M, size 64KB *** Place ext. RAM at $0, 256KB, 0WS *** * ORG CSBAR0 ;Set on SIM CSs DC.W $0005 ;CSBAR0, ext. RAM_RD DC.W $6830 ;CSOR0 DC.W $0005 ;CSBAR1, ext. RAM_WR_LO DC.W $3030 ;CSOR1 DC.W $0005 ;CSBAR2, ext. RAM_WR_HI DC.W $5030 ;CSOR2 * Switch off watchdogs, also while FREEZE is active * ORG SIMCR DC.W $60CF ;FREEZE settings ORG SYPCR DC.W $0000 ;no system protection *** Define Stack *** * ORG STACK ;Stackarea starts at $800 ST DS.B SL ;Length is 1KByte * Program: *************************************************************** * ORG PGM ;Programcode at $C00 *** Initialize registers *** * Initialize stack pointer BLINK MOVE.L #ST+SL,A7 ;load Stack Pointer * Initial Program Counter is initialized by the corresponding DO-File * Initialize Port E MOVE.W #$0000,PEPAR ;I/O instead of systembus MOVE.W #$000F,DDRE ;4 bit as output * Initialize Port F MOVE.W #$0000,PFPAR ;I/O instead of systembus MOVE.W #$0000,DDRF ;all 8 bit as input *** Seriell Port Init *** MOVE.W #$0640,QILR ;Interruptlevel=6 wird gesetzt -> loest interrupt mit nr. aus:(Y0110), Interruptvektor=$40 (vectornumber 01000000) move.w #$84,QSMCR ;set supervisor mode & interrupt id; supervisormode wird gesetzt MOVE.W #$37,SCCR0 ;Baudrate 9600 MOVE.W #$2C,SCCR1 ;Transmitter, Receiver und Receiver Interrupt Enable aktiviert;ab hier wird obiger interruptlevel fuer receive ausgelöst * Interrupt - Einstellungen MOVE.L #Itp,VT+($40*4) ;schreibe adresse der interrupt routine auf adresse 100 der vector tabelle ;ab addresse 100 steht die addresse der interruptroutine ANDI.W #%1111100011111111,SR ;$F8FF Interruptmaske auf Prioritaet 5 setzen (alle darüber werden durchgelassen , in unserem falle 6) ORI.W #%0000010100000000,SR ;auf 5 setzen (oben wird gelöscht) *** main ** * move.w #$FE,d0 move.w #$FF,d1 move.w #0,d4 START MOVE.W D0,PORTE ;LED on BSR WAIT ;enjoy it MOVE.W D1,PORTE ;LED off CMP.W #1,D5 ;D5 gibt die richtung an 1 fuer rechts 0 fuer links BEQ roright ;goto rechts CMP.W #0,D5 BEQ roleft roleft ROL.B #1,D0 ;left BRA START roright ROR.B #1,D0 ;right BRA START WAIT move.w d2,-(a7) MOVE.w D4,D3 _w01 MOVE.w #$F000,D2 ;preset time _w02 DBRA D2,_w02 ;exceeded? DBRA D3,_w01 move.w (a7)+,d2 rts ************************************************************************** *Itp Itp btst.b #6,SCSR ;das "read bit" wird zurückgesetzt, ;damit der interrupt wieder ausgelöst werden kann move.l D0,-(A7) ;Retten der Datenregister move.b SCDR+1,d0 ;hole zeichen das den interrupt ausgeloest hat, um den vergleich zu machen cmp.b #'+',d0 beq schneller cmp.b #'-',d0 beq langsamer cmp.b #'l',d0 beq links cmp.b #'r',d0 bra rechts bra Itp_ende links move.w #0,d5 ;d5 ist vergleichsregister, für links oder rechts (s.o.) bra Itp_ende rechts move.w #1,d5 bra Itp_ende schneller cmp #3,d4 ;dient zum schleifen verkuerzen falls schon 3 dann geht nicht schneller das lauflicht wäre nicht mehr sichtbar(getestet) bcs Itp_ende sub.w #3,d4 ;ansonsten verkürze die aeussere schleife um 3 ; dann wird die wait schleife verkuerzt bra Itp_ende langsamer add.w #3,d4 ;die wait schleife wird nun verlängert, die aeussere schleife um 3 vergroessert bra Itp_ende Itp_ende move.l (A7)+,D0 ;Zurückschreiben der Register rte