diff options
Diffstat (limited to 'firmware/target/coldfire/iaudio/x5/lcd-as-x5.S')
-rw-r--r-- | firmware/target/coldfire/iaudio/x5/lcd-as-x5.S | 115 |
1 files changed, 42 insertions, 73 deletions
diff --git a/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S b/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S index 7c89fb925e..54c1110d2a 100644 --- a/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S +++ b/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S | |||
@@ -290,6 +290,9 @@ lcd_write_yuv420_lines: | |||
290 | lea.l (36,%sp),%sp /* restore registers */ | 290 | lea.l (36,%sp),%sp /* restore registers */ |
291 | 291 | ||
292 | rts | 292 | rts |
293 | |||
294 | .yuv_end: | ||
295 | .size lcd_write_yuv420_lines,.yuv_end-lcd_write_yuv420_lines | ||
293 | /* end lcd_write_yuv420_lines */ | 296 | /* end lcd_write_yuv420_lines */ |
294 | 297 | ||
295 | 298 | ||
@@ -304,22 +307,19 @@ lcd_write_data: | |||
304 | add.l %a0,%d0 /* -> end address */ | 307 | add.l %a0,%d0 /* -> end address */ |
305 | lea.l 0xf0008002,%a1 /* LCD data port */ | 308 | lea.l 0xf0008002,%a1 /* LCD data port */ |
306 | 309 | ||
307 | lea.l (-24,%sp),%sp /* free up some registers */ | 310 | lea.l (-20,%sp),%sp /* free up some registers */ |
308 | movem.l %d2-%d6/%a2,(%sp) | 311 | movem.l %d2-%d5/%a2,(%sp) |
309 | 312 | ||
310 | move.l %a0,%d1 | 313 | move.l %a0,%d1 |
311 | btst.l #1,%d1 /* already longword aligned? */ | 314 | btst.l #1,%d1 /* already longword aligned? */ |
312 | beq.b .wd_wordl_end /* yes: skip initial word copy */ | 315 | beq.b .wd_wordl_end /* yes: skip initial word copy */ |
313 | /* transfer initial word */ | 316 | /* transfer initial word */ |
314 | move.w (%a0)+,%d1 /* |????????|????????|rrrrrggg|gggbbbbb| */ | 317 | move.w (%a0)+,%d2 /* |????????|????????|rrrrrggg|gggbbbbb| */ |
315 | move.l %d1,%d2 | 318 | move.l %d2,%d1 |
316 | and.l #0xfffff800,%d2 /* |????????|????????|rrrrr000|00000000| */ | 319 | lsr.l #7,%d1 /* |0000000?|????????|???????r|rrrrgggg| */ |
317 | add.l %d2,%d1 /* |????????|???????r|rrrr0ggg|gggbbbbb| */ | 320 | move.w %d1,(%a1) /* ^ ^^^^^^^ */ |
318 | move.l %d1,%d2 | 321 | lsl.l #1,%d2 /* |????????|???????r|rrrrgggg|ggbbbbb0| */ |
319 | lsr.l #8,%d1 /* |00000000|????????|???????r|rrrr0ggg| */ | 322 | move.w %d2,(%a1) /* ^ ^^^^^^^ */ |
320 | move.w %d1,(%a1) | ||
321 | lsl.l #1,%d2 /* |????????|??????rr|rrr0gggg|ggbbbbb0| */ | ||
322 | move.w %d2,(%a1) | ||
323 | 323 | ||
324 | .wd_wordl_end: /* now longword aligned */ | 324 | .wd_wordl_end: /* now longword aligned */ |
325 | moveq.l #28,%d1 | 325 | moveq.l #28,%d1 |
@@ -335,22 +335,17 @@ lcd_write_data: | |||
335 | bls.b .wd_long1_end /* no: skip leading long loop */ | 335 | bls.b .wd_long1_end /* no: skip leading long loop */ |
336 | 336 | ||
337 | .wd_long1_loop: | 337 | .wd_long1_loop: |
338 | move.l (%a0)+,%d2 /* read longword */ | 338 | move.l (%a0)+,%d2 /* read longword */ |
339 | swap %d2 /* unstuff two pixels and correct order */ | 339 | swap %d2 /* |rrrrrggg|gggbbbbb|RRRRRGGG|GGGBBBBB| */ |
340 | move.l %d2,%d5 | 340 | move.l %d2,%d5 |
341 | and.l #0xff00ff00,%d5 /* |rrrrrggg|00000000|rrrrrggg|00000000| */ | 341 | lsr.l #7,%d5 /* |0000000r|rrrrgggg|ggbbbbbR|RRRRGGGG| */ |
342 | eor.l %d5,%d2 /* |00000000|gggbbbbb|00000000|gggbbbbb| */ | 342 | move.w %d5,(%a1) /* ^ ^^^^^^^ */ |
343 | lsr.l #8,%d5 /* |00000000|rrrrrggg|00000000|rrrrrggg| */ | 343 | lsl.l #1,%d2 /* |rrrrgggg|ggbbbbbR|RRRRBGGG|GGBBBBB0| */ |
344 | move.l %d5,%d6 | 344 | move.w %d2,(%a1) /* ^ ^^^^^^^ */ |
345 | and.l #0x00f800f8,%d5 /* |00000000|rrrrr000|00000000|rrrrr000| */ | 345 | swap %d5 /* |ggbbbbbR|RRRRGGGG|0000000r|rrrrgggg| */ |
346 | add.l %d6,%d5 /* |0000000r|rrrr0ggg|0000000r|rrrr0ggg| */ | 346 | move.w %d5,(%a1) /* ^ ^^^^^^^ */ |
347 | move.w %d5,(%a1) | 347 | swap %d2 /* |RRRRBGGG|GGBBBBB0|rrrrgggg|ggbbbbbR| */ |
348 | lsl.l #1,%d2 /* |0000000g|ggbbbbb0|0000000g|ggbbbbb0| */ | 348 | move.w %d2,(%a1) /* ^ ^^^^^^^ */ |
349 | move.w %d2,(%a1) | ||
350 | swap %d5 | ||
351 | move.w %d5,(%a1) | ||
352 | swap %d2 | ||
353 | move.w %d2,(%a1) | ||
354 | cmp.l %a0,%d1 | 349 | cmp.l %a0,%d1 |
355 | bhi.b .wd_long1_loop | 350 | bhi.b .wd_long1_loop |
356 | 351 | ||
@@ -363,15 +358,9 @@ lcd_write_data: | |||
363 | lea.l (16,%a0),%a0 /* increment address */ | 358 | lea.l (16,%a0),%a0 /* increment address */ |
364 | 359 | ||
365 | /* transfer four pairs of longs to display */ | 360 | /* transfer four pairs of longs to display */ |
366 | /* same procedure for each as in leading long loop */ | ||
367 | swap %d1 | 361 | swap %d1 |
368 | move.l %d1,%d5 | 362 | move.l %d1,%d5 |
369 | and.l #0xff00ff00,%d5 | 363 | lsr.l #7,%d5 |
370 | eor.l %d5,%d1 | ||
371 | lsr.l #8,%d5 | ||
372 | move.l %d5,%d6 | ||
373 | and.l #0x00f800f8,%d5 | ||
374 | add.l %d6,%d5 | ||
375 | move.w %d5,(%a1) | 364 | move.w %d5,(%a1) |
376 | lsl.l #1,%d1 | 365 | lsl.l #1,%d1 |
377 | move.w %d1,(%a1) | 366 | move.w %d1,(%a1) |
@@ -380,14 +369,9 @@ lcd_write_data: | |||
380 | swap %d1 | 369 | swap %d1 |
381 | move.w %d1,(%a1) | 370 | move.w %d1,(%a1) |
382 | 371 | ||
383 | swap %d2 | 372 | swap %d2 |
384 | move.l %d2,%d5 | 373 | move.l %d2,%d5 |
385 | and.l #0xff00ff00,%d5 | 374 | lsr.l #7,%d5 |
386 | eor.l %d5,%d2 | ||
387 | lsr.l #8,%d5 | ||
388 | move.l %d5,%d6 | ||
389 | and.l #0x00f800f8,%d5 | ||
390 | add.l %d6,%d5 | ||
391 | move.w %d5,(%a1) | 375 | move.w %d5,(%a1) |
392 | lsl.l #1,%d2 | 376 | lsl.l #1,%d2 |
393 | move.w %d2,(%a1) | 377 | move.w %d2,(%a1) |
@@ -396,14 +380,9 @@ lcd_write_data: | |||
396 | swap %d2 | 380 | swap %d2 |
397 | move.w %d2,(%a1) | 381 | move.w %d2,(%a1) |
398 | 382 | ||
399 | swap %d3 | 383 | swap %d3 |
400 | move.l %d3,%d5 | 384 | move.l %d3,%d5 |
401 | and.l #0xff00ff00,%d5 | 385 | lsr.l #7,%d5 |
402 | eor.l %d5,%d3 | ||
403 | lsr.l #8,%d5 | ||
404 | move.l %d5,%d6 | ||
405 | and.l #0x00f800f8,%d5 | ||
406 | add.l %d6,%d5 | ||
407 | move.w %d5,(%a1) | 386 | move.w %d5,(%a1) |
408 | lsl.l #1,%d3 | 387 | lsl.l #1,%d3 |
409 | move.w %d3,(%a1) | 388 | move.w %d3,(%a1) |
@@ -412,14 +391,9 @@ lcd_write_data: | |||
412 | swap %d3 | 391 | swap %d3 |
413 | move.w %d3,(%a1) | 392 | move.w %d3,(%a1) |
414 | 393 | ||
415 | swap %d4 | 394 | swap %d4 |
416 | move.l %d4,%d5 | 395 | move.l %d4,%d5 |
417 | and.l #0xff00ff00,%d5 | 396 | lsr.l #7,%d5 |
418 | eor.l %d5,%d4 | ||
419 | lsr.l #8,%d5 | ||
420 | move.l %d5,%d6 | ||
421 | and.l #0x00f800f8,%d5 | ||
422 | add.l %d6,%d5 | ||
423 | move.w %d5,(%a1) | 397 | move.w %d5,(%a1) |
424 | lsl.l #1,%d4 | 398 | lsl.l #1,%d4 |
425 | move.w %d4,(%a1) | 399 | move.w %d4,(%a1) |
@@ -437,15 +411,10 @@ lcd_write_data: | |||
437 | bls.b .wd_long2_end /* no: skip trailing longword loop */ | 411 | bls.b .wd_long2_end /* no: skip trailing longword loop */ |
438 | 412 | ||
439 | .wd_long2_loop: | 413 | .wd_long2_loop: |
440 | move.l (%a0)+,%d2 /* read longword */ | 414 | move.l (%a0)+,%d2 /* read longword */ |
441 | swap %d2 | 415 | swap %d2 |
442 | move.l %d2,%d5 | 416 | move.l %d2,%d5 |
443 | and.l #0xff00ff00,%d5 | 417 | lsr.l #7,%d5 |
444 | eor.l %d5,%d2 | ||
445 | lsr.l #8,%d5 | ||
446 | move.l %d5,%d6 | ||
447 | and.l #0x00f800f8,%d5 | ||
448 | add.l %d6,%d5 | ||
449 | move.w %d5,(%a1) | 418 | move.w %d5,(%a1) |
450 | lsl.l #1,%d2 | 419 | lsl.l #1,%d2 |
451 | move.w %d2,(%a1) | 420 | move.w %d2,(%a1) |
@@ -459,18 +428,18 @@ lcd_write_data: | |||
459 | .wd_long2_end: | 428 | .wd_long2_end: |
460 | blo.b .wd_word2_end /* no final word: skip */ | 429 | blo.b .wd_word2_end /* no final word: skip */ |
461 | 430 | ||
462 | move.w (%a0),%d1 /* transfer final word */ | 431 | move.w (%a0)+,%d2 /* transfer final word */ |
463 | move.l %d1,%d2 | 432 | move.l %d2,%d1 |
464 | and.l #0xfffff800,%d2 | 433 | lsr.l #7,%d1 |
465 | add.l %d2,%d1 | 434 | move.w %d1,(%a1) |
466 | move.l %d1,%d2 | 435 | lsl.l #1,%d2 |
467 | lsr.l #8,%d1 | 436 | move.w %d2,(%a1) |
468 | move.w %d1,(%a1) | ||
469 | lsl.l #1,%d2 | ||
470 | move.w %d2,(%a1) | ||
471 | 437 | ||
472 | .wd_word2_end: | 438 | .wd_word2_end: |
473 | movem.l (%sp),%d2-%d6/%a2 | 439 | movem.l (%sp),%d2-%d5/%a2 |
474 | lea.l (24,%sp),%sp /* restore registers */ | 440 | lea.l (20,%sp),%sp /* restore registers */ |
475 | rts | 441 | rts |
442 | |||
443 | .wd_end: | ||
444 | .size lcd_write_data,.wd_end-lcd_write_data | ||
476 | /* end lcd_write_data */ | 445 | /* end lcd_write_data */ |