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 / NSTAR / PUTUSR.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  7KB  |  315 lines

  1. ;PUTUSR.ASM v1.00 as of 12-15-83
  2. ;Written by S. Kluger and placed into the public domain.
  3. ;Please see PUTUSR.DOC for description
  4. ;
  5. dcomof    equ    16*3        ;offset to BIOS DCOM routine
  6. bios    equ    1        ;BIOS vector location
  7. bdos    equ    5        ;BDOS entry point
  8. usero    equ    700h        ;user offset from BIOS
  9. dbuf    equ    80h        ;default buffer
  10. conin    equ    1        ;BDOS console in
  11. print    equ    9        ;BDOS print string
  12. fopen    equ    15        ;BDOS open file
  13. fread    equ    20        ;BDOS read sequential
  14. stdma    equ    26        ;BDOS set DMA
  15. ;
  16. cr    equ    0dh
  17. lf    equ    0ah
  18. ;
  19.     org    100h
  20. ;
  21. ; Program entry point. Set up local stack.
  22. ;
  23. start:    lxi    sp,stack
  24.     call    banner        ;say who we are
  25.     call    ckcpm        ;check CP/M, ret only if ok
  26.     call    getidr        ;ask for input drive
  27.     call    loadhx        ;load hex file
  28.     call    xlhex        ;translate HEX to binary
  29. next:    call    savusr        ;write user to disk
  30.     jz    next        ;yes, more
  31.     rst    0        ;fast way out
  32. ;
  33. ; BANNER routine. Announce our presence.
  34. ;
  35. banner:    lxi    d,baner
  36. string:    mvi    c,print
  37.     jmp    bdos
  38. ;
  39. ; CKCPM routine. Set up pointers and check for N* CP/M
  40. ;
  41. ckcpm:    lhld    bdos+1        ;get BDOS pointer
  42.     mvi    l,0        ;point to OEM code
  43.     mov    a,m        ;get first byte
  44.     cpi    0e3h
  45.     jnz    barfc        ;complain if not N*
  46.     inx    h
  47.     mov    a,m
  48.     cpi    16h
  49.     jz    cpmok        ;continue if ok
  50. barfc:    lxi    d,mbarfc
  51.     call    string
  52.     rst    0        ;warm boot
  53. ;
  54. cpmok:    lhld    bios        ;get BIOS vector
  55.     lxi    d,dcomof    ;DCOM vector offset
  56.     dad    d        ;DCOM addr now in HL
  57.     shld    dcom+1        ;set address
  58.     mov    a,m        ;let's see if the...
  59.     cpi    0c3h        ;...BIOS is still ok
  60.     jnz    barfc        ;no, complain
  61.     ret
  62. ;
  63. ; GETIDR routine - get input drive letter A..P
  64. ;
  65. getidr:    lxi    d,mindr        ;display prompt
  66.     call    getdr        ;get A..P
  67.     ani    0fh        ;make 1..16
  68.     sta    fcb        ;save drive in FCB
  69.     ret
  70. ;
  71. ; LOADHX routine. Does the following:
  72. ; 1. open USER.HEX
  73. ; 2. load file into RAM, translate to binary
  74. ;
  75. loadhx:    call    ack        ;acknowledge
  76.     lxi    d,fcb        ;let's open the file
  77.     push    d        ;save fcb
  78.     mvi    c,fopen
  79.     call    bdos
  80.     inr    a
  81.     jz    nofile        ;complain of error
  82.     lxi    h,hbuf        ;set dma buffer
  83.     shld    hptr        ;save buffer ptr
  84.     xchg
  85.     mvi    c,stdma
  86.     call    bdos
  87.     pop    d        ;get fcb
  88.     push    d
  89.     mvi    c,fread
  90.     call    bdos        ;read a sector
  91.     ora    a
  92.     jnz    inerr        ;initial read error
  93. lloop:    lxi    d,80h        ;increment hex buffer
  94.     lhld    hptr
  95.     dad    d
  96.     shld    hptr
  97.     xchg
  98.     mvi    c,stdma
  99.     call    bdos
  100.     pop    d        ;get fcb
  101.     push    d        ;save it
  102.     mvi    c,fread
  103.     call    bdos        ;read next
  104.     ora    a        ;if no error...
  105.     jz    lloop        ;...then decode and load next
  106.     pop    d        ;clean up stack
  107.     ret            ;else done (hopefully)
  108. ;
  109. ; XLHEX - translate ASCII chars into binary
  110. ;
  111. xlhex:    lxi    h,buffer    ;hl=binary buffer
  112.     push    h        ;save it
  113.     lxi    b,200h        ;512 bytes to zero
  114. zerbuf:    mvi    m,0
  115.     inx    h
  116.     dcx    b
  117.     mov    a,b
  118.     ora    c
  119.     jnz    zerbuf
  120.     xchg
  121.     pop    h
  122. newln:    ldax    d        ;get next byte
  123.     cpi    ':'        ;separator?
  124.     inx    d        ;point ot next
  125.     jnz    newln        ;loop until : found
  126.     push    d
  127.     lxi    d,hbuf
  128.     mov    a,h
  129.     cmp    d
  130.     jnc    toobig
  131.     pop    d
  132.     mvi    c,0        ;zero checksum
  133.     call    get2        ;get 2 nybbles
  134.     ora    a        ;if zero
  135.     rz            ;then done.
  136.     mov    b,a        ;save count
  137.     push    h        ;save buffer
  138.     mvi    h,3        ;6 bytes to skip
  139. adsk:    call    get2        ;get byte
  140.     dcr    h
  141.     jnz    adsk
  142.     pop    h        ;now we get serious...
  143. code:    call    get2        ;get next
  144.     mov    m,a
  145.     inx    h
  146.     dcr    b
  147.     jnz    code
  148.     call    get2        ;get checksum
  149.     mov    a,c
  150.     ora    a
  151.     jz    newln        ;loop if ok
  152.     lxi    d,mcksm        ;checksum error
  153.     call    string
  154.     rst    0    
  155. ;
  156. ; SAVUSR routine - save user to disk and
  157. ;     ask for more saves.
  158. ;
  159. savusr:    lxi    d,modrv        ;display prompt
  160.     call    getdr        ;get A..P
  161.     ani    0fh
  162.     ori    80h        ;specify double density
  163.     push    psw
  164.     call    ack
  165.     pop    psw
  166. ;
  167. ; The following is register preparation for the DCOM
  168. ; routine. I call it DCOM because it is very similar to
  169. ; the N* DOS DCOM routine. the parameters are:
  170. ; B=track    C=density/drive
  171. ; D=sector    E=command
  172. ; A=# of sect    HL=buffer addr
  173. ; For more info, read the comments in DIRDUMP.ASM
  174. ;
  175.     mov    c,a        ;place drive/density in C
  176.     mvi    a,1        ;1 (one) N* sector
  177.     mvi    e,0        ;write command
  178.     mvi    d,8        ;sector
  179.     mvi    b,0        ;track
  180.     lxi    h,buffer    ;binary code buffer
  181. dcom:    call    0        ;filled at startup
  182.     lxi    d,mfcom        ;say finished
  183.     call    string
  184.     mvi    c,conin        ;get response
  185.     call    bdos
  186.     ani    5fh        ;make caps
  187.     cpi    'Y'
  188.     ret
  189. ;
  190. ; UTILITY SUBROUTINES
  191. ;
  192. ; GETDR - get drive letter in A, complain if invalid.
  193. ;
  194. getdr:    call    string
  195. agn:    mvi    c,conin
  196.     call    bdos        ;get response character
  197.     ani    5fh        ;make caps
  198.     cpi    'A'
  199.     jc    invdr        ;invalid drive
  200.     cpi    'P'
  201.     rc            ;return if ok
  202. invdr:    lxi    d,minvdr
  203.     call    string
  204.     jmp    agn
  205. ;
  206. ; GET2 - get 2 nybbles into A
  207. ; DE=pointer, save all reg
  208. ; ret with DE advanced and cksum updated
  209. ;
  210. get2:    push    b        ;save checksum & count
  211.     ldax    d        ;get hi nybble
  212.     cpi    'A'
  213.     jc    nhx1
  214.     sui    7
  215. nhx1:    ani    0fh
  216.     ral
  217.     ral
  218.     ral
  219.     ral
  220.     mov    b,a
  221.     inx    d
  222.     ldax    d
  223.     cpi    'A'
  224.     jc    nhx2
  225.     sui    7
  226. nhx2:    ani    0fh
  227.     ora    b
  228.     inx    d
  229.     pop    b
  230.     push    psw
  231.     add    c
  232.     mov    c,a
  233.     pop    psw
  234.     ret
  235. ;
  236. ; ACK routine - wait for RETURN
  237. ;
  238. ack:    lxi    d,mack
  239.     call    string
  240. ackl:    mvi    c,conin
  241.     call    bdos
  242.     cpi    cr
  243.     jnz    ackl
  244.     ret
  245. ;
  246. ; NOFILE - file not found
  247. ;
  248. nofile:    lxi    d,mnofil
  249.     call    string
  250.     rst    0
  251. ;
  252. ; INERR - empty file maybe?
  253. ;
  254. inerr:    lxi    d,minerr
  255.     call    string
  256.     rst    0
  257. ;
  258. ; TOOBIG - USER area is over 512 bytes
  259. ;
  260. toobig:    lxi    d,mbig
  261.     call    string
  262.     rst    0
  263. ;
  264. ; MESSAGES FOLLOW
  265. ;
  266. baner:    db    cr,lf
  267.     db    'PUTUSR v1.00 by S. Kluger',cr,lf
  268.     db    'Any response of CONTROL-C aborts.',cr,lf,lf,'$'
  269. ;
  270. mbarfc:    db    cr,lf,7
  271.     db    'ERROR - CP/M cannot be identified as '
  272.     db    'North Star CP/M - ABORTING',cr,lf,lf,'$'
  273. ;
  274. mindr:    db    cr,lf
  275.     db    'Please enter drive letter of the drive containing',cr,lf
  276.     db    'the file USER.HEX (A..P)  :$'
  277. ;
  278. modrv:    db    cr,lf
  279.     db    'USER file in RAM now, please enter drive letter',cr,lf
  280.     db    'of the output drive (A..P):$'
  281. ;
  282. mfcom:    db    cr,lf,lf
  283.     db    'SAVE COMPLETED.',cr,lf
  284.     db    'Do you wish to save USER to another disk (Y/N) ? $'
  285. ;
  286. minvdr:    db    cr,lf,lf,7
  287.     db    'Invalid drive. Drive letter must be A..P.',cr,lf
  288.     db    'Please try again (A..P)   :$'
  289. ;
  290. mnofil:    db    cr,lf,lf,7
  291.     db    'ERROR - file USER.HEX not found on disk!',cr,lf,lf,'$'
  292. ;
  293. minerr:    db    cr,lf,lf,7
  294.     db    'ERROR while reading USER.HEX - file empty?',cr,lf,lf,'$'
  295. ;
  296. mcksm:    db    cr,lf,lf,7
  297.     db    'CHECKSUM error in USER.HEX',cr,lf,lf,'$'
  298. ;
  299. mbig:    db    cr,lf,lf,7
  300.     db    'ERROR - USER area > 512 bytes!',cr,lf,lf,'$'
  301. ;
  302. mack:    db    cr,lf
  303.     db    'MOUNT DISK AND PRESS RETURN WHEN READY$'
  304. ;
  305. hptr:    dw    0
  306. ;
  307. fcb:    db    0,'USER    HEX',0,0,0,0,0,0,0,0,0
  308.     db    0,0,0,0,0,0,0,0,0,0,0,0,0
  309. ;
  310.     ds    48        ;some stack space
  311. stack    equ    $
  312. buffer    equ    $
  313. hbuf    equ    $+512
  314.     end
  315.