168 lines
3.3 KiB
NASM
168 lines
3.3 KiB
NASM
#define prgmmovsize prgmmov_end - prgmmov_start
|
|
|
|
prgmrun:
|
|
call _HomeUp
|
|
call _RunIndicOn
|
|
call _APDSetup
|
|
call _EnableAPD
|
|
jp prgmloader
|
|
|
|
prgminstallload:
|
|
ld hl, prgmloader_start
|
|
ld de, SafeSScreen
|
|
ld bc, prgmmovsize
|
|
ldir
|
|
ret
|
|
|
|
prgmloader_start:
|
|
relocate(SafeSScreen)
|
|
|
|
prgmmov_start:
|
|
prgmmov:
|
|
|
|
prgmloader:
|
|
call prgm_del_usermem; now we deleted ourselves. cool.
|
|
|
|
call _boot_ClearVRAM
|
|
;ld a,$2D
|
|
;ld (mpLcdCtrl),a ; Set LCD to 16bpp
|
|
call _DrawStatusBar
|
|
;ld hl,(prgmNamePtr)
|
|
;call NamePtrToOP1
|
|
call prgm_to_usermem
|
|
ld hl, userMem + 1
|
|
ld a, (hl)
|
|
cp a,tAsm84CECmp
|
|
jr nz,RunBasicProgram ; is it a basic program
|
|
ld hl, prgmunloader
|
|
call _PushErrorHandler
|
|
ld hl, prgmunloader
|
|
push hl
|
|
jp userMem ; simply call userMem to execute the program
|
|
|
|
runBasicProgram:
|
|
call _RunIndicOn
|
|
;call DeleteTempProgramGetName
|
|
;ld hl,(asm_prgm_size);actualSizePrgm)
|
|
;push hl
|
|
;call _CreateProg ; create a temp program so we can execute
|
|
;inc de
|
|
;inc de
|
|
;pop bc
|
|
;call _ChkBCIs0
|
|
; jr z,InROM ; there's nothing to copy
|
|
; ld hl,(userMem)
|
|
;ldi
|
|
;jp po,InROM
|
|
;ldir
|
|
InROM: ;call _OP4ToOP1
|
|
GoodInRAM:
|
|
;ld de,apperr1
|
|
;ld hl,StopError
|
|
;ld bc,StopErrorEnd-StopError
|
|
;ldir
|
|
set graphdraw,(iy+graphFlags)
|
|
ld hl,prgmerrunloader;ErrCatchBASIC
|
|
call _PushErrorHandler
|
|
set progExecuting,(iy+newdispf)
|
|
set allowProgTokens,(iy+newDispF)
|
|
set cmdExec,(iy+cmdFlags) ;settheseflagsto execute BASIC prgm
|
|
res onInterrupt,(iy+onflags)
|
|
ld hl, prgmunloader
|
|
push hl
|
|
sub a,a
|
|
ld (kbdGetKy),a
|
|
ei
|
|
jp _ParseInp ; run program
|
|
|
|
|
|
ErrCatchBASIC:
|
|
call _boot_ClearVRAM
|
|
call _DrawStatusBar
|
|
call _DispErrorScreen
|
|
set textInverse, (iy + textFlags)
|
|
ld hl,1
|
|
ld (curRow),hl
|
|
ld hl,QuitStr1
|
|
call _PutS
|
|
ld hl,QuitStr2
|
|
res textInverse, (iy + textFlags)
|
|
call _PutS
|
|
call _GetKey
|
|
jr +_
|
|
|
|
|
|
prgmunloader:
|
|
call _PopErrorHandler
|
|
_: ld hl, prgmFsh
|
|
call _Mov9ToOP1
|
|
call _ChkFindSym
|
|
call _ChkInRam
|
|
ex de,hl
|
|
jr z,ExistsInRAM
|
|
ld de,9
|
|
add hl,de
|
|
ld e,(hl)
|
|
add hl,de
|
|
inc hl
|
|
ExistsInRAM: ; HL->totalPrgmSize bytes
|
|
call prgm_to_usermem
|
|
call _RunIndicOff
|
|
jp userMem
|
|
|
|
prgm_to_usermem:
|
|
ld a, 09h ; 'add hl,bc'
|
|
ld (offset_SMC),a
|
|
call _ChkFindSym
|
|
call _ChkInRam
|
|
ex de,hl
|
|
jr z,AlreadyInRAM
|
|
xor a,a
|
|
ld (offset_SMC),a
|
|
ld de,9
|
|
add hl,de
|
|
ld e,(hl)
|
|
add hl,de
|
|
inc hl
|
|
AlreadyInRAM: ; HL->totalPrgmSize bytes
|
|
call _LoadDEInd_s
|
|
inc hl
|
|
inc hl ; bypass bytes $EF,$7B (texttok,tasm84cecmp)
|
|
push hl
|
|
push de
|
|
ex de,hl
|
|
call _ErrNotEnoughMem; check and see if we have enough memory left for this operation
|
|
pop hl
|
|
ld (asm_prgm_size),hl; store the totalPrgmSize of the program to asm_prgm_size for later use
|
|
ld de,userMem
|
|
push de
|
|
call _InsertMem ; insert memory into the userspace
|
|
pop de
|
|
pop hl ; HL->start of program
|
|
ld bc,(asm_prgm_size) ; load totalPrgmSize of current program
|
|
offset_SMC:
|
|
add hl,bc ; if in ram, do this; otherwise, smc it so it doesn't execute
|
|
ldir ; copy the program to userMem
|
|
ret ; return
|
|
|
|
prgm_del_usermem:
|
|
ld de,(asm_prgm_size) ; load total program totalPrgmSize
|
|
or a,a
|
|
sbc hl,hl
|
|
ld (asm_prgm_size),hl ; delete whatever current program was there
|
|
ld hl,userMem
|
|
jp _DelMem ; HL->place to delete, DE=amount to delete
|
|
|
|
DeleteTempProgramGetName:
|
|
ld hl,tmpPrgmName
|
|
call _Mov9ToOP1
|
|
call _PushOP1
|
|
call _ChkFindSym
|
|
call nc,_DelVarArc ; delete the temp prgm if it exists
|
|
jp _PopOP1
|
|
|
|
tmpPrgmName: .db tempProgObj,"ZTGP",0
|
|
prgmFsh: .db ProgObj, "FSHA", 0
|
|
prgmmov_end:
|
|
endrelocate()
|