doc@j.cc.purdue.edu (Craig Norborg) (05/26/87)
PD version of the Install command. By Bryce Nesbitt. Note that his
new mailing address will be hoser.berkeley.edu in a few weeks.
;INSTALL, Public domain.
;Please tell me about any enhacements,changes,bugs or brain-damage in this
;code. bryce@cogsci.berkeley.EDU -or- ucbvax!cogsci!bryce
;Bryce Nesbitt 1712 Marin Ave. Berkeley, Ca 94707-2206
;
;FUNCTION:
; Works just like the CLI INSTALL command.
;
;BUGS:
; I use ARP.LIBRARY for all my parsing. You don't have that and I can't
; give it to you yet. Thus this version of INSTALL is hardwired for DF0:
;
; For some reason that is not entirely my fault, if the disk in DF0: is
; write-protected INSTALL will merrily report success.
;
; The second "bug" will be worked around in the final ARP release.
;
;NOTES:
; Assembled with METACOMCO and blink'ed with BLINK
;
NOLIST
INCLUDE 'exec/types.i'
INCLUDE 'exec/memory.i'
INCLUDE 'exec/ports.i'
INCLUDE 'exec/io.i'
INCLUDE 'libraries/dos.i'
INCLUDE 'libraries/dosextens.i'
INCLUDE 'devices/trackdisk.i'
;INCLUDE 'lib/exec_lib.i' ;my peculiarities.
;INCLUDE 'lib/dos_lib.i' ;you don't have these
blink macro
bchg #1,$bfe001
endm
jsrlib MACRO
xref _LVO\1
jsr _LVO\1(a6)
ENDM
jmplib MACRO
xref _LVO\1
jmp _LVO\1(a6)
ENDM
LIST
**************************
;--Get ready...--
move.l 4,a6
lea.l DOSName,a1
jsrlib OldOpenLibrary
move.l d0,a6
lea.l bblock,a0
move.l a0,a1
move.l #128+127,d3
moveq #0,d0
move.l d0,4(a0)
move.w #0,CCR
chksum move.l (a1)+,d1
addx.l d1,d0
dbra d3,chksum
neg.l d0
subq.l #1,d0
move.l d0,4(a0)
moveq #0,d0
bsr WRITELBLOCK
bne.s e_block
lea.l yess,a0
moveq #yese-yess,d3
bra.s in
e_block lea.l nos,a0
moveq #noe-nos,d3
in move.l a0,d2
jsrlib Output
move.l d0,d1
beq.s e_output
jsrlib Write
moveq #0,d0
rts
e_memory
e_output
e_deviceproc moveq #20,d0
rts
;
; port=CREATEPORTE(),exec
; d0 a6
; z=error
;
;FUNCTION: Create a nameless message port, 0 priority.
;RESULT: The port pointer or Z=1 if an error occured.
;REGISTERS: A6 must contain exec!
;EXAMPLE: bsr CREATEPORTE
; beq.s noport ;Not enough memory (or signals)
;
;xref CREATEPORTE
CREATEPORTE move.l a2,-(a7)
move.l #MEMF_PUBLIC+MEMF_CLEAR,d1
moveq #MP_SIZE,d0
jsrlib AllocMem
move.l d0,a2
tst.l d0
beq.s cp_nomemory
moveq #-1,d0
jsrlib AllocSignal ;d0=return
moveq #-1,d1
cmp.l d0,d1 ;-1 indicates bad signal
bne.s cp_sigok
move.l a2,a1
moveq #MP_SIZE,d0
jsrlib FreeMem
cp_nomemory move.l (a7)+,a2
moveq #0,d0
rts
cp_sigok move.b d0,MP_SIGBIT(a2)
move.b #PA_SIGNAL,MP_FLAGS(a2)
move.b #NT_MSGPORT,LN_TYPE(a2)
clr.b LN_PRI(a2)
suba.l a1,a1 ;a1=0/Find this task
jsrlib FindTask ;[d0=this task]
move.l d0,MP_SIGTASK(a2)
lea.l MP_MSGLIST(a2),a0 ;Point to list header
NEWLIST a0 ;Init new list macro
move.l a2,d0
move.l (a7)+,a2 ;cc's NOT affected
rts
;
;DELETEPORTE(port),exec
; a1 a6
;
;FUNCTION: Deletes the port by first setting some
; fields to illegal values then calling FreeMem.
;RESULT: none
;REGISTERS: A6 must contain exec!
;
;xref DELETEPORTE
DELETEPORTE move.l a1,-(a7)
moveq #-1,d0
move.b d0,LN_TYPE(a1)
move.l d0,MP_MSGLIST+LH_HEAD(a1)
moveq #0,d0 ;Clear upper 3/4 of d0
move.b MP_SIGBIT(a1),d0
jsrlib FreeSignal
move.l (a7)+,a1
moveq #MP_SIZE,d0
jmplib FreeMem
;
;WRITELBLOCK(buffer,block)
; a0 d0
;
WRITELBLOCK movem.l d2/a3/a6,-(a7)
move.l 4,a6
;move.l d0,d2
move.l a0,a3
suba.l #IOTD_SIZE,a7
moveq #IOTD_SIZE-1,d0 ;clear the new IORequest (slowly)
move.l a7,a0
clearit clr.b (a0)+
dbra d0,clearit
bsr CREATEPORTE
beq e_TDport
move.l d0,MN_REPLYPORT(a7)
move.b #NT_MESSAGE,LN_TYPE(a7)
lea.l TrackName,a0
move.l a7,a1
moveq #0,d0
moveq #0,d1
jsrlib OpenDevice ;[a0-name|d0=unit|a1-IO|d1-flags]
tst.l d0
bne.s e_TDopen
move.w #CMD_WRITE,IO_COMMAND(a7) ;ETD!!
move.l #1024,IO_LENGTH(a7)
;moveq #9,d0
;asl.l d0,d2 ;shift d2 by d0
;move.l d2,IO_OFFSET(a7)
clr.l IO_OFFSET(a7)
move.l a3,IO_DATA(a7)
move.l a7,a1
jsrlib DoIO ;[a1-IO]
move.b IO_ERROR(a7),d0 ;cc's set
bne.s e_TDerror
move.w #CMD_UPDATE,IO_COMMAND(a7) ;ETD!!
;move.l #1024,IO_LENGTH(a7)
;moveq #0,d2
;move.l d2,IO_OFFSET(a7)
;move.l a3,IO_DATA(a7)
move.l a7,a1
jsrlib DoIO ;[a1-IO]
move.w #TD_MOTOR,IO_COMMAND(a7) ;ETD!!
clr.l IO_LENGTH(a7) ;motor off
;moveq #0,d2
;move.l d2,IO_OFFSET(a7)
;move.l a3,IO_DATA(a7)
move.l a7,a1
jsrlib DoIO ;[a1-IO]
moveq #0,d7
move.b IO_ERROR(a7),d7
bra e_good
e_TDerror
e_TDopen
e_TDport moveq #-1,d7
e_good move.l MN_REPLYPORT(a7),a1
bsr DELETEPORTE
adda.l #IOTD_SIZE,a7 ;cc's not
movem.l (a7)+,d2/a3/a6 ;cc's not
move.l d7,d0
rts
DATA
;----------------------------------------------------------------------
;This is the actual boot-block. From the descriptions in the RKM I was
;able to determine the registers. From there to code was three steps;
;I tired OpenLibrary on DOS, zilch. Tried returning the value from
;FindResident, crash. And at last the correct answer -> extract the
;init pointer from the resident structure.
;
;Later investigation revealed:
;At boot-block time DOS.LIBRARY has not been built. A perfect time to
;add a totally different DOS! If you want to call the current DOS you
;will need a hyper-kludge.
;The code at the jump address returned by the boot code builds the DOS
;library, sends a message the does a REMTASK (!). No hope of using a JSR
;to return control.
;
;This area is checksumed on the fly, so feel free to change it either
;in source or object form.
;
cnop 0,4
bblock dc.b 'DOS',0 ;Disk Type
dc.l 0 ;Checksum
dc.l 880 ;Root block key
move.l 4,a6
lea.l DOSName(pc),a1
jsrlib FindResident
move.l d0,a0
tst.l d0
bne.s LibOpenOk
subq.l #1,d0 ;make -1
rts ;failure
DOSName dc.b 'dos.library',0
LibOpenOk move.l $16(a0),a0 ;Initial Jump
moveq #0,d0 ;success
rts
here
dcb.b 1024-(here-bblock),0 ;Pad block with zeros
;-- static data --
yess dc.b 'Disk in drive DF0: is now bootable.',10
yese
nos dc.b 'Install DF0: failed',10
noe
TrackName dc.b 'trackdisk.device',0
END
Craig Norborg
comp.{sources,binaries}.amiga moderator