0000 ; 2025-01-30 Modified to assemble online at asm80.com 0000 ; Changes: 0000 ; Decimal numbers had trailing "D" removed. 0000 ; 0000 .CPU 8080 0000 ; 0000 ;PROGRAMM TO WRITE INTO CHARACTER MEMORY 0000 ;BY MOSHE M. SHAVIT 0000 ;REV 0 3/6/78 0000 STACK: EQU 1FFH ;STACK POINTER 0000 FAR: EQU 0FFH ;FIRST ADDRESS REGISTER O/P PORT 0000 CHARAD: EQU 8000H ;CHARACTER MEMORY STARTS HERE 0200 .ORG STACK+1 ;WORKING SPACE ABOVE STACK 0200 FA: DS 1 ;FIRST ADDRESS 0201 CURAD: DS 2 ;CURRENT ADDRESS 0203 FIL: DS 2 ;A(FIRST CHARACTER IN LINE) 0205 ; 0100 .ORG 100H ;PROGRAM STARTS HERE 0100 31 FF 01 LXI SP,STACK 0103 21 30 87 LXI H,730H+CHARAD ;LAST LINE, FIRST CHARACTER 0106 22 03 02 SHLD FIL ; 0109 22 01 02 SHLD CURAD ;AND IN CURRENT ADDRESS BUFFER 010C AF XRA A ;CLEAR A 010D D3 FF OUT FAR ;START ADDRESS=0 010F 32 00 02 STA FA ;SAVE IN BUFFER 0112 CD 1B 01 CALL CLEAR ;CLEAR ALL CHAR. MEMORY 0115 CD 2C 01 MAIN: CALL CHARIN ;READ CHARACTER AND PUT IN CHAR. MEMORY 0118 C3 15 01 JMP MAIN ;DO IT AGAIN 011B 06 00 CLEAR: MVI B,0 ;DATA=0 011D 21 00 80 LXI H,CHARAD ;FIRST CHARACTER ADDRESS 0120 11 00 08 LXI D,2048 ;COUNTER 0123 70 CLEAR1: MOV M,B ;CLEAR THAT ADDRESS 0124 1B DCX D ;COUNT 0125 23 INX H ;NEXT ADDRESS 0126 7A MOV A,D ;CHECK 0127 B3 ORA E ; IF DONE 0128 C2 23 01 JNZ CLEAR1 ;NO, CONTINUE 012B C9 RET ;YES, BACK TO CALLER 012C 0E 01 CHARIN: MVI C,1 ;CP/M READ CODE 012E CD 05 00 CALL 5 ;CP/M READ ROUTINE 0131 FE 1A CPI 1AH ;CTL-Z? 0133 CA 00 00 JZ 0 ;RETURN TO CPM IF YES 0136 2A 01 02 LHLD CURAD ;FETCH CURRENT ADDRESS 0139 FE 0D CPI 0DH ;CR? 013B CA 44 01 JZ CRLF ;YES. 013E 77 MOV M,A ;WRITE CHARACTER 013F 23 INX H ;INCREMENT 0140 22 01 02 SHLD CURAD ;STORE IN BUFFER 0143 C9 RET ;BACK TO CALLER 0144 ; 0144 ; 0144 E5 CRLF: PUSH H 0145 D5 PUSH D 0146 C5 PUSH B 0147 F5 PUSH PSW 0148 1E 0A MVI E,0AH 014A 0E 02 MVI C,2 014C CD 05 00 CALL 5 014F F1 POP PSW 0150 C1 POP B 0151 D1 POP D 0152 E1 POP H ;ROUTINE TO ECHO LF 0153 EB XCHG ;SAVE CURRENT ADDRESS IN DE 0154 ; 0154 01 50 00 LXI B,80 ;80 CHARACTERS/LINE 0157 2A 03 02 LHLD FIL ;FETCH FIRST CH. IN LINE ADDRESS 015A 09 DAD B ;HL= A(NEXT LINE'S FIRST CH. ADD.) 015B EB XCHG ;HL= CURRENT ADDR.,DE=A(NEXT LINE FIRST CH. ADDR) 015C 06 00 MVI B,0 ;DATA=0 015E 7C CRLF2: MOV A,H ;MORE SIGNIFICANT CURRENT ADDRESS 015F BA CMP D ;=NEXT LINE FIRST ADDRESS 0160 C2 68 01 JNZ CRLF3 ;NO 0163 7D MOV A,L ;LESS SIGNIFICANT CURRENT ADDRESS 0164 BB CMP E ; IS CURRENT LINE FULL? 0165 CA 6D 01 JZ CRLF4 ;YES 0168 ; 0168 70 CRLF3: MOV M,B ;STORE 0 AT THAT ADDRESS 0169 23 INX H ;INCREMENT ADDRESS 016A C3 5E 01 JMP CRLF2 ;GO CHECK AGAIN 016D 7C CRLF4: MOV A,H ;MORE SIGNIFICANT PART OF ADDRESS 016E E6 07 ANI 7 ;ONLY 3 LESS SIGNIFICANT BITS 0170 FE 07 CPI 7 ;LAST LINE PASSED? 0172 C2 7E 01 JNZ CRLF5 ;NOT YET 0175 7D MOV A,L ;LESS SIGNIFICANT BYTE OF ADDRESS 0176 FE 80 CPI 80H ;ARE WE AT 780H=1920D? 0178 C2 7E 01 JNZ CRLF5 ;NOT YET, SKIP 017B 21 00 80 LXI H,CHARAD ;YES, START WRITING AT BEGINNING OF CH. MEM. 017E 22 03 02 CRLF5: SHLD FIL ;STORE IN FIRST CH. IN LINE BUFFER 0181 22 01 02 SHLD CURAD ;AND IN CURRENT ADDRESS BUFFER 0184 3A 00 02 LDA FA ;FETCH FIRST VISIBLE CHARACTER ADDRESS 0187 C6 05 ADI 5 ;SCROLL 0189 FE 78 CPI 120 ;TOO MUCH? 018B CC 94 01 CZ CRLF0 ;YES 018E 32 00 02 STA FA ;STORE IN FIRST ADDRESS BUFFER 0191 D3 FF OUT FAR ;LOAD REGISTER 0193 C9 RET ;RETURN TO CALLER 0194 ; 0194 ; 0194 AF CRLF0: XRA A ;FIRST ADDRESS=O 0195 C9 RET STACK: 01FF DEFINED AT LINE 12 > USED AT LINE 15 > USED AT LINE 21 FAR: 00FF DEFINED AT LINE 13 > USED AT LINE 26 > USED AT LINE 99 CHARAD: 8000 DEFINED AT LINE 14 > USED AT LINE 22 > USED AT LINE 33 > USED AT LINE 91 FA: 0200 DEFINED AT LINE 16 > USED AT LINE 27 > USED AT LINE 94 > USED AT LINE 98 CURAD: 0201 DEFINED AT LINE 17 > USED AT LINE 24 > USED AT LINE 47 > USED AT LINE 52 > USED AT LINE 93 FIL: 0203 DEFINED AT LINE 18 > USED AT LINE 23 > USED AT LINE 70 > USED AT LINE 92 MAIN: 0115 DEFINED AT LINE 29 > USED AT LINE 30 CLEAR: 011B DEFINED AT LINE 32 > USED AT LINE 28 CLEAR1: 0123 DEFINED AT LINE 35 > USED AT LINE 40 CHARIN: 012C DEFINED AT LINE 43 > USED AT LINE 29 CRLF: 0144 DEFINED AT LINE 56 > USED AT LINE 49 CRLF2: 015E DEFINED AT LINE 74 > USED AT LINE 83 CRLF3: 0168 DEFINED AT LINE 81 > USED AT LINE 76 CRLF4: 016D DEFINED AT LINE 84 > USED AT LINE 79 CRLF5: 017E DEFINED AT LINE 92 > USED AT LINE 87 > USED AT LINE 90 CRLF0: 0194 DEFINED AT LINE 103 > USED AT LINE 97