mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
121 lines
3.4 KiB
ArmAsm
121 lines
3.4 KiB
ArmAsm
*
|
||
* BDOS Function Definitions
|
||
*
|
||
reboot = 0
|
||
printstr = 9
|
||
open = 15
|
||
setdma = 26
|
||
pgmldf = 59
|
||
gettpa = 63
|
||
*
|
||
.globl _ovhdlr
|
||
.xdef _loadr
|
||
.text
|
||
*
|
||
_ovhdlr:move sr,savecc * save condition codes
|
||
movem.l d1-d7/a0-a6,saver * save all registers
|
||
movea.l (a7)+,a6 * pop pointer to inline parameter
|
||
move.l #4,d6 * adjust return address
|
||
add.l a6,d6 * to skip over table pointer
|
||
move.l d6,-(a7) * push return address
|
||
*
|
||
* GET FILE NAME AND LOAD PT
|
||
*
|
||
movea.l (a6),a6 * get ovl table address
|
||
move.l a6,d5 * check address with last loaded
|
||
cmp.l oldadd,d5 * if it's the same,
|
||
beq done * file is already loaded.
|
||
move.l a6,oldadd * save address for next time
|
||
lea.l fname,a5 * get address of name in fcb
|
||
move.l #11,d5 * set up loop counter (l2 cycles)
|
||
gfnm: move.b (a6)+,(a5)+
|
||
dbf d5,gfnm
|
||
move.l (a6),lowadr * store load point address
|
||
*
|
||
* OPEN OVERLAY FILE
|
||
*
|
||
move.l #fcb,d1
|
||
movea.l d1,a1
|
||
move.w #open,d0 *put BDOS function number in register d0
|
||
trap #2 *try to open the file to be loaded
|
||
cmpi #255,d0 *test d0 for BDOS error return code
|
||
beq openerr *if d0 = 255 then goto openerr
|
||
move.b #0,cr *zero record number in fcb
|
||
*
|
||
* FILL THE LPB
|
||
*
|
||
lea ovbspg,a3 * get address of input buffer
|
||
move.l a3,baspag * put it in LPB
|
||
move.l a1,LPB *put address of open FCB into LPB
|
||
move.l #LPB,a0 *put address of LPB into register a0
|
||
jsr _loadr *load the module
|
||
tst d0 *was the load successful?
|
||
bne lderr *if not then print error message
|
||
*
|
||
* RESTORE AND RETURN
|
||
*
|
||
done: movem.l saver,d1-d7/a0-a6 * restore all registers
|
||
move savecc,ccr * restore condition codes
|
||
rts
|
||
*
|
||
* PRINT ERROR MESSAGE
|
||
*
|
||
openerr:
|
||
move.l #openmsg,d1 *get address of error message
|
||
* *to be printed
|
||
bra print
|
||
lderr: move.l #loaderr,d1 *get address of error message to
|
||
* *be printed
|
||
print: move.w #printstr,d0 *get BDOS function number
|
||
trap #2 *print the message
|
||
move.b #36,ex *mark end of filename
|
||
move.l #fname,d1 *get address of filename
|
||
move.w #printstr,d0 *set up for BDOS call
|
||
trap #2 *print the filename
|
||
cmdrtn: move.w #reboot,d0 *get BDOS function number
|
||
trap #2 *warmboot and return to the CCP
|
||
|
||
*
|
||
* DATA
|
||
*
|
||
.data
|
||
*
|
||
* ERROR MESSAGE STRINGS
|
||
*
|
||
.even
|
||
loaderr: .dc.b 13,10,'Error Loading Overlay File $'
|
||
openmsg: .dc.b 13,10,'Unable to Open Overlay File $'
|
||
*
|
||
* BSS
|
||
*
|
||
.bss
|
||
.even
|
||
oldadd: .ds.l 1 * table for last loaded overlay
|
||
savecc: .ds.w 1
|
||
saver: .ds.l 14
|
||
ovbspg: .ds.w 64 * input buffer (like basepage) for loadr
|
||
*
|
||
* FILE CONTROL BLOCK
|
||
*
|
||
.even
|
||
fcb: .ds.b 1 * file control block
|
||
fname: .ds.b 11
|
||
ex: .ds.b 1
|
||
sysjnk: .ds.b 19
|
||
cr: .ds.b 1
|
||
*
|
||
* LOAD PARAMETER BLOCK
|
||
*
|
||
.even
|
||
LPB: .ds.l 1 *FCB address of program file
|
||
lowadr: .ds.l 1 *Low boundary of area in which
|
||
* *to load program
|
||
hiadr: .ds.l 1 *High boundary of area in which to
|
||
* *to load program
|
||
baspag: .ds.l 1 *Base page address of loaded program
|
||
usrstk: .ds.l 1 *Loaded program's initial stack pointer
|
||
flags: .ds.w 1 *Load program function control flags
|
||
.end
|
||
|