1.概要 ------------------------------------------------------------------ 1
2.ソースリスト
2.1 エントリ・プログラム (c_entry.s) -------------------------------- 2
2.2 メイン関数 (itp_main.c) ----------------------------------------- 4
2.3 初期診断メイン・プログラム (itp.c) ------------------------------ 5
2.4 I/Oアドレス定義ファイル (def.h) ------------------------------ 13
2.5 初期診断プログラム用シンボル定義ファイル (itp_def.h) ------------ 16
2.6 I/O操作用関数群 (io.c) --------------------------------------- 17
3.メイク・ファイル (itp.mak) -------------------------------------------- 19
4.コマンド・ファイル (itp.cmd) ------------------------------------------ 20
「初期診断プログラムのソースリスト」は、初期診断プログラムを構成するすべてのソースリスト、及び実行形式ファイル作成に必要なメイク・ファイル,コマンド・ファイルを収録する。
*********************************************************************************** * * * Department of Electronics & Control Engineering N.C.T. * * ------------------------------------------------------------------------------- * * c_entry.s -- C Start-up Routine (for all C programs) * * * *********************************************************************************** OPT CASE ENTRY IDNT SECTION code,,C XDEF ENTRY XREF ????STACKTOP XREF __initcopy * Initialize variables copy () XREF _main * C's main() DC.L ????STACKTOP * SSP on Cold Start DC.L $0F00008 * Entry Point ENTRY: MOVEA.L #????STACKTOP,SP * Stack Pointer MOVEA.L #0,A6 * Frame Pointer Initialization MOVE #$2700,SR * Disable interrupt * * THE FOLLOWING CODE CLEARS THE ZEROVARS SECTION * * from /mirs/sawa/demo68k/entry.s * LEA .STARTOF.(zerovars),A0 * START OF THE SECTION MOVE.L #.SIZEOF.(zerovars),D1 * LENGTH OF THE SECTION MOVE.L D1,D0 * SAVE IN D0 ALSO LSR.L #2,D1 * NUMBER OF LONG WORDS TO MOVE BRA.S CLROVARS1 * SKIP FIRST CLEAR CLROVARS: CLR.L (A0)+ * CLEAR THE ADDRESS CLROVARS1: DBF D1,CLROVARS * DECREMENT LONG WORD COUNT & TEST SUBI.L #$10000,D1 * SIMULATE BORROW FROM LOW 16 BITS CMPI.L #-1,D1 * IS LONG WORD COUNT == -1 BNE.S CLROVARS * NO -- KEEP CLEARING * ANDI.L #3,D0 * SHOULD INDIVIDUAL BYTES BE CLEAR BRA.S CLROVARS2 * SKIP FIRST CLEAR CLROVARS3: CLR.B (A0)+ * CLEAR ONE MORE BYTE CLROVARS2: DBF D0,CLROVARS3 * DECREMENT BYTE COUNT & TEST JSR __initcopy(PC) * ROM INITIALIZATION JSR _main * Call main() LSTOP: STOP #$2700 * Halt until Level 7 Interrupt BRA.S LSTOP RTS * * end of SECTION code * SECTION zerovars,,D * DATA SECTION * * FORCE SECTION vars TO FOLLOW SECTIONS code AND zerovars IN * MEMORY. THIS IS DONE EVEN THOUGH THERE IS NO CODE IN * SECTION vars. * SECTION vars,,D * INITIALIZED DATA END ENTRY
/***********************************************************************************/ /* */ /* Department of Electronics & Control Engineering N.C.T. */ /* ------------------------------------------------------------------------------- */ /* itp_main.c -- MIRS main program ("itp_main.c" is temporary) */ /* */ /***********************************************************************************/ #include "def.h" extern void itp(); extern int outportb(); int led[LED_NO]; /* buffer for 7seg.LED */ int green,red; /* data for GREEN/RED LED */ main() { itp(); /* call ITP */ while(1); } /* timer interrupt routine */ void interrupt tmint() { outportb(MSR,TMRST); /* timer reset */ } /* switch interrupt routine */ void interrupt swint() { outportb(PSR0,0x08); /* clear H4S */ } /* touch sensor interrupt routine */ void interrupt tsint() { } /* supersonic wave sensor interrupt routine */ void interrupt sssint() { } void interrupt psint() /* photo sensor interrupt routine */ { }
/***********************************************************************************/ /* */ /* Department of Electronics & Control Engineering N.C.T. */ /* ------------------------------------------------------------------------------- */ /* itp.c -- ITP program (including system initialize) */ /* */ /***********************************************************************************/ #include "def.h" #include "itp_def.h" extern int inportb(),outportb(),outportl(); int cpu(),rom(),ram(),ram_chk(),mmi(),re_ts(),pwm(),sss_ps(); void itp(); void rtc_clr(); void tm_init(),led_init()mmi_init(),re_ts_init(),pwm_init(),sss_ps_init(); void led_set(),led_set_all(); extern int led[LED_NO]; /* buffer for 7seg.LED */ extern int green,red; /* data for GREEN/RED LED */ char d0,d1,d2,d3,d4,d5,d6,d7; /* data for CPU test */ void itp() { rtc_clr(); /* clear RTC */ led_init(); /* initialize 7seg.LED */ if ( cpu() != 0 ) while(1); if ( rom() != 0 ) while(1); if ( ram() != 0 ) while(1); if ( mmi() != 0 ) while(1); if ( re_ts() != 0 ) while(1); if ( pwm() != 0 ) while(1); if ( sss_ps() != 0 ) while(1); tm_init(); /* initialize timer */ led_set_all(0); } /* CPU test */ int cpu() { led_set_all(1); d0 = d1 = d2 = d3 = d4 = d5 = d6 = d7 = 1; asm(" EOR D0,D0 "); asm(" MOVE.B D0,_d0 "); asm(" EOR D1,D1 "); asm(" MOVE.B D1,_d1 "); asm(" EOR D2,D2 "); asm(" MOVE.B D2,_d2 "); asm(" EOR D3,D3 "); asm(" MOVE.B D3,_d3 "); asm(" EOR D4,D4 "); asm(" MOVE.B D4,_d4 "); asm(" EOR D5,D5 "); asm(" MOVE.B D5,_d5 "); asm(" EOR D6,D6 "); asm(" MOVE.B D6,_d6 "); asm(" EOR D7,D7 "); asm(" MOVE.B D7,_d7 "); if ( (d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7) != 0 ) return (1); return (0); } /* ROM test */ int rom() { unsigned char *p; unsigned int sum_e,sum_o; unsigned int chk_sum_e,chk_sum_o; long int ctr; green = 1; led_set_all(2); p = (unsigned char *)ROM_START; sum_e = sum_o = 0; for ( ctr = 0 ; ctr < ROM_SIZE ; ctr++ ) { /* seek check_sum */ sum_e += (unsigned int)*p; sum_e &= 0xffff; p++; sum_o += (unsigned int)*p; sum_o &= 0xffff; p++; } p = (unsigned char *)CHK_SUM_E; chk_sum_e = (unsigned int)(*p*0x100+*(p+1)); p = (unsigned char *)CHK_SUM_O; chk_sum_o = (unsigned int)(*p*0x100+*(p+1)); green = 0; led_set_all(2); if ( sum_e != chk_sum_e ) return(1); if ( sum_o != chk_sum_o ) return(1); return (0); } /* RAM test */ int ram() { red = 1; led_set_all(3); if ( ram_chk(STACKTOP,RAM_END) != 0 ) { red = 0; led_set(3); return (1); } red = 0; led_set_all(3); return (0); } int ram_chk( start_adrs, end_adrs ) char *start_adrs,*end_adrs; { char *p; int flag; flag = 0; p = start_adrs; while ( flag == 0 && p < end_adrs ) { *p = 0x00; /* clear RAM with 0x00 */ if ( *p != 0x00 ) flag = 1; *p = 0xff; /* fill RAM with 0xff */ if ( *p != 0xff ) flag = 1; p++; } return (flag); } /* Man-Machine board test */ int mmi() { int judge; led_set_all(4); mmi_init(); /* port return test */ outportb(PBDR0,0x00); if ( inportb(PBDR0) & 0x20 != 0x00 ) return (1); outportb(PBDR0,0x10); if ( inportb(PBDR0) & 0x20 != 0x20 ) return (1); /* judgement signal check */ judge = inportb(PBDR0) & 0x40; if ( judge != 0x00 ) return (1); return (0); } /* routary encoder & touch sensor board test */ int re_ts() { int data_r,data_l,data_rh,data_rl,data_lh,data_ll,ts_data; led_set_all(5); re_ts_init(); /* counter value check */ data_rl = inportb(EDRL) & 0xff; data_rh = inportb(EDRH) & 0x0f; data_ll = inportb(EDLL) & 0xff; data_lh = inportb(EDLH) & 0x0f; data_r = ( data_rh << 8 ) + data_rl; if ((data_r & 0x800) != 0) data_r = (data_r | 0xfffff000); data_l = ( data_lh << 8 ) + data_ll; if ((data_l & 0x800) != 0) data_l = (data_l | 0xfffff000); if ( data_r != 0x000 ) return (1); if ( data_l != 0x000 ) return (1); /* touch sensor data check */ ts_data = inportb(EDRH) & 0xf0; if ( ts_data != 0x00 ) return (1); return (0); } /* PWM circuit test */ int pwm() { int ret_data; led_set_all(6); pwm_init(); /* port return test */ outportb(PADR1,0x00); ret_data = inportb(PCDR1) & 0x01; if ( ret_data != 0x00 ) return (1); outportb(PADR1,0x01); ret_data = inportb(PCDR1) & 0x01; if ( ret_data != 0x01 ) return (1); outportb(PBDR1,0x00); ret_data = inportb(PCDR1) & 0x02; if ( ret_data != 0x00 ) return (1); outportb(PBDR1,0x01); ret_data = inportb(PCDR1) & 0x02; if ( ret_data != 0x02 ) return (1); return (0); } /* supersonic wave sensor & photo sensor circuit test */ int sss_ps() { int ch,ret_data,flag; led_set_all(7); outportb(PGCR2,0x00); outportb(PACR2,0x80); /* submode 1x */ outportb(PADDR2,0x03); outportb(PGCR2,0x00); /* mode 0 */ /* port return test */ flag = 0; for ( ch = 0 ; ch < SSS_NO ; ch++ ) { outportb(PADR2,ch); ret_data = (inportb(PADR2) & 0x30) >> 4; if ( ret_data != ch ) flag = 1; } sss_ps_init(); return (flag); } /* real time clock clear */ void rtc_clr() { int rtc_base; int i; rtc_base=0xfdfe00; outportb(MSR,0x44); for ( i=3 ; rtc_base+ i<0xfdfe40 ; i+=2 ) outportb(rtc_base+i,0x00); outportb(MSR,0x04); for ( i=3 ; rtc_base+ i<0xfdfe0a ; i+=2 ) outportb(rtc_base+i,0x00); } /* real time clock initialize */ void tm_init() { outportb(MSR,0x40); outportb(RTMR,0x00); outportb(OMR,0x00); outportb(ICR1,0x00); asm(" XREF _tmint "); asm(" MOVE.L #$078,A0 "); asm(" MOVE.L #_tmint,(A0) "); } /* 7seg.LED unit initialize */ void led_init() { green = red = 0; /* initialize PI/T 0 */ outportb(PGCR0,0x00); /* clear PGCR0 */ outportb(PSRR0,0x1e); outportb(PACR0,0xa0); /* submode 1x */ outportb(PADDR0,0xff); /* all output */ outportb(PGCR0,0x22); /* mode 0 */ outportb(TCR0,0x00); /* clear TCR0 */ outportl(CPR0,0x00003f); /* TOUT 2kHz */ outportb(TCR0,0x41); /* square wave */ } /* Man-Machine board initialize */ void mmi_init() { /* initialize PI/T 0 */ outportb(PGCR0,0x00); /* clear PGCR0 */ outportb(PBCR0,0x80); /* submode 1x */ outportb(PBDDR0,0x10); outportb(PGCR0,0x22); /* mode 0 */ /* set vector for switch interrupt */ asm(" XREF _swint "); asm(" MOVEA.L #$06c,A0 * LEVEL 3 PI/T interrupt "); asm(" MOVE.L #_swint,(A0) "); } /* routary encoder & touch sensor board initialize */ void re_ts_init() { /* initialize RE/TS */ outportb(TSIE,0x00); outportb(CRST,0x03); /* counter reset */ /* set vector for interrupt */ asm(" XREF _tsint "); asm(" MOVEA.L #$130,A0 * 130(h) = 76(d) * 4 "); asm(" MOVE.L #_tsint,(A0) "); } /* PWM circuit initialize */ void pwm_init() { /* initialize PI/T 1 */ outportb(PGCR1,0x00); outportb(PSRR1,0x00); outportb(PACR1,0x80); /* submode 1x */ outportb(PADDR1,0xff); /* all output */ outportb(PBCR1,0x80); /* submode 1x */ outportb(PBDDR1,0xff); /* all output */ outportb(PCDDR1,0x00); outportb(PGCR1,0x00); /* mode 0 */ outportb(TCR1,0x00); /* clear TCR1 */ outportl(CPR1,0x000001); /* TOUT 125kHz */ outportb(TCR1,0x41); /* square wave */ } /* supersonic wave sensor & photo sensor circuit initialize */ void sss_ps_init() { /* initialize PI/T 2 */ outportb(PGCR2,0x00); outportb(PSRR2,0x1c); outportb(PACR2,0x79); /* submode 01 */ outportb(PADDR2,0x03); outportb(PBCR2,0x30); /* submode 00 */ outportb(PBDDR2,0x00); /* all input */ outportb(PGCR2,0x38); /* mode 0 */ outportb(TCR2,0x00); /* clear TCR2 */ outportl(CPR2,SSS_LIMIT); /* count for ss-wave to go & return 3 meter */ outportb(TCR2,0xb2); /* device watchdog*/ /* set vector for interrupt */ asm(" XREF _sssint "); asm(" MOVEA.L #$120,A0 * 120(h) = 72(d) * 4 "); asm(" MOVE.L #_sssint,(A0) "); asm(" XREF _psint "); asm(" MOVEA.L #$128,A0 * 128(h) = (72+2)(d) * 4 "); asm(" MOVE.L #_psint,(A0) "); outportb(PIVR2,72); /* set vector number */ } /* 7seg.LED set routine (1) */ void led_set( led_no, data ) int led_no,data; { led[led_no] = data; outportb(PADR0,green*0x80+red*0x40+led_no*0x10+data); /* making latch enable pulse */ outportb(PACR0,0xa0); outportb(PACR0,0xa8); outportb(PACR0,0xa0); } /* 7seg.LED set routine (ALL) */ void led_set_all( data ) int data; { int d3,d2,d1,d0; d3 = data/1000; data %= 1000; d2 = data/100; data %= 100; d1 = data/10; d0 = data%10; led[3] = d3; led[2] = d2; led[1] = d1; led[0] = d0; led_set(3,d3); led_set(2,d2); led_set(1,d1); led_set(0,d0); }
/***********************************************************************************/ /* */ /* Department of Electronics & Control Engineering N.C.T. */ /* ------------------------------------------------------------------------------- */ /* def.h -- I/O address definition file */ /* */ /***********************************************************************************/ /* addresses of PI/T 0 registers */ #define PGCR0 0xfdfc01 /* Port General Control Reg. */ #define PSRR0 0xfdfc03 /* Port Select Request Reg. */ #define PADDR0 0xfdfc05 /* Port A Data Direction Reg. */ #define PBDDR0 0xfdfc07 /* Port B Data Direction Reg. */ #define PCDDR0 0xfdfc09 /* Port C Data Direction Reg. */ #define PIVR0 0xfdfc0b /* Port Interrupt Vector Reg. */ #define PACR0 0xfdfc0d /* Port A Control Reg. */ #define PBCR0 0xfdfc0f /* Port B Control Reg. */ #define PADR0 0xfdfc11 /* Port A Data Reg. */ #define PBDR0 0xfdfc13 /* Port B Data Reg. */ #define PAAR0 0xfdfc15 /* Port A Alternate Reg. */ #define PBAR0 0xfdfc17 /* Port B Alternate Reg. */ #define PCDR0 0xfdfc19 /* Port C Data Reg. */ #define PSR0 0xfdfc1b /* Port Status Reg. */ #define TCR0 0xfdfc21 /* Timer Control Reg. */ #define TIVR0 0xfdfc23 /* Timer Interrupt Vector Reg. */ #define CPR0 0xfdfc25 /* Counter Preload Reg. */ #define CNTR0 0xfdfc2d /* Counter Reg. */ #define TSR0 0xfdfc35 /* Timer Status Reg. */ /* I/O Base Address */ #define IO_BASE 0xfc6000 /* IP A base address */ #define IP_A IO_BASE /* addresses of rotary encoder/touch sensor */ #define EDRL IP_A+0x01 /* Encoder Data of Right (Low) */ #define EDRH IP_A+0x03 /* Encoder Data of Right (High) */ #define EDLL IP_A+0x05 /* Encoder Data of Left (Low) */ #define EDLH IP_A+0x07 /* Encoder Data of Left (High) */ #define CRST IP_A+0x09 /* Counter Reset */ #define TSIE IP_A+0x0b /* Touch Sensor Interrupt Enable*/ /* IP B base address */ #define IP_B IO_BASE+0x0100 /* addresses of PI/T 1 registers */ #define PGCR1 IP_B+0x01 /* Port General Control Reg. */ #define PSRR1 IP_B+0x03 /* Port Select Request Reg. */ #define PADDR1 IP_B+0x05 /* Port A Data Direction Reg. */ #define PBDDR1 IP_B+0x07 /* Port B Data Direction Reg. */ #define PCDDR1 IP_B+0x09 /* Port C Data Direction Reg. */ #define PIVR1 IP_B+0x0b /* Port Interrupt Vector Reg. */ #define PACR1 IP_B+0x0d /* Port A Control Reg. */ #define PBCR1 IP_B+0x0f /* Port B Control Reg. */ #define PADR1 IP_B+0x11 /* Port A Data Reg. */ #define PBDR1 IP_B+0x13 /* Port B Data Reg. */ #define PAAR1 IP_B+0x15 /* Port A Alternate Reg. */ #define PBAR1 IP_B+0x17 /* Port B Alternate Reg. */ #define PCDR1 IP_B+0x19 /* Port C Data Reg. */ #define PSR1 IP_B+0x1b /* Port Status Reg. */ #define TCR1 IP_B+0x21 /* Timer Control Reg. */ #define TIVR1 IP_B+0x23 /* Timer Interrupt Vector Reg. */ #define CPR1 IP_B+0x25 /* Counter Preload Reg. */ #define CNTR1 IP_B+0x2d /* Counter Reg. */ #define TSR1 IP_B+0x35 /* Timer Status Reg. */ /* addresses of PI/T 2 registers */ #define PGCR2 IP_B+0x41 /* Port General Control Reg. */ #define PSRR2 IP_B+0x43 /* Port Select Request Reg. */ #define PADDR2 IP_B+0x45 /* Port A Data Direction Reg. */ #define PBDDR2 IP_B+0x47 /* Port B Data Direction Reg. */ #define PCDDR2 IP_B+0x49 /* Port C Data Direction Reg. */ #define PIVR2 IP_B+0x4b /* Port Interrupt Vector Reg. */ #define PACR2 IP_B+0x4d /* Port A Control Reg. */ #define PBCR2 IP_B+0x4f /* Port B Control Reg. */ #define PADR2 IP_B+0x51 /* Port A Data Reg. */ #define PBDR2 IP_B+0x53 /* Port B Data Reg. */ #define PAAR2 IP_B+0x55 /* Port A Alternate Reg. */ #define PBAR2 IP_B+0x57 /* Port B Alternate Reg. */ #define PCDR2 IP_B+0x59 /* Port C Data Reg. */ #define PSR2 IP_B+0x5b /* Port Status Reg. */ #define TCR2 IP_B+0x61 /* Timer Control Reg. */ #define TIVR2 IP_B+0x63 /* Timer Interrupt Vector Reg. */ #define CPR2 IP_B+0x65 /* Counter Preload Reg. */ #define CNTR2 IP_B+0x6d /* Counter Reg. */ #define TSR2 IP_B+0x75 /* Timer Status Reg. */ /* addresses of RTC(real time clock) */ #define MSR 0xfdfe01 /* RTC Main Status Reg. */ #define RTMR 0xfdfe03 /* RTC Real Time Mode Reg. */ #define OMR 0xfdfe05 /* RTC Output Mode Reg. */ #define ICR0 0xfdfe07 /* RTC Interrupt Control Reg. 0 */ #define ICR1 0xfdfe09 /* RTC Interrupt Control Reg. 1 */ /* VMEbus IRQ-mask register */ #define VIMR 0xfdff01 /* data of timer interrupt reset */ #define TMRST 0x44 /* Timer Interrupt Reset */ /* data for supersonic wave sensor */ #define SSS_LIMIT (int)(3*8000000/32/340*2) /* number of 7seg.LED */ #define LED_NO 4 /* number of supersonic wave sensor */ #define SSS_NO 4
/***********************************************************************************/ /* */ /* Department of Electronics & Control Engineering N.C.T. */ /* ------------------------------------------------------------------------------- */ /* itp_def.h -- definition file for ITP */ /* */ /***********************************************************************************/ /* addresses for ROM (128K) check */ #define ROM_START 0xf00000 /* ROM start address */ #define ROM_SIZE 0x00fffe /* check size of ROM (0000-fffd) */ #define CHK_SUM_E 0xf1fffc /* check sum address (even byte) */ #define CHK_SUM_O 0xf1fffe /* check sum address (odd byte) */ /* addresses for RAM (512K) check */ #define STACKTOP 0x004000 /* stacktop address */ #define RAM_END 0x07ffff /* RAM end address */
/***********************************************************************************/ /* */ /* Department of Electronics & Control Engineering N.C.T. */ /* ------------------------------------------------------------------------------- */ /* io.c -- I/O accessing functions program */ /* */ /***********************************************************************************/ int inportb(),outportb(),inportl(),outportl(); /* input byte data from I/O port */ int inportb( port ) char *port; { return((int)*port); } /* output byte data to I/O port */ int outportb( port, data ) char *port; int data; { return(*port = data); } /* input long word data from I/O port */ int inportl( port ) char *port; { int data; unsigned char hbyte,mbyte,lbyte; hbyte = *(port+0x02); mbyte = *(port+0x04); lbyte = *(port+0x06); data = (int)(hbyte*0x010000+mbyte*0x000100+lbyte); return( data ); } /* output long word data to I/O port */ int outportl( port, data ) char *port; int data; { unsigned char hbyte,mbyte,lbyte; hbyte = (unsigned char)((data & 0xff0000)>>16); mbyte = (unsigned char)((data & 0x00ff00)>> 8); lbyte = (unsigned char) (data & 0x0000ff); *(port+0x02) = hbyte; *(port+0x04) = mbyte; *(port+0x06) = lbyte; return( data ); }
TARGET = itp OBJS= c_entry.o itp_main.o itp.o io.o CMDFILE=itp.cmd MCCOPT=-c -g -Gm -nKc -nQ $(TARGET).x: $(OBJS); lnk68k -M -c $(CMDFILE) -o $(TARGET).x .c.o: mcc68k $(MCCOPT) $< .s.o: mcc68k $(MCCOPT) $<
*list c,d,o,p,x,s,t debug_symbols ;list p listabs publics ;list d listabs internal ;list s listmap crossref ;list c listmap internal ;list t listmap publics ;list x order code,const sect code = $0F00000 ;Code Section Begin Adrs. sect strings = $0F04000 ;String Section Adrs. sect zerovars = $6000 ;Buffer Section Adrs. sect vars = $4000 ;Un-initialized Data Section Adrs. public ????STACKTOP = $4000 ;Top of the Stack Area load c_entry.o load itp_main.o load itp.o load io.o load /usr/mri/lib/mcc68kab.lib format s end