mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
99 lines
2.7 KiB
ArmAsm
99 lines
2.7 KiB
ArmAsm
******************************************************************************
|
|
*
|
|
* 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
|