-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathTERM.ASM
125 lines (96 loc) · 2.37 KB
/
TERM.ASM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
; Very Dumb Terminal for RC2014 with CP/M
; Copyright (c) 2018 by Marco Maccaferri
;
; Compile on CP/M with:
;
; C:ASM TERM
; C:LOAD TERM
;
; Invoke with:
;
; TERM [/E] [/L]
;
; /E - Enable local echo
; /L - Enable LF after CR
AUXST: EQU 0E956H
AUXRB: EQU 0E966H
AUXWB: EQU 0E9E0H
CR: EQU 13
LF: EQU 10
ORG 0100H
LXI H,80H ; parse command line flags
MOV C,M
INR C
L4: INX H
DCR C
JZ L5
MOV A,M
CPI '/'
JNZ L4
INX H
DCR C
JZ L5
MOV A,M
ANI 5FH ; uppercase
CPI 'E'
JZ L6
CPI 'L'
JZ L7
JMP L4
L6: LDA ECHO
XRI 01H
STA ECHO
JMP L4
L7: LDA CRLF
XRI 01H
STA CRLF
JMP L4
L5: LXI D,SIGNON
MVI C,09H
CALL 0005H
L1: CALL AUXST ; check if byte available
ORA A
JZ L2
CALL AUXRB ; receive byte
MVI C,02H ; display on console
MOV E,A
CALL 0005H
L2: MVI C,06H ; get character from console
MVI E,0FFH
CALL 0005H
ORA A ; nothing ready, loop
JZ L1
CPI 03H ; CTRL-C exit
JZ EXIT
CALL AUXWBE ; write to remove and console
CPI CR
JNZ L1
LDA CRLF ; check if LF should be appended
ORA A
JZ L1
MVI A,LF ; send LF
CALL AUXWBE
JMP L1
EXIT:
RET
AUXWBE:
PUSH PSW
MOV C,A
CALL AUXWB
LDA ECHO
ORA A
JZ L3
POP PSW
PUSH PSW
MVI C,02H
MOV E,A
CALL 0005H
L3: POP PSW
RET
SIGNON: DB 12
DB 'Very Dumb Terminal', 13, 10
DB 'Press CTRL-C to exit', 13, 10
DB 13, 10, '$'
CRLF DB 0
ECHO DB 0
END