Routines |
Prev: 62665 | Up: Map | Next: 63537 |
Used by the routine at Messaging_Girl.
|
||||||||||
Print40ColumnText | 63434 | LD HL,63538 | Write BufferSmallFont to *UDG. | |||||||
63437 | LD (23675),HL | |||||||||
Print40ColumnText_Loop | 63440 | LD A,B | Jump to Process40ColumnText if BC is not zero. | |||||||
63441 | OR C | |||||||||
63442 | JR NZ,Process40ColumnText | |||||||||
63444 | LD HL,63537 | HL=FlagShiftLetter. | ||||||||
63447 | BIT 0,(HL) | Return if bit 0 of *HL is not set. | ||||||||
63449 | RET Z | |||||||||
63450 | LD A,144 | Print the UDG buffer to the screen. | ||||||||
63452 | RST 16 | |||||||||
63453 | RES 0,(HL) | Reset bit 0 of *HL. | ||||||||
63455 | RET | Return. | ||||||||
Process the current letter.
|
||||||||||
Process40ColumnText | 63456 | LD A,(DE) | Fetch the current letter from the pointer in *DE, and store it in A. | |||||||
63457 | SUB 32 | Subtract 32 from A to "normalise" it. ASCII characters start from 32 ("SPACE") so this makes them 0-based. | ||||||||
63459 | JR NC,Process40ColumnCharacter | Jump to Process40ColumnCharacter if A is higher than zero. | ||||||||
Where A is less than zero, this means a control character needs to be actioned (e.g. setting INK/ PAPER/ PRINT AT/ etc).
|
||||||||||
63461 | ADD A,32 | Add 32 to the character to restore the "proper" ASCII value. | ||||||||
63463 | PUSH DE | Stash the string pointer on the stack. | ||||||||
63464 | RST 16 | Action the current ASCII character. | ||||||||
63465 | POP DE | Restore the string pointer from the stack. | ||||||||
63466 | INC DE | Move onto the next letter in the string. | ||||||||
63467 | DEC BC | Decrease the string length counter by one. | ||||||||
63468 | JR Print40ColumnText_Loop | Jump back to Print40ColumnText_Loop. | ||||||||
We have a character we want to process, the UDGs for the characters begin at SmallCustomFont.
|
||||||||||
Process40ColumnCharacter | 63470 | INC A | Increment A by one. | |||||||
63471 | PUSH DE | Stash the string pointer and string length on the stack. | ||||||||
63472 | PUSH BC | |||||||||
Locate the UDG character for the current letter.
|
||||||||||
63473 | LD HL,63538 | HL=BufferSmallFont. | ||||||||
63476 | LD DE,8 | HL+=0008. | ||||||||
LocateSmallCharacter_Loop | 63479 | ADD HL,DE | ||||||||
63480 | DEC A | Decrease A by one. | ||||||||
63481 | JR NZ,LocateSmallCharacter_Loop | Jump to LocateSmallCharacter_Loop until A is zero. | ||||||||
63483 | LD DE,63538 | DE=BufferSmallFont. | ||||||||
The UDGs are still 8 bytes each, just for each only the first 4 bits are used of the 8 total bits.
|
||||||||||
63486 | LD B,8 | Set a UDG counter of 8. | ||||||||
SmallCharacterCopy_Loop | 63488 | LD A,(63537) | Test bit 0 of *FlagShiftLetter... | |||||||
63491 | BIT 0,A | |||||||||
63493 | LD A,(HL) | Fetch the UDG letter byte and store it in A. | ||||||||
63494 | JR Z,WriteSmallCharacterToBuffer | Jump to WriteSmallCharacterToBuffer if bit 0 of *FlagShiftLetter was not set. | ||||||||
Shift the letter from the left-hand side of the UDG buffer over to the right-hand side.
|
||||||||||
63496 | LD C,4 | Shift the bits of the current letter right four bits (move the letter from being on the left-hand side over to the right-hand side). | ||||||||
ShiftToRightHandSide_Loop | 63498 | SRL A | ||||||||
63500 | DEC C | |||||||||
63501 | JR NZ,ShiftToRightHandSide_Loop | |||||||||
63503 | LD C,A | Merge the current byte in BufferSmallFont together with the shifted letter in C. The result is stored in A. | ||||||||
63504 | LD A,(DE) | |||||||||
63505 | OR C | |||||||||
WriteSmallCharacterToBuffer | 63506 | LD (DE),A | Write A to the buffer. | |||||||
63507 | INC HL | Move onto the next byte of the UDG letter. | ||||||||
63508 | INC DE | Move onto the next byte in the buffer. | ||||||||
63509 | DJNZ SmallCharacterCopy_Loop | Decrease the UDG byte counter by one and loop back to SmallCharacterCopy_Loop until the counter is zero. | ||||||||
This toggle is the "magic" - it handles the left/ right flow of the code.
|
||||||||||
63511 | LD A,(63537) | Flip bit 0 of *FlagShiftLetter. | ||||||||
63514 | XOR %00000001 | |||||||||
63516 | LD (63537),A | |||||||||
63519 | POP BC | Restore the string length and string pointer from the stack. | ||||||||
63520 | POP DE | |||||||||
63521 | INC DE | Move onto the next letter in the string. | ||||||||
63522 | DEC BC | Decrease the string length counter by one. | ||||||||
63523 | LD A,(63537) | Jump to Print40ColumnText_Loop if bit 0 of *FlagShiftLetter is set. | ||||||||
63526 | BIT 0,A | |||||||||
63528 | JR NZ,Print40ColumnText_Loop | |||||||||
Else, we can now print the UDG buffer at BufferSmallFont to the screen.
|
||||||||||
63530 | PUSH DE | Stash the string pointer on the stack. | ||||||||
63531 | LD A,144 | Print the UDG buffer to the screen. | ||||||||
63533 | RST 16 | |||||||||
63534 | POP DE | Restore the string pointer from the stack. | ||||||||
63535 | JR Print40ColumnText_Loop | Jump to Print40ColumnText_Loop. |
Prev: 62665 | Up: Map | Next: 63537 |