;----------------------------------------------------------- ; ; Self flashing Box : July 2005 ; ; for MAS2005 20Tora Yamaguchi ; ;----------------------------------------------------------- ;##### Port Defines ##### p1ddr .equ h'0fffc0 p1dr .equ h'0fffc2 ;##### Vector Defines ##### .section vector,data,locate=h'000000 .data.l start ;##### Work RAM Data Defines ##### .section ram,data,locate=h'0fef10 timer .res.w 1 on_color .res.b 1 off_color .res.b 1 phase .res.b 1 mode .res.b 1 counter .res.b 1 ;***** Constant Table Defines ***** .section rom,data,locate=h'001000 table: .data.b 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3 ; 21 .data.b 4,4,4,4,4,5,5,5,5,5 ; +10=31 .data.b 6,6,6,6,7,7,7,7,8,8,8,9,9,9 ; +14=45 .data.b 10,10,11,11,12,12,13,13,14,14,15,15,16,16 ; +14=59 .data.b 17,17,18,18,19,20 ; +6=65 .data.b 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36 ; +16=81 .data.b 37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 ; +16=97 .data.b 54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84 ; +16=113 .data.b 87,90,93,96,99,102,105,108,111,114,117,120,123 ; +13=126 .data.b 126,127 ; +2=128 ;***** Reset --> Initialize --> Main Loop ***** .section program,code,locate=h'002000 start: mov.l #h'0fff0f,er7 ; stack pointer set mov.l #h'0fef10,er2 mov.w #h'0fe0,r1 mov.b #0,r0l _ram_clear: mov.b r0l,@er2 inc.l #1,er2 dec.w #1,r1 bne _ram_clear mov.b #b'01111111,r0l mov.b r0l,@p1ddr ; set : Port[1] only MSB = input mov.b #b'00011111,r0l mov.b r0l,@p1dr ; LED all off jsr @wait_500msec mov.b #b'00000001,r0l mov.b r0l,@off_color loop1_start: mov.b @off_color,r0l shal.b r0l btst #5,r0l beq _loop1_go mov.b #b'00000001,r0l _loop1_go: mov.b r0l,@off_color loop1: mov.b @off_color,r0l xor.b #b'11111111,r0l and.b #b'00011111,r0l mov.b r0l,@p1dr ; only one LED ON jsr @wait_500msec mov.b @p1dr,r0l and.b #b'10000000,r0l beq loop2_start ; SW=close - on the floor mov.b #b'00011111,r0l mov.b r0l,@p1dr ; LED all OFF ! jsr @wait_500msec mov.b @p1dr,r0l and.b #b'10000000,r0l beq loop2_start ; SW=close - on the floor bra loop1 loop2_start: mov.b #b'00011111,r0l mov.b r0l,@p1dr ; LED all OFF ! mov.b #0,r0l mov.b r0l,@mode mov.b r0l,@phase mov.b r0l,@counter mov.b #b'00000001,r0l mov.b r0l,@on_color loop2: jsr @on_floor mov.b @p1dr,r0l and.b #b'10000000,r0l bne loop1_start ; SW=open - off the floor bra loop2 on_floor: mov.b @counter,r2l inc.b r2l and.b #b'01111111,r2l mov.b r2l,@counter mov.b #0,r0h mov.b @phase,r0l mov.w #0,e0 mov.l #table,er1 add.l er0,er1 mov.b @er1,r3h ; --> (table) --> r3h cmp.b r2l,r3h ; phase - counter bpl _on_light mov.b #b'00011111,r0l mov.b r0l,@p1dr ; LED all OFF ! bra _on_next _on_light: mov.b @on_color,r0l xor.b #b'11111111,r0l and.b #b'00011111,r0l mov.b r0l,@p1dr ; only one LED ON _on_next: mov.b @counter,r0l cmp.b #127,r0l beq _on_phase rts _on_phase: mov.w @timer,r0 inc.w #1,r0 mov.w r0,@timer cmp.w #52,r0 ; ### speed parameter beq _on_go rts _on_go: mov.w #0,r0 mov.w r0,@timer mov.b @phase,r1l mov.b @mode,r0l beq mode_0 bra mode_1 mode_0: inc.b r1l cmp.b #127,r1l bne _on_mix mov.b #1,r0l mov.b r0l,@mode bra _on_mix mode_1: dec.b r1l bne _on_mix mov.b r1l,@mode mov.b @on_color,r0l shal.b r0l btst #5,r0l beq _on_exit mov.b #b'00000001,r0l _on_exit: mov.b r0l,@on_color _on_mix: mov.b r1l,@phase rts wait_500msec: mov.l #500,er1 _wait_1: jsr @wait_1msec sub.l #1,er1 bne _wait_1 rts wait_1msec: mov.l #2048,er2 _wait_2: sub.l #1,er2 bne _wait_2 rts .end