hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Call"3asm {4_HI_CALL::5 PUSH RBP6 MOV RBP,RSP7 MOV RAX,U64 16[RBP]8 TEST RAX,RAX9 JZ @@0510 CALL RAX11@@05: POP RBP12 RET1 813//************************************14_HI_MEMCPY::15 PUSH RBP16 MOV RBP,RSP17 PUSH RSI18 PUSH RDI19 CLD20 MOV RDI,U64 SF_ARG1[RBP]21 MOV RSI,U64 SF_ARG2[RBP]22 MOV RCX,U64 SF_ARG3[RBP]23 REP_MOVSB24 MOV RAX,RDI25 POP RDI26 POP RSI27 POP RBP28 RET1 2429}30_extern _HI_CALL I64 HiCall(U8 *machine_code);31_extern _HI_MEMCPY U8 *HiMemCpy(U8 *dst,U8 *src,I64 cnt);32 33#help_index "Boot"34public U0 BootRAM(U8 *filename=NULL)35{//Softboot Kernel.BIN file. No hardware reset.36 I64 size;37 CKernel *hi_image,*lo_image=mem_boot_base-sizeof(CBinFile),38 reg *sys_ram_reboot;39 if (!filename)40 filename="::/" KERNEL_BIN_C;41 do if (!(hi_image=FileRead(filename,&size))) return;42 while (hi_image<0x100000); //If alloc from low 640K, just get another copy.43 44 do sys_ram_reboot=MAlloc(SYS_RAM_REBOOT_END-SYS_RAM_REBOOT,Fs->code_heap);45 while (sys_ram_reboot<0x100000);46 47 hi_image->boot_src=BOOT_SRC_RAM;48 hi_image->boot_blk=0;49 hi_image->boot_patch_table_base=lo_image(U8 *)+hi_image->h.patch_table_offset;50 hi_image->sys_run_level =lo_image->sys_run_level&(RLF_VGA|RLF_16BIT);51 MemCpy(&hi_image->start,&lo_image->start,52 sizeof(CKernel)-offset(CKernel.start));53 54 CLI55 if (mp_cnt>1)56 MPHalt;57 58 HiMemCpy(sys_ram_reboot,SYS_RAM_REBOOT,SYS_RAM_REBOOT_END-SYS_RAM_REBOOT);59 HiMemCpy(lo_image,hi_image,size);60 HiCall(sys_ram_reboot);61}62 