********************************************************************************
*
*                                     SHIP
*
* Format:        SHIP [#][<unitnum>]
* Template:      none
* Purpose:       To park or unpark units of the ALF device.
* Specification:
* SHIP is an attempt to make the smalles park program possible while maintaining
* minimal usability and reliability. The unary '#' allows you to unpark an ALF
* unit. If no unitnum is given, the unit 0 is shipped/unparked.
* Examples:
*  SHIP
* Parks the ALF unit zero.
*  SHIP #
* Restarts it again.
*  SHIP 100
* Parks the ALF unit 100.
*  SHIP #100
* Restarts it again

   IFND EXEC_TYPES_I
   INCLUDE "exec/types.i"
   ENDC
   IFND EXEC_IO_I
   INCLUDE "exec/io.i"
   ENDC
   IFND EXEC_PORTS_I
   INCLUDE "exec/ports.i"
   ENDC
   IFND EXEC_NODES_I
   INCLUDE "exec/nodes.i"
   ENDC

   XREF _LVOOpenDevice
   XREF _LVODoIO
   XREF _LVOCloseDevice

Ship:

   LEA IOStdReq(PC),A2
   MOVEA.L 4,A6

   ; If the first char of the argument line is a '#' we don't park
   ; the unit, but start it.

   CMPI.B #'#',(A0)
   BNE GetUnitNum

   MOVE.W #CMD_START,IO_COMMAND(A2)
   ADDQ.W #1,A0

GetUnitNum:

   MOVEQ #0,D0 ; Default UnitNum.

   ; The argument line terminates with a <LF>. This is checked first.

NextArgChar:

   CMPI.B #10,(A0)
   BEQ Go

   MOVE.B (A0)+,D1
   ANDI.W #$000F,D1
   MULU #10,D0
   ADD.W D1,D0
   BRA NextArgChar

   ; Do the huzzle.

Go:

   MOVEQ #0,D1
   LEA ALFName(PC),A0
   MOVEA.L A2,A1
   JSR _LVOOpenDevice(A6)
   TST.L D0
   BNE exitShip

   MOVEA.L A2,A1
   JSR _LVODoIO(A6)

   MOVE.L D0,-(SP)
   MOVEA.L A2,A1
   JSR _LVOCloseDevice(A6)
   MOVE.L (SP)+,D0

exitShip:

   RTS

IOStdReq:

   DC.L 0          ; LN_SUCC
   DC.L 0          ; LN_PRED
   DC.B NT_MESSAGE ; LN_TYPE
   DC.B 0          ; LN_PRI
   DC.L 0          ; LN_NAME
   DC.L 0          ; MN_REPLYPORT
   DC.W IOSTD_SIZE ; MN_LENGTH
   DC.L 0          ; IO_DEVICE
   DC.L 0          ; IO_UNIT
   DC.W CMD_STOP   ; IO_COMMAND
   DC.B IOF_QUICK  ; IO_FLAGS
   DC.B 0          ; IO_ERROR
   DC.L 0          ; IO_ACTUAL
   DC.L 0          ; IO_LENGTH
   DC.L 0          ; IO_DATA
   DC.L 0          ; IO_OFFSET

ALFName: DC.B "ALF.device",0

   END
