home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / sysutl / xuser11.lbr / XUSER11.ZQ0 / XUSER11.Z80
Text File  |  1987-01-24  |  4KB  |  114 lines

  1. ;
  2. ;    program XUSER11.Z80 from XUSER.ASM
  3. ;
  4. ;       original program by John Evancie   7/3/85
  5. ;
  6. ;    to extend accessibility to CP/M's user areas
  7. ;
  8. ;    User types: XUSER xx
  9. ;    and program switches into the selected user
  10. ;       area, or into user area 0 if no argument is
  11. ;       supplied. Before BDOS is called, the program
  12. ;       checks that the argument is less than 32.
  13. ;
  14. ;    After the area is selected, the program uses
  15. ;    BDOS to get it back, and display it at the
  16. ;    console. In this way, both uses of BDOS function
  17. ;    call #32 are illustrated (even if it is a BIT 
  18. ;       redundant {and, in the case of the re-conversion
  19. ;       code, buggier than a swamp - removed as of
  20. ;       version 1.1 - b/m}).
  21. ;
  22. ;    It should be noted that this approach allows you
  23. ;    access to user areas 0 - 31, whereas access via
  24. ;    CCP is limited to user areas 0 - 15.
  25. ;
  26. ;Version 1.1 -
  27. ;Removed buggy and unnecessary arithmetic routines, when it's input in
  28. ;ASCII, why waste code reconverting from hex?  Educational intent is
  29. ;fine, but when the code is buggy, what is learned?  Converted to Zilog
  30. ;mnemonics and used relative jump instructions throughout, program is
  31. ;now well under 2 records long (does anyone really still run an 8080
  32. ;or 8085?), added BASE equate for non-standard CP/Ms, general tightening
  33. ;of code, removed CALL/RET instructions wherever fall-throughs or jumps
  34. ;will do, used DJNZ to shorten multiply-by-10 routine.
  35. ;                Bruce Morgen    9/25/85
  36. ;
  37. ;
  38. CR    EQU    0DH        ;carriage return
  39. LF    EQU    0AH        ;line feed
  40. UFLAG    EQU    0FFH        ;"get user" bdos value
  41. PBUFF    EQU    09H        ;"print string" bdos code
  42. GETUS    EQU    020H        ;"get/set user" bdos code
  43. FCB     EQU     05CH
  44. BDOS    EQU    05H
  45. BASE    EQU    0        ;usually 0 except for Heath, etc.
  46. TPA     EQU     BASE+0100H
  47. ;
  48.     ORG     TPA
  49.     LD    DE,MESS0    ;startup message
  50.     CALL    PRINT
  51. ;
  52.     LD    A,(FCB+1)    ;check the command line
  53.     CP    020H        ;is it blank?
  54.     JR    NZ,BEGIN    ;if not, take it apart below
  55.     LD    E,0        ;if so, assume user wants user area 0
  56.     JR    OK        ;and do it!
  57. ;
  58. ;
  59. BEGIN:    CP    '0'        ;legal ASCII numeral?
  60.     JR    C,ERROR        ;may as well bail out
  61.     CP    ':'        ;early if it is
  62.     JR    NC,ERROR    ;out of range
  63.     LD    A,(FCB+2)    ;the second character of the
  64.     CP    020H        ;command line blank?
  65.     JR    Z,SINGLE    ;if so, process the first one only
  66. ;
  67.     LD    (DIGPLC+1),A    ;store second character for printing
  68.     SUB    030H        ;convert the ASCII char to hex
  69.     LD    D,A        ;and stash the result in DE
  70. ;
  71.     LD    A,(FCB+1)    ;look at the first character now
  72.     CP    020H        ;is it blank?
  73.     JR    Z,ERROR        ;if so, assume user made a typo
  74. ;
  75.     LD    (DIGPLC),A    ;store first character for printing,
  76.     SUB    030H        ;convert to hex,
  77.     LD    H,A        ;H is an 8-bit register too - use it
  78.     LD    B,9        ;prepare to
  79. ADDAGN:    ADD    A,H        ;multiply by 10
  80.     DJNZ    ADDAGN        ;with Z80-style countdown
  81.     ADD    A,D        ;add the ones digit back in
  82.     LD    E,A        ;and store the result in E
  83. ;
  84. DOIT:    CP    020H        ;is it a kosher user area?
  85.     JR    C,OK        ;fall through if not
  86. ;
  87. ERROR:    LD    DE,MESS1    ;if not, point to error message
  88.     JR    PRINT        ;print it and back to CCP, WS, etc.
  89. ;
  90. SINGLE:    LD    A,(FCB+1)    ;grab the first and only digit
  91.     LD    (DIGPLC+1),A    ;store it for printout
  92.     SUB    030H        ;convert to hex
  93.     LD    E,A        ;move it into position for BDOS call
  94. ;
  95. OK:    LD    C,GETUS        ;put switch user code in C
  96.     LD    D,UFLAG        ;set D to change areas (instead of E)
  97.     CALL    BDOS        ;and do it
  98. ;
  99.     LD    DE,MESS2    ;point to User Area selected message
  100.                 ;and fall through to PRINT routine
  101. PRINT:    LD    C,PBUFF        ;print console buffer and back
  102.     JP    BDOS        ;to caller or (on fall-through)
  103.                 ;CCP, WS, etc., via BDOS
  104. MESS0:    DB    'XUSER v1.1 - 9/25/85',CR,LF,'$'
  105. MESS1:    DB    'Invalid user area selected,',CR,LF
  106.     DB    'must be a number from 0 through 31.',CR,LF,'$'
  107. MESS2:    DB    'User Area '
  108. DIGPLC:    DB    0,'0 selected.',CR,LF,'$'
  109. ;
  110.     END
  111. F
  112.     DB    'must be a number from 0 through 31.',CR,LF,'$'
  113. MESS2:    DB    'User Area '
  114. DIGPLC:    DB    0,'0 selected