home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / c128 / key128-2.ark / LOADKEY2.ASM < prev    next >
Assembly Source File  |  1987-05-23  |  4KB  |  184 lines

  1. ;
  2. ; LOADKEY -- Commodore 128 -- Version 2.0
  3. ;
  4. ; Loads key definitions from a disk file.
  5. ;
  6. ;    Usage:    LOADKEY {{d:}<fn>}
  7. ;
  8. ; The file must have a .KEY filetype.  If a filename is not given
  9. ; in the command line, it will be requested.  If a drive is not
  10. ; given, the current drive is assumed.
  11. ;
  12. ;    Eugene L. Pizzetta
  13. ;    481 Revere Street
  14. ;    Revere, MA  02151
  15. ;    (617) 284-0891
  16. ;
  17. ; Assemble with MAC and load with HEXCOM.  Z80.LIB required.
  18. ;
  19. ;
  20. Bdos    equ    0005h        ; Bdos entry
  21. WBoot    equ    00h        ; warm boot
  22. BELL    equ    07h        ; BEL
  23. CR    equ    0Dh        ; carriage return
  24. DBuff    equ    0080h        ; default buffer
  25. DskBuf    equ    01000h        ; disk dma address (Bank 1)
  26. Fcb    equ    05Ch        ; default file control block
  27. FcbDr    equ    Fcb        ; drive
  28. FcbEx    equ    Fcb+0Ch        ; extent
  29. FcbName    equ    Fcb+1        ; filename
  30. FcbType    equ    Fcb+9        ; filetype
  31. KeyBuf    equ    01000h        ; key table address (Bank 0)
  32. LF    equ    0Ah        ; linefeed
  33. MvSize    equ    080h        ; bytes to move (128 maximum interbank)
  34. TPA    equ    0100h        ; program load address
  35. Fail    equ    0FF00h        ; program failure code
  36. ;
  37. ; BDOS service functions
  38. ;
  39. PrStr    equ    9
  40. GetStr    equ    10
  41. FOpen    equ    15
  42. FClose    equ    16
  43. FRead    equ    20
  44. SetDma    equ    26
  45. FMulti    equ    44
  46. BdosRet    equ    108
  47. ParseFn    equ    152
  48. ;
  49. ; BIOS services (jump table)
  50. ;
  51. BiosMv    equ    0F04Bh        ; block move
  52. BiosXmv    equ    0F057h        ; set source and destination banks
  53. ;
  54. ;
  55. ; Macros
  56. ;
  57.     MACLIB    Z80
  58. ;
  59. BLKMOVE    MACRO    FROM,TO,LENGTH
  60.     lxi    h,FROM
  61.     lxi    d,TO
  62.     lxi    b,LENGTH
  63.     LDIR
  64.     ENDM
  65. ;
  66. ;
  67. ;
  68.     org    TPA
  69.     jmp    MAIN
  70. ;
  71. MSG1:    db    CR,LF,'LOADKEY    Commodore 128    v 2.0$'
  72. MSG2:    db    CR,LF,LF,'Load key definitions from file: $'
  73. MSG3:    db    CR,LF,LF,'File Not Found',BELL,CR,LF,'$'
  74. MSG4:    db    CR,LF,LF,'DONE$'
  75. ;
  76. DFCB:    db    0,'        '
  77. KTYPE:    db    'KEY'
  78. BLANK:    db    '              '
  79. ;
  80. PFCB:    dw    DBuff+2
  81.     dw    Fcb
  82. ;
  83. COUNT:    db    0
  84. ;
  85. MAIN:    lxi    d,MSG1        ; print sign-on
  86.     call    PRINT
  87. ;
  88.     lda    Fcb+1        ; check for command tail
  89.     cpi    'A'
  90.     JRNC    ISFILE        ; tail found
  91.     lxi    d,MSG2        ; if not, print message
  92.     call    PRINT
  93.     BLKMOVE    DFCB,FCB,36    ; clear FCB
  94.     BLKMOVE    BLANK,DBuff+2,14
  95.     mvi    a,14
  96.     sta    DBuff
  97.     lxi    d,DBuff
  98.     call    GETS
  99.     call    PARSE        ; parse it, and
  100.     lxi    h,FcbName    ; make sure it's uppercase
  101.     mvi    b,08
  102.     call    UPCASE
  103. ;
  104. ISFILE    BLKMOVE    KTYPE,FcbType,3    ; type: .KEY
  105.     call    OPEN
  106.     inr    a        ; does file exist
  107.     JRNZ    RDFILE        ; if so, read it
  108.     lxi    d,MSG3        ; if not, print message
  109.     call     PRINT
  110.     mvi    c,BdosRet    ; send failure code
  111.     lxi    d,Fail        ; ..to the BDOS
  112.     call    Bdos
  113.     jmp    EXIT        ; and abort
  114. ;
  115. RDFILE:    mvi    c,SetDma    ; set DMA for disk write
  116.     lxi    d,DskBuf
  117.     call    Bdos
  118.     mvi    c,FMulti    ; set multi-sector write
  119.     lxi    d,0008h
  120.     call    Bdos
  121.     call    READ
  122.     call    CLOSE
  123. ;
  124.     lxi    d,DskBuf    ; starting source address
  125.     lxi    h,KeyBuf    ; starting target address
  126.     mvi    a,0        ; set count to 0
  127. AGAIN:    sta    COUNT        ; store count
  128.     call    BNKSET        ; set for interbank move
  129.     call    BNKMOV        ; then move it
  130.     lda    COUNT        ; get count
  131.     inr    a        ; increment it
  132.     cpi    8        ; eight times yet?
  133.     JRNZ    AGAIN        ; if not, go again
  134. ;
  135.     lxi    d,MSG4        ; say goodbye
  136.     call    PRINT
  137. EXIT:    jmp    WBoot        ; return to CCP
  138. ;
  139. ;
  140. BNKSET:    mvi    c,1        ; source bank in C
  141.     mvi    b,0        ; destination bank in B
  142.     call    BiosXmv        ; set for interbank move
  143.      ret
  144. ;
  145. BNKMOV:    lxi    b,MvSize    ; bytes to move in BC
  146.     call    BiosMv        ; call for interbank move
  147.     ret
  148. ;
  149. CLOSE:    mvi    c,FClose    ; close file
  150.     lxi    d,Fcb
  151.     call    Bdos
  152.     ret
  153. ;
  154. GETS:    mvi    c,GetStr    ; get string to address
  155.     call    Bdos        ; pointed to in DE
  156.     ret
  157. ;
  158. OPEN:    lxi    d,Fcb        ; open file
  159.     mvi    c,FOpen
  160.     call    Bdos
  161.     ret
  162. ;
  163. PARSE:    lxi    d,PFCB        ; parse string in DBUFF
  164.     mvi    c,ParseFn    ; to FCB filespec
  165.     call    Bdos
  166.     ret
  167. ;
  168. PRINT:    mvi    c,PrStr        ; print string, pointed to
  169.     call    Bdos        ; by DE, at console
  170.     ret
  171. ;
  172. READ:    mvi    c,FRead        ; read file into buffer
  173.     lxi    d,Fcb
  174.     call    Bdos
  175.     ret
  176. ;
  177. UPCASE:    mov    a,m        ; make uppercase
  178.     ani    05Fh
  179.     inx    h
  180.     DJNZ    UPCASE
  181.     ret
  182. ;
  183.     end
  184.