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 / CPM / RCPM / CD7.AQM / CD7.ASM
Assembly Source File  |  2000-06-30  |  17KB  |  560 lines

  1. ;
  2. ;    ****************
  3. ;    *           *
  4. ;    *    cd.asm    *
  5. ;    *     v7.0     *
  6. ;    *           *
  7. ;    ****************
  8. ;
  9. ; 03/06/85 by Harry Kaemmerer CP/M-NET(tm) EAST (201) 249-0691
  10. ;       this utility has ability to chain to a .com file.
  11. ;       this program may be used by anyone for none profit.
  12. ;----------------------------------------------------------------------------
  13. ;Based on: FASTGO vers. 1.1, by James Whorton, 04/25/84 and GOTO vers. 7.0,
  14. ;by Harry Kaemmerer
  15. ;
  16. ;revisions in reverse order:
  17. ;
  18. ;03/06/85 made display independend of table entry size, deleted code
  19. ;      that displayed the drive/user (not needed)      - Harry Kaemmerer
  20. ;----------------------------------------------------------------------------
  21. ;when executed, this program does the following:
  22. ;
  23. ;1. checks for input, prints options and quits if none.
  24. ;2. evaluates input, seeking a match from the table.
  25. ;3. if no match found, tell user, display options and quit.
  26. ;4. on match, check for password status and get it if needed.
  27. ;5. if password doesn't match, abort.
  28. ;6. select specified user-area.
  29. ;
  30. ;  CD            displays usage and valid area_names
  31. ;  CD <area_name>    moves to area_name. if passworded,
  32. ;            gets same from user before moving.
  33. ;-----------------------------------------------------------------------
  34. NO    EQU    0
  35. YES    EQU    NOT NO
  36. ;-----------------------------------------------------------------------
  37. ;user settable options
  38. ;
  39. USECLR    EQU    NO        ;yes = clear screen works
  40. CLR    EQU    26        ;^Z = clear screen for kaypro
  41. MAXWORD    EQU    4        ;lenght of larest area_name entry in tabel
  42. WIDTH    EQU    16        ;# of columns to print across
  43. ;-----------------------------------------------------------------------
  44. ;equates section
  45. ;
  46. SKIP    EQU    (13-MAXWORD)+12    ;number of characters to skip when printing
  47.                 ;DO NOT CHANGE......
  48. BDOS    EQU    5        ;bdos call vector
  49. COUT    EQU    2        ;console char. out
  50. DIO    EQU    6        ;direct i/o call
  51. STUSR    EQU    32        ;get/set user #
  52. FCB    EQU    05CH        ;first fcb
  53. CR    EQU    13        ;carraige return
  54. LF    EQU    10        ;line feed
  55. BELL    EQU    7        ;console bell
  56. DEFBYT    EQU    4        ;current drive/user byte
  57. ;
  58. ;-----------------------------------------------------------------------
  59. ;program starts here
  60. ;
  61.     ORG    0100H
  62. ;
  63. ;the following code is the main body of the program.
  64. ;Check if user-area specified.
  65. ;
  66. START:    LXI    H,0        ;0 -> [HL]
  67.     DAD    SP        ;find caller's stack
  68.     SHLD    SAVESP        ;save for later
  69.     LXI    SP,STACK    ;set up our own stack
  70. ;
  71.      IF    USECLR
  72.     MVI    A,CLR        ;clr screen for kaypro
  73.     CALL    CTYPE
  74.      ENDIF
  75. ;
  76.     LDA    FCB+1        ;get first byte of fcb
  77.     CPI    32        ;blank?
  78.     JZ    USAGE        ;yes, print usage and quit
  79. ;
  80. ;ok, a user-area was specified. Let's see how long it is
  81. ;
  82.     MVI    B,0        ;set up counter
  83.     LXI    H,FCB+1        ;set up pointer
  84. ;
  85. LENCHK:    MOV    A,M        ;get a byte
  86.     INX    H        ;increment pointer
  87.     INR    B        ;increment counter
  88.     CPI    32        ;is it a blank?
  89.     JNZ    LENCHK        ;no, go again
  90.     MOV    A,B
  91.     STA    USRLEN        ;store count for later use
  92. ;
  93. ;now let's start checking the name specified against the table
  94. ;
  95.     LXI    H,TABLE+2    ;set up pointer
  96.     SHLD    CHARP        ;save pointer
  97. ;
  98. NAMCHK:    LHLD    CHARP        ;get table pointer
  99.     MOV    A,M        ;check for end of table
  100.     CPI    0        ;are we there?
  101.     JZ    NOMAT        ;yes, error message and usage
  102.     LXI    D,FCB+1        ;point to input
  103.     LDA    USRLEN        ;get length of input
  104.     MOV    B,A        ;move it to b
  105.     CALL    COMPAR        ;do the comparison
  106.     JZ    MATCH        ;it's a match, so do it
  107.     LXI    D,25        ;increment the pointer
  108.     LHLD    CHARP        ;get the pointer back
  109.     DAD    D        ;add it
  110.     SHLD    CHARP        ;save it
  111.     JMP    NAMCHK        ;try next entry
  112. ;
  113. ;a match was found, see if pwd protected
  114. ;
  115. MATCH:    LHLD    CHARP        ;get entry pointer
  116.     DCX    H        ;back up 1 bytes
  117.     MOV    A,M        ;get access code
  118.     CPI    ' '        ;need a password?
  119.     JZ    SELECT        ;nope, go ahead and do it
  120.                 ;get a password from user
  121.     CALL    ILPRT        ;prompt user
  122.     DB    'Password: ',0
  123.     LXI    H,USRPWD    ;point to storage area
  124.     MVI    B,0        ;max chars allowed 10
  125. ;
  126. PWD1:    PUSH    H
  127.     PUSH    B
  128.     MVI    E,0FFH        ;see if char there
  129.     MVI    C,DIO
  130.     CALL    BDOS
  131.     POP    B
  132.     POP    H
  133.     CPI    0        ;char ready?
  134.     JZ    PWD1        ;not yet
  135.     CPI    8        ;back space?
  136.     JZ    BSPACE        ;do a backspace
  137.     CPI    7FH        ;rubout?
  138.     JZ    BSPACE        ;do a backspace
  139.     CPI    CR        ;end of input?
  140.     JZ    PWD3        ;yes
  141.     MOV    M,A
  142.     INX    H        ;increment pointer
  143.     INR    B        ;increment char counter
  144.     MOV    A,B        ;get counter in a to check
  145.     CPI    10        ;buffer full?
  146.     JZ    PWD3        ;nope, get another char
  147.     MOV    B,A
  148.     JMP    PWD1
  149. ;
  150. ;do a backspace on input
  151. ;
  152. BSPACE:    DCR    B        ;move count to prior character
  153.     DCX    H        ;correct H also
  154.     MVI    A,' '        ;get a space
  155.     MOV    M,A        ;restore password storage
  156.     JMP    PWD1        ;and get a new character
  157. ;
  158. ;now do the check
  159. ;
  160. PWD3:    LHLD    CHARP        ;point to table entry
  161.     LXI    D,13
  162.     DAD    D
  163.     LXI    D,USRPWD
  164.     MVI    B,10        ;check 10 chars (pwd length)
  165.     CALL    COMPAR        ;do a comparison
  166.     JZ    SELECT        ;correct password supplied
  167.     CALL    ILPRT        ;nope, say forget it
  168.     DB    BELL,'Sorry, that area is not available.',CR,LF,0
  169.     JMP    DONE        ;display correct areas
  170. ;
  171. ;no option specified, or bad one, so list usage and table of definitions.
  172. ;
  173. NOMAT:    CALL    ILPRT        ;
  174.     DB    CR,LF,BELL,'Entry not found.',CR,LF,0
  175. ;
  176. USAGE:    CALL    ILPRT
  177.     DB    CR,LF,'Usage: CD <Area_Name> moves you to your area.'
  178.     DB    CR,LF,LF,0
  179. ;
  180. ;this routine prints the definition table. It prints <width> columns
  181. ;across and does not display any passwords.
  182. ;
  183.     LXI    H,TABLE+2    ;point to names
  184.     MVI    D,MAXWORD    ;# of bytes per entry to print
  185.     MVI    B,WIDTH        ;# of columns to print
  186. ;
  187. ;now send char and check for end of entry
  188. ;
  189. INFO1:    MOV    A,M        ;be sure it's there
  190.     CPI    0        ;end of tabel
  191.     JZ    DONE        ;yes...
  192.     CALL    CTYPE        ;send it
  193.     INX    H        ;increment pointer
  194.     DCR    D        ;decrement char counter
  195.     MOV    A,D        ;get char count to check
  196.     CPI    0        ;end of entry?
  197.     JNZ    INFO1        ;no, do another byte
  198. ;
  199. ;done with one entry, so evaluate first, skip past password section,
  200. ;print seperator and new line
  201. ;
  202.     MVI    D,MAXWORD    ;reset char counter
  203.     MVI    A,SKIP        ;# of chars to skip
  204. ;
  205. SKIP0:    INX    H        ;increment pointer
  206.     DCR    A        ;decrement char counter
  207.     CPI    0        ;past it yet?
  208.     JNZ    SKIP0        ;nope, not yet
  209. ;
  210.     MOV    A,M        ;get a character for end check
  211.     CPI    0        ;end of tabel
  212.     JZ    DONE        ;yes...
  213.     DCR    B        ;decrement column count
  214.     MOV    A,B        ;get count
  215.     CPI    0        ;need a new line?
  216.     JZ    SKIP1        ;yes
  217. ;
  218. ;add a seperator space between entries
  219. ;
  220.     MVI    A,' '        ;load a space for seperator
  221.     CALL    CTYPE        ;and send to the terminal
  222.     JMP    INFO1        ;now back to the grind
  223. ;
  224. SKIP1:    MVI    A,CR        ;start a new line
  225.     CALL    CTYPE
  226.     MVI    A,LF
  227.     CALL    CTYPE
  228.     MVI    B,WIDTH        ;reset column counter
  229.     MOV    A,M        ;get a character for end check
  230.     CPI    0        ;end of tabel
  231.     JZ    DONE        ;yes...
  232.     JMP    INFO1
  233. ;
  234. DONE:    CALL    ILPRT
  235.     DB    CR,LF,0
  236.     LHLD    SAVESP        ;get callers stack pointer -> [HL]
  237.     SPHL            ;now -> [SP]
  238.     RET            ;End of program!
  239. ;
  240. ;subroutines
  241. ;
  242. ;do a comparison, abort if match found compare routine, # of chars in b,
  243. ;text to check in de (input) and hl (table) if a match, zero flag will
  244. ;be set on exit
  245. ;
  246. COMPAR:    LDAX    D        ;get a char.
  247.     CALL    UCASE        ;make sure it's upper case
  248.     CMP    M        ;check it against text
  249.     RNZ
  250.     INX    H
  251.     INX    D
  252.     DCR    B
  253.     JNZ    COMPAR
  254.     RET
  255. ;
  256. ILPRT:    XTHL
  257. ;
  258. ILPLP:    MOV    A,M
  259.     ORA    A
  260.     JZ    ILPRET
  261.     CALL    CTYPE
  262.     INX    H
  263.     JMP    ILPLP
  264. ;
  265. ILPRET:    XTHL
  266.     RET
  267. ;
  268. CTYPE:    PUSH    B        ;save registers
  269.     PUSH    D
  270.     PUSH    H
  271.     MOV    E,A        ;put character in e reg.
  272.     MVI    C,COUT        ;select conout
  273.     CALL    BDOS        ;do it
  274.     POP    H        ;restore registers
  275.     POP    D
  276.     POP    B
  277.     RET            ;done
  278. ;
  279. UCASE:    CPI    061H        ;converts lower case...
  280.     RC            ;in a to upper case
  281.     CPI    07BH
  282.     RNC
  283.     ANI    05FH
  284.     RET
  285. ;
  286. ;we got this far, let's change the user # and drive
  287. ;
  288. SELECT:    LHLD    CHARP        ;point to table
  289.     DCX    H        ;back up 2 bytes
  290.     DCX    H
  291.     MOV    A,M        ;get value from table
  292.     STA    DEFBYT        ;put it in memory byte
  293.     MOV    A,M        ;get the byte
  294.     ANI    0F0H        ;mask out drive
  295.     RAR            ;rotate 4 times to get user #
  296.     RAR            ;in proper position
  297.     RAR
  298.     RAR
  299.     MOV    E,A        ;do it
  300.     MVI    C,STUSR
  301.     CALL    BDOS
  302.     LDA    DEFBYT        ;get user/drive byte
  303. ;
  304. ;----------------------------------------------------------------------------
  305. ; 04/20/84 by - Harry Kaemmerer
  306. ; auto chain to .com file routine for cp/m 2.2
  307. ; note "A" reg. must have user/drive info upon entry
  308. ;
  309.     PUSH    PSW        ;save drive/user
  310.     CALL    ILPRT
  311. ;
  312.      IF    USECLR
  313.     DB    CLR
  314.      ENDIF
  315. ;
  316.     DB    CR,LF,'Standby... ',0
  317.     POP    PSW        ;get user/drive info
  318.     MVI    D,0        ;insure d register is zero
  319.     MOV    E,A        ;drive/user from a to e
  320.     MVI    C,37        ;reset drive/user
  321.     CALL    BDOS        ;do it
  322.     LHLD    1        ;get bios jump table address
  323.     MOV    A,H        ;move jump vector in a << lh reversed
  324.     SUI    16H        ;change to start of ccp location
  325.     MOV    H,A        ;return to h register
  326.     MVI    L,0        ;make cold start address
  327.     SHLD    CCPLOC        ;and save it for jump vector
  328.     MVI    L,7        ;move offset to l
  329.     XCHG            ;put in de
  330.     LXI    H,FNAM        ;location of file name
  331. ;
  332. LLOOP:    MOV    A,M        ;get character
  333.     INX    H        ;increment from pointer
  334.     XCHG            ;swap hl with de
  335.     MOV    M,A        ;place character in memory
  336.     CPI    0        ;look for a zero
  337.     JZ    JUMP        ;fake jump to cold boot vector
  338.     INX    H        ;increment to: pointer
  339.     XCHG            ;swap hl with de
  340.     JMP    LLOOP        ;not done
  341. ;
  342. JUMP:    DB    0C3H        ;we need a jump instruction and next 2 bytes
  343. CCPLOC:    DB    0,0        ;become the jump address
  344. ;
  345. ; finish
  346. ;----------------------------------------------------------------------------
  347. ;storage area
  348. ;
  349. USRPWD:    DB    32,32,32,32,32    ;force ten spaces for password...
  350.     DB    32,32,32,32,32    ;input and compare storage space...
  351. CHARP:    DS    2        ;next char. address pointer
  352. USRLEN:    DS    1        ;length of user-area specified
  353.     DS    64
  354. STACK:    DS    2        ;new stack
  355. SAVESP:    DS    2        ;old stack
  356. ;
  357. ;--------------------------------------------------------------------
  358. ;change as needed the name of file or command to CHAIN to:
  359. ;
  360. FNAM:    DB    3,'DIR',0    ;number of bytes in name & file name to run
  361. ;        |   |    |
  362. ;        |   |    +--->    must be a zero
  363. ;        |   +------->    file or command name (must be in UPPER case)
  364. ;        +----------->    number of characters in name above.
  365. ;
  366. ;--------------------------------------------------------------------
  367. ;definition table.
  368. ;
  369. ;byte       purpose
  370. ;--------- ----------------------------------------------------------
  371. ;  1       allways a zero (0)              [ 1 byte ]
  372. ;  2       user#  in Hex              [ 1 byte ]
  373. ;  3       drive# in Hex              [ 1 byte ]
  374. ;  4       access code (* for passworded)      [ 1 byte ]
  375. ;  5       area name                  [13 bytes]
  376. ;  6       password (if indicated in access code) [10 bytes]
  377. ;
  378. ;examples: 000H=0A,001H=0B,010H=1A,011H=1B, etc.
  379. ;the examples may be changed, added to or deleted
  380. ;as long as the proper format is kept. all entries
  381. ;in table should be in upper case.
  382. ;
  383. ;format guide.. 123H,'455555555555556666666666'
  384. ;
  385. TABLE:
  386. ;
  387.     DB    000H,' A0                     '
  388.     DB    010H,' A1                     '
  389.     DB    020H,' A2                     '
  390.     DB    030H,' A3                     '
  391.     DB    040H,' A4                     '
  392.     DB    050H,' A5                     '
  393.     DB    060H,' A6                     '
  394.     DB    070H,' A7                     '
  395.     DB    080H,' A8                     '
  396.     DB    090H,' A9                     '
  397.     DB    0A0H,' A10                    '
  398.     DB    0B0H,' A11                    '
  399.     DB    0C0H,' A12                    '
  400.     DB    0D0H,' A13                    '
  401.     DB    0E0H,' A14                    '
  402.     DB    0F0H,' A15                    '
  403. ;
  404.     DB    001H,'pB0           123456    '
  405.     DB    011H,' B1                     '
  406.     DB    021H,' B2                     '
  407.     DB    031H,' B3                     '
  408.     DB    041H,' B4                     '
  409.     DB    051H,' B5                     '
  410.     DB    061H,' B6                     '
  411.     DB    071H,' B7                     '
  412.     DB    081H,' B8                     '
  413.     DB    091H,' B9                     '
  414.     DB    0A1H,' B10                    '
  415.     DB    0B1H,' B11                    '
  416.     DB    0C1H,' B12                    '
  417.     DB    0D1H,' B13                    '
  418.     DB    0E1H,' B14                    '
  419.     DB    0F1H,' B15                    '
  420. ;
  421.     DB    002H,' C0                     '
  422.     DB    012H,' C1                     '
  423.     DB    022H,' C2                     '
  424.     DB    032H,' C3                     '
  425.     DB    042H,' C4                     '
  426.     DB    052H,' C5                     '
  427.     DB    062H,' C6                     '
  428.     DB    072H,' C7                     '
  429.     DB    082H,' C8                     '
  430.     DB    092H,' C9                     '
  431.     DB    0A2H,' C10                    '
  432.     DB    0B2H,' C11                    '
  433.     DB    0C2H,' C12                    '
  434.     DB    0D2H,' C13                    '
  435.     DB    0E2H,' C14                    '
  436.     DB    0F2H,' C15                    '
  437. ;
  438.     DB    003H,' D0                     '
  439.     DB    013H,' D1                     '
  440.     DB    023H,' D2                     '
  441.     DB    033H,' D3                     '
  442.     DB    043H,' D4                     '
  443.     DB    053H,' D5                     '
  444.     DB    063H,' D6                     '
  445.     DB    073H,' D7                     '
  446.     DB    083H,' D8                     '
  447.     DB    093H,' D9                     '
  448.     DB    0A3H,' D10                    '
  449.     DB    0B3H,' D11                    '
  450.     DB    0C3H,' D12                    '
  451.     DB    0D3H,' D13                    '
  452.     DB    0E3H,' D14                    '
  453.     DB    0F3H,' D15                    '
  454. ;
  455.     DB    004H,' E0                     '
  456.     DB    014H,' E1                     '
  457.     DB    024H,' E2                     '
  458.     DB    034H,' E3                     '
  459.     DB    044H,' E4                     '
  460.     DB    054H,' E5                     '
  461.     DB    064H,' E6                     '
  462.     DB    074H,' E7                     '
  463.     DB    084H,' E8                     '
  464.     DB    094H,' E9                     '
  465.     DB    0A4H,' E10                    '
  466.     DB    0B4H,' E11                    '
  467.     DB    0C4H,' E12                    '
  468.     DB    0D4H,' E13                    '
  469.     DB    0E4H,' E14                    '
  470.     DB    0F4H,' E15                    '
  471. ;
  472.     DB    005H,' F0                     '
  473.     DB    015H,' F1                     '
  474.     DB    025H,' F2                     '
  475.     DB    035H,' F3                     '
  476.     DB    045H,' F4                     '
  477.     DB    055H,' F5                     '
  478.     DB    065H,' F6                     '
  479.     DB    075H,' F7                     '
  480.     DB    085H,' F8                     '
  481.     DB    095H,' F9                     '
  482.     DB    0A5H,' F10                    '
  483.     DB    0B5H,' F11                    '
  484.     DB    0C5H,' F12                    '
  485.     DB    0D5H,' F13                    '
  486.     DB    0E5H,' F14                    '
  487.     DB    0F5H,' F15                    '
  488. ;
  489.     DB    006H,' G0                     '
  490.     DB    016H,' G1                     '
  491.     DB    026H,' G2                     '
  492.     DB    036H,' G3                     '
  493.     DB    046H,' G4                     '
  494.     DB    056H,' G5                     '
  495.     DB    066H,' G6                     '
  496.     DB    076H,' G7                     '
  497.     DB    086H,' G8                     '
  498.     DB    096H,' G9                     '
  499.     DB    0A6H,' G10                    '
  500.     DB    0B6H,' G11                    '
  501.     DB    0C6H,' G12                    '
  502.     DB    0D6H,' G13                    '
  503.     DB    0E6H,' G14                    '
  504.     DB    0F6H,' G15                    '
  505. ;
  506.     DB    007H,'pH0           12345678  '
  507.     DB    017H,' H1                     '
  508.     DB    027H,' H2                     '
  509.     DB    037H,' H3                     '
  510.     DB    047H,' H4                     '
  511.     DB    057H,' H5                     '
  512.     DB    067H,' H6                     '
  513.     DB    077H,' H7                     '
  514.     DB    087H,' H8                     '
  515.     DB    097H,' H9                     '
  516.     DB    0A7H,' H10                    '
  517.     DB    0B7H,' H11                    '
  518.     DB    0C7H,' H12                    '
  519.     DB    0D7H,' H13                    '
  520.     DB    0E7H,' H14                    '
  521.     DB    0F7H,' H15                    '
  522. ;
  523.     DB    008H,' I0                     '
  524.     DB    018H,' I1                     '
  525.     DB    028H,' I2                     '
  526.     DB    038H,' I3                     '
  527.     DB    048H,' I4                     '
  528.     DB    058H,' I5                     '
  529.     DB    068H,' I6                     '
  530.     DB    078H,' I7                     '
  531.     DB    088H,' I8                     '
  532.     DB    098H,' I9                     '
  533.     DB    0A8H,' I10                    '
  534.     DB    0B8H,' I11                    '
  535.     DB    0C8H,' I12                    '
  536.     DB    0D8H,' I13                    '
  537.     DB    0E8H,' I14                    '
  538.     DB    0F8H,' I15                    '
  539. ;
  540.     DB    009H,' J0                     '
  541.     DB    019H,' J1                     '
  542.     DB    029H,' J2                     '
  543.     DB    039H,' J3                     '
  544.     DB    049H,' J4                     '
  545.     DB    059H,' J5                     '
  546.     DB    069H,' J6                     '
  547.     DB    079H,' J7                     '
  548.     DB    089H,' J8                     '
  549.     DB    099H,' J9                     '
  550.     DB    0A9H,' J10                    '
  551.     DB    0B9H,' J11                    '
  552.     DB    0C9H,' J12                    '
  553.     DB    0D9H,' J13                    '
  554.     DB    0E9H,' J14                    '
  555.     DB    0F9H,' J15                    '
  556. ;note: the following 4 bytes must be kept at the end of this table!
  557.     DB    0,0,0,0        ;<<<--- must be here....
  558. ;
  559.     END
  560.