Advertisement
rnort

Untitled

May 14th, 2012
399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; multi-segment executable file template.
  2. data segment
  3.     ; add your data here!
  4.     pkey db "press any key...$"  
  5.     args db 100 dup (' ')
  6.     msg db "no parametres! $"    
  7.     CmdLnLen        equ     byte ptr es:[80h] ;Command line length
  8.     CmdLn           equ     byte ptr es:[81h] ;Command line data
  9.     filein  db 20 dup(' ')
  10.     fileout db 20 dup(' ')
  11.     handlein dw ?
  12.     handleout dw ?
  13.     someword db 50 dup(' ')
  14.     buffer db 1000 dup(' ')
  15.     coordx db 1
  16.     coordy db 1
  17.     vpage db 0
  18.     clen dw 1000
  19.     emsg db "ERROR WHILE READING $"
  20.  
  21. ends
  22.  
  23. stack segment
  24.     dw   128  dup(0)
  25. ends
  26.  
  27. code segment
  28.  ; -------------
  29.  ; AL - horizontal coord X ( start from 1 )
  30.  ; AH - vertical coord Y ( 1 + )
  31.  ; CL - page number ( 0 + )
  32.  ; OUTPUT:
  33.  ;  DI - offset for character
  34.  CharAddr PROC
  35.  ;
  36.  mov CH, AH
  37.  mul CH ;
  38.  shl AX, 1 ;
  39.  sub AX, 2 ;
  40.  ;
  41.  mov DI, AX ;
  42.  push DX ;
  43.  mov AX, 4000 ;
  44.  xor CH, CH
  45.  mul CX ;
  46.  pop DX ;
  47.  ;
  48.  add DI, AX
  49.  ret
  50.  CharAddr ENDP              
  51. ; -------------------------------------------------------------------
  52. ; AL - horizontal coord
  53. ; AH - vertical coord
  54. ; DL - ASCII
  55. ; DH - attribute
  56. ; CL - page number ( 0 + )
  57.  WriteChar PROC
  58.  push ES
  59.  ;push DI
  60.  ; in ES - videobuffer
  61.  push 0B800h
  62.  pop ES
  63.  ; calc full offset for character
  64. ; call CharAddr
  65.  ; put symbol on buffer
  66.  mov ES:[DI], DX
  67. ; pop DI
  68.  pop ES
  69.  ret
  70.  WriteChar ENDP
  71. ; ----------------------------------------------------------------------
  72. ; load args from PSP to buffer
  73. loadargs proc near
  74.    
  75.     push bx
  76.     push si
  77.     push di
  78.     push cx
  79.     push ax
  80.    
  81.     lea bx, CmdLn
  82.     lea si, CmdLnLen
  83.    
  84. ; copy command line to our buffer:
  85.     xor     cx, cx          ; zero cx register.
  86.     mov     cl, es:[si]        ; get command line size.
  87.  
  88.     lea     di, args      ; load buffer address to di.
  89.  
  90.     cmp     cx, 0           ; cx = 0 ?
  91.     jz      no_param        ; then skip the copy.
  92.  
  93.     inc     si              ; copy from second byte.
  94. next_char:
  95.     mov     al, es:[bx]
  96.     mov     [di], al
  97.     inc     bx
  98.     inc     di
  99.     loop    next_char
  100.  
  101. ; set '$' sign in the end of the buffer:
  102.     mov     byte ptr [di], '$'
  103.    
  104.     jmp     exit    ; skip error message.
  105.  
  106. no_param:
  107. ; print out the error message:
  108.     lea     dx, msg
  109.     mov     ah, 9
  110.     int     21h
  111.  
  112. exit:
  113.    
  114.     pop ax
  115.     pop cx
  116.     pop di
  117.     pop si
  118.     pop bx          
  119.     ret            
  120. loadargs endp                                                                            
  121. getfilename proc near
  122.    
  123.     push bx
  124.     push cx
  125.     push ax
  126.     push di
  127.     push si
  128.                
  129.     lea bx, someword
  130.     mov si, 1       ; counter for args string
  131.     mov di, 0       ; counter for word & file name strings
  132.     mov ax , 0      ; arg # 0 - word 1 - input file 2 - output file
  133.     xor cx, cx
  134.     mov cl, CmdLnLen
  135.     dec cx ; ?
  136.     loop1:
  137.    
  138.     cmp args[si], ' '
  139.     jne not_eq
  140.     mov [bx + di] , 0
  141.     xor di, di
  142.     cmp ax, 0
  143.     jne ax_12
  144.     inc ax  ; ax - 1
  145.     lea bx, filein
  146.     jmp loop_1_end
  147.     ax_12:
  148.     cmp ax, 2
  149.     je exit_loop1
  150.     inc ax  ; ax - 2
  151.     lea bx, fileout
  152.     jmp loop_1_end          
  153.     not_eq:
  154.     push ax
  155.     mov al , args[si]
  156.     mov [bx + di], al
  157.     pop ax
  158.     inc di
  159. loop_1_end:
  160.     inc si
  161.      
  162.     loop loop1
  163. exit_loop1:            
  164.     mov [bx + di] , 0   ; ASCIIZ string for file operations
  165.    
  166.     pop si
  167.     pop di
  168.     pop ax
  169.     pop cx
  170.     pop bx      
  171.                
  172.     ret
  173. getfilename endp
  174. ; ---------------------------------------------------------------------
  175. ; find line with given word
  176. ; BX - start of line
  177. ; DI - end of line
  178. ; SI - current pos
  179. ; ---------------------------------------------------------------------
  180. findline proc near
  181.                
  182.     mov bx, 0   ; start of line ( beg of buffer - always start of line )          
  183.     mov si, 0
  184.     mov di, 0
  185.     xor cx, cx  ; cl - cmp success
  186.                 ;
  187.     loop_check:
  188.        
  189.     call findbeg    ; place SI on beg of word; change DI as well
  190.     cmp di, 0
  191.     jne shuffle_2
  192.  
  193.     call cmpwords   ; cmp word in buffer with given
  194.                     ; ret 1 in CX if equal
  195.     cmp cx, 1
  196.     jne not_eq_words
  197.    
  198.     ; write to file    
  199.     ; find EndOfLine
  200.     mov di, si
  201.     dec di
  202. eline:
  203.     inc di            
  204.     cmp di, clen
  205.     je endofbuffer  ; write DI bytes
  206.     cmp buffer[di], 0Dh
  207.     jne eline
  208. endofbuffer:    
  209.     mov cx, di  ; number of bytes to write
  210.     inc cx      ; index == count - 1 -> increment
  211.     mov ah, 40h
  212.     mov bx, handleout
  213.     lea dx, buffer
  214.     int 21h
  215. ; shuffle buffer
  216. shuffle_2:
  217.     mov cx, di  ; di - index of ODh
  218.     mov si, di  ;
  219.    
  220.     xor bx, bx
  221.     inc si  ; ignore ODh
  222. shuffle:
  223.     mov al, buffer[si]
  224.     mov buffer[bx], al
  225.  
  226.     inc bx
  227.     inc si
  228.  
  229.     cmp si, clen    
  230.     jbe shuffle
  231.   ; end shuffle      
  232.                    
  233.     sub clen, cx
  234.     ;sub clen, 1 ; ?
  235.     cmp clen, 0000h
  236.     je ret_
  237.     xor cx, cx
  238.    
  239.     xor bx, bx
  240.     xor di, di
  241.     mov si, -1
  242.    
  243. not_eq_words:
  244.     inc si
  245.     cmp si, clen
  246.     jne loop_check ;?
  247. ret_:  
  248.     ret
  249. findline endp
  250. ; ---------------------------------------------------------------------
  251. ; findbeg - find beginning of word
  252. ; ---------------------------------------------------------------------
  253. findbeg proc near
  254.    
  255.     mov al, 0
  256. loop_find_beg:    
  257.     cmp buffer[si], 20h    ; space
  258.     je _eq
  259.     cmp buffer[si], 09h    ; tab
  260.     je _eq
  261.     cmp buffer[si], 0Dh    ; newline
  262.     je _eq_nl
  263.     cmp si, 0
  264.     jne not_eq_
  265.     ret    
  266. _eq_nl:
  267.     mov di, si    ; find new line
  268. _eq:
  269.     mov al, 1   ; set flag that previous char is delimeter
  270.     jmp al_n1
  271.    
  272. not_eq_:
  273.     cmp al, 1
  274.     jne al_n1
  275.     ret
  276.  
  277. al_n1:    
  278.     inc si
  279.     cmp si, clen
  280.     jne loop_find_beg        
  281.    
  282.     ret
  283. findbeg endp  
  284. ; ---------------------------------------
  285. ; cmpwords
  286. ; --------------------------------------
  287. cmpwords proc near
  288.    
  289.    
  290.     push di
  291.     mov di, 0
  292.     xor cx, cx ; cx - 0
  293.     push ax
  294.     mov al, someword[di]
  295.    
  296. loop_cmp:    
  297.    
  298.     cmp buffer[si], al
  299.     jne ret_failure
  300.     inc si
  301.     inc di
  302.    
  303.     mov al, someword[di]
  304.     cmp al, 0
  305.     je loop_css
  306.     ;jne loop_cmp
  307.     cmp si, clen
  308.     jbe loop_cmp
  309.    
  310. loop_css:    
  311.     mov cx, 1
  312. ret_failure:
  313.     pop ax
  314.     pop di
  315.     cmp si, clen
  316.     jne not_clen
  317.     sub si, 1
  318. not_clen:
  319.     ret
  320. cmpwords endp
  321. ;
  322. ; ----------------------------------------------------------------------    
  323. start:
  324. ; set segment registers:
  325.     push ds
  326.     mov ax, data      
  327.     mov ds, ax
  328.     mov es, ax          
  329.     ; ----------------------
  330.     pop es
  331.     call loadargs  ; copy args from PSP to buffer string
  332.     ; ----------------------
  333.     call getfilename ; copy file names && target word to different strings
  334.     ; open in file
  335.     mov ah, 3Dh
  336.     mov al, 02
  337.     mov dx, offset filein
  338.     int 21h
  339.     mov handlein, ax
  340.     ; open out file
  341.     mov ah, 3Dh
  342.     mov al, 01
  343.     mov dx, offset fileout
  344.     int 21h
  345.     mov handleout, ax
  346.     ; read from in file to buffer
  347.    
  348.     ; --- video
  349.     ; set video mode
  350.     mov ax, 0003h
  351.     int 10h
  352.     ; -------------
  353.     mov di, 0
  354.    ; mov clen , 0013h ; 20 char
  355. loop_read:
  356.     mov clen, 03e8h
  357.     mov ah, 3fh
  358.     mov bx, handlein
  359.     mov cx, clen
  360.    
  361.     mov dx, offset buffer
  362.     int 21h
  363.     jnc cf0
  364.      
  365.    
  366.     mov ax, 0003h
  367.     int 10h
  368.     mov ah, 09h
  369.     lea dx, emsg
  370.     int 21h  
  371.     ;cmp ax, 0
  372.     je ex
  373.    
  374.     cf0:
  375.     cmp ax, 0
  376.     je ex
  377.    
  378.     ; find line with given word
  379.     ; -----------------------------------
  380.     ;pusha
  381.     mov clen, ax
  382.     sub clen , 1
  383.     mov di, ax
  384.     inc di
  385. loop_find_nl:
  386.     sub di, 1
  387.     cmp di, 0
  388.     je zero_di
  389.     cmp buffer[di], 0Dh
  390.     jne loop_find_nl    
  391.    
  392.     mov si, ax  ; AX - number of readed bytes
  393.     sub si ,1
  394.     sub di, si
  395.     add clen, di    ;  ?
  396.     ; change read pointer
  397.     mov ax, 4201h
  398.     mov bx, handlein
  399.     mov cx, 0
  400.     mov dx, di
  401.     int 21h
  402. zero_di:
  403.  
  404.     ; video                        
  405.     ; -----------------------------------
  406.    
  407.     mov si, 0
  408.     mov di, 0
  409. ;loop_vout:
  410. ;    
  411. ;  
  412. ;   ; push ax
  413. ;    push dx
  414. ;    push cx
  415. ;    ;mov al, coordx
  416. ;   ; mov ah, coordy
  417. ;    mov dl, buffer[si]
  418. ;    cmp dl, 0Ah
  419. ;    je equal_
  420. ;    cmp dl, 0Eh
  421. ;    je equal_
  422. ;    cmp dl, 0dh
  423. ;    jne not_equal_
  424. ;    equal_:
  425. ;    mov dl, 20h
  426. ;    not_equal_:
  427. ;    mov dh, 1Fh
  428. ;    mov cl, vpage
  429. ;    call WriteChar
  430. ;    add di, 2
  431. ;    
  432. ;;    cmp coordx, 80
  433. ;;    jne go_2
  434. ;;    mov coordx, 0
  435. ;;    
  436. ;;    cmp coordy, 25
  437. ;;    jne go_
  438. ;;    mov coordy, 1    
  439. ;;    inc vpage
  440. ;;    jmp go_2
  441. ;;go_:
  442. ;;    inc coordy
  443. ;;go_2:
  444. ;;    inc coordx    
  445. ;    pop cx
  446. ;    pop dx
  447. ;;   pop ax
  448. ;    inc si
  449. ;    
  450. ;    cmp si, clen
  451. ;    jne loop_vout
  452. ;    
  453. ;    ; WAIT FOR ANY KEY
  454. ;    mov ah, 1
  455. ;    int 21h
  456. ;    mov ax, 0003h     ; clear screen
  457. ;    int 10h
  458. ;    
  459. ;    ; end of vout
  460.    
  461.     ; find line in buffer
  462.     call findline   ; find line with given word and write in to out file
  463.     ; -----------------------------
  464.    
  465.     cmp ax, ax
  466.     je loop_read
  467. ex:    
  468.    
  469.     ; close files
  470.     mov bx, handleout
  471.     mov ah, 3eh
  472.     int 21h
  473.     mov ah, 3eh
  474.     mov bx, handlein
  475.     int 21h
  476.  
  477.     ; wait for any key....    
  478.     mov ah, 1
  479.     int 21h
  480.    
  481.     mov ax, 0003h     ; clear screen
  482.     int 10h
  483.    
  484.     mov ax, 4c00h ; exit to operating system.
  485.     int 21h    
  486. ends
  487.  
  488. end start ; set entry point and stop the assembler.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement