home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG141.ARC / DOSLIKE.LBR / MORE.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  3KB  |  114 lines

  1. ;********************************************
  2. ; Program Written by: HARRIS LANDSBERG  c1985
  3. ; Name: MORE.ASM using standard 8080 ASM code
  4. ;
  5. ; Designed as a MS-DOS More filter simulation
  6. ;   when listing a file to the crt device.
  7. ;
  8. ; Comment: Will clear keyboard buffer if keys
  9. ;   are held down too long accidently. One of
  10. ;   my first attempts in Assembler. Control C
  11. ;   at --more-- prompt will return to CP/M.
  12. ;
  13. ; Run: MORE [d:]filename[.ext], no "*" or "?"
  14. ;********************************************
  15. bdos    equ    0005H    ;function call location
  16. fcb    equ    005CH    ;file control block
  17. dma    equ    0080H    ;dma buffer location
  18. dmal    equ    128    ;dma length
  19. sline    equ    23    ;lines per screen
  20. filel    equ    11    ;filename.ext length
  21. rchr    equ    1    ;read character function
  22. pchr    equ    2    ;output character function
  23. drio    equ    6    ;direct i/o function
  24. pstr    equ    9    ;string output function
  25. open    equ    15    ;open file function
  26. read    equ    20    ;read sequential record
  27. sdma    equ    26    ;set dma location
  28. ctrc    equ    3    ;control c (break)
  29. lf    equ    10    ;line feed
  30. cr    equ    13    ;carriage return
  31. ctrz    equ    26    ;file end charcter
  32. wildc    equ    '?'    ;wildcard character
  33. iread    equ    0FFH    ;input using direct i/o
  34. ;
  35. start    org    0100H    ;start location
  36. ;
  37.     lxi    h,fcb+1 ;filename location
  38.     mvi    b,filel ;file length
  39. check    mov    a,m    ;memory -> accumulator
  40.     cpi    wildc    ;wildcard?
  41.     jz    invnam    ;zero=invalid name
  42.     inx    h    ;next position
  43.     dcr    b    ;decrement count
  44.     jnz    check    ;not zero=continue
  45.     mvi    c,sdma    ;set dma location
  46.     lxi    d,dma
  47.     call    bdos
  48.     mvi    c,open    ;open file
  49.     lxi    d,fcb    ;name in fcb
  50.     call    bdos
  51.     inr    a    ;test if found
  52.     jz    notf    ;zero=not found
  53. rdfil    mvi    c,read    ;read file
  54.     lxi    d,fcb    ;name in fcb
  55.     call    bdos
  56.     ana    a    ;test if end
  57.     rnz        ;not zero=end
  58.     mvi    b,dmal    ;d=dma length
  59.     lxi    h,dma    ;hl=dma location
  60. again    mov    a,m    ;memory -> accumulator
  61.     cpi    ctrz    ;end-of-file?
  62.     rz        ;zero=eof
  63.     mov    e,a    ;reg a -> reg e
  64.     cpi    lf    ;line feed?
  65.     jnz    nolf    ;not zero=not lf
  66.     lda    line    ;line variable -> reg a
  67.     inr    a    ;increment
  68.     sta    line    ;store back
  69. nolf    inx h ! push h    ;next position, save
  70.     dcr b ! push b    ;one less, save
  71.     mvi    c,pchr    ;print character
  72.     call    bdos
  73.     lda    line    ;line variable -> reg a
  74.     cpi    sline    ;full screen?
  75.     jnz    nmore    ;not zero=not full
  76.     mvi    c,pstr    ;print string
  77.     lxi    d,more    ;promt location
  78.     call    bdos
  79.     xra    a    ;reset accumulator
  80.     sta    line    ;store in line
  81. clkey    mvi    c,drio    ;clear keyboard buffer
  82.     mvi    e,iread ;using direct i/o
  83.     call    bdos
  84.     ana    a
  85.     jnz    clkey    ;again if not clear
  86.     mvi    c,rchr    ;wait for character
  87.     call    bdos
  88.     cpi    ctrc    ;break?
  89.     jnz    domore    ;not zero=not break
  90.     pop b ! pop h    ;clean stack
  91.     ret
  92. domore    mvi    c,pstr    ;print character
  93.     lxi    d,crlf    ;skip line
  94.     call    bdos
  95. nmore    pop b ! pop h    ;obtain stack info
  96.     mov    a,b    ;reg b -> reg a
  97.     ana    a    ;test
  98.     jz    rdfil    ;zero=buffer finished
  99.     jmp    again    ;more in buffer
  100. notf    mvi    c,pstr    ;print string
  101.     lxi    d,fnot    ;error message
  102.     jmp    bdos
  103. invnam    mvi    c,pstr    ;print string
  104.     lxi    d,invn    ;error message
  105.     jmp    bdos
  106. ;
  107. more    db    '--more--$'
  108. fnot    db    'file not found$'
  109. invn    db    'invalid filename$'
  110. line    db    0
  111. crlf    db    cr,lf,'$'
  112. ;
  113.     end    start
  114.