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 / ENTERPRS / CPM / UTILS / F / PASSWORD.ARK / PASSWORD.ASM next >
Assembly Source File  |  1989-09-27  |  8KB  |  306 lines

  1. ;    title    'PASSWORD.ASM'
  2. ;    page    60
  3. ;
  4. ;
  5. ;        PASSWORD.ASM            Version 1.0
  6. ;     By Bo McCormick       8/6/81
  7. ;
  8. ; This is a program that adds password protection
  9. ; to programs. Format:
  10. ;
  11. ; PASSWORD name_of_file
  12. ;
  13. ; Then answer the prompt with the password to be
  14. ; applied to the program:
  15. ;
  16. ; Password : enter password here
  17. ;
  18. ; If everything goes well, the program will be saved to disk.
  19. ; If not, a message is printed and control is passed
  20. ; to the CCP.
  21. ;
  22. ; The good part of this is, when you type in the program
  23. ; program name next time, instead of running the program
  24. ; right away, the program asks you for the password. If you
  25. ; reply with something other than the original password, the
  26. ; program doesn't run, and it returns to the ccp.
  27. ;
  28. ;
  29. ;EQUATES
  30. mesout:    equ    9        ;BDOS functions
  31. incon:    equ    10
  32. open:    equ    15
  33. close:    equ    16
  34. delete:    equ    19
  35. read:    equ    20
  36. write:    equ    21
  37. setdma:    equ    26
  38. ;
  39. cr    equ    0dh        ;ascii values
  40. lf    equ    0ah
  41. eos    equ    '$'
  42. ;
  43. boot    equ    0        ;0 for standard CP/M
  44.                 ;4200H for ALT. CP/M;
  45. bdos    equ    boot+5
  46. fcb    equ    boot+5ch
  47. defbuf    equ    boot+80h
  48. tpa    equ    boot+100h
  49. stack    equ    tpa
  50. ;
  51.     org    tpa
  52.  
  53. ;
  54. ;
  55. start:    lxi    h,0        ;save stack pointer
  56.     dad    sp        ;put stack in hl
  57.     shld    old$stack-offset    ;save it
  58.     lxi    sp,stack    ;get new stack
  59. ;
  60. ; stack saved so program can return to CCP without
  61. ; intervening warm start.
  62. ;
  63.     lda    fcb+9        ;get first char of extension
  64.     cpi    ' '        ;if ' ' then change to .COM
  65.     jz    no$type
  66.     cpi    'C'        ;If there is an extension,
  67.     jnz    not$right    ;make sure it's .COM
  68.     lda    fcb+10        ;check second letter
  69.     cpi    'O'        
  70.     jnz    not$right
  71.     lda    fcb+11
  72.     cpi    'M'        ;last letter
  73.     jz    is$com        ;if it is a COM, then cont.
  74. not$right:
  75.     call    end$mes        ;it's not a com file, so tell
  76. ;
  77.     db    cr,lf,'Must be a command (.COM) file'
  78.     db    cr,lf,eos
  79. ;
  80. end$mes:
  81.     pop    d        ;get address of message
  82.     mvi    c,mesout    ;PRINT STRING command
  83.     call    bdos        ;print error message
  84. ;
  85. finish:    lhld    old$stack-offset ;get old stack
  86.     sphl            ;put it in HL
  87.     ret            ;return to CP/M
  88. ;
  89. no$type    mvi    a,'C'        ;if there was space, change
  90.     sta    fcb+9        ;to COM
  91.     mvi    a,'O'
  92.     sta    fcb+10
  93.     mvi    a,'M'
  94.     sta    fcb+11
  95. ;
  96. is$com    mvi    a,0        ;zero record count
  97.     sta    fcb+32
  98.     mvi    c,open        ;OPEN file command
  99.     lxi    d,fcb        ;load address of FCB in DE
  100.     call    bdos        ;Open file
  101.     inr    a        ;successful?
  102.     jnz    open$ok        ;if so, then continue
  103.     call    end$mes        ;if not, then tell
  104. ;
  105.     db    cr,lf,'Cannot open file',cr,lf,eos
  106. ;
  107. open$ok    lxi    d,buffer-offset    ;point to where program goes
  108. r$loop:    mvi    c,setdma    ;SET DMA command
  109.     push    d        ;save it
  110.     call    bdos        ;and tell CP/M
  111.     lxi    d,fcb        ;point to FCB
  112.     mvi    c,read        ;READ sector command
  113.     call    bdos        ;do it
  114.     pop    d        ;get DMA address back
  115.     ana    a        ;EOF?
  116.     jnz    done$read    ;if so, then ask for password
  117.     lxi    h,80h        ;length of sector
  118.     dad    d        ;bump DMA
  119.     xchg            ;put new address in DE
  120.     jmp    r$loop        ;and read some more
  121. ;
  122. done$read:
  123.     xchg            ;dma ==> hl
  124.     shld    end$prog-offset    ;save last address
  125. gpasag    call    get$pas        ;print password message
  126. ;
  127. pas$mes    db    'Password: ',eos
  128. ;
  129. get$pas    pop    d        ;get address of message
  130.     mvi    c,mesout    ;PRINT STRING function
  131.     call    bdos        ;print it
  132.     lxi    d,defbuf    ;point to default buffer
  133.     mvi    a,8        ;tell CP/M max chars
  134.     stax    d        ;put it there
  135.     mvi    c,incon        ;READ LINE command
  136.     call    bdos        ;do it
  137.     lxi    h,defbuf+1    ;point to length
  138.     lxi    d,password-offset    ;point to storage
  139.     lda    defbuf+1    ;get length
  140.     ana    a        ;set flags
  141.     jz    gpasag        ;if 0 then ask again
  142.     inr    a        ;plus 1 for length byte
  143.     mov    b,a        ;put length in B
  144. mploop    mov    a,m        ;get char
  145.     stax    d        ;save it
  146.     inx    h        ;increment pointer
  147.     inx    d        ;  "          "
  148.     dcr    b        ;decrement length
  149.     jnz    mploop        ;if not zero, then next char
  150.     xra    a        ;zero a
  151.     sta    fcb+12        ;zero bytes in FCB
  152.     sta    fcb+14
  153.     sta    fcb+32
  154.     mvi    c,open        ;OPEN file command
  155.     lxi    d,fcb        ;point to FCB
  156.     call    bdos        ;open the file
  157.     lxi    d,n$start    ;point to new program start
  158. ;
  159.     push    d
  160. w$loop1    pop    d        ;get DMA
  161.     push    d        ;put it back on stack
  162.     mvi    c,setdma    ;SET DMA command
  163.     call    bdos        ;tell CP/M
  164.     lxi    d,fcb        ;point to FCB
  165.     mvi    c,write        ;WRITE SECTOR command
  166.     call    bdos        ;do it
  167.     pop    h        ;get DMA address from stack
  168.     lxi    d,80h        ;length of sector
  169.     dad    d        ;HL has new DMA
  170.     push    h        ;put it on stack
  171.     mov    a,h        ;this is to get 2's complement
  172.     cma            ;of address. We are subtracting
  173.     mov    d,a        ;the current address from the
  174.     mov    a,l        ;high address. If the high byte
  175.     cma            ;<1 , we are done
  176.     mov    e,a        ;
  177.     inx    d        ;Now 2's comp. of address in DE
  178.     lhld    end$prog-offset    ;get ending address
  179.     dad    d        ;Subtract (add 2's comp)
  180.     mov    a,h        ;get high byte
  181.     inr    a        ;is it FF (-1)?        
  182.     ana    a        ;set flags
  183.     jnz    w$loop1        ;if not, write another sector
  184. ;
  185.     mvi    c,close        ;That's it. Close the file
  186.     lxi    d,fcb        ;point to FCB
  187.     call    bdos        ;do it
  188.     jmp    finish        ;goto finish
  189. ;
  190. ;
  191. n$start:
  192. offset    equ    100h-n$start
  193. ;
  194. ;    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  195. ;    %% WARNING -                                        %%
  196. ;    %% From now on, all labels are in                   %%
  197. ;    %% the form:                                        %%
  198. ;    %%      LABEL   EQU  $+OFFSET                       %%
  199. ;    %%  This is to allow the program to run at100H      %%
  200. ;    %% when it is saved by the earlier portion.         %%
  201. ;    %%  ALL new labels added MUST be in the form        %%
  202. ;    %% LABEL   EQU  $+OFFSET for this program to work   %%
  203. ;    %% properly.                                        %%
  204. ;    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  205. ;
  206. ;This is portion of the program is placed at the beginning
  207. ;of the program to be PASSWORDed. When it is executed, it will
  208. ;ask for a password. If the password is incorrect, the program
  209. ;warm starts. If the password is correct, the program is moved
  210. ;to the TPA and executed.
  211. ;
  212.     lxi    h,0        ;save stack pointer
  213.     dad    sp        ;stack is in HL
  214.     shld    old$stack    ;save it
  215.     lxi    sp,stack    ;get new stack
  216.     call    ot$pw        ;print password message
  217. ;
  218.     db    cr,lf,'Password :'
  219.     db    eos
  220. ;
  221. ot$pw    equ    $+offset
  222.     pop    d        ;get address of message
  223.     mvi    c,mesout    ;PRINT STRING command
  224.     call    bdos        ;print it
  225.     lxi    d,newbuf    ;point to input buffer
  226.     mvi    c,incon        ;READ LINE command
  227.     call    bdos        ;read it
  228. ;
  229.     lxi    h,password    ;point to actual password
  230.     lxi    d,newbuf+1    ;point to user's input
  231.     mov    b,m        ;get length
  232. ;
  233. c$lp    equ    $+offset
  234.     ldax    d        ;get char
  235.     cmp    m        ;are they the same?
  236.     jnz    boot        ;if not, restart
  237.     inx    h        ;point to next characters
  238.     inx    d        ;  "    "  "        "
  239.     dcr    b        ;decrement length
  240.     jnz    c$lp        ;if not done, then loop
  241. ;
  242. ; Now we move a segment of code to a part of the default
  243. ; buffer. This segment moves the actual program down to the
  244. ; TPA
  245. ;
  246.     lxi    h,n$mv        ;point to code
  247.     lxi    d,defbuf+20h    ;point to new postion
  248.     mvi    b,n$m$len    ;length
  249. ;
  250. move    equ    $+offset
  251.     mov    a,m        ;get byte
  252.     stax    d        ;save it
  253.     inx    d        ;point to next addresses
  254.     inx    h        ;  "   "    "      "
  255.     dcr    b        ;decrement length
  256.     jnz    move        ;if not done, loop
  257.     jmp    defbuf+20h    ;go to segment
  258. ;
  259. n$mv    equ    $+offset    ;segment that gets moved
  260.     lhld    old$stack    ;get stack pointer
  261.     push    h        ;save it on stack
  262.     lxi    h,buffer    ;get start of actual program
  263.     mov    a,h        ;We have to compute the length
  264.     cma            ;and because X-Y equals
  265.     mov    d,a        ;X + Two's complent(Y), we have
  266.     mov    a,l        ;to find the 2's comp. of the
  267.     cma            ;first address
  268.     mov    e,a        ;
  269.     inx    d        ;Y is in DE
  270.     lhld    end$prog    ;get last address
  271.     dad    d        ;subtract (add 2's comp)
  272.     mov    b,h        ;put length in BC
  273.     mov    c,l        ; "    "     "  "
  274.     lxi    d,tpa        ;point to TPA
  275.     lxi    h,buffer    ;point to first address
  276. n$m$lp    equ    defbuf+20h+$+offset-n$mv
  277.     mov    a,m        ;get byte
  278.     stax    d        ;save byte
  279.     inx    h        ;increment address
  280.     inx    d        ;    "        "
  281.     dcx    b        ;decrement length
  282.     mov    a,b        ;check for zero left
  283.     ora    c        ;Are we done?
  284.     jnz    n$m$lp        ;if not, loop some more
  285.     pop    h        ;get stack from stack
  286.     sphl            ;put stack in SP
  287.     jmp    tpa        ;run program
  288. ;
  289. n$m$len    equ    $+offset-n$mv    ;length of segment
  290. ;
  291. ;
  292. password    equ    $+offset ;password storage
  293.     db    0,'         '
  294. ;
  295. newbuf    equ    $+offset    ;Users input buffer
  296.     db    10H,0,'                '
  297. ;
  298. old$stack    equ    $+offset ;place for stack
  299.     ds    2
  300. ;
  301. end$prog    equ    $+offset ;place for address
  302.     ds    2
  303. ;
  304. buffer    equ    $+offset    ;where actual program goes
  305.     end
  306.