;;; $CB8E: X-ray setup stage 4 - build x-ray BG2 tilemap, read BG2 tilemap - 1st screen ;;;
{
; Calls $84:831A to load item x-ray blocks
$91:CB8E 08 PHP
$91:CB8F C2 30 REP #$30
$91:CB91 AD 1F 09 LDA $091F [$7E:091F] ;\
$91:CB94 18 CLC ;|
$91:CB95 6D 15 09 ADC $0915 [$7E:0915] ;|
$91:CB98 29 F0 00 AND #$00F0 ;|
$91:CB9B 0A ASL A ;|
$91:CB9C 0A ASL A ;|
$91:CB9D 85 18 STA $18 [$7E:0018] ;|
$91:CB9F AD 1D 09 LDA $091D [$7E:091D] ;|
$91:CBA2 18 CLC ;|
$91:CBA3 6D 11 09 ADC $0911 [$7E:0911] ;|
$91:CBA6 29 F0 00 AND #$00F0 ;|
$91:CBA9 4A LSR A ;} $18 (BG1 row origin block index) =
$91:CBAA 4A LSR A ;} (([BG1 Y offset] + [layer 1 Y position]) / 8 & 1Eh) * 20h (20h tiles per tilemap row, rounded down to top-left of 16x16 block)
$91:CBAB 4A LSR A ;} + (([BG1 X offset] + [layer 1 X position]) / 8 & 1Eh) (1 byte per tilemap column, rounded down to top-left of 16x16 block)
$91:CBAC 18 CLC ;} + ([BG1 X offset] + [layer 1 X position]) / 100h % 2 * 400h (400h tiles per tilemap screen)
$91:CBAD 65 18 ADC $18 [$7E:0018] ;|
$91:CBAF 85 18 STA $18 [$7E:0018] ;|
$91:CBB1 AD 1D 09 LDA $091D [$7E:091D] ;|
$91:CBB4 18 CLC ;|
$91:CBB5 6D 11 09 ADC $0911 [$7E:0911] ;|
$91:CBB8 29 00 01 AND #$0100 ;|
$91:CBBB 0A ASL A ;|
$91:CBBC 0A ASL A ;|
$91:CBBD 18 CLC ;|
$91:CBBE 65 18 ADC $18 [$7E:0018] ;|
$91:CBC0 85 18 STA $18 [$7E:0018] ;/
$91:CBC2 64 16 STZ $16 [$7E:0016] ; $16 = 0 (x-ray BG2 tilemap index)
$91:CBC4 A9 10 00 LDA #$0010 ;\
$91:CBC7 85 14 STA $14 [$7E:0014] ;} $14 = 10h (row loop counter)
; LOOP_COPY_BG1_ROW
$91:CBC9 A9 10 00 LDA #$0010 ;\
$91:CBCC 85 12 STA $12 [$7E:0012] ;} $12 = 10h (column loop counter)
$91:CBCE A5 18 LDA $18 [$7E:0018] ;\
$91:CBD0 29 E0 07 AND #$07E0 ;} $1A = [BG1 row origin block index] & 7E0h (BG1 row origin block row index)
$91:CBD3 85 1A STA $1A [$7E:001A] ;/
$91:CBD5 A5 18 LDA $18 [$7E:0018] ;\
$91:CBD7 29 1F 00 AND #$001F ;} $1C = [BG1 row origin block index] & 1Fh (BG1 row origin block column index)
$91:CBDA 85 1C STA $1C [$7E:001C] ;/
$91:CBDC 64 1E STZ $1E [$7E:001E] ; $1E = 0 (BG1 block X offset)
; LOOP_COPY_BG1_COLUMN
$91:CBDE A5 1C LDA $1C [$7E:001C] ;\
$91:CBE0 18 CLC ;|
$91:CBE1 65 1E ADC $1E [$7E:001E] ;} If [BG1 row origin block column index] + [BG1 block X offset] >= 20h (reached end of tilemap screen):
$91:CBE3 C9 20 00 CMP #$0020 ;|
$91:CBE6 30 12 BMI $12 [$CBFA] ;/
$91:CBE8 A5 1A LDA $1A [$7E:001A] ;\
$91:CBEA 18 CLC ;|
$91:CBEB 69 00 04 ADC #$0400 ;} BG1 row origin block row index = [BG1 row origin block row index] + 400h & 7E0h (switch tilemap screens)
$91:CBEE 29 E0 07 AND #$07E0 ;|
$91:CBF1 85 1A STA $1A [$7E:001A] ;/
$91:CBF3 A9 00 00 LDA #$0000 ;\
$91:CBF6 85 1C STA $1C [$7E:001C] ;} BG1 row origin block column index = 0
$91:CBF8 85 1E STA $1E [$7E:001E] ; BG1 block X offset = 0
$91:CBFA A5 1A LDA $1A [$7E:001A] ;\
$91:CBFC 18 CLC ;|
$91:CBFD 65 1C ADC $1C [$7E:001C] ;|
$91:CBFF 65 1E ADC $1E [$7E:001E] ;} X = ([BG1 row origin block row index] + [BG1 row origin block column index] + [BG1 block X offset]) * 2
$91:CC01 0A ASL A ;|
$91:CC02 AA TAX ;/
$91:CC03 BF 00 60 7E LDA $7E6000,x[$7E:650C];\
$91:CC07 48 PHA ;} $7E:4000 + [x-ray BG2 tilemap index] = [$7E:6000 + [X]]
$91:CC08 BF 02 60 7E LDA $7E6002,x[$7E:650E]; \
$91:CC0C 48 PHA ; } $7E:4000 + [x-ray BG2 tilemap index] + 2 = [$7E:6000 + [X] + 2]
$91:CC0D BF 40 60 7E LDA $7E6040,x[$7E:654C]; \
$91:CC11 48 PHA ; } $7E:4000 + [x-ray BG2 tilemap index] + 40h = [$7E:6000 + [X] + 40h]
$91:CC12 BF 42 60 7E LDA $7E6042,x[$7E:654E]; \
$91:CC16 A6 16 LDX $16 [$7E:0016] ; } $7E:4000 + [x-ray BG2 tilemap index] + 42h = [$7E:6000 + [X] + 42h]
$91:CC18 9F 42 40 7E STA $7E4042,x[$7E:4042]; /
$91:CC1C 68 PLA ; |
$91:CC1D 9F 40 40 7E STA $7E4040,x[$7E:4040]; /
$91:CC21 68 PLA ; |
$91:CC22 9F 02 40 7E STA $7E4002,x[$7E:4002]; /
$91:CC26 68 PLA ;|
$91:CC27 9F 00 40 7E STA $7E4000,x[$7E:4000];/
$91:CC2B A5 16 LDA $16 [$7E:0016] ;\
$91:CC2D 18 CLC ;|
$91:CC2E 69 04 00 ADC #$0004 ;} X-ray BG2 tilemap index += 4 (move right two tilemap columns)
$91:CC31 85 16 STA $16 [$7E:0016] ;/
$91:CC33 A5 1E LDA $1E [$7E:001E] ;\
$91:CC35 69 02 00 ADC #$0002 ;} BG1 block X offset += 2 (move right two tilemap columns)
$91:CC38 85 1E STA $1E [$7E:001E] ;/
$91:CC3A C6 12 DEC $12 [$7E:0012] ; Decrement $12
$91:CC3C D0 A0 BNE $A0 [$CBDE] ; If [$12] != 0: go to LOOP_COPY_BG1_COLUMN
$91:CC3E 20 F1 CC JSR $CCF1 [$91:CCF1] ; Copy last BG1 block of row to x-ray BG2 tilemap
$91:CC41 A5 18 LDA $18 [$7E:0018] ;\
$91:CC43 29 00 04 AND #$0400 ;|
$91:CC46 85 20 STA $20 [$7E:0020] ;|
$91:CC48 A5 18 LDA $18 [$7E:0018] ;|
$91:CC4A 18 CLC ;} BG1 row origin block index = ([BG1 row origin block index] & 400h)
$91:CC4B 69 40 00 ADC #$0040 ;} + ([BG1 row origin block index] + 40h & 3FFh) (move down two tilemap rows)
$91:CC4E 29 FF 03 AND #$03FF ;|
$91:CC51 18 CLC ;|
$91:CC52 65 20 ADC $20 [$7E:0020] ;|
$91:CC54 85 18 STA $18 [$7E:0018] ;/
$91:CC56 A5 16 LDA $16 [$7E:0016] ;\
$91:CC58 18 CLC ;|
$91:CC59 69 40 00 ADC #$0040 ;} X-ray BG2 tilemap index += 40h (move down two tilemap rows)
$91:CC5C 85 16 STA $16 [$7E:0016] ;/
$91:CC5E C6 14 DEC $14 [$7E:0014] ; Decrement $14
$91:CC60 F0 03 BEQ $03 [$CC65] ; If [$14] != 0:
$91:CC62 4C C9 CB JMP $CBC9 [$91:CBC9] ; Go to LOOP_COPY_BG1_ROW
$91:CC65 AD 15 09 LDA $0915 [$7E:0915] ;\
$91:CC68 4A LSR A ;|
$91:CC69 4A LSR A ;|
$91:CC6A 4A LSR A ;|
$91:CC6B 4A LSR A ;|
$91:CC6C EB XBA ;|
$91:CC6D 0D A5 07 ORA $07A5 [$7E:07A5] ;|
$91:CC70 8D 02 42 STA $4202 ;|
$91:CC73 AD 11 09 LDA $0911 [$7E:0911] ;} $22 = [layer 1 Y position] / 10h * [room width in blocks] + [layer 1 X position] / 10h (block index)
$91:CC76 4A LSR A ;|
$91:CC77 4A LSR A ;|
$91:CC78 4A LSR A ;|
$91:CC79 4A LSR A ;|
$91:CC7A 18 CLC ;|
$91:CC7B 6D 16 42 ADC $4216 ;|
$91:CC7E 85 22 STA $22 [$7E:0022] ;/
$91:CC80 64 16 STZ $16 [$7E:0016] ; $16 = 0 (x-ray BG2 tilemap index)
$91:CC82 A9 10 00 LDA #$0010 ;\
$91:CC85 85 14 STA $14 [$7E:0014] ;} $14 = 10h (row loop counter)
; LOOP_REVEALED_ROW
$91:CC87 20 42 CD JSR $CD42 [$91:CD42] ; Load right half of revealed 2xN block
$91:CC8A A9 10 00 LDA #$0010 ;\
$91:CC8D 85 12 STA $12 [$7E:0012] ;} $12 = 10h (column loop counter)
$91:CC8F A5 22 LDA $22 [$7E:0022] ;\
$91:CC91 85 24 STA $24 [$7E:0024] ;} $24 = (block index)
; LOOP_REVEALED_COLUMN
$91:CC93 20 BE CD JSR $CDBE [$91:CDBE] ; Load revealed block
$91:CC96 C6 12 DEC $12 [$7E:0012] ; Decrement $12
$91:CC98 D0 F9 BNE $F9 [$CC93] ; If [$12] != 0: go to LOOP_REVEALED_COLUMN
$91:CC9A A5 16 LDA $16 [$7E:0016] ;\
$91:CC9C 48 PHA ;} A = [$16]
$91:CC9D 18 CLC ;\
$91:CC9E 69 C0 07 ADC #$07C0 ;} $16 += 7C0h
$91:CCA1 85 16 STA $16 [$7E:0016] ;/
$91:CCA3 20 BE CD JSR $CDBE [$91:CDBE] ; Load revealed block
$91:CCA6 68 PLA ;\
$91:CCA7 18 CLC ;|
$91:CCA8 69 40 00 ADC #$0040 ;} $16 = [A] + 40h
$91:CCAB 85 16 STA $16 [$7E:0016] ;/
$91:CCAD A5 22 LDA $22 [$7E:0022] ;\
$91:CCAF 18 CLC ;|
$91:CCB0 6D A5 07 ADC $07A5 [$7E:07A5] ;} (Block index) += [room width]
$91:CCB3 85 22 STA $22 [$7E:0022] ;/
$91:CCB5 C6 14 DEC $14 [$7E:0014] ; Decrement $14
$91:CCB7 D0 CE BNE $CE [$CC87] ; If [$14] != 0: go to LOOP_REVEALED_ROW
$91:CCB9 22 1A 83 84 JSL $84831A[$84:831A] ; Load item x-ray blocks
$91:CCBD AE 60 03 LDX $0360 [$7E:0360] ;\
$91:CCC0 A5 59 LDA $59 [$7E:0059] ;|
$91:CCC2 29 FC 00 AND #$00FC ;|
$91:CCC5 EB XBA ;|
$91:CCC6 9D 40 03 STA $0340,x[$7E:0340] ;|
$91:CCC9 A9 81 00 LDA #$0081 ;|
$91:CCCC 9D 42 03 STA $0342,x[$7E:0342] ;|
$91:CCCF A9 39 00 LDA #$0039 ;|
$91:CCD2 9D 43 03 STA $0343,x[$7E:0343] ;|
$91:CCD5 A9 00 50 LDA #$5000 ;} Queue transfer of 800h bytes from VRAM BG2 tilemap base to $7E:5000
$91:CCD8 9D 44 03 STA $0344,x[$7E:0344] ;|
$91:CCDB A9 7E 00 LDA #$007E ;|
$91:CCDE 9D 46 03 STA $0346,x[$7E:0346] ;|
$91:CCE1 A9 00 08 LDA #$0800 ;|
$91:CCE4 9D 47 03 STA $0347,x[$7E:0347] ;|
$91:CCE7 8A TXA ;|
$91:CCE8 18 CLC ;|
$91:CCE9 69 09 00 ADC #$0009 ;|
$91:CCEC 8D 60 03 STA $0360 [$7E:0360] ;/
$91:CCEF 28 PLP
$91:CCF0 6B RTL
}