-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuzd.asm
352 lines (284 loc) · 7.51 KB
/
uzd.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
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
;; Programa reaguoja i perduodamus parametrus
;; isveda pagalba, jei nera nurodyti reikiami parametrai
;; source failas skaitomas dalimis
;; destination failas rasomas dalimis
;; jei destination failas jau egzistuoja, jis yra isvalomas
;; jei source failas nenurodytas - skaito iš stdin iki tuščios naujos eilutės
;; galima nurodyti daugiau nei vieną source failą - juos sujungia
.model small
;.stack 100H
JUMPS ; auto generate inverted condition jmp on far jumps
;*************************Pakeista******************************
;.code
BSeg SEGMENT
;***************************************************************
;*******************Pridėta*************************************
ORG 100h
ASSUME ds:BSeg, cs:BSeg, ss:BSeg
;***************************************************************
Pos MACRO a,b
push ax
push bx
mov ax, a
ToAscii ah,b
ToAscii al,b+2
pop bx
pop ax
ENDM
ToAscii MACRO a,b
push ax
push bx
mov al, a
xor ah, ah
mov bl, 10h
div bl
mov b, al
mov b+1, ah
ToAscii2 [b]
ToAscii2 [b+1]
pop bx
pop ax
ENDM
ToAscii2 MACRO var
LOCAL @@letter, @@exit
cmp var, 09h
ja @@letter
add var, 30h
jmp @@exit
@@letter:
add var, 37h
@@exit:
ENDM
Clr MACRO buffer, bSize
LOCAL @@start, @@exit
push Si
xor Si, Si
@@start:
cmp si, bSize
je @@exit
mov buffer[si],20h
inc si
jmp @@start
@@exit:
pop Si
ENDM
START:
;mov ax, @data
;mov es, ax ; es kad galetume naudot stosb funkcija: Store AL at address ES:(E)DI
mov si, 81h ; programos paleidimo parametrai rasomi segmente es pradedant 129 (arba 81h) baitu
call skip_spaces
mov al, byte ptr ds:[si] ; nuskaityti pirma parametro simboli
cmp al, 13 ; jei nera parametru
je help ; tai isvesti pagalba
;; ar reikia isvesti pagalba
mov ax, word ptr ds:[si]
cmp ax, 3F2Fh ; jei nuskaityta "/?" - 3F = '?'; 2F = '/'
je help ; rastas "/?", vadinasi reikia isvesti pagalba
;; destination failo pavadinimas
lea di, destF
call read_filename ; perkelti is parametro i eilute
cmp byte ptr es:[destF], '$' ; jei nieko nenuskaite
je help
;; source failo pavadinimas
lea di, sourceF
call read_filename ; perkelti is parametro i eilute
push ds si
;mov ax, @data
;mov ds, ax
;; rasymui
mov dx, offset destF ; ikelti i dx destF - failo pavadinima
mov ah, 3ch ; isvalo/sukuria faila - komandos kodas
mov cx, 0 ; normal - no attributes
int 21h ; INT 21h / AH= 3Ch - create or truncate file.
; Jei nebus isvalytas - tai perrasines senaji,
; t.y. jei pries tai buves failas ilgesnis - like simboliai isliks.
jc err_destination
mov ah, 3dh ; atidaro faila - komandos kodas
mov al, 1 ; rasymui
int 21h ; INT 21h / AH= 3Dh - open existing file.
jc err_destination
mov destFHandle, ax ; issaugom handle
jmp startConverting
readSourceFile:
pop si ds
;; source failo pavadinimas
lea di, sourceF
call read_filename ; perkelti is parametro i eilute
push ds si
;mov ax, @data
;mov ds, ax
cmp byte ptr ds:[sourceF], '$' ; jei nieko nenuskaite
jne startConverting
jmp closeF
startConverting:
;; atidarom
cmp byte ptr ds:[sourceF], '$' ; jei nieko nenuskaite
jne source_from_file
mov sourceFHandle, 0
jmp skaitom
source_from_file:
mov dx, offset sourceF ; failo pavadinimas
mov ah, 3dh ; atidaro faila - komandos kodas
mov al, 0 ; 0 - reading, 1-writing, 2-abu
int 21h ; INT 21h / AH= 3Dh - open existing file
jc err_source ; CF set on error AX = error code.
mov sourceFHandle, ax ; issaugojam filehandle
skaitom:
mov bx, sourceFHandle
mov dx, offset buffer ; address of buffer in dx
mov cx, 20 ; kiek baitu nuskaitysim
mov ah, 3fh ; function 3Fh - read from file
int 21h
mov cx, ax ; bytes actually read
cmp ax, 0 ; jei nenuskaite
jne _6 ; tai ne pabaiga
mov bx, sourceFHandle ; pabaiga skaitomo failo
mov ah, 3eh ; uzdaryti
int 21h
jmp readSourceFile ; atidaryti kita skaitoma faila, jei yra
_6:
mov si, offset buffer ; skaitoma is cia
mov bx, destFHandle ; rasoma i cia
cmp sourceFHandle, 0
jne _7
cmp byte ptr ds:[si], 13
je closeF
_7:
atrenka:
lodsb ; Load byte at address DS:(E)SI into AL
call replace
loop atrenka
jmp skaitom
help:
;mov ax, @data
;mov ds, ax
mov dx, offset apie
mov ah, 09h
int 21h
jmp _end
closeF:
;; uzdaryti dest
mov di, 1050
save:
sub di, 50
clr outbuff, 40
pos di, outbuff
mov outbuff+39, 0Dh
mov outbuff+40, 0Ah
mov bx, 00h
save_1:
cmp bx, 25
ja save_3
cmp word ptr ds:[letter+bx], di ;<------------------------------------- WHYYYYY
jae save_2
inc bx
jmp save_1
save_2:
mov outbuff+6+bx, 'x'
inc bx
jmp save_1
save_3:
mov bx, 0
lea dx, outbuff
mov cx, 40
mov bx, destFHandle
mov ah, 40h ; INT 21h / AH= 40h - write to file
int 21h
cmp di, 01h
ja save
lea dx, letterstr
mov cx, 33
mov bx, destFHandle
mov ah, 40h ; INT 21h / AH= 40h - write to file
int 21h
mov ah, 3eh ; uzdaryti
mov bx, destFHandle
int 21h
_end:
mov ax, 4c00h
int 21h
err_source:
;mov ax, @data
;mov ds, ax
mov dx, offset err_s
mov ah, 09h
int 21h
mov dx, offset sourceF
int 21h
mov ax, 4c01h
int 21h
err_destination:
;mov ax, @data
;mov ds, ax
mov dx, offset err_d
mov ah, 09h
int 21h
mov dx, offset destF
int 21h
mov ax, 4c02h
int 21h
;; procedures
skip_spaces PROC near
skip_spaces_loop:
cmp byte ptr ds:[si], ' '
jne skip_spaces_end
inc si
jmp skip_spaces_loop
skip_spaces_end:
ret
skip_spaces ENDP
read_filename PROC near
push ax
call skip_spaces
read_filename_start:
cmp byte ptr ds:[si], 13 ; jei nera parametru
je read_filename_end ; tai taip, tai baigtas failo vedimas
cmp byte ptr ds:[si], ' ' ; jei tarpas
jne read_filename_next ; tai praleisti visus tarpus, ir sokti prie kito parametro
read_filename_end:
mov al, '$' ; irasyti '$' gale
stosb ; Store AL at address ES:(E)DI, di = di + 1
pop ax
ret
read_filename_next:
lodsb ; uzkrauna kita simboli
stosb ; Store AL at address ES:(E)DI, di = di + 1
jmp read_filename_start
read_filename ENDP
replace PROC near
push si
mov ah, 0
cmp al, 'A'
jb exit
cmp al, 'Z'
ja mini
mov si, ax
sub si, 40h
inc letter+si
jmp exit
mini:
cmp al, 'a'
jb exit
cmp al, 'z'
ja exit
mov si, ax
sub si, 60h
inc letter+si
exit:
pop si
ret
replace ENDP
apie db 'Programa skaiciuoja raides failuose ir isveda i lentele',13,10,9,'uzd.exe [/?] destinationFile [ - | sourceFile1 [sourceFile2] [...] ]',13,10,13,10,9,'/? - pagalba',13,10,'$'
err_s db 'Source failo nepavyko atidaryti skaitymui',13,10,'$'
err_d db 'Destination failo nepavyko atidaryti rasymui',13,10,'$'
sourceF db 12 dup (0)
sourceFHandle dw ?
destF db 12 dup (0)
destFHandle dw ?
buffer db 20 dup (?)
simbolis db ?
letter dw 30 dup (0)
outbuff db 40 dup (' ')
Letterstr db ' ABCDEFGHIJKLMNOPQRSTUVWXYZ '
BSeg ends
end START