Specifications
CONSTRUCTION
0168 47 MOV B,A ;Save in B
0169 1A LDAX D ;Read video RAM
016A E6 0F ANI 0FH
016C B0 ORA B
016D 12 STAX D ;store in video RAM (only alter left
nibble)
016E 23 INX H
016F 1B DCX D
0170 C3 2B 01 JMP NXTLIN ;JUMP TO NEXT LINE
0173 46 LOAD_RT: MOV B,M ;NIBBLE IN B
0174 1A LDAX D ;Get from video ram
0175 E6 F0 ANI F0H ;save left nibble
0177 B0 ORA B
0178 12 STAX D
0179 23 INX H
017A 7E MOV A,M ;get next nibble
017B 17 RAL
017C 17 RAL
017D 17 RAL
017E 17 RAL
017F 47 MOV B,A ;save in B, left part
0180 23 INX H
0181 7E MOV A,M
0182 B0 ORA B ;now a fullbyte
0183 13 INX D
0184 12 STAX D
0185 1B DCX D
0186 23 INX H
0187 C3 2B 01 JMP NXTLIN ;NEXT LINE
;CHARACTER NO. SUBROUTINE
;A CONTAINS CHARACTER NUMBER IN THE ROW
;a RETURNS SLOT NUMBER. 1125H STORES 0 OR 1 FLAG
;ACCORDING AS CHARACTER NUMBER GIVES EVEN OR ODD.
018A C5 CH_NUMB:PUSH B
018B 47 MOV B,A
018C 1F RAR ;to divide by 2
018D 4F MOV C,A ;store in C
018E 3E 00 MVI A,0
0190 17 RAL
0191 32 25 11 STA NIB_FL ;Store in nibble flag
0194 79 MOV A,C
0195 80 ADD B
0196 C1 POP B
0197 C9 RET
;CONTROL CHARACTERS CHECKING ROUTINE
0198 FE 20 CL_CH_CK: CPI 20H ;space code?
019A C2 A3 01 JNZ P1
019D CD 22 02 CALL INC_SP ;
01A0 37 STC ;carry flag cleared to
01A1 3F CMC ;indicate main program that it was
control code
01A2 C9 RET ;ret
01A3 FE 08 P1: CPI 08H ;BACKSPACE CODE
01A5 C2 AE 01 JNZ P2
01A8 CD 48 02 CALL DECR_SP ;
01AB 37 STC
01AC 3F CMC
01AD C9 RET
01AE FE 0A P2: CPI 0AH
01B0 C2 C2 01 JNZ P3
01B3 3A 28 11 LDA 1128H
01B6 3C INR A
01B7 FE 10 CPI 10H
01B9 D2 BF 01 JNC P4
01BC 32 28 11 STA 1128H
01BF C3 C9 01 P4: JMP P5
01C2 FE 0C P3: CPI 0CH ;(CTRL-L =CURSOR LINE LEFT)
01C4 C2 CF 01 JNZ P6
01C7 3E 00 MVI A,0
01C9 32 27 11 P5: STA 1127H
01CC 37 STC
01CD 3F CMC
01CE C9 RET
01CF FE 0B P6: CPI 0BH (CURSOR UP control-K)
01D1 C2 E1 01 JNZ P7
01D4 3A 28 11 LDA 1128H
01D7 3D DCR A
01D8 DA DE 01 JC P8
01DB 32 28 11 STA 1128H
01DE 37 P8: STC
01DF 3F CMC
01E0 C9 RET
01E1 FE 09 P7: CPI 09H ;Ctrl-I cursor goes down
01E3 C2 F5 01 JNZ P10
01E6 3A 28 11 LDA 1128H
01E9 3C INR A
01EA FE 10 CPI 10H ;not greater than 16 rows
01EC D2 F2 01 JNC P9
01EF 32 28 11 STA 1128H ;Stores 11, but the left L is not useful,
so becomes 01
01F2 37 P9: STC
01F3 3F CMC
01F4 C9 RET
01F5 37 P10: STC ;Not any control code!
01F6 C9 RET
;CURSOR ROUTINE
01F7 0E 00 CUR_ROUT: MVI C,00
01F9 CD 07 02 CALL CUR_FILL
01FC CD 12 04 CALL KBD
01FF F5 PUSH PSW
0200 0E FF MVI C,FFH
0202 CD 07 02 CALL CUR_FILL ;Erases cursor after key-entry
0205 F1 POP PSW
0206 C9 RET
;CURSOR FILL ROUTINE:
0207 3A 28 11 CUR_FILL: LDA ROW_NUMB
020A 17 RAL
020B 17 RAL
020C 17 RAL
020D E6 F0 ANI F0H
020F 47 MOV B,A
0210 3E 0C MVI A,0CH ;UNDERLINE,13TH LINE
0212 B0 ORA B
0213 32 00 18 STA 1800H ;SAVE IN VIDEO LATCH
0216 16 14 MVI D,14H
0218 3A 27 11 LDA CHAR_POS ;
021B CD 29 11 CALL CHAR_NO
021E 5F MOV E,A ;SAVE CHAR. NO. IN e
021F 79 MOV A,C
0220 12 STAX D ;STORE UNDERLINE PIXELS
0221 C9 RET
;INCREMENT SPACE ROUTINE
0222 3A 27 11 INC_SP: LDA 1127H ;Character no.
0225 FE 2A CPI 2AH ;(42 characters/row)
0227 D2 34 02 JNC Q1
022A 3C INR A ;Increment char.no.
022B 32 27 11 STA 1127H ;store it
022E CD F7 01 S1: CALL CUR_ROUT
0231 37 STC ;carry flag to indicate main program
0232 3F CMC ;cleared and return
0233 C9 RET
0234 3A 28 11 Q1: LDA 1128H ;to increment row number
0237 FE 0F CPI 0FH
0239 D2 40 02 JNC Q2
023C 3C INR A
023D 32 28 11 STA ROW_NUMB
0240 3E 00 Q2: MVI A,00H
0242 32 27 11 STA 1127H ;clear character number -
;first character, next row
0245 C3 2E 02 JMP S1
;DECREMENT BACKSPACE
0248 3A 27 11 DECR_SP: LDA 1127H ;load char.no.
024B 3D DCR A ;decrement
024C DA 5E 02 JC Q4 ;check not first character
024F 32 27 11 STA 1127H ;store one less
0252 CD 61 02 CALL ERASE ;erase all 13 rows
0255 3A 27 11 LDA 1127H
0258 3D DCR A
0259 32 27 11 STA 1127H
025C 37 STC
025D C9 RET
025E 37 Q4: STC
025F 3F CMC
0260 C9 RET
;ERASE CHARACTER:
0261 3A 29 11 ERASE: LDA CHAR_NUMB ;find char.slot No.
0264 CD 29 11 CALL CHAR_NO
0267 5F MOV E,A
0268 16 14 MVI D,14H ;video RAM high addr.
026A 3E FF MVI A,FFH ;ONE LESS THAN ZERO
026C 32 26 11 STA LINE_NUMB
026F 3A 26 11 NXTL: LDA LINE_NUMB
0272 3C INR A ;line no. increases from 0
0273 32 26 11 STA LINE_NUMB
0276 3A 28 11 LDA ROW_NUMB ;row no. is output on left nibble
0279 17 RAL
027A 17 RAL
027B 17 RAL
027C 17 RAL
027D E6 F0 ANI F0H
027F 47 MOV B,A
0280 3A 26 11 LDA LINE_NUMB
0283 B0 ORA B ;line no. is output on right nibble
0284 32 00 18 STA 1800H ;IN VIDEO LATCH
0287 3A 26 11 LDA LINE_NUMB
028A FE 0D CPI 0DH ;is it the 14th line?
028C C2 90 02 JNZ STORE1 ;if between 0 and 13, save
028F C9 RET
0290 3A 25 11 STORE1: LDA NIB_FL ;check for odd or even slot position
0293 1F RAR
142