|  | Routines | 
| Prev: 24354 | Up: Map | Next: 24592 | 
| 
Used by the routine at Change_Background.
 | ||||||||||||||||||||||
| 
Each background uses 4 sets of data "pairs" and a single reference for attribute data (handled separately at Background_Attributes). For example, background 1 uses;  
 | ||||||||||||||||||||||
| Create_Background | 24448 | LD HL,16512 | The first screen address is 16512 which allows space for the "header". This is the top of character block 4. This is then stored in the buffer at Background_Screen_Address. | |||||||||||||||||||
| 24451 | LD (24322),HL | |||||||||||||||||||||
| 24454 | LD HL,24336 | HL=Background address data buffer. | ||||||||||||||||||||
| 
Each background has 4 "sets" of data, so set a counter of 4.
 | ||||||||||||||||||||||
| 24457 | LD B,4 | B=Initialise block counter. | ||||||||||||||||||||
| 
The block processing loop.
 | ||||||||||||||||||||||
| Create_Background_Loop | 24459 | PUSH BC | Push the counter onto the stack. | |||||||||||||||||||
| 
Each block contains two address references, one is for UDG data, and one is for positioning data.
 | ||||||||||||||||||||||
| 24460 | LD E,(HL) | Pick up the next background UDG data block and store it at Background_UDG_Data. | ||||||||||||||||||||
| 24461 | INC HL | |||||||||||||||||||||
| 24462 | LD D,(HL) | |||||||||||||||||||||
| 24463 | INC HL | |||||||||||||||||||||
| 24464 | LD (24328),DE | |||||||||||||||||||||
| 24468 | LD E,(HL) | Fetch the address of the next positioning data block and store it in DE. | ||||||||||||||||||||
| 24469 | INC HL | |||||||||||||||||||||
| 24470 | LD D,(HL) | |||||||||||||||||||||
| 24471 | INC HL | |||||||||||||||||||||
| 24472 | PUSH HL | Push the position of the address data buffer (pointing to the start of the next block) onto the stack. | ||||||||||||||||||||
| 
Set up the current screen position, the positioning data and the UDG data block.
 | ||||||||||||||||||||||
| 24473 | LD HL,(24322) | HL=The current screen address from Background_Screen_Address. | ||||||||||||||||||||
| 24476 | EX DE,HL | Switch DE and HL so DE now holds the screen address and HL holds the start of the positioning data block. | ||||||||||||||||||||
| 24477 | CALL Background_Fetch_Next | Call Background_Fetch_Next. | ||||||||||||||||||||
| 
fgg
 | ||||||||||||||||||||||
| 24480 | LD HL,(24322) | HL=The current screen address from Background_Screen_Address. | ||||||||||||||||||||
| 24483 | LD BC,128 | Add 128 to HL. | ||||||||||||||||||||
| 24486 | ADD HL,BC | |||||||||||||||||||||
| 24487 | BIT 0,H | Set the zero flag if we're at a screen section boundary. Skip forward to Background_No_Boundary if not. | ||||||||||||||||||||
| 24489 | JR Z,Background_No_Boundary | |||||||||||||||||||||
| 24491 | LD A,7 | Add 7 to the MSB of HL to handle moving between screen sections. | ||||||||||||||||||||
| 24493 | ADD A,H | |||||||||||||||||||||
| 24494 | LD H,A | |||||||||||||||||||||
| Background_No_Boundary | 24495 | LD (24322),HL | Stash HL at Background_Screen_Address. | |||||||||||||||||||
| 24498 | POP HL | Restores HL and the counter from the stack. | ||||||||||||||||||||
| 24499 | POP BC | |||||||||||||||||||||
| 24500 | DJNZ Create_Background_Loop | Decrease counter by one and loop back to Create_Background_Loop until counter is zero. | ||||||||||||||||||||
| 
Finally, now write the attributes and return.
 | ||||||||||||||||||||||
| 24502 | LD E,(HL) | Fetch the last address from the Background address data buffer which is the attributes data and call Background_Attributes to process and display in the attributes buffer. | ||||||||||||||||||||
| 24503 | INC HL | |||||||||||||||||||||
| 24504 | LD D,(HL) | |||||||||||||||||||||
| 24505 | EX DE,HL | |||||||||||||||||||||
| 24506 | CALL Background_Attributes | |||||||||||||||||||||
| 24509 | RET | Return. | ||||||||||||||||||||
| 
Fetch the next positioning data and check for the terminator.
 | ||||||||||||||||||||||
| Background_Fetch_Next | 24510 | LD A,(HL) | Fetch the next positioning data byte. | |||||||||||||||||||
| 24511 | INC HL | Increase HL by one to point to the next byte. | ||||||||||||||||||||
| 24512 | CP (HL) | Check if this byte is the same as the previous positioning data byte value. | ||||||||||||||||||||
| 24513 | JR NZ,Background_Process | Jump to Background_Process if the values are different. | ||||||||||||||||||||
| 24515 | AND A | Double zero is the terminator, so jump to Background_Return to return if this is detected. | ||||||||||||||||||||
| 24516 | JR Z,Background_Return | |||||||||||||||||||||
| 
Process the UDG data.
 | ||||||||||||||||||||||
| Background_Process | 24518 | BIT 7,A | Check if d7 is set, reset it regardless. | |||||||||||||||||||
| 24520 | RES 7,A | |||||||||||||||||||||
| 24522 | PUSH AF | Push the new positioning data value onto the stack. | ||||||||||||||||||||
| 24523 | EXX | Exchange the registers. | ||||||||||||||||||||
| 
Point HL to the base address of the currently referenced UDG.
 | ||||||||||||||||||||||
| 24524 | LD C,A | Set the LSB of BC to A, and the MSB to 0. | ||||||||||||||||||||
| 24525 | LD B,0 | |||||||||||||||||||||
| 24527 | LD L,C | Copy the same value into HL. | ||||||||||||||||||||
| 24528 | LD H,B | |||||||||||||||||||||
| 24529 | ADD HL,BC | * 8. | ||||||||||||||||||||
| 24530 | ADD HL,HL | |||||||||||||||||||||
| 24531 | ADD HL,HL | |||||||||||||||||||||
| 24532 | LD BC,(24328) | BC=Fetch the address of the start of the UDG data block from Background_UDG_Data. | ||||||||||||||||||||
| 24536 | ADD HL,BC | Choose the referenced UDG and store this at Background_Current_UDG. | ||||||||||||||||||||
| 24537 | LD (24324),HL | |||||||||||||||||||||
| 24540 | EXX | Restore the registers. | ||||||||||||||||||||
| 24541 | CALL Copy_UDG | Call Copy_UDG. | ||||||||||||||||||||
| 24544 | CALL Background_Next_Screen_Block | Call Background_Next_Screen_Block. | ||||||||||||||||||||
| 
Check if the flag for repetition is set, if so - action it. If not, jump and work on the next position.
 | ||||||||||||||||||||||
| 24547 | POP AF | Fetch the position data off the stack, as this is AF this also restores the d7 check flag. | ||||||||||||||||||||
| 24548 | JR Z,Background_Fetch_Next | Jump back to Background_Fetch_Next unless the bit was set. | ||||||||||||||||||||
| 
Using the following position data byte as a counter, copy the current byte this number of times.
 | ||||||||||||||||||||||
| 24550 | LD B,(HL) | Pick up the position data from HL and store it in B to use as a counter. | ||||||||||||||||||||
| 24551 | INC HL | Increment HL to point to the next item of position data. | ||||||||||||||||||||
| 24552 | DEC B | Decrease the counter by one. | ||||||||||||||||||||
| Background_Repeat_Copy | 24553 | CALL Copy_UDG | Call Copy_UDG. | |||||||||||||||||||
| 24556 | CALL Background_Next_Screen_Block | Call Background_Next_Screen_Block. | ||||||||||||||||||||
| 24559 | DJNZ Background_Repeat_Copy | Decrease counter by one and loop back to Background_Repeat_Copy until the counter is zero. | ||||||||||||||||||||
| 24561 | JR Background_Fetch_Next | Jump back round to Background_Fetch_Next. | ||||||||||||||||||||
| 
Used to "just return" after flag checking operations.
 | ||||||||||||||||||||||
| Background_Return | 24563 | RET | Return. | |||||||||||||||||||
| 
Copy a single UDG 8x8 block to the screen.
 | ||||||||||||||||||||||
| Copy_UDG | 24564 | PUSH DE | Push DE (current screen location) and HL (next position data location) onto the stack. | |||||||||||||||||||
| 24565 | PUSH HL | |||||||||||||||||||||
| 24566 | LD A,8 | Set a counter of 8 for the number of lines in a character block. | ||||||||||||||||||||
| 24568 | LD HL,(24324) | HL=the currently targeted UDG address. | ||||||||||||||||||||
| Copy_UDG_Loop | 24571 | EX AF,AF' | Stash the counter for later. | |||||||||||||||||||
| 24572 | LD A,(HL) | Copy the UDG data held by HL into the screen buffer currently pointed to by DE. | ||||||||||||||||||||
| 24573 | LD (DE),A | |||||||||||||||||||||
| 24574 | INC HL | Increment HL by one to point to the next line of the UDG data. | ||||||||||||||||||||
| 24575 | INC D | Increment the MSB of DE by one to point to the line directly below in the screen buffer. | ||||||||||||||||||||
| 24576 | EX AF,AF' | Restore the counter. | ||||||||||||||||||||
| 24577 | DEC A | Decrease the counter by one. | ||||||||||||||||||||
| 24578 | JR NZ,Copy_UDG_Loop | Loop back to Copy_UDG_Loop until the counter is zero. | ||||||||||||||||||||
| 24580 | POP HL | Restore the original HL and DE values for screen location and position data from the stack. | ||||||||||||||||||||
| 24581 | POP DE | |||||||||||||||||||||
| 24582 | RET | Return. | ||||||||||||||||||||
| 
Handles moving from one screen location block to the next.
 | ||||||||||||||||||||||
| Background_Next_Screen_Block | 24583 | INC DE | Increase DE by 1. | |||||||||||||||||||
| 24584 | BIT 0,D | Return if d0 is not set on the MSB of DE. This checks to see if we're at a screen boundary. | ||||||||||||||||||||
| 24586 | RET Z | |||||||||||||||||||||
| 24587 | LD A,7 | Add 7 to D, so that DE points to the next block down. | ||||||||||||||||||||
| 24589 | ADD A,D | |||||||||||||||||||||
| 24590 | LD D,A | |||||||||||||||||||||
| 24591 | RET | Return. | ||||||||||||||||||||
| Prev: 24354 | Up: Map | Next: 24592 |