# HG changeset patch # User boisy # Date 1211294580 0 # Node ID 2db06bc0742a1abf8a7e2adbfa71bd6db8914a12 # Parent 755b1b8ea019c788304b705a5c01ab60c8542a24 Start of BootMan diff -r 755b1b8ea019 -r 2db06bc0742a bootman/boot_config.a --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bootman/boot_config.a Tue May 20 14:43:00 2008 +0000 @@ -0,0 +1,19 @@ + NAM boot_config + TTL Boot manager configuration + + PSECT bc,0,0,0,0,boot_config + +boot_config: + +* autoboot (1 = yes, 0 = no, use menu) +cfg_auto: fcb 0 + +* list of booters to be tried (in order, $0000 terminates list) +* entry format: booter entry point, address, device ID +cfg_boot: fdb llbt_1773,$FF40,0 + fdb llbt_1773,$FF40,1 +* fdb llbt_tc3,$FF70,0 +* fdb llbt_ide,$FF50,0 + fdb $0000 + + endsect diff -r 755b1b8ea019 -r 2db06bc0742a bootman/bootman.a --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bootman/bootman.a Tue May 20 14:43:00 2008 +0000 @@ -0,0 +1,76 @@ + NAM bootman + TTL Boot Manager + +BOOTTRACK equ 0 + + PSECT bootman,$11,0,0,0,entry + + VSECT + ENDSECT + +TOP EQU $FE00 + +* ORG $2600 + +* This code is executed first - it moves the actual boot manager code +* into high RAM so it is out of the way to load boot files + fcc "OS" +entry + lds #TOP-1 set stack to absolute TOP - 1 + ldd #bmgrsiz get size of boot manager + pshs d save on stack + ldd #TOP get address at top + subd ,s++ subtract size of boot manager + clrb D now holds the address where we copy boot manager + deca minus 256 bytes for stack + deca minus 256 bytes for statics + + pshs d save address for later + + tfr d,u place boot manager's dest addr in U + ldd #bmgrsiz + leax bootmain,pcr +cloop ldy ,x++ + sty ,u++ + subd #$0002 + bgt cloop + + jmp ,s++ send control to moved code + +* The entry point of the boot manager +* Entry: stack is set up, U points to static storage + csect +sectptr rmb 2 + endsect + +bootmain lbsr mach_init initialize the machine we're running on + lds #$FDFF set up stack + ldu #$F200 set up static storage + leax 256,u + stx sectptr,u + leax welcome,pcr + bsr writestr +loop bra loop + + +welcome fcc "NitrOS-9 Boot Manager" + fcb 0 + +* Helpful routines + +* writestr - write string to output handler +* Entry: +* X = address of string (nul terminated) +writestr: + leay llio,pcr +writeloop + lda ,x+ + beq writedone + jsr 3,y + bra writeloop +writedone + rts + +bmgrsiz equ *-bootmain + + endsect diff -r 755b1b8ea019 -r 2db06bc0742a bootman/llbt_1773.a --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bootman/llbt_1773.a Tue May 20 14:43:00 2008 +0000 @@ -0,0 +1,28 @@ + NAM llbt_1773 + TTL WD1773 low-level booter + + PSECT llbt_1773,0,0,0,0,llbt_1773 + + VSECT + ENDSECT + +llbt_1773: + lbsr llinit + lbsr llread + lbsr llwrite + lbsr llterm + lbsr llinfo + +llinit +llread +llwrite +llterm + rts + +llinfo leax info,pcr + rts + +info fcc "Floppy disk drive" + fcb 0 + + endsect diff -r 755b1b8ea019 -r 2db06bc0742a bootman/llio_6551.a --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bootman/llio_6551.a Tue May 20 14:43:00 2008 +0000 @@ -0,0 +1,136 @@ + NAM llio_coco3 + TTL CoCo 3 low-level I/O handler + + PSECT llio_coco3,0,0,0,0,llio + + VSECT + ENDSECT + +llio: + lbsr llinit + lbsr llread + lbsr llwrite + lbsr llterm + +********** I/O ROUTINES ********** + +* 6551 Parameters +ADDR EQU $FF68 + +A_RXD EQU ADDR+$00 +A_TXD EQU ADDR+$00 +A_STATUS EQU ADDR+$01 +A_RESET EQU ADDR+$01 +A_CMD EQU ADDR+$02 +A_CTRL EQU ADDR+$03 + +* Baud rates +_B2400 EQU $1A 2400 bps, 8-N-1 +_B4800 EQU $1C 4800 bps, 8-N-1 +_B9600 EQU $1E 9600 bps, 8-N-1 +_B19200 EQU $1F 19200 bps, 8-N-1 + +BAUD EQU _B9600 + +* ll_init - Initialize the low-level I/O +* Exit: Carry = 0: Init success; Carry = 1; Init failed +llinit + sta A_RESET soft reset (value not important) +* Set specific modes and functions: +* - no parity, no echo, no Tx interrupt +* - no Rx interrupt, enable Tx/Rx + lda #$0B + sta A_CMD save to command register + lda #BAUD + sta A_CTRL select proper baud rate +* Read any junk rx byte that may be in the register + lda A_RXD + rts + + +* llread - Read one character from 6551 +* +* Entry: None +* Exit: A = character that was read +* +* Note, this routine currently doesn't timeout +llread +r lda A_STATUS get status byte + anda #$08 mask rx buffer status flag + beq r loop if rx buffer empty + lda A_RXD get byte from ACIA data port + rts + +* llwrite - Write one character to 6551 +* +* Entry: A = character to write +* Exit: None +llwrite + pshs a save byte to write +w lda A_STATUS get status byte + anda #$10 mask tx buffer status flag + beq w loop if tx buffer full + puls a get byte + sta A_TXD save to ACIA data port + rts + + +llterm + rts + + IFNE 0 +* llwout - Write an entire string +* llwerr - Write an entire string +llwerr +llwout + pshs a +l@ lda ,x+ + cmpa #C$CR + beq e@ + leay -1,y + beq f@ + bsr Write + bra l@ +e@ bsr Write + lda #C$LF + bsr Write +f@ ldx