rendered paste body.model small
.stack 1000
.data
;-----------------------( Visos Error zinutes )------------------
err1 db 'Vykdymo sintakse failas.exe <inputfailas> <outputfailas>', 0Dh,0Ah, '$'
err2 db 'Ivyko klaida atidarant faila',0Dh,0Ah,'$'
err3 db 'Del neaiskiu priezasciu negalima nuskaityt input failo',0Dh,0Ah,'$'
err4 db 'Input ir output failo vardai vienodi?!',0Dh,0Ah,'$'
;-----------------------( Failai, ju handle'ai.. ) --------------
f1name db 50 dup('!') ; input failo pavadinimas, paimsim is ES
f1hand dw ? ; input failo handle'as
f1buf db 81, 82 dup (?) ; input failo bufferis
f1len dw 0
f2name db 50 dup('!')
f2len dw 0
f2hand dw ?
f2buf db 81, 82 dup (?) ; input failo bufferis
IObuf db 4096 dup(0) ; ivedimo buferis
IOsize dw 0 ; dydis kiek rasyt reikes
CWordL dw 0 ; dabartinio zodzio eiluteje ilgis
simb db 1 dup('0')
mystr db 50 dup('0')
mystrlen dw 0
parCnt dw 0
;----------------------( procedura writeskaicius ) -------------
buf db 10 dup(0)
bufe db '$'
ten dw 10
.code
main proc
mov ax, ds
mov es, ax
mov ax,@data
mov ds,ax
;------------------( Nusiskaitom parametrus i f1name ir f2name ) -------------
mov si, 80h
xor cx, cx
mov cl, es:[si]
cmp cx, 0
jz printErr1
lea di,f1name
xor cx,cx
tarpas:
inc si
mov al,es:[si]
cmp al,' '
je tarpas
cmp bx,1
je parametras2
parametras1:
mov [di],al
inc di
inc si
inc f1len
inc cx
mov al,es:[si]
cmp al,' '
je baigiasParam1
cmp al,0dh
je baigiasParam1
jmp parametras1
baigiasParam1:
mov [di],byte ptr '0'
mov bx,1
cmp cl,0
je printErr1
cmp cl,12
jg printErr1
inc si
lea di,f2name
parametras2:
mov al,es:[si]
cmp al,' '
je tarpas
cmp al,0dh
je baigiasParam2
mov [di],al
inc di
inc f2len
inc cx
inc si
jmp parametras2
printErr1:
lea dx, err1
mov ah, 09h
int 21h
jmp TheEnd
baigiasParam2:
mov [di],byte ptr '0'
mov ax,f1len
cmp ax,f2len
jne start
lea si,f1name
lea di,f2name
check:
mov ah,[si]
mov bh,[di]
inc si
inc di
cmp ah,bh
jne start
jmp printErr4
start:
;--------------------------( Atidarom 1 faila! ) -------------
mov ah, 3dh ; dos'o funkcija atidaranti faila
mov al, 0 ; atidarymo mode'as r , skaitysim
mov dx,offset f1name ; ka atidarysim skaitymui?
int 21h
jc printErr2 ; jei ivyko klaida atidarant
mov f1hand, ax ; issisaugom handle 'kintamjam'
;--------------------------( Atidarom 2 faila! ) -------------
mov dx,offset f2name ; DX rodo i failo vardo pirma baita
mov ah,3dh ; atidarymo funkcija
mov al,1
int 21h
jnc cool
create:
lea dx,f2name ; DX rodo i failo vardo pirma baita
mov ah,3ch ; atidarymo funkcija
mov cx,0 ; sukurimas su normaliu atributu
int 21h
cool:
mov f2hand,ax
xor ax,ax
xor dx,dx
mov ah,0aH
mov dx,offset mystr
int 21h
call writeln
mov si,offset mystr
mov al,[si+1]
mov ah,0
mov mystrlen,ax
call writeskaicius
mov ah,42h ; pradesim visad rasyt nuo failo pradzios
mov bx,f2hand
mov cx,0
mov dx,0
mov al,0
int 21h
mov ah,40h
mov bx,f2hand
mov cx,0000h
xor dx,dx
int 21h
jmp do
printErr4:
lea dx, err4
mov ah, 09h
int 21h
jmp TheEnd
printErr2:
lea dx, err2
mov ah, 09h
int 21h
jmp TheEnd
do:
call getl
cmp bx,1
jne continue
; primesim gale #13 ir #10 ir rasysim i f2hand
mov [si],byte ptr 13
inc si
mov [si],byte ptr 10
mov ah,40h
mov bx,f2hand
mov dx,offset IObuf
add IOsize,2
mov cx,IOsize
int 21h
continue:
cmp bp,1
je TheEnd
mov IOsize,0
jmp do
TheEnd:
mov ah,3eh
mov bx,f1hand
int 21h
mov ah,3eh
mov bx,f2hand
int 21h
mov ax, 4c00h ; gritam i OS
int 21h
endp
;------------( funkcija 1 baito isvedimui i stdout )-----------
;
; Jei getc grazina bp=1 pasiekem failo gala
; Jei getc grazina di=1 pasiekem eilutes gala (#13)
; abiem atvejais belieka patikrinti ar dabar suformuotas zodis
; yra trumpesnis/lygus ivestam ir nustatyti bx=1 jei taip, kad
; sia eilute isvestume
;
getc proc
mov bp,0
ignore:
mov di,0
mov ah,3fh
mov bx,f1hand
mov dx,offset simb
mov cx,1
int 21h
mov dh,simb
cmp dh,byte ptr 13
je ignore ; 13ta simboli praleisim tiesiog kad neisirasytu kur nereik
cmp dh,byte ptr 10
jne CheckEOF
mov di,1
CheckEOF:
cmp ax,cx
je NotEOF
mov bp,1
NotEOF:
ret
endp
; Jei getl grazina bx=1 tai sita eilute perrasysim i kita faila nes tenkina salyga
; jei =0, nerasom
getl proc
mov bx,0 ; tarkim kad sios eilutes nerasysim
lea si,IObuf
begin:
mov CWordL,0
call getc
cmp di,1
je compareandexit
cmp bp,1
je compareandexit
mov ah,simb
cmp ah,' '
jne writeIO
space:
mov ah,simb
mov [si],ah
inc si
inc IOsize
mov dx,mystrlen
cmp CWordL,dx
jg wontWriteThisWord
mov bx,1
wontWriteThisWord:
mov bx,0
mov CWordL,0
call getc
cmp di,1
je compareandexit
cmp bp,1
je compareandexit
mov ah,simb
cmp ah, ' '
je space
writeIO:
inc CWordL
mov ah,simb
mov [si],ah
inc si
inc IOsize
call getc
mov ah,simb
cmp ah,' '
je space
cmp di,1
je compareandexit
cmp bp,1
je compareandexit
jmp writeIO
compareandexit:
mov dx,mystrlen
cmp CWordL,dx
jg wontWriteThisLine
mov bx,1
jmp exit
wontWriteThisLine:
mov bx,0
exit:
ret
endp
writeln proc
mov dl, 0dh ;
mov ah, 06h ; uzrasome ant ekrano #13 #10
int 21h ;
mov dl, 0ah ;
int 21h ;
ret
endp
writeskaicius proc ; isveda ax i ekrana
lea si, buf ; is pradziu isvalom buferi
mov bl, ' '
mov bh, 0
val:
mov [si], bl
inc si
inc bh
cmp bh, 10
jl val
lea si, bufe ; ds:si rodys i bufe
dar: ; repeat ... (ax > 0)
xor dx, dx ; nuvalomas dx (dx=0)
div ten ; ax := ax div 10
add dl, 30h ; dl := dl + 30h
dec si ; si := si - 1 (si--)
mov [si], dl ; ds:si := dl
cmp ax, 0 ; if ax > 0
jg dar ; then goto dar
lea dx, buf ; ds:dx rodys i buf
mov ah, 9h ; spec. funkcija isvedimui
int 21h ; i ekrana
ret
endp
end