-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathREADFILE.ASM
More file actions
195 lines (178 loc) · 3.38 KB
/
READFILE.ASM
File metadata and controls
195 lines (178 loc) · 3.38 KB
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
; -----------------------------------------------------------
; FASM (& SCC) TEST -ASM- FILE (for Win32 and TRDOS 386)
; -----------------------------------------------------------
; 23/03/2026
; Last Update: 07/04/2026
_main:
PUSH EBP
MOV EBP,ESP
LEA EBX,[EBP+12]
MOV EAX,[EBX]
CMP EAX,1
JA short _main_@
MOV EAX,USAGE
PUSH EAX
call _puts
;POP EAX
JMP short _main_retn ; usage
_main_@:
MOV DWORD [_argcs],EAX ; argc; (value)
LEA EBX,[EBP+8]
MOV EAX,[EBX]
MOV DWORD [_argvs],EAX ; argv; (address)
MOV EAX,128 ; LINESIZE
PUSH EAX
MOV EAX,1
PUSH EAX
CALL _OS_calloc
ADD ESP,8
MOV DWORD [_line],EAX
CALL _readfile
_main_retn:
MOV ESP,EBP
POP EBP
RETN
USAGE:
db "FASM (& SCC) Test File for TRDOS 386 v2",13,10
db "Erdogan Tan - 2026",13,10
db 13,10
db "Usage: READFILE FILENAME.TXT"
NEWLINE:
db 13,10,0
_argcs: dd 0
_argvs: dd 0
_line: dd 0
_output:
dd -1
_input: dd 0
_readfile:
PUSH EBP
MOV EBP,ESP
;ADD ESP,-4
XOR EAX,EAX
;MOV [EBP-4],EAX ; 0
PUSH EAX ; 0
;MOV DWORD [_output],-1 ; stdout
; getarg(1, line, LINESIZE, argcs, argvs)
LEA EBX,[EBP-4]
MOV EAX,[EBX]
INC EAX ; 1
MOV [EBX],EAX
PUSH EAX
MOV EAX,[_line]
PUSH EAX
MOV EAX,128 ; LINESIZE
PUSH EAX
MOV EAX,[_argcs] ; argc (value)
PUSH EAX
MOV EAX,[_argvs] ; argv[] (address)
PUSH EAX
CALL _getarg
ADD ESP,20
MOV EBX,EAX
MOV EAX,-1 ; EOF
CALL __ne ; != EOF
OR EAX,EAX
JZ short _readfile_rtn ; EOF
CALL _openfile
CALL _readf
_readfile_rtn:
MOV ESP,EBP
POP EBP
RETN
_openfile:
PUSH EBP
MOV EBP,ESP
MOV EAX,-1 ; EOF;
MOV [_input],EAX ; input = EOF;
; input = mustopen(pline, "r");
MOV EAX,[_line]
PUSH EAX
MOV EAX,OPEN_R ; 'r'
PUSH EAX
CALL _mustopen
;ADD ESP,8
MOV [_input],EAX ; ! file handle + 1
MOV ESP,EBP
POP EBP
retn
_mustopen:
; mustopen(fn, mode) char *fn, *mode; {
PUSH EBP
MOV EBP,ESP
;*ADD ESP,-4 ; int fd; ; TRDOS 386
;LEA EAX,[EBP-4]
;PUSH EAX
LEA EBX,[EBP+12] ; file name
MOV EAX,[EBX]
PUSH EAX ; fn
LEA EBX,[EBP+8] ; open mode
MOV EAX,[EBX]
PUSH EAX ; mode
CALL _OS_fopen
ADD ESP,8
;POP EBX
;*LEA EBX,[EBP-4] ; fd = fopen(fn, mode)
;*MOV [EBX],EAX ; file handle + 1 (for TRDOS 386)
OR EAX,EAX
JZ short _mo_error
; error (file not found or access err)
_mo_retn:
;LEA EBX,[EBP-4] ; fd
;MOV EAX,[EBX] ; return fd
; eax = file handle + 1
MOV ESP,EBP
POP EBP
RETN
_mo_error: ; puts("open error on ");
MOV EAX,OPEN_ERR
PUSH EAX
CALL _puts
;ADD ESP,4
POP EAX
LEA EBX,[EBP+12] ; file name
MOV EAX,[EBX]
PUSH EAX
CALL _puts ; puts(fn);
;ADD ESP,4
POP EAX
MOV EAX,NEWLINE
PUSH EAX
CALL _puts ; puts(NEWLINE); (putc(NEWLINE);
;ADD ESP,4
POP EAX
MOV EAX,7 ; exit(ERRCODE);
PUSH EAX
CALL _OS_exit
;ADD ESP,4
MOV ESP,EBP
POP EBP
RETN
OPEN_ERR: DB "open error on ", 0
OPEN_R: DB "r",0
_readf:
PUSH EBP
MOV EBP,ESP
_read_loop:
MOV EAX,[_input] ; file handle + 1 (TRDOS 386)
PUSH EAX
CALL _OS_fgetc ; _fgetc
ADD ESP,4
;OR EAX,EAX
; 05/04/2026
INC EAX ; -1 -> 0 (EOF = -1)
JZ short _readf_rtn
DEC EAX
PUSH EAX ; character (in AL)
;CALL _OS_putc ; _putc
;ADD ESP,4
MOV EAX,-1 ; STDOUT for TRDOS 386
PUSH EAX
CALL _OS_fputc ; _fputc
ADD ESP,8
; read/write next char if not EOF
JMP short _read_loop
_readf_rtn:
MOV ESP,EBP
POP EBP
RETN