home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / sampler0 / mem.asm < prev    next >
Assembly Source File  |  1987-07-07  |  17KB  |  814 lines

  1. ;MEM.ASM
  2. code    segment
  3.     assume    cs:code,ds:code
  4.     org    100h
  5. start:    jmp    begin
  6.     db    5 dup ('stack    ')
  7. stack_area    dw 0
  8.  
  9. topline db      ' CURSOR LOCATION: 00000  CONTENTS: 00',32,32,32
  10. help?    db    '(? FOR HELP)  '
  11. find?    db    'FIND:',32,32,32,32,32,32,32,32,32 ;because I'm using Qedit...
  12. jump?   db    'JUMP TO:',32,32,32,32,32,32
  13. search  db    'SEARCHING... '
  14. escmsg    db    0,'Press ESC to QUIT',0,0
  15.     db    0,'Arrow keys - move cursor',32,32,32,32,32,32,32,32,32,32,32,32
  16.     db    '(& Ctrl-Left Arrow & Ctrl-Right Arrow)',0
  17.     db    0,'Home - left end of line',32,32,32,32,32,32,32,32,32,32,32,32,32
  18.         db    'End - right end of line',0
  19.     db    0,'Ctrl-Home - top of screen',32,32,32,32,32,32,32,32,32,32,32
  20.     db    'Ctrl-End - bottom of screen',0
  21.     db    0,'Ctrl-PgUp - beginning of memory',32,32,32,32,32
  22.     db    'Ctrl-PgDn - end of memory',0
  23.     db    0,'PgUp - previous screen',32,32,32,32,32,32,32,32,32,32,32,32,32,32
  24.     db    'PgDn - next screen',0
  25.     db    0,'Scroll Lock ON to scroll screen with Arrow Keys',0
  26.     db    0,'Ctrl-F - Find string of characters',0
  27.     db    0,'Ctrl-L - Continue to search for string',0
  28.     db    0,'Ctrl-J - Jump to hexadecimal memory address',0
  29.     db    0,0,'PRESS ANY KEY TO RETURN...',0
  30.  
  31.     db    'MEM.COM (c)1987 by Doug Cox '
  32. findstr db    32,32,32,32,32,32,32,32
  33. cursave dw      0
  34. saves   dw      0
  35. strcnt  dw      0
  36. oldcur  dw      0
  37. chars   dw      0
  38. curptr    dw    0
  39. toplef  dw      0
  40. mode    db    0
  41.  
  42. begin:  lea     ax,stack_area
  43.     mov    sp,ax
  44.     mov    ah,0fh        ;function to check screen mode
  45.     int    10h
  46.     cmp    al,0bh        ;indicates display mode
  47.     jb    notega        ;if monochrome or CGA
  48.     jmp    exit
  49. notega: mov    mode,al     ;save it
  50.  
  51.     mov    ax,0b000h    ;video memory address
  52.     cmp    mode,7
  53.     je    mono        ;if monochrome display
  54.     add    ax,800h     ;if CGA display
  55. mono:    mov    es,ax
  56. ;save old cursor location
  57.     call    getcur
  58.         dec     dh
  59.         mov     oldcur,dx       ;row in dh / col in dl
  60. ;save old screen
  61.         mov     di,0
  62.         lea     si,oldscr
  63. oldlp0: mov    cx,80        ;columns
  64. oldlp:    mov    al,es:[di]
  65.     mov    ds:[si],al
  66.     inc    di
  67.     inc    di
  68.     inc    si
  69.         loop    oldlp
  70.     dec    dh        ;rows
  71.     jnz    oldlp0
  72.  
  73.         mov     ah,0            ;function to set screen mode
  74.     mov    al,2        ;code for 25x80 B&W
  75.         int     10h             ;clear screen
  76.  
  77.     mov    ah,1        ;function to change cursor shape
  78.     mov    cx,7        ;top & bottom row of cursor
  79.     int    10h
  80.  
  81. ;put top line on screen
  82.     lea    si,topline
  83.     mov    di,0        ;location on screen
  84.     mov    cx,53        ;for count
  85.     mov    ah,70        ;for screen attribute
  86.     call    movit        ;move [si] into [di] & inc di cx times
  87.  
  88. ;put memory contents on screen
  89. memtop: mov    toplef,0    ;memory location (& data segment)
  90.     mov    curptr,0    ;cursor offset location in memory
  91.     mov    dx,0100h    ;row 1/column 0
  92.         call    movcur          ;initialize cursor at top left
  93. newscrn:mov    ah,7        ;screen attribute
  94.     mov    si,0        ;offset of memory to put on screen
  95.     mov    di,160        ;top left of screen
  96.     cmp    toplef,0ff8ch    ;last possible toplef
  97.     jnc    atend        ;to not write past 0fffffh
  98.         mov     cx,1920         ;80*24 screen
  99.     mov    ds,toplef    ;toplef is also data segment beginning
  100.     call    movit        ;lodsb, stosw, loop
  101. new2:   mov    dx,cs
  102.     mov    ds,dx        ;put data seg back
  103.  
  104. ;put cursor location & contents at screen top
  105. locont: mov    dx,toplef    ;data segment
  106.         mov     bx,dx           ;for first binihex call
  107.         mov     cl,4
  108.     shl    dx,cl
  109.         add     dx,curptr       ;offset addr
  110.         jnc     locont2
  111.     add    bx,1000h    ;increment 5th byte
  112. locont2:mov    di,36        ;location on screen
  113.     mov    ch,1        ;for count
  114.     call    binihex     ;show 5th byte of location
  115.     mov    bx,dx
  116.     mov    ch,4
  117.     call    binihex     ;show other 4 bytes of location
  118.  
  119.     mov    bx,curptr    ;cursor location in memory
  120.     mov    ds,toplef
  121.     mov    bh,[bx]     ;contents
  122.     mov    cx,cs
  123.     mov    ds,cx
  124.     mov    di,70        ;screen loc
  125.     mov    ch,2        ;2 chars
  126.     call    binihex
  127. ;read keyboard
  128. wait:    mov    ah,0        ;function to read keyboard
  129.     int    16h        ;program stays here, mostly
  130.         cmp     al,0
  131.     je    extended_code
  132.  
  133.     call    case        ;to jump to following subroutines
  134.     db    ctrls/3
  135. diff2    equ    $
  136.     db    10    ;^J
  137.     dw    jump
  138.         db      6       ;^F
  139.     dw    find
  140.     db    12    ;^L
  141.     dw    again
  142.     db    3fh    ;'?'
  143.     dw    emenu
  144.     db    1bh    ;ESC
  145.     dw    exit
  146. ctrls   equ     $-diff2
  147.         dw      wait
  148.  
  149. ;if at last possible screen of memory
  150. atend:    mov    dx,toplef
  151.     mov    ds,dx        ;don't change ds before getting ds:[toplef]
  152.     mov    cl,4
  153.     shl    dx,cl        ;rotate left 1 byte
  154.     mov    cx,0ffffh
  155.     sub    cx,dx
  156.     inc    cx
  157.         mov     dx,1920         ;80*24
  158.     sub    dx,cx
  159.         call    movit           ;put memory on screen, but put blanks past ffffh
  160.         mov    cx,dx
  161.     mov    ax,0700h    ;attribute & blank
  162.         rep     stosw
  163.     jmp    new2
  164.  
  165. extended_code:
  166.         mov     al,ah
  167.         call    case
  168.     db    extends/3    ;number of routines to check
  169. diff1    equ    $
  170.         db      71      ;Home
  171.     dw    lftside
  172.     db    79    ;End
  173.     dw    rtside
  174.     db    73    ;PgUp
  175.     dw    prev
  176.     db    81    ;PgDn
  177.     dw    next
  178.     db    72    ;Up arrow
  179.     dw    curup
  180.     db    80    ;Down arrow
  181.     dw    curdn
  182.     db    75    ;Left arrow
  183.     dw    curlft
  184.     db    77    ;Right arrow
  185.     dw    currt
  186.     db    116    ;Ctrl-Right arrow
  187.     dw    movrt
  188.     db    115    ;Ctrl-Left arrow
  189.     dw    movlft
  190.         db      132     ;Ctrl-PgUp
  191.         dw      memtop
  192.         db      118     ;Ctrl-PgDn
  193.     dw    goend
  194.     db    119    ;Ctrl-Home
  195.     dw    scrtop
  196.     db    117    ;Ctrl-End
  197.     dw    scrbot
  198. extends equ     $-diff1
  199.         dw      wait    ;go there if not one of above
  200.  
  201.  
  202. ;'?'
  203. emenu:    call    savcur
  204.         lea     si,escmsg
  205.         call    menwrt
  206.     cmp    al,1bh        ;ESC
  207.     je    jmpexit
  208.     cmp    al,3        ;^C
  209.     je    jmpexit
  210.     mov    dx,cursave
  211.     call    movcur
  212.         jmp     newscrn
  213.  
  214. jmpexit:jmp    exit
  215.  
  216. ;Ctrl-Home
  217. scrtop: call    getcur        ;row in dh & col in dl
  218.     mov    al,80
  219.         mul     dh
  220.     sub    curptr,ax
  221.     add    curptr,80    ;because top row here is 1 not 0
  222.         mov     dh,1            ;top row
  223.         call    movcur
  224.         jmp     locont
  225.  
  226. ;Ctrl-End
  227. scrbot: call    getcur
  228.     mov    al,24        ;bottom row
  229.     sub    al,dh        ;cursor row
  230.     mov    ah,80
  231.     mul    ah
  232.     add    curptr,ax
  233. ;now test for end of memory
  234.         mov     ax,toplef
  235.     mov    cl,4
  236.     shl    ax,cl
  237.     add    ax,curptr
  238.     jnc    scrbot2     ;if not past 0fffffh
  239.     call    curend
  240.     jmp    locont
  241.  
  242. scrbot2:mov     dh,24           ;bottom row
  243.         call    movcur
  244.         jmp     locont
  245.  
  246. ;Ctrl-PgDn
  247. goend:  mov    toplef,0ff8ch    ;last possible toplef
  248.     mov    curptr,1855    ;80*23+15
  249.     mov    dx,180fh    ;row 24 col 15
  250.     call    movcur
  251.     jmp    newscrn
  252.  
  253. ;Home
  254. lftside:call    getcur
  255.     push    dx
  256.         mov     dh,0
  257.     sub    curptr,dx    ;decrement curptr to 1st col
  258.     pop    dx
  259.     mov    dl,0
  260.         call    movcur
  261.     jmp    locont
  262.  
  263. ;End
  264. rtside: mov    ax,toplef
  265.     cmp    ax,0ff8ch    ;last screen in memory
  266.         jc      rtside2
  267.         mov     cl,4
  268.     shl    ax,cl
  269.     add    ax,curptr
  270.     cmp    ax,0fff0h    ;beginning of last line in memory
  271.     jc    rtside2
  272.         call    curend
  273.     jmp    locont
  274.  
  275. rtside2:call    getcur
  276.     mov    al,79
  277.     sub    al,dl
  278.     mov    ah,0
  279.         add     curptr,ax
  280.         mov     dl,79
  281.     call    movcur
  282.     jmp    locont
  283.  
  284. ;PgUp
  285. prev:   cmp    toplef,0
  286.     je    jmpwait
  287.     cmp    toplef,78h    ;1920d shifted right (24*80) screen
  288.     jnc    prev2        ;if not within 24*80 of beginning of memory
  289.     jmp    memtop
  290. prev2:  sub     toplef,78h
  291. gonew:    jmp    newscrn
  292.  
  293. ;PgDn
  294. next:   mov    dx,toplef
  295.     cmp    dx,0ff8ch    ;last possible toplef
  296.     jnc    jmpwait     ;if at end of memory
  297.     add    dx,78h        ;1920d shifted right
  298.     mov    toplef,dx
  299.     mov    cl,4
  300.     shl    dx,cl
  301.     add    dx,curptr
  302.     jnc    gonew        ;if cursor won't be past 0fffffh
  303.     call    curend
  304.         jmp     newscrn
  305.  
  306. curjmp: jmp    locont
  307.  
  308. ;Left Arrow
  309. curlft: call    lftcur
  310.     jnc    curjmp
  311.     jmp    newscrn
  312.  
  313. ;Right Arrow
  314. currt:    call    rtcur
  315.     jnc    curjmp
  316.     jmp    newscrn
  317.  
  318. ;Ctrl-Right Arrow
  319. movrt:    mov    cx,10
  320. rtlp:    push    cx
  321.     call    rtcur
  322.     pop    cx
  323.         loop    rtlp
  324.     jmp    newscrn
  325.  
  326. ;Ctrl-Left Arrow
  327. movlft: mov    cx,10
  328. lftlp:    push    cx
  329.     call    lftcur
  330.     pop    cx
  331.         loop    lftlp
  332.         jmp     newscrn
  333.  
  334. jmpwait:jmp     wait
  335.  
  336. ;Up Arrow
  337. curup:    call    scrlock
  338.     jnz    up        ;if ScrollLock is ON
  339.     call    getcur
  340.     cmp    dh,1
  341.     je    curup2        ;if on top line
  342.     dec    dh
  343.     call    movcur
  344.         sub     curptr,80
  345.         jmp     locont
  346.  
  347. curup2: cmp    toplef,0
  348.     jz    jmpwait
  349.     sub    toplef,5
  350.     jmp    newscrn
  351.  
  352. ;ScrollLock ON
  353. up:    cmp    toplef,0
  354.     je    jmpwait     ;if at beginning of memory
  355.     sub    toplef,5
  356.     call    getcur
  357.     cmp    dh,24
  358.     je    downend     ;If at bottom
  359.     inc    dh
  360.     call    movcur
  361.         add     curptr,80       ;because of toplef change
  362.         jmp     newscrn
  363.  
  364. jmpwait2:jmp    wait
  365.  
  366. ;Down Arrow
  367. curdn:    call    scrlock
  368.     jnz    down        ;if ScrollLock is ON
  369.     cmp    toplef,0ff8ch
  370.     jc    curdn3        ;if not at last screen in memory
  371.     mov    ax,toplef
  372.     mov    cl,4
  373.     shl    ax,cl
  374.     add    ax,curptr
  375.     add    ax,80
  376.     jc    jmpwait2    ;if move would put cursor past 0fffffh
  377. curdn3: call    getcur
  378.     cmp    dh,24
  379.     je    curdn2        ;if on bottom line
  380.     inc    dh
  381.     call    movcur
  382.     add    curptr,80
  383.         jmp     locont
  384.  
  385. curdn2: add    toplef,5
  386.     cmp    toplef,0ff8ch
  387.     jc    downend     ;if not at end of memory
  388.         call    curend
  389.     jmp    newscrn     ;don't need to increment curptr
  390.  
  391. ;ScrollLock ON
  392. down:   cmp     toplef,0ff8ch
  393.     jnc    jmpwait2    ;if at end of memory
  394.     add    toplef,5    ;80 shifted right
  395.     call    getcur
  396.     cmp    dh,1
  397.     je    downend     ;if cursor is on top line
  398.     dec    dh
  399.     call    movcur
  400.         sub     curptr,80       ;because of toplef change
  401. downend:jmp     newscrn
  402.  
  403. ;jump to input hex address
  404. jump:    call    savcur
  405.     lea    si,jump?
  406.     call    top
  407.     mov    bp,96        ;for screen location in getstr
  408.     call    getstr        ;get input
  409.     cmp    dx,0        ;input string length
  410.     jnz    jumpsk
  411.     jmp    find15        ;if no input
  412. jumpsk: mov    si,di        ;just after last input char on screen
  413.     mov    ax,0
  414.     mov    di,ax        ;for offset address
  415.     mov    bx,ax        ;for segment address
  416.     mov    dx,0004h    ;dh for cl & dl for loop
  417. ;get offset address
  418. jumplp: dec    si
  419.     dec    si
  420.     cmp    si,96        ;input screen location
  421.     jl    jumpxit     ;if no good input
  422.         mov     al,es:[si]
  423.     call    hex2bin     ;convert to binary
  424.     jc    jumplp        ;if not hexadecimal
  425.     mov    cl,dh
  426.     mov    ah,0        ;rol changes it
  427.     add    dh,4        ;to rol ax to next nibble to left
  428.         rol     ax,cl
  429.     or    di,ax        ;ta daa!
  430.     dec    dl
  431.     jnz    jumplp
  432. ;get segment address
  433.         dec     si
  434.     dec    si
  435.     mov    al,es:[si]
  436.     call    hex2bin
  437.     jc    jumpxit
  438.     mov    ah,0
  439.         or      bx,ax
  440. jumpxit:mov    saves,es
  441.     jmp    find16        ;to jump to address
  442.  
  443.  
  444. find:   call    savcur
  445.     lea    si,find?
  446.     call    top
  447.     mov    bp,90
  448.     call    getstr
  449. ;put string in findstr
  450.     cmp    dx,0
  451.     jne    find12
  452.     jmp    find15        ;if no input
  453. find12: mov    si,90
  454.     lea    di,findstr
  455.     mov    cx,8
  456. find5:  mov     al,es:[si]
  457.     mov    ds:[di],al
  458.         inc     si
  459.     inc    si
  460.         inc     di
  461.     loop    find5
  462. ;write 'SEARCHING...'
  463.     lea    si,search
  464.     mov    cx,12
  465.     mov    di,108
  466.     mov    ah,7
  467.     call    movit
  468. ;search for string
  469.     mov    di,0        ;beginning of memory offset
  470.         mov     bx,0
  471.     mov    saves,es
  472.     mov    strcnt,dx    ;save it for again:
  473.     mov    cx,0ffffh    ;for scasb count
  474. ;jumped to from again:
  475. find14: mov    es,bx        ;beginning of memory segment
  476.     dec    dx        ;because cmpsb doesn't look at 1st char
  477.     jnz    find10
  478. ;if only one char to find
  479.     mov    al,findstr
  480.     repnz    scasb
  481.     jmp    short find11
  482. ;subroutine to increment segment
  483. find9:    mov    di,0
  484.     mov    cx,0ffffh
  485.     add    bx,1000h
  486.     mov    es,bx        ;to next segment
  487.     jc    find7        ;if past last segment
  488. ;big find loop
  489. find10: lea     si,findstr
  490.     mov    al,[si]
  491.     repnz    scasb        ;repeat until z=true or cx=0
  492.     jnz    find9        ;if string not found in current segment (cx=0)
  493.     mov    bp,di        ;save it
  494.     push    cx
  495.     mov    cx,dx        ;for cmpsb count
  496.     inc    si        ;point to remainder of string
  497.     repz    cmpsb        ;compare strings (repeat until z=false or cx=0)
  498.     pop    cx        ;get scasb count back
  499.     mov    di,bp        ;get it back
  500.     jnz    find10        ;if string not found
  501. ;jump to address
  502. find11: dec    di        ;offset addr
  503.     mov    cl,4
  504.     rol    bx,cl        ;move segment addr to right-most byte
  505.     and    bx,0fh        ;clear all but right-most byte
  506. find16: mov    dx,bx        ;for div by word
  507.     mov    ax,di
  508.     mov    cx,80
  509.     div    cx        ;remainder is in dx (& dl = column)
  510.     mov    curptr,dx    ;column (dh=0)
  511.     sub    di,curptr    ;to get toplef
  512.     jnc    find13
  513.     dec    bx
  514. find13: mov     cl,4
  515.     shr    di,cl
  516.     mov    cl,4
  517.     ror    bx,cl        ;back to previous shape
  518.     add    di,bx
  519.     mov    toplef,di    ;ta-daa!
  520.     mov    dh,1        ;put cursor on first row
  521.     mov    cursave,dx    ;for movcur
  522. ;clear message & exit
  523. find7:    mov    es,saves
  524. find15: mov    ax,700h
  525.     mov    di,108
  526.     mov    cx,12
  527.     rep    stosw
  528. ;put '? FOR HELP' back
  529.     lea    si,help?
  530.     call    top
  531.     mov    dx,cursave
  532.     call    movcur
  533.         jmp     newscrn
  534.  
  535. ;look for string again
  536. again:    call    savcur
  537.     lea    si,search
  538.     mov    cx,12
  539.     mov    di,108
  540.     mov    ah,7
  541.     call    movit
  542.     mov    dx,strcnt
  543.     mov    saves,es
  544.     mov    di,toplef
  545.     mov    bx,di
  546.     mov    cl,4
  547.     rol    di,cl
  548.     and    di,0fff0h    ;clear right byte
  549.     add    di,curptr    ;offset addr
  550.     inc    di        ;start looking 1 byte beyond current location
  551.         jnc     againsk
  552.     add    bx,1000h
  553. againsk:and    bx,0f000h    ;clear all but left byte (for seg addr)
  554.     mov    cx,0ffffh
  555.     sub    cx,di        ;for count to end of current segment
  556.         jmp     find14
  557.  
  558.  
  559. ;return to DOS
  560. exit:   mov     bh,0            ;page 0
  561.     mov    ah,bh        ;function to set screen mode
  562.     mov    al,mode
  563.     int    10h
  564. ;restore old cursor location
  565.         mov     dx,oldcur       ;old cursor location
  566.     dec    dh
  567.     call    movcur
  568. ;restore old screen
  569.         inc     dh
  570.         mov     di,0
  571.     lea    si,oldscr
  572. exitlp: mov    cx,80        ;columns
  573.     mov    ah,7
  574.         call    movit           ;move [si] into [di] & inc di cx times
  575.     dec    dh        ;rows
  576.     jnz    exitlp
  577.         int     20h             ;return to DOS
  578.  
  579. ;***CALLED ROUTINES***
  580.  
  581. top    proc    near
  582.     mov    cx,14
  583.     mov    di,78
  584.     mov    ah,70
  585.         call    movit
  586.     ret
  587. top    endp
  588.  
  589. movit   proc    near
  590. movlp:  lodsb
  591.     stosw
  592.     loop    movlp
  593.     ret
  594. movit    endp
  595.  
  596. ;save cursor location
  597. savcur  proc    near
  598.         call    getcur
  599.     mov    cursave,dx
  600.     mov    dx,1900h    ;row 25,col 0
  601.     jmp    short movcur
  602. savcur    endp
  603.  
  604. ;move cursor to row in dh & col in dl
  605. movcur  proc    near
  606.     mov    ah,2
  607.     jmp    short cur
  608. movcur  endp
  609.  
  610. ;put row in dh & col in dl
  611. getcur  proc    near
  612.     mov    ah,3
  613. cur:    mov    bh,0
  614.     int    10h
  615.     ret
  616. getcur  endp
  617.  
  618. ;to jump to a subroutine (semi-trick)
  619. case    proc    near
  620.     pop    bx    ;RET address
  621.     mov    cl,[bx] ;number of comparisons to make
  622.     mov    ch,0
  623. caslop: inc    bx    ;to a db
  624.     cmp    al,[bx]
  625.     je    go
  626.     inc    bx    ;to a dw
  627.     inc    bx
  628.     loop    caslop
  629. go:    inc    bx    ;to a dw
  630.     mov    bx,[bx]
  631.         jmp     bx
  632. case    endp
  633.  
  634. ;to change binary to hex
  635. binihex proc    near
  636. binlp:    mov    cl,4
  637.     rol    bx,cl        ;move left byte to right side
  638.     mov    al,bl        ;this is necessary
  639.     and    al,0fh        ;clear left byte
  640.     add    al,30h
  641.     cmp    al,3ah
  642.     jl    num
  643.     add    al,7
  644. num:    stosb
  645.         inc     di
  646.         dec     ch
  647.     jnz    binlp
  648.     ret
  649. binihex endp
  650.  
  651. ;convert al from hex to binary
  652. hex2bin proc    near
  653.     cmp    al,'0'
  654.     jl    badhex
  655.     cmp    al,'9'
  656.     jle    hex2        ;if number
  657.     and    al,0dfh     ;make letters uppercase
  658.     cmp    al,'A'
  659.     jl    badhex
  660.     cmp    al,'F'
  661.     jg    badhex
  662.     sub    al,7
  663. hex2:    sub    al,30h
  664.     clc
  665.         ret
  666. badhex: stc
  667.     ret
  668. hex2bin endp
  669.  
  670. ;to put cursor at 0fffffh
  671. curend  proc    near
  672.     mov    dx,toplef
  673.         mov     cl,4
  674.     shl    dx,cl
  675.     mov    ax,0ffffh
  676.     sub    ax,dx
  677.     mov    curptr,ax
  678.         mov     cl,80
  679.     div    cl
  680.     inc    al
  681.         mov     dh,al           ;quotient (answer) (for row)
  682.     mov    dl,ah        ;remainder (for column)
  683.     jmp    short movcur
  684. curend    endp
  685.  
  686. lftcur    proc    near
  687.     call    getcur
  688.     cmp    dx,0100h
  689.     je    lfttop         ;if at top left of screen
  690.     dec    curptr
  691.     cmp    dl,0
  692.     je    prevlin
  693.     dec    dl
  694.     jmp    short lftmov
  695. prevlin:dec    dh
  696.     mov    dl,79
  697. lftmov: call    movcur
  698.         clc
  699. lftxit: ret
  700. lftcur  endp
  701.  
  702. lfttop: cmp    toplef,0
  703.     je    lftxit        ;if at beginning of memory
  704.     mov    dl,79
  705.     call    movcur
  706.     sub    toplef,5    ;80d shifted right
  707.     add    curptr,79    ;because of toplef change
  708.         stc
  709.         ret
  710.  
  711. rtcur   proc    near
  712.     cmp    toplef,0ff8ch
  713.     jc    rtcur2        ;if not at last screen
  714.     mov    ax,toplef
  715.         mov     cl,4
  716.     shl    ax,cl
  717.     inc    ax
  718.     add    ax,curptr
  719.         jc      rtexit          ;if cursor would go beyond 0fffffh
  720. rtcur2: inc     curptr
  721.     call    getcur
  722.     cmp    dl,79
  723.     je    nexlin
  724.     inc    dl
  725.     jmp    short rtmov
  726. nexlin: cmp    dh,24
  727.     je    rtbot
  728.     inc    dh
  729.     mov    dl,0
  730. rtmov:    call    movcur
  731.         clc
  732. rtexit: ret
  733. rtcur   endp
  734.  
  735. rtbot:  cmp     toplef,0ff8ch   ;last toplef in memory
  736.     jnc    rtexit
  737.     mov    dl,0
  738.     call    movcur
  739.         add     toplef,5
  740.     sub    curptr,80    ;because of toplef change
  741.         stc
  742.         ret
  743.  
  744. scrlock proc    near        ;check ScrollLock on or off
  745.     push    es
  746.     mov    ax,0
  747.         mov     es,ax
  748.     test    byte ptr es:[417h],00010000b
  749.     pop    es
  750.     ret
  751. scrlock endp
  752.  
  753. ;get string to search for
  754. getstr    proc    near
  755.         mov     dx,0            ;for count in cmpsb, below
  756.     mov    di,bp
  757. find2:  mov     ah,0            ;read keyboard function
  758.     int    16h
  759.     cmp    ah,14        ;Backspace key
  760.     je    find20
  761.     cmp    ah,83        ;Del key
  762.     je    find20
  763.     cmp    ah,75        ;Left Arrow key
  764.     je    find20
  765.     cmp    al,8
  766.     jne    find3        ;if no erase input
  767. ;erase char
  768. find20: cmp    di,bp
  769.     je    find2        ;don't erase if at beginning of input location
  770.     dec    di
  771.     dec    di
  772.     dec    dx
  773.         mov     word ptr es:[di],4620h  ;attribute & space
  774.     jmp    short find2
  775. ;put char on screen
  776. find3:  cmp     di,106          ;last input space
  777.     je    find4        ;exit
  778.     cmp    al,0dh        ;Enter key
  779.     je    find4        ;exit
  780.         stosb
  781.         inc     di
  782.     inc    dx
  783.     jmp    short find2
  784. find4:    ret
  785. getstr  endp
  786.  
  787. menwrt    proc    near
  788.         mov     di,160
  789.     mov    ax,0
  790.     mov    cx,5
  791.     rep    stosw
  792.         mov     ah,7            ;for attribute
  793.         mov     dx,24           ;rows
  794. menlp0: mov    cx,80        ;columns
  795. menlp:    lodsb
  796.     cmp    al,0
  797.     je    mensk
  798.     stosw
  799.         loop    menlp
  800. mensk:    rep    stosw
  801.     cmp    si,0
  802.     jne    mensk2
  803.     add    di,160
  804. mensk2: dec    dx
  805.     jnz    menlp0
  806.     mov    ah,0
  807.     int    16h        ;read keyboard
  808.         ret
  809. menwrt    endp
  810.  
  811. oldscr    equ    $
  812. code    ends
  813.     end    start
  814.