1 ; C Compiler for MC68HC11 [COSMIC Software] 2 ; Version V4.1m - 11 Sep 2000 4 .const: section 5 8f8c _ready: 6 8f8c 0d0a49276d20 dc.b 13,10,73,39,109,32 7 8f92 636f6d706c65 dc.b "completely operati" 8 8fa4 6f6e616c2c20 dc.b "onal, and all my c" 9 8fb6 697263756974 dc.b "ircuits are functi" 10 8fc8 6f6e696e6720 dc.b "oning perfectly.",13 11 8fd9 0a00 dc.b 10,0 12 ; 43 @interrupt void tick() 12 ; 44 { 13 switch .text 14 83b0 _tick: 16 ; 45 TOC2 = TCNT + 0xf415; /* 0xf424 - 0xe (cycles to service ISR) - 0x1 (average latency) */ 17 83b0 ce8000 ldx #-32768 18 83b3 ec0e ldd 14,x 19 83b5 c3f415 addd #-3051 20 83b8 ed18 std 24,x 21 ; 46 TFLG1 = 0x40; /* clear OC2F bit */ 22 83ba c640 ldab #64 23 83bc e723 stab 35,x 24 ; 48 ++tic; 25 83be 7c210c inc _tic 26 ; 49 if( tic & 0x01 ) ++ticks[ 0 ]; // divide-by-two 27 83c1 f6210c ldab _tic 28 83c4 c501 bitb #1 29 83c6 2703 beq L3 31 83c8 7c2108 inc _ticks 32 83cb L3: 33 ; 51 if( ticks[ 0 ] > 59 ) 34 83cb f62108 ldab _ticks 35 83ce c13b cmpb #59 36 83d0 231d bls L5 37 ; 53 ticks[ 0 ] = 0; 38 83d2 7f2108 clr _ticks 39 ; 54 ++ticks[ 1 ]; 40 83d5 7c2109 inc _ticks+1 41 ; 55 if( ticks[ 1 ] > 59 ) 42 83d8 f62109 ldab _ticks+1 43 83db c13b cmpb #59 44 83dd 2310 bls L5 45 ; 57 ticks[ 1 ] = 0; 46 83df 7f2109 clr _ticks+1 47 ; 58 ++ticks[ 2 ]; 48 83e2 7c210a inc _ticks+2 49 ; 59 if( ticks[ 2 ] > 23 ) 50 83e5 f6210a ldab _ticks+2 51 83e8 c117 cmpb #23 52 83ea 2303 bls L5 53 ; 61 ticks[ 2 ] = 0; 54 83ec 7f210a clr _ticks+2 55 83ef L5: 56 ; 66 return; 57 83ef 3b rti 58 ; 69 @interrupt void scisr() 58 ; 70 { 59 83f0 _scisr: 61 ; 71 if( ( SCSR & RDRF_W_ERRS ) == RDRF ) 62 83f0 ce8000 ldx #-32768 63 83f3 e62e ldab 46,x 64 83f5 c42e andb #46 65 83f7 c120 cmpb #32 66 83f9 262c bne L31 67 ; 73 if( itail != ( ihead - 1 ) ) 68 83fb fc2106 ldd _ihead 69 83fe 830001 subd #1 70 8401 b32104 subd _itail 71 8404 275e beq L12 72 ; 75 ififo[ itail ] = SCDR; 73 8406 cc1104 ldd #_ififo 74 8409 f32104 addd _itail 75 pshd 76 840e e62f ldab 47,x 77 8410 38 pulx 78 8411 e700 stab 0,x 79 ; 76 ++itail; 80 8413 fc2104 ldd _itail 81 8416 c30001 addd #1 82 8419 fd2104 std _itail 83 ; 77 if( itail >= FIFO_SZ ) 84 841c 831000 subd #4096 85 841f 2543 blo L12 86 ; 78 itail = 0; 87 8421 4f clra 88 8422 5f clrb 89 8423 fd2104 std _itail 90 8426 3b rti 91 8427 L31: 92 ; 81 else if( SCSR & TDRE ) 93 8427 1f2e8039 brclr 46,x,#128,L12 94 ; 83 if( ohead != otail ) 95 842b fc1102 ldd _ohead 96 842e 1ab31100 cpd _otail 97 8432 2722 beq L52 98 ; 85 SCDR = ofifo[ ohead ]; 99 8434 cc0100 ldd #_ofifo 100 8437 f31102 addd _ohead 101 843a 8f xgdx 102 843b e600 ldab 0,x 103 843d ce8000 ldx #-32768 104 8440 e72f stab 47,x 105 ; 86 ++ohead; 106 8442 fc1102 ldd _ohead 107 8445 c30001 addd #1 108 8448 fd1102 std _ohead 109 ; 87 if( ohead >= FIFO_SZ ) 110 844b 1a831000 cpd #4096 111 844f 2505 blo L52 112 ; 88 ohead = 0; 113 8451 4f clra 114 8452 5f clrb 115 8453 fd1102 std _ohead 116 8456 L52: 117 ; 90 if( ohead == otail ) //if FIFO is empty 118 8456 b31100 subd _otail 119 8459 2609 bne L12 120 ; 92 ohead = 0; otail = 0; //reset pointers 121 845b fd1102 std _ohead 123 845e fd1100 std _otail 124 ; 93 SCCR2 = SCCR2 & 0x7f; //clear Transmit Interrupt Enable bit 125 8461 1d2d80 bclr 45,x,#128 126 8464 L12: 127 ; 97 return; 128 8464 3b rti 129 ; 100 int putchar( char c ) 129 ; 101 { 130 8465 _putchar: 131 8465 3c pshx 132 pshd 133 8468 30 tsx 134 00000000 OFST: set 0 136 ; 102 _asm("sei"); //mask interrupts for this call 137 8469 0f sei 138 ; 104 if( ( otail == ohead ) && ( SCSR & TDRE ) ) //if FIFO and SCI Tx buffer are empty 139 846a fc1100 ldd _otail 140 846d b31102 subd _ohead 141 8470 2610 bne L33 143 8472 18ce8000 ldy #-32768 144 8476 181f2e8007 brclr 46,y,#128,L33 145 ; 106 SCDR = c; //write to the port 146 847b e601 ldab OFST+1,x 147 847d 18e72f stab 47,y 149 8480 202b bra L53 150 8482 L33: 151 ; 108 else if( otail != ( ohead - 1 ) ) //else ensure FIFO isn't full 152 8482 fc1102 ldd _ohead 153 8485 830001 subd #1 154 8488 b31100 subd _otail 155 848b 2720 beq L53 156 ; 110 ofifo[ otail ] = c; //and write to the FIFO 157 848d cc0100 ldd #_ofifo 158 8490 f31100 addd _otail 159 8493 188f xgdy 160 8495 e601 ldab OFST+1,x 161 8497 18e700 stab 0,y 162 ; 111 ++otail; 163 849a fc1100 ldd _otail 164 849d c30001 addd #1 165 84a0 fd1100 std _otail 166 ; 112 if( otail >= FIFO_SZ ) 167 84a3 831000 subd #4096 168 84a6 2505 blo L53 169 ; 113 otail = 0; 170 84a8 4f clra 171 84a9 5f clrb 172 84aa fd1100 std _otail 173 84ad L53: 174 ; 116 _asm("cli"); 175 84ad 0e cli 176 ; 118 SCCR2 = SCCR2 | 0x80; //set Transmit Interrupt Enable bit 177 84ae 18ce8000 ldy #-32768 178 84b2 181c2d80 bset 45,y,#128 179 ; 120 return c; 180 84b6 e601 ldab OFST+1,x 181 84b8 4f clra 183 84b9 38 pulx 184 84ba 38 pulx 185 84bb 39 rts 186 ; 123 int getchar() 186 ; 124 { 187 84bc _getchar: 188 84bc 3c pshx 190 ; 125 if( ihead != itail ) 191 84bd fc2106 ldd _ihead 192 84c0 b32104 subd _itail 193 84c3 2723 beq L34 194 ; 127 _asm("sei"); //mask interrupts for this case 195 84c5 0f sei 196 ; 129 x = ififo[ ihead ]; 197 84c6 cc1104 ldd #_ififo 198 84c9 f32106 addd _ihead 199 84cc 8f xgdx 200 84cd e600 ldab 0,x 201 84cf f7210e stab _x 202 ; 130 ++ihead; 203 84d2 fc2106 ldd _ihead 204 84d5 c30001 addd #1 205 84d8 fd2106 std _ihead 206 ; 131 if( ihead >= FIFO_SZ ) 207 84db 831000 subd #4096 208 84de 2505 blo L54 209 ; 132 ihead = 0; 210 84e0 4f clra 211 84e1 5f clrb 212 84e2 fd2106 std _ihead 213 84e5 L54: 214 ; 134 _asm("cli"); 215 84e5 0e cli 217 84e6 2009 bra L74 218 84e8 L34: 219 ; 138 ihead = 0; itail = 0; //reset pointers 220 84e8 fd2106 std _ihead 222 84eb fd2104 std _itail 223 ; 139 x = 0; //return NULL 224 84ee 7f210e clr _x 225 84f1 L74: 226 ; 142 return( x ); 227 84f1 f6210e ldab _x 228 84f4 4f clra 230 84f5 38 pulx 231 84f6 39 rts 232 ; 145 void main(void) 232 ; 146 { 233 84f7 _main: 234 84f7 3c pshx 236 ; 148 ihead = 0; itail = 0; 237 84f8 4f clra 238 84f9 5f clrb 239 84fa fd2106 std _ihead 241 84fd fd2104 std _itail 242 ; 149 ohead = 0; otail = 0; 243 8500 fd1102 std _ohead 245 8503 fd1100 std _otail 246 ; 151 DDRD = ( DDRD & 0xfb ) | 0x08; 247 8506 ce8000 ldx #-32768 248 8509 e609 ldab 9,x 249 850b c4fb andb #251 250 850d ca08 orab #8 251 850f e709 stab 9,x 252 ; 153 SCCR2 = SCCR2 | 0x20; 253 8511 1c2d20 bset 45,x,#32 254 ; 155 putchar( 0x1b ); putchar( 0x5b ); putchar( 0x3f ); putchar( 0x37 ); putchar( 0x68 ); //enable auto wrap to new line 255 8514 cc001b ldd #27 256 8517 bd8465 jsr _putchar 259 851a cc005b ldd #91 260 851d bd8465 jsr _putchar 263 8520 cc003f ldd #63 264 8523 bd8465 jsr _putchar 267 8526 cc0037 ldd #55 268 8529 bd8465 jsr _putchar 271 852c cc0068 ldd #104 272 852f bd8465 jsr _putchar 274 ; 156 puts( ready ); 275 8532 cc8f8c ldd #_ready 276 8535 bd8d7c jsr _puts 278 8538 L15: 279 ; 161 x = getchar(); 280 8538 8d82 jsr _getchar 282 853a f7210e stab _x 283 ; 162 if( x != 0 ) 284 853d 2725 beq L55 285 ; 164 putchar( x ); 286 853f 4f clra 287 8540 bd8465 jsr _putchar 289 ; 165 if( x == 'J' ) 290 8543 f6210e ldab _x 291 8546 c14a cmpb #74 292 8548 26ee bne L15 293 ; 167 putchar( 'A' ); 294 854a cc0041 ldd #65 295 854d bd8465 jsr _putchar 297 ; 168 putchar( 'S' ); 298 8550 cc0053 ldd #83 299 8553 bd8465 jsr _putchar 301 ; 169 putchar( 'O' ); 302 8556 cc004f ldd #79 303 8559 bd8465 jsr _putchar 305 ; 170 putchar( 'N' ); 306 855c cc004e ldd #78 307 855f bd8465 jsr _putchar 309 8562 20d4 bra L15 310 8564 L55: 311 ; 173 else if( ticks[ 0 ] != ptic ) 312 8564 f62108 ldab _ticks 313 8567 f1210b cmpb _ptic 314 856a 27cc beq L15 315 ; 175 ptic = ticks[ 0 ]; 316 856c f7210b stab _ptic 317 ; 178 putchar( 0x1b ); putchar( 0x37 ); //save cursor position 318 856f cc001b ldd #27 319 8572 bd8465 jsr _putchar 322 8575 cc0037 ldd #55 323 8578 bd8465 jsr _putchar 325 ; 180 putchar( 0x1b ); putchar( 0x5b ); putchar( '0' ); putchar( ';' ); putchar( '7' ); putchar( '0' ); putchar( 0x48 ); 326 857b cc001b ldd #27 327 857e bd8465 jsr _putchar 330 8581 cc005b ldd #91 331 8584 bd8465 jsr _putchar 334 8587 cc0030 ldd #48 335 858a bd8465 jsr _putchar 338 858d cc003b ldd #59 339 8590 bd8465 jsr _putchar 342 8593 cc0037 ldd #55 343 8596 bd8465 jsr _putchar 346 8599 cc0030 ldd #48 347 859c bd8465 jsr _putchar 350 859f cc0048 ldd #72 351 85a2 bd8465 jsr _putchar 353 ; 182 printf( "%2d:%02d:%02d", ticks[2], ticks[1], ticks[0] ); 354 85a5 f62108 ldab _ticks 355 85a8 4f clra 356 pshd 357 85ab f62109 ldab _ticks+1 358 pshd 359 85b0 f6210a ldab _ticks+2 360 pshd 361 85b5 cc8fdb ldd #L56 362 85b8 bd85ce jsr _printf 364 85bb bd8f77 jsr c_msps 365 85be 06 dc.b 6 366 ; 184 putchar( 0x1b ); putchar( 0x38 ); //restore cursor position 367 85bf cc001b ldd #27 368 85c2 bd8465 jsr _putchar 371 85c5 cc0038 ldd #56 372 85c8 bd8465 jsr _putchar 374 85cb 7e8538 bra L15 375 xdef _main 376 xdef _scisr 377 xdef _tick 378 switch .bss 379 0100 _ofifo: 380 0100 000000000000 ds.b 4096 381 xdef _ofifo 382 1100 _otail: 383 1100 0000 ds.b 2 384 xdef _otail 385 1102 _ohead: 386 1102 0000 ds.b 2 387 xdef _ohead 388 1104 _ififo: 389 1104 000000000000 ds.b 4096 390 xdef _ififo 391 2104 _itail: 392 2104 0000 ds.b 2 393 xdef _itail 394 2106 _ihead: 395 2106 0000 ds.b 2 396 xdef _ihead 397 2108 _ticks: 398 2108 000000 ds.b 3 399 xdef _ticks 400 210b _ptic: 401 210b 00 ds.b 1 402 xdef _ptic 403 210c _tic: 404 210c 00 ds.b 1 405 xdef _tic 406 210d _y: 407 210d 00 ds.b 1 408 xdef _y 409 210e _x: 410 210e 00 ds.b 1 411 xdef _x 412 xdef _ready 413 xref _puts 414 xdef _putchar 415 xref _printf 416 xdef _getchar 417 switch .const 418 8fdb L56: 419 8fdb 2532643a2530 dc.b "%2d:%02d:%02d",0 420 xref c_msps 421 end