;;; Scrolling routine ;;; ; r0: Background layer 08065654 (T) push r4-r7,r14 08065656 (T) mov r7,r10 08065658 (T) mov r6,r9 0806565A (T) mov r5,r8 0806565C (T) push r5-r7 0806565E (T) add sp,-20h ; Allocate space on the stack 08065660 (T) lsl r0,r0,18h 08065662 (T) lsr r0,r0,18h 08065664 (T) str r0,[sp] ; Save r0 parameter for routine 08065666 (T) cmp r0,0h ;\ 08065668 (T) bne 8065684h ;} If r0 parameter == 0: 0806566A (T) ldr r0,=Tileset ;\ 0806566C (T) ldrb r2,[r0,1h] ;| 0806566E (T) ldr r0,=Bg0YPosition ;| 08065670 (T) ldrh r6,[r0] ;} Get foreground X, Y and compression 08065672 (T) ldr r0,=Bg0XPosition ;| 08065674 (T) b 80656AEh ;/ 08065676 dw 00000h 08065678 dd 0030000A4h,003001226h,003001224h 08065684 (T) ldr r0,[sp] ;\ 08065686 (T) cmp r0,1h ;} Elseif r0 parameter == 1: 08065688 (T) bne 80656A4h ;/ 0806568A (T) ldr r0,=Tileset ;\ 0806568C (T) ldrb r2,[r0,2h] ;| 0806568E (T) ldr r0,=Bg1YPosition ;| 08065690 (T) ldrh r6,[r0] ;} Get level X, Y and compression 08065692 (T) ldr r0,=Bg1XPosition ;| 08065694 (T) b 80656AEh ;/ 08065696 dw 00000h 08065698 dd 0030000A4h,00300122Ah,003001228h 080656A4 (T) ldr r0,=Tileset ;\ Else: 080656A6 (T) ldrb r2,[r0,3h] ;| 080656A8 (T) ldr r0,=Bg2YPosition ;} Get back-level X, Y and compression 080656AA (T) ldrh r6,[r0] ;| 080656AC (T) ldr r0,=Bg2XPosition ;/ 080656AE (T) ldrh r1,[r0] 080656B0 (T) mov r0,10h ;\ 080656B2 (T) and r0,r2 ;| 080656B4 (T) cmp r0,0h ;} If compression has 0x10: 080656B6 (T) bne 80656BAh ;| 080656B8 (T) b 806586Ch ;/ 080656BA (T) lsr r0,r1,6h ;\ 080656BC (T) mov r1,15h ;| 080656BE (T) str r1,[sp,0Ch] ;} Get the 3rd tile to the left of the current tile 080656C0 (T) sub r0,3h ;/ 080656C2 (T) lsl r0,r0,10h ;\ 080656C4 (T) lsr r3,r0,10h ;| 080656C6 (T) cmp r0,0h ;} within the limits of the background 080656C8 (T) bge 80656CCh ;| 080656CA (T) mov r3,0h ;/ 080656CC (T) ldr r7,=DecompressedForegroundPointer ;\ 080656CE (T) ldr r2,[sp] ;| 080656D0 (T) lsl r1,r2,3h ;} Get width of the background in blocks 080656D2 (T) add r5,r1,r7 ;| 080656D4 (T) ldrh r4,[r5,4h] ;/ 080656D6 (T) lsl r2,r3,10h ;\ 080656D8 (T) asr r0,r2,10h ;} Width - (XTile-3) 080656DA (T) sub r0,r4,r0 ;/ 080656DC (T) str r1,[sp,1Ch] ; Save background<<3 for routine 080656DE (T) ldr r1,[sp,0Ch] ;\ 080656E0 (T) cmp r1,r0 ;} If less than 3 tiles left from the end: 080656E2 (T) ble 80656ECh ;/ 080656E4 (T) sub r0,r4,r3 ;\ 080656E6 (T) lsl r0,r0,10h ;} Save tiles until end for routine 080656E8 (T) lsr r0,r0,10h ;} Else: save length of screen 080656EA (T) str r0,[sp,0Ch] ;/ 080656EC (T) lsr r2,r2,10h ;\ 080656EE (T) str r2,[sp,8h] ;| 080656F0 (T) lsr r0,r6,6h ;| 080656F2 (T) mov r2,10h ;| 080656F4 (T) str r2,[sp,10h] ;| 080656F6 (T) sub r0,3h ;| 080656F8 (T) lsl r0,r0,10h ;| 080656FA (T) lsr r3,r0,10h ;| 080656FC (T) cmp r0,0h ;| 080656FE (T) bge 8065702h ;| 08065700 (T) mov r3,0h ;| 08065702 (T) ldrh r1,[r5,6h] ;} Same as above, for height 08065704 (T) lsl r2,r3,10h ;| 08065706 (T) asr r0,r2,10h ;| 08065708 (T) sub r0,r1,r0 ;| 0806570A (T) ldr r6,[sp,10h] ;| 0806570C (T) cmp r6,r0 ;| 0806570E (T) ble 8065718h ;| 08065710 (T) sub r0,r1,r3 ;| 08065712 (T) lsl r0,r0,10h ;| 08065714 (T) lsr r0,r0,10h ;| 08065716 (T) str r0,[sp,10h] ;/ 08065718 (T) lsr r2,r2,10h 0806571A (T) mov r0,r4 ;\ 0806571C (T) mul r0,r3 ;| 0806571E (T) lsl r0,r0,10h ;| 08065720 (T) lsr r0,r0,10h ;| 08065722 (T) ldr r1,[sp,8h] ;} Get the address for the tile 3x3 above-left of the current tile 08065724 (T) add r0,r1,r0 ;| 08065726 (T) lsl r0,r0,1h ;| 08065728 (T) ldr r1,[r5] ;| 0806572A (T) add r1,r1,r0 ;/ 0806572C (T) str r1,[sp,4h] ; Save it for routine 0806572E (T) mov r1,0h ;\ 08065730 (T) ldr r3,[sp,10h] ;| 08065732 (T) cmp r1,r3 ;} If tiles until bottom == 0: Return 08065734 (T) blt 8065738h ;| 08065736 (T) b 806588Eh ;/ ; Row_loop_start: 08065738 (T) ldr r4,[sp,1Ch] ;\ 0806573A (T) ldr r6,=DecompressedForegroundPointer ;| 0806573C (T) add r0,r4,r6 ;| 0806573E (T) ldrh r0,[r0,4h] ;| 08065740 (T) mul r0,r1 ;} XYTile 08065742 (T) lsl r0,r0,10h ;| 08065744 (T) lsr r0,r0,10h ;| 08065746 (T) mov r12,r0 ;/ 08065748 (T) ldr r7,[sp,8h] ; XTile 0806574A (T) add r1,1h ;\ 0806574C (T) str r1,[sp,14h] ;} Save next row for routine 0806574E (T) add r0,r2,1 ;\ 08065750 (T) str r0,[sp,18h] ;} Save next YTile for routine 08065752 (T) ldr r1,[sp,0Ch] ;\ 08065754 (T) cmp r1,0h ;} If tiles until end == 0: skip to next row 08065756 (T) beq 8065854h ;/ 08065758 (T) ldr r3,[sp] ;\ 0806575A (T) lsl r3,r3,0Ch ;} Get right section of VRAM 0806575C (T) mov r8,r3 ;/ 0806575E (T) mov r4,0Fh ;\ 08065760 (T) and r2,r4 ;| 08065762 (T) lsl r2,r2,6h ;} RAM offset of (YTile & 0xF) 08065764 (T) mov r10,r2 ;/ 08065766 (T) ldr r6,=83BE740h ;\ 08065768 (T) mov r9,r6 ;} Base address of generic/special tile parts 0806576A (T) mov r6,r1 ; Tiles until end ; Column_loop_start: 0806576C (T) mov r0,0C0h ;\ 0806576E (T) lsl r0,r0,13h ;| 08065770 (T) mov r1,r8 ;} VRAM base address for map 08065772 (T) add r5,r1,r0 ;/ 08065774 (T) mov r1,1Fh ;\ 08065776 (T) and r1,r7 ;| 08065778 (T) mov r0,10h ;| 0806577A (T) and r0,r1 ;} If XTile on an odd screen: 0806577C (T) cmp r0,0h ;| 0806577E (T) beq 8065784h ;/ 08065780 (T) ldr r5,=6000800h ;\ 08065782 (T) add r5,r8 ;} Use VRAM base address for map + 0x800 08065784 (T) mov r0,0Fh ;\ 08065786 (T) and r0,r1 ;} RAM offset of (XTile & 0xF) 08065788 (T) lsl r1,r0,1h ;/ 0806578A (T) mov r2,r10 ;\ 0806578C (T) add r0,r2,r1 ;| 0806578E (T) lsl r0,r0,1h ;} XYTile VRAM address 08065790 (T) add r5,r5,r0 ;/ 08065792 (T) mov r3,r12 ;\ 08065794 (T) lsl r0,r3,1h ;| 08065796 (T) ldr r4,[sp,4h] ;| 08065798 (T) add r0,r0,r4 ;| 0806579A (T) ldrh r2,[r0] ;| 0806579C (T) mov r0,80h ;} If XYTile has 0x8000: 0806579E (T) lsl r0,r0,8h ;| 080657A0 (T) and r0,r2 ;| 080657A2 (T) cmp r0,0h ;| 080657A4 (T) beq 80657FCh ;/ 080657A6 (T) lsl r0,r2,12h ;\ 080657A8 (T) lsr r2,r0,10h ;| 080657AA (T) mov r0,r2 ;| 080657AC (T) mov r1,1h ;| 080657AE (T) orr r2,r1 ;| 080657B0 (T) mov r1,r2 ;| 080657B2 (T) lsl r0,r0,1h ;| 080657B4 (T) add r0,r9 ;| 080657B6 (T) ldrh r0,[r0] ;| 080657B8 (T) strh r0,[r5] ;| 080657BA (T) add r0,r1,1 ;| 080657BC (T) lsl r0,r0,10h ;| 080657BE (T) lsr r2,r0,10h ;| 080657C0 (T) lsl r1,r1,1h ;| 080657C2 (T) add r1,r9 ;| 080657C4 (T) ldrh r0,[r1] ;} Same as below, but using generic/special tileparts 080657C6 (T) strh r0,[r5,2h] ;| 080657C8 (T) mov r3,r5 ;| 080657CA (T) add r3,40h ;| 080657CC (T) add r1,r2,1 ;| 080657CE (T) lsl r1,r1,10h ;| 080657D0 (T) lsl r2,r2,1h ;| 080657D2 (T) add r2,r9 ;| 080657D4 (T) ldrh r0,[r2] ;| 080657D6 (T) strh r0,[r3] ;| 080657D8 (T) mov r2,r5 ;| 080657DA (T) add r2,42h ;| 080657DC (T) lsr r1,r1,0Fh ;| 080657DE (T) add r1,r9 ;| 080657E0 (T) b 806583Ah ;/ 080657E2 dw 00000h 080657E4 dd 0030000A4h,00300122Eh,00300122Ch,003000084h 080657F4 dd 0083BE740h,006000800h 080657FC (T) lsl r0,r2,12h ;\ Else: 080657FE (T) lsr r2,r0,10h ;| 08065800 (T) mov r1,r2 ;| 08065802 (T) mov r0,1h ;| 08065804 (T) orr r2,r0 ;| 08065806 (T) mov r3,r2 ;} Get address of tile parts for XYTile 08065808 (T) ldr r0,=3004DDCh ;| 0806580A (T) ldr r4,[r0] ;| 0806580C (T) lsl r1,r1,1h ;| 0806580E (T) add r1,r1,r4 ;/ 08065810 (T) ldrh r0,[r1] ;\ 08065812 (T) strh r0,[r5] ;} Load part 1 to VRAM 08065814 (T) add r0,r3,1 ;\ 08065816 (T) lsl r0,r0,10h ;} Get the following tile part XYTile+2 08065818 (T) lsr r2,r0,10h ;/ 0806581A (T) lsl r3,r3,1h ;\ 0806581C (T) add r3,r3,r4 ;} Get address of next tile part XYTile+1 << 1 0806581E (T) ldrh r0,[r3] ;\ 08065820 (T) strh r0,[r5,2h] ;} Load part 2 to VRAM 08065822 (T) mov r3,r5 ;\ 08065824 (T) add r3,40h ;} VRAM address for bottom half of tile 08065826 (T) add r1,r2,1 ;\ 08065828 (T) lsl r1,r1,10h ;} Get the following tile part XYTile+3 0806582A (T) lsl r2,r2,1h ;\ 0806582C (T) add r2,r2,r4 ;} Get address of next tile part 0806582E (T) ldrh r0,[r2] ;\ 08065830 (T) strh r0,[r3] ;} Load part 3 to VRAM 08065832 (T) mov r2,r5 ;\ 08065834 (T) add r2,42h ;} VRAM address for next tile part 08065836 (T) lsr r1,r1,0Fh ;\ 08065838 (T) add r1,r1,r4 ;} Get address of next tile part 0806583A (T) ldrh r0,[r1] ;\ 0806583C (T) strh r0,[r2] ;} Load part 4 to VRAM 0806583E (T) mov r0,r12 ;\ 08065840 (T) add r0,1h ;| 08065842 (T) lsl r0,r0,10h ;} Next XYTile 08065844 (T) lsr r0,r0,10h ;| 08065846 (T) mov r12,r0 ;/ 08065848 (T) sub r6,1h ; Decrement tiles until end 0806584A (T) add r0,r7,1 ;\ 0806584C (T) lsl r0,r0,10h ;} Increment XTile 0806584E (T) lsr r7,r0,10h ;/ 08065850 (T) cmp r6,0h ;\ 08065852 (T) bne 806576Ch ;} End loop after loads all tiles until end ; Column_loop_end 08065854 (T) ldr r1,[sp,14h] ;\ 08065856 (T) ldr r2,[sp,18h] ;| 08065858 (T) lsl r0,r2,10h ;| 0806585A (T) lsr r2,r0,10h ;| 0806585C (T) ldr r3,[sp,10h] ;} End loop after loads all tiles until bottom 0806585E (T) cmp r1,r3 ;| 08065860 (T) bge 8065864h ;| 08065862 (T) b 8065738h ;/ ; Row_loop_end 08065864 (T) b 806588Eh ; Return 08065866 dw 00000h 08065868 dd 003004DDCh 0806586C (T) cmp r2,0h ;\ Else compression hasn't 0x10: 0806586E (T) bne 806588Eh ;} If compression != 0, return 08065870 (T) ldr r4,[sp] ;\ 08065872 (T) lsl r1,r4,0Ch ;| 08065874 (T) mov r0,0C0h ;} Get VRAM base address for map 08065876 (T) lsl r0,r0,13h ;| 08065878 (T) add r5,r1,r0 ;/ 0806587A (T) mov r2,0h ;\ 0806587C (T) mov r3,40h ;| 0806587E (T) ldr r1,=7FFh ;| ;| 08065880 (T) strh r3,[r5] ;| 08065882 (T) add r0,r2,1 ;} Fill map with 0x40 08065884 (T) lsl r0,r0,10h ;| 08065886 (T) lsr r2,r0,10h ;| 08065888 (T) add r5,2h ;| 0806588A (T) cmp r2,r1 ;| 0806588C (T) bls 8065880h ;/ 0806588E (T) add sp,20h ; Deallocate space on the stack 08065890 (T) pop r3-r5 08065892 (T) mov r8,r3 08065894 (T) mov r9,r4 08065896 (T) mov r10,r5 08065898 (T) pop r4-r7 0806589A (T) pop r0 0806589C (T) bx r0 0806589E dw 00000h