Mercurial > hg > Members > kono > nitros9-code
view level2/cmds/reboot.asm @ 1933:1e312b144f4d
Major changes:
CCIO,CC3IO are now VTIO
GrfInt is now CoGrf
WindInt is now CoWin
VDGInt (L2), CO32 (L1) is now CoVDG
CO51 (L1) is now CoHR
CO80 (L1) is now CoWP
All files referencing these have been changed
author | boisy |
---|---|
date | Sat, 26 Nov 2005 21:31:29 +0000 |
parents | bf6f854a4299 |
children |
line wrap: on
line source
******************************************************************** * ReBoot - Reboot into OS-9 or DECB * * $Id$ * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * 1 ????/??/?? Alan DeKok * Started. nam ReBoot ttl Reboot into OS-9 or DECB ifp1 use defsfile endc tylg set Prgrm+Objct atrv set ReEnt+Rev rev set $00 mod eom,name,tylg,atrv,start,size *================================================================== * On boot-up, OS9p2 does (in order) * an I$ChDir to the directory specified in the Init file * this opens an RBF buffer for the device, and at the minimum, * allocates: * $0100 1 page by IOMan for the IRQ/VIRQ polling table * $0100 1 page by IOMan for the disk driver static storage * $0100 1 page by IOMan for the disk PD.BUF buffer * (the path descriptor comes out of memory allocated already by OS9p1 * from block 0) * * Next, OS9p2 does an I$Open to '/term' (or whatever, from the Init module) * $0100 1 page allocated for '/term' device static storage * $0100 1 page allocated for '/term' PD.BUF buffer * * VTIO does an F$Load to get GrfDrv into memory, and we then have * $0200 2 pages allocated by IOMan via F$AllPrc, for the F$Load *------- total * $0700 pages UP from $4000, so GrfDrv can load *================================================================== * The system's memory map is set up as: * $0000-$1FFF: block 0, global system memory * $2000-$3FFF: this block MUST be free: grfdrv is loaded here on boot * once booted, process descriptors, etc. get allocated here * $4000-$46FF: initial data storage for system prior to loading GrfDrv * $4700-$ECFF: OS9Boot file: $A600 maximum size * $ED00-$FEFF: kernel, and constant page at $FE00 * $FF00-$FFFF: hardware, and RAM under block $3F that's unused by everyone! *================================================================== maxOS9Bt equ $A600 max. size of the OS9Boot file org 0 OS9Boot rmb maxOS9Bt Kernel rmb $1200 size of the kernel to use PrcDsc rmb $0200 current process descriptor param.pt rmb 2 parameter pointer os9btsz rmb 2 size of the OS9Boot file rbflag rmb 2 -b -r flags oflag rmb 1 OS9Boot reload flag kflag rmb 1 kernel reload flag gflag rmb 1 GrfDrv reload flag Param rmb $C000-. shift everything up to $C000 Stack equ . GrfDrv rmb $2000 so we now have all of the memory full SIZE equ . *================================================================== * We'll put all of the 'magic' code in GrfDrv's stack, which doesn't * care about being uninitialize * * Actually, this program puts it at offset $0000 in block $3F, * which is $E000 when the system is rebooted. BOOT then copies * all of the information down to $1C80 before loading in the new OS9Boot * file, and copying the original BOOT module back to $ED00+$0130 *================================================================== org $1C80 where memory is ALWAYS mapped in os9.siz rmb 2 size of the os9boot file grf.flg rmb 1 flag: reload GrfDrv? os9.dat rmb 16 DAT image boot rmb $01D0 original BOOT module NAME fcs /ReBoot/ fcb $01 *================================================================== * Start of the program: Move the stack to lower memory, and * copy the parameters there, too. *================================================================== Start lds #stack point the stack to somewhere safe tfr d,y now Y = size of the parameter area ldu #param U=$0000 always in the Coco, so this is OK s.copy lda ,x+ sta ,u+ leay -1,y bne s.copy clra sta >oflag no os9boot sta >kflag no kernel sta >gflag no GrfDrv sta >rbflag default to allowing '-r -b' options ldx #Param point to the start of the parameters again stx >param.pt save pointer *================================================================== * Check for more parameters *================================================================== Check ldx >param.pt get the current parameter pointer check.p ldd ,x cmpa #C$SPAC skip leading spaces bne Contin leax 1,x bra check.p Contin cmpa #C$CR simply reboot bne Hy check for hyphens tst >rbflag are the '-r' '-b' options valid? lbne Finalize no, finalize the boot, and reboot lbra CrashIt yes, go ahead and crash the system. Hy cmpa #'- hyphen? lbne Help cmpb #'? help? lbeq Help andb #$DF make uppercase tst >rbflag are the '-r' '-b' options valid? bne o.flag no, skip ahead to checking other flags cmpb #'B lbeq CrashIt cmpb #'R reboot? lbeq LoadIt *================================================================== * Only -L -K -G options are valid here *================================================================== o.flag cmpb #'L load the OS9Boot file? lbeq load.os9 yes, go load it cmpb #'K load the kernel file? lbeq load.krn yes, go load it cmpb #'G load GrfDrv? lbne Help no, print out a help message *================================================================== * load in GrfDrv *================================================================== load.grf tst >gflag lbne Help stb >gflag ldu #grfdrv where to put grfdrv ldy #$2000 the maximum size it can be bsr load.fil lbra Check check for more options *================================================================== * Load in the kernel *================================================================== load.krn tst >kflag already loaded the kernel? lbne Help yes, print error stb >kflag we're loading the kernel ldu #kernel where to put the kernel ldy #$1200 the size of the kernel bsr load.fil load in the kernel file lbra Check check for more options *================================================================== * load the specified file * Entry: X = parameter pointer * Y = maximum size of the file to read * U = pointer to load address for the file *================================================================== load.fil stb >rbflag don't allow -r -b any more leax 2,x skip '-X' option lda ,x+ grab the next character cmpa #C$SPAC space? lbne Help no, print help message pshs x save filename for later lda #READ. read-only permissions os9 I$Open open the file lbcs fil.err stx >param.pt save parameter pointer for later tfr u,x put load address into X os9 I$Read read in the OS9Boot file lbcs fil.err puls x,pc restore unused X, and exit *================================================================== * load a new OS9Boot file *================================================================== load.os9 tst >oflag lbne Help stb >oflag flag we have an OS9Boot file requested stb >rbflag and the '-r' or '-b' options are no longer valid ldu #$0000 where to put the information ldy #MaxOS9Bt lbsr load.fil go load the file into memory sty >os9btsz save the size of the OS9Boot file for later * do some syntax checking on the OS9Boot file... lbra Check go check for more parameters *================================================================== * finalize the crash of the system *================================================================== Finalize lbsr Seek seek /DD to 0 os9 F$ID get my ID and process # ldx #PrcDsc point to where to put the process descriptor os9 F$GPrDsc get it lbcs Exit leax P$DATImg,x point to it's DAT image orcc #IntMasks shut off IRQ's lda #$3F block $3F sta >$FFA8 map in block $3F lda >oflag do OS9Boot? bne do.os9bt yup, skip ahead lda >gflag OS9Boot OR GrfDrv? beq do.kern neither one, just do the kernel lbra Help no OS9Boot, but trying to reload GrfDrv: invalid * copy our DAT image to block 0 do.os9bt ldu #$0000 to the start of block $3F ldd >os9btsz get the size of the OS9Boot file std ,u++ save it for later lda >gflag do we reload GrfDrv? sta ,u+ save flag for later ldb #16 copy the whole DAT image... dat.lp lda ,x+ sta ,u+ decb bne dat.lp lda >kflag do we move the kernel over? beq no.kern if clear, we don't have a kernel in high memory do.kern pshs u save current pointer to $E000+x ldu #$0D00 where to put the new kernel ldx #kernel where the new kernel currently is located ldy #$1200 the size of the kernel bsr bt.lp copy the kernel over a byte at a time puls u restore low memory pointer lda >oflag ora >gflag OS9Boot OR GrfDrv? lbeq LoadIt.0 nope, just the kernel: reboot quickly * copy the original BOOT module to block 0 no.kern ldx #$0D00+$0130 block 0, offset $0D00+REL bsr bt.copy leax eom,pc point to the end of the module ldu #$0D00+$0130 over top of the original BOOT module bsr bt.copy lbra LoadIt.0 and go re-load the OS9Boot file bt.copy ldy #$01D0 bt.lp lda ,x+ sta ,u+ leay -1,y bne bt.lp rts *================================================================== * crash the system *================================================================== CrashIt lbsr Seek seek /DD to track 0 orcc #IntMasks turn off IRQ's clrb stb >$FFA8 map in block 0 stb >$0071 cold reboot lda #$38 bottom of DECB block mapping sta >$FFA8 map in block zero stb >$0071 and cold reboot here, too ldu #$0000 force code to go at offset $0000 leax ReBoot,pc reboot code ldy #BtSize cit.loop lda ,x+ sta ,u+ leay -1,y bne cit.loop clr >$FEED cold reboot clr >$FFD8 go to low speed jmp >$0000 jump to the reset code *================================================================== * reboot the system *================================================================== ReBoot ldd #$3808 block $38, 8 times ldx #$FFA0 where to put it Lp sta 8,x put into map 1 sta ,x+ and into map 0 inca decb count down bne Lp lda #$4C standard DECB mapping sta >$FF90 clr >$FF91 go to map type 0 clr >$FFDE and to all-ROM mode ldd #$FFFF * clrd executes as CLRA on a 6809 fdb $104F tstb is it a 6809? bne Reset yup, skip ahead * ldmd #$00 go to 6809 mode! fcb $11,$3D,$00 Reset jmp [$FFFE] do a reset BtSize equ *-Reboot *================================================================== * reload the OS9Boot file *================================================================== LoadIt lbsr Seek seek /DD to track 0 orcc #IntMasks LoadIt.0 clr >$FFA8 map in block 0 ldu #$0520 somewhere unused leax <ReLoad,pc point to code to reboot the system ldy #LoadSiz lit.loop lda ,x+ sta ,u+ leay -1,y bne lit.loop jmp >$0520 and jump to it ReLoad clr >$FF91 go to map type 0 ldx #$ED00 where REL is located RLp leax 1,x to to the next byte (OS...) ldd ,x cmpd #M$ID12 bne RLp if not the start of a module ldd M$Exec,x get execution address of the module (REL) jmp d,x and go to it LoadSiz equ *-ReLoad *================================================================== * print out the help message *================================================================== Help leax HMsg,pc ldy #HLen Print lda #1 to STDOUT os9 I$Write ClnExit clrb Exit os9 F$Exit HMsg fcc /ReBoot: Reboots the system, or returns to DECB./ fcb C$CR,C$LF fcc / use: reboot [-b] [-r] [-k filename] [-l filename]/ fcc / [-g filename]/ fcb C$CR,C$LF fcc / -b = return to DECB (default)/ fcb C$CR,C$LF fcc / ( equivalent to <CTRL><ALT><RESET> )/ fcb C$CR,C$LF fcc / -r = reload OS9Boot/ fcb C$CR,C$LF fcc / ( equivalent to pressing <RESET> )/ fcb C$CR,C$LF fcc /** The previous 2 options are mutually exclusive to the/ fcc / next 3.**/ fcb C$CR,C$LF fcc / -k [filename] = load in a new kernel track from [filename]/ fcb C$CR,C$LF fcc / -l [filename] = reload the OS9Boot file from [filename]/ fcb C$CR,C$LF fcc / -g [filename] = load in a new GrfDrv from [filename]/ fcb C$CR,C$LF fcc / If you reload GrfDrv, you MUST also reload the/ fcc / OS9Boot file./ fcb C$CR,C$LF HLen equ *-HMsg DD fcs '/DD' *================================================================== * Seek /DD to sector 0... why not? *================================================================== Seek leax <DD,pc lda #READ. os9 I$Open bcs seek.ex ldx #$0000 ldu #$0000 os9 I$Seek restore head on /DD to track 0 os9 I$Close seek.ex rts fil.err puls u restore pointer to filename we had error with pshs b,cc save error code, condition leax >fil.msg,pc ldy #fil.len lda #$02 to STDERR os9 I$Write * A=$02 still... leax ,u fil.lp ldb ,u+ cmpb #C$SPAC bhi fil.lp ldb #C$CR get a CR stb -1,u save for later ldy #$0100 maximum amount of junk to write os9 I$WritLn dump out the filename puls b,cc restore error code, condition os9 F$Exit and exit fil.msg fcc /ReBoot: Error reading file: / fil.len equ *-fil.msg fcc 'MAGIC Boot Module is next!' emod eom equ * end