****************************************************************************** * * C runtime startup for CP/M-68k. * ****************************************************************************** * ltpa=0 * Low TPA address htpa=4 * High TPA address lcode=8 * Code segment start codelen=12 * Code segment length ldata=16 * Data segment start datalen=20 * Data segment length lbss=24 * Bss segment start bsslen=28 * Bss segment length freelen=32 * free segment length resvd=36 * Reserved fcb2=56 * 2nd parsed fcb fcb1=92 * 1st parsed fcb command=128 * Command tail prtstr=9 * Print string BDOS Call exit=0 * BDOS exit call .globl __main .globl _exit .globl __break .globl __start .globl ___cpmrv .globl __base .text __start: bra.b start * Branch around ID .dc.b 'C Runtime V01.05 Copyright 1982 by Digital Research' start: move.l 4(a7),a0 * a0 -> Base page move.l a0,__base * Load C external move.l lbss(a0),a1 * a1 -> bss region move.l a1,a3 * Save this adda.l bsslen(a0),a1 * a1 -> 1st heap loc xclear: * Clear heap area clr.w (a3)+ * clear a word cmpa.l a3,sp * See if done bhi xclear * Not yet, continue move.l a1,__break * Put in "break" loc lea.l command(a0),a2 * a2 -> command line move.b (a2)+,d0 * d0 = byte count andi.l #$ff,d0 * clear junk move.w d0,-(a7) * push length move.l a2,-(a7) * Push commnd clr.l a6 * Clear frame pointer jsr __main * call main routine jsr _exit * call "exit" * * .bss __base: .ds.l 1 * -> Base Page __break: .ds.l 1 * Break function ___cpmrv: .ds.w 1 * Last CP/M return val * * .globl _brk .text _brk: link a6,#0 * preserve conventions clr.l d0 * clear return movea.l 8(sp),a0 * New break? adda.l #$100,a0 * Chicken factor cmpa.l a0,sp * Compare bhis brkok * OK, continue move.l #-1,d0 * Load return reg brkok: unlk a6 * Unlink rts * return .globl ___BDOS ___BDOS: link a6,#0 * link move.w 8(sp),d0 * Load func code move.l 10(sp),d1 * Load Paramter trap #2 * Enter BDOS cmpa.l __break,sp * Check for stack ovf bhis noovf * NO overflow, continue move.w #prtstr,d0 * String print lea ovf,a0 * a0-> message move.l a0,d1 * load proper reg trap #2 * Issue message move.w #exit,d0 * Exit trap #2 * now noovf: * Here if all OK unlk a6 * rts * Back to caller * * Data area * .data .globl ___pname * Program Name .globl ___tname * Terminal Name .globl ___lname * List device name .globl ___xeof * ^Z byte ovf: .dc.b 'Stack Overflow$' * Error message ___pname: .dc.b 'C runtime',0 * Program name ___tname: .dc.b 'CON:',0 * Console name ___lname: .dc.b 'LST:',0 * List device name ___xeof: .dc.b $1a * Control-Z