home *** CD-ROM | disk | FTP | other *** search
- ;
- ; LOADKEY -- Commodore 128 -- Version 2.0
- ;
- ; Loads key definitions from a disk file.
- ;
- ; Usage: LOADKEY {{d:}<fn>}
- ;
- ; The file must have a .KEY filetype. If a filename is not given
- ; in the command line, it will be requested. If a drive is not
- ; given, the current drive is assumed.
- ;
- ; Eugene L. Pizzetta
- ; 481 Revere Street
- ; Revere, MA 02151
- ; (617) 284-0891
- ;
- ; Assemble with MAC and load with HEXCOM. Z80.LIB required.
- ;
- ;
- Bdos equ 0005h ; Bdos entry
- WBoot equ 00h ; warm boot
- BELL equ 07h ; BEL
- CR equ 0Dh ; carriage return
- DBuff equ 0080h ; default buffer
- DskBuf equ 01000h ; disk dma address (Bank 1)
- Fcb equ 05Ch ; default file control block
- FcbDr equ Fcb ; drive
- FcbEx equ Fcb+0Ch ; extent
- FcbName equ Fcb+1 ; filename
- FcbType equ Fcb+9 ; filetype
- KeyBuf equ 01000h ; key table address (Bank 0)
- LF equ 0Ah ; linefeed
- MvSize equ 080h ; bytes to move (128 maximum interbank)
- TPA equ 0100h ; program load address
- Fail equ 0FF00h ; program failure code
- ;
- ; BDOS service functions
- ;
- PrStr equ 9
- GetStr equ 10
- FOpen equ 15
- FClose equ 16
- FRead equ 20
- SetDma equ 26
- FMulti equ 44
- BdosRet equ 108
- ParseFn equ 152
- ;
- ; BIOS services (jump table)
- ;
- BiosMv equ 0F04Bh ; block move
- BiosXmv equ 0F057h ; set source and destination banks
- ;
- ;
- ; Macros
- ;
- MACLIB Z80
- ;
- BLKMOVE MACRO FROM,TO,LENGTH
- lxi h,FROM
- lxi d,TO
- lxi b,LENGTH
- LDIR
- ENDM
- ;
- ;
- ;
- org TPA
- jmp MAIN
- ;
- MSG1: db CR,LF,'LOADKEY Commodore 128 v 2.0$'
- MSG2: db CR,LF,LF,'Load key definitions from file: $'
- MSG3: db CR,LF,LF,'File Not Found',BELL,CR,LF,'$'
- MSG4: db CR,LF,LF,'DONE$'
- ;
- DFCB: db 0,' '
- KTYPE: db 'KEY'
- BLANK: db ' '
- ;
- PFCB: dw DBuff+2
- dw Fcb
- ;
- COUNT: db 0
- ;
- MAIN: lxi d,MSG1 ; print sign-on
- call PRINT
- ;
- lda Fcb+1 ; check for command tail
- cpi 'A'
- JRNC ISFILE ; tail found
- lxi d,MSG2 ; if not, print message
- call PRINT
- BLKMOVE DFCB,FCB,36 ; clear FCB
- BLKMOVE BLANK,DBuff+2,14
- mvi a,14
- sta DBuff
- lxi d,DBuff
- call GETS
- call PARSE ; parse it, and
- lxi h,FcbName ; make sure it's uppercase
- mvi b,08
- call UPCASE
- ;
- ISFILE BLKMOVE KTYPE,FcbType,3 ; type: .KEY
- call OPEN
- inr a ; does file exist
- JRNZ RDFILE ; if so, read it
- lxi d,MSG3 ; if not, print message
- call PRINT
- mvi c,BdosRet ; send failure code
- lxi d,Fail ; ..to the BDOS
- call Bdos
- jmp EXIT ; and abort
- ;
- RDFILE: mvi c,SetDma ; set DMA for disk write
- lxi d,DskBuf
- call Bdos
- mvi c,FMulti ; set multi-sector write
- lxi d,0008h
- call Bdos
- call READ
- call CLOSE
- ;
- lxi d,DskBuf ; starting source address
- lxi h,KeyBuf ; starting target address
- mvi a,0 ; set count to 0
- AGAIN: sta COUNT ; store count
- call BNKSET ; set for interbank move
- call BNKMOV ; then move it
- lda COUNT ; get count
- inr a ; increment it
- cpi 8 ; eight times yet?
- JRNZ AGAIN ; if not, go again
- ;
- lxi d,MSG4 ; say goodbye
- call PRINT
- EXIT: jmp WBoot ; return to CCP
- ;
- ;
- BNKSET: mvi c,1 ; source bank in C
- mvi b,0 ; destination bank in B
- call BiosXmv ; set for interbank move
- ret
- ;
- BNKMOV: lxi b,MvSize ; bytes to move in BC
- call BiosMv ; call for interbank move
- ret
- ;
- CLOSE: mvi c,FClose ; close file
- lxi d,Fcb
- call Bdos
- ret
- ;
- GETS: mvi c,GetStr ; get string to address
- call Bdos ; pointed to in DE
- ret
- ;
- OPEN: lxi d,Fcb ; open file
- mvi c,FOpen
- call Bdos
- ret
- ;
- PARSE: lxi d,PFCB ; parse string in DBUFF
- mvi c,ParseFn ; to FCB filespec
- call Bdos
- ret
- ;
- PRINT: mvi c,PrStr ; print string, pointed to
- call Bdos ; by DE, at console
- ret
- ;
- READ: mvi c,FRead ; read file into buffer
- lxi d,Fcb
- call Bdos
- ret
- ;
- UPCASE: mov a,m ; make uppercase
- ani 05Fh
- inx h
- DJNZ UPCASE
- ret
- ;
- end