* 
* /* 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
