| Routines

21E1: THE 'COLOUR ITEM' ROUTINES

This set of routines can be readily divided into two parts: i. The embedded colour item' handler. ii. The 'colour system variable' handler. i. Embedded colour items are handled by calling PRINT_A_1 as required. A loop is entered to handle each item in turn. The entry point is at CO_TEMP_2.
CO_TEMP_1 | 21E1 | RST $20 | Consider the next character in the BASIC statement.
This entry point is used by the routine at CLASS_09.
CO_TEMP_2 | 21E2 | CALL CO_TEMP_3 | Jump forward to see if the present code represents an embedded 'temporary' colour item. Return carry set if not a colour item.
| 21E5 | RET C
| 21E6 | RST $18 | Fetch the present character.
| 21E7 | CP "," | Jump back if it is either a ',' or a ';'; otherwise there has been an error.
| 21E9 | JR Z,CO_TEMP_1
| 21EB | CP ";"
| 21ED | JR Z,CO_TEMP_1
| 21EF | JP REPORT_C | Exit via 'report C'.
This entry point is used by the routine at PR_ITEM_1.
CO_TEMP_3 | 21F2 | CP $D9 | Return with the carry flag set if the code is not in the range +D9 to +DE (INK to OVER).
| 21F4 | RET C
| 21F5 | CP $DF
| 21F7 | CCF
| 21F8 | RET C
| 21F9 | PUSH AF | The colour item code is preserved whilst CH-ADD is advanced to address the parameter that follows it.
| 21FA | RST $20
| 21FB | POP AF
This entry point is used by the routine at CLASS_07. The colour item code and the parameter are now 'printed' by calling PRINT_A_1 on two occasions.
CO_TEMP_4 | 21FC | SUB $C9 | The token range (+D9 to +DE) is reduced to the control character range (+10 to +15).
| 21FE | PUSH AF | The control character code is preserved whilst the parameter is moved to the calculator stack.
| 21FF | CALL CLASS_06
| 2202 | POP AF
| 2203 | AND A | A return is made at this point if syntax is being checked.
| 2204 | CALL UNSTACK_Z
| 2207 | PUSH AF | The control character code is preserved whilst the parameter is moved to the D register.
| 2208 | CALL FIND_INT1
| 220B | LD D,A
| 220C | POP AF
| 220D | RST $10 | The control character is sent out.
| 220E | LD A,D | Then the parameter is fetched and sent out before returning.
| 220F | RST $10
| 2210 | RET
This entry point is used by the routine at PO_TV_2. ii. The colour system variables - ATTR-T, MASK-T and P-FLAG - are altered as required. On entry the control character code is in the A register and the parameter is in the D register. Note that all changes are to the 'temporary' system variables.
CO_TEMP_5 | 2211 | SUB $11 | Reduce the range and jump forward with INK and PAPER.
| 2213 | ADC A,$00
| 2215 | JR Z,CO_TEMP_7
| 2217 | SUB $02 | Reduce the range once again and jump forward with FLASH and BRIGHT.
| 2219 | ADC A,$00
| 221B | JR Z,CO_TEMP_C
The colour control code will now be +01 for INVERSE and +02 for OVER and the system variable P-FLAG is altered accordingly.
| 221D | CP $01 | Prepare to jump with OVER.
| 221F | LD A,D | Fetch the parameter.
| 2220 | LD B,$01 | Prepare the mask for OVER.
| 2222 | JR NZ,CO_TEMP_6 | Now jump.
| 2224 | RLCA | Bit 2 of the A register is to be reset for INVERSE 0 and set for INVERSE 1; the mask is to have bit 2 set.
| 2225 | RLCA
| 2226 | LD B,$04
CO_TEMP_6 | 2228 | LD C,A | Save the A register whilst the range is tested.
| 2229 | LD A,D | The correct range for INVERSE and OVER is only '0-1'.
| 222A | CP $02
| 222C | JR NC,REPORT_K
| 222E | LD A,C | Restore the A register.
| 222F | LD HL,$5C91 | It is P-FLAG that is to be changed.
| 2232 | JR CO_CHANGE | Exit via CO_CHANGE and alter P-FLAG using B as a mask, i.e. bit 0 for OVER and bit 2 for INVERSE.
PAPER and INK are dealt with by the following routine. On entry the carry flag is set for INK.
CO_TEMP_7 | 2234 | LD A,D | Fetch the parameter.
| 2235 | LD B,$07 | Prepare the mask for INK.
| 2237 | JR C,CO_TEMP_8 | Jump forward with INK.
| 2239 | RLCA | Multiply the parameter for PAPER by eight.
| 223A | RLCA
| 223B | RLCA
| 223C | LD B,$38 | Prepare the mask for PAPER.
CO_TEMP_8 | 223E | LD C,A | Save the parameter in the C register whilst the range of the parameter is tested.
| 223F | LD A,D | Fetch the original value.
| 2240 | CP $0A | Only allow PAPER/INK a range of '0' to '9'.
| 2242 | JR C,CO_TEMP_9
This entry point is used by the routine at BORDER. Report K - Invalid colour.
REPORT_K | 2244 | RST $08 | Call the error handling routine.
| 2245 | DEFB $13
Continue to handle PAPER and INK.
CO_TEMP_9 | 2246 | LD HL,$5C8F | Prepare to alter ATTR-T, MASK-T and P-FLAG.
| 2249 | CP $08 | Jump forward with PAPER/INK '0' to '7'.
| 224B | JR C,CO_TEMP_B
| 224D | LD A,(HL) | Fetch the current value of ATTR-T and use it unchanged, by jumping forward, with PAPER/INK '8'.
| 224E | JR Z,CO_TEMP_A
| 2250 | OR B | But for PAPER/INK '9' the PAPER and INK colours have to be black and white.
| 2251 | CPL
| 2252 | AND $24
| 2254 | JR Z,CO_TEMP_A | Jump for black INK/PAPER, but continue for white INK/PAPER.
| 2256 | LD A,B
CO_TEMP_A | 2257 | LD C,A | Move the value to the C register.
The mask (B) and the value (C) are now used to change ATTR-T.
CO_TEMP_B | 2258 | LD A,C | Move the value.
| 2259 | CALL CO_CHANGE | Now change ATTR-T as needed.
Next MASK-T is considered.
| 225C | LD A,$07 | The bits of MASK-T are set only when using PAPER/INK '8' or '9'.
| 225E | CP D
| 225F | SBC A,A
| 2260 | CALL CO_CHANGE | Now change MASK-T as needed.
Next P-FLAG is considered.
| 2263 | RLCA | The appropriate mask is built up in the B register in order to change bits 4 and 6 as necessary.
| 2264 | RLCA
| 2265 | AND $50
| 2267 | LD B,A
| 2268 | LD A,$08 | The bits of P-FLAG are set only when using PAPER/INK '9'. Continue into CO_CHANGE to manipulate P-FLAG.
| 226A | CP D
| 226B | SBC A,A
The following subroutine is used to 'impress' upon a system variable the 'nature' of the bits in the A register. The B register holds a mask that shows which bits are to be 'copied over' from A to (HL).
CO_CHANGE | 226C | XOR (HL) | The bits, specified by the mask in the B register, are changed in the value and the result goes to form the system variable.
| 226D | AND B
| 226E | XOR (HL)
| 226F | LD (HL),A
| 2270 | INC HL | Move on to address the next system variable.
| 2271 | LD A,B | Return with the mask in the A register.
| 2272 | RET
FLASH and BRIGHT are handled by the following routine.
CO_TEMP_C | 2273 | SBC A,A | The zero flag will be set for BRIGHT.
| 2274 | LD A,D | The parameter is fetched and rotated.
| 2275 | RRCA
| 2276 | LD B,$80 | Prepare the mask for FLASH.
| 2278 | JR NZ,CO_TEMP_D | Jump forward with FLASH.
| 227A | RRCA | Rotate an extra time and prepare the mask for BRIGHT.
| 227B | LD B,$40
CO_TEMP_D | 227D | LD C,A | Save the value in the C register.
| 227E | LD A,D | Fetch the parameter and test its range; only '0', '1' and '8' are allowable.
| 227F | CP $08
| 2281 | JR Z,CO_TEMP_E
| 2283 | CP $02
| 2285 | JR NC,REPORT_K
The system variable ATTR-T can now be altered.
CO_TEMP_E | 2287 | LD A,C | Fetch the value.
| 2288 | LD HL,$5C8F | This is ATTR-T.
| 228B | CALL CO_CHANGE | Now change the system variable.
The value in MASK-T is now considered.
| 228E | LD A,C | The value is fetched anew.
| 228F | RRCA | The set bit of FLASH/BRIGHT '8' (bit 3) is moved to bit 7 (for FLASH) or bit 6 (for BRIGHT).
| 2290 | RRCA
| 2291 | RRCA
| 2292 | JR CO_CHANGE | Exit via CO_CHANGE.