home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
441.lha
/
kickdate
/
cli.asm
< prev
next >
Wrap
Assembly Source File
|
1990-11-13
|
5KB
|
195 lines
*
* /* KICKDATE - Copyright 1990 Joe Porkka
* FREELY DISTRIBUTABLE
*
* Purpose: Keeps the current date on the Kickstart disk
* for A1000 owners with autoboot harddrives.
*
* Version 1.0
*
* */
*
pr_CLI equ $00ac
cli_CommandName equ $0010
* This is a modified ASTARTUP.ASM file
* it is stripped down to work only from a CLI
******* Imported *******************************************************
xlib macro
xref _LVO\1
endm
xref _AbsExecBase
xlib Input
xlib Output
xref _main ; C code entry point
xlib FindTask
xlib OpenLibrary
xlib CloseLibrary
******* Exported *******************************************************
xdef _SysBase
xdef _DOSBase
xdef _errno
xdef _stdin
xdef _stdout
xdef _stderr
xdef _exit ; standard C exit function
callsys macro
jsr _LVO\1(a6)
endm
************************************************************************
*
* Standard Program Entry Point
*
************************************************************************
*
* main (argc, argv)
* int argc;
* char *argv[];
*
************************************************************************
startup: ; reference for Wack users
move.l sp,initialSP ; initial task stack pointer
move.l d0,dosCmdLen
move.l a0,dosCmdBuf
;------ get Exec's library base pointer:
move.l _AbsExecBase,a6
move.l a6,_SysBase
;------ get the address of our task
suba.l a1,a1
callsys FindTask
move.l d0,a4
fromCLI:
;------ attempt to open DOS library:
bsr openDOS
;------ find command name:
move.l pr_CLI(a4),a0
add.l a0,a0 ; bcpl pointer conversion
add.l a0,a0
move.l cli_CommandName(a0),a0
add.l a0,a0 ; bcpl pointer conversion
add.l a0,a0
;------ create buffer and array:
movem.l d2/a2/a3,-(sp)
lea argvArray,a3
moveq.l #1,d2 ; param counter
;------ fetch command name:
moveq.l #0,d0
move.b (a0)+,d0 ; size of command name
move.l a0,(a3)+ ; ptr to command name
clr.b 0(a0,d0.w) ; zero byte at end
;------ collect parameters:
move.l dosCmdLen,d0
move.l dosCmdBuf,a0
;------ skip control characters and space:
3$: move.b (a0)+,d1
subq.l #1,d0
ble.s parmExit
cmp.b #' ',d1
ble.s 3$
;------ copy parameter:
addq.l #1,d2 ; param count
lea.l -1(a0),a1
move.l a1,(a3)+
; bra.s 5$
4$: move.b (a0)+,d1
subq.l #1,d0
cmp.b #' ',d1
bgt 4$
; ble.s 6$
5$: ;move.b d1,(a2)+
; bra.s 4$
;6$:
clr.b -1(a0)
cmp #32,d2
blt 3$
; bra.s 3$
parmExit: clr.b (a0)+
clr.l (a3)+
move.l d2,d0
movem.l (sp)+,d2/a2/a3
pea argvArray
move.l d0,-(sp)
*
* The above code relies on the end of line containing a control
* character of any type, i.e. a valid character must not be the
* last. This fact is ensured by DOS.
*
;------ get standard input handle:
move.l _DOSBase,a6
callsys Input
move.l d0,_stdin
;------ get standard output handle:
callsys Output
move.l d0,_stdout
move.l d0,_stderr
;------ call C main entry point
jsr _main
;------ return success code:
moveq.l #0,D0
move.l initialSP,sp ; restore stack ptr
rts
_exit:
move.l 4(SP),d0 ; extract return code
exit2:
move.l initialSP,SP ; restore stack pointer
move.l d0,-(SP) ; save return code
;------ close DOS library:
move.l _AbsExecBase,A6
move.l _DOSBase,d0
******************************************
DATA
************************************************************************
_SysBase dc.l 0
_DOSBase dc.l 0
_errno dc.l 0
_stdin dc.l 0
_stdout dc.l 0
_stderr dc.l 0
initialSP dc.l 0
dosCmdLen dc.l 0
dosCmdBuf dc.l 0
argvArray ds.l 32 ; MAX 32 args
DOSName dc.b 'dos.library',0
END