|  | Routines | 
| Prev: 5F22 | Up: Map | Next: 6010 | 
| 
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 | 5F80 | LD HL,$4080 | The first screen address is 4080 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. | |||||||||||||||||||
| 5F83 | LD ($5F02),HL | |||||||||||||||||||||
| 5F86 | LD HL,$5F10 | HL=Background address data buffer. | ||||||||||||||||||||
| 
Each background has 4 "sets" of data, so set a counter of 4.
 | ||||||||||||||||||||||
| 5F89 | LD B,$04 | B=Initialise block counter. | ||||||||||||||||||||
| 
The block processing loop.
 | ||||||||||||||||||||||
| Create_Background_Loop | 5F8B | 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.
 | ||||||||||||||||||||||
| 5F8C | LD E,(HL) | Pick up the next background UDG data block and store it at Background_UDG_Data. | ||||||||||||||||||||
| 5F8D | INC HL | |||||||||||||||||||||
| 5F8E | LD D,(HL) | |||||||||||||||||||||
| 5F8F | INC HL | |||||||||||||||||||||
| 5F90 | LD ($5F08),DE | |||||||||||||||||||||
| 5F94 | LD E,(HL) | Fetch the address of the next positioning data block and store it in DE. | ||||||||||||||||||||
| 5F95 | INC HL | |||||||||||||||||||||
| 5F96 | LD D,(HL) | |||||||||||||||||||||
| 5F97 | INC HL | |||||||||||||||||||||
| 5F98 | 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.
 | ||||||||||||||||||||||
| 5F99 | LD HL,($5F02) | HL=The current screen address from Background_Screen_Address. | ||||||||||||||||||||
| 5F9C | EX DE,HL | Switch DE and HL so DE now holds the screen address and HL holds the start of the positioning data block. | ||||||||||||||||||||
| 5F9D | CALL Background_Fetch_Next | Call Background_Fetch_Next. | ||||||||||||||||||||
| 
fgg
 | ||||||||||||||||||||||
| 5FA0 | LD HL,($5F02) | HL=The current screen address from Background_Screen_Address. | ||||||||||||||||||||
| 5FA3 | LD BC,$0080 | Add 80 to HL. | ||||||||||||||||||||
| 5FA6 | ADD HL,BC | |||||||||||||||||||||
| 5FA7 | BIT 0,H | Set the zero flag if we're at a screen section boundary. Skip forward to Background_No_Boundary if not. | ||||||||||||||||||||
| 5FA9 | JR Z,Background_No_Boundary | |||||||||||||||||||||
| 5FAB | LD A,$07 | Add 07 to the MSB of HL to handle moving between screen sections. | ||||||||||||||||||||
| 5FAD | ADD A,H | |||||||||||||||||||||
| 5FAE | LD H,A | |||||||||||||||||||||
| Background_No_Boundary | 5FAF | LD ($5F02),HL | Stash HL at Background_Screen_Address. | |||||||||||||||||||
| 5FB2 | POP HL | Restores HL and the counter from the stack. | ||||||||||||||||||||
| 5FB3 | POP BC | |||||||||||||||||||||
| 5FB4 | 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.
 | ||||||||||||||||||||||
| 5FB6 | 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. | ||||||||||||||||||||
| 5FB7 | INC HL | |||||||||||||||||||||
| 5FB8 | LD D,(HL) | |||||||||||||||||||||
| 5FB9 | EX DE,HL | |||||||||||||||||||||
| 5FBA | CALL Background_Attributes | |||||||||||||||||||||
| 5FBD | RET | Return. | ||||||||||||||||||||
| 
Fetch the next positioning data and check for the terminator.
 | ||||||||||||||||||||||
| Background_Fetch_Next | 5FBE | LD A,(HL) | Fetch the next positioning data byte. | |||||||||||||||||||
| 5FBF | INC HL | Increase HL by one to point to the next byte. | ||||||||||||||||||||
| 5FC0 | CP (HL) | Check if this byte is the same as the previous positioning data byte value. | ||||||||||||||||||||
| 5FC1 | JR NZ,Background_Process | Jump to Background_Process if the values are different. | ||||||||||||||||||||
| 5FC3 | AND A | Double zero is the terminator, so jump to Background_Return to return if this is detected. | ||||||||||||||||||||
| 5FC4 | JR Z,Background_Return | |||||||||||||||||||||
| 
Process the UDG data.
 | ||||||||||||||||||||||
| Background_Process | 5FC6 | BIT 7,A | Check if d7 is set, reset it regardless. | |||||||||||||||||||
| 5FC8 | RES 7,A | |||||||||||||||||||||
| 5FCA | PUSH AF | Push the new positioning data value onto the stack. | ||||||||||||||||||||
| 5FCB | EXX | Exchange the registers. | ||||||||||||||||||||
| 
Point HL to the base address of the currently referenced UDG.
 | ||||||||||||||||||||||
| 5FCC | LD C,A | Set the LSB of BC to A, and the MSB to 00. | ||||||||||||||||||||
| 5FCD | LD B,$00 | |||||||||||||||||||||
| 5FCF | LD L,C | Copy the same value into HL. | ||||||||||||||||||||
| 5FD0 | LD H,B | |||||||||||||||||||||
| 5FD1 | ADD HL,BC | * 8. | ||||||||||||||||||||
| 5FD2 | ADD HL,HL | |||||||||||||||||||||
| 5FD3 | ADD HL,HL | |||||||||||||||||||||
| 5FD4 | LD BC,($5F08) | BC=Fetch the address of the start of the UDG data block from Background_UDG_Data. | ||||||||||||||||||||
| 5FD8 | ADD HL,BC | Choose the referenced UDG and store this at Background_Current_UDG. | ||||||||||||||||||||
| 5FD9 | LD ($5F04),HL | |||||||||||||||||||||
| 5FDC | EXX | Restore the registers. | ||||||||||||||||||||
| 5FDD | CALL Copy_UDG | Call Copy_UDG. | ||||||||||||||||||||
| 5FE0 | 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.
 | ||||||||||||||||||||||
| 5FE3 | POP AF | Fetch the position data off the stack, as this is AF this also restores the d7 check flag. | ||||||||||||||||||||
| 5FE4 | 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.
 | ||||||||||||||||||||||
| 5FE6 | LD B,(HL) | Pick up the position data from HL and store it in B to use as a counter. | ||||||||||||||||||||
| 5FE7 | INC HL | Increment HL to point to the next item of position data. | ||||||||||||||||||||
| 5FE8 | DEC B | Decrease the counter by one. | ||||||||||||||||||||
| Background_Repeat_Copy | 5FE9 | CALL Copy_UDG | Call Copy_UDG. | |||||||||||||||||||
| 5FEC | CALL Background_Next_Screen_Block | Call Background_Next_Screen_Block. | ||||||||||||||||||||
| 5FEF | DJNZ Background_Repeat_Copy | Decrease counter by one and loop back to Background_Repeat_Copy until the counter is zero. | ||||||||||||||||||||
| 5FF1 | JR Background_Fetch_Next | Jump back round to Background_Fetch_Next. | ||||||||||||||||||||
| 
Used to "just return" after flag checking operations.
 | ||||||||||||||||||||||
| Background_Return | 5FF3 | RET | Return. | |||||||||||||||||||
| 
Copy a single UDG 8x8 block to the screen.
 | ||||||||||||||||||||||
| Copy_UDG | 5FF4 | PUSH DE | Push DE (current screen location) and HL (next position data location) onto the stack. | |||||||||||||||||||
| 5FF5 | PUSH HL | |||||||||||||||||||||
| 5FF6 | LD A,$08 | Set a counter of 08 for the number of lines in a character block. | ||||||||||||||||||||
| 5FF8 | LD HL,($5F04) | HL=the currently targeted UDG address. | ||||||||||||||||||||
| Copy_UDG_Loop | 5FFB | EX AF,AF' | Stash the counter for later. | |||||||||||||||||||
| 5FFC | LD A,(HL) | Copy the UDG data held by HL into the screen buffer currently pointed to by DE. | ||||||||||||||||||||
| 5FFD | LD (DE),A | |||||||||||||||||||||
| 5FFE | INC HL | Increment HL by one to point to the next line of the UDG data. | ||||||||||||||||||||
| 5FFF | INC D | Increment the MSB of DE by one to point to the line directly below in the screen buffer. | ||||||||||||||||||||
| 6000 | EX AF,AF' | Restore the counter. | ||||||||||||||||||||
| 6001 | DEC A | Decrease the counter by one. | ||||||||||||||||||||
| 6002 | JR NZ,Copy_UDG_Loop | Loop back to Copy_UDG_Loop until the counter is zero. | ||||||||||||||||||||
| 6004 | POP HL | Restore the original HL and DE values for screen location and position data from the stack. | ||||||||||||||||||||
| 6005 | POP DE | |||||||||||||||||||||
| 6006 | RET | Return. | ||||||||||||||||||||
| 
Handles moving from one screen location block to the next.
 | ||||||||||||||||||||||
| Background_Next_Screen_Block | 6007 | INC DE | Increase DE by 1. | |||||||||||||||||||
| 6008 | 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. | ||||||||||||||||||||
| 600A | RET Z | |||||||||||||||||||||
| 600B | LD A,$07 | Add 07 to D, so that DE points to the next block down. | ||||||||||||||||||||
| 600D | ADD A,D | |||||||||||||||||||||
| 600E | LD D,A | |||||||||||||||||||||
| 600F | RET | Return. | ||||||||||||||||||||
| Prev: 5F22 | Up: Map | Next: 6010 |