1 2 3 4 MODULE get_data 5 6 PUBLIC get_bkg_data 7 PUBLIC _get_bkg_data 8 PUBLIC get_win_data 9 PUBLIC _get_win_data 10 PUBLIC get_sprite_data 11 PUBLIC _get_sprite_data 12 13 GLOBAL copy_vram 14 15 SECTION code_driver 16 17 INCLUDE "target/gb/def/gb_globals.def" 18 19 20; void __LIB__ set_bkg_data(uint8_t first_tile, uint8_t nb_tiles, unsigned char *data) __smallc NONBANKED; 21; void __LIB__ set_win_data(uint8_t first_tile, uint8_t nb_tiles, unsigned char *data) __smallc NONBANKED; 22get_bkg_data: 23_get_bkg_data: 24get_win_data: 25_get_win_data: 26 LDH A,(LCDC) 27 BIT 4,A 28 JP NZ,_get_sprite_data 29 30 PUSH BC 31 32 ld hl,sp+4 33 LD C,(HL) ; BC = data 34 INC HL 35 LD B,(HL) 36 INC HL 37 LD E,(HL) ; E = nb_tiles 38 INC HL 39 INC HL 40 LD L,(HL) ; L = first_tile 41 PUSH HL 42 43 XOR A 44 OR E ; Is nb_tiles == 0? 45 JR NZ,set_1 46 LD DE,0x1000 ; DE = nb_tiles = 256 47 JR set_2 48set_1: 49 LD H,0x00 ; HL = nb_tiles 50 LD L,E 51 ADD HL,HL ; HL *= 16 52 ADD HL,HL 53 ADD HL,HL 54 ADD HL,HL 55 LD D,H ; DE = nb_tiles 56 LD E,L 57set_2: 58 POP HL ; HL = first_tile 59 LD A,L 60 RLCA ; Sign extend (patterns have signed numbers) 61 SBC A 62 LD H,A 63 ADD HL,HL ; HL *= 16 64 ADD HL,HL 65 ADD HL,HL 66 ADD HL,HL 67 68 PUSH BC 69 LD BC,0x9000 70 ADD HL,BC 71 POP BC 72 73set_3: ; Special version of '.copy_vram' 74 BIT 3,H ; Bigger than 0x9800 75 JR Z,set_4 76 BIT 4,H 77 JR Z,set_4 78 RES 4,H ; Switch to 0x8800 79set_4: 80 LDH A,(STAT) 81 AND 0x02 82 JR NZ,set_4 83 84 LD A,(HL+) 85 LD (BC),A 86 INC BC 87 DEC DE 88 LD A,D 89 OR E 90 JR NZ,set_3 91 92 POP BC 93 RET 94 95get_sprite_data: 96_get_sprite_data: 97 PUSH BC 98 99 ld hl,sp+4 100 LD C,(HL) ; BC = data 101 INC HL 102 LD B,(HL) 103 INC HL 104 LD E,(HL) ; E = nb_tiles 105 INC HL 106 INC HL 107 LD L,(HL) ; L = first_tile 108 PUSH HL 109 110 XOR A 111 OR E ; Is nb_tiles == 0? 112 JR NZ,spr_1 113 LD DE,0x1000 ; DE = nb_tiles = 256 114 JR spr_2 115spr_1: 116 LD H,0x00 ; HL = nb_tiles 117 LD L,E 118 ADD HL,HL ; HL *= 16 119 ADD HL,HL 120 ADD HL,HL 121 ADD HL,HL 122 LD D,H ; DE = nb_tiles 123 LD E,L 124spr_2: 125 POP HL ; HL = first_tile 126 LD L,A 127 ADD HL,HL ; HL *= 16 128 ADD HL,HL 129 ADD HL,HL 130 ADD HL,HL 131 132 PUSH BC 133 LD BC,0x8000 134 ADD HL,BC 135 LD B,H 136 LD C,L 137 POP HL 138 139 CALL copy_vram 140 141 POP BC 142 RET 143