LTCD_070816.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:20 +02:00
1 parent d14bbc24f9
commit 0e9364ff4c
506 files changed
+157705 -41812

No files matched your search

-8
View File
@@ -1,8 +0,0 @@
extern U8i SysEcho(U8i val);
SysEcho(0); //0=echo OFF 1=echo ON
#include "/LT/OSMain/ADAMK.HPZ"
#include "/LT/OSMain/ADAMK2.HPZ"
#include "/LT/OSMain/ADAMK3.HPZ"
#include "/LT/COMPILE/CMP.HPZ"
Cd("/LT/ADAM");;
#include "ADAM2"
Binary file not shown.
-290
View File
@@ -1,290 +0,0 @@
extern SysAccntStruct sys_accounts;
public extern TssStruct *adam_tss;
public extern U4 num_spawned_users;
extern TssCmdStruct sys_macro_queue;
extern TssStruct *macro_util_tss;
public extern U1 *grfont;
extern U4 *vga_image;
extern U4 FDC_retries;
extern U4 FDC_DRIVE_HEADS;
extern U4 FDC_DISK_CYLINDERS;
extern U4 FDC_DISK_SECTORS;
extern U4 FDC_MAX_SECTOR;
extern U4 FDC_DMA_BUF;
extern LTCacheBlk *LTDCBase;
extern LTCacheBlk *LTDCNext_lru,*LTDCLast_lru;
extern LTCacheBlk **LTDCHashTable;
public extern void LTDCInitCache(U8 size_in_U1s);
extern U8 sys_timer,jiffies;
extern U8 rnd_SEED;
extern I1 sys_temp_filename[80];
extern U8 disk_status_display,compiled_lines;
public extern Ltf *sys_clipboard_ltf;
public extern I8 num_blkdevs;
extern I1 *sys_startup_account;
extern I1 *wordstat_mask;
extern BoolU4 ip_inhibit_win_operations;
public extern I1 *sys_compile_time;
public extern void PortNop();
public extern void BusyWait(U8 uS); //Loosely timed
//49,710Hz since boot (LTDATE_FREQ)
public extern LTDate BootTime();
//18.33333*65536Hz (SYS_TIMER_FREQ)
public extern U8 ReadSysTimer();
extern void KbdCmdSend(U8 port, U1 val);
extern I8 KbdCmdRead();
extern void KbdCmdFlush();
extern void KbdMouseCmdAck(U1 val);
public extern U8 RandU2();
public extern U8 RandU4();
public extern U8 DivU8(U8 n1,U8 n2);
public extern I8 DivI8(I8 n1,I8 n2);
public extern U8 ModU8(U8 n1,U8 n2);
public extern I8 ModI8(I8 n1,I8 n2);
public extern I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL);
public extern void Sleep(U8 mS);
public extern void Sound(U8 freq);
public extern void Beep(U8 freq=500,BoolU4 busy=FALSE);
public extern U8 GetS(I1 *buf,U8 size);
public extern BoolU4 YorN();
public extern void D(U1 *buf,U8 cnt=0x80,BoolU4 show_offset=TRUE);
public extern void Dm(U1 *buf,U8 cnt=0x80);
public extern I8 ToUpper(I8 ch);
public extern BoolU4 AssignBit(U1 *field,U8 bit,BoolU4 val);
public extern BoolU4 Externs2Imports(BoolU4 val);
public extern BoolU4 KeepPrivate(BoolU4 val);
public extern BoolU4 PTrace(BoolU4 val);
public extern BoolU4 OTrace(BoolU4 val);
public extern BoolU4 NoRegVar(BoolU4 val);
public extern BoolU4 CTrace(BoolU4 val);
public extern BoolU4 LTrace(BoolU4 val);
public extern BoolU4 Echo(BoolU4 val);
public extern BoolU4 Silent(BoolU4 val);
public extern BoolU4 Preempt(BoolU4 val);
public extern BoolU4 SysDbg(BoolU4 val);
public extern BoolU4 IsSysDbg();
public extern BoolU4 Raw(BoolU4 val);
public extern BoolU4 IsRaw();
public extern U1 *Caller();
public extern U1 *CallerCaller();
public extern void DbgStr(I1 *st,U8 mS=100);
public extern void DbgNum(U8 num,U8 mS=100);
public extern void DbgF(double d,U8 mS=100);
public extern void DbgAdd(U4 *add,U8 mS=100);
public extern void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100);
public extern void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100);
extern void ThrowDivide(U1 *eip);
extern void ThrowFloating(U1 *eip);
public extern SysHashEntry *FindLocalHash(I1 *st,U8 mask);
public extern void GrClear(GrBitMap *base=NULL);
public extern GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height);
public extern void CursorHome();
public extern void CursorOn();
public extern void CursorOff();
public extern void ClearWindowText();
public extern void InitCrt();
public extern void PutChar(I1 ch);
public extern void PutS(I1 *st);
public extern U1 *AMAlloc(U8 size);
public extern void AFree(U1 *add);
public extern U1 *AMAllocIdentical(U1 *src);
public extern U1 *MAllocIdentical(U1 *src,TssStruct *tss=NULL);
public extern I1 *ANewString(I1 *buf);
public extern I1 *NewString(I1 *buf,TssStruct *tss=NULL);
public extern U1 *AMAllocZ(U8 size);
public extern U1 *MAllocZ(U8 size,TssStruct *tss=NULL);
public extern void DelLinkedList(U4 *list);
public extern void Exit();
public extern void Kill(TssStruct *tss);
//Exceptions are thrown through the following funcation call.
//by convention, the first parameter should be a type code.
public extern U8 ExceptDepth(TssStruct *tss=NULL);
public extern void throw(...);
//The following are used internally and should not be called directly
extern void SysTry(U1 *start_label,U1 *skip_label,U8 my_ebp,U8 my_esp);
extern void SysCatch();
public extern void ArcCompressBuf(ArcCs *c);
public extern void ArcFinishCompression(ArcCs *c);
public extern void ArcExpandBuf(ArcCs *c);
public extern ArcCs *NewArcCs(BoolU4 expand,BoolU4 text_only);
public extern void DelArcCs(ArcCs *c);
public extern ArcCompressStruct *
CompressBuf(U1 *src,U8 size,U8 flags=0);
public extern U1 *ExpandBuf(ArcCompressStruct *r);
public extern SysHashEntry *LoadStr(I1 *name, I1 *st);
public extern SysHashEntry *LoadList(I1 *name, I1 *st);
public extern I1 *SysText(I1 *name);
public extern I1 *SysTextSub(U8 sub,I1 *name);
public extern I8 SysTextSubCount(I1 *name);
public extern void Beeps(U8 j,BoolU4 busy);
public extern void UnrecoverableSysError(U8 j);
public extern void PutSysText(I1 *name);
public extern SysHashEntry *FindPSect(U1 *add,I8 *offset);
public extern I1 *PointAtListEntry(I8 entry_number, I1 *lst);
public extern I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL);
public extern I8 MatchSysTextEntry(I1 *src, I1 *lst_name,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL);
public extern I8 Occurrences(I1 *src, I1 ch);
public extern I8 SpacesToTabs(I1 *dst,I1 *src);
public extern I1 *TabsToSpaces(I1 *src);
public extern I1 *StringUtil(I1 *u, I8 mask);
public extern I1 *MStringUtil(I1 *u,U8 flags);
public extern I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst);
public extern I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst);
public extern BoolU4 WildCardMatch(I1 *wild_st,I1 *src_st);
public extern BoolU4 WildFileNameList(I1 *wild_st,I1 *src_st);
public extern I1 *Add2String(I1 *base,I1 *addition); //frees base parameter
public extern I1 *SearchString(I1 *src,I1 *pattern,U8 flags=0);
public extern I1 *SPrintFJoin(I1 *dst,I1 *fmt,I8i argc,I8i *argv);
public extern void GetFJoin(I1 *src,I1 *fmt,I8i argc,I8i *argv);
public extern void SPrintF(I1 *dst,I1 *fmt,...);
public extern void PrintF(I1 *fmt,...);
public extern I1 *MSPrintF(I1 *fmt,...);
public extern void Adam(I1 *fmt,...);
public extern void AdamLog(I1 *fmt,...);
public extern void AdamErr(I1 *fmt,...);
public extern U8 System(I1 *fmt,...);
public extern U8 ServantUser(I1 *fmt,...);
public extern void XTalk(TssStruct *tss,I1 *fmt,...);
public extern void XTalkString(TssStruct *tss,I1 *fmt,...);
public extern void Auto(I1 *fmt,...);
public extern void AutoString(I1 *fmt,...);
public extern void AutoFile(I1 *filename);
public extern void GetF(I1 *src,I1 *fmt,...);
public extern void QSort(void *base,U8 num, U8 width, U1 *compare);
public extern I4 YearStartDate(I4 year);
public extern LTDate ToLTDate(LTDateStruct *d);
public extern void ToLTDateStruct(LTDateStruct *d,LTDate ltdt);
public extern I4 FirstDayOfMonth(I4 i);
public extern I4 LastDayOfMonth(I4 i);
public extern I4 FirstDayOfYear(I4 i);
public extern I4 LastDayOfYear(I4 i);
public extern U1 DayOfWeek(I4 i);
public extern void GetCurTimeLTDateStruct(LTDateStruct *r);
public extern LTDate GetCurTimeLTDate();
public extern void LTDateToISO(ISODate *dst,LTDate ltdate);
public extern LTBlkDev *local_blkdevs,*boot_blkdev;
public extern LTPartition *local_partitions,*default_partition;
public extern I1 default_drive;
public extern LTPartition *drive_to_partition[32];
extern void LockPartition(LTPartition *p);
extern BoolU4 UnlockPartition(LTPartition *p,BoolU4 reset=FALSE);
public extern void InvalidateDiskCache(LTPartition *p,BoolU4 unlock);
public extern void ChangeDisk(I1 drive_letter=0);
public extern void PartitionRep();
extern void AddBlkDev(LTBlkDev *bd);
public extern BoolU4 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock);
public extern BoolU4 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock);
public extern void WZeroBlks(LTPartition *p,U8 blk,U8 cnt,BoolU4 unlock);
public extern LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0);
public extern U8 FSize(LTFile *f);
public extern void FSync(LTFile *f);
public extern void FClose(LTFile *f);
public extern BoolU4 FRBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
public extern BoolU4 FWBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
public extern void ReadCDImage(I1 drive,I1 *out_name,U8 cnt);
public extern void WriteCDImage(I1 drive,I1 *in_name);
public extern U8 NextClusterNum(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock);
public extern U8 ClusterBlk(LTPartition *p,U8 c);
public extern U8 RClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE);
public extern U8 WClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE);
public extern void CleanMAPBuf(LTPartition *p);
public extern U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock);
public extern BoolU4 NewLTDirEntry(LTPartition *p,I1 *cur_dir,LTDirEntry *tempm,BoolU4 free_old_chain=TRUE);
public extern void DelLTDirEntry(LTDirEntry *tempm);
public extern void DelLTDirList(LTDirEntry *tempm);
extern LTDirEntry *SysFindFiles(I1 *wild,U8 *fuf_flags=NULL);
public extern LTDirEntry *FindFiles(I1 *wild,U8 *fuf_flags=NULL);
extern U8 NameToDirCluster(LTPartition *p,I1 *name,BoolU4 unlock);
extern U8 NameToParentDirCluster(LTPartition *p,I1 *name,BoolU4 unlock);
public extern void PutFileLink(I1 *name,I8 line=0,BoolU4 plain_text=FALSE);
public extern void PutDirLink(I1 *name);
public extern void CheckLTPartition(LTPartition *p);
public extern void CheckLTBlkDev(LTBlkDev *bdev);
public extern I1 PartitionToDrive(LTPartition *p=NULL);
public extern LTPartition *DriveToPartition(I1 drive=0);
public extern LTBlkDev *DriveToBlkDev(I1 drive=0);
public extern BoolU4 DriveIsWritable(I1 drive=0);
public extern I1 *CurDir();
public extern I1 *AbsoluteDirName(I1 *name);
public extern I1 *AbsoluteFileName(I1 *name);
public extern BoolU4 CheckFileName(I1 *name);
public extern I1 *ChangeExtension(I1 *name,I1 *extension);
public extern I1 *DefaultExtension(I1 *name,I1 *extension);
public extern U8 FileAttr(I1 *name,U8 old_attr=0);
public extern void GetFFlags(FlagsStruct *f,I1 *systext_list,I1 *st);
public extern I1 *SPrintFFlags(I1 *dst,I1 *systext_list,U8 flags0,U8 flags1=0);
public extern void MapDrive(I1 ch,LTPartition *p);
public extern BoolU4 Drive(I1 drive_letter);
public extern BoolU4 Cd(I1 *name,BoolU4 make_dirs=FALSE);
public extern void DelLTFileAccess(LTFileAccess *fa);
public extern LTFileAccess *NewLTFileAccess(I1 *mask,BoolU4 make_mask=FALSE,BoolU4 make_dirs=FALSE);
public extern void Dir(I1 *wild=NULL,BoolU4 full=FALSE);
public extern void Del(I1 *wild,BoolU4 print_msg=TRUE);
public extern U1 *ReadFile(I1 *filename,U8 *size=NULL,U8 *attr=NULL,BoolU4 raw=FALSE);
public extern I1 *ReadTextFile(I1 *filename,U8 *attr=NULL);
public extern BoolU4 FindFile(I1 *filename,LTDirEntry *de=NULL,
BoolU4 dir_only=FALSE,BoolU4 file_only=FALSE,BoolU4 scan_parents=FALSE);
public extern U8 WriteFile(I1 *filename,U1 *fbuf,
U8 size,LTDate LTdatetime=0,U8 attr=0,BoolU4 raw=FALSE);
public extern void WriteTextFile(I1 *filename,I1 *st,U8 attr=0);
public extern void AddDrives(BoolU4 show_rep=TRUE);
public extern void SelectDefaultDrive();
extern BoolU4 CopySingle(I1 *f1,I1 *f2); //LTust one file
public extern BoolU4 MkDir(I1 *filename);
public extern BoolU4 IsDir(I1 *dir_name);
extern void SysDel(I1 *wild,BoolU4 make_mask); //this is dangerous
public extern void Format(I1 drive_letter,BoolU4 quick=TRUE,BoolU4 confirm=TRUE,U8 type=PT_LT);
public extern TssStruct *Spawn(U1 *start_add,
I1 *desc=NULL,
TssStruct *parent=NULL, //NULL means adam
I1 *account=NULL, //Null means use parent's
U8 stk=DEFAULT_STACK);
public extern SysHashTable *NewHashTable(U8 size,TssStruct *mem_tss=NULL);
public extern void AddTaskToQueue(TssStruct *tss,TssStruct *pred=NULL);
public extern TssCmdStruct *
QueueTaskRequest(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags);
public extern TssCmdStruct *
QueueTextInput(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags);
public extern TssCmdStruct *QueueMsg(TssStruct *servant,TssStruct *master,
U8 code,U8 p1,U8 p2,U8 flags);
public extern void Msg(U8 code,U8 p1,U8 p2,U8 flags=0);
public extern BoolU4 GetRequestResult(TssCmdStruct *rqst=NULL,U8 *result=NULL);
public extern void HandleServantCmds();
public extern void InitUserTask();
public extern void InitLocalTask();
public extern void InitSysTask();
public extern I1 *HomeDirString();
public extern void ContinueServantTask();
public extern void UserCmdLine();
extern void SysCmdLine();
extern void ServantUserCmdLine();
extern void FaultCmdLine();
public extern U1 *Load(I1 *filename,BoolU4 no_abs=FALSE);
+9
View File
@@ -0,0 +1,9 @@
extern U8i SysEcho(U8i val);
SysEcho(0); //0=echo OFF 1=echo ON
#include "/LT/OSMain/AdamK.HPZ"
#include "/LT/OSMain/AdamK2.HPZ"
#include "/LT/OSMain/AdamK3.HPZ"
#include "/LT/Compiler/Compiler.HPZ"
#exe {OptOn(OPTf_IGNORE_OVERFLOW);}
Cd("/LT/Adam");;
#include "Adam2.APZ"
File diff suppressed because it is too large. Load diff
+290
View File
@@ -0,0 +1,290 @@
/*
In this file, symbols defined OSMain assembly
files are given C+ definitions. This file
is included when you compile the kernel, after
the assembly files have been assembled, making
the C+ definitions available for the C+ OSMain
files. It is also included as part of booting.
The assembly global labels are stored as HTT_SYS_SYMBOL
entries in the hash table. These symols are placed
into the OSMain binary module and added to the
symbol hash table at boot before this file
gets #included during boot.
See
$LK,"AdamK2","FF:::/LT/OSMain/OS.SPZ,AdamK2"$ for where it is included during compiling the kernel.
$LK,"AdamK2","FF:::/LT/OSMain/AdamK.APZ,AdamK2"$ for where it is included during boots.
$LK,"AddOsMapSymbols","FF:::/LT/OSMain/OSEnd.CPZ,AddOsMapSymbols"$ for where the OSMain symbols are added to the hash tables.
*/
#define EC_FS 0x011
#define EC_GS 0x012
#define EC_CLI 0x046
#define EC_STI 0x047
#define EC_DISABLE_CACHE 0x048
#define EC_ENABLE_CACHE 0x049
#define EC_WBINVD 0x04A
#define EC_INVD 0x04B
#define EC_GET_FLAGS 0x04C
#define EC_SET_FLAGS 0x04D
#define EC_GET_BASE_PTR 0x04E
#define EC_SET_BASE_PTR 0x04F
#define EC_GET_STACK_PTR 0x050
#define EC_SET_STACK_PTR 0x051
#define EC_SET_RAX 0x052
#define EC_BT 0x053
#define EC_BTS 0x054
#define EC_BTR 0x055
#define EC_BTC 0x056
#define EC_BSF 0x057
#define EC_BSR 0x058
#define EC_INSQUE 0x059
#define EC_INSQUE_REV 0x05A
#define EC_REMQUE 0x05B
#define EC_STRLEN 0x05C
#define EC_MEMCPY 0x05D
#define EC_MEMSET 0x05E
#define EC_INPD 0x05F
#define EC_INPW 0x060
#define EC_INP 0x061
#define EC_OUTPD 0x062
#define EC_OUTPW 0x063
#define EC_OUTP 0x064
#define EC_RDTSC 0x065
#define EC_LBTS 0x081
#define EC_LBTR 0x082
#define EC_LBTC 0x083
#define EC_ABSI8 0x090
#define EC_PREEMPT 0x092
#help_index "Misc"
public LTextern SYS_FLAGS U8 sys_flags[1];
public LTextern SYS_BOOT_BASE U4 sys_boot_base;
LTextern SYS_BOOT_CODE U4 sys_boot_code;
public LTextern SYS_BOOT_HEADER_BASE U4 sys_boot_header_base;
LTextern SYS_CUR_FOCUS_TASK TssStruct *sys_cur_focus_task;
LTextern SYS_CUR_SCAN_CODE U8 sys_cur_scan_code;
public LTextern SYS_PROGRESS1 U8 progress1;
public LTextern SYS_PROGRESS2 U8 progress2;
public LTextern SYS_PROGRESS3 U8 progress3;
public LTextern SYS_PROGRESS4 U8 progress4;
#help_index "Graphics"
LTextern SYS_TEXTBASE U4 *textbase;
#help_index "Bit"
#help_file "::/LT/Doc/Bit.TXZ"
public LTintern EC_BT BoolU8 Bt(void *bit_field,U8 bit);
public LTintern EC_BTS BoolU8 Bts(void *bit_field,U8 bit);
public LTintern EC_BTR BoolU8 Btr(void *bit_field,U8 bit);
public LTintern EC_BTC BoolU8 Btc(void *bit_field,U8 bit);
//Locked for (for multitple CPU's)
public LTintern EC_LBTS BoolU8 LBts(void *bit_field,U8 bit);
public LTintern EC_LBTR BoolU8 LBtr(void *bit_field,U8 bit);
public LTintern EC_LBTC BoolU8 LBtc(void *bit_field,U8 bit);
//Scan U8 sized item forward for first set bit.
//Return -1 if not found.
public LTintern EC_BSF I8 Bsf(U8 bit_field_value);
//Scan U8 sized item reverse for first set bit.
//Return -1 if not found.
public LTintern EC_BSR I8 Bsr(U8 bit_field_value);
public LTextern OR_U4_BIT_FIELD void OrU4BitField(
void *bit_field,U8 bit,U4 pattern);
public LTextern EXTRACT_U4_BIT_FIELD U4 ExtractU4BitField(
void *bit_field,U8 bit,U8 size);
#help_index "Circular Queue"
#help_file "::/LT/Doc/Queue.TXZ"
//Insert item into queue after predicessor.
public LTintern EC_INSQUE void InsQue(void *entry,void *pred);
//Reversed insert into queue. Insert
//item into queue before successor.
public LTintern EC_INSQUE_REV void InsQueRev(void *entry,void *succ);
//Remove item from queue.
public LTintern EC_REMQUE void RemQue(void *entry);
#help_index "Task"
public LTintern EC_PREEMPT BoolU8 Preempt(BoolU4 val);
#help_index "Processor/IO Port"
public LTintern EC_INP U1 InP(U8 port);
public LTintern EC_OUTP void OutP(U8 port, U8 val);
public LTintern EC_INPW U8 InPW(U8 port);
public LTintern EC_OUTPW void OutPW(U8 port, U8 val);
public LTintern EC_INPD U8 InPD(U8 port);
public LTintern EC_OUTPD void OutPD(U8 port, U8 val);
public LTextern CP_REP_INSB void RepInSB(void *buf,U8 cnt,U8 port);
public LTextern CP_REP_INSW void RepInSW(void *buf,U8 cnt,U8 port);
public LTextern CP_REP_OUTSB void RepOutSB(void *buf,U8 cnt,U8 port);
public LTextern CP_REP_OUTSW void RepOutSW(void *buf,U8 cnt,U8 port);
#help_index "Memory"
public LTintern EC_MEMCPY void MemCpy(void *dst,void *src,U8 cnt);
public LTintern EC_MEMSET void MemSet(void *dst,U8 val,U8 cnt);
LTextern SYS_MEM_FREE_LIST MemBlk *mem_free_list;
LTextern SYS_MEM_FREE_2MEG_LIST MemBlk *mem_free_2Meg_list;
LTextern SYS_FREE_PAGE_HASH MemBlk *free_page_hash[FREE_PAGE_HASH_SIZE];
LTextern SYS_FREE_PAGE_HASH2 MemBlk *free_page_hash2[64];
public LTextern SYS_HEAP_BASE U4 sys_heap_base;
public LTextern SYS_HEAP_LIMIT U4 sys_heap_limit;
#help_index "Char/Operations"
public LTintern EC_STRLEN U8 StrLen(I1 *st);
public LTextern CP_STRCMP I8 StrCmp(I1 *st1,I1 *st2);
public LTextern CP_STRICMP I8 StrICmp(I1 *st1,I1 *st2);
public LTextern CP_STRNCMP I8 StrNCmp(I1 *st1,I1 *st2,U8 n);
public LTextern CP_STRNICMP I8 StrNICmp(I1 *st1,I1 *st2,U8 n);
public LTextern CP_STRSTR I1 *StrStr(I1 *st,I1 *pattern);
public LTextern CP_STRISTR I1 *StrIStr(I1 *st,I1 *pattern);
public LTextern CP_STRCPY void StrCpy(I1 *dest,I1 *src);
public LTextern CP_STRCAT void StrCat(I1 *dest,I1 *src);
#help_index "Processor"
public LTextern CP_CPUID void CpuId(U4 rax,RaxRbxRcxRdx *result);
public LTextern CP_GETCR0 U8 GetCR0();
public LTextern CP_SETCR0 void SetCR0(U8 d);
public LTextern CP_LTR void SetTR(U8 d);
public LTextern CP_GETCR3 U8 GetCR3();
public LTextern CP_SETCR3 void SetCR3(U8 d);
public LTextern CP_GETCR4 U8 GetCR4();
public LTextern CP_SETCR4 void SetCR4(U8 d);
LTextern IRQ_VECTORS U4 sys_irq_vectors[MAXIDT]; //changing these will not change interrupts
public LTintern EC_CLI void Cli();
public LTintern EC_STI void Sti();
public LTintern EC_GET_FLAGS U8 GetFlags();
public LTintern EC_SET_FLAGS void SetFlags(U8 d);
public LTintern EC_GET_STACK_PTR void *GetStackPtr();
public LTintern EC_SET_STACK_PTR void SetStackPtr(void *d);
public LTintern EC_GET_BASE_PTR void *GetBasePtr();
public LTintern EC_SET_BASE_PTR void SetBasePtr(U8 d);
LTextern SYS_SEMA_IRQS sema sema_irqs[NUM_IRQ_SEMAS];
LTextern SYS_SEMA_IRQ_BUSY sema sema_irq_busy[NUM_IRQ_SEMAS];
LTextern SYS_FREE_GDT_LIST U4 free_gdt_list;
LTextern SYS_GDTTAB GdtTabStruct gdttab[MAXGDT];
#help_index "Processor;MultiCore;Boot"
public LTextern CP_HLT void Hlt();
#help_index "Processor/Cache;Memory/Cache;MultiCore/Cache"
//Invalidate cache
public LTintern EC_INVD void Invd();
//Write back and invalidate cache.
public LTintern EC_WBINVD void WbInvd();
public LTintern EC_DISABLE_CACHE void DisableCache();
public LTintern EC_ENABLE_CACHE void EnableCache();
//Flush cache line.
public LTextern CP_CLFLUSH void ClFlush(U1 *b);
#help_index "MultiCore"
#help_file "::/LT/Doc/MultiCore.TXZ"
LTextern CP_PUT_GS_BASE void SetGs(CPUStruct *c);
LTextern SYS_UNCACHED_MP_CNT U8 *uncached_mp_cnt;
public LTextern SYS_MP_CNT U8 mp_cnt;
LTextern SYS_TEMP_CPU0_STRUCT CPUStruct sys_temp_cpu0_struct;
public LTextern SYS_MP_CPU_STRUCTS CPUStruct *mp_cpu_structs;
LTextern RESTORE_CONTEXT void RestoreContext();
public LTintern EC_GS CPUStruct *Gs();
LTextern SYS_SEMAS sema sys_semas[NUM_SYS_SEMAS];
#help_index "Time/CPU Cycles"
public LTintern EC_RDTSC U8 GetTimeStamp();
#help_index "Time/Jiffies;Task"
LTextern SYS_TIMER U8 sys_timer;
LTextern SYS_JIFFIES U8 sys_jiffies;
#help_index "Math"
public LTintern EC_ABSI8 I8 AbsI8(I8 i);
public LTextern CP_FSQRT double Sqrt(double d);
public LTextern CP_FSIN double Sin(double d);
public LTextern CP_FCOS double Cos(double d);
public LTextern CP_FTAN double Tan(double d);
public LTextern CP_ARG double Arg(double x,double y);
public LTextern CP_FATAN double ATan(double d);
public LTextern CP_ROUND double Round(double d);
public LTextern CP_TRUNC double Trunc(double d);
public LTextern CP_FLOOR double Floor(double d);
public LTextern CP_CEILING double Ceiling(double d);
public LTextern CP_POW10 double Pow10(double d);
public LTextern CP_LOG2 double Log2(double d);
public LTextern CP_LOG10 double Log10(double d);
public LTextern CP_LN double Ln(double d);
public LTextern CP_EXP double Exp(double d);
LTextern CP_FLDCW void Fldcw(U2 w);
LTextern CP_FCLEX void Fclex();
LTextern CP_FSTCW U2 Fstcw();
LTextern CP_FSTSW U2 Fstsw();
public LTextern FC_1 double one;
public LTextern FC_PI double pi;
public LTextern FC_PI2 double pi2;
public LTextern FC_E double e; //not implemented
public LTextern FC_LOG2_10 double log2_10;
public LTextern FC_LOG2_E double log2_E;
public LTextern FC_LOG10_2 double log10_2;
public LTextern FC_LOGE_2 double logE_2;
#help_index "Task"
public LTextern SWAP_IN_NEXT void SwapInNext();
public LTextern CP_DEACTIVATE_USER TssStruct *DeactivateUser();
public LTextern CP_ACTIVATE_NEXT_USER void ActivateNextUser();
public LTintern EC_FS TssStruct *Fs();
#help_index "Hash"
#help_file "::/LT/Doc/Hash.TXZ"
public LTextern CP_HASH_STR U8 HashStr(I1 *st);
public LTextern CP_FIND_HASH_ENTRY SysHashEntry *
FindHashEntry(I1 *st,SysHashTable *table,U8 mask);
public LTextern CP_FIND_HASH_BUCKET SysHashEntry **
FindHashBucket(I1 *st,SysHashTable *table);
public LTextern CP_ADD_SYS_HASH_ENTRY void AddSysHashEntry(SysHashEntry *temph,SysHashTable *table);
public LTextern CP_FIND_EXTERN void *FindExtern(I1 *st);
#help_index "Char/Output"
public LTextern CRLF void CrLf();
#help_index "Char/BitMaps"
public LTextern SYS_ALPHA_BITMAP U1 alpha_bitmap[1];
public LTextern SYS_ALPHA_NUMERIC_BITMAP U1 alpha_numeric_bitmap[1];
public LTextern SYS_DEC_NUMERIC_BITMAP U1 dec_numeric_bitmap[1];
public LTextern SYS_HEX_NUMERIC_BITMAP U1 hex_numeric_bitmap[1];
public LTextern SYS_PRINTABLE_CHARS_BITMAP U1 printable_chars_bitmap[1];
public LTextern SYS_SAFE_DOLLAR_CHARS_BITMAP U1 safe_dollar_chars_bitmap[1];
public LTextern SYS_FILENAME_CHARS_BITMAP U1 filename_chars_bitmap[1];
public LTextern SYS_DISPLAYABLE_CHARS_BITMAP U1 displayable_chars_bitmap[1];
#help_index "Compression"
LTextern CP_ARC_DETERMINE_COMPRESSION_TYPE
I8 ArcDetermineCompressionType(void *src,U8 size);
//This is just an XOR checksum.
LTextern CP_ARC_CHECK_SUM U8 ArcCheckSum(U1 *buf,U8 size);
LTextern CP_ARC_GET_TABLE_ENTRY
void ArcGetTableEntry(ArcCs *c);
#help_index "Call"
public LTextern CP_CALL U8 Call(void *s);
public LTextern CP_INDCALL void CallInd(void *fun_add,...);
//This is just an array of pointers
//to functions.
//See $LK,"Extern Number Definitions","MN:EXT_WIN_TO_TOP"$
public LTextern SYS_EXTERN_TABLE void **ext;
public LTextern CP_CALLEXTNUM void CallExtNum(U8 num,...);
//Search symbol table for function name
//and pass it parameters
public LTextern CP_CALLEXTSTR void CallExtStr(I1 *name,...);
#help_index ""
+472
View File
@@ -0,0 +1,472 @@
#help_index "Debugging"
public extern U8 sysdbg0,sysdbg1,sysdbg2,sysdbg3;
#help_index "Time/LTDate"
#help_file "::/LT/Doc/TimeLTDate.TXZ"
public extern LTDate local_time_offset;
//49,710Hz since boot (LTDATE_FREQ)
public extern LTDate BootTime();
#help_index "Time/Jiffies"
#help_file "::/LT/Doc/TimeJiffy.TXZ"
//18.33333*65536Hz (SYS_TIMER_FREQ)
public extern U8 ReadSysTimer();
#help_index "Time/Jiffies;Task"
//10,000 Hz currently
public extern U8 Jiffies();
public extern double t;
#help_index "Task"
extern I1 *sys_startup_account;
extern TssStruct *sys_update_screen_tss;
extern SysAccntStruct sys_accounts;
public extern TssStruct *adam_tss;
public extern U4 num_spawned_users;
extern void FinishOffDyingTsses();
#help_index "Time/CPU Cycles"
#help_file "::/LT/Doc/TimeCycles.TXZ"
extern U8 time_stamp_start,sys_timer_start;
public extern U8 time_stamp_freq,time_stamp_kHz_freq;
public extern U8 TssTotalTime();
#help_index "Sound"
public extern void Sound(U8 freq);
public extern void Beep(U8 freq=500,BoolU4 busy=FALSE);
public extern BoolU8 IOSound(BoolU4 val);
#help_index "Bit"
public extern BoolU8 AssignBit(void *field,U8 bit,BoolU4 val);
public extern BoolU8 LAssignBit(void *field,U8 bit,BoolU4 val);
#help_index "Compiler"
extern U8 compiled_lines,compiled_functions;
#help_index "Compiler/Directive"
public extern BoolU8 Externs2Imports(BoolU4 val);
public extern BoolU8 KeepPrivate(BoolU4 val);
public extern BoolU8 PTrace(BoolU4 val);
public extern BoolU8 OTrace(BoolU4 val);
public extern U8 OPassTraceMask(U8 i=0b100111111);
public extern BoolU8 OptOn(U8 num);
public extern BoolU8 OptOff(U8 num);
public extern BoolU8 GetOpt(U8 num);
public extern BoolU8 NoRegVar(BoolU4 val);
public extern BoolU8 CTrace(BoolU4 val);
public extern BoolU8 LTrace(BoolU4 val);
public extern BoolU8 Echo(BoolU4 val);
#help_index "Task/Delay"
public extern void BusyWait(U8 uS); //Loosely timed
public extern void Sleep(U8 mS);
public extern void PortNop();
#help_index "Task"
public extern BoolU8 IsPreempt();
#help_index "Debugging"
public extern void D(void *buf,U8 cnt=0x80,BoolU4 show_offset=TRUE);
public extern void Dm(void *buf,U8 cnt=0x80);
public extern BoolU8 IsDbgTsk();
public extern BoolU8 IsSysDbg();
public extern BoolU8 SysDbg(BoolU4 val);
public extern BoolU8 CheckPtr(void *ptr);
public extern BoolU8 CheckOnStk(void *ptr,TssStruct *tss=NULL);
public extern void StackRep(void **rsp=NULL);
public extern void CallerRep(void **rbp=NULL,TssStruct *tss=NULL);
public extern U8 *Caller(U8 num=1);
public extern void Debugger(I1 *msg=NULL,U8 num=0);
#help_index "Debugging/Raw Output"
public extern BoolU8 Raw(BoolU4 val);
public extern BoolU8 IsRaw();
public extern void DbgStr(I1 *st,U8 mS=100);
public extern void DbgNum(U8 num,U8 mS=100);
public extern void DbgF(double d,U8 mS=100);
public extern void DbgAdd(void *add,U8 mS=100);
public extern void DbgD(void *add,U8 cnt=0x80,U8 mS=100);
public extern void DbgDm(void *add,U8 cnt=0x80,U8 mS=100);
#help_index "Hash"
public extern SysHashEntry *FindLocalHash(I1 *st,U8 mask);
#help_index "Graphics/Bitmaps"
public extern void GrClear(GrBitMap *base=NULL);
public extern void SetWinBkColor(TssStruct *tss,U8 c);
public extern GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height,TssStruct *tss=NULL);
public extern GrBitMap *grbase2;
extern GrBitMap *gr_merge_base;
extern void *vga_image;
#help_index "Graphics/Char"
public extern U1 *grfont;
#help_index "Char"
#help_file "::/LT/Doc/Char.TXZ"
public extern void **ctrl_alt_letter_routines;
extern TssCmdStruct sys_macro_queue;
public extern KeyDevStruct sys_put_key_queue;
extern TssStruct *macro_util_tss;
extern U8 dc_col,dc_flags,dc_cursor_blink;
public extern void ClearWinText(TssStruct *tss);
public extern void FillWinText(TssStruct *tss,U8 d);
public extern void InitCrt();
public extern KeyDevStruct *AddKeyDev(void *putkey_add,void *puts_add,U8 priority);
#help_index "Char/Output;Char/SysText"
public extern void GetOutOfDollar();
public extern void PrintF(I1 *fmt,...);
public extern void PutSysTextErr(I1 *st);
public extern void PutSysTextWarn(I1 *st);
public extern void PrintFErr(I1 *fmt,...);
public extern void PrintFWarn(I1 *fmt,...);
#help_index "Char/Output"
public extern void PutErr();
public extern void PutWarn();
public extern void PutKey(I8 ch,U8 scancode);
public extern void PutChar(I1 ch);
public extern void PutS(I1 *st);
public extern BoolU8 Silent(BoolU4 val);
#help_index "Char/Conversion"
public extern I8 ToUpper(I8 ch);
public extern I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL);
#help_index "Input Pointer"
public extern U8 mouse_evt_time;
#help_index "Char/Input"
public extern U8 kbd_evt_time;
extern U1Fifo *kbdmouse_fifo;
public extern BoolU8 PressAKey();
public extern BoolU8 AreYouSure();
public extern I8 GetKey(U8 *scancode=NULL,BoolU4 echo=FALSE);
public extern I8 GetChar(U8 *scancode=NULL,BoolU4 echo=TRUE);
public extern BoolU8 ScanKey(I8 *ch=NULL,U8 *scancode=NULL,BoolU4 echo=FALSE);
public extern BoolU8 YorN();
public extern U8 GetS(I1 *buf,U8 size,BoolU4 allow_extended=TRUE);
public extern I1 *MGetS();
extern void GetFJoin(I1 *src,I1 *fmt,I8 argc,I8 *argv);
public extern void GetF(I1 *src,I1 *fmt,...);
#help_index "Char/Lists"
public extern I1 *PointAtListEntry(I8 entry_number, I1 *lst);
public extern I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL);
#help_index "Char/Operations"
public extern I8 Occurrences(I1 *src, I1 ch);
public extern I8 SpacesToTabs(I1 *dst,I1 *src);
public extern I1 *TabsToSpaces(I1 *src);
public extern I1 *StrUtil(I1 *u, I8 mask);
public extern I1 *MStrUtil(I1 *u,U8 flags);
public extern I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst=NULL);
public extern I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst=NULL);
public extern BoolU8 WildCardMatch(I1 *wild_st,I1 *src_st);
public extern BoolU8 WildFileNameList(I1 *wild_st,I1 *src_st);
public extern I1 *Add2Str(I1 *base,I1 *addition); //frees base parameter
public extern I1 *SearchStr(I1 *src,I1 *pattern,U8 flags=0);
extern I1 *SPrintFJoin(I1 *dst,I1 *fmt,I8 argc,I8 *argv);
public extern void SPrintF(I1 *dst,I1 *fmt,...);
public extern I1 *MSPrintF(I1 *fmt,...);
#help_index "Char/SysText"
#help_file "::/LT/Doc/SysText.TXZ"
public extern SysHashEntry *LoadStr(I1 *name, I1 *st);
public extern SysHashEntry *LoadList(I1 *name, I1 *st);
public extern I1 *SysText(I1 *name);
public extern I1 *SysTextSub(U8 sub,I1 *name);
public extern I8 SysTextSubCount(I1 *name);
public extern void PutSysText(I1 *name);
#help_index "Char/SysText;Char/Lists"
public extern I8 MatchSysTextEntry(I1 *src, I1 *lst_name,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL);
#help_index "Memory"
public extern HeapCtrl *mp_heap;
public extern MPCmdCtrl *mp_ctrl;
public extern void *Alloc2MegMemBlks(U8 *pages2Meg);
public extern void *AllocUncachedMemBlks(U8 *pages2Meg);
public extern void *AllocWriteThroughMemBlks(U8 *pages2Meg);
public extern void Free2MegMemBlks(MemBlk *m,U8 pages2Meg);
public extern void *AllocNonTskMemBlks(U8 *pages512);
public extern void FreeNonTskMemBlks(MemBlk *m,U8 pages512);
public LTextern CP_MALLOC void *MAlloc(U8 size,TssStruct *tss=NULL);
public LTextern CP_FREE void Free(void *add,TssStruct *tss=NULL);
public LTextern CP_MSIZE U8 MSize(void *src); //size of heap object
public LTextern CP_MTSS TssStruct *MTss(void *src); //tss of heap object
public extern void *MAllocZ(U8 size,TssStruct *tss=NULL);
public extern void *MAllocIdentical(void *src,TssStruct *tss=NULL);
public extern I1 *NewStr(I1 *buf,TssStruct *tss=NULL);
public extern void DelLinkedList(void *list);
#help_index "Memory/Heap Ctrl"
public extern void *AllocHCMemBlks(U8 *pages512,HeapCtrl *hc);
public extern void FreeHCMemBlks(MemBlk *m,HeapCtrl *hc);
public extern void InitHeapCtrl(HeapCtrl *hc,U8 pages512);
public LTextern CP_MALLOC_HC void *MAllocHC(U8 size,HeapCtrl *hc);
public LTextern CP_FREE_HC void FreeHC(void *add,HeapCtrl *hc);
public LTextern CP_MSIZE U8 MSizeHC(void *src); //size of heap object
public LTextern CP_MEM_HEAP_CTRL HeapCtrl *MHeapCtrl(void *src); //HC of heap object
public extern void *MAllocHCZ(U8 size,HeapCtrl *hc);
public extern void *MAllocIdenticalHC(void *src,HeapCtrl *hc);
public extern I1 *NewStrHC(I1 *buf,HeapCtrl *hc);
#help_index "Memory/Adam Heap"
public extern void *AMAlloc(U8 size);
public extern void AFree(void *add);
public extern void *AMAllocIdentical(void *src);
public extern I1 *ANewStr(I1 *buf);
public extern void *AMAllocZ(U8 size);
#help_index "Memory/MultiCore"
#help_file "::/LT/Doc/Mem.TXZ"
public extern U8 *MemPointAtPageTableEntry(void *a);
#help_index "Task"
public extern void Exit();
public extern void Kill(TssStruct *tss,BoolU4 wait=TRUE);
public extern BoolU8 ValidateTss(TssStruct *tss);
public extern TssStruct *Spawn(void *start_add,
I1 *desc=NULL,
TssStruct *parent=NULL, //NULL means adam
I1 *account=NULL, //Null means use parent's
U8 stk=DEFAULT_STACK,
BoolU4 add_to_queue=TRUE);
public extern void AddTaskToQueue(TssStruct *tss,TssStruct *pred=NULL);
public extern void WaitTskIdle(TssStruct *tss);
public extern void InitUserTask();
public extern void InitLocalTask();
public extern void InitSysTask();
public extern void UserCmdLine();
public extern TssStruct *SpawnUser(I1 *st=NULL);
extern void FaultCmdLine();
extern void FinishOffTss(TssStruct *tss);
#help_index "Task/Requests"
public extern TssCmdStruct *
QueueTaskRequest(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags);
public extern U8 HandleServantCmds(TssStruct *tss=NULL);
public extern U8 System(I1 *fmt,...);
public extern U8 ServantUser(I1 *fmt,...);
extern void SysCmdLine();
extern void ServantUserCmdLine();
public extern BoolU8 GetRequestResult(TssCmdStruct *rqst=NULL,U8 *result=NULL);
public extern void ContinueServantTask();
public extern void Adam(I1 *fmt,...);
public extern void AdamLogExcept();
public extern void AdamLog(I1 *fmt,...);
public extern void AdamErr(I1 *fmt,...);
#help_index "Task/Text Input"
public extern TssCmdStruct *
QueueTextInput(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags);
#help_index "Task/Text Input;Messages"
public extern TssCmdStruct *QueueMsg(TssStruct *servant,TssStruct *master,
U8 code,U8 p1,U8 p2,U8 flags);
public extern void Msg(U8 code,U8 p1,U8 p2,U8 flags=0);
#help_index "Exceptions"
//Exceptions are thrown through the following funcation call.
//by convention, the first parameter should be a type code.
public extern U8 ExceptDepth(TssStruct *tss=NULL);
public extern void throw(...);
public extern void throw_no_log(...);
//The following are used internally and should not be called directly
extern void SysTry(void *start_label,void *skip_label);
extern void SysCatch();
extern void ThrowDivide(void *rip);
extern void ThrowFloating(void *rip);
#help_index "Compression/Piece by Piece"
public extern void ArcCompressBuf(ArcCs *c);
public extern void ArcFinishCompression(ArcCs *c);
public extern void ArcExpandBuf(ArcCs *c);
public extern ArcCs *NewArcCs(BoolU4 expand,BoolU4 text_only);
public extern void DelArcCs(ArcCs *c);
#help_index "Compression"
public extern ArcCompressStruct *
CompressBuf(void *src,U8 size,U8 flags=0);
public extern void *ExpandBuf(ArcCompressStruct *r);
#help_index "AutoFile"
#help_file "::/LT/Doc/AutoFile.TXZ"
#help_index "Task/Text Input;AutoFile"
public extern void Auto(I1 *fmt,...);
public extern void AutoStr(I1 *fmt,...);
public extern void AutoFile(I1 *filename);
public extern void XTalk(TssStruct *tss,I1 *fmt,...);
public extern void XTalkWithWait(TssStruct *tss,I1 *fmt,...);
public extern void XTalkStr(TssStruct *tss,I1 *fmt,...);
public extern void XTalkStrWithWait(TssStruct *tss,I1 *fmt,...);
#help_index "Misc"
public extern void QSort(void *base,U8 num, U8 width,I8 compare(void *e1,void *e2));
public extern U8 RandU2();
public extern U8 RandU4();
public extern U8 RandU8();
extern U8 rnd_SEED;
public extern Ltf *sys_clipboard_ltf;
extern BoolU4 ip_inhibit_win_operations;
public extern LTDate sys_compile_time;
public extern U1 *reverse_bits_table,*set_bits_table;
#help_index "Time/LTDate"
public extern U2 month_start_days1[12];
public extern U2 month_start_days2[12];
public extern I8 YearStartDate(I8 year);
public extern LTDate ToLTDate(LTDateStruct *d);
public extern void ToLTDateStruct(LTDateStruct *d,LTDate ltdt);
public extern I8 FirstDayOfMonth(I8 i);
public extern I8 LastDayOfMonth(I8 i);
public extern I8 FirstDayOfYear(I8 i);
public extern I8 LastDayOfYear(I8 i);
public extern I8 DayOfWeek(I8 i);
public extern LTDate GetCurTimeLTDate();
public extern void LTDateToISO(ISODate *dst,LTDate ltdate);
#help_index "File/System"
extern I1 sys_temp_filename[80];
extern U8 disk_reads,disk_writes;
#help_index "File/System/Hardware/Floppy"
extern U4 fdc_retries;
extern U4 fdc_drive_heads;
extern U4 fdc_disk_cylinders;
extern U4 fdc_disk_sectors;
extern U4 fdc_max_sector;
extern U4 fdc_dma_buf;
#help_index "File/System/Cache"
extern LTCacheBlk *ltcd_base;
extern LTCacheBlk *ltdc_next_lru,*ltdc_last_lru;
extern LTCacheBlk **ltdc_hash_table;
extern U8 ltdc_size;
extern void LTDCInitCache(U8 size_in_U1s);
public extern void InvalidateDiskCache(LTPartition *p,BoolU4 unlock);
#help_index "File/System/BlkDev"
public extern I8 num_blkdevs;
public extern LTBlkDev *local_blkdevs,*boot_blkdev;
#help_index "File/System/Partitions"
public extern LTPartition *local_partitions,*default_partition;
public extern LTPartition *drive_to_partition[32];
#help_index "File/System/Hardware"
extern void HintATA();
extern void AddBlkDev(LTBlkDev *bd,BoolU4 one_partition);
extern void ATAReadBlks(LTBlkDev *bdev,void *buf, U8 blk, U8 cnt);
extern void ATAWriteBlks(LTBlkDev *bdev,void *buf, U8 blk, U8 cnt);
#help_index "File/Cmd Line (Typically)"
public extern void ChangeDisk(I1 drive_letter=0);
public extern BoolU8 Drive(I1 drive_letter);
public extern BoolU8 Cd(I1 *name,BoolU4 make_dirs=FALSE);
public extern void MapDrive(I1 ch,LTPartition *p);
public extern void Dir(I1 *wild=NULL,BoolU4 full=FALSE);
public extern void Del(I1 *wild,BoolU4 print_msg=TRUE);
public extern BoolU8 MkDir(I1 *filename);
#help_index "File/Cmd Line (Typically);File/Install Related;Install"
public extern void PartitionRep();
#help_index "File/Program Routines/Low Level"
extern LTDirEntry *SysFindFiles(I1 *wild,U8 fuf_flags=0);
extern void SysDel(I1 *wild,BoolU4 make_mask); //this is dangerous
extern BoolU8 CopySingle(I1 *f1,I1 *f2); //LTust one file
extern void CleanMAPBuf(LTPartition *p);
extern void LockPartition(LTPartition *p);
extern BoolU8 UnlockPartition(LTPartition *p,BoolU4 reset=FALSE);
public extern U8 NextClusterNum(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock);
public extern U8 ClusterBlk(LTPartition *p,U8 c);
public extern U8 RClusters(LTPartition *p,void *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE);
public extern U8 WClusters(LTPartition *p,void *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE);
public extern U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock);
public extern BoolU8 RBlks(LTPartition *p,void *buf, U8 blk, U8 cnt,BoolU4 unlock);
public extern BoolU8 WBlks(LTPartition *p,void *buf, U8 blk, U8 cnt,BoolU4 unlock);
public extern void WZeroBlks(LTPartition *p,U8 blk,U8 cnt,BoolU4 unlock);
public extern void CheckLTPartition(LTPartition *p);
public extern void CheckLTBlkDev(LTBlkDev *bdev);
public extern I1 PartitionToDrive(LTPartition *p=NULL);
public extern LTPartition *DriveToPartition(I1 drive=0);
public extern LTBlkDev *DriveToBlkDev(I1 drive=0);
extern U8 NameToDirCluster(LTPartition *p,I1 *name,BoolU4 unlock);
extern U8 NameToParentDirCluster(LTPartition *p,I1 *name,BoolU4 unlock);
#help_index "File/Program Routines/LTFile"
public extern LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0);
public extern U8 FSize(LTFile *f);
public extern void FSync(LTFile *f);
public extern void FClose(LTFile *f);
public extern BoolU8 FRBlks(LTFile *f,void *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
public extern BoolU8 FWBlks(LTFile *f,void *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
#help_index "File/CD DVD"
public extern void ReadCDImage(I1 drive,I1 *out_name,U8 cnt);
public extern void WriteCDImage(I1 drive,I1 *in_name);
public extern I1 *default_iso_name;
#help_index "File/FileNames"
public extern void PutFileLink(I1 *name,I8 line=0,BoolU4 plain_text=FALSE);
public extern void PutDirLink(I1 *name);
public extern I1 *CurDir();
public extern I1 *HomeDirStr();
public extern I1 *AbsoluteDirName(I1 *name);
public extern I1 *AbsoluteFileName(I1 *name);
public extern BoolU8 CheckFileName(I1 *name);
public extern I1 *ChangeExtension(I1 *name,I1 *extension);
public extern I1 *DefaultExtension(I1 *name,I1 *extension);
public extern BoolU8 IsDir(I1 *dir_name);
public extern BoolU8 DriveIsWritable(I1 drive=0);
#help_index "File/Program Routines/Utils"
public extern void GetFFlags(U8 *f,I1 *list,I1 *st);
public extern I1 *SPrintFFlags(I1 *dst,I1 *systext_list,U8 flags0,U8 flags1=0);
public extern void DelLTFileAccess(LTFileAccess *fa);
public extern LTFileAccess *NewLTFileAccess(I1 *mask,BoolU4 make_mask=FALSE,BoolU4 make_dirs=FALSE);
public extern LTDirEntry *FindFiles(I1 *wild,U8 fuf_flags=0);
public extern U8 FileAttr(I1 *name,U8 old_attr=0);
public extern void DelLTDirEntry(LTDirEntry *tempm);
public extern void DelLTDirList(LTDirEntry *tempm);
public extern BoolU8 NewLTDirEntry(LTPartition *p,I1 *cur_dir,LTDirEntry *tempm,BoolU4 free_old_chain=TRUE);
#help_index "File/Program Routines"
public extern BoolU8 FindFile(I1 *filename,LTDirEntry *de=NULL,
BoolU4 dir_only=FALSE,BoolU4 file_only=FALSE,BoolU4 scan_parents=FALSE);
public extern void *ReadFile(I1 *filename,U8 *size=NULL,U8 *attr=NULL,BoolU4 raw=FALSE);
public extern I1 *ReadTextFile(I1 *filename,U8 *attr=NULL);
public extern U8 WriteFile(I1 *filename,void *fbuf,
U8 size,LTDate LTdatetime=0,U8 attr=0,BoolU4 raw=FALSE);
public extern void WriteTextFile(I1 *filename,I1 *st,U8 attr=0);
#help_index "Install;File/Install Related"
public extern void AddDrives(BoolU4 repartition=FALSE);
public extern void Format(I1 drive_letter,BoolU4 quick=TRUE,BoolU4 confirm=TRUE,U8 type=PT_LT);
public extern void SelectDefaultDrive();
public extern I1 default_drive;
#help_index "Hash"
public extern SysHashTable *NewHashTable(U8 size,TssStruct *mem_tss=NULL);
#help_index "Compiler"
public extern void *Load(I1 *filename,BoolU4 no_abs=FALSE);
#help_index "Boot"
public extern void Reboot();
#help_index "MultiCore"
public extern void MPInt(U8 num,U8 cpu_num=1);
public extern void MPIntAll(U8 num);
public extern void MPWaitForTask();
public extern void MPQueueJob(void *add,void *data=NULL,
U8 flags=1<<MPCf_FREE_ON_COMPLETE,BoolU4 spawn=FALSE);
public extern void MPNMInt();
public extern void MPStart();
#help_index "MultiCore;Boot"
public extern void MPHalt();
#help_index "Fifo"
public extern U1Fifo *NewU1Fifo(U8 size,TssStruct *tss=NULL);
public extern void DelU1Fifo(U1Fifo *f);
public extern BoolU8 U1FifoInsert(U1Fifo *f,U1 ch);
public extern BoolU8 U1FifoRemove(U1Fifo *f,U1 *ch);
public extern BoolU8 U1FifoPeek(U1Fifo *f,U1 *ch);
public extern void U1FifoFlush(U1Fifo *f);
public extern U8 U1FifoCnt(U1Fifo *f);
public extern U8Fifo *NewU8Fifo(U8 size,TssStruct *tss=NULL);
public extern void DelU8Fifo(U8Fifo *f);
public extern BoolU8 U8FifoInsert(U8Fifo *f,U8 d);
public extern BoolU8 U8FifoRemove(U8Fifo *f,U8 *d);
public extern BoolU8 U8FifoPeek(U8Fifo *f,U8 *d);
public extern void U8FifoFlush(U8Fifo *f);
public extern U8 U8FifoCnt(U8Fifo *f);
#help_index ""
Binary file not shown.
-546
View File
@@ -1,546 +0,0 @@
I8 my_ExecuteFile(I1 *name)
{
I8 my_my_ExecuteFile(I1 *name);
if (my_my_ExecuteFile=ext[EXT_EXECUTE_FILE])
return my_my_ExecuteFile(name);
else
return 0;
}
I8 my_ExecuteString(I1 *st,I1 *filename=NULL)
{
I8 my_my_ExecuteString(I1 *st,I1 *filename);
if (my_my_ExecuteString=ext[EXT_EXECUTE_STRING])
return my_my_ExecuteString(st,filename);
else
return 0;
}
BoolU4 my_WindowToTop(TssStruct *tss)
{
BoolU4 my_my_WindowToTop(TssStruct *tss);
if (my_my_WindowToTop=ext[EXT_WINDOW_TO_TOP])
return my_my_WindowToTop(tss);
else
return FALSE;
}
SysHashTable *NewHashTable(U8 size,TssStruct *mem_tss=NULL)
{
SysHashTable *tempht;
tempht=MAllocZ(offset(SysHashTable.body)+size<<2,mem_tss);
tempht->mask=size-1;
return tempht;
}
/*
U8 CreateCodeSelector(U8 phy_add)
{
U8 result,*d,*d1,old_flags=GetFlags;
Cli;
result=*FREE_GDT_LIST;
d=GDTTAB+result;
*FREE_GDT_LIST=*d;
d=result+GDTTAB;
d1=d+4;
*d =0x0000FFFF;
*d1=0x00CF9A00;
d=d+2;
*d+=(phy_add & 0x00FFFFFF);
*d1+=(phy_add & 0xFF000000);
SetFlags(old_flags);
return result;
}
U8 CreateTssSelector(U8 phy_add)
{
U8 result,*d,*d1,old_flags=GetFlags;
Cli;
result=*FREE_GDT_LIST;
d=GDTTAB+result;
*FREE_GDT_LIST=*d;
d=result+GDTTAB;
d1=d+4;
*d =sizeof(TssStruct)-1;
*d1=0x00008900;
d=d+2;
*d+=(phy_add & 0x00FFFFFF);
*d1+=(phy_add & 0xFF000000);
SetFlags(old_flags);
return result;
}
*/
U8 CreateMemSelector(U8 phy_add)
{
U8 result,old_flags=GetFlags;
U4 *d,*d1;
Cli;
result=free_gdt_list;
d=&gdttab+result;
free_gdt_list=*d;
d1=d+4;
*d =0x0000FFFF;
*d1=0x00CF9200;
d=d+2;
*d +=(phy_add & 0x00FFFFFF);
*d1+=(phy_add & 0xFF000000);
SetFlags(old_flags);
return result;
}
void AddTaskToQueue(TssStruct *tss,TssStruct *pred=NULL)
{
TssStruct *last;
U8 old_flags=GetFlags;
if (!pred) pred=Fs;
Cli;
last=pred->last_tss;
last->next_tss=tss;
pred->last_tss=tss;
tss ->last_tss=last;
tss ->next_tss=pred;
SetFlags(old_flags);
}
void AddTaskToChildQueue(TssStruct *tss)
{
TssStruct *last,*pred;
U8 old_flags=GetFlags;
Cli;
pred=tss->parent_tss->last_child_tss;
last=pred->last_sibling_tss;
last->next_sibling_tss=tss;
pred->last_sibling_tss=tss;
tss ->last_sibling_tss=last;
tss ->next_sibling_tss=pred;
SetFlags(old_flags);
}
asm {CP_INIT_TSS::}
U1 *InitTss(TssStruct *tss,U8 stk)
{ //Returns Fs of task
U1 *b;
U1 *result;
MemSet(tss,0,sizeof(TssStruct));
tss->cs=SYS_CS_SEL;
tss->ds=ZERO_DS_SEL;
tss->es=ZERO_DS_SEL;
tss->gs=ZERO_DS_SEL;
tss->absolute_address=tss;
tss->io_bitmap_ptr=TSS_IO_BITMAP;
tss->next_tss=tss;
tss->last_tss=tss;
tss->eflags=SYS_DEFAULT_FLAGS;
tss->cr3=SYS_DEFAULT_CR3;
tss->optimization=0x7F;
b=&tss->next_child_tss-offset(TssStruct.next_sibling_tss);
tss->next_child_tss=b;
tss->last_child_tss=b;
b=&tss->next_servant_cmd;
tss->next_servant_cmd=b;
tss->last_servant_cmd=b;
b=&tss->next_master_cmd;
tss->next_master_cmd=b;
tss->last_master_cmd=b;
b=&tss->next_mem_blk;
tss->next_mem_blk=b;
tss->last_mem_blk=b;
b=&tss->next_lex;
tss->next_lex=b;
tss->last_lex=b;
b=&tss->next_except;
tss->next_except=b;
tss->last_except=b;
b=&tss->next_ode;
tss->next_ode=b;
tss->last_ode=b;
result=CreateMemSelector(tss);
tss->fs=result;
tss->hash_table=NewHashTable(0x1000,tss);
b=MAlloc(stk,tss);
tss->stack_base=b;
b=b+stk;
tss->esp0=b;
tss->esp1=b;
tss->esp2=b;
tss->esp=b;
tss->ss0=ZERO_DS_SEL;
tss->ss1=ZERO_DS_SEL;
tss->ss2=ZERO_DS_SEL;
tss->ss=ZERO_DS_SEL;
MemSet(tss->io_bitmap,0xFF,MAXIO>>3);
Bts(&tss->task_flags,TSSf_PREEMPT);
return result;
}
asm {CP_SPAWN_TASK::}
TssStruct *Spawn(U1 *start_add,I1 *desc=NULL,
TssStruct *parent=NULL, //NULL means adam
I1 *account=NULL,
U8 stk=DEFAULT_STACK)
{
U8 d,old_flags=GetFlags;
TssStruct *tss=AMAlloc(sizeof(TssStruct));
SysAccntStruct *my_FindSysAccnt(I1 *name);
SysAccntStruct *tempa;
if (!parent) parent=adam_tss;
InitTss(tss,stk);
tss->eip=start_add;
tss->esp-=4;
*tss->esp=&Exit;
tss->parent_tss=parent;
tss->hash_table->next=parent->hash_table;
if (!desc) desc="USER CMD";
MemCpy(tss->task_descriptor,desc,TSS_DESC_LENGTH);
tss->account=tss->parent_tss->account;
if (account) {
if (d=FindExtern("FindSysAccnt")) {
my_FindSysAccnt=d;
if (tempa=my_FindSysAccnt(account))
tss->account=tempa;
}
}
Cli;
//The following is a convenient way to
//initialize the FPU, but not very professional.
//I'll fix it when I have time.
MemCpy(&tss->fpu,&parent->fpu,108);
AddTaskToQueue(tss);
AddTaskToChildQueue(tss);
Bts(&sys_flags,SYSf_TASK_LINKS_ALTERED);
SetFlags(old_flags);
return tss;
}
TssCmdStruct *QueueTaskRequest(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags)
{
U8 old_flags=GetFlags;
TssCmdStruct *result;
if (!data) return;
result=AMAlloc(sizeof(TssCmdStruct));
result->master_tss=master;
Bts(&flags,TSSCf_TEXT);
Bts(&flags,TSSCf_NOT_INPUT);
result->flags=flags;
result->data=ANewString(data);
Cli;
InsQue(result,servant->last_servant_cmd);
if (Bt(&flags,TSSCf_WAKE_MASTER)) {
Bts(&master->task_flags,TSSf_SUSPENDED);
SwapInNext;
}
SetFlags(old_flags);
return result;
}
TssCmdStruct *QueueTextInput(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags)
{
U8 old_flags=GetFlags;
BoolU4 old_preempt=Preempt(OFF);
U1 *input_filter_start_add;
TssCmdStruct *result;
TssStruct *tss;
if (!data) return;
result=AMAlloc(sizeof(TssCmdStruct));
result->master_tss=master;
Bts(&flags,TSSCf_TEXT);
result->flags=flags;
result->data=ANewString(data);
if (input_filter_start_add=FindExtern("InputFilterTask")) {
if (Bt(&servant->task_flags,TSSf_INPUT_FILTER_TASK))
servant=servant->parent_tss;
tss=Spawn(input_filter_start_add,
"Input Filter",servant);
tss->input_filter_tss=servant->input_filter_tss;
servant->input_filter_tss=tss;
Cli;
InsQue(result,tss->last_servant_cmd);
if (Bt(&flags,TSSCf_WAKE_MASTER)) {
Bts(&master->task_flags,TSSf_SUSPENDED);
SwapInNext;
}
SetFlags(old_flags);
} else {
AFree(result);
result=NULL;
}
Preempt(old_preempt);
return result;
}
TssCmdStruct *QueueMsg(TssStruct *servant,TssStruct *master,
U8 code,U8 p1,U8 p2,U8 flags)
{
TssCmdStruct *tempc1,*tempc=AMAlloc(sizeof(TssCmdStruct));
U8 old_flags=GetFlags;
tempc->master_tss=master;
tempc->code=code;
tempc->p1=p1;
tempc->p2=p2;
tempc->flags=flags;
tempc->data=NULL;
if (Bt(&sys_flags,SYSf_RECORD_MACRO) &&
servant!=macro_util_tss &&
code==MSG_KEY_DOWN) {
tempc1=AMAllocIdentical(tempc);
InsQue(tempc1,sys_macro_queue.last);
}
Cli;
if (Bt(&servant->task_flags,TSSf_FILTER_INPUT) &&
!Bt(&flags,TSSCf_DONT_FILTER))
servant=servant->input_filter_tss;
InsQue(tempc,servant->last_servant_cmd);
if (Bt(&flags,TSSCf_WAKE_MASTER)) {
Bts(&master->task_flags,TSSf_SUSPENDED);
SwapInNext;
}
SetFlags(old_flags);
return tempc;
}
BoolU4 GetRequestResult(TssCmdStruct *rqst=NULL,U8 *result=NULL)
{
U8 old_flags=GetFlags;
TssCmdStruct *tempc,*tempc1;
Cli;
tempc1=&Fs->next_master_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
if (!rqst || rqst==tempc) {
RemQue(tempc);
if (result)
*result=tempc->result;
AFree(tempc->data);
AFree(tempc);
SetFlags(old_flags);
return TRUE;
}
tempc=tempc->next;
}
SetFlags(old_flags);
return FALSE;
}
void Msg(U8 code,U8 p1,U8 p2,U8 flags=0)
{
if (Bt(&Fs->task_flags,TSSf_INPUT_FILTER_TASK)) {
QueueMsg(Fs->parent_tss,0,code,p1,p2,
flags| 1<<TSSCf_DONT_FILTER);
} else
QueueMsg(Fs,0,code,p1,p2,flags);
}
void HandleServantCmds()
{
U8 old_flags=GetFlags;
TssCmdStruct *tempc,*tempc1,*tempc2;
TssStruct *master;
start_over:
Cli;
tempc1=&Fs->next_servant_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
tempc2=tempc->next;
if (Bt(&tempc->flags,TSSCf_NOT_INPUT)) {
RemQue(tempc);
SetFlags(old_flags);
tempc->result=my_ExecuteString(tempc->data,sys_temp_filename);
if (master=tempc->master_tss) {
if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) {
Cli;
InsQue(tempc,master->last_master_cmd);
SetFlags(old_flags);
}
if (Bt(&tempc->flags,TSSCf_FOCUS_MASTER) &&
Bt(&master->task_flags,TSSf_LOCAL_USER))
sys_cur_focus_task=master;
if (Bt(&tempc->flags,TSSCf_WAKE_MASTER))
Btr(&master->task_flags,TSSf_SUSPENDED);
if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE))
goto start_over;
else {
AFree(tempc->data);
AFree(tempc);
Exit;
}
} else {
if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) {
AFree(tempc->data);
AFree(tempc);
goto start_over;
} else {
AFree(tempc->data);
AFree(tempc);
Exit;
}
}
} //TODO: figure-out how to handle build-up of input
tempc=tempc2;
}
SetFlags(old_flags);
}
void ContinueServantTask()
{
while (TRUE) {
Btr(&Fs->task_flags,TSSf_IDLE);
HandleServantCmds;
Bts(&Fs->task_flags,TSSf_IDLE);
SwapInNext;
}
}
I1 *HomeDirString()
{
I1 *result=MAlloc(128);
SysAccntStruct *sa=Fs->account;
StrCpy(result,"::/LT/ACCOUNTS/");
if (sa)
StrCat(result,sa->name);
else
StrCat(result,"USER");
*result=PartitionToDrive(default_partition);
return result;
}
void InitSysTask()
{
InitCrt;
CursorOff;
Fs->text_attribute=(WHITE<<4)+PURPLE;
Fs->border_attribute=(WHITE<<4)+LTPURPLE;
Fs->window_top++;
CursorHome;
}
void InitLocalTask()
{
InitCrt;
Bts(&Fs->crt_flags,CRTf_HAS_CLOSE_WINDOW);
CursorOff;
Fs->text_attribute=(WHITE<<4)+BLUE;
Fs->border_attribute=(WHITE<<4)+LTBLUE;
Fs->window_top=13;
CursorHome;
Cd("HOME");
my_WindowToTop(Fs);
}
void InitUserTask()
{
Bts(&Fs->task_flags,TSSf_LOCAL_USER);
InitLocalTask;
}
asm {CP_USER_CMD_LINE::}
void UserCmdLine()
{
void my_ContinueUserTask();
InitUserTask;
Fs->user_num=++num_spawned_users;
my_ExecuteFile("USER.CPZ");
my_ContinueUserTask=FindExtern("ContinueUserTask");
my_ContinueUserTask();
}
void SysCmdLine()
{
InitSysTask;
Cd("HOME");
my_ExecuteFile("SYSTEM.CPZ");
ContinueServantTask;
}
void ServantUserCmdLine()
{
InitUserTask;
my_ExecuteFile("SERVANT.CPZ");
ContinueServantTask;
}
asm {CP_FAULT_CMD_LINE::}
void FaultCmdLine()
{
void my_ContinueUserTask();
InitUserTask;
my_ExecuteFile("FAULT.CPZ");
my_ContinueUserTask=FindExtern("ContinueUserTask");
my_ContinueUserTask();
}
asm {END_TASK::}
U8 EndTask()
{
TssStruct *tempt,*tempt1;
TssCmdStruct *tempc,*tempc1,*tempc2;
U8 my_fs;
U4 *d;
if (Fs->end_task_cb) {
Btr(&Fs->task_flags,TSSf_KILL_TASK);
Fs->eip=Fs->end_task_cb;
Fs->end_task_cb=NULL;
return Fs->fs;
}
Cli;
if (sys_cur_focus_task==Fs) {
sys_cur_focus_task=0;
ip_inhibit_win_operations=FALSE;
}
ReleaseTaskPartitions;
tempt1=&Fs->next_child_tss-offset(TssStruct.next_sibling_tss);
tempt=tempt1->next_sibling_tss;
if (tempt!=tempt1) {
do {
Bts(&tempt->task_flags,TSSf_KILL_TASK);
tempt=tempt->next_sibling_tss;
} while (tempt!=tempt1);
return Fs->next_tss->fs;
}
Btr(&sys_flags,SYSf_PREEMPTIVE);
Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT);
tempc1=&Fs->next_servant_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
tempc2=tempc->next;
AFree(tempc->data);
AFree(tempc);
tempc=tempc2;
}
tempc1=&Fs->next_master_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
tempc2=tempc->next;
AFree(tempc->data);
AFree(tempc);
tempc=tempc2;
}
//Remque
tempt =Fs->next_sibling_tss;
tempt1=Fs->last_sibling_tss;
tempt1->next_sibling_tss=tempt;
tempt ->last_sibling_tss=tempt1;
tempt =Fs->next_tss;
tempt1=Fs->last_tss;
tempt1->next_tss=tempt;
tempt ->last_tss=tempt1;
Bts(&sys_flags,SYSf_TASK_LINKS_ALTERED);
FreeMemBlkList;
my_fs=Fs->fs;
AFree(Fs);
d=&gdttab+my_fs;
*d=*free_gdt_list;
*free_gdt_list=my_fs;
return tempt->fs;
}
BIN
View File
Binary file not shown.
+620
View File
@@ -0,0 +1,620 @@
ALIGN 8,OC_NOP
SYS_ALPHA_BITMAP:: DU4 0x0000000,0x00000000,0x87FFFFFF,0x07FFFFFE;
DU4 0,0,0,0;
SYS_ALPHA_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x87FFFFFF,0x07FFFFFE;
DU4 0,0,0,0;
SYS_FILENAME_CHARS_BITMAP:: DU4 0x0000000,0x03FF6001,0x87FFFFFF,0x07FFFFFE;
DU4 0,0,0,0;
SYS_DEC_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0,0;
DU4 0,0,0,0;
SYS_HEX_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x7E,0x7E;
DU4 0,0,0,0;
SYS_PRINTABLE_CHARS_BITMAP::
DU4 0x80002200,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF;
DU4 0,0,0,0;
SYS_SAFE_DOLLAR_CHARS_BITMAP::
DU4 0x80000000,0xFFFFFFEF,0xFFFFFFFF,0x7FFFFFFF;
DU4 0,0,0,0;
SYS_DISPLAYABLE_CHARS_BITMAP::
DU4 0x80000000,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF;
DU4 0x00001FFF,0,0,0;
////**************************PROCEDURE*************************
// IN: RAX=NUMBER TO PRINT
ALIGN 8,OC_NOP
PUT_HEX_U8::
PUSH RCX
MOV RCX,16
CALL FIXED_PUT_HEX
POP RCX
RET
PUT_HEX::
PUT_HEX_U4::
PUSH RCX
MOV RCX,8
CALL FIXED_PUT_HEX
POP RCX
RET
PUT_HEX_U2::
PUSH RCX
MOV RCX,4
CALL FIXED_PUT_HEX
POP RCX
RET
PUT_HEX_U1::
PUSH RCX
MOV RCX,2
CALL FIXED_PUT_HEX
POP RCX
RET
FIXED_PUT_HEX::
PUSH_C_REGS
PUSH RSI
PUSH RDI
SUB RSP,32
MOV RDI,RSP
CALL BINARY_TO_FIXED_HEX
XOR EAX,EAX
STOSB
MOV RSI,RSP
CALL PUT_STR
ADD RSP,32
POP RDI
POP RSI
POP_C_REGS
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
PUT_CHAR::
PUSH_C_REGS
PUSH RAX
CALL CP_PUT_CHAR
ADD RSP,8
POP_C_REGS
RET
ALIGN 8,OC_NOP
PUT_STR::
PUSH_C_REGS
PUSH RSI
CALL CP_PUT_STR
ADD RSP,8
POP_C_REGS
RET
////**************************PROCEDURE*************************
// IN: RAX=BINARY
// [RDI]=@FIELD
// RCX=LENGTH (IF THE HEX_FIELD ENTRY IS USED)
//
// OUT: RAX PRESERVED
// RCX=0
// [RDI] POINTS PAST DESTINATION
ALIGN 8,OC_NOP
BINARY_TO_HEX::
MOV RCX,8
BINARY_TO_FIXED_HEX:
PUSHFD //-****
CLI //because of STD
PUSH RAX //-****
PUSH RDX //-****
ADD RDI,RCX
PUSH RDI //-**** EDI WE WANT TO RETURN
DEC RDI
MOV RDX,RAX
STD
@@1: MOV AL,DL
AND AL,0xF
ADD AL,'0'
CMP AL,'9'
JBE @@2
ADD AL,'A'-'0'-10
@@2: STOSB
SHR RDX,4
LOOP @@1
POP RDI //+****
POP RDX //+****
POP RAX //+****
POPFD //+****
RET
////**************************PROCEDURE*************************
//IN: [RSI] = @FIELD
// RCX = LENGTH
//OUT: RAX = VALUE
// RCX = 0
ALIGN 8,OC_NOP
HEX_TO_BINARY::
PUSH RDX
XOR EDX,EDX
OR RCX,RCX
JZ @@9
@@1: SHL RDX,4
LODSB
SUB AL,0x30
CMP AL,9
JA @@2
SUB AL,7
@@2: MOVZX RAX,AL
ADD RDX,RAX
LOOP @@1
@@9: MOV RAX,RDX
POP RDX
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CRLF::
PUSH RAX
MOV RAX,13
CALL PUT_CHAR
MOV RAX,10
CALL PUT_CHAR
POP RAX
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRCAT::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
@@2: LODSB
OR AL,AL
JNZ @@2
MOV RDI,RSI
DEC RDI
MOV RSI,U8 SF_PARAM2[RBP]
@@1: LODSB
STOSB
OR AL,AL
JNZ @@1
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRCPY::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM2[RBP]
MOV RDI,U8 SF_PARAM1[RBP]
@@1: LODSB
STOSB
OR AL,AL
JNZ @@1
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRCMP::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM2[RBP]
MOV RDI,U8 SF_PARAM1[RBP]
@@1: LODSB
OR AL,AL
JZ @@100
SCASB
JE @@1
JA @@90
@@80: MOV RAX,1
JMP @@101
@@90: MOV RAX,-1
JMP @@101
@@100: SCASB
JNE @@80
XOR EAX,EAX
@@101: POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
TO_UPPER::
CMP AL,'a'
JB @@100
CMP AL,'z'
JA @@100
ADD AL,'A'-'a'
@@100: RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRICMP::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM2[RBP]
MOV RDI,U8 SF_PARAM1[RBP]
@@1: LODSB
OR AL,AL
JZ @@100
CMP AL,'a'
JB @@2
CMP AL,'z'
JA @@2
ADD AL,'A'-'a'
@@2: MOV BL,U1 [RDI]
INC RDI
CMP BL,'a'
JB @@3
CMP BL,'z'
JA @@3
ADD BL,'A'-'a'
@@3: CMP AL,BL
JE @@1
JA @@90
@@80: MOV RAX,1
JMP @@101
@@90: MOV RAX,-1
JMP @@101
@@100: MOV BL,U1 [RDI]
OR BL,BL
JNE @@80
XOR EAX,EAX
@@101: POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRNCMP::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RCX,U8 SF_PARAM3[RBP]
MOV RSI,U8 SF_PARAM2[RBP]
MOV RDI,U8 SF_PARAM1[RBP]
@@1: OR RCX,RCX
JZ @@102
DEC RCX
LODSB
OR AL,AL
JZ @@100
SCASB
JE @@1
JA @@90
@@80: MOV RAX,1
JMP @@101
@@90: MOV RAX,-1
JMP @@101
@@100: MOV BL,U1 [RDI]
OR BL,BL
JNE @@80
@@102: XOR EAX,EAX
@@101: POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRNICMP::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RCX,U8 SF_PARAM3[RBP]
MOV RSI,U8 SF_PARAM2[RBP]
MOV RDI,U8 SF_PARAM1[RBP]
@@1: OR RCX,RCX
JZ @@102
DEC RCX
LODSB
OR AL,AL
JZ @@100
CMP AL,'a'
JB @@2
CMP AL,'z'
JA @@2
ADD AL,'A'-'a'
@@2: MOV BL,U1 [RDI]
INC RDI
CMP BL,'a'
JB @@3
CMP BL,'z'
JA @@3
ADD BL,'A'-'a'
@@3: CMP AL,BL
JE @@1
JA @@90
@@80: MOV RAX,1
JMP @@101
@@90: MOV RAX,-1
JMP @@101
@@100: SCASB
JNE @@80
@@102: XOR EAX,EAX
@@101: POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRSTR::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RDI,U8 SF_PARAM2[RBP]
MOV DL,U1 [RDI]
OR DL,DL
JZ @@90
JMP @@5
@@1: INC RSI
@@5: LODSB
OR AL,AL
JZ @@100
CMP AL,DL
JNE @@5
DEC RSI
MOV RCX,1
@@10: MOV AL,U1 [RDI+RCX]
OR AL,AL
JZ @@90
CMP AL,U1 [RSI+RCX]
JNE @@1
INC RCX
JMP @@10
@@80: DEC RSI
@@90: MOV RAX,RSI
JMP @@101
@@100: XOR EAX,EAX
@@101: POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_STRISTR::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RDI,U8 SF_PARAM2[RBP]
MOV AL,U1 [RDI]
CALL TO_UPPER
MOV DL,AL
OR DL,DL
JZ @@90
JMP @@5
@@1: INC RSI
@@5: LODSB
CALL TO_UPPER
OR AL,AL
JZ @@100
CMP AL,DL
JNE @@5
DEC RSI
MOV RCX,1
@@10: MOV AL,U1 [RDI+RCX]
CALL TO_UPPER
OR AL,AL
JZ @@90
MOV BL,U1 [RSI+RCX]
XCHG AL,BL
CALL TO_UPPER
CMP AL,BL
JNE @@1
INC RCX
JMP @@10
@@80: DEC RSI
@@90: MOV RAX,RSI
JMP @@101
@@100: XOR EAX,EAX
@@101: POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
// IN: [RSI]
// OUT: RAX
ALIGN 8,OC_NOP
HASH_STR::
PUSH RSI //-****
PUSH RBX //-****
XOR EAX,EAX
XOR EBX,EBX
JMP @@10
@@1: SHL RBX,1
ADC RBX,RAX
@@10: LODSB
OR AL,AL
JNZ @@1
@@100: MOV RAX,RBX
SHR RBX,16
ADC RAX,RBX
POP RBX //+****
POP RSI //+****
RET
////**************************PROCEDURE*************************
// IN: [RSI]=STR
// RBX=TYPE MASK
// [RDI]=TABLE
// OUT: [RSI]=ENTRY OR ZERO NOT FOUND
// ZERO FLAG SET NOT FOUND
ALIGN 8,OC_NOP
FIND_HASH_ENTRY::
PUSH RDX //-****
PUSH RDI //-****
MOV RDX,RSI
CALL HASH_STR
@@4: PUSH RAX //-****
AND RAX,U8 HT_MASK[RDI]
MOV RSI,U8 HT_BODY[RDI+RAX*8]
@@1: OR RSI,RSI
JNZ @@3
MOV RDI,U8 HT_NEXT[RDI]
OR RDI,RDI
JZ @@100
POP RAX
JMP @@4
@@3: TEST U4 HTE_TYPE[RSI],EBX
JZ @@90
PUSH RSI //-****
PUSH RDI //-****
MOV RDI,U8 HTE_STR[RSI]
MOV RSI,RDX
@@2: LODSB
CMP U1 [RDI],AL
JNE @@80
INC RDI
OR AL,AL
JNZ @@2
POP RDI //+****
POP RSI //+****
INC U4 HTE_USE_CNT[RSI]
JMP @@100
@@80: POP RDI //+****
POP RSI //+****
@@90: MOV RSI,U8 HTE_NEXT[RSI]
JMP @@1
@@100: POP RAX //+****
POP RDI //+****
POP RDX //+****
OR RSI,RSI
RET
////**************************PROCEDURE*************************
// IN: [RSI]=STR
// [RDI]=TABLE
// OUT: [RSI]=BUCKET
ALIGN 8,OC_NOP
FIND_HASH_BUCKET::
PUSH RAX
PUSH RDX
CALL HASH_STR
AND RAX,U8 HT_MASK[RDI]
LEA RSI,U8 HT_BODY[RDI+RAX*8]
POP RDX
POP RAX
RET
////**************************PROCEDURE*************************
FIND_EXTERN::
//IN: RSI
//OUT: RSI
PUSH RAX
PUSH RDI
PUSH RBX
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
MOV RDI,U8 TSS_HASH_TABLE[RAX]
MOV RBX,HTT_FUNCTION|HTT_SYS_SYMBOL
CALL FIND_HASH_ENTRY
JNZ @@1
XOR ESI,ESI
JMP @@3
@@1: MOV RAX,U8 HTE_USER_DATA0[RSI]
TEST U4 HTE_TYPE[RSI],HTT_FUNCTION
JZ @@2
MOV RAX,U8 C_STATEMENTS[RSI]
@@2: MOV RSI,RAX
@@3: POP RBX
POP RDI
POP RAX
OR RSI,RSI
RET
CP_FIND_EXTERN::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
MOV RDI,U8 TSS_HASH_TABLE[RAX]
MOV RSI,U8 SF_PARAM1[RBP]
MOV RBX,HTT_FUNCTION|HTT_SYS_SYMBOL
CALL FIND_HASH_ENTRY
JZ @@1
MOV RAX,U8 HTE_USER_DATA0[RSI]
TEST U4 HTE_TYPE[RSI],HTT_FUNCTION
JZ @@2
MOV RAX,U8 C_STATEMENTS[RSI]
JMP @@2
@@1: XOR EAX,EAX
@@2: POP RDI
POP RSI
POP RBP
RET
ALIGN 8,OC_NOP
////**************************PROCEDURE*************************
CP_HASH_STR::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U8 SF_PARAM1[RBP]
CALL HASH_STR
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FIND_HASH_ENTRY::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RDI,U8 SF_PARAM2[RBP]
MOV RBX,U8 SF_PARAM3[RBP]
CALL FIND_HASH_ENTRY
MOV RAX,RSI
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FIND_HASH_BUCKET::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RDI,U8 SF_PARAM2[RBP]
CALL FIND_HASH_BUCKET
MOV RAX,RSI
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_ADD_SYS_HASH_ENTRY::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RSI,U8 HTE_STR[RSI]
MOV RDI,U8 SF_PARAM2[RBP]
CALL FIND_HASH_BUCKET
MOV RDI,U8 SF_PARAM1[RBP]
PUSHFD
CLI
MOV RAX,U8 [RSI]
MOV U8 HTE_NEXT[RDI],RAX
MOV U8 [RSI],RDI
POPFD
POP RDI
POP RSI
POP RBP
RET
+662
View File
@@ -0,0 +1,662 @@
SysHashTable *NewHashTable(U8 size,TssStruct *mem_tss=NULL)
{
SysHashTable *tempht;
tempht=MAllocZ(offset(SysHashTable.body)+size<<3,mem_tss);
tempht->mask=size-1;
return tempht;
}
U8 AllocGdtTabEntry()
{
U8 old_flags=GetFlags,result;
U4 *d;
Cli;
if (!(result=free_gdt_list))
Debugger;
d=gdttab+result;
free_gdt_list=*d;
SetFlags(old_flags);
return result;
}
void FreeGdtTabEntry(U8 i)
{
U8 old_flags=GetFlags;
U4 *d=gdttab+i;
Cli;
*d=free_gdt_list;
free_gdt_list=i;
SetFlags(old_flags);
}
/*
U8 CreateCodeSelector(U8 phy_add)
{
U8 result,*d,*d1,old_flags=GetFlags;
Cli;
result=AllocGdtTabEntry;
d=gdttab+result;
d1=d+4;
*d =0x0000FFFF;
*d1=0x00CF9A00;
d=d+2;
*d|=(phy_add & 0x00FFFFFF);
*d1|=(phy_add & 0xFF000000);
d1+=4;
*d1=0;
d1+=4;
*d1=0;
SetFlags(old_flags);
return result;
}
*/
U8 CreateTssSelector(U8 phy_add)
{
U8 result,old_flags=GetFlags;
U4 *d,*d1;
Cli;
result=AllocGdtTabEntry;
d=gdttab+result;
d1=d+4;
*d =0x0000FFFF;
*d1=0x008F8900;
d=d+2;
*d|=(phy_add & 0x00FFFFFF);
*d1|=(phy_add & 0xFF000000);
d1+=4;
*d1=0;
d1+=4;
*d1=0;
SetFlags(old_flags);
return result;
}
U8 CreateMemSelector(U8 phy_add)
{
U8 result,old_flags=GetFlags;
U4 *d,*d1;
Cli;
result=AllocGdtTabEntry;
d=gdttab+result;
d1=d+4;
*d =0x0000FFFF;
*d1=0x00CF9200;
d=d+2;
*d |=(phy_add & 0x00FFFFFF);
*d1|=(phy_add & 0xFF000000);
d1+=4;
*d1=0;
d1+=4;
*d1=0;
SetFlags(old_flags);
return result;
}
void AddTaskToQueue(TssStruct *tss,TssStruct *pred=NULL)
{
TssStruct *last;
U8 old_flags=GetFlags;
Cli;
if (!pred) pred=Fs;
last=pred->last_tss;
last->next_tss=tss;
pred->last_tss=tss;
tss ->last_tss=last;
tss ->next_tss=pred;
tss->in_queue_signature=TSSS_IN_QUEUE_SIGNATURE;
SetFlags(old_flags);
}
void AddTaskToChildQueue(TssStruct *tss)
{
TssStruct *last,*pred;
U8 old_flags=GetFlags;
Cli;
pred=tss->parent_tss->last_child_tss;
last=pred->last_sibling_tss;
last->next_sibling_tss=tss;
pred->last_sibling_tss=tss;
tss ->last_sibling_tss=last;
tss ->next_sibling_tss=pred;
SetFlags(old_flags);
}
asm {CP_INIT_TSS::}
U8 InitTss(TssStruct *tss,U8 stk)
{ //Returns Fs of task
void *b;
tss->absolute_address=tss;
tss->next_tss=tss;
tss->last_tss=tss;
tss->rflags=SYS_NORMAL_RFLAGS;
b=&tss->next_child_tss-offset(TssStruct.next_sibling_tss);
tss->next_child_tss=b;
tss->last_child_tss=b;
b=&tss->next_servant_cmd;
tss->next_servant_cmd=b;
tss->last_servant_cmd=b;
b=&tss->next_master_cmd;
tss->next_master_cmd=b;
tss->last_master_cmd=b;
tss->next_input_filter_tss=tss;
tss->last_input_filter_tss=tss;
b=&tss->next_mem_blk;
tss->next_mem_blk=b;
tss->last_mem_blk=b;
b=&tss->next_lex;
tss->next_lex=b;
tss->last_lex=b;
b=&tss->next_except;
tss->next_except=b;
tss->last_except=b;
b=&tss->next_ode;
tss->next_ode=b;
tss->last_ode=b;
tss->hash_table=NewHashTable(0x1000,tss);
b=MAlloc(stk,tss);
tss->stack_base=b;
tss->stack_size=MSize(b);
b+=stk;
tss->rsp=b;
tss->answers_displayed=1; //from 0-8
return tss;
}
asm {CP_INIT_CPU_STRUCT::}
U8 InitCPUStruct(U8 num,CPUStruct *c)
{
MemSet(c,0,sizeof(CPUStruct));
c->num=num;
c->absolute_address=c;
c->idle_factor=0.01;
if (num) {
c->grbase=GrBitMapNew(BMT_COLOR4,GR_WIDTH,GR_HEIGHT);
c->grbase->flags|=BMF_SCREEN_BITMAP;
GrClear2(c->grbase);
}
return c;
}
U8 InitStk(U8 size)
{
U8 *st=MAllocZ(size);
return st+size;
}
U2 InitTssStruct2()
{
TssStruct2 *tss2;
tss2=MAllocZ(sizeof(TssStruct2));
tss2->io_map_offset=offset(TssStruct2.io_map);
MemSet(tss2->io_map,0xFF,MAXIO/8);
tss2->rsp0=InitStk(4096);
tss2->rsp1=InitStk(4096);
tss2->rsp2=InitStk(4096);
tss2->ist1=InitStk(4096);
tss2->ist2=InitStk(4096);
tss2->ist3=InitStk(4096);
tss2->ist4=InitStk(4096);
tss2->ist5=InitStk(4096);
tss2->ist6=InitStk(4096);
tss2->ist7=InitStk(4096);
return CreateTssSelector(tss2);
}
asm {CP_SPAWN_TASK::}
TssStruct *Spawn(void *start_add,
I1 *desc=NULL,
TssStruct *parent=NULL, //NULL means adam
I1 *account=NULL,
U8 stk=DEFAULT_STACK,
BoolU4 add_to_queue=TRUE)
{
U8 old_flags=GetFlags;
TssStruct *tss=MAllocZ(sizeof(TssStruct),Gs->cain_tss);
SysAccntStruct *tempa;
if (!desc) desc="Unnamed Task";
if (!parent) parent=Gs->cain_tss;
tss->parent_tss=parent;
tss->gs=parent->gs;
InitTss(tss,stk);
tss->rip=start_add;
tss->rsp-=8;
*tss->rsp=&Exit;
tss->hash_table->next=parent->hash_table;
MemCpy(tss->task_descriptor,desc,TSS_DESC_LENGTH);
MemCpy(tss->task_descriptor2,desc,TSS_DESC_LENGTH);
tss->account=tss->parent_tss->account;
if (account) {
if (tempa=CallExtStr("FindSysAccnt",account))
tss->account=tempa;
}
//The following is a convenient way to
//initialize the FPU, but not very professional.
//I'll fix it when I have time.
MemCpy(&tss->fpu,&parent->fpu,108);
Cli;
if (add_to_queue) {
AddTaskToQueue(tss);
AddTaskToChildQueue(tss);
}
SetFlags(old_flags);
return tss;
}
TssCmdStruct *QueueTaskRequest(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags)
{
U8 old_flags=GetFlags;
TssCmdStruct *result;
if (!data || !ValidateTss(servant) ||
master && !ValidateTss(master))
return NULL;
result=AMAlloc(sizeof(TssCmdStruct));
result->master_tss=master;
result->cmd_code=TSSCT_EXECUTE_STR;
result->flags=flags;
result->data=ANewStr(data);
Cli;
servant->task_flags&=~(1<<TSSf_IDLE);
InsQue(result,servant->last_servant_cmd);
servant->task_flags&=~(1<<TSSf_AWAITING_MSG);
if (Bt(&flags,TSSCf_WAKE_MASTER) &&
ValidateTss(master)) {
Bts(&master->task_flags,TSSf_SUSPENDED);
SwapInNext;
}
SetFlags(old_flags);
return result;
}
TssCmdStruct *QueueTextInput(TssStruct *servant,TssStruct *master,
I1 *data,U8 flags)
{
U8 old_flags=GetFlags;
BoolU4 old_preempt=Preempt(OFF);
U1 *input_filter_start_add;
TssCmdStruct *result;
TssStruct *tss;
if (!data || !ValidateTss(servant) ||
master && !ValidateTss(master)) {
Preempt(old_preempt);
return NULL;
}
result=AMAlloc(sizeof(TssCmdStruct));
result->master_tss=master; //in case somebody cares
result->cmd_code=TSSCT_TEXT_INPUT;
result->flags=flags;
result->data=ANewStr(data);
if (input_filter_start_add=ext[EXT_INPUT_FILTER_TASK]) {
if (flags&1<<TSSCf_HIGHEST_PRIORITY ||
servant->next_input_filter_tss==servant) {
tss=Spawn(input_filter_start_add,
"Input Filter",servant);
Cli;
tss->next_input_filter_tss=servant->next_input_filter_tss;
tss->last_input_filter_tss=servant;
servant->next_input_filter_tss=tss;
tss->next_input_filter_tss->last_input_filter_tss=tss;
} else
tss=servant->next_input_filter_tss;
Cli;
tss->task_flags&=~(1<<TSSf_IDLE);
InsQue(result,tss->last_servant_cmd);
tss->task_flags&=~(1<<TSSf_AWAITING_MSG);
SetFlags(old_flags);
} else {
AFree(result);
result=NULL;
}
Preempt(old_preempt);
return result;
}
TssCmdStruct *QueueMsg(TssStruct *servant,TssStruct *master,
U8 code,U8 p1,U8 p2,U8 flags)
{
TssCmdStruct *tempc1,*tempc;
U8 old_flags=GetFlags;
if (!ValidateTss(servant) ||
master && !ValidateTss(master))
return NULL;
tempc=AMAlloc(sizeof(TssCmdStruct));
tempc->master_tss=master;
tempc->cmd_code=TSSCT_MSG;
tempc->msg_code=code;
tempc->p1=p1;
tempc->p2=p2;
tempc->flags=flags;
tempc->data=NULL;
if (Bt(&sys_semas[SYS_SEMA_RECORD_MACRO],0) &&
servant!=macro_util_tss &&
code==MSG_KEY_DOWN) {
tempc1=AMAllocIdentical(tempc);
InsQue(tempc1,sys_macro_queue.last);
}
Cli;
while (Bt(&servant->task_flags,TSSf_FILTER_INPUT) &&
!Bt(&flags,TSSCf_DONT_FILTER))
servant=servant->next_input_filter_tss;
servant->task_flags&=~(1<<TSSf_IDLE);
InsQue(tempc,servant->last_servant_cmd);
servant->task_flags&=~(1<<TSSf_AWAITING_MSG);
SetFlags(old_flags);
return tempc;
}
BoolU8 GetRequestResult(TssCmdStruct *rqst=NULL,U8 *result=NULL)
{
U8 old_flags=GetFlags;
TssCmdStruct *tempc,*tempc1;
Cli;
tempc1=&Fs->next_master_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
if (!rqst || rqst==tempc) {
RemQue(tempc);
if (result)
*result=tempc->result;
AFree(tempc->data);
AFree(tempc);
SetFlags(old_flags);
return TRUE;
}
tempc=tempc->next;
}
SetFlags(old_flags);
return FALSE;
}
void WaitTskIdle(TssStruct *tss)
{
U8 old_flags=GetFlags;
TssStruct *tss1;
TssCmdStruct *tempc;
Cli;
while (TRUE) {
tss1=tss->last_input_filter_tss;
tempc=&tss1->next_servant_cmd;
if (ValidateTss(tss1) && tempc==*tempc &&
Bt(&tss1->task_flags,TSSf_IDLE))
break;
SwapInNext;
}
SetFlags(old_flags);
}
void Msg(U8 code,U8 p1,U8 p2,U8 flags=0)
{
if (Bt(&Fs->task_flags,TSSf_INPUT_FILTER_TASK)) {
QueueMsg(Fs->last_input_filter_tss,NULL,code,p1,p2,
flags| 1<<TSSCf_DONT_FILTER);
} else
QueueMsg(Fs,NULL,code,p1,p2,flags);
}
U8 HandleServantCmds(TssStruct *tss=NULL)
{
U8 cnt=0,old_flags=GetFlags;
TssCmdStruct *tempc,*tempc1;
TssStruct *master;
if (!tss) tss=Fs;
start_over:
Cli;
tempc1=&tss->next_servant_cmd;
while (tempc!=tempc1) {
tempc=tempc1->next;
if (tempc->cmd_code==TSSCT_EXECUTE_STR ||
tempc->cmd_code==TSSCT_EXECUTE_FILE) {
cnt++;
RemQue(tempc);
SetFlags(old_flags);
try {
if (tempc->cmd_code==TSSCT_EXECUTE_STR)
tempc->result=CallExtNum(EXT_EXECUTE_STR,tempc->data,sys_temp_filename);
else
tempc->result=CallExtNum(EXT_EXECUTE_FILE,tempc->data);
} catch
Fs->catch_except=TRUE;
if (master=tempc->master_tss) {
if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) {
Cli;
InsQue(tempc,master->last_master_cmd);
SetFlags(old_flags);
}
if (Bt(&tempc->flags,TSSCf_FOCUS_MASTER) &&
Bt(&master->task_flags,TSSf_LOCAL_USER))
sys_cur_focus_task=master;
if (Bt(&tempc->flags,TSSCf_WAKE_MASTER))
Btr(&master->task_flags,TSSf_SUSPENDED);
if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE))
goto start_over;
else {
AFree(tempc->data);
AFree(tempc);
Exit;
}
} else {
if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) {
AFree(tempc->data);
AFree(tempc);
goto start_over;
} else {
AFree(tempc->data);
AFree(tempc);
Exit;
}
}
} else
break;
}
SetFlags(old_flags);
return cnt;
}
void ContinueServantTask()
{
Preempt(OFF);
CallExtNum(EXT_FLUSH_MSGS,NULL);
while (TRUE) {
if (HandleServantCmds)
if (!Bt(&Fs->task_flags,TSSf_DONT_CHANGE_DESC))
MemCpy(Fs->task_descriptor,Fs->task_descriptor2,TSS_DESC_LENGTH);
CallExtNum(EXT_FLUSH_MSGS,NULL);
Fs->task_flags|=(1<<TSSf_IDLE)|(1<<TSSf_AWAITING_MSG);
SwapInNext;
}
}
I1 *HomeDirStr()
{
I1 *result=MAlloc(128);
SysAccntStruct *sa=Fs->account;
StrCpy(result,"::/LT/Accts/");
if (sa)
StrCat(result,sa->name);
else
StrCat(result,"User");
*result=PartitionToDrive(default_partition);
return result;
}
void InitSysTask()
{
InitCrt;
Fs->text_attribute=(WHITE<<4)+PURPLE;
Fs->border_attribute=(WHITE<<4)+LTPURPLE;
Fs->win_top++;
}
void InitLocalTask()
{
InitCrt;
Bts(&Fs->crt_flags,CRTf_HAS_CLOSE_WIN);
Fs->text_attribute=(WHITE<<4)+BLUE;
Fs->border_attribute=(WHITE<<4)+LTBLUE;
Fs->win_top=13;
Cd("HOME");
CallExtNum(EXT_WIN_TO_TOP,Fs);
}
void InitUserTask()
{
Bts(&Fs->task_flags,TSSf_LOCAL_USER);
InitLocalTask;
}
asm {CP_USER_CMD_LINE::}
void UserCmdLine()
{
InitUserTask;
Fs->user_num=++num_spawned_users;
CallExtNum(EXT_EXECUTE_FILE,"User.CPZ");
CallExtStr("ContinueUserTask");
}
void SysCmdLine()
{
InitSysTask;
Cd("HOME");
CallExtNum(EXT_EXECUTE_FILE,"System.CPZ");
ContinueServantTask;
}
void ServantUserCmdLine()
{
InitUserTask;
CallExtNum(EXT_EXECUTE_FILE,"Servant.CPZ");
ContinueServantTask;
}
TssStruct *SpawnUser(I1 *st=NULL)
{
TssStruct *tss=Spawn(&UserCmdLine);
WaitTskIdle(tss);
if (st)
XTalk(tss,st);
return tss;
}
void FinishOffTss(TssStruct *tss)
{
if (Gs->cpu_heap) {
Free(tss->hash_table,Gs->cain_tss);
Free(tss->stack_base,Gs->cain_tss);
}
FreeMemBlkList(tss);
Free(tss,Gs->cain_tss);
}
asm {END_TASK::}
U8 EndTask()
{
TssStruct *tempt,*tempt1;
TssCmdStruct *tempc,*tempc1,*tempc2;
Preempt(OFF);
if (Fs->end_task_cb) {
Btr(&Fs->task_flags,TSSf_KILL_TASK);
Fs->rip=Fs->end_task_cb;
Fs->end_task_cb=NULL;
return Fs;
}
if (Fs->parent_tss) {
if (Fs->parent_tss->popup_tss==Fs) {
Fs->parent_tss->popup_tss=NULL;
Kill(Fs->parent_tss,FALSE);
return Fs->parent_tss;
}
if (Fs->parent_tss->dbg_tss==Fs)
Fs->parent_tss->dbg_tss=NULL;
}
ReleaseTaskPartitions;
tempt1=&Fs->next_child_tss-offset(TssStruct.next_sibling_tss);
tempt=tempt1->next_sibling_tss;
if (tempt!=tempt1) {
do {
Bts(&tempt->task_flags,TSSf_KILL_TASK);
tempt=tempt->next_sibling_tss;
} while (tempt!=tempt1);
return Fs->next_tss;
}
tempc1=&Fs->next_servant_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
tempc2=tempc->next;
AFree(tempc->data);
AFree(tempc);
tempc=tempc2;
}
tempc1=&Fs->next_master_cmd;
tempc=tempc1->next;
while (tempc!=tempc1) {
tempc2=tempc->next;
AFree(tempc->data);
AFree(tempc);
tempc=tempc2;
}
LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0);
Cli; //TDOD: might be too long
if (sys_cur_focus_task==Fs) {
sys_cur_focus_task=0;
ip_inhibit_win_operations=FALSE;
}
//Remque
Fs->in_queue_signature=0;
tempt =Fs->next_input_filter_tss;
tempt1=Fs->last_input_filter_tss;
tempt1->next_input_filter_tss=tempt;
tempt ->last_input_filter_tss=tempt1;
tempt =Fs->next_sibling_tss;
tempt1=Fs->last_sibling_tss;
tempt1->next_sibling_tss=tempt;
tempt ->last_sibling_tss=tempt1;
tempt =Fs->next_tss;
tempt1=Fs->last_tss;
tempt1->next_tss=tempt;
tempt ->last_tss=tempt1;
if (sys_update_screen_tss) {
Fs->next_tss=Gs->dying_tss_list;
Gs->dying_tss_list=Fs;
} else
FinishOffTss(Fs); //dangerous (stack in use)
return tempt;
}
void FinishOffDyingTsses()
{
BoolU4 old_preempt=Preempt(OFF);
TssStruct *tss1,*tss2;
if (tss1=Gs->dying_tss_list) {
do {
tss2=tss1->next_tss;
FinishOffTss(tss1);
tss1=tss2;
} while (tss1);
Gs->dying_tss_list=NULL;
}
Preempt(old_preempt);
}
@@ -2,6 +2,8 @@
// and I implimented it when I worked for Ticketmaster.
void ArcCompressBuf(ArcCs *c)
//Use $LK,"CompressBuf","MN:CompressBuf"$() unless you are doing
//more than one buffer.
{
ArcTableEntry *temp,*temp1;
U8 basecode;
@@ -25,12 +27,14 @@ void ArcCompressBuf(ArcCs *c)
if (temp=c->hash[basecode])
do {
if (temp->ch==ch) {
basecode=(temp-&c->compress[0])>>3;
basecode=(temp-&c->compress[0])>>4;
#assert sizeof(ArcTableEntry)==16
goto arc_start_loop1;
}
} while (temp=temp->next);
OrWordBitField(c->dst_buf,c->dst_pos,basecode);
OrU4BitField(c->dst_buf,c->dst_pos,basecode);
c->dst_pos+=c->cur_bits_in_use;
c->entry_used=TRUE;
@@ -51,12 +55,15 @@ arc_done_compression:
void ArcFinishCompression(ArcCs *c)
{
if (c->dst_pos+c->cur_bits_in_use<=c->dst_size) {
OrWordBitField(c->dst_buf,c->dst_pos,c->saved_basecode);
OrU4BitField(c->dst_buf,c->dst_pos,c->saved_basecode);
c->dst_pos+=c->cur_bits_in_use;
}
}
void ArcExpandBuf(ArcCs *c)
//Use $LK,"ExpandBuf","MN:ExpandBuf"$() unless you know what
//you're doing. I forgot why I made this
//"public".
{
U1 *dst_ptr,*dst_limit;
U8 basecode,lastcode,code;
@@ -71,9 +78,9 @@ void ArcExpandBuf(ArcCs *c)
if (c->stack_ptr==c->stack_base && dst_ptr<dst_limit) {
if (c->saved_basecode==0xFFFFFFFF) {
lastcode=ExtractWordBitField(c->src_buf,c->src_pos,
lastcode=ExtractU4BitField(c->src_buf,c->src_pos,
c->next_bits_in_use);
c->src_pos=c->src_pos+c->next_bits_in_use;
c->src_pos+=c->next_bits_in_use;
*dst_ptr++=lastcode;
ArcGetTableEntry(c);
c->last_ch=lastcode;
@@ -81,7 +88,7 @@ void ArcExpandBuf(ArcCs *c)
lastcode=c->saved_basecode;
while (dst_ptr<dst_limit &&
c->src_pos+c->next_bits_in_use<=c->src_size) {
basecode=ExtractWordBitField(c->src_buf,c->src_pos,
basecode=ExtractU4BitField(c->src_buf,c->src_pos,
c->next_bits_in_use);
c->src_pos+=c->next_bits_in_use;
if (c->cur_entry==&c->compress[basecode]) {
@@ -180,30 +187,27 @@ ArcCompressStruct *CompressBuf(U1 *src,U8 size,
U1 *ExpandBuf(ArcCompressStruct *r)
{
ArcCs *c;
ArcCompressStruct *r2=r;
U1 *result;
BoolU4 text_only;
result=MAlloc(r2->expanded_size+1);
result[r2->expanded_size]=0; //terminate
result=MAlloc(r->expanded_size+1);
result[r->expanded_size]=0; //terminate
text_only=(r2->compression_type==CT_7_BIT);
if (r2->compression_type==CT_NONE) {
MemCpy(result,r2->body,r2->expanded_size);
text_only=(r->compression_type==CT_7_BIT);
if (r->compression_type==CT_NONE) {
MemCpy(result,r->body,r->expanded_size);
goto expand_end;
}
c=NewArcCs(TRUE,text_only);
c->src_size=r2->compressed_size<<3;
c->src_size=r->compressed_size<<3;
c->src_pos=(sizeof(ArcCompressStruct)-1)<<3;
c->src_buf=r2;
c->dst_size=r2->expanded_size;
c->src_buf=r;
c->dst_size=r->expanded_size;
c->dst_buf=result;
c->dst_pos=0;
ArcExpandBuf(c);
DelArcCs(c);
expand_end:
if (r2!=r)
Free(r2);
return result;
}
-1983
View File
File diff suppressed because it is too large. Load diff
-1015
View File
File diff suppressed because it is too large. Load diff
+50 -24
View File
@@ -1,14 +1,19 @@
I4 YearStartDate(I4 year)
U2 month_start_days1[12]={
0,31,59,90,120,151,181,212,243,273,304,334};
U2 month_start_days2[12]={
0,31,60,91,121,152,182,213,244,274,305,335};
I8 YearStartDate(I8 year)
{
I4 y1=year-1;
I4 yd4000=y1/4000,yd400=y1/400,yd100=y1/100,yd4=y1/4;
I8 y1=year-1;
I8 yd4000=y1/4000,yd400=y1/400,yd100=y1/100,yd4=y1/4;
return year*365+yd4-yd100+yd400-yd4000;
}
LTDate ToLTDate(LTDateStruct *d)
{
LTDate ltdt;
I4 i1,i2;
I8 i1,i2;
i1=YearStartDate(d->year);
i2=YearStartDate(d->year+1);
if (i2-i1==365)
@@ -16,21 +21,25 @@ LTDate ToLTDate(LTDateStruct *d)
else
i1+=month_start_days2[d->month-1];
ltdt.date=i1+d->day_of_month-1;
ltdt.time=DivU8((d->ten_thousandths+10000*(d->seconds+60*(d->minutes+60*d->hours)))<<21,(15*15*3*625));
ltdt.time=(d->ten_thousandths+10000*(d->seconds+60*(d->minutes+60*(d->hours))))<<21/(15*15*3*625);
return ltdt;
}
U1 DayOfWeek(I4 i)
I8 DayOfWeek(I8 i)
{
return (i+LT_BASE_DAY_OF_WEEK) % 7;
i+=LT_BASE_DAY_OF_WEEK;
if (i>=0)
return i % 7;
else
return 6-(6-i)%7;
}
void ToLTDateStruct(LTDateStruct *d,LTDate ltdt)
{
I4 i,date=ltdt.date;
U4 k;
I8 i,date=ltdt.date;
U8 k;
d->day_of_week=DayOfWeek(date);
d->year=DivI8(MulI8(date,100000),36524225);
d->year=(date+1)*100000/36524225;
i=YearStartDate(d->year);
date-=i;
if (YearStartDate(d->year+1)-i==365) {
@@ -46,7 +55,7 @@ void ToLTDateStruct(LTDateStruct *d,LTDate ltdt)
}
d->month=k+1;
d->day_of_month=date+1;
k=MulU8(625*15*15*3,ltdt.time)>>21+1;
k=(625*15*15*3*ltdt.time)>>21+1;
d->ten_thousandths=k%10000; k/=100;
d->hundredths=k%100; k/=100;
d->seconds=k%60;k/=60;
@@ -54,7 +63,7 @@ void ToLTDateStruct(LTDateStruct *d,LTDate ltdt)
d->hours =k/60;
}
I4 FirstDayOfMonth(I4 i)
I8 FirstDayOfMonth(I8 i)
{
LTDateStruct d;
LTDate ltdt=0;
@@ -65,7 +74,7 @@ I4 FirstDayOfMonth(I4 i)
return ltdt.date;
}
I4 LastDayOfMonth(I4 i)
I8 LastDayOfMonth(I8 i)
{
LTDateStruct d;
LTDate ltdt=0;
@@ -81,7 +90,7 @@ I4 LastDayOfMonth(I4 i)
return ltdt.date-1;
}
I4 FirstDayOfYear(I4 i)
I8 FirstDayOfYear(I8 i)
{
LTDateStruct d;
LTDate ltdt=0;
@@ -93,7 +102,7 @@ I4 FirstDayOfYear(I4 i)
return ltdt.date;
}
I4 LastDayOfYear(I4 i)
I8 LastDayOfYear(I8 i)
{
LTDateStruct d;
LTDate ltdt=0;
@@ -107,11 +116,11 @@ I4 LastDayOfYear(I4 i)
}
I8 Bcd2Bin(U8 b)
U8 Bcd2Bin(U8 b)
{
I8 i,result=0;
U8 i,result=0;
for (i=0;i<16;i++) {
result=MulU8(result,10)+DivU8(b,0x1000000000000000);
result=result*10+b>>60;
b<<=4;
}
return result;
@@ -120,12 +129,15 @@ I8 Bcd2Bin(U8 b)
void GetCurTimeLTDateStruct(LTDateStruct *r)
{
I8 i;
U8 i;
U8 old_flags=GetFlags;
U1 *p=r;
BoolU4 is_bcd;
MemSet(r,0,sizeof(LTDateStruct));
Cli;
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_SYS_DATE],0));
do OutP(0x70,0x0A);
while (InP(0x71) & 0x80);
@@ -145,21 +157,36 @@ void GetCurTimeLTDateStruct(LTDateStruct *r)
OutP(0x70,9);
p[9]=InP(0x71);
SetFlags(old_flags);
OutP(0x70,0x0B);
if (!(InP(0x71) & 4)) {
if (InP(0x71) & 4)
is_bcd=FALSE;
else
is_bcd=TRUE;
LBtr(&sys_semas[SYS_SEMA_SYS_DATE],0);
SetFlags(old_flags);
if (is_bcd) {
for (i=3;i<10;i++)
p[i]=Bcd2Bin(p[i]);
}
if (r->year>255) r->year=255;
r->year+=2000;
if (r->month>12) r->month=12;
if (r->day_of_month>31) r->day_of_month=31;
if (r->day_of_week>6) r->day_of_week=6;
if (r->hours>23) r->hours=23;
if (r->minutes>59) r->minutes=59;
if (r->seconds>59) r->seconds=59;
if (r->hundredths>99) r->hundredths=99;
}
LTDate GetCurTimeLTDate()
{
LTDate result;
LTDateStruct r;
GetCurTimeLTDateStruct(&r);
return ToLTDate(&r);
result=ToLTDate(&r)-local_time_offset;
return result;
}
void LTDateToISO(ISODate *dst,LTDate ltdate)
@@ -188,4 +215,3 @@ LTDate ISOToLTDate(ISODate *dt)
ltdt.hours=dt->hour;
return ToLTDate(&ltdt);
}
+232
View File
@@ -0,0 +1,232 @@
BoolU8 IsDbgTsk()
{
TssStruct *tss=Fs->parent_tss;
if (ValidateTss(tss) && tss->dbg_tss==Fs)
return TRUE;
else
return FALSE;
}
BoolU8 CheckPtr(void *ptr)
{
if (ptr>=sys_heap_base && ptr<=sys_heap_limit)
return TRUE;
else if (ptr<sys_boot_base)
return FALSE;
else if (ptr<0xA0000)
return TRUE;
else
return FALSE;
}
BoolU8 CheckOnStk(void *ptr,TssStruct *tss=NULL)
{
if (tss) {
if (ptr>=tss->stack_base &&
ptr<=tss->stack_base+tss->stack_size)
return TRUE;
} else if (ptr>=sys_heap_base && ptr<=sys_heap_limit)
return TRUE;
return FALSE;
}
void StackRep(void **rsp=NULL)
//Reports whats on the stack
{
U8 i,old_flags=GetFlags;
void * my_rsp[32];
if (!rsp) rsp=GetBasePtr;
Cli;
MemCpy(my_rsp,rsp,32*sizeof(void *));
SetFlags(old_flags);
for (i=0;i<32;i++)
PrintF("%08X [RSP+%04X]: %016X %P\r\n",rsp+i<<3,i<<3,my_rsp[i],my_rsp[i]);
CrLf;
}
U8 *Caller(U8 num=1)
//Returns the address of the function
//which called this one, or the caller
//of the caller, etc.
{
void **rbp=GetBasePtr,*ptr;
while (num--) {
if (rbp>=*rbp)
return NULL;
rbp=*rbp;
if (!CheckOnStk(rbp,Fs))
return NULL;
}
ptr=rbp+sizeof(void *);
return *ptr;
}
void CallerRep(void **rbp=NULL,TssStruct *tss=NULL)
//Prints a report of calling routines
{
U8 i=0;
void **ptr;
if (!tss) tss=Fs;
if (!rbp) rbp=GetBasePtr;
while (CheckOnStk(rbp,tss)) {
ptr=rbp+sizeof(void *);
PrintF("Caller %d:%08tX:%P\r\n",i++,*ptr,*ptr);
if (rbp>=*rbp)
break;
rbp=*rbp;
}
}
void DbgStr(I1 *st,U8 mS=100)
//Shows a string using
//$LK,"Raw","MN:Raw"$ screen output for a fixed length
//of time.
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgStr(",st,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgNum(U8 num,U8 mS=100)
//Shows a hex number using
//$LK,"Raw","MN:Raw"$ screen output for a fixed length
//of time.
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgNum(",num,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgF(double d,U8 mS=100)
//Shows a floating-point value using
//$LK,"Raw","MN:Raw"$ screen output for a fixed length
//of time.
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgF(",d,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgAdd(void *add,U8 mS=100)
//Shows an address using $LK,"Raw","MN:Raw"$ screen
//output for a length of time.
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
PrintF("DbgAdd(%P)",add);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgD(void *add,U8 cnt=0x80,U8 mS=100)
//Dumps a block of memory using $LK,"Raw","MN:Raw"$
//screen output for a fixed length
//of time.
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
D(add,cnt);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgDm(void *add,U8 cnt=0x80,U8 mS=100)
//Dumps a block of memory using $LK,"Raw","MN:Raw"$
//screen output for a fixed length
//of time.
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
Dm(add,cnt);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void Debugger(I1 *msg=NULL,U8 num=0)
//Enters the debugger.
//This can be used as a kernel panic.
{
Cli;
Raw(ON);
coutln "\r\n\r\nLoseThos Debugger\r\n";
Beep;
if (msg) {
cout msg;
if (num)
cout num;
CrLf;
}
CallerRep;
if (ext[EXT_DEBUGGER])
CallExtNum(EXT_DEBUGGER);
else {
coutln "No Debugger";
while (TRUE);
}
}
void FaultCmdLine()
{
InitUserTask;
CallExtNum(EXT_EXECUTE_FILE,"Fault.CPZ");
CallExtStr("ContinueUserTask");
}
asm {CP_FAULT2::}
void Fault2()
{
TssStruct *tss;
BoolU4 old_raw;
//$FG,4$$BK,1$Be careful not to swap-out and ruin the saved context$FG$$BK,0$
sys_cur_focus_task=0;
if (Fs->dbg_tss) {
Bts(&Fs->task_flags,TSSf_SUSPENDED);
CallExtNum(EXT_RESUME_DBG);
} else {
old_raw=Raw(ON);
coutln "\r\n\r\nFault2:",Fs->fault_num;
// Beep;
//These are optional--alter them to suit taste
CallerRep;
StackRep;
BusyWait(3000000); //dbgoo
if (!Bt(&Fs->task_flags,TSSf_IS_FAULT_TASK)) {//no double fault
tss=Spawn(&FaultCmdLine,"Fault Task",Fs);
Bts(&tss->task_flags,TSSf_IS_FAULT_TASK);
CallExtNum(EXT_WIN_TO_TOP,tss);
}
Raw(old_raw);
Bts(&Fs->task_flags,TSSf_SUSPENDED);
}
}
+554
View File
@@ -0,0 +1,554 @@
void LockPartition(LTPartition *p)
{
BoolU4 old_preempt=Preempt(OFF);
LTBlkDev *bdev=p->bdev;
CheckLTPartition(p);
if (p->owning_task!=Fs) {
while (Bts(&p->flags,MPEf_LOCKED))
SwapInNext;
if (bdev->type==LTBDT_FDC)
FDCGet(bdev);
p->owning_task=Fs;
}
Preempt(old_preempt);
}
BoolU8 UnlockPartition(LTPartition *p,BoolU4 reset=FALSE)
{
LTBlkDev *bdev=p->bdev;
BoolU4 old_preempt=Preempt(OFF),result=FALSE;
CheckLTPartition(p);
if (p->owning_task==Fs) {
if (reset) {
bdev->flags&=~(LTBDF_INITIALIZED|LTBDF_INIT_IN_PROGRESS);
if (bdev->irq)
LBtr(&sema_irq_busy[bdev->irq],0);
}
p->owning_task=0;
if (bdev->type==LTBDT_FDC)
FDCFree(bdev);
Btr(&p->flags,MPEf_LOCKED);
result=TRUE;
SwapInNext; //Prevent deadlock
}
Preempt(old_preempt);
return result;
}
void AllocMAPBuf(LTPartition *p,U8 num_blks)
{
CheckLTPartition(p);
AFree(p->cur_MAP_blk);
AFree(p->buffered_MAP_dirty_bits);
p->num_buffered_MAP_blks=num_blks;
p->cur_MAP_blk=AMAlloc(num_blks<<BLK_SIZE_BITS);
p->buffered_MAP_dirty_bits=AMAllocZ((num_blks+7)>>3);
p->cur_MAP_blk_num=0;
RBlks(p,p->cur_MAP_blk,p->MAP1,p->num_buffered_MAP_blks,FALSE);
}
void CleanMAPBuf(LTPartition *p,I8 MAP_select=-1)
{
U8 i;
if (MAP_select==-1 || MAP_select==0) {
for (i=0;i<p->num_buffered_MAP_blks;i++)
if (Bt(p->buffered_MAP_dirty_bits,i))
WBlks(p,p->cur_MAP_blk+i<<BLK_SIZE_BITS,p->MAP1+i+p->cur_MAP_blk_num,1,FALSE);
}
if (MAP_select==-1 || MAP_select==1) {
for (i=0;i<p->num_buffered_MAP_blks;i++)
if (Btr(p->buffered_MAP_dirty_bits,i))
WBlks(p,p->cur_MAP_blk+i<<BLK_SIZE_BITS,p->MAP2+i+p->cur_MAP_blk_num,1,FALSE);
}
}
void SetLTBuf(LTPartition *p,U8 c)
{
U8 MAP_blk_num=c>>(BLK_SIZE_BITS+3);
if (MAP_blk_num!=p->cur_MAP_blk_num) {
CleanMAPBuf(p);
p->cur_MAP_blk_num=MAP_blk_num;
RBlks(p,p->cur_MAP_blk,p->MAP1+p->cur_MAP_blk_num,1,FALSE);
}
}
#define ZERO_BUF_SIZE 2048
void WZeroBlks(LTPartition *p,U8 blk,U8 cnt,BoolU4 unlock)
{
U8 n;
U1 *z=MAllocZ(ZERO_BUF_SIZE<<BLK_SIZE_BITS);
while (cnt) {
n=cnt;
if (n>ZERO_BUF_SIZE)
n=ZERO_BUF_SIZE;
WBlks(p,z,blk,n,unlock);
blk+=n;
cnt-=n;
SwapInNext; //Prevent locking
}
Free(z);
}
//Very dangerous
BoolU8 SetDriveType(I1 drive,U8 type=PT_LT)
{
I8 i,j,ext_base,num_partition;
U8 offset,cur_type;
MasterBootStruct mbr;
LTBlkDev *bd=DriveToBlkDev(drive);
num_partition=bd->partition_base-'A';
switch (bd->type) {
case LTBDT_ATA:
offset=0;
ext_base=INVALID_CLUSTER;
while (TRUE) {
ATAReadBlks(bd,&mbr,offset,1);
j=-1;
for (i=0;i<4;i++) {
cur_type=mbr.p[i].type;
if (cur_type) {
if (cur_type==5 || cur_type==0xF)
j=i;
else {
if ((num_partition+'A')==drive) {
mbr.p[i].type=type;
mbr.p[i].active=0x80;
ATAWriteBlks(bd,&mbr,offset,1);
return TRUE;
}
num_partition++;
}
}
}
if (j<0)
break;
if (mbr.p[j].offset==0)
break;
if (ext_base==INVALID_CLUSTER) {
offset=mbr.p[j].offset;
ext_base=offset;
} else
offset=mbr.p[j].offset+ext_base;
}
break;
}
}
BoolU8 InitBlkDev(LTBlkDev *bd,BoolU4 unlock)
{
LTPartition *p=DriveToPartition(bd->partition_base),*p2;
LTBlkDev *bd2;
BoolU4 old_preempt=Preempt(OFF),result=FALSE;
if (!(bd->flags & LTBDF_INITIALIZED)) {
bd->flags|=LTBDF_INITIALIZED |
LTBDF_INIT_IN_PROGRESS;
switch(bd->type) {
case LTBDT_RAM:
bd->RAM_disk=AMAllocZ((bd->max_blk+1)<<BLK_SIZE_BITS);
bd->max_blk=MSize(bd->RAM_disk)>>BLK_SIZE_BITS-1;
p->type=PT_LT;
//TODO: finish unlock?
FormatLT(bd->partition_base,FALSE);
break;
case LTBDT_FDC:
if (!monitor_floppy_tss) {
monitor_floppy_tss=Spawn(&MonitorFDCTsk,"FLOPPY MANAGER");
monitor_floppy_tss->user_data0=bd;
}
bd->max_reads=1;
bd->max_writes=1;
bd->read_freq=750;
bd->write_freq=150;
break;
case LTBDT_ATA:
bd->max_reads=128;
bd->max_writes=1;
bd->read_freq=2000;
bd->write_freq=500;
IDEInit(bd,TRUE);
break;
case LTBDT_ATAPI:
//0xFFFF*4 is too big for my taste
bd->max_reads=0x800*4;
//max of maybe a quarter of disk cache
if (bd->max_reads>ltdc_size*BLK_SIZE/4)
bd->max_reads=(ltdc_size/BLK_SIZE/4) & ~3;
if (bd->max_reads<128)
bd->max_reads=128;
bd->max_writes=0xFFFF*4;
bd->read_freq=1000;
bd->write_freq=250;
IDEInit(bd,TRUE);
p->size=bd->max_blk+1;
break;
case LTBDT_LT_FILE:
if (bd->flags & LTBDF_FORMAT) {
//TODO: finish unlock?
bd->f=FOpen(bd->filename,"wc",p->size);
if (!bd->f)
throw(EXCEPT_PARTITION,1);
//TODO: finish unlock?
FormatLT(bd->partition_base,TRUE);
} else {
bd->f=FOpen(bd->filename,"wc+");
if (!bd->f)
throw(EXCEPT_PARTITION,2);
bd->max_blk=(FSize(bd->f)+BLK_SIZE-1)>>BLK_SIZE_BITS-1;
p->size=bd->max_blk+1;
InitLTPartition(p,unlock);
}
break;
case LTBDT_NON_LT_FILE:
bd->max_reads=128;
bd->max_writes=128;
bd->read_freq=2000;
bd->write_freq=500;
if (bd->flags & LTBDF_FORMAT)
FormatLT(bd->partition_base,TRUE);
else {
p2=DriveToPartition(bd->non_lt_drive);
bd2=p2->bdev;
bd->min_blk=p->offset;
bd->max_blk=p2->offset+p2->size-1; //temp
p->size=p2->size-(p->offset-p2->offset); //temp
InitLTPartition(p,unlock);
bd->max_blk=p->offset+p->size-1;
}
break;
}
if (bd->flags & LTBDF_READ_CACHE)
InvalidateDiskCache(p,unlock);
bd->flags=bd->flags & ~LTBDF_INIT_IN_PROGRESS;
result=TRUE;
}
Preempt(old_preempt);
return result;
}
BoolU8 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock)
{
BoolU4 result=TRUE;
LTBlkDev *bdev=p->bdev;
CheckLTPartition(p);
try {
LockPartition(p);
InitBlkDev(bdev,FALSE);
if ((p->offset && blk<p->offset) || blk+cnt>p->offset+p->size)
throw(EXCEPT_PARTITION,3);
blk+=bdev->offset;
if (bdev->flags & LTBDF_READ_CACHE)
RCache(p,&buf,&blk,&cnt);
if (cnt) {
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(bdev->read_freq);
result=p->RBlks(p,buf,blk,cnt);
bdev->last_jiffy=Jiffies;
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(0);
if (bdev->flags & LTBDF_READ_CACHE)
LTDCAdd(p,buf,blk,cnt);
if (bdev->type!=LTBDT_RAM)
disk_reads+=cnt;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return result;
}
BoolU8 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock)
{
BoolU4 result;
LTBlkDev *bdev=p->bdev;
CheckLTPartition(p);
try {
LockPartition(p);
InitBlkDev(bdev,FALSE);
if ((bdev->flags & LTBDF_READ_ONLY) &&
!(bdev->flags & LTBDF_READ_ONLY_OVERRIDE))
throw(EXCEPT_BLKDEV,0);
if ((p->offset && blk<p->offset) || blk+cnt>p->offset+p->size)
throw(EXCEPT_PARTITION,4);
blk+=bdev->offset;
if (cnt) {
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(bdev->write_freq);
result=p->WBlks(p,buf,blk,cnt);
bdev->last_jiffy=Jiffies;
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(0);
if (bdev->flags & LTBDF_READ_CACHE)
LTDCAdd(p,buf,blk,cnt);
if (bdev->type!=LTBDT_RAM)
disk_writes+=cnt;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return result;
}
void InvalidateDiskCache(LTPartition *p,BoolU4 unlock)
{
LTBlkDev *bdev=p->bdev;
CheckLTPartition(p);
try {
LockPartition(p);
InitBlkDev(bdev,FALSE);
if (bdev->flags & LTBDF_READ_CACHE)
LTDCInvalidate(p);
if (bdev->type==LTBDT_FDC)
InitLTPartition(p,FALSE);
else if (p->type==PT_ISO9660) {
if (!(bdev->flags & LTBDF_READ_ONLY_OVERRIDE))
InitISOPartition(p,FALSE);
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
}
void ChangeDisk(I1 drive_letter=0)
{
LTBlkDev *bdev=DriveToBlkDev(drive_letter);
if (!InitBlkDev(bdev,TRUE) && bdev->flags & LTBDF_REMOVABLE)
InvalidateDiskCache(DriveToPartition(drive_letter),TRUE);
Drive(drive_letter); //TODO: might preempt off
FreeLTFreeList(DriveToPartition(drive_letter),TRUE);
}
void PartitionRep()
{
I8 i;
I1 ch;
U2 u2;
U1 u1;
LTPartition *p;
LTBlkDev *bdev;
coutln "\r\nDefined Partitions:\r\n";
for (i=0;i<32;i++) {
p=&local_partitions[i];
bdev=p->bdev;
if (p->type) {
cout "$$FG,PURPLE$$";
if (p==default_partition)
cout "*";
else
cout " ";
ch=PartitionToDrive(p);
cout ch," ";
if (p->type==PT_LT)
cout "LT ";
else if (p->type==PT_FAT12)
cout "FAT12 ";
else if (p->type==PT_FAT32)
cout "FAT32 ";
else if (p->type==PT_ISO9660)
cout "ISO9660";
else
cout "-------";
cout " ",SysTextSub(bdev->type,"ST_BLKDEV_TYPES")," ";
u2=bdev->base0; cout u2," ";
u1=bdev->irq; cout u1," ";
u1=bdev->unit; coutln u1,"$$FG$$";
coutln p->offset,"-",p->offset+p->size-1;
}
}
}
void ReleaseTaskPartitions()
{
I8 i;
LTPartition *p;
for (i=0;i<32;i++) {
p=&local_partitions[i];
if (p->owning_task==Fs) {
UnlockPartition(p,TRUE);
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(0);
}
}
}
U8 NextClusterNum(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock)
{
CheckLTPartition(p);
if (!cnt || !c) return c;
try {
LockPartition(p);
if (p->type==PT_ISO9660 || p->type==PT_LT)
c+=cnt;
else
c=INVALID_CLUSTER;
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return c;
}
U8 ClusterBlk(LTPartition *p,U8 c)
{
CheckLTPartition(p);
return p->data+c*p->spc;
}
U8 RClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE)
{
nounusedwarn update_display;
CheckLTPartition(p);
if (!cnt) return c;
try {
LockPartition(p);
if (p->type==PT_ISO9660 || p->type==PT_LT) {
RBlks(p,buf,p->data+c*p->spc,p->spc*cnt,FALSE);
c+=cnt;
} else {
while (cnt && c && c!=INVALID_CLUSTER) {
RBlks(p,buf,p->data+c*p->spc,p->spc,FALSE);
buf+=p->spc<<BLK_SIZE_BITS;
c=NextClusterNum(p,c,1,FALSE);
cnt--;
}
if (cnt)
Debugger;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return c;
}
BoolU8 ToLTFilename(I1 *dst,I1 *src)
{
MemSet(dst,0,LT_MAX_FILENAME_LEN+1);
if (!CheckFileName(src))
return FALSE;
StrCpy(dst,src);
return TRUE;
}
U8 NameToDirCluster(LTPartition *p,I1 *name,BoolU4 unlock)
{
BoolU4 cont=TRUE;
U8 cur_dir_cluster;
LTDirEntry de;
I1 *buf=NewStr(name),*buf2=NewStr(name);
CheckLTPartition(p);
try {
LockPartition(p);
cur_dir_cluster=p->root_cluster;
while (*buf && cont) {
RemoveFirstSeg(buf,"/",buf2);
if (*buf2) {
if (p->type==PT_LT)
cont=FindLTFile(p,cur_dir_cluster,
buf2,&de,TRUE,FALSE,FALSE);
else if (p->type==PT_ISO9660)
cont=FindISOFile(p,cur_dir_cluster,
buf2,&de,TRUE,FALSE,FALSE);
else cont=FALSE;
cur_dir_cluster=de.cluster;
}
}
if (!cont) {
cout name," ";
PutSysTextErr("ST_FILE_NOT_FOUND");
cur_dir_cluster=0;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
Free(buf);
Free(buf2);
return cur_dir_cluster;
}
U8 NameToParentDirCluster(LTPartition *p,I1 *name,BoolU4 unlock)
{
BoolU4 cont=TRUE;
U8 cur_dir_cluster,cur_dir_cluster2;
LTDirEntry de;
I1 *buf=NewStr(name),*buf2=NewStr(name);
CheckLTPartition(p);
try {
LockPartition(p);
cur_dir_cluster=p->root_cluster;
cur_dir_cluster2=p->root_cluster;
while (*buf && cont) {
cur_dir_cluster2=cur_dir_cluster;
RemoveFirstSeg(buf,"/",buf2);
if (*buf2) {
if (p->type==PT_LT)
cont=FindLTFile(p,cur_dir_cluster,
buf2,&de,TRUE,FALSE,FALSE);
else if (p->type==PT_ISO9660)
cont=FindISOFile(p,cur_dir_cluster,
buf2,&de,TRUE,FALSE,FALSE);
else cont=FALSE;
cur_dir_cluster=de.cluster;
}
}
if (!cont) {
cout name," ";
PutSysTextErr("ST_FILE_NOT_FOUND");
cur_dir_cluster2=0;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
Free(buf);
Free(buf2);
return cur_dir_cluster2;
}
U8 WClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE)
{
nounusedwarn update_display;
CheckLTPartition(p);
try {
LockPartition(p);
if (p->type==PT_LT) {
WBlks(p,buf,p->data+c*p->spc,p->spc*cnt,FALSE);
c=0;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return c;
}
//c=0 means first cluster in chain
U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock)
{
nounusedwarn contiguous;
if (!cnt)
return c;
CheckLTPartition(p);
if (p->type==PT_LT)
return AllocLTClusters(p,cnt,unlock);
}
+400
View File
@@ -0,0 +1,400 @@
void MapDrive(I1 ch,LTPartition *p)
{
drive_to_partition[ToUpper(ch)-'A']=p;
p->drive=ToUpper(ch);
}
BoolU8 Drive(I1 drive_letter)
{
LTPartition *p;
LTBlkDev *bdev;
BoolU4 different=FALSE;
LTPartition *new_partition=DriveToPartition(drive_letter);
if (!new_partition) {
PutSysTextErr("ST_INVALID_DRIVE");
return FALSE;
}
if (new_partition!=Fs->cur_partition) {
different=TRUE;
Fs->cur_partition=new_partition;
}
p=Fs->cur_partition;
CheckLTPartition(p);
bdev=p->bdev;
CheckLTBlkDev(bdev);
if (different) {
if ((bdev->flags & LTBDF_REMOVABLE) &&
!(bdev->flags & LTBDF_INITIALIZED) )
ChangeDisk(p->drive);
if (bdev->type==LTBDT_RAM ||
bdev->type==LTBDT_NON_LT_FILE ||
bdev->type==LTBDT_LT_FILE)
InitBlkDev(bdev,TRUE);
}
Free(Fs->cur_dir);
Fs->cur_dir=NewStr("/");
if (p->type==PT_ISO9660 || p->type==PT_LT)
return TRUE;
else
return FALSE;
}
BoolU8 Cd(I1 *name,BoolU4 make_dirs=FALSE)
{
I8 maxlen;
BoolU4 result=TRUE;
I1 *change_to_buf,*new_cur_dir,*buf,*hdir;
LTPartition *p;
U8 cur_dir_cluster=0;
if (!*name) return TRUE;
if (name[1]==':') {
if (*name==':') {
if (Fs->cur_partition!=default_partition)
if (!Drive(*name)) return FALSE;
} else {
if (Fs->cur_partition!=
DriveToPartition(*name))
if (!Drive(*name)) return FALSE;
}
name+=2;
}
if (*name=='/' || !*name) {
Free(Fs->cur_dir);
Fs->cur_dir=NewStr("/");
if (*name)
name++;
}
change_to_buf=MStrUtil(name,
SU_REMOVE_LEADING|SU_REMOVE_TRAILING|
SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS);
maxlen=StrLen(Fs->cur_dir)+1+StrLen(change_to_buf)+1;
new_cur_dir=MAlloc(maxlen);
buf=MAlloc(maxlen);
StrCpy(new_cur_dir,Fs->cur_dir);
while (*change_to_buf && result) {
RemoveFirstSeg(change_to_buf,"/",buf);
if (!*buf)
StrCpy(new_cur_dir,"/");
else if (!StrCmp(buf,"..")) {
RemoveLastSeg(new_cur_dir,"/");
if (!*new_cur_dir)
StrCpy(new_cur_dir,"/");
} else if (!StrCmp(buf,".")) {
;
} else if (*buf) {
if (!StrCmp(buf,"HOME")) {
hdir=HomeDirStr;
result=Cd(hdir);
Free(new_cur_dir);
new_cur_dir=MAlloc(maxlen+StrLen(hdir));
StrCpy(new_cur_dir,hdir+2);
Free(hdir);
} else {
p=Fs->cur_partition;
cur_dir_cluster=NameToDirCluster(p,new_cur_dir,TRUE);
if (p->type==PT_LT)
result=CdLT(buf,cur_dir_cluster);
else if (p->type==PT_ISO9660)
result=CdISO(buf,cur_dir_cluster);
else result=FALSE;
if (!result && make_dirs) {
Free(Fs->cur_dir);
Fs->cur_dir=NewStr(new_cur_dir);
result=MkDir(buf);
}
if (result) {
if (StrCmp(new_cur_dir,"/"))
StrCat(new_cur_dir,"/");
StrCat(new_cur_dir,buf);
}
}
}
}
Free(Fs->cur_dir);
Fs->cur_dir=NewStr(new_cur_dir);
Free(buf);
Free(change_to_buf);
Free(new_cur_dir);
return result;
}
void DelLTFileAccess(LTFileAccess *fa)
{
LTBlkDev *bdev;
if (!fa) return;
bdev=fa->old_partition->bdev;
if (!(bdev->flags & LTBDF_INIT_IN_PROGRESS)) {
if (fa->old_dir) {
Drive(PartitionToDrive(fa->old_partition));
Cd(fa->old_dir);
}
} else {
Fs->cur_partition=fa->old_partition;
Free(Fs->cur_dir);
Fs->cur_dir=NewStr("/");
}
Free(fa->old_dir);
Free(fa->mask);
Free(fa);
}
LTFileAccess *NewLTFileAccess(I1 *mask,BoolU4 make_mask=FALSE,BoolU4 make_dirs=FALSE)
{
BoolU4 valid=TRUE;
I1 *buf,*my_mask,*temp_mask;
BoolU4 old_silent;
LTFileAccess *fa=MAllocZ(sizeof(LTFileAccess));
my_mask=MStrUtil(mask,
SU_REMOVE_LEADING|SU_REMOVE_TRAILING|
SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS);
temp_mask=my_mask;
fa->old_dir=NewStr(Fs->cur_dir);
fa->old_partition=Fs->cur_partition;
if (*my_mask && my_mask[1]==':') {
if (Fs->cur_partition!=DriveToPartition(*my_mask))
if (!Drive(*my_mask)) valid=FALSE;
my_mask+=2;
}
if (StrStr(my_mask,"HOME")) { //TODO
if (Fs->cur_partition!=DriveToPartition(':'))
Drive(':');
}
fa->p=Fs->cur_partition;
CheckLTPartition(fa->p);
buf=MAlloc(StrLen(my_mask)+2);
StrCpy(buf,my_mask);
fa->mask=MAlloc(StrLen(my_mask)+2);
RemoveLastSeg(buf,"/",fa->mask);
if (*my_mask=='/' && !*buf)
StrCpy(buf,"/");
if (*buf)
if (!Cd(buf,make_dirs))
valid=FALSE;
if (valid && make_mask) {
if (!*fa->mask) {
Free(fa->mask);
fa->mask=NewStr("*");
} else {
if (!make_dirs || CheckFileName(fa->mask)) {
old_silent=Silent(ON);
if (Cd(fa->mask,make_dirs)) {
Free(fa->mask);
fa->mask=NewStr("*");
}
Silent(old_silent);
}
}
}
Free(buf);
Free(temp_mask);
if (!valid) {
DelLTFileAccess(fa);
fa=NULL;
// throw(EXCEPT_FILE);
}
return fa;
}
LTDirEntry *FindFiles(I1 *wild,U8 fuf_flags=0)
{
LTDirEntry *result=NULL;
LTFileAccess *fa=NewLTFileAccess(wild,TRUE);
if (fa) {
result=SysFindFiles(fa->mask,fuf_flags);
DelLTFileAccess(fa);
}
return result;
}
BoolU8 IsDir(I1 *dir_name)
{
BoolU4 result=FALSE;
I1 *mask=MSPrintF("%s/*",dir_name);
BoolU4 old_silent=Silent(ON);
LTFileAccess *fa=NewLTFileAccess(mask);
if (fa) {
result=TRUE;
DelLTFileAccess(fa);
}
Free(mask);
Silent(old_silent);
return result;
}
void Dir(I1 *wild=NULL,BoolU4 full=FALSE)
{
I1 *w;
LTFileAccess *fa;
if (!wild)
w=NewStr("*"); //We must do this because of bug that prevents str defaults
else
w=NewStr(wild);
fa=NewLTFileAccess(w,TRUE);
if (fa) {
DirLT(fa->mask,full);
DelLTFileAccess(fa);
}
Free(w);
}
void Del(I1 *wild,BoolU4 print_msg=TRUE)
{
LTFileAccess *fa=NewLTFileAccess(wild);
if (fa) {
if (fa->p->type==PT_LT)
DelLTFiles(fa->p,Fs->cur_dir,fa->mask,FALSE,print_msg);
DelLTFileAccess(fa);
}
}
U1 *ReadFile(I1 *filename,U8 *size=NULL,U8 *attr=NULL,BoolU4 raw=FALSE)
{
SysHashEntry *temph;
I1 *absname;
U1 *result=NULL;
U8 size2=0,attr2=0;
LTFileAccess *fa;
ArcCompressStruct *ac=NULL;
if (attr)
*attr=0;
absname=AbsoluteFileName(filename);
if (!raw && (temph=FindHashEntry(absname,adam_tss->hash_table,HTT_FILE))) {
if (FileAttr(absname) & LT_ATTR_COMPRESSED) {
ac=temph->user_data0;
if (size)
*size=ac->expanded_size;
if (attr)
*attr=FileAttr(absname,*attr);
result=ExpandBuf(ac);
} else { //Not implimented
result=MAlloc(temph->user_data1+1);
MemCpy(result,temph->user_data0,temph->user_data1);
result[temph->user_data1]=0; //Terminate
if (size)
*size=temph->user_data1;
}
} else {
fa=NewLTFileAccess(absname);
if (fa) {
if (fa->p->type==PT_LT)
result=ReadLTFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac);
else if (fa->p->type==PT_ISO9660)
result=ReadISOFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac);
while (!result && StrCmp(Fs->cur_dir,"/")) {
Cd("..");
if (Fs->cur_partition->type==PT_LT)
result=ReadLTFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac);
else if (fa->p->type==PT_ISO9660)
result=ReadISOFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac);
}
if (!result) {
cout filename," ";
PutSysTextErr("ST_FILE_NOT_FOUND");
}
DelLTFileAccess(fa);
}
if (size)
*size=size2;
if (attr)
*attr=attr2;
if (!raw && attr2 & LT_ATTR_RESIDENT) {
temph=AMAllocZ(sizeof(SysHashEntry));
temph->str=ANewStr(absname);
temph->type=HTT_FILE;
temph->use_cnt=0;
temph->source_link=NULL;
temph->user_data0=AMAllocIdentical(ac);
temph->user_data1=size2;
AddSysHashEntry(temph,adam_tss->hash_table);
}
Free(ac);
}
Free(absname);
return result;
}
I1 *ReadTextFile(I1 *filename,U8 *attr=NULL)
{
return ReadFile(filename,NULL,attr);
}
BoolU8 FindFile(I1 *filename,LTDirEntry *rde=NULL,
BoolU4 dir_only=FALSE,BoolU4 file_only=FALSE,BoolU4 scan_parents=FALSE)
{
U8 cur_dir_cluster;
BoolU4 result=FALSE;
LTDirEntry de;
LTFileAccess *fa=NewLTFileAccess(filename);
if (fa) {
cur_dir_cluster=NameToDirCluster(fa->p,Fs->cur_dir,TRUE);
if (fa->p->type==PT_LT)
result=FindLTFile(fa->p,cur_dir_cluster,fa->mask,
&de,dir_only,file_only,TRUE);
else if (fa->p->type==PT_ISO9660)
result=FindISOFile(fa->p,cur_dir_cluster,fa->mask,
&de,dir_only,file_only,TRUE);
if (scan_parents) {
while (!result && StrCmp(Fs->cur_dir,"/")) {
Cd("..");
cur_dir_cluster=NameToDirCluster(fa->p,Fs->cur_dir,TRUE);
if (fa->p->type==PT_LT)
result=FindLTFile(fa->p,cur_dir_cluster,fa->mask,
&de,dir_only,file_only,TRUE);
else if (fa->p->type==PT_ISO9660)
result=FindISOFile(fa->p,cur_dir_cluster,fa->mask,
&de,dir_only,file_only,TRUE);
}
}
DelLTFileAccess(fa);
}
if (result && rde)
MemCpy(rde,&de,sizeof(LTDirEntry));
return result;
}
U8 WriteFile(I1 *filename,U1 *fbuf,
U8 size,LTDate LTdatetime=0,U8 attr=0,BoolU4 raw=FALSE)
{
U8 c=0;
SysHashEntry *temph;
LTFileAccess *fa=NewLTFileAccess(filename);
ArcCompressStruct *ac=NULL;
I1 *absname=AbsoluteFileName(filename);
if (fa) {
if (fa->p->type==PT_LT)
c=WriteLTFile(fa->p,Fs->cur_dir,fa->mask,
fbuf,size,LTdatetime,attr,raw,&ac);
if (temph=FindHashEntry(absname,adam_tss->hash_table,HTT_FILE)) {
AFree(temph->user_data0);
if (!raw && ac && attr & LT_ATTR_RESIDENT) {
temph->user_data0=AMAllocIdentical(ac);
temph->user_data1=size;
} else {
temph->user_data0=0;
temph->type=HTT_INVALID;
}
} else if (!raw && ac && attr & LT_ATTR_RESIDENT) {
temph=AMAllocZ(sizeof(SysHashEntry));
temph->str=ANewStr(absname);
temph->type=HTT_FILE;
temph->use_cnt=0;
temph->source_link=NULL;
temph->user_data0=AMAllocIdentical(ac);
temph->user_data1=size;
AddSysHashEntry(temph,adam_tss->hash_table);
}
Free(ac);
DelLTFileAccess(fa);
}
Free(absname);
return c;
}
void WriteTextFile(I1 *filename,I1 *st,U8 attr=0)
{
WriteFile(filename,st,StrLen(st),0,attr);
}
+338
View File
@@ -0,0 +1,338 @@
void SelectDefaultDrive()
{
default_partition=DriveToPartition(default_drive);
Fs->cur_partition=INVALID_PTR; //Null screws-up cache
Fs->cur_dir=NewStr("/");
ChangeDisk(':');
}
BoolU8 CopySingleZ(I1 *f1,I1 *f2) //Just one file
{
U1 *file_buf=NULL;
U8 size,attr=0;
LTDirEntry de;
if (FindFile(f1,&de,FALSE,TRUE)) {
file_buf=ReadFile(f1,&size,&attr);
attr=FileAttr(f2,attr);
if (file_buf) {
coutln "Copying ",f1," to ",f2;
WriteFile(f2,file_buf,size,de.datetime,attr);
Free(file_buf);
return TRUE;
} else PutSysTextErr("ST_FILE_NOT_FOUND");
} else PutSysTextErr("ST_FILE_NOT_FOUND");
return FALSE;
}
#define COPY_BUF_BLKS 0x400
BoolU8 CopySingle(I1 *f1,I1 *f2) //Just one file
{
U1 *buf;
U8 cnt,n,size,attr1=FileAttr(f1),attr2=FileAttr(f2);
LTFile *in_file=NULL,*out_file=NULL;
U8 xsum=LT_XSUM,i,j;
if (!StrCmp(f1,f2))
return FALSE;
if (attr1!=attr2)
return CopySingleZ(f1,f2);
buf=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
if (attr1 & LT_ATTR_CONTIGUOUS)
in_file=FOpen(f1,"rc");
else
in_file=FOpen(f1,"r");
if (in_file) {
size=FSize(in_file);
cnt=(size+BLK_SIZE-1)>>BLK_SIZE_BITS;
if (attr2 & LT_ATTR_CONTIGUOUS)
out_file=FOpen(f2,"wc",cnt);
else
out_file=FOpen(f2,"w",cnt);
if (out_file) {
coutln "Copying ",f1," to ",f2;
j=size;
while (cnt) {
if (cnt>COPY_BUF_BLKS) {
n=COPY_BUF_BLKS;
i=n<<BLK_SIZE_BITS;
} else {
n=cnt;
i=j;
}
FRBlks(in_file, buf,LTFB_NEXT_BLK,n);
xsum^=ArcCheckSum(buf,i);
FWBlks(out_file,buf,LTFB_NEXT_BLK,n);
cnt-=n;
j-=n<<BLK_SIZE_BITS;
}
if (in_file->de.xsum &&
in_file->de.xsum!=xsum)
throw(EXCEPT_ARC_XSUM);
out_file->de.xsum=xsum;
out_file->flags|=LTF_USE_OLD_DATETIME;
out_file->de.datetime=in_file->de.datetime;
out_file->de.size=size;
out_file->de.expanded_size=in_file->de.expanded_size;
out_file->de.attr=FileAttr(f2,in_file->de.attr);
FClose(out_file);
FClose(in_file);
Free(buf);
return TRUE;
} else PutSysTextErr("ST_FILE_NOT_FOUND");
FClose(in_file);
} else PutSysTextErr("ST_FILE_NOT_FOUND");
Free(buf);
return FALSE;
}
BoolU8 MkDir(I1 *filename)
{
U8 c,size,cur_dir_cluster;
U1 *buf;
BoolU4 result=FALSE;
LTDirEntry *dLT;
I1 *name;
if (FindFile(filename,NULL,TRUE))
return FALSE;
LTFileAccess *fa=NewLTFileAccess(filename);
if (fa) {
if (*fa->mask) {
if (!CheckFileName(fa->mask))
PutSysTextErr("ST_INVALID_FILENAME");
else {
coutln "Make Directory:",filename;
name=MStrUtil(fa->mask,
SU_REMOVE_LEADING|SU_REMOVE_TRAILING|
SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS);
size=fa->p->spc<<BLK_SIZE_BITS;
buf=MAllocZ(size);
cur_dir_cluster=NameToDirCluster(fa->p,Fs->cur_dir,TRUE);
if (fa->p->type==PT_LT) {
dLT=buf-offset(LTDirEntry.start);
c=WriteFile(name,buf,size,0,LT_ATTR_DIR,FALSE);
dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS;
StrCpy(dLT->name,name);
dLT->cluster=c;
dLT->size=size;
dLT->expanded_size=size;
dLT->datetime=GetCurTimeLTDate;
dLT+=LT_DIR_ENTRY_SIZE;
dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS;
dLT->name[0]='.';
dLT->name[1]='.';
dLT->name[2]=0;
dLT->cluster=cur_dir_cluster;
dLT->size=0;
dLT->expanded_size=0;
dLT->datetime=GetCurTimeLTDate;
}
WClusters(fa->p,buf,c,1,TRUE);
Free(buf);
Free(name);
result=TRUE;
}
}
DelLTFileAccess(fa);
}
return result;
}
void SysDel(I1 *wild,BoolU4 make_mask) //this is dangerous
{
LTFileAccess *fa=NewLTFileAccess(wild,make_mask);
if (fa) {
if (fa->p->type==PT_LT)
DelLTFiles(fa->p,Fs->cur_dir,fa->mask,TRUE);
DelLTFileAccess(fa);
}
}
void Format(I8 drive_letter,BoolU4 quick=TRUE,BoolU4 confirm=TRUE,U8 type=PT_LT)
{
LTPartition *p=DriveToPartition(drive_letter);
if (confirm) {
if (!AreYouSure)
return;
}
if (!p) {
PutSysTextErr("ST_INVALID_DRIVE");
return;
}
if (type==PT_LT) {
Drive(drive_letter);
FormatLT(drive_letter,quick);
InvalidateDiskCache(DriveToPartition(drive_letter),TRUE);
Drive(drive_letter);
}
}
void ReadCDImage(I1 drive,I1 *out_name)
{
LTBlkDev *bdev=DriveToBlkDev(drive);
LTPartition *p=DriveToPartition(drive);
U1 *buf=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
I1 *out_name2=DefaultExtension(out_name,"ISO");
LTFile *f=FOpen(out_name2,"w");
U8 n,dv,blk=0,cnt;
InitBlkDev(bdev,TRUE);
if (bdev->type!=LTBDT_ATAPI)
throw(EXCEPT_BLKDEV,3);
if (!out_name)
out_name=default_iso_name;
dv=bdev->blk_size>>BLK_SIZE_BITS;
cnt=((p->size+dv-1)/dv)*dv;
while (cnt) {
if (cnt>COPY_BUF_BLKS)
n=COPY_BUF_BLKS;
else
n=cnt;
if (n>bdev->max_reads)
n=bdev->max_reads;
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(bdev->read_freq);
ATAPIReadBlks2(bdev,buf,blk/dv,n/dv);
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(0);
FWBlks(f,buf,blk,n);
cnt-=n;
blk+=n;
disk_reads+=n;
}
FClose(f);
Free(buf);
Free(out_name2);
}
class LTDuelBuf
{
U1 *buf0,*buf1;
U8 in_buf,out_buf,cnt;
I1 *filename;
LTBlkDev *CD_bdev;
};
void WriteCDImageTsk()
{
LTDuelBuf *d=Fs->user_data0;
U1 *buf;
U8 n,blk=0,cnt=d->cnt;
LTFile *f;
Preempt(ON);
InitLocalTask; //needed for disk access
if (FileAttr(d->filename)&LT_ATTR_CONTIGUOUS)
f=FOpen(d->filename,"rc");
else
f=FOpen(d->filename,"r");
while (cnt) {
if (cnt>COPY_BUF_BLKS)
n=COPY_BUF_BLKS;
else
n=cnt;
if (n>d->CD_bdev->max_writes)
n=d->CD_bdev->max_writes;
buf=(d->in_buf & 1) ? d->buf1:d->buf0;
while (d->in_buf>d->out_buf+1)
SwapInNext;
FRBlks(f,buf,blk,n);
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(d->CD_bdev->write_freq);
d->in_buf++;
cnt-=n;
blk+=n;
}
FClose(f);
}
void WriteCDImage(I1 drive,I1 *in_name)
{
LTDuelBuf *d=MAllocZ(sizeof(LTDuelBuf));
U1 *buf;
I1 *in_name2,*in_name3;
U8 n,dv,blk=0,cnt;
LTPartition *p=DriveToPartition(drive);
LTBlkDev *bdev=p->bdev,*bdev2;
TssStruct *tss;
BoolU4 old_preempt;
LTFile *f;
if (!in_name)
in_name=default_iso_name;
in_name3=DefaultExtension(in_name,"ISO");
in_name2=AbsoluteFileName(in_name3);
f=FOpen(in_name2,"r");
if (!f) {
Free(d);
return;
}
cnt=(FSize(f)+BLK_SIZE-1)>>BLK_SIZE_BITS;
FClose(f);
if (bdev->type!=LTBDT_ATAPI)
throw(EXCEPT_BLKDEV,4);
bdev2=DriveToBlkDev(*in_name2);
if (bdev->irq==bdev2->irq) {
coutln "Cannot Burn CD on same IDE controller as File.\r\n";
throw(EXCEPT_BLKDEV,5);
}
bdev->flags|=LTBDF_READ_ONLY_OVERRIDE;
InitBlkDev(bdev,TRUE);
dv=bdev->blk_size>>BLK_SIZE_BITS;
if (p->size<cnt)
p->size=cnt;
d->filename=in_name2;
d->CD_bdev=bdev;
d->buf0=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
d->buf1=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
d->cnt=cnt;
old_preempt=Preempt(OFF);
tss=Spawn(&WriteCDImageTsk,"WRITE CD");
tss->user_data0=d;
while (d->in_buf<=d->out_buf)
SwapInNext;
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(bdev->write_freq);
IDEWaitForDrive(bdev);
ATAPIWaitReady(bdev);
while (cnt) {
if (cnt>COPY_BUF_BLKS)
n=COPY_BUF_BLKS;
else
n=cnt;
if (n>bdev->max_writes)
n=bdev->max_writes;
buf=(d->out_buf&1) ? d->buf1:d->buf0;
while (d->in_buf<=d->out_buf)
SwapInNext;
ATAPIWriteBlks(bdev,buf,blk/dv,(n+dv-1)/dv);
d->out_buf++;
cnt-=n;
blk+=n;
disk_writes+=n;
}
ATAPISync(bdev);
ATAPIClose(bdev);
if (!Bt(&sys_semas[SYS_SEMA_NO_IO_SOUND],0))
Sound(0);
bdev->flags&=~LTBDF_READ_ONLY_OVERRIDE;
LBtr(&sema_irq_busy[bdev->irq],0);
Free(d->buf0);
Free(d->buf1);
Free(d);
Free(in_name2);
Free(in_name3);
Preempt(old_preempt);
}
+129 -431
View File
@@ -1,339 +1,3 @@
BoolU4 RAMRBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt)
{
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
MemCpy(buf,bdev->RAM_disk+blk*BLK_SIZE,cnt*BLK_SIZE);
return TRUE;
}
BoolU4 RAMWBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt)
{
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
MemCpy(bdev->RAM_disk+blk*BLK_SIZE,buf,cnt*BLK_SIZE);
return TRUE;
}
BoolU4 FileRBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt)
{
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
if (!bdev->f)
throw(EXCEPT_PARTITION,5);
if (!FRBlks(bdev->f,buf,blk,cnt))
throw(EXCEPT_PARTITION,6);
FSync(bdev->f);
return TRUE;
}
BoolU4 FileWBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt)
{
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
if (!bdev->f)
throw(EXCEPT_PARTITION,7);
if (!FWBlks(bdev->f,buf,blk,cnt))
throw(EXCEPT_PARTITION,8);
FSync(bdev->f);
return TRUE;
}
#define FDC_p0 0
#define FDC_p1 1
#define FDC_DOR 2
#define FDC_p3 3
#define FDC_STATUS 4
#define FDC_DATA 5
#define FDC_DIR 7
#define FDC_DCR 7
void Irq06Handler()
{
Bts(&sys_irq_flags,6);
}
void FDCFlushStatus(LTBlkDev *bdev)
{
U1 b;
I8 i;
MemSet(bdev->status,0,32);
i=0;
while (i<32) {
b=InP(bdev->base0+FDC_STATUS);
if (b & 0x80) {
if (b & 0x40)
bdev->status[i++]=InP(bdev->base0+FDC_DATA);
else
break;
}
SwapInNext;
}
if (i==32)
throw(EXCEPT_FDC,2);
bdev->status[0]=bdev->status[0] & 0xC8; //clear non-error bits
bdev->last_jiffy=jiffies;
}
void FDCWaitIrq(LTBlkDev *bdev)
{
BoolU4 old_flags=GetFlags;
Sti;
while (!Btr(&sys_irq_flags,bdev->irq)) {
/*
if (!(InP(bdev->base0+FDC_p0) & 0x80)) //Pending IRQ?
throw(EXCEPT_FDC,1);
*/
SwapInNext;
}
SetFlags(old_flags);
FDCFlushStatus(bdev);
}
void FDCSendCmdU1(LTBlkDev *bdev,U1 v)
{
FDCFlushStatus(bdev);
OutP(bdev->base0+FDC_DATA,v);
}
void FDCSeek(LTBlkDev *bdev,U1 cyl, U1 head)
{
FDCSendCmdU1(bdev,0x0F);
FDCSendCmdU1(bdev,head<<2);
FDCSendCmdU1(bdev,cyl);
FDCWaitIrq(bdev);
}
void FDCFree(LTBlkDev *bdev)
{
Btr(&sys_irq_busy_flags,bdev->irq);
}
void MonitorFDCTsk()
{
LTBlkDev *bdev;
Preempt(OFF);
bdev=Fs->user_aux0;
CheckLTBlkDev(bdev);
while (TRUE) {
if (!Bts(&sys_irq_busy_flags,bdev->irq)) {
if (bdev->last_jiffy) {
if (jiffies > bdev->last_jiffy+JIFFY_FREQ<<1) {
FDCSeek(bdev,0,0);
FDCSeek(bdev,0,1);
OutP(bdev->base0+FDC_DOR,0x00);
bdev->last_jiffy=0;
}
}
FDCFree(bdev);
}
SwapInNext;
}
}
void FDCGet(LTBlkDev *bdev)
{
CheckLTBlkDev(bdev);
while (Bts(&sys_irq_busy_flags,bdev->irq))
SwapInNext;
Btr(&sys_irq_flags,bdev->irq);
if (!bdev->last_jiffy) {
bdev->last_jiffy=jiffies;
OutP(bdev->base0+FDC_DOR,0x00);
BusyWait(100);
OutP(bdev->base0+FDC_DOR,0x1C); //Motor ON
FDCWaitIrq(bdev);
OutP(bdev->base0+FDC_DCR,0x00); //step,Load, Unload specs
FDCSendCmdU1(bdev,0x03);
FDCSendCmdU1(bdev,0xCF);
FDCSendCmdU1(bdev,0x10);
FDCWaitIrq(bdev);
FDCSendCmdU1(bdev,0x07); //Recalibrate
FDCSendCmdU1(bdev,0x00);
FDCWaitIrq(bdev);
}
}
void FDCReset(LTBlkDev *bdev)
{
CheckLTBlkDev(bdev);
OutP(0x0A,0x42); //Shut down old DMA
OutP(0x09,0x02);
bdev->last_jiffy=0;
Btr(&sys_irq_busy_flags,bdev->irq);
FDCGet(bdev);
}
BoolU4 FDCReadTrack(LTBlkDev *bdev,U1 cyl, U1 head,U8 blk)
{
I8 i;
U8 size=BLK_SIZE*FDC_DISK_SECTORS-1;
BoolU4 old_preempt=Preempt(OFF);
CheckLTBlkDev(bdev);
for (i=0;i<FDC_retries;i++) {
FDCSeek(bdev,cyl,head);
OutP(0x0A,0x42); //Shut down old DMA
OutP(0x09,0x02);
OutP(0x08,0x00); //ctrl
OutP(0x0B,0x56); //mode Read
OutP(0x0C,0);
OutP(0x04,FDC_DMA_BUF & 0xFF); //addr
OutP(0x04,(FDC_DMA_BUF>>8) & 0xFF);
OutP(0x81,FDC_DMA_BUF>>16); //set page
OutP(0x0C,0);
OutP(0x05,size.u1[0]); //cnt
OutP(0x05,size.u1[1]);
OutP(0x0A,0x02); //Start new DMA
OutP(0x09,0x06);
FDCSendCmdU1(bdev,0x62);
FDCSendCmdU1(bdev,head<<2);
FDCSendCmdU1(bdev,cyl);
FDCSendCmdU1(bdev,head);
FDCSendCmdU1(bdev,1); //sector
FDCSendCmdU1(bdev,BLK_SIZE>>8);
FDCSendCmdU1(bdev,FDC_DISK_SECTORS); //last sec
FDCSendCmdU1(bdev,0x1B); //gap
FDCSendCmdU1(bdev,0xFF);
FDCWaitIrq(bdev);
if (bdev->status[0] || bdev->status[1] ||
bdev->status[2]) {
coutln "FDC Read Error:",bdev->status[2],bdev->status[1],bdev->status[0];
FDCReset(bdev);
} else {
Preempt(old_preempt);
return TRUE;
}
}
coutln "FDC Read Failed!!! Blk:",blk;
Preempt(old_preempt);
return FALSE;
}
BoolU4 FDCRBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
{
LTCacheBlk *tempc;
BoolU4 okay=TRUE;
U8 l,blk2;
U1 cyl,head,sec;
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
while (cnt>0) {
if (bdev->flags & LTBDF_READ_CACHE) {
while (cnt) {
tempc=LTDCFindBlk(p,blk); //TODO preempt
if (tempc) {
MemCpy(buf,&tempc->body,BLK_SIZE);
cnt--;
buf+=BLK_SIZE;
blk++;
} else
break;
}
}
if (cnt) {
l=cnt;
if (l>bdev->max_reads)
l=bdev->max_reads;
blk2=blk;
sec=blk2%FDC_DISK_SECTORS+1;blk2=blk2/FDC_DISK_SECTORS;
head=blk2%FDC_DRIVE_HEADS;
cyl=blk2/FDC_DRIVE_HEADS;
if (!FDCReadTrack(bdev,cyl,head,blk-(sec-1)))
okay=FALSE;
MemCpy(buf,FDC_DMA_BUF+BLK_SIZE*(sec-1),l*BLK_SIZE);
if (bdev->flags & LTBDF_READ_CACHE)
LTDCAdd(DriveToPartition(bdev->partition_base),
FDC_DMA_BUF,blk-(sec-1),FDC_DISK_SECTORS);
buf+=l*BLK_SIZE;
blk+=l;
cnt-=l;
disk_status_display.u2[0]=disk_status_display.u2[0]-l;
}
}
return okay;
}
BoolU4 FDCWriteBlk2(LTBlkDev *bdev,U1 *buf, U1 cyl, U1 head,U1 sec,U8 blk)
{
I8 i;
U8 size=BLK_SIZE*bdev->max_writes-1;
BoolU4 old_preempt;
old_preempt=Preempt(OFF);
for (i=0;i<FDC_retries;i++) { //Retry up to 10 times
FDCSeek(bdev,cyl,head);
MemCpy(FDC_DMA_BUF,buf,size+1);
OutP(0x0A,0x42); //Shut down old DMA
OutP(0x09,0x02);
OutP(0x08,0x00); //ctrl
OutP(0x0B,0x5A); //mode Write
OutP(0x0C,0);
OutP(0x04,FDC_DMA_BUF & 0xFF); //addr
OutP(0x04,(FDC_DMA_BUF>>8) & 0xFF);
OutP(0x81,FDC_DMA_BUF>>16); //set page
OutP(0x0C,0);
OutP(0x05,size.u1[0]); //cnt
OutP(0x05,size.u1[1]);
OutP(0x0A,0x02); //Start new DMA
OutP(0x09,0x06);
FDCSendCmdU1(bdev,0xC5);
FDCSendCmdU1(bdev,head<<2);
FDCSendCmdU1(bdev,cyl);
FDCSendCmdU1(bdev,head);
FDCSendCmdU1(bdev,sec);
FDCSendCmdU1(bdev,BLK_SIZE>>8);
FDCSendCmdU1(bdev,FDC_DISK_SECTORS); //last sec
FDCSendCmdU1(bdev,0x1B); //gap
FDCSendCmdU1(bdev,0xFF);
FDCWaitIrq(bdev);
if (bdev->status[2] || bdev->status[1] ||
bdev->status[0]) {
coutln "FDC Write Error:",bdev->status[0],bdev->status[1],bdev->status[2];
FDCReset(bdev);
} else {
Preempt(old_preempt);
return TRUE;
}
}
coutln "FDC Write Failed!!! Blk:",blk;
Preempt(old_preempt);
return FALSE;
}
BoolU4 FDCWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
{
BoolU4 okay=TRUE;
U8 l,blk2;
U1 cyl,head,sec;
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
while (cnt>0) {
l=cnt;
if (l>bdev->max_writes)
l=bdev->max_writes;
blk2=blk;
sec=blk2%FDC_DISK_SECTORS+1;blk2=blk2/FDC_DISK_SECTORS;
head=blk2%FDC_DRIVE_HEADS;
cyl=blk2/FDC_DRIVE_HEADS;
if (!FDCWriteBlk2(bdev,buf,cyl,head,sec,blk))
okay=FALSE;
buf+=l*BLK_SIZE;
blk+=l;
cnt-=l;
disk_status_display.u2[0]=disk_status_display.u2[0]-l;
}
return okay;
}
//The following definitions were copied from Linux source code
/* ATA/ATAPI Cmds pre T13 Spec */
@@ -419,7 +83,6 @@ BoolU4 FDCWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
#define WRERR_STAT 0x20
#define READY_STAT 0x40
#define BUSY_STAT 0x80
; /*here for compiler bug*/
#define BAD_R_STAT (BUSY_STAT | ERR_STAT)
#define BAD_W_STAT (BAD_R_STAT | WRERR_STAT)
#define BAD_STAT (BAD_R_STAT | DRQ_STAT)
@@ -437,14 +100,19 @@ BoolU4 FDCWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
#define IDE_CMD 7
#define IDE_CONTROL_REG 0
void Irq0BHandler()
{
// LBts(&sema_irqs[11],0);
}
void Irq0EHandler()
{
Bts(&sys_irq_flags,14);
// LBts(&sema_irqs[14],0);
}
void Irq0FHandler()
{
Bts(&sys_irq_flags,15);
// LBts(&sema_irqs[15],0);
}
void ATASelectBlk28(LTBlkDev *bdev,U8 blk,U8 cnt)
@@ -457,22 +125,30 @@ void ATASelectBlk28(LTBlkDev *bdev,U8 blk,U8 cnt)
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4|blk.u1[3]);
}
/*************
U8 ATAGetBlkNum28(LTBlkDev *bdev)
{
U8 result=0;
result.u1[0]=InP(bdev->base0+IDE_SECTOR_REG);
result.u1[1]=InP(bdev->base0+IDE_LCYL_REG);
result.u1[2]=InP(bdev->base0+IDE_HCYL_REG);
result.u1[3]=InP(bdev->base0+IDE_SELECT_REG) & 0xF;
return result;
}
void ATASelectBlk48(LTBlkDev *bdev,U8 blk,U8 cnt)
{//Untested
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
OutP(bdev->base0+IDE_NSECTOR_REG,cnt.u1[1]);
OutP(bdev->base0+IDE_SECTOR_REG,blk_lo.u1[3]);
OutP(bdev->base0+IDE_LCYL_REG,blk_hi);
OutP(bdev->base0+IDE_HCYL_REG,blk_hi.u1[1]);
OutP(bdev->base0+IDE_SECTOR_REG,blk.u1[3]);
OutP(bdev->base0+IDE_LCYL_REG,blk.u1[4]);
OutP(bdev->base0+IDE_HCYL_REG,blk.u1[5]);
OutP(bdev->base0+IDE_NSECTOR_REG,cnt);
OutP(bdev->base0+IDE_SECTOR_REG,blk_lo);
OutP(bdev->base0+IDE_LCYL_REG,blk_lo.u1[1]);
OutP(bdev->base0+IDE_HCYL_REG,blk_lo.u1[2]);
OutP(bdev->base0+IDE_SECTOR_REG,blk);
OutP(bdev->base0+IDE_LCYL_REG,blk.u1[1]);
OutP(bdev->base0+IDE_HCYL_REG,blk.u1[2]);
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
}
***************/
void IDEWaitNotBusy(LTBlkDev *bdev)
{
@@ -492,7 +168,7 @@ void ATACmd(LTBlkDev *bdev,U1 cmd)
{
OutP(bdev->base0+IDE_FEATURE_REG,0);
OutP(bdev->base0+IDE_CMD,cmd);
bdev->last_jiffy=jiffies;
bdev->last_jiffy=Jiffies;
}
/*******
@@ -509,14 +185,14 @@ void ATAPIWritePktWord(LTBlkDev *bdev,U2 w)
while (!(InP(bdev->base0+IDE_STATUS)&DATA_READY))
SwapInNext;
OutPW(bdev->base0+IDE_DATA_REG,w.u1[1]+256*w.u1[0]);
bdev->last_jiffy=jiffies;
bdev->last_jiffy=Jiffies;
}
void IDEWaitForDrive(LTBlkDev *bdev)
{
while (Bts(&sys_irq_busy_flags,bdev->irq))
while (LBts(&sema_irq_busy[bdev->irq],0))
SwapInNext;
Btr(&sys_irq_flags,bdev->irq);
LBtr(&sema_irqs[bdev->irq],0);
}
/********
@@ -524,12 +200,29 @@ void IDEWaitForIrq(LTBlkDev *bdev)
{
BoolU4 old_flags=GetFlags;
Sti;
while (!Btr(&sys_irq_flags,bdev->irq))
while (!LBtr(&sema_irqs[bdev->irq],0))
SwapInNext;
SetFlags(old_flags);
}
*********/
void ATAPISetMaxSpeed(LTBlkDev *bdev)
{
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size);
OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]);
ATACmd(bdev,WIN_PACKETCMD);
ATAPIWritePktWord(bdev,0xBB00); //Set speed
ATAPIWritePktWord(bdev,0xFFFF); //read at max
ATAPIWritePktWord(bdev,0xFFFF); //write at max
ATAPIWritePktWord(bdev,0);
ATAPIWritePktWord(bdev,0);
ATAPIWritePktWord(bdev,0);
IDEWaitNotBusy(bdev);
}
void ATAPISeek(LTBlkDev *bdev,U8 blk)
{
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
@@ -564,38 +257,33 @@ void ATAPIStartStop(LTBlkDev *bdev,BoolU4 start)
void IDEInit(LTBlkDev *bdev,BoolU4 unlock)
{
U8 blk=0x0F000000; //TODO:fix this?
BoolU4 old_preempt=Preempt(OFF);
CheckLTBlkDev(bdev);
if (unlock) {
Btr(&sys_irq_busy_flags,bdev->irq);
if (unlock)
IDEWaitForDrive(bdev);
}
// not using irqs
// Btr(&sys_irq_flags,bdev->irq);
LBtr(&sema_irqs[bdev->irq],0);
if (!(bdev->flags & LTBDF_HAS_BEEN_RESET)) {
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
ATACmd(bdev,WIN_DEV_RESET);
IDEWaitNotBusy(bdev);
bdev->flags=bdev->flags | LTBDF_HAS_BEEN_RESET;
}
if (bdev->type==LTBDT_ATA) {
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
ATACmd(bdev,WIN_READ_NATIVE_MAX);
IDEWaitNotBusy(bdev);
//TODO:do this right
ATASelectBlk28(bdev,blk,0);
ATACmd(bdev,WIN_SET_MAX);
IDEWaitNotBusy(bdev);
} else {
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
ATACmd(bdev,WIN_READ_NATIVE_MAX);
IDEWaitNotBusy(bdev);
bdev->max_blk=ATAGetBlkNum28(bdev);
ATASelectBlk28(bdev,bdev->max_blk,0);
ATACmd(bdev,WIN_SET_MAX);
IDEWaitNotBusy(bdev);
if (bdev->type==LTBDT_ATAPI) {
ATAPIStartStop(bdev,TRUE);
ATAPISeek(bdev,0);
ATAPISetMaxSpeed(bdev);
}
Btr(&sys_irq_flags,bdev->irq);
LBtr(&sema_irqs[bdev->irq],0);
if (unlock)
Btr(&sys_irq_busy_flags,bdev->irq);
Preempt(old_preempt);
LBtr(&sema_irq_busy[bdev->irq],0);
}
/**********
@@ -622,7 +310,7 @@ void ATAPIWaitReady(LTBlkDev *bdev)
ATANop(bdev);
if (InP(bdev->base0+IDE_STATUS) & READY_STAT) {
if (!bdev->last_jiffy || pass>16 ||
(jiffies>bdev->last_jiffy+JIFFY_FREQ<<1)) {
(Jiffies>bdev->last_jiffy+JIFFY_FREQ<<1)) {
ATAPIStartStop(bdev,TRUE);
}
cont=FALSE;
@@ -639,56 +327,68 @@ void ATAReadBlks2(LTBlkDev *bdev,U1 *buf, U8 cnt)
{
U8 U2s_avail,sectors_avail;
while (cnt) {
while (InP(bdev->base0+IDE_STATUS) & DATA_READY!=DATA_READY)
while (!(InP(bdev->base0+IDE_STATUS) & DATA_READY))
SwapInNext;
// while (!(sectors_avail=cnt-InP(bdev->base0+IDE_NSECTOR_REG)))
// SwapInNext;
sectors_avail=1;
U2s_avail=sectors_avail*BLK_SIZE>>1;
U2s_avail=sectors_avail<<BLK_SIZE_BITS>>1;
RepInSW(buf,U2s_avail,bdev->base0+IDE_DATA_REG);
buf+=U2s_avail<<1;
cnt-=sectors_avail;
}
IDEWaitNotBusy(bdev);
Btr(&sys_irq_flags,bdev->irq);
LBtr(&sema_irqs[bdev->irq],0);
}
/***********
void ATAReadBlksExt(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
{// Untested
BoolU4 old_preempt=Preempt(OFF);
IDEWaitForDrive(bdev);
ATASelectBlk48(bdev,blk,0,cnt);
ATACmd(bdev,WIN_MULTREAD_EXT);
ATAReadBlks2(bdev,buf,cnt);
Btr(&sys_irq_busy_flags,bdev->irq);
Preempt(old_preempt);
LBtr(&sema_irq_busy[bdev->irq],0);
}
*************/
void ATAReadBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
{
BoolU4 old_preempt=Preempt(OFF);
IDEWaitForDrive(bdev);
while ((InP(bdev->base0+IDE_STATUS) & DATA_READY))
SwapInNext;
ATASelectBlk28(bdev,blk,cnt);
ATACmd(bdev,WIN_MULTREAD);
ATAReadBlks2(bdev,buf,cnt);
Btr(&sys_irq_busy_flags,bdev->irq);
Preempt(old_preempt);
LBtr(&sema_irq_busy[bdev->irq],0);
}
I8 IDEProbe(I8 base0,I8 base1,I8 unit)
{
nounusedwarn base1;
I8 timeout=0;
OutP(base0+IDE_SELECT_REG,0xE0|unit<<4);
OutP(base0+IDE_CMD,WIN_NOP);
while (InP(base0+IDE_STATUS) & BUSY_STAT) {
if (timeout++>5000)
return LTBDT_NULL;
PortNop;
}
if (timeout)
return LTBDT_ATA;
else
return LTBDT_NULL;
}
void ATAPIReadBlks2(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
{
U8 U2s_avail;
U1 *done_add=buf+cnt*bdev->blk_size;
BoolU4 old_preempt=Preempt(OFF);
if (!cnt)
return;
IDEWaitForDrive(bdev);
while ((InP(bdev->base0+IDE_STATUS) & DATA_READY))
SwapInNext;
ATAPIWaitReady(bdev);
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
@@ -713,16 +413,15 @@ void ATAPIReadBlks2(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
}
IDEWaitNotBusy(bdev);
// ATAPIStartStop(bdev,FALSE);
Btr(&sys_irq_busy_flags,bdev->irq);
Preempt(old_preempt);
LBtr(&sema_irq_busy[bdev->irq],0);
}
void ATAPIReadBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
{
LTPartition *p=DriveToPartition(bdev->partition_base);
U8 dv=bdev->blk_size/BLK_SIZE,l,blk2,
U8 dv=bdev->blk_size>>BLK_SIZE_BITS,n,blk2,
l2=bdev->max_reads<<1+dv<<1;
U1 *cd_buf=MAlloc(BLK_SIZE*l2);
U1 *cd_buf=MAlloc(l2<<BLK_SIZE_BITS);
if (cnt) {
if (blk<=bdev->max_reads)
blk2=0;
@@ -730,32 +429,31 @@ void ATAPIReadBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
blk2=((blk-bdev->max_reads)/dv)*dv;
if (blk2+l2>p->size)
l2=p->size-blk2;
l=(l2+dv-1)/dv;
ATAPIReadBlks2(bdev,cd_buf,blk2/dv,l);
n=(l2+dv-1)/dv;
ATAPIReadBlks2(bdev,cd_buf,blk2/dv,n);
if (bdev->flags & LTBDF_READ_CACHE)
LTDCAdd(p,cd_buf,blk2,l*dv);
MemCpy(buf,cd_buf+(blk-blk2)*BLK_SIZE,cnt*BLK_SIZE);
LTDCAdd(p,cd_buf,blk2,n*dv);
MemCpy(buf,cd_buf+(blk-blk2)<<BLK_SIZE_BITS,cnt<<BLK_SIZE_BITS);
}
Free(cd_buf);
}
void IDERBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
{
U8 l;
U8 n;
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
while (cnt>0) {
l=cnt;
if (l>bdev->max_reads)
l=bdev->max_reads;
n=cnt;
if (n>bdev->max_reads)
n=bdev->max_reads;
if (bdev->type==LTBDT_ATAPI)
ATAPIReadBlks(bdev,buf,blk,l);
ATAPIReadBlks(bdev,buf,blk,n);
else
ATAReadBlks(bdev,buf,blk,l);
buf+=l*BLK_SIZE;
blk+=l;
cnt-=l;
disk_status_display.u2[0]=disk_status_display.u2[0]-l;
ATAReadBlks(bdev,buf,blk,n);
buf+=n<<BLK_SIZE_BITS;
blk+=n;
cnt-=n;
}
}
@@ -763,30 +461,33 @@ void IDERBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
//Call WBlks() instead
void ATAWriteBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
{
U8 U2s_avail,sectors_avail;
BoolU4 old_preempt=Preempt(OFF);
U8 i,U2s_avail,sectors_avail;
IDEWaitForDrive(bdev);
ATASelectBlk28(bdev,blk,cnt);
ATACmd(bdev,WIN_MULTWRITE);
while (cnt) {
while (InP(bdev->base0+IDE_STATUS) & DRIVE_READY!=DRIVE_READY)
SwapInNext;
while (InP(bdev->base0+IDE_STATUS) & DATA_READY!=DATA_READY)
SwapInNext;
do {
i=InP(bdev->base0+IDE_STATUS);
if (i & DRIVE_READY!=DRIVE_READY ||
!(i & DATA_READY)) {
SwapInNext;
} else
break;
} while (TRUE);
//TODO
sectors_avail=1;
U2s_avail=sectors_avail*BLK_SIZE>>1;
U2s_avail=sectors_avail<<BLK_SIZE_BITS>>1;
RepOutSW(buf,U2s_avail,bdev->base0+IDE_DATA_REG);
buf+=U2s_avail<<1;
cnt-=sectors_avail;
}
IDEWaitNotBusy(bdev);
Btr(&sys_irq_busy_flags,bdev->irq);
Preempt(old_preempt);
LBtr(&sema_irq_busy[bdev->irq],0);
}
void ATAPISync(LTBlkDev *bdev)
{
IDEWaitNotBusy(bdev);
OutP(bdev->base1+IDE_CONTROL_REG,0x8);
OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4);
OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size);
@@ -821,7 +522,7 @@ void ATAPIWriteBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
{
U8 U2s_avail;
U1 *buf2;
IDEWaitNotBusy(bdev);
ATAPISeek(bdev,blk);
OutP(bdev->base0+IDE_FEATURE_REG,0);
@@ -852,9 +553,7 @@ void ATAPIWriteBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
ATAPIWritePktWord(bdev,0x0000);
buf2=buf+bdev->blk_size*cnt;
while (buf<buf2) {
while (InP(bdev->base0+IDE_STATUS) & DRIVE_READY!=DRIVE_READY)
SwapInNext;
while (InP(bdev->base0+IDE_STATUS) & DATA_READY!=DATA_READY)
while (!(InP(bdev->base0+IDE_STATUS) & DATA_READY))
SwapInNext;
U2s_avail=(InP(bdev->base0+IDE_HCYL_REG)<<8+InP(bdev->base0+IDE_LCYL_REG))>>1;
if (buf+U2s_avail<<1>buf2)
@@ -864,38 +563,37 @@ void ATAPIWriteBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt)
buf+=U2s_avail<<1;
}
}
IDEWaitNotBusy(bdev);
}
//TODO: needs to be fixed so it does more than one blk at
//a time when it calls ATAWriteBlks.
void IDEWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
{
U8 l,dv;
U8 n,dv;
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
dv=bdev->blk_size/BLK_SIZE;
dv=bdev->blk_size>>BLK_SIZE_BITS;
if (bdev->type==LTBDT_ATAPI) {
IDEWaitForDrive(bdev);
ATAPIWaitReady(bdev);
}
while (cnt>0) {
l=cnt;
if (l>bdev->max_writes)
l=bdev->max_writes;
n=cnt;
if (n>bdev->max_writes)
n=bdev->max_writes;
if (bdev->type==LTBDT_ATAPI)
ATAPIWriteBlks(bdev,buf,blk/dv,(l+dv-1)/dv);
ATAPIWriteBlks(bdev,buf,blk/dv,(n+dv-1)/dv);
else
ATAWriteBlks(bdev,buf,blk,l);
buf+=l*BLK_SIZE;
blk+=l;
cnt-=l;
disk_status_display.u2[0]=disk_status_display.u2[0]-l;
ATAWriteBlks(bdev,buf,blk,n);
buf+=n<<BLK_SIZE_BITS;
blk+=n;
cnt-=n;
}
if (bdev->type==LTBDT_ATAPI) {
ATAPISync(bdev);
// ATAPIStartStop(bdev,FALSE);
Btr(&sys_irq_busy_flags,bdev->irq);
LBtr(&sema_irq_busy[bdev->irq],0);
}
}
+500
View File
@@ -0,0 +1,500 @@
U8 AddBlkDev(LTBlkDev *bd,BoolU4 one_partition)
{
I8 i,j,ext_base,num_partition;
U8 offset;
LTPartition *p;
I1 *drname;
LTBootStruct br;
MasterBootStruct mbr;
bd->ch_L='L';
bd->ch_B='B';
bd->ch_D='D';
num_partition=bd->partition_base-'A';
p=&local_partitions[num_partition];
MemSet(p,0,sizeof(LTPartition));
p->drive=num_partition+'A';
p->ch_L='L';
p->ch_P='P';
p->ch_E='E';
p->bdev=bd;
p->size=bd->max_blk+1;
j=(sys_boot_code.u1[1]==0xE0) ? 0:1;
switch (sys_boot_code.u1[0]) {
case BOOT_CODE_CDROM:
if (sys_boot_code.u2[1]==bd->base0 && j==bd->unit)
boot_blkdev=bd;
break;
case BOOT_CODE_HARDDRIVE:
if (sys_boot_code.u2[1]==bd->base0 && j==bd->unit)
boot_blkdev=bd;
break;
}
if (boot_blkdev==bd)
bd->flags|=LTBDF_HAS_BEEN_RESET;
switch (bd->type) {
case LTBDT_FDC:
p->type=PT_LT;
p->RBlks=&FDCRBlks;
p->WBlks=&FDCWBlks;
num_partition++;
break;
case LTBDT_RAM:
p->type=PT_LT;
p->RBlks=&RAMRBlks;
p->WBlks=&RAMWBlks;
num_partition++;
break;
case LTBDT_ATA:
InitBlkDev(bd,TRUE);
offset=0;
ext_base=INVALID_CLUSTER;
if (one_partition) {
p->type=PT_LT;
p->RBlks=&IDERBlks;
p->WBlks=&IDEWBlks;
p->size=bd->max_blk+1;
num_partition++;
//The following read is a test read.
//if it hangs, the drive is not supported.
ATAReadBlks(bd,&mbr,offset,1);
break;
}
while (TRUE) {
ATAReadBlks(bd,&mbr,offset,1);
if (mbr.signature!=0xAA55)
break;
j=-1;
for (i=0;i<4;i++) {
if (mbr.p[i].type!=0) {
p=&local_partitions[num_partition];
MemSet(p,0,sizeof(LTPartition));
p->drive=num_partition+'A';
p->ch_L='L';
p->ch_P='P';
p->ch_E='E';
p->bdev=bd;
p->RBlks=&IDERBlks;
p->WBlks=&IDEWBlks;
p->offset=mbr.p[i].offset+offset;
p->size =mbr.p[i].size;
p->type =mbr.p[i].type;
if (p->type==PT_LT)
InitLTPartition(p,TRUE);
else {
if (p->type==PT_FAT32+1) p->type=PT_FAT32;
if (p->type==PT_FAT32) {
ATAReadBlks(bd,&br,p->offset,1);
if (br.signature==PT_LT)
InitLTPartition(p,TRUE);
}
}
if (p->type==5 || p->type==0xF)
j=i;
else
num_partition++;
}
}
if (j<0)
break;
if (mbr.p[j].offset==0)
break;
if (ext_base==INVALID_CLUSTER) {
offset=mbr.p[j].offset;
ext_base=offset;
} else
offset=mbr.p[j].offset+ext_base;
}
break;
case LTBDT_ATAPI:
p->type=PT_ISO9660;
p->RBlks=&IDERBlks;
p->WBlks=&IDEWBlks;
p->size =CD_FILE_OFFSET;
num_partition++;
break;
case LTBDT_LT_FILE:
drname=ChangeExtension(bd->filename,"DVC");
bd->filename=ANewStr(drname);
Free(drname);
p->type=PT_LT;
p->RBlks=&FileRBlks;
p->WBlks=&FileWBlks;
num_partition++;
break;
case LTBDT_NON_LT_FILE:
p->type=PT_LT;
p->offset=bd->non_lt_offset;
p->RBlks=&NonLTFileRBlks;
p->WBlks=&NonLTFileWBlks;
if (bd->flags & LTBDF_FORMAT)
p->size=bd->max_blk-bd->min_blk+1;
num_partition++;
break;
}
return num_partition-(bd->partition_base-'A');
}
void HintATA()
{
void *base_PCI=0xF0000000;
void *base;
U4 *dd,d1,d2;
U1 *bb,d3;
U2 *ww;
base=base_PCI+0xF9000;
ww=base;
if (*ww==0x8086) {
dd=base+0x10;
d1=*dd;
dd=base+0x14;
d2=*dd;
bb=base+0x3C;
d3=*bb;
if (d1&1 && d2&1) {
if (IDEProbe(d1&-8,d2&-4,0))
coutln "$$FG,PURPLE$$Primary IDE$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3," Unit 0";
if (IDEProbe(d1&-8,d2&-4,1))
coutln "$$FG,PURPLE$$Primary IDE$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3," Unit 1";
}
dd=base+0x18;
d1=*dd;
dd=base+0x1C;
d2=*dd;
if (d1&1 && d2&1) {
if (IDEProbe(d1&-8,d2&-4,0))
coutln "$$FG,PURPLE$$Secondary IDE$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3," Unit 0";
if (IDEProbe(d1&-8,d2&-4,1))
coutln "$$FG,PURPLE$$Secondary IDE$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3," Unit 1";
}
} else {
d1=0x1F0;
d2=0x3F6;
d3=14;
if (IDEProbe(d1,d2,0))
coutln "$$FG,PURPLE$$Primary IDE$$FG$$\r\nBase0: 0x",d1,"\r\nBase1: 0x",d2,"\r\nIrq: 0x",d3," Unit 0";
if (IDEProbe(d1,d2,1))
coutln "$$FG,PURPLE$$Primary IDE$$FG$$\r\nBase0: 0x",d1,"\r\nBase1: 0x",d2,"\r\nIrq: 0x",d3," Unit 1";
d1=0x170;
d2=0x376;
d3=15;
if (IDEProbe(d1,d2,0))
coutln "$$FG,PURPLE$$Secondary IDE$$FG$$\r\nBase0: 0x",d1,"\r\nBase1: 0x",d2,"\r\nIrq: 0x",d3," Unit 0";
if (IDEProbe(d1,d2,1))
coutln "$$FG,PURPLE$$Secondary IDE$$FG$$\r\nBase0: 0x",d1,"\r\nBase1: 0x",d2,"\r\nIrq: 0x",d3," Unit 1";
}
base=base_PCI+0xFA000;
ww=base;
if (*ww==0x8086) {
dd=base+0x10;
d1=*dd;
dd=base+0x14;
d2=*dd;
bb=base+0x3C;
d3=*bb;
if (d1&1 && d2&1) {
if (IDEProbe(d1&-8,d2&-4,0))
coutln "$$FG,PURPLE$$Primary SATA$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3," Unit 0";
if (IDEProbe(d1&-8,d2&-4,1))
coutln "$$FG,PURPLE$$Primary SATA$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3," Unit 1";
}
dd=base+0x18;
d1=*dd;
dd=base+0x1C;
d2=*dd;
if (d1&1 && d2&1) {
if (IDEProbe(d1&-8,d2&-4,0))
coutln "$$FG,PURPLE$$Secondary SATA$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3,"Unit 0";
if (IDEProbe(d1&-8,d2&-4,1))
coutln "$$FG,PURPLE$$Secondary SATA$$FG$$\r\nBase0: 0x",d1&-8,"\r\nBase1: 0x",d2&-4,"\r\nIrq: 0x",d3,"Unit 1";
}
}
CrLf;
CrLf;
}
void AddDrives(BoolU4 repartition=FALSE)
{
LTBlkDev *bd;
I8 base_partition,drive_letter,type,k;
I1 buf[32],buf2[128],buf3[128],buf4[128];
BoolU4 format,add;
void my_PartitionDrive(I1 drive);
do {
PartitionRep;
PutSysText("ST_ADDDRIVES1");
base_partition=ToUpper(GetChar)-'A';
CrLf;
if (base_partition>=0 && base_partition<32) {
PutSysText("ST_ADDDRIVES2");
type=GetChar-'0';
CrLf;
k=0;
if (type==LTBDT_LT_FILE) {
PutSysText("ST_ADDDRIVES3");
GetS(buf2,128);
PutSysText("ST_ADDDRIVES4");
format=YorN;
*buf=0;
} else if (type==LTBDT_ATA || type==LTBDT_ATAPI) {
HintATA;
PutSysText("ST_ADDDRIVES12");
GetS(buf2,128);
PutSysText("ST_ADDDRIVES13");
GetS(buf3,128);
PutSysText("ST_ADDDRIVES14");
GetS(buf4,128);
PutSysText("ST_ADDDRIVES7");
k=GetChar-'0';
CrLf;
}
if (type==LTBDT_NON_LT_FILE) {
PutSysText("ST_ADDDRIVES15");
drive_letter=GetChar;
CrLf;
PutSysText("ST_ADDDRIVES16");
GetS(buf2,128);
}
if (type==LTBDT_RAM ||
type==LTBDT_LT_FILE && format) {
PutSysText("ST_ADDDRIVES5");
GetS(buf,32);
} else if (type==LTBDT_FDC) {
PutSysText("ST_ADDDRIVES7");
k=GetChar-'0';
CrLf;
}
if (type>LTBDT_NULL && type<=LTBDT_NON_LT_FILE &&
k>=0 && k<=1) {
bd=local_blkdevs+sizeof(LTBlkDev)*(num_blkdevs++);
bd->partition_base=base_partition+'A';
bd->unit=k;
if (type==LTBDT_FDC) {
bd->base0=0x3F0;
bd->irq=6;
} else if (type==LTBDT_ATA ||
type==LTBDT_ATAPI) {
bd->base0=AtoI(buf2);
bd->base1=AtoI(buf3);
bd->irq=AtoI(buf4);
}
if (type==LTBDT_FDC ||
type==LTBDT_ATAPI)
bd->flags=LTBDF_REMOVABLE;
else
bd->flags=0;
if (type!=LTBDT_RAM)
bd->flags|=LTBDF_READ_CACHE;
if (type==LTBDT_ATAPI) {
bd->blk_size=CD_BLK_SIZE;
bd->flags|=LTBDF_READ_ONLY;
} else
bd->blk_size=BLK_SIZE;
if (type==LTBDT_RAM ||
type==LTBDT_LT_FILE && format) {
bd->max_blk=AtoI(buf)-1;
if (bd->max_blk<fdc_max_sector)
bd->max_blk=fdc_max_sector;
} else if (type==LTBDT_FDC)
bd->max_blk=fdc_max_sector;
else
bd->max_blk=0xEFFFFFFF;
if (type==LTBDT_LT_FILE) {
bd->filename=ANewStr(buf2);
if (format)
bd->flags=bd->flags|LTBDF_FORMAT;
} else if (type==LTBDT_NON_LT_FILE) {
bd->non_lt_drive=drive_letter;
bd->non_lt_offset=AtoI(buf2);
}
bd->type=type;
add=TRUE;
if (type==LTBDT_ATA && repartition) {
if (my_PartitionDrive=FindExtern("PartitionDrive")) {
PutSysText("ST_ADDDRIVES11");
if (YorN) {
if (!AddBlkDev(bd,TRUE))
PutSysText("ST_FAILED");
else
my_PartitionDrive(bd->partition_base);
add=FALSE;
}
}
}
if (add) {
if (!AddBlkDev(bd,FALSE))
PutSysText("ST_FAILED");
}
} else
PutSysText("ST_FAILED");
}
} while (base_partition>=0 && base_partition<32);
}
void SetObtainedBaseUnit(LTBlkDev *bd)
{
if (sys_boot_code.u1[1]==0xE0)
bd->unit=0;
else
bd->unit=1;
if (sys_boot_code.u2[1]==0x1F0) {
bd->base0=0x1F0;
bd->base1=0x3F6;
bd->irq=14;
} else {
bd->base0=0x170;
bd->base1=0x376;
bd->irq=15;
}
}
void InitAllBlkDevs()
{
LTBlkDev *bd;
I8 i;
num_blkdevs=0;
boot_blkdev=NULL;
local_blkdevs=AMAllocZ(sizeof(LTBlkDev)<<5);
monitor_floppy_tss=NULL;
fdc_retries=2;
fdc_drive_heads=2;
fdc_disk_cylinders=80;
fdc_disk_sectors=18;
fdc_max_sector=fdc_drive_heads*fdc_disk_cylinders*fdc_disk_sectors-1;
fdc_dma_buf=0xD000;
ext[EXT_IRQ06]=&Irq06Handler;
ext[EXT_IRQ0B]=&Irq0BHandler;
ext[EXT_IRQ0E]=&Irq0EHandler;
ext[EXT_IRQ0F]=&Irq0FHandler;
local_partitions=AMAllocZ(sizeof(LTPartition)<<5);
for (i=0;i<32;i++)
drive_to_partition[i]=&local_partitions[i];
dc_col=0;
#exe {
I8 base_partition,type,drive_letter,k,n,num=0;
I1 buf[32],buf2[128],buf3[128],buf4[128];
BoolU4 format;
PutSysText("ST_ADDDRIVES0");
do {
PutSysText("ST_ADDDRIVES1");
base_partition=ToUpper(GetChar)-'A';
CrLf;
if (base_partition>=0 && base_partition<32) {
PutSysText("ST_ADDDRIVES2");
type=GetChar-'0';
CrLf;
k=0;
if (type==LTBDT_LT_FILE) {
PutSysText("ST_ADDDRIVES3");
GetS(buf2,128);
PutSysText("ST_ADDDRIVES4");
format=YorN;
*buf=0;
}
if (type==LTBDT_RAM ||
type==LTBDT_LT_FILE && format) {
PutSysText("ST_ADDDRIVES5");
GetS(buf,32);
} else if (type==LTBDT_ATA ||
type==LTBDT_ATAPI) {
HintATA;
if (type==LTBDT_ATAPI)
PutSysText("ST_ADDDRIVES12a");
PutSysText("ST_ADDDRIVES12");
GetS(buf2,128);
if (type!=LTBDT_ATAPI || *buf2) {
PutSysText("ST_ADDDRIVES13");
GetS(buf3,128);
PutSysText("ST_ADDDRIVES14");
GetS(buf4,128);
PutSysText("ST_ADDDRIVES7");
k=GetChar-'0';
CrLf;
}
}
if (type==LTBDT_NON_LT_FILE) {
PutSysText("ST_ADDDRIVES15");
drive_letter=GetChar;
CrLf;
PutSysText("ST_ADDDRIVES16");
GetS(buf2,128);
}
if (type>LTBDT_NULL && type<=LTBDT_NON_LT_FILE &&
k>=0 && k<=1) {
ExePrintF("bd=local_blkdevs+sizeof(LTBlkDev)*(num_blkdevs++);");
ExePrintF("bd->partition_base=%d;",
base_partition+'A');
ExePrintF("bd->unit=%d;",k);
if (type==LTBDT_FDC)
ExePrintF("bd->base0=0x3F0;bd->irq=6;");
else if (type==LTBDT_ATA || type==LTBDT_ATAPI) {
if (type==LTBDT_ATAPI && !*buf2)
ExePrintF("SetObtainedBaseUnit(bd);");
else
ExePrintF("bd->base0=%s;bd->base1=%s;bd->irq=%s;",
buf2,buf3,buf4);
}
if (type==LTBDT_FDC || type==LTBDT_ATAPI)
ExePrintF("bd->flags=LTBDF_REMOVABLE;");
else
ExePrintF("bd->flags=0;");
if (type!=LTBDT_RAM)
ExePrintF("bd->flags=bd->flags|LTBDF_READ_CACHE;");
if (type==LTBDT_ATAPI) {
ExePrintF("bd->blk_size=CD_BLK_SIZE;");
ExePrintF("bd->flags=bd->flags | LTBDF_READ_ONLY;");
} else
ExePrintF("bd->blk_size=BLK_SIZE;");
if (type==LTBDT_RAM ||
type==LTBDT_LT_FILE && format) {
n=AtoI(buf)-1;
if (n<fdc_max_sector)
n=fdc_max_sector;
ExePrintF("bd->max_blk=%d;",n);
} else if (type==LTBDT_FDC)
ExePrintF("bd->max_blk=fdc_max_sector;");
else
ExePrintF("bd->max_blk=0xEFFFFFFF;");
if (type==LTBDT_LT_FILE) {
ExePrintF("bd->filename=ANewStr(\"%s\");",buf2);
if (format)
ExePrintF("bd->flags=bd->flags|LTBDF_FORMAT;");
} else if (type==LTBDT_NON_LT_FILE) {
ExePrintF("bd->non_lt_drive=%d;",drive_letter);
n=AtoI(buf2);
ExePrintF("bd->non_lt_offset=%d;",n);
}
ExePrintF("bd->type=%d;",type);
ExePrintF("AddBlkDev(bd,FALSE);");
num++;
} else
PutSysText("ST_FAILED");
}
} while (num==0 || base_partition>=0 && base_partition<32);
ExePrintF("default_drive=\'%C\';",insboot_dst_drive);
}
PartitionRep;
}
Binary file not shown.
Binary file not shown.
+282
View File
@@ -0,0 +1,282 @@
#define FDC_p0 0
#define FDC_p1 1
#define FDC_DOR 2
#define FDC_p3 3
#define FDC_STATUS 4
#define FDC_DATA 5
#define FDC_DIR 7
#define FDC_DCR 7
void Irq06Handler()
{
LBts(&sema_irqs[6],0);
}
void FDCFlushStatus(LTBlkDev *bdev)
{
U1 b;
I8 i;
MemSet(bdev->status,0,32);
i=0;
while (i<32) {
b=InP(bdev->base0+FDC_STATUS);
if (b & 0x80) {
if (b & 0x40)
bdev->status[i++]=InP(bdev->base0+FDC_DATA);
else
break;
}
SwapInNext;
}
if (i==32)
throw(EXCEPT_FDC,2);
bdev->status[0]=bdev->status[0] & 0xC8; //clear non-error bits
bdev->last_jiffy=Jiffies;
}
void FDCWaitIrq(LTBlkDev *bdev)
{
BoolU4 old_flags=GetFlags;
Sti;
while (!LBtr(&sema_irqs[bdev->irq],0)) {
/*
if (!(InP(bdev->base0+FDC_p0) & 0x80)) //Pending IRQ?
throw(EXCEPT_FDC,1);
*/
SwapInNext;
}
SetFlags(old_flags);
FDCFlushStatus(bdev);
}
void FDCSendCmdU1(LTBlkDev *bdev,U1 v)
{
FDCFlushStatus(bdev);
OutP(bdev->base0+FDC_DATA,v);
}
void FDCSeek(LTBlkDev *bdev,U1 cyl, U1 head)
{
FDCSendCmdU1(bdev,0x0F);
FDCSendCmdU1(bdev,head<<2);
FDCSendCmdU1(bdev,cyl);
FDCWaitIrq(bdev);
}
void FDCFree(LTBlkDev *bdev)
{
LBtr(&sema_irq_busy[bdev->irq],0);
}
void MonitorFDCTsk()
{
LTBlkDev *bdev;
bdev=Fs->user_data0;
CheckLTBlkDev(bdev);
while (TRUE) {
if (!LBts(&sema_irq_busy[bdev->irq],0)) {
if (bdev->last_jiffy) {
if (Jiffies > bdev->last_jiffy+JIFFY_FREQ<<1) {
FDCSeek(bdev,0,0);
FDCSeek(bdev,0,1);
OutP(bdev->base0+FDC_DOR,0x00);
bdev->last_jiffy=0;
}
}
FDCFree(bdev);
}
SwapInNext;
}
}
void FDCGet(LTBlkDev *bdev)
{
CheckLTBlkDev(bdev);
while (LBts(&sema_irq_busy[bdev->irq],0))
SwapInNext;
LBtr(&sema_irqs[bdev->irq],0);
if (!bdev->last_jiffy) {
bdev->last_jiffy=Jiffies;
OutP(bdev->base0+FDC_DOR,0x00);
BusyWait(100);
OutP(bdev->base0+FDC_DOR,0x1C); //Motor ON
FDCWaitIrq(bdev);
OutP(bdev->base0+FDC_DCR,0x00); //step,Load, Unload specs
FDCSendCmdU1(bdev,0x03);
FDCSendCmdU1(bdev,0xCF);
FDCSendCmdU1(bdev,0x10);
FDCWaitIrq(bdev);
FDCSendCmdU1(bdev,0x07); //Recalibrate
FDCSendCmdU1(bdev,0x00);
FDCWaitIrq(bdev);
}
}
void FDCReset(LTBlkDev *bdev)
{
CheckLTBlkDev(bdev);
OutP(0x0A,0x42); //Shut down old DMA
OutP(0x09,0x02);
bdev->last_jiffy=0;
LBtr(&sema_irq_busy[bdev->irq],0);
FDCGet(bdev);
}
BoolU8 FDCReadTrack(LTBlkDev *bdev,U1 cyl, U1 head,U8 blk)
{
I8 i;
U8 size=fdc_disk_sectors<<BLK_SIZE_BITS-1;
CheckLTBlkDev(bdev);
for (i=0;i<fdc_retries;i++) {
FDCSeek(bdev,cyl,head);
OutP(0x0A,0x42); //Shut down old DMA
OutP(0x09,0x02);
OutP(0x08,0x00); //ctrl
OutP(0x0B,0x56); //mode Read
OutP(0x0C,0);
OutP(0x04,fdc_dma_buf & 0xFF); //addr
OutP(0x04,(fdc_dma_buf>>8) & 0xFF);
OutP(0x81,fdc_dma_buf>>16); //set page
OutP(0x0C,0);
OutP(0x05,size.u1[0]); //cnt
OutP(0x05,size.u1[1]);
OutP(0x0A,0x02); //Start new DMA
OutP(0x09,0x06);
FDCSendCmdU1(bdev,0x62);
FDCSendCmdU1(bdev,head<<2);
FDCSendCmdU1(bdev,cyl);
FDCSendCmdU1(bdev,head);
FDCSendCmdU1(bdev,1); //sector
FDCSendCmdU1(bdev,BLK_SIZE>>8);
FDCSendCmdU1(bdev,fdc_disk_sectors); //last sec
FDCSendCmdU1(bdev,0x1B); //gap
FDCSendCmdU1(bdev,0xFF);
FDCWaitIrq(bdev);
if (bdev->status[0] || bdev->status[1] ||
bdev->status[2]) {
PrintFErr("FDC Read:%X,%X,%X\r\n",bdev->status[2],bdev->status[1],bdev->status[0]);
FDCReset(bdev);
} else
return TRUE;
}
coutln "FDC Read Failed!!! Blk:",blk;
return FALSE;
}
BoolU8 FDCRBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
{
LTCacheBlk *tempc;
BoolU4 okay=TRUE;
U8 n,blk2;
U1 cyl,head,sec;
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
while (cnt>0) {
if (bdev->flags & LTBDF_READ_CACHE) {
while (cnt) {
tempc=LTDCFindBlk(p,blk); //TODO preempt
if (tempc) {
MemCpy(buf,&tempc->body,BLK_SIZE);
cnt--;
buf+=BLK_SIZE;
blk++;
} else
break;
}
}
if (cnt) {
n=cnt;
if (n>bdev->max_reads)
n=bdev->max_reads;
blk2=blk;
sec=blk2%fdc_disk_sectors+1;blk2=blk2/fdc_disk_sectors;
head=blk2%fdc_drive_heads;
cyl=blk2/fdc_drive_heads;
if (!FDCReadTrack(bdev,cyl,head,blk-(sec-1)))
okay=FALSE;
MemCpy(buf,fdc_dma_buf+(sec-1)<<BLK_SIZE_BITS,n<<BLK_SIZE_BITS);
if (bdev->flags & LTBDF_READ_CACHE)
LTDCAdd(DriveToPartition(bdev->partition_base),
fdc_dma_buf,blk-(sec-1),fdc_disk_sectors);
buf+=n<<BLK_SIZE_BITS;
blk+=n;
cnt-=n;
}
}
return okay;
}
BoolU8 FDCWriteBlk2(LTBlkDev *bdev,U1 *buf, U1 cyl, U1 head,U1 sec,U8 blk)
{
I8 i;
U8 size=bdev->max_writes<<BLK_SIZE_BITS-1;
for (i=0;i<fdc_retries;i++) { //Retry up to 10 times
FDCSeek(bdev,cyl,head);
MemCpy(fdc_dma_buf,buf,size+1);
OutP(0x0A,0x42); //Shut down old DMA
OutP(0x09,0x02);
OutP(0x08,0x00); //ctrl
OutP(0x0B,0x5A); //mode Write
OutP(0x0C,0);
OutP(0x04,fdc_dma_buf & 0xFF); //addr
OutP(0x04,(fdc_dma_buf>>8) & 0xFF);
OutP(0x81,fdc_dma_buf>>16); //set page
OutP(0x0C,0);
OutP(0x05,size.u1[0]); //cnt
OutP(0x05,size.u1[1]);
OutP(0x0A,0x02); //Start new DMA
OutP(0x09,0x06);
FDCSendCmdU1(bdev,0xC5);
FDCSendCmdU1(bdev,head<<2);
FDCSendCmdU1(bdev,cyl);
FDCSendCmdU1(bdev,head);
FDCSendCmdU1(bdev,sec);
FDCSendCmdU1(bdev,BLK_SIZE>>8);
FDCSendCmdU1(bdev,fdc_disk_sectors); //last sec
FDCSendCmdU1(bdev,0x1B); //gap
FDCSendCmdU1(bdev,0xFF);
FDCWaitIrq(bdev);
if (bdev->status[2] || bdev->status[1] ||
bdev->status[0]) {
PrintFErr("FDC Write:%X,%X,%X\r\n",bdev->status[0],bdev->status[1],bdev->status[2]);
FDCReset(bdev);
} else
return TRUE;
}
coutln "FDC Write Failed!!! Blk:",blk;
return FALSE;
}
BoolU8 FDCWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt)
{
BoolU4 okay=TRUE;
U8 n,blk2;
U1 cyl,head,sec;
LTBlkDev *bdev=p->bdev;
CheckLTBlkDev(bdev);
while (cnt>0) {
n=cnt;
if (n>bdev->max_writes)
n=bdev->max_writes;
blk2=blk;
sec=blk2%fdc_disk_sectors+1;blk2=blk2/fdc_disk_sectors;
head=blk2%fdc_drive_heads;
cyl=blk2/fdc_drive_heads;
if (!FDCWriteBlk2(bdev,buf,cyl,head,sec,blk))
okay=FALSE;
buf+=n<<BLK_SIZE_BITS;
blk+=n;
cnt-=n;
}
return okay;
}
Binary file not shown.
Binary file not shown.
+653
View File
@@ -0,0 +1,653 @@
void FreeLTFreeList(LTPartition *p,BoolU4 unlock)
{
LTFreeList *tempf,*tempf1;
try {
LockPartition(p);
if (tempf=p->next_free) {
while (tempf!=&p->next_free) {
tempf1=tempf->next;
AFree(tempf);
tempf=tempf1;
}
}
p->next_free=NULL;
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
}
void BuildLTFreeList(LTPartition *p,BoolU4 unlock)
{
LTFreeList *tempf;
U8 i,first=0,
max_cluster=(p->size+p->offset-p->data)/p->spc;
try {
LockPartition(p);
if (p->next_free)
FreeLTFreeList(p,FALSE);
p->next_free=&p->next_free;
p->last_free=&p->next_free;
while (first<max_cluster) {
i=0; //count free clusters
while (first+i<max_cluster) {
SetLTBuf(p,first+i);
if (Bt(p->cur_MAP_blk,(first+i)&(BLK_SIZE<<3-1)))
break;
else
i++;
}
if (i) {
tempf=AMAlloc(sizeof(LTFreeList));
tempf->size=i;
tempf->start=first;
InsQue(tempf,p->last_free);
}
first+=i+1;
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
}
void InitLTPartition(LTPartition *p,BoolU4 unlock)
{
LTBootStruct br;
try {
LockPartition(p);
RBlks(p,&br,p->offset,1,FALSE);
if (br.signature!=PT_LT ||
br.signature2!=0xAA55)
throw(EXCEPT_PARTITION,12);
p->type=PT_LT;
FreeLTFreeList(p,FALSE);
p->spc=br.sectors_per_cluster;
p->size=br.sectors;
p->data=p->offset+1+br.bitmap_sectors-p->spc;
p->root_cluster=br.root_cluster;
p->MAP1=p->offset+1;
p->MAP2=p->offset+1;
AllocMAPBuf(p,1);
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
}
void FormatLT(I1 drive_letter,BoolU4 quick=TRUE)
{
U1 *root_dir;
LTDirEntry *dLT;
LTBootStruct *br=MAllocZ(BLK_SIZE);
LTPartition *p=DriveToPartition(drive_letter);
U8 i,n;
try {
LockPartition(p);
// SetDriveType(drive_letter,PT_LT);
SetDriveType(drive_letter,PT_FAT32);
p->type=PT_LT;
br->U1s_per_sector=BLK_SIZE;
if (p->size<0x20000)
br->sectors_per_cluster=1;
else if (p->size<0x200000)
br->sectors_per_cluster=2;
else if (p->size<0x2000000)
br->sectors_per_cluster=4;
else if (p->size<0x20000000)
br->sectors_per_cluster=8;
else if (p->size<0x200000000)
br->sectors_per_cluster=16;
else
br->sectors_per_cluster=32;
br->signature=PT_LT;
br->signature2=0xAA55;
br->sectors=p->size;
n=br->sectors_per_cluster*(BLK_SIZE<<3);
n=(br->sectors+n-1)/n;
br->bitmap_sectors=n;
br->unique_id=BootTime;
br->root_cluster=0;
if (quick)
i=n+1;
else
i=p->size;
WZeroBlks(p,p->offset,i,FALSE);
WBlks(p,br,p->offset,1,FALSE);
InitLTPartition(p,FALSE);
AllocClusters(p,0,1,FALSE,FALSE); //Alloc #1
br->root_cluster=AllocClusters(p,0,1,FALSE,FALSE);
WBlks(p,br,p->offset,1,FALSE);
root_dir=MAllocZ(p->spc<<BLK_SIZE_BITS);
dLT=root_dir-offset(LTDirEntry.start);
dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS;
dLT->name[0]='.';
dLT->cluster=br->root_cluster;
dLT->size=p->spc<<BLK_SIZE_BITS;
dLT->expanded_size=dLT->size;
dLT->datetime=GetCurTimeLTDate;
dLT+=LT_DIR_ENTRY_SIZE;
dLT->name[0]='.';
dLT->name[1]='.';
dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS;
dLT->cluster=br->root_cluster;
dLT->datetime=GetCurTimeLTDate;
WBlks(p,root_dir,p->data+br->root_cluster*p->spc,p->spc,FALSE);
InitLTPartition(p,FALSE);
UnlockPartition(p);
} catch
UnlockPartition(p);
Free(br);
Free(root_dir);
}
BoolU8 FindLTFile(LTPartition *p,U8 cur_dir_cluster,I1 *name,LTDirEntry *result,
BoolU4 dir_only,BoolU4 file_only,BoolU4 unlock)
{
BoolU4 res=FALSE;
LTDirEntry *buf,*buf2,*ptr;
I1 dname[LT_MAX_FILENAME_LEN+1];
BoolU4 cont2=FALSE;
U1 ch;
MemSet(result,0,sizeof(LTDirEntry));
CheckLTPartition(p);
if (p->type!=PT_LT)
PutSysTextErr("ST_NOT_LT");
else if (!ToLTFilename(dname,name))
PutSysTextErr("ST_INVALID_FILENAME");
else {
try {
LockPartition(p);
buf2=MAlloc(p->spc<<BLK_SIZE_BITS);
RClusters(p,buf2,cur_dir_cluster,1,FALSE);
ptr=buf2-offset(LTDirEntry.start);
buf=MAlloc(ptr->size);
RClusters(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS/p->spc,FALSE);
Free(buf2);
ptr=buf-offset(LTDirEntry.start);
ptr->name[0]='.';
ptr->name[1]=0;
while (TRUE) {
ch=ptr->name[0];
if (!ch)
break;
else if (!(ptr->attr & LT_ATTR_DELETED)) {
if (dir_only && !(ptr->attr & LT_ATTR_DIR))
cont2=FALSE;
else if (file_only && ptr->attr & LT_ATTR_DIR)
cont2=FALSE;
else
cont2=TRUE;
if (cont2 && !StrCmp(dname,ptr->name)) {
MemCpy(&result->attr,&ptr->attr,LT_DIR_ENTRY_SIZE);
res=TRUE;
goto exit_this;
}
}
ptr+=LT_DIR_ENTRY_SIZE;
}
exit_this:
Free(buf);
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
}
return res;
}
U1 *ReadLTFile(LTPartition *p,I1 *cur_dir,I1 *filename,U8 *size,
U8 *attr,BoolU4 raw,ArcCompressStruct **ac2)
{
U1 *buf=NULL;
LTDirEntry de;
U8 c,cluster_size=p->spc<<BLK_SIZE_BITS,cluster_cnt;
ArcCompressStruct *ac;
U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE);
CheckLTPartition(p);
if (size)
*size=0;
if (ac2)
*ac2=NULL;
if (attr)
*attr=0;
if (p->type!=PT_LT)
PutSysTextErr("ST_NOT_LT");
else {
try {
LockPartition(p);
if (FindLTFile(p,cur_dir_cluster,filename,&de,FALSE,TRUE,FALSE)) {
if (attr)
*attr=de.attr;
cluster_cnt=(de.size+cluster_size-1)/cluster_size;
buf=MAlloc(cluster_cnt*cluster_size+1);
c=de.cluster;
c=RClusters(p,buf,c,cluster_cnt,FALSE,TRUE);
if (de.xsum) {
if ((de.xsum^ArcCheckSum(buf,de.size))!=LT_XSUM)
throw(EXCEPT_ARC_XSUM);
}
if ((FileAttr(de.name) & LT_ATTR_COMPRESSED) && !raw) {
ac=buf;
if (attr)
*attr=FileAttr(de.name,*attr);
if (size)
*size=ac->expanded_size;
if (ac2) {
*ac2=ac;
buf=ExpandBuf(ac);
} else {
buf=ExpandBuf(ac);
Free(ac);
}
} else {
buf[de.size]=0; //Terminate
if (size)
*size=de.size;
}
if (attr)
*attr=FileAttr(de.name,*attr);
}
UnlockPartition(p);
} catch
UnlockPartition(p);
}
return buf;
}
BoolU8 CdLT(I1 *name,U8 cur_dir_cluster)
{
LTDirEntry de;
if (Fs->cur_partition->type!=PT_LT)
PutSysTextErr("ST_NOT_LT");
else {
if (FindLTFile(Fs->cur_partition,cur_dir_cluster,
name,&de,TRUE,FALSE,TRUE)) {
return TRUE;
} else {
cout name," ";
PutSysTextErr("ST_FILE_NOT_FOUND");
}
}
return FALSE;
}
void FreeLTClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock)
{
LTFreeList *tempf;
BoolU4 found=FALSE;
CheckLTPartition(p);
if (!c) return;
if (p->type!=PT_LT)
PutSysTextErr("ST_NOT_LT");
else {
try {
LockPartition(p);
if (!p->next_free)
BuildLTFreeList(p,FALSE);
tempf=p->next_free;
while (!found && tempf!=&p->next_free) {
if (tempf->start+tempf->size==c) {
tempf->size+=cnt;
found=TRUE;
} else if (c+cnt==tempf->start) {
tempf->size+=cnt;
tempf->start=c;
found=TRUE;
}
tempf=tempf->next;
}
if (!found) {
tempf=AMAlloc(sizeof(LTFreeList));
tempf->size=cnt;
tempf->start=c;
InsQue(tempf,p->last_free);
}
while (cnt--) {
SetLTBuf(p,c);
Btr(p->cur_MAP_blk,c&(BLK_SIZE<<3-1));
Bts(p->buffered_MAP_dirty_bits,0);
c++;
}
CleanMAPBuf(p);
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
}
}
U8 AllocLTClusters(LTPartition *p,U8 cnt, BoolU4 unlock)
{
LTFreeList *tempf,*best_free=NULL;
U8 i,first,best_size=MAX_U8;
if (!cnt)
Debugger;
try {
LockPartition(p);
if (!p->next_free)
BuildLTFreeList(p,FALSE);
tempf=p->next_free;
while (tempf!=&p->next_free) {
if (tempf->size>=cnt && tempf->size<best_size) {
best_free=tempf;
best_size=tempf->size;
if (tempf->size==cnt)
break;
}
tempf=tempf->next;
}
if (!best_free)
Debugger;
first=best_free->start;
for (i=0;i<cnt;i++) {
SetLTBuf(p,first+i);
Bts(p->cur_MAP_blk,(first+i)&(BLK_SIZE<<3-1));
Bts(p->buffered_MAP_dirty_bits,0);
}
CleanMAPBuf(p);
if (best_free->size-=cnt)
best_free->start+=cnt;
else {
RemQue(best_free);
AFree(best_free);
}
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return first;
}
BoolU8 NewLTDirEntry2(LTPartition *p,I1 *cur_dir,LTDirEntry *de,BoolU4 free_old_chain,BoolU4 unlock)
{
LTDirEntry *buf,*buf2,*ptr,de2;
LTBootStruct *br;
U8 c,i=1,j=0,n=BLK_SIZE/LT_DIR_ENTRY_SIZE,dir_size;
BoolU4 written=FALSE;
U1 ch;
U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,unlock);
I1 *temp,*parent_dir;
try {
de->attr|=LT_ATTR_CONTIGUOUS;
LockPartition(p);
buf2=MAlloc(p->spc<<BLK_SIZE_BITS);
RClusters(p,buf2,cur_dir_cluster,1,FALSE);
ptr=buf2-offset(LTDirEntry.start);
buf=MAlloc(ptr->size);
RClusters(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS/p->spc,FALSE);
dir_size=ptr->size;
ptr=buf-offset(LTDirEntry.start)+LT_DIR_ENTRY_SIZE;
Free(buf2);
while (TRUE) {
ch=ptr->name[0];
if (!ch) {
if (!written)
MemCpy(&ptr->start,&de->start,LT_DIR_ENTRY_SIZE);
if ((i+1)*LT_DIR_ENTRY_SIZE+j<<BLK_SIZE_BITS<dir_size)
WBlks(p,buf+j<<BLK_SIZE_BITS,
p->data+cur_dir_cluster*p->spc+j,1,FALSE);
else {
buf2=MAllocZ(dir_size+p->spc<<BLK_SIZE_BITS);
MemCpy(buf2,buf,dir_size);
FreeLTClusters(p,cur_dir_cluster,
dir_size/(p->spc<<BLK_SIZE_BITS),FALSE);
dir_size+=p->spc<<BLK_SIZE_BITS;
c=AllocClusters(p,0,dir_size/(p->spc<<BLK_SIZE_BITS),TRUE,FALSE);
Free(buf);
buf=buf2;
ptr=buf-offset(LTDirEntry.start);
ptr->size=dir_size;
ptr->expanded_size=dir_size;
ptr->cluster=c;
WClusters(p,buf,c,dir_size/(p->spc<<BLK_SIZE_BITS),FALSE);
if (cur_dir_cluster==p->root_cluster) {
br=MAllocZ(BLK_SIZE);
RBlks(p,br,p->offset,1,FALSE);
br->root_cluster=c;
WBlks(p,br,p->offset,1,FALSE);
Free(br);
p->root_cluster=c;
} else {
temp=NewStr(cur_dir);
parent_dir=NewStr(cur_dir);
RemoveLastSeg(parent_dir,"/",temp);
if (!*parent_dir) {
Free(parent_dir);
parent_dir=NewStr("/");
}
if (FindLTFile(p,NameToDirCluster(p,parent_dir,FALSE),
temp,&de2,TRUE,FALSE,FALSE)) {
de2.cluster=c;
de2.size=dir_size;
de2.expanded_size=dir_size;
//TODO: is this supposed to free old chain?
NewLTDirEntry2(p,parent_dir,&de2,FALSE,FALSE);
} else
Debugger;
Free(temp);
Free(parent_dir);
}
}
break;
} else if (ptr->attr & LT_ATTR_DELETED) {
if (!written) {
MemCpy(&ptr->start,&de->start,LT_DIR_ENTRY_SIZE);
WBlks(p,buf+j<<BLK_SIZE_BITS,
p->data+cur_dir_cluster*p->spc+j,1,FALSE);
written=TRUE;
}
} else {
if (!StrCmp(de->name,ptr->name)) {
if (free_old_chain)
FreeLTClusters(p,ptr->cluster,
(ptr->size+p->spc<<BLK_SIZE_BITS-1)/(p->spc<<BLK_SIZE_BITS),FALSE);
if (!written)
MemCpy(&ptr->start,&de->start,LT_DIR_ENTRY_SIZE);
else
ptr->attr|=LT_ATTR_DELETED;
WBlks(p,buf+j<<BLK_SIZE_BITS,
p->data+cur_dir_cluster*p->spc+j,1,FALSE);
break;
}
}
ptr+=LT_DIR_ENTRY_SIZE;
if (++i>=n) {
j++;
i=0;
}
}
Free(buf);
if (unlock)
UnlockPartition(p);
} catch
if (unlock)
UnlockPartition(p);
return FALSE;
}
BoolU8 DelLTFiles(LTPartition *p,I1 *cur_dir,I1 *wild,
BoolU4 del_dir=FALSE,BoolU4 print_msg=TRUE)
{
LTDirEntry *buf,*buf2,*ptr;
U8 i=0,j=0,n=BLK_SIZE/LT_DIR_ENTRY_SIZE;
U1 ch;
U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE);
try {
LockPartition(p);
buf2=MAlloc(p->spc<<BLK_SIZE_BITS);
RClusters(p,buf2,cur_dir_cluster,1,FALSE);
ptr=buf2-offset(LTDirEntry.start);
buf=MAlloc(ptr->size);
RClusters(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS/p->spc,FALSE);
Free(buf2);
ptr=buf-offset(LTDirEntry.start);
ptr->name[0]='.';
ptr->name[1]=0;
while (TRUE) {
ch=ptr->name[0];
if (!ch)
break;
else if (!(ptr->attr & LT_ATTR_DELETED) && ch!='.' && (del_dir ||
!(ptr->attr & LT_ATTR_DIR))) {
if (WildFileNameList(wild,ptr->name)) {
if (print_msg)
coutln SysText("ST_DELETE"),ptr->name;
ptr->attr|=LT_ATTR_DELETED;
WBlks(p,buf+j<<BLK_SIZE_BITS,
p->data+cur_dir_cluster*p->spc+j,1,FALSE);
FreeLTClusters(p,ptr->cluster,
(ptr->size+p->spc<<BLK_SIZE_BITS-1)/(p->spc<<BLK_SIZE_BITS),FALSE);
}
}
ptr+=LT_DIR_ENTRY_SIZE;
if (++i>=n) {
j++;
i=0;
}
}
Free(buf);
UnlockPartition(p);
} catch
UnlockPartition(p);
return FALSE;
}
U8 WriteLTFile(LTPartition *p,I1 *cur_dir,I1 *name,U1 *buf,U8 size,
LTDate LTdatetime,U8 attr,BoolU4 raw,
ArcCompressStruct **ac2)
{
LTDirEntry de;
U8 c=0;
U8 flags=0,cluster_cnt,
cluster_size=p->spc<<BLK_SIZE_BITS;
ArcCompressStruct *ac=NULL;
BoolU4 contiguous;
U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE);
MemSet(&de,0,sizeof(LTDirEntry));
if (ac2) *ac2=NULL;
if (!LTdatetime)
LTdatetime=GetCurTimeLTDate;
if (p->type!=PT_LT)
PutSysTextErr("ST_NOT_LT");
else if (!ToLTFilename(de.name,name))
PutSysTextErr("ST_INVALID_FILENAME");
else {
DelLTFiles(p,cur_dir,de.name,FALSE,FALSE);
attr=FileAttr(name,attr);
attr|=LT_ATTR_CONTIGUOUS;
contiguous=TRUE;
de.expanded_size=size;
if ((attr & LT_ATTR_COMPRESSED) && !raw) {
ac=CompressBuf(buf,size,flags);
size=ac->compressed_size;
buf=ac;
}
de.size=size;
de.xsum=ArcCheckSum(buf,size)^LT_XSUM;
cluster_cnt=(size+cluster_size-1)/cluster_size;
if (cluster_cnt)
c=AllocClusters(p,0,cluster_cnt,contiguous,TRUE);
else
c=INVALID_CLUSTER;
de.cluster=c;
de.attr=attr;
de.datetime=LTdatetime;
if (cluster_cnt)
WClusters(p,buf,c,cluster_cnt,TRUE,TRUE);
NewLTDirEntry2(p,cur_dir,&de,TRUE,TRUE);
if (ac2)
*ac2=ac;
else
Free(ac);
}
return c;
}
LTDirEntry *FindLTFiles(I1 *wild,U8 fuf_flags,LTDirEntry *parent=NULL)
{
LTPartition *p=Fs->cur_partition;
LTDirEntry *buf,*buf2,*ptr;
U8 cur_dir_cluster=NameToDirCluster(p,Fs->cur_dir,FALSE);
U1 ch;
LTDirEntry *result=NULL,*tempm;
LockPartition(p);
buf2=MAlloc(p->spc<<BLK_SIZE_BITS);
RClusters(p,buf2,cur_dir_cluster,1,FALSE);
ptr=buf2-offset(LTDirEntry.start);
buf=MAlloc(ptr->size);
RClusters(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS/p->spc,FALSE);
Free(buf2);
ptr=buf-offset(LTDirEntry.start);
ptr->name[0]='.';
ptr->name[1]=0;
ptr+=LT_DIR_ENTRY_SIZE;
ptr->cluster=NameToParentDirCluster(p,Fs->cur_dir,FALSE);
ptr-=LT_DIR_ENTRY_SIZE;
while (TRUE) {
ch=ptr->name[0];
if (!ch)
break;
else if (!(ptr->attr & LT_ATTR_DELETED)) {
tempm=MAllocZ(sizeof(LTDirEntry));
MemCpy(&tempm->start,&ptr->start,LT_DIR_ENTRY_SIZE);
tempm->parent=parent;
if (Bt(&fuf_flags,FUf_RECURSE) && tempm->attr & LT_ATTR_DIR && tempm->name[0]!='.') {
tempm->next=result;
result=tempm;
tempm->full_name=AbsoluteDirName(tempm->name);
UnlockPartition(p);
Cd(tempm->name);
tempm->sub=FindLTFiles(wild,fuf_flags,tempm);
Cd("..");
LockPartition(p);
} else if ((!(tempm->attr & LT_ATTR_DIR) && !Bt(&fuf_flags,FUf_JUST_DIRS)
|| !Bt(&fuf_flags,FUf_RECURSE)) &&
!(Bt(&fuf_flags,FUf_RECURSE) && tempm->name[0]=='.') &&
WildFileNameList(wild,tempm->name)) {
tempm->next=result;
result=tempm;
tempm->full_name=AbsoluteFileName(tempm->name);
} else
DelLTDirEntry(tempm);
}
ptr+=LT_DIR_ENTRY_SIZE;
}
Free(buf);
UnlockPartition(p);
return result;
}
Binary file not shown.
+169
View File
@@ -0,0 +1,169 @@
U1Fifo *NewU1Fifo(U8 size,TssStruct *tss=NULL)
{
U1Fifo *f;
if (!tss) tss=Fs;
f=MAlloc(sizeof(U1Fifo),tss);
f->mem_tss=tss;
f->buf=MAlloc(size,tss);
f->mask=size-1;
f->in_ptr=0;
f->out_ptr=0;
return f;
}
void DelU1Fifo(U1Fifo *f)
{
Free(f->buf,f->mem_tss);
Free(f,f->mem_tss);
}
BoolU8 U1FifoInsert(U1Fifo *f,U1 ch)
{
U8 old_flags=GetFlags,
new_in_ptr;
Cli;
new_in_ptr=(f->in_ptr+1)&f->mask;
if (new_in_ptr==f->out_ptr) {
SetFlags(old_flags);
return FALSE;
} else {
f->buf[f->in_ptr]=ch;
f->in_ptr=new_in_ptr;
SetFlags(old_flags);
return TRUE;
}
}
BoolU8 U1FifoRemove(U1Fifo *f,U1 *ch)
{
U8 old_flags=GetFlags;
Cli;
if (f->in_ptr==f->out_ptr) {
SetFlags(old_flags);
return FALSE;
} else {
*ch=f->buf[f->out_ptr];
f->out_ptr=(f->out_ptr+1)&f->mask;
SetFlags(old_flags);
return TRUE;
}
}
BoolU8 U1FifoPeek(U1Fifo *f,U1 *ch)
{
U8 old_flags=GetFlags;
Cli;
if (f->in_ptr==f->out_ptr) {
SetFlags(old_flags);
return FALSE;
} else {
*ch=f->buf[f->out_ptr];
SetFlags(old_flags);
return TRUE;
}
}
void U1FifoFlush(U1Fifo *f)
{
U8 old_flags=GetFlags;
Cli;
f->out_ptr=f->in_ptr;
SetFlags(old_flags);
}
U8 U1FifoCnt(U1Fifo *f)
{
U8 result,old_flags=GetFlags;
Cli;
if (f->out_ptr>f->in_ptr)
result=f->mask+1-(f->out_ptr-f->in_ptr);
else
result=f->in_ptr-f->out_ptr;
SetFlags(old_flags);
return result;
}
U8Fifo *NewU8Fifo(U8 size,TssStruct *tss=NULL)
{
U8Fifo *f;
if (!tss) tss=Fs;
f=MAlloc(sizeof(U8Fifo),tss);
f->mem_tss=tss;
f->buf=MAlloc(size*sizeof(U8),tss);
f->mask=size-1;
f->in_ptr=0;
f->out_ptr=0;
return f;
}
void DelU8Fifo(U8Fifo *f)
{
Free(f->buf,f->mem_tss);
Free(f,f->mem_tss);
}
BoolU8 U8FifoInsert(U8Fifo *f,U8 d)
{
U8 old_flags=GetFlags,
new_in_ptr;
Cli;
new_in_ptr=(f->in_ptr+1)&f->mask;
if (new_in_ptr==f->out_ptr) {
SetFlags(old_flags);
return FALSE;
} else {
f->buf[f->in_ptr]=d;
f->in_ptr=new_in_ptr;
SetFlags(old_flags);
return TRUE;
}
}
BoolU8 U8FifoRemove(U8Fifo *f,U8 *d)
{
U8 old_flags=GetFlags;
Cli;
if (f->in_ptr==f->out_ptr) {
SetFlags(old_flags);
return FALSE;
} else {
*d=f->buf[f->out_ptr];
f->out_ptr=(f->out_ptr+1)&f->mask;
SetFlags(old_flags);
return TRUE;
}
}
BoolU8 U8FifoPeek(U8Fifo *f,U8 *d)
{
U8 old_flags=GetFlags;
Cli;
if (f->in_ptr==f->out_ptr) {
SetFlags(old_flags);
return FALSE;
} else {
*d=f->buf[f->out_ptr];
SetFlags(old_flags);
return TRUE;
}
}
void U8FifoFlush(U8Fifo *f)
{
U8 old_flags=GetFlags;
Cli;
f->out_ptr=f->in_ptr;
SetFlags(old_flags);
}
U8 U8FifoCnt(U8Fifo *f)
{
U8 result,old_flags=GetFlags;
Cli;
if (f->out_ptr>f->in_ptr)
result=f->mask+1-(f->out_ptr-f->in_ptr);
else
result=f->in_ptr-f->out_ptr;
SetFlags(old_flags);
return result;
}
-259
View File
@@ -1,259 +0,0 @@
//The following font came from FreeDOS
ALIGN 8,0x90
SYS_FONT_8x8::
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00; // SHIFT_SPACE
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; // SPACE
DU1 0x18,0x3c,0x3c,0x18,0x18,0x00,0x18,0x00; // !
DU1 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00; // "
DU1 0x36,0x36,0x7F,0x36,0x7F,0x36,0x36,0x00; // #
DU1 0x0C,0x3F,0x68,0x3E,0x0B,0x7E,0x18,0x00; // $$
DU1 0x60,0x66,0x0C,0x18,0x30,0x66,0x06,0x00; // %
DU1 0x38,0x6C,0x6C,0x38,0x6D,0x66,0x3B,0x00; // &
DU1 0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00; // '
DU1 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00; // (
DU1 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00; // )
DU1 0x00,0x18,0x7E,0x3C,0x7E,0x18,0x00,0x00; // *
DU1 0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00; // +
DU1 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30; // ,
DU1 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00; // -
DU1 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00; // .
DU1 0x00,0x06,0x0C,0x18,0x30,0x60,0x00,0x00; // /
DU1 0x3C,0x66,0x6E,0x7E,0x76,0x66,0x3C,0x00; // 0
DU1 0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00; // 1
DU1 0x3C,0x66,0x06,0x0C,0x18,0x30,0x7E,0x00; // 2
DU1 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00; // 3
DU1 0x0C,0x1C,0x3C,0x6C,0x7E,0x0C,0x0C,0x00; // 4
DU1 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00; // 5
DU1 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00; // 6
DU1 0x7E,0x06,0x0C,0x18,0x30,0x30,0x30,0x00; // 7
DU1 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00; // 8
DU1 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00; // 9
DU1 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00; // :
DU1 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30; // ;
DU1 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00; // <
DU1 0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00; // =
DU1 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00; // >
DU1 0x3C,0x66,0x0C,0x18,0x18,0x00,0x18,0x00; // ?
DU1 0x3C,0x66,0x6E,0x6A,0x6E,0x60,0x3C,0x00; // @
DU1 0x3C,0x66,0x66,0x7E,0x66,0x66,0x66,0x00; // A
DU1 0x7C,0x66,0x66,0x7C,0x66,0x66,0x7C,0x00; // B
DU1 0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x00; // C
DU1 0x78,0x6C,0x66,0x66,0x66,0x6C,0x78,0x00; // D
DU1 0x7E,0x60,0x60,0x7C,0x60,0x60,0x7E,0x00; // E
DU1 0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x00; // F
DU1 0x3C,0x66,0x60,0x6E,0x66,0x66,0x3C,0x00; // G
DU1 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00; // H
DU1 0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00; // I
DU1 0x3E,0x0C,0x0C,0x0C,0x0C,0x6C,0x38,0x00; // J
DU1 0x66,0x6C,0x78,0x70,0x78,0x6C,0x66,0x00; // K
DU1 0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00; // L
DU1 0x63,0x77,0x7F,0x6B,0x6B,0x63,0x63,0x00; // M
DU1 0x66,0x66,0x76,0x7E,0x6E,0x66,0x66,0x00; // N
DU1 0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00; // O
DU1 0x7C,0x66,0x66,0x7C,0x60,0x60,0x60,0x00; // P
DU1 0x3C,0x66,0x66,0x66,0x6A,0x6C,0x36,0x00; // Q
DU1 0x7C,0x66,0x66,0x7C,0x6C,0x66,0x66,0x00; // R
DU1 0x3C,0x66,0x60,0x3C,0x06,0x66,0x3C,0x00; // S
DU1 0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00; // T
DU1 0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00; // U
DU1 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00; // V
DU1 0x63,0x63,0x6B,0x6B,0x7F,0x77,0x63,0x00; // W
DU1 0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00; // X
DU1 0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00; // Y
DU1 0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00; // Z
DU1 0x7C,0x60,0x60,0x60,0x60,0x60,0x7C,0x00; // [
DU1 0x00,0x60,0x30,0x18,0x0C,0x06,0x00,0x00; // \
DU1 0x3E,0x06,0x06,0x06,0x06,0x06,0x3E,0x00; // ]
DU1 0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00; // ^
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF; // _
DU1 0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00; // ?
DU1 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3E,0x00; // a
DU1 0x60,0x60,0x7C,0x66,0x66,0x66,0x7C,0x00; // b
DU1 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00; // c
DU1 0x06,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00; // D
DU1 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00; // e
DU1 0x1C,0x30,0x30,0x7C,0x30,0x30,0x30,0x00; // f
DU1 0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x3C; // g
DU1 0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x00; // h
DU1 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00; // i
DU1 0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x70; // j
DU1 0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0x00; // k
DU1 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00; // l
DU1 0x00,0x00,0x36,0x7F,0x6B,0x6B,0x63,0x00; // m
DU1 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00; // n
DU1 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00; // o
DU1 0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0x60; // p
DU1 0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x07; // q
DU1 0x00,0x00,0x6C,0x76,0x60,0x60,0x60,0x00; // r
DU1 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00; // s
DU1 0x30,0x30,0x7C,0x30,0x30,0x30,0x1C,0x00; // t
DU1 0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x00; // u
DU1 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00; // v
DU1 0x00,0x00,0x63,0x6B,0x6B,0x7F,0x36,0x00; // w
DU1 0x00,0x00,0x66,0x3C,0x18,0x3C,0x66,0x00; // x
DU1 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x3C; // y
DU1 0x00,0x00,0x7E,0x0C,0x18,0x30,0x7E,0x00; // z
DU1 0x0C,0x18,0x18,0x70,0x18,0x18,0x0C,0x00; // {
DU1 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00; // |
DU1 0x30,0x18,0x18,0x0E,0x18,0x18,0x30,0x00; // }
DU1 0x31,0x6B,0x46,0x00,0x00,0x00,0x00,0x00; // ~
DU1 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF; // 
DU1 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24; //128
DU1 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C; //129
DU1 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00; //130
DU1 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00; //131
DU1 0x00,0x00,0x3F,0x20,0x20,0x27,0x24,0x24; //132
DU1 0x00,0x00,0x3F,0x3F,0x3F,0x3F,0x3C,0x3C; //133
DU1 0x00,0x00,0xFC,0x04,0x04,0xE4,0x24,0x24; //134
DU1 0x00,0x00,0xFC,0xFC,0xFC,0xFC,0x3C,0x3C; //135
DU1 0x24,0x24,0x27,0x20,0x20,0x3F,0x00,0x00; //136
DU1 0x3C,0x3C,0x3F,0x3F,0x3F,0x3F,0x00,0x00; //137
DU1 0x24,0x24,0xE4,0x04,0x04,0xFC,0x00,0x00; //138
DU1 0x3C,0x3C,0xFC,0xFC,0xFC,0xFC,0x00,0x00; //139
DU1 0x00,0x7E,0x7E,0x66,0x66,0x7E,0x7E,0x00; //140
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x22,0x88,0x22,0x88,0x22,0x88,0x22,0x88;
DU1 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa;
DU1 0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77;
DU1 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18;
DU1 0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18;
DU1 0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18;
DU1 0x66,0x66,0x66,0xe6,0x66,0x66,0x66,0x66;
DU1 0x00,0x00,0x00,0xfe,0x66,0x66,0x66,0x66;
DU1 0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18;
DU1 0x66,0x66,0xe6,0x06,0xe6,0x66,0x66,0x66;
DU1 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66;
DU1 0x00,0x00,0xfe,0x06,0xe6,0x66,0x66,0x66;
DU1 0x66,0x66,0xe6,0x06,0xfe,0x00,0x00,0x00;
DU1 0x66,0x66,0x66,0xfe,0x00,0x00,0x00,0x00;
DU1 0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18;
DU1 0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00;
DU1 0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18;
DU1 0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18;
DU1 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00;
DU1 0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18;
DU1 0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18;
DU1 0x66,0x66,0x66,0x67,0x66,0x66,0x66,0x66;
DU1 0x66,0x66,0x67,0x60,0x7f,0x00,0x00,0x00;
DU1 0x00,0x00,0x7f,0x60,0x67,0x66,0x66,0x66;
DU1 0x66,0x66,0xe7,0x00,0xff,0x00,0x00,0x00;
DU1 0x00,0x00,0xff,0x00,0xe7,0x66,0x66,0x66;
DU1 0x66,0x66,0x67,0x60,0x67,0x66,0x66,0x66;
DU1 0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00;
DU1 0x66,0x66,0xe7,0x00,0xe7,0x66,0x66,0x66;
DU1 0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00;
DU1 0x66,0x66,0x66,0xff,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18;
DU1 0x00,0x00,0x00,0xff,0x66,0x66,0x66,0x66;
DU1 0x66,0x66,0x66,0x7f,0x00,0x00,0x00,0x00;
DU1 0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00;
DU1 0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18;
DU1 0x00,0x00,0x00,0x7f,0x66,0x66,0x66,0x66;
DU1 0x66,0x66,0x66,0xff,0x66,0x66,0x66,0x66;
DU1 0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18;
DU1 0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18;
DU1 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff;
DU1 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff;
DU1 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0;
DU1 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f;
DU1 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
+258
View File
@@ -0,0 +1,258 @@
//Font Taken from FreeDOS
U1 sys_font_8x8[256*8]= {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x3C,0x3C,0x18,0x18,0x00,0x18,0x00,
0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00,
0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00,
0x30,0xFC,0x16,0x7C,0xD0,0x7E,0x18,0x00,
0x06,0x66,0x30,0x18,0x0C,0x66,0x60,0x00,
0x1C,0x36,0x36,0x1C,0xB6,0x66,0xDC,0x00,
0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00,
0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00,
0x00,0x18,0x7E,0x3C,0x7E,0x18,0x00,0x00,
0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x0C,
0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,
0x00,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,
0x3C,0x66,0x76,0x7E,0x6E,0x66,0x3C,0x00,
0x18,0x1C,0x18,0x18,0x18,0x18,0x7E,0x00,
0x3C,0x66,0x60,0x30,0x18,0x0C,0x7E,0x00,
0x3C,0x66,0x60,0x38,0x60,0x66,0x3C,0x00,
0x30,0x38,0x3C,0x36,0x7E,0x30,0x30,0x00,
0x7E,0x06,0x3E,0x60,0x60,0x66,0x3C,0x00,
0x38,0x0C,0x06,0x3E,0x66,0x66,0x3C,0x00,
0x7E,0x60,0x30,0x18,0x0C,0x0C,0x0C,0x00,
0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00,
0x3C,0x66,0x66,0x7C,0x60,0x30,0x1C,0x00,
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x0C,
0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,
0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00,
0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,
0x3C,0x66,0x30,0x18,0x18,0x00,0x18,0x00,
0x3C,0x66,0x76,0x56,0x76,0x06,0x3C,0x00,
0x3C,0x66,0x66,0x7E,0x66,0x66,0x66,0x00,
0x3E,0x66,0x66,0x3E,0x66,0x66,0x3E,0x00,
0x3C,0x66,0x06,0x06,0x06,0x66,0x3C,0x00,
0x1E,0x36,0x66,0x66,0x66,0x36,0x1E,0x00,
0x7E,0x06,0x06,0x3E,0x06,0x06,0x7E,0x00,
0x7E,0x06,0x06,0x3E,0x06,0x06,0x06,0x00,
0x3C,0x66,0x06,0x76,0x66,0x66,0x3C,0x00,
0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00,
0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,
0x7C,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,
0x66,0x36,0x1E,0x0E,0x1E,0x36,0x66,0x00,
0x06,0x06,0x06,0x06,0x06,0x06,0x7E,0x00,
0xC6,0xEE,0xFE,0xD6,0xD6,0xC6,0xC6,0x00,
0x66,0x66,0x6E,0x7E,0x76,0x66,0x66,0x00,
0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,
0x3E,0x66,0x66,0x3E,0x06,0x06,0x06,0x00,
0x3C,0x66,0x66,0x66,0x56,0x36,0x6C,0x00,
0x3E,0x66,0x66,0x3E,0x36,0x66,0x66,0x00,
0x3C,0x66,0x06,0x3C,0x60,0x66,0x3C,0x00,
0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,
0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,
0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,
0xC6,0xC6,0xD6,0xD6,0xFE,0xEE,0xC6,0x00,
0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,
0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00,
0x7E,0x60,0x30,0x18,0x0C,0x06,0x7E,0x00,
0x3E,0x06,0x06,0x06,0x06,0x06,0x3E,0x00,
0x00,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,
0x7C,0x60,0x60,0x60,0x60,0x60,0x7C,0x00,
0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x60,0x7C,0x66,0x7C,0x00,
0x06,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00,
0x00,0x00,0x3C,0x66,0x06,0x66,0x3C,0x00,
0x60,0x60,0x7C,0x66,0x66,0x66,0x7C,0x00,
0x00,0x00,0x3C,0x66,0x7E,0x06,0x3C,0x00,
0x38,0x0C,0x0C,0x3E,0x0C,0x0C,0x0C,0x00,
0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0x3C,
0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x00,
0x18,0x00,0x1C,0x18,0x18,0x18,0x3C,0x00,
0x18,0x00,0x1C,0x18,0x18,0x18,0x18,0x0E,
0x06,0x06,0x66,0x36,0x1E,0x36,0x66,0x00,
0x1C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,
0x00,0x00,0x6C,0xFE,0xD6,0xD6,0xC6,0x00,
0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x00,
0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00,
0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x06,
0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0xE0,
0x00,0x00,0x36,0x6E,0x06,0x06,0x06,0x00,
0x00,0x00,0x7C,0x06,0x3C,0x60,0x3E,0x00,
0x0C,0x0C,0x3E,0x0C,0x0C,0x0C,0x38,0x00,
0x00,0x00,0x66,0x66,0x66,0x66,0x7C,0x00,
0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00,
0x00,0x00,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,
0x00,0x00,0x66,0x3C,0x18,0x3C,0x66,0x00,
0x00,0x00,0x66,0x66,0x66,0x7C,0x60,0x3C,
0x00,0x00,0x7E,0x30,0x18,0x0C,0x7E,0x00,
0x30,0x18,0x18,0x0E,0x18,0x18,0x30,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,
0x0C,0x18,0x18,0x70,0x18,0x18,0x0C,0x00,
0x8C,0xD6,0x62,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,
0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0xFC,0x04,0x04,0xE4,0x24,0x24,
0x00,0x00,0xFC,0xFC,0xFC,0xFC,0x3C,0x3C,
0x00,0x00,0x3F,0x20,0x20,0x27,0x24,0x24,
0x00,0x00,0x3F,0x3F,0x3F,0x3F,0x3C,0x3C,
0x24,0x24,0xE4,0x04,0x04,0xFC,0x00,0x00,
0x3C,0x3C,0xFC,0xFC,0xFC,0xFC,0x00,0x00,
0x24,0x24,0x27,0x20,0x20,0x3F,0x00,0x00,
0x3C,0x3C,0x3F,0x3F,0x3F,0x3F,0x00,0x00,
0x00,0x7E,0x7E,0x66,0x66,0x7E,0x7E,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,
0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,
0xBB,0xEE,0xBB,0xEE,0xBB,0xEE,0xBB,0xEE,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,
0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,
0x66,0x66,0x66,0x67,0x66,0x66,0x66,0x66,
0x00,0x00,0x00,0x7F,0x66,0x66,0x66,0x66,
0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,
0x66,0x66,0x67,0x60,0x67,0x66,0x66,0x66,
0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
0x00,0x00,0x7F,0x60,0x67,0x66,0x66,0x66,
0x66,0x66,0x67,0x60,0x7F,0x00,0x00,0x00,
0x66,0x66,0x66,0x7F,0x00,0x00,0x00,0x00,
0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,
0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,
0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,
0x66,0x66,0x66,0xE6,0x66,0x66,0x66,0x66,
0x66,0x66,0xE6,0x06,0xFE,0x00,0x00,0x00,
0x00,0x00,0xFE,0x06,0xE6,0x66,0x66,0x66,
0x66,0x66,0xE7,0x00,0xFF,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0xE7,0x66,0x66,0x66,
0x66,0x66,0xE6,0x06,0xE6,0x66,0x66,0x66,
0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,
0x66,0x66,0xE7,0x00,0xE7,0x66,0x66,0x66,
0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,
0x66,0x66,0x66,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,
0x00,0x00,0x00,0xFF,0x66,0x66,0x66,0x66,
0x66,0x66,0x66,0xFE,0x00,0x00,0x00,0x00,
0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,
0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,
0x00,0x00,0x00,0xFE,0x66,0x66,0x66,0x66,
0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0x66,
0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,
0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
-887
View File
@@ -1,887 +0,0 @@
ALIGN 8,0x90
IRQ_VECTORS::
DU4 IRQ00,IRQ01,IRQ02,IRQ03;
DU4 IRQ04,IRQ05,IRQ06,IRQ07;
DU4 IRQ08,IRQ09,IRQ0A,IRQ0B;
DU4 IRQ0C,IRQ0D,IRQ0E,IRQ0F;
DU4 IRQ10,IRQ11,IRQ12,IRQ13;
DU4 IRQ14,IRQ15,IRQ16,IRQ17;
DU4 IRQ18,IRQ19,IRQ1A,IRQ1B;
DU4 IRQ1C,IRQ1D,IRQ1E,IRQ1F;
DU4 IRQ20,IRQ21,IRQ22,IRQ23;
DU4 IRQ24,IRQ25,IRQ26,IRQ27;
DU4 IRQ28,IRQ29,IRQ2A,IRQ2B;
DU4 IRQ2C,IRQ2D,IRQ2E,IRQ2F;
DU4 IRQ30,IRQ31,IRQ32,IRQ33;
DU4 IRQ34,IRQ35,IRQ36,IRQ37;
DU4 IRQ38,IRQ39,IRQ3A,IRQ3B;
DU4 IRQ3C,IRQ3D,IRQ3E,IRQ3F;
DU4 IRQ40,IRQ41,IRQ42,IRQ43;
DU4 IRQ44,IRQ45,IRQ46,IRQ47;
DU4 IRQ48,IRQ49,IRQ4A,IRQ4B;
DU4 IRQ4C,IRQ4D,IRQ4E,IRQ4F;
DU4 IRQ50,IRQ51,IRQ52,IRQ53;
DU4 IRQ54,IRQ55,IRQ56,IRQ57;
DU4 IRQ58,IRQ59,IRQ5A,IRQ5B;
DU4 IRQ5C,IRQ5D,IRQ5E,IRQ5F;
////***************** INTERRUPT ROUTINES ***************
ALIGN 8,0x90
IRQ00: PUSHAD
MOV EDX,0
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ01: PUSHAD
MOV EDX,1
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ02: PUSHAD
MOV EDX,2
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ03: PUSHAD
MOV EDX,3
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ04: PUSHAD
MOV EDX,4
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ05: PUSHAD
MOV EDX,5
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ06: PUSHAD
MOV EDX,6
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ07: PUSHAD
MOV EDX,7
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ08: PUSHAD
MOV EDX,8
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ09: PUSHAD
MOV EDX,9
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ0A: PUSHAD
MOV EDX,0x0A
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ0B: PUSHAD
MOV EDX,0x0B
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ0C: PUSHAD
MOV EDX,0x0C
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ0D: PUSHAD
MOV EDX,0x0D
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ0E: PUSHAD
MOV EDX,0x0E
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ0F: PUSHAD
MOV EDX,0x0F
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ10: PUSHAD
MOV EDX,0x10
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ11: PUSHAD
MOV EDX,0x11
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ12: PUSHAD
MOV EDX,0x12
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ13: PUSHAD
MOV EDX,0x13
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ14: PUSHAD
MOV EDX,0x14
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ15: PUSHAD
MOV EDX,0x15
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ16: PUSHAD
MOV EDX,0x16
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ17: PUSHAD
MOV EDX,0x17
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ18: PUSHAD
MOV EDX,0x18
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ19: PUSHAD
MOV EDX,0x19
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ1A: PUSHAD
MOV EDX,0x1A
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ1B: PUSHAD
MOV EDX,0x1B
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ1C: PUSHAD
MOV EDX,0x1C
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ1D: PUSHAD
MOV EDX,0x1D
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ1E: PUSHAD
MOV EDX,0x1E
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ1F: PUSHAD
MOV EDX,0x1F
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ20: STI
CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ00*4[EAX]
OR EAX,EAX
JZ @@2
MOV EBP,ESP
PUSH 0
PUSH U4 SP_EIP[EBP]
CALL EAX
ADD ESP,8
@@2: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POPAD
BT U4 [SYS_FLAGS],SYSf_PREEMPTIVE
JC IRQ_SWAP_IN_NEXT
IRET
IRQ_SWAP_IN_NEXT:
CLI
CALL SAVE_CONTEXT //PREEMPTIVE
MOV EBP,ESP
MOV EAX,[EBP]
MOV U4 FS:[TSS_EIP],EAX
MOV EAX,8[EBP]
MOV U4 FS:[TSS_EFLAGS],EAX
ADD EBP,12
MOV U4 FS:[TSS_ESP],EBP
MOV ESI,U4 FS:[TSS_NEXT_TSS]
MOV AX,U2 TSS_FS[ESI]
MOV FS,AX
JMP U4 SWAP_IN_NEXT_PART2
ALIGN 8,0x90
IRQ21:: CLD
PUSHAD
CALL U4 CP_KBD_HANDLER+4
MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ22: PUSHAD
MOV EDX,0x22
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ23: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ03*4[EAX]
OR EAX,EAX
JZ @@231
CALL EAX
@@231: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ24: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ04*4[EAX]
OR EAX,EAX
JZ @@241
CALL EAX
@@241: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ25: PUSHAD
MOV EDX,0x25
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ26: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ06*4[EAX]
OR EAX,EAX
JZ @@261
CALL EAX
@@261: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ27: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ07*4[EAX]
OR EAX,EAX
JZ @@271
CALL EAX
@@271: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ28: PUSHAD
MOV EDX,0x28
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ29: PUSHAD
MOV EDX,0x29
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ2A: PUSHAD
MOV EDX,0x2A
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ2B: PUSHAD
MOV EDX,0x2B
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ2C: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ0C*4[EAX]
OR EAX,EAX
JZ @@2C1
CALL EAX
@@2C1: MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ2D: PUSHAD
MOV EDX,0x2D
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ2E: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ0E*4[EAX]
OR EAX,EAX
JZ @@2E1
CALL EAX
@@2E1: MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20
OUT 0x20,AL
POPAD
IRET
ALIGN 8,0x90
IRQ2F: CLD
PUSHAD
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_IRQ0F*4[EAX]
OR EAX,EAX
JZ @@2F1
CALL EAX
@@2F1: MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20
OUT 0x20,AL
POPAD
IRET
//************************************ SOFTWARE INT'S ******************************
TEST_AND_ENABLE_IRQS:
PUSH EBP
MOV EBP,ESP
//16[ebp]=flags
//12[ebp]=cs
// 8[ebp]=iret
// 4[ebp]=ret
// 0[ebp]=ebp
BT U4 16[EBP],9
JNC @@TEI1
STI
@@TEI1: POP EBP
RET
ALIGN 8,0x90
IRQ30: CALL TEST_AND_ENABLE_IRQS
PUSHAD
PUSH 0
PUSH ESI
CALL CP_PUT_SYSTEXT+4
ADD ESP,8
POPAD
IRET
ALIGN 8,0x90
IRQ31: CALL TEST_AND_ENABLE_IRQS
PUSHAD
CALL PUT_I1
POPAD
IRET
ALIGN 8,0x90
IRQ32: CALL TEST_AND_ENABLE_IRQS
PUSHAD
MOV ESI,MSG_GETCHAR
CALL FIND_EXTERN
JNZ @@3210
CALL GET_KEY
INT I_PUT_I1
XOR EDX,EDX
JMP @@3220
@@3210: PUSH 0
PUSH 0
CALL ESI
ADD ESP,8
@@3220: MOV EBP,ESP
MOV U4 SP_EAX[EBP],EAX
MOV U4 SP_EDX[EBP],EDX
POPAD
IRET
COUT_JOIN::
OR EBX,EBX
JZ U4 @@100
@@20: MOV EDX,U4 [EBP]
MOV EAX,U4 8[EBP]
PUSHAD
CMP EDX,IT_NUM_IT+IT_I1
JNE @@25
PUSH ESI
MOV ESI,EAX
CALL PUT_STRING
POP ESI
JMP @@29
@@25: CMP EDX,IT_U8
JE @@26
CMP EDX,IT_I8
JNE @@24
@@26: MOV EAX,U4 12[EBP]
CALL PUT_HEX
MOV EAX,U4 8[EBP]
CALL PUT_HEX
JMP @@29
@@24: CMP EDX,IT_U4
JE @@21
CMP EDX,IT_I4
JNE @@21A
@@21: CALL PUT_HEX
JMP @@29
@@21A: CMP EDX,IT_U2
JE @@22
CMP EDX,IT_I2
JNE @@22A
@@22: CALL PUT_HEX_U2
JMP @@29
@@22A: CMP EDX,IT_U1
JNE @@23
CALL PUT_HEX_U1
JMP @@29
@@23: CMP EDX,IT_DOUBLE
JNE @@30
PUSH U4 12[EBP]
PUSH U4 8[EBP]
CALL CP_PUT_FLOAT+4
ADD ESP,8
JMP @@29
@@30: CMP EDX,IT_I1
JNE @@21
CALL PUT_I1
@@29: POPAD
SUB EBP,16
DEC EBX
JNZ U4 @@20
@@100: RET
ALIGN 8,0x90
IRQ33:: CALL TEST_AND_ENABLE_IRQS //COUT
PUSH EBP
MOV EBP,ESP
MOV EBX,EAX //GET PARAM CNT
ADD EBX,EBX
LEA EBP,16-16[EBP+EBX*8]
MOV EBX,EAX //GET PARAM CNT
CALL COUT_JOIN
POP EBP
IRET
ALIGN 8,0x90
IRQ34: CALL TEST_AND_ENABLE_IRQS
PUSHAD
SUB ESP,16 //Space for param1 & param2
PUSH EDX //mask
PUSH EAX //mask
MOV EAX,ESP
ADD EAX,16
PUSH 0
PUSH 0
PUSH 0 //&param2
PUSH EAX //&param2
SUB EAX,8
PUSH 0 //&param1
PUSH EAX //&param1
MOV ESI,MSG_PEEK_MSG
CALL FIND_EXTERN
CALL ESI
ADD ESP,32
POP EBX //param1
ADD ESP,4
POP EDX //param2
ADD ESP,4
MOV EBP,ESP
MOV U4 SP_EAX[EBP],EAX
MOV U4 SP_EBX[EBP],EBX
MOV U4 SP_EDX[EBP],EDX
POPAD
IRET
ALIGN 8,0x90
IRQ35: CALL TEST_AND_ENABLE_IRQS
PUSHAD
SUB ESP,16 //Space for param1 & param2
PUSH EDX //mask
PUSH EAX //mask
MOV EAX,ESP
ADD EAX,16
PUSH 0
PUSH 0
PUSH 0 //&param2
PUSH EAX //&param2
SUB EAX,8
PUSH 0 //&param1
PUSH EAX //&param1
MOV ESI,MSG_GET_MSG_NO_WAIT
CALL FIND_EXTERN
CALL ESI
ADD ESP,32
POP EBX //param1
ADD ESP,4
POP EDX //param2
MOV EBP,ESP
ADD ESP,4
MOV U4 SP_EAX[EBP],EAX
MOV U4 SP_EBX[EBP],EBX
MOV U4 SP_EDX[EBP],EDX
POPAD
IRET
ALIGN 8,0x90
IRQ36:: CALL TEST_AND_ENABLE_IRQS
PUSHAD
MOV ESI,MSG_FLUSH_MSGS
CALL FIND_EXTERN
XOR EAX,EAX
OR ESI,ESI
JZ @@1
CALL ESI
@@1: MOV EBP,ESP
MOV U4 SP_EDX[EBP],EDX
MOV U4 SP_EAX[EBP],EAX
POPAD
IRET
CP_FLUSH_MSGS::
INT I_FLUSH_MSGS
RET
ALIGN 8,0x90
IRQ37: CALL TEST_AND_ENABLE_IRQS
PUSHAD
SUB ESP,16 //Space for param1 & param2
PUSH EDX //mask
PUSH EAX //mask
MOV EAX,ESP
ADD EAX,16
PUSH 0
PUSH 0
PUSH 0 //&param2
PUSH EAX //&param2
SUB EAX,8
PUSH 0 //&param1
PUSH EAX //&param1
MOV ESI,MSG_GET_MSG
CALL FIND_EXTERN
CALL ESI
ADD ESP,32
POP EBX //param1
ADD ESP,4
POP EDX //param2
ADD ESP,4
MOV EBP,ESP
MOV U4 SP_EAX[EBP],EAX
MOV U4 SP_EBX[EBP],EBX
MOV U4 SP_EDX[EBP],EDX
POPAD
IRET
ALIGN 8,0x90
IRQ38:: CALL TEST_AND_ENABLE_IRQS
CALL PUT_STRING
IRET
ALIGN 8,0x90
IRQ39:: CALL TEST_AND_ENABLE_IRQS
PUSH EBP
MOV EBP,ESP
MOV EBX,EAX //GET PARAM CNT
ADD EBX,EBX
LEA EBP,16-16[EBP+EBX*8]
MOV EBX,EAX //GET PARAM CNT
CALL COUT_JOIN
CALL CRLF
POP EBP
IRET
ALIGN 8,0x90 //I_DEBUG
IRQ3A:: CLI
CLD
PUSHAD
CALL SAVE_CONTEXT
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_DEBUG*4[EAX]
OR EAX,EAX
JZ @@3A1
CALL EAX
@@3A1: POPAD
IRET
ALIGN 8,0x90
IRQ3B: PUSHAD
MOV EDX,0x3B
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ3C: PUSHAD
MOV EDX,0x3C
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ3D: PUSHAD
MOV EDX,0x3D
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ3E: PUSHAD
MOV EDX,0x3E
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ3F: PUSHAD
MOV EDX,0x3F
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ40: PUSHAD
MOV EDX,0x40
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ41: PUSHAD
MOV EDX,0x41
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ42: PUSHAD
MOV EDX,0x42
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ43: PUSHAD
MOV EDX,0x43
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ44: PUSHAD
MOV EDX,0x44
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ45: PUSHAD
MOV EDX,0x45
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ46: PUSHAD
MOV EDX,0x46
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ47: PUSHAD
MOV EDX,0x47
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ48: PUSHAD
MOV EDX,0x48
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ49: PUSHAD
MOV EDX,0x49
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ4A: PUSHAD
MOV EDX,0x4A
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ4B: PUSHAD
MOV EDX,0x4B
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ4C: PUSHAD
MOV EDX,0x4C
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ4D: PUSHAD
MOV EDX,0x4D
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ4E: PUSHAD
MOV EDX,0x4E
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ4F: PUSHAD
MOV EDX,0x4F
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ50: PUSHAD
MOV EDX,0x50
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ51: PUSHAD
MOV EDX,0x51
JMP U4 IRQFAULT
ALIGN 8,0x90
IRQ52: PUSHAD
MOV EDX,0x52
JMP IRQFAULT
ALIGN 8,0x90
IRQ53: PUSHAD
MOV EDX,0x53
JMP IRQFAULT
ALIGN 8,0x90
IRQ54: PUSHAD
MOV EDX,0x54
JMP IRQFAULT
ALIGN 8,0x90
IRQ55: PUSHAD
MOV EDX,0x55
JMP IRQFAULT
ALIGN 8,0x90
IRQ56: PUSHAD
MOV EDX,0x56
JMP IRQFAULT
ALIGN 8,0x90
IRQ57: PUSHAD
MOV EDX,0x57
JMP IRQFAULT
ALIGN 8,0x90
IRQ58: PUSHAD
MOV EDX,0x58
JMP IRQFAULT
ALIGN 8,0x90
IRQ59: PUSHAD
MOV EDX,0x59
JMP IRQFAULT
ALIGN 8,0x90
IRQ5A: PUSHAD
MOV EDX,0x5A
JMP IRQFAULT
ALIGN 8,0x90
IRQ5B: PUSHAD
MOV EDX,0x5B
JMP IRQFAULT
ALIGN 8,0x90
IRQ5C: PUSHAD
MOV EDX,0x5C
JMP IRQFAULT
ALIGN 8,0x90
IRQ5D: PUSHAD
MOV EDX,0x5D
JMP IRQFAULT
ALIGN 8,0x90
IRQ5E: PUSHAD
MOV EDX,0x5E
JMP IRQFAULT
ALIGN 8,0x90
IRQ5F: PUSHAD
MOV EDX,0x5F
JMP IRQFAULT
FAULT_DESC: DU1 "FAULT TASK",0;
CP_FAULT::
PUSHAD
MOV EBP,ESP
MOV EDX,U4 SP_PARAM1[EBP]
IRQFAULT::
CLD
PUSH EDX //Save IRQNUM
MOV U4 [SYS_CUR_FOCUS_TASK],0
MOV EAX,U4 FS:[TSS_DBG]
OR EAX,EAX
JNZ @@10
PUSH 0
PUSH U4 DEFAULT_STACK
PUSH 0
PUSH 0 ///Use parent account
PUSH 0
PUSH U4 FS:[TSS_ABSOLUTE_ADDRESS]
PUSH 0
PUSH U4 FAULT_DESC
PUSH 0
PUSH U4 CP_FAULT_CMD_LINE+4
CALL CP_SPAWN_TASK+4
ADD ESP,40
@@10: POP U4 TSS_USER_AUX0[EAX]
PUSH 0
PUSH EAX
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX]
OR EAX,EAX
JZ @@20
CALL EAX
@@20: ADD ESP,8
POPAD
BTS U4 FS:[TSS_TASK_FLAGS],TSSf_SUSPENDED
JMP U4 IRQ_SWAP_IN_NEXT
GET_MACHINE_REGS::
PUSH EBP
MOV EBP,ESP
MOV EBX,SF_PARAM1[EBP]
DU1 0x0F,0x20,0xC0;
MOV U4 [EBX],EAX
DU1 0x0F,0x20,0xD0;
MOV U4 4[EBX],EAX
DU1 0x0F,0x20,0xD8;
MOV U4 8[EBX],EAX
DU1 0x0F,0x20,0xE0;
MOV U4 12[EBX],EAX
DU1 0x0F,0x21,0xC0;
MOV U4 16[EBX],EAX
DU1 0x0F,0x21,0xC8;
MOV U4 20[EBX],EAX
DU1 0x0F,0x21,0xD0;
MOV U4 24[EBX],EAX
DU1 0x0F,0x21,0xD8;
MOV U4 28[EBX],EAX
DU1 0x0F,0x21,0xF0;
MOV U4 32[EBX],EAX
DU1 0x0F,0x21,0xF8;
MOV U4 36[EBX],EAX
POP EBP
RET
+838
View File
@@ -0,0 +1,838 @@
ALIGN 8,OC_NOP
IRQ_VECTORS::
DU4 IRQ00,IRQ01,IRQ02,IRQ03;
DU4 IRQ04,IRQ05,IRQ06,IRQ07;
DU4 IRQ08,IRQ09,IRQ0A,IRQ0B;
DU4 IRQ0C,IRQ0D,IRQ0E,IRQ0F;
DU4 IRQ10,IRQ11,IRQ12,IRQ13;
DU4 IRQ14,IRQ15,IRQ16,IRQ17;
DU4 IRQ18,IRQ19,IRQ1A,IRQ1B;
DU4 IRQ1C,IRQ1D,IRQ1E,IRQ1F;
DU4 IRQ20,IRQ21,IRQ22,IRQ23;
DU4 IRQ24,IRQ25,IRQ26,IRQ27;
DU4 IRQ28,IRQ29,IRQ2A,IRQ2B;
DU4 IRQ2C,IRQ2D,IRQ2E,IRQ2F;
DU4 IRQ30,IRQ31,IRQ32,IRQ33;
DU4 IRQ34,IRQ35,IRQ36,IRQ37;
DU4 IRQ38,IRQ39,IRQ3A,IRQ3B;
DU4 IRQ3C,IRQ3D,IRQ3E,IRQ3F;
DU4 IRQ40,IRQ41,IRQ42,IRQ43;
DU4 IRQ44,IRQ45,IRQ46,IRQ47;
DU4 IRQ48,IRQ49,IRQ4A,IRQ4B;
DU4 IRQ4C,IRQ4D,IRQ4E,IRQ4F;
DU4 IRQ50,IRQ51,IRQ52,IRQ53;
////***************** INTERRUPT ROUTINES ***************
ALIGN 8,OC_NOP
IRQ00:: PUSH RDX
XOR EDX,EDX
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ01: PUSH RDX
MOV RDX,1
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ02: //Halt
XOR ESI,ESI
CALL HALT_CPU
ALIGN 8,OC_NOP
IRQ03: PUSH RDX
MOV RDX,3
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ04: PUSH RDX
MOV RDX,4
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ05: PUSH RDX
MOV RDX,5
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ06: PUSH RDX
MOV RDX,6
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ07: PUSH RDX
MOV RDX,7
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ08: PUSH RDX
MOV RDX,8
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ09: PUSH RDX
MOV RDX,9
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ0A: PUSH RDX
MOV RDX,0x0A
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ0B: PUSH RDX
MOV RDX,0x0B
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ0C: PUSH RDX
MOV RDX,0x0C
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ0D: PUSH RDX
MOV RDX,0x0D
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ0E: PUSH RDX
MOV RDX,0x0E
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ0F: PUSH RDX
MOV RDX,0x0F
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ10: PUSH RDX
MOV RDX,0x10
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ11: PUSH RDX
MOV RDX,0x11
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ12: PUSH RDX
MOV RDX,0x12
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ13: PUSH RDX
MOV RDX,0x13
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ14: PUSH RDX
MOV RDX,0x14
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ15: PUSH RDX
MOV RDX,0x15
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ16: PUSH RDX
MOV RDX,0x16
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ17: PUSH RDX
MOV RDX,0x17
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ18: PUSH RDX
MOV RDX,0x18
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ19: PUSH RDX
MOV RDX,0x19
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ1A: PUSH RDX
MOV RDX,0x1A
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ1B: PUSH RDX
MOV RDX,0x1B
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ1C: PUSH RDX
MOV RDX,0x1C
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ1D: PUSH RDX
MOV RDX,0x1D
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ1E: PUSH RDX
MOV RDX,0x1E
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ1F: PUSH RDX
MOV RDX,0x1F
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ20: CLD
PUSH RAX
PUSH_C_REGS
MOV RBP,RSP
MOV RBX,U8 SC_RIP+8[RBP]
XOR EAX,EAX
MOV RDX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
BT U8 TSS_TASK_FLAGS[RAX],TSSf_IDLE
JC @@1a
CMP RBX,U4 IDLE_START
JB @@1
CMP RBX,U4 IDLE_END
JA @@1
@@1a: INC U8 CPU_IDLE_POINT_HITS[RDX]
@@1: MOV RAX,U8 CPU_NUM[RDX]
OR RAX,RAX
JZ @@3
XOR EAX,EAX
MOV EAX,U4 MP_EOI
MOV U4 [RAX],0
JMP @@5
@@3: MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ00*8[RAX]
OR RAX,RAX
JZ @@2
PUSH RBX
CALL RAX
ADD RSP,8
@@2: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
@@5: POP_C_REGS
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
BT U8 TSS_TASK_FLAGS[RAX],TSSf_PREEMPT
JC @@5A
POP RAX
IRET
@@5A: POP RAX
CLI
CALL SAVE_CONTEXT //PREEMPTIVE
XOR ESI,ESI
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RSI]
MOV RBP,RSP
MOV RAX,U8 [RBP]
MOV U8 TSS_RIP[RSI],RAX
MOV RAX,U8 16[RBP]
MOV U8 TSS_RFLAGS[RSI],RAX
MOV RAX,U8 24[RBP]
MOV U8 TSS_RSP[RSI],RAX
JMP U4 SIN_PART1
ALIGN 8,OC_NOP
IRQ21: CLD
PUSH_C_REGS
CALL KBD_IRQ_HANDLER
MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ22: PUSH RDX
MOV RDX,0x22
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ23: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ03*8[RAX]
OR RAX,RAX
JZ @@231
CALL RAX
@@231: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ24: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ04*8[RAX]
OR RAX,RAX
JZ @@241
CALL RAX
@@241: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ25: PUSH RDX
MOV RDX,0x25
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ26: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ06*8[RAX]
OR RAX,RAX
JZ @@261
CALL RAX
@@261: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ27: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ07*8[RAX]
OR RAX,RAX
JZ @@271
CALL RAX
@@271: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ28: PUSH RDX
MOV RDX,0x28
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ29: PUSH RDX
MOV RDX,0x29
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ2A: PUSH RDX
MOV RDX,0x2A
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ2B: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0B*8[RAX]
OR RAX,RAX
JZ @@2B1
CALL RAX
@@2B1: MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ2C: PUSH RAX //keyboard
MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP RAX
IRET
ALIGN 8,OC_NOP
IRQ2D: PUSH RDX
MOV RDX,0x2D
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ2E: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0E*8[RAX]
OR RAX,RAX
JZ @@2E1
CALL RAX
@@2E1: MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20
OUT 0x20,AL
POP_C_REGS
IRET
ALIGN 8,OC_NOP
IRQ2F: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0F*8[RAX]
OR RAX,RAX
JZ @@2F1
CALL RAX
@@2F1: MOV AL,0x20
OUT 0xA0,AL
MOV AL,0x20
OUT 0x20,AL
POP_C_REGS
IRET
/*************************************/
ALIGN 8,OC_NOP
IRQ30: PUSH RDX
MOV RDX,0x30
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ31: PUSH RDX
MOV RDX,0x31
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ32: PUSH RDX
MOV RDX,0x32
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ33: PUSH RDX
MOV RDX,0x33
JMP U4 IRQFAULT
COUT_PUT_DOUBLE:
PUSH_C_REGS
PUSH U8 8[RBP]
CALL CP_PUT_FLOAT
ADD RSP,8
POP_C_REGS
COUT_RETURN:
RET
COUT_PUT_STR:
PUSH RSI
MOV RSI,RAX
CALL PUT_STR
POP RSI
RET
COUT_JMP_TABLE:
DU8 COUT_RETURN;
DU8 COUT_RETURN;
DU8 PUT_HEX_U1;
DU8 PUT_HEX_U1;
DU8 PUT_HEX_U2;
DU8 PUT_HEX_U2;
DU8 PUT_HEX_U4;
DU8 PUT_HEX_U4;
DU8 PUT_HEX_U8;
DU8 PUT_HEX_U8;
DU8 COUT_PUT_DOUBLE;
DU8 COUT_RETURN;
//pointer types
DU8 COUT_RETURN;
DU8 COUT_RETURN;
DU8 COUT_PUT_STR;
COUT_JOIN::
OR RBX,RBX
JZ @@100
@@20: MOV RDX,U8 [RBP]
MOV RAX,U8 8[RBP]
CALL U8 COUT_JMP_TABLE[RDX*8]
SUB RBP,16
DEC RBX
JNZ @@20
@@100: RET
//I_COUT
ALIGN 8,OC_NOP
IRQ34:: PUSH RBP
MOV RBP,RSP
BT U8 24[RBP],9
JNC @@I34
STI
@@I34:
MOV RBP,U8 32[RBP]
MOV RBX,RAX //GET PARAM CNT
ADD RBX,RBX
LEA RBP,-16[RBP+RBX*8]
MOV RBX,RAX //GET PARAM CNT
CALL COUT_JOIN
POP RBP
IRET
//I_COUTLN
ALIGN 8,OC_NOP
IRQ35:: PUSH RBP
MOV RBP,RSP
BT U8 24[RBP],9
JNC @@I35
STI
@@I35:
MOV RBP,U8 32[RBP]
MOV RBX,RAX //GET PARAM CNT
ADD RBX,RBX
LEA RBP,-16[RBP+RBX*8]
MOV RBX,RAX //GET PARAM CNT
CALL COUT_JOIN
CALL CRLF
POP RBP
IRET
ALIGN 8,OC_NOP
IRQ36: PUSH RDX
MOV RDX,0x36
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ37: PUSH RDX
MOV RDX,0x37
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ38: PUSH RDX
MOV RDX,0x38
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ39: PUSH RDX
MOV RDX,0x39
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ3A: PUSH RDX
MOV RDX,0x3A
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ3B: PUSH RDX
MOV RDX,0x3B
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ3C: PUSH RDX
MOV RDX,0x3C
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ3D: PUSH RDX
MOV RDX,0x3D
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ3E: PUSH RDX
MOV RDX,0x3E
JMP U4 IRQFAULT
ALIGN 8,OC_NOP
IRQ3F: PUSH RDX
MOV RDX,0x3F
JMP U4 IRQFAULT
//************************************ SOFTWARE INT'S ******************************
ALIGN 8,OC_NOP
IRQ40: //UNARY_MINUS
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FCHS
FSTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ41: //INC
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD1
FADDP
FSTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ42: //DEC
PUSH RAX
MOV RBX,RSP
FLD1
FLD U8 [RBX]
FSUBRP
FSTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ43: //POWER
PUSH RDX
PUSH RAX
PUSH 0
MOV RBX,RSP
FSTCW U4 [RBX]
FWAIT
MOV AX,U2 [RBX]
MOV U2 2[RBX],AX
OR AX,0x0C00
MOV U2 [RBX],AX
FLDCW U4 [RBX]
FLD U8 8[RBX]
FLD U8 16[RBX]
FYL2X // y*log2(x)
FST U8 16[RBX]
FRNDINT
FLD U8 16[RBX]
FSUBRP
F2XM1
FLD1
FADDP
FSTP U8 8[RBX]
FFREE
FINCSTP
FLD U8 16[RBX]
FLD U8 8[RBX]
FSCALE // ST0<<ST1
FSTP U8 16[RBX]
FFREE
FINCSTP
FLDCW U4 2[RBX]
FWAIT
ADD RSP,16
POP RAX
IRET
IRQ44: //MUL
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FMULP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ45: //DIV
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FDIVP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ46: //MOD
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
@@DMOD: FPREM
FSTSW
FWAIT
TEST AX,0x400
JNZ @@DMOD
FSTP U8 [RBX]
FFREE
FINCSTP
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ47: //ADD
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
FADDP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ48: //SUB
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FSUBP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ49: //LESS
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
FCOMIP
FWAIT
MOV RAX,0
ADC RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4A: //GREATER
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FCOMIP
FWAIT
MOV RAX,0
ADC RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4B: //LESS_EQUAL
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FCOMIP
FWAIT
MOV RAX,1
SBB RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4C: //GREATER_EQUAL
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
FCOMIP
FWAIT
MOV RAX,1
SBB RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4D: //TO_INT_RAX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FISTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ4E: //TO_DOUBLE_RAX
PUSH RAX
MOV RBX,RSP
FILD U8 [RBX]
FSTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ4F: //TO_INT_RDX
PUSH RDX
MOV RBX,RSP
FLD U8 [RBX]
FISTP U8 [RBX]
FWAIT
POP RDX
IRET
IRQ50: //TO_DOUBLE_RDX
PUSH RDX
MOV RBX,RSP
FILD U8 [RBX]
FSTP U8 [RBX]
FWAIT
POP RDX
IRET
IRQ51: //TO_INT_RCX
PUSH RCX
MOV RBX,RSP
FLD U8 [RBX]
FISTP U8 [RBX]
FWAIT
POP RCX
IRET
IRQ52: //TO_DOUBLE_RCX
PUSH RCX
MOV RBX,RSP
FILD U8 [RBX]
FSTP U8 [RBX]
FWAIT
POP RCX
IRET
IRQ53: PUSH RDX
MOV RDX,0x53
JMP U1 IRQFAULT
//************************************ SOFTWARE INT'S ******************************
IRQFAULT::
PUSH RAX
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
MOV U4 TSS_FAULT_NUM[RAX],EDX
POP RAX
POP RDX
CALL SAVE_CONTEXT
XOR ESI,ESI
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RSI]
MOV RBP,RSP
MOV RAX,U8 [RBP]
MOV U8 TSS_RIP[RSI],RAX
MOV RAX,U8 16[RBP]
MOV U8 TSS_RFLAGS[RSI],RAX
MOV RAX,U8 24[RBP]
MOV U8 TSS_RSP[RSI],RAX
MOV RSP,RAX
MOV RAX,TSS_RAX[RSI]
MOV RBP,TSS_RBP[RSI]
MOV RSI,TSS_RSI[RSI]
CALL CP_FAULT2
JMP U4 CONT_SWAP2
+175
View File
@@ -0,0 +1,175 @@
I8 ToUpper(I8 ch)
{
if (ch>='a' && ch<='z')
return ch-'a'+'A';
else
return ch;
}
void GetOutOfDollar()
{
Ltf *l=Fs->cur_ltf;
if (IsRaw) {
if (dc_flags&DCF_IN_DOLLAR)
PutChar('$$');
} else {
if (l && l->flags&LTFF_IN_DOLLAR)
PutChar('$$');
}
}
void PutErr()
{
GetOutOfDollar;
PutSysText("ST_ERROR");
}
void PutWarn()
{
GetOutOfDollar;
PutSysText("ST_WARNING");
}
void PutSysTextErr(I1 *st)
{
PutErr;
PutSysText(st);
}
void PutSysTextWarn(I1 *st)
{
PutWarn;
PutSysText(st);
}
BoolU8 ScanKey(I8 *ch=NULL,U8 *scancode=NULL,BoolU4 echo=FALSE)
{
I8 ch1=0;
U8 scancode1=0;
BoolU4 result=CallExtNum(EXT_SCAN_KEY,&ch1,&scancode1,FALSE);
if (echo)
PutKey(ch1,scancode1);
if (ch) *ch=ch1;
if (scancode) *scancode=scancode1;
return result;
}
I8 GetKey(U8 *scancode=NULL,BoolU4 echo=FALSE)
{
I8 ch1;
BoolU4 old_preempt=Preempt(OFF);
Fs->task_flags&=~(1<<TSSf_IDLE);
while (!ScanKey(&ch1,scancode,echo)) {
Fs->task_flags|=1<<TSSf_IDLE;
if (!Bt(&sys_semas[SYS_SEMA_IN_DEBUGGER],0)) {
Fs->task_flags|=1<<TSSf_AWAITING_MSG;
SwapInNext;
} else {
//kinda a kludge
Bts(&sys_semas[SYS_SEMA_KEY_PRESSED],0);
CallExtStr("PollKbdMouse");
CallExtStr("WinQueueKbdMouseMsgs");
}
}
Fs->task_flags&=~(1<<TSSf_IDLE);
Preempt(old_preempt);
return ch1;
}
I8 GetChar(U8 *scancode=NULL,BoolU4 echo=TRUE)
{
I8 ch1;
do ch1=GetKey(scancode,FALSE);
while (!ch1);
if (echo)
PrintF("$$FU$$$$BU$$%c$$FG$$$$BG$$",ch1);
return ch1;
}
I1 *MGetS()
{
//Returns a $LK,"MAlloc","MN:MAlloc"$()ed prompted string.
return CallExtNum(EXT_MGETS);
}
U8 GetS(I1 *buf,U8 size,BoolU4 allow_extended=TRUE)
{
I8 ch;
I1 *buf2;
U8 i=0;
if (!size || !buf) return 0;
if (allow_extended) {
buf2=MGetS;
if (StrLen(buf2)>size-1) {
MemCpy(buf,buf2,size-1);
buf[size-1]=0;
} else
StrCpy(buf,buf2);
i=StrLen(buf);
Free(buf2);
} else {
while (TRUE) {
ch=GetChar(NULL,FALSE);
if (ch==CH_CR) {
PutChar(ch);
break;
} if (ch==CH_BACKSPACE) {
if (i>0) {
i--;
PutChar(ch);
}
} else {
if (i<size-1) {
buf[i++]=ch;
PutChar(ch);
}
}
}
buf[i]=0;
}
return i;
}
BoolU8 YorN()
{
I8 ch;
cout "(y or n)? ";
while (TRUE) {
ch=ToUpper(GetChar(NULL,FALSE));
if (ch=='Y') {
coutln "$$FU$$$$BU$$YES$$FG$$$$BG$$";
return TRUE;
} else if (ch=='N') {
coutln "$$FU$$$$BU$$NO$$FG$$$$BG$$";
return FALSE;
}
}
}
BoolU8 PressAKey()
{
I8 ch;
PutSysText("ST_PRESS_A_KEY");
ch=GetChar(NULL,FALSE);
if (ch==CH_CTRLQ || ch==CH_ESC)
return FALSE;
else
return TRUE;
}
BoolU8 AreYouSure()
{
PutSysText("ST_ARE_YOU_SURE");
return YorN;
}
asm {KBD_IRQ_HANDLER::}
void KbdIrqHandler()
{
kbd_evt_time=GetTimeStamp;
Bts(&sys_semas[SYS_SEMA_KEY_PRESSED],0);
OutP(0x21,InP(0x21)|2);
}
BIN
View File
Binary file not shown.
-62
View File
@@ -1,62 +0,0 @@
U1 *AMAlloc(U8 size)
{
U1 *result=MAlloc(size,adam_tss);
return result;
}
void AFree(U1 *add)
{
Free(add,adam_tss);
}
U1 *AMAllocIdentical(U1 *src)
{
U8 size=MSize(src);
U1 *result=MAlloc(size,adam_tss);
MemCpy(result,src,size);
}
U1 *MAllocIdentical(U1 *src,TssStruct *tss=NULL)
{
U8 size=MSize(src);
U1 *result=MAlloc(size,tss);
MemCpy(result,src,size);
}
I1 *ANewString(I1 *buf)
{
U8 size=StrLen(buf)+1;
U1 *result=MAlloc(size,adam_tss);
MemCpy(result,buf,size);
}
I1 *NewString(I1 *buf,TssStruct *tss=NULL)
{
U8 size=StrLen(buf)+1;
U1 *result=MAlloc(size,tss);
MemCpy(result,buf,size);
}
U1 *AMAllocZ(U8 size)
{
U1 *result=MAlloc(size,adam_tss);
MemSet(result,0,size);
return result;
}
U1 *MAllocZ(U8 size,TssStruct *tss=NULL)
{
U1 *result=MAlloc(size,tss);
MemSet(result,0,size);
return result;
}
void DelLinkedList(U4 *list)
{
U4 *d;
while (list) {
d=*list;
Free(list);
list=d;
}
}
-877
View File
@@ -1,877 +0,0 @@
BoolU4 AssignBit(U1 *field,U8 bit,U8 val)
{
if (val)
return Bts(field,bit);
else
return Btr(field,bit);
}
void PortNop()
{
InP(0x379); //This is an innoculous ISA (parallel port)
//access which should take
//fixed time on all machines.
//It takes 1.66uS
}
void Exit()
{
Bts(&Fs->task_flags,TSSf_KILL_TASK);
while (TRUE)
SwapInNext;
}
void Kill(TssStruct *tss)
{
Bts(&tss->task_flags,TSSf_KILL_TASK);
}
void SimpleTimerIrq()
{
U8 old_flags=GetFlags;
Cli;
jiffies++;
sys_timer+=SYS_TIMER0_PERIOD+1;
SetFlags(old_flags);
}
U8 ReadSysTimer()
{
U8 i,old_flags=GetFlags;
U8 result;
Cli;
OutP(0x43,0); //Latch Timer0
i=InP(0x40);
i+=(InP(0x40)<<8);
result=sys_timer+SYS_TIMER0_PERIOD-i;
SetFlags(old_flags);
return result;
}
U8 ExceptDepth(TssStruct *tss=NULL)
{
U8 result=0;
ExceptStruct *tempt;
if (!tss) tss=Fs;
tempt=tss->next_except;
while (tempt!=&tss->next_except) {
result++;
tempt=tempt->next;
}
return result;
}
asm {
CP_TEST_EXCEPT::
MOV EAX,U4 FS:[TSS_LAST_EXCEPT]
MOV EBP,U4 EXCEPT_EBP[EAX]
MOV ESI,U4 EXCEPT_ESI[EAX]
MOV EDI,U4 EXCEPT_EDI[EAX]
CALL U4 EXCEPT_HANDLER_START[EAX]
RET
CP_CATCH_EXCEPT::
MOV EAX,U4 FS:[TSS_LAST_EXCEPT]
MOV EDX,U4 EXCEPT_HANDLER_SKIP[EAX]
MOV ESP,U4 EXCEPT_ESP[EAX]
JMP EDX
CP_SAVE_EXCEPT_ESI_EDI::
PUSH EBP
MOV EBP,ESP
MOV EAX,SF_PARAM1[EBP]
MOV U4 EXCEPT_ESI[EAX],ESI
MOV U4 EXCEPT_EDI[EAX],EDI
POP EBP
RET
};
LTextern CP_TEST_EXCEPT void TestExcept();
LTextern CP_CATCH_EXCEPT void TakeExcept();
LTextern CP_SAVE_EXCEPT_ESI_EDI void SaveExceptRegs(ExceptStruct *t);
exe {NoRegVar(ON);}
void SysTry(U1 *start_label,U1 *skip_label,U8 my_ebp,U8 my_esp)
{
U4 *ptr=GetBasePtr;
ExceptStruct *tempt=MAlloc(sizeof(ExceptStruct));
tempt->handler_start=start_label;
tempt->handler_skip=skip_label;
tempt->esp=my_esp+8;
tempt->ebp=my_ebp;
SaveExceptRegs(tempt);
InsQue(tempt,Fs->last_except);
}
void SysCatch()
{
ExceptStruct *tempt=Fs->last_except;
RemQue(tempt);
Free(tempt);
}
void throw(...)
{
ExceptStruct *tempt=Fs->last_except;
U8 i;
AdamLog("Depth:%02X Tsk:%08X throw(",
ExceptDepth(Fs),Fs); //TODO: fix compiler--"(FS)"
for (i=0;i<argc;i++)
AdamLog("%X,",argv[i]);
AdamLog(");\r\n");
Fs->except_argc=argc;
Fs->except_argv=argv;
Fs->except_ebp=GetBasePtr;
Fs->catch_except=FALSE;
while (tempt!=&Fs->next_except) {
TestExcept;
if (Fs->catch_except)
TakeExcept;
SetBasePtr(Fs->except_ebp);
RemQue(tempt);
Free(tempt);
tempt=Fs->last_except;
}
PutSysText("ST_UNHANDLED_EXCEPTION");
while (TRUE)
SwapInNext;
}
exe {NoRegVar(OFF);}
void KbdCmdSend(U8 port, U1 val)
{
U8 timeout;
for (timeout=50000;
(InP(KEYB_CTRL)&2) && timeout;timeout--)
PortNop;
if (timeout)
OutP(port, val);
else
throw(EXCEPT_LOCAL);
}
I8 KbdCmdRead()
{
U8 timeout;
for (timeout=50000; timeout; timeout--) {
if (InP(KEYB_CTRL) & 1)
return InP(KEYB_PORT);
else
PortNop;
}
return -1;
}
void KbdCmdFlush()
{
I8 i;
for (i=0;i<1000;i++) {
if (InP(KEYB_CTRL) & 1) {
InP(KEYB_PORT);
i=0;
} else
PortNop;
}
}
void KbdSetLEDs(U8 sc)
{
U8 old_flags=GetFlags;
U1 v=0;
AssignBit(&v,0,Bt(&sc,SCf_SCROLL));
AssignBit(&v,1,Bt(&sc,SCf_NUM));
AssignBit(&v,2,Bt(&sc,SCf_CAPS));
Cli;
KbdCmdSend(KEYB_PORT,0xED);
KbdCmdSend(KEYB_PORT,v);
SetFlags(old_flags);
}
void KbdMouseCmdAck(U1 val)
{
U1 b;
U8 timeout=32;
BoolU4 cont=TRUE;
while (cont && timeout) {
try {
KbdCmdSend(KEYB_CTRL,0xD4);
KbdCmdSend(KEYB_PORT,val);
b=KbdCmdRead;
if (b==0xFA)
cont=FALSE;
} catch
Fs->catch_except=TRUE;
timeout--;
}
if (cont)
throw(EXCEPT_LOCAL);
}
void InitKeyboard()
{
KbdCmdSend(KEYB_PORT,0xF0);
KbdCmdSend(KEYB_PORT,0x02);
KbdSetLEDs(sys_cur_scan_code);
}
U1 scan_code_map[0x100]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,SC_SHIFT,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x35,0,0,0,SC_ALT,0,0,0,0,0,0,
0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END,
SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
U1 num_lock_map[0x100]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,8,9,10,0,5,6,7,0,2,
3,4,11,0x34,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x35,0,0,0,SC_ALT,0,0,0,0,0,0,
0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END,
SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
asm {CP_KBD_HANDLER::}
void KbdHandler()
{
void kbd_hand2();
U8 sc=sys_cur_scan_code&~0x1FF,
sc2=InP(KEYB_PORT),sc3,sc_raw;
Bts(&sys_irq_flags,1);
if (sc2==0xE0) {
sys_cur_scan_code|=SCF_PRIOR_E0;
return;
}
AssignBit(&sc2,SCf_KEY_UP,sc2 & 0x80);
AssignBit(&sc2,SCf_E0_PREFIX,Btr(&sc,SCf_PRIOR_E0));
sc_raw=sc2;
if (sc & SCF_NUM) {
if (sc3=num_lock_map[sc2.u1[0]])
sc2.u1[0]=sc3;
} else {
if (sc3=scan_code_map[sc2.u1[0]])
sc2.u1[0]=sc3;
}
if (sc2==SC_SHIFT) {
sc|=SCF_SHIFT;
goto new_key_done;
}
if (sc2==SC_SHIFT+SCF_KEY_UP) {
sc&=~SCF_SHIFT;
goto new_key_done;
}
if (sc2==SC_CTRL) {
sc|=SCF_CTRL;
goto new_key_done;
}
if (sc2==SC_CTRL+SCF_KEY_UP) {
sc&=~SCF_CTRL;
goto new_key_done;
}
if (sc2==SC_ALT) {
sc|=SCF_ALT;
goto new_key_done;
}
if (sc2==SC_ALT+SCF_KEY_UP) {
sc&=~SCF_ALT;
goto new_key_done;
}
if (sc2==SC_CAPS)
goto new_key_done;
if (sc2==SC_CAPS+SCF_KEY_UP) {
sc^=SCF_CAPS;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc2==SC_NUM)
goto new_key_done;
if (sc2==SC_NUM+SCF_KEY_UP) {
sc^=SCF_NUM;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc2==SC_SCROLL)
goto new_key_done;
if (sc2==SC_SCROLL+SCF_KEY_UP) {
sc^=SCF_SCROLL;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc & SCF_CTRL && sc & SCF_ALT) {
if (sc2==SC_DELETE) {
Bts(&sys_flags,SYSf_CTRL_ALT_DEL);
goto mostly_done;
}
if (sc2==1) {
Bts(&sys_flags,SYSf_CTRL_ALT_ESC);
goto mostly_done;
}
if (sc2==15) {
Bts(&sys_flags,SYSf_CTRL_ALT_TAB);
goto mostly_done;
}
if (sc2==0x2D) {
Bts(&sys_flags,SYSf_CTRL_ALT_X);
goto mostly_done;
}
if (sc2==0x2E) {
Bts(&sys_flags,SYSf_CTRL_ALT_C);
goto mostly_done;
}
}
new_key_done:
sc|=SCF_NEW_KEY;
mostly_done:
sys_cur_scan_code=sc|sc2;
sys_cur_raw_scan_code=sc|sc_raw;
if (kbd_hand2=ext[EXT_IRQ01])
kbd_hand2();
Btr(&sys_irq_flags,1);
}
U8 DivU8(U8 n1,U8 n2)
{
U8 r_lo=n1,r_hi=0;
U8 i;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return r_lo;
}
I8 DivI8(I8 n1,I8 n2)
{
U8 r_lo,r_hi=0;
U8 i;
BoolU4 signed;
if (n1<0) {
signed=TRUE;
n1=-n1;
} else
signed=FALSE;
if (n2<0) {
signed=!signed;
n2=-n2;
}
r_lo=n1;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return (signed) ? -r_lo:r_lo;
}
U8 ModU8(U8 n1,U8 n2)
{
U8 r_lo=n1,r_hi=0;
U8 i;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return r_hi;
}
I8 ModI8(I8 n1,I8 n2)
{
U8 r_lo,r_hi=0;
U8 i;
BoolU4 signed;
if (n1<0) {
signed=TRUE;
n1=-n1;
} else
signed=FALSE;
if (n2<0) {
signed=!signed;
n2=-n2;
}
r_lo=n1;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return (signed) ? -r_hi:r_hi;
}
LTDate BootTime()
//Roughly 49,710ths of a second since boot
{
return DivU8(ReadSysTimer<<14,1833333*3*3*3/125);
}
U2 RandU2() //TODO: fix this
{
LTDate i=BootTime;
rnd_SEED^=MulU8(rnd_SEED,0x56234)+i.date^i.time^jiffies+ModU8(rnd_SEED,0x7635);
return rnd_SEED.u2[0];
}
U8 RandU4()
{
U8 result=0;
result.u2[0]=RandU2;
result.u2[1]=RandU2;
return result;
}
I8 ToUpper(I8 ch)
{
if (ch>='a' && ch<='z')
return ch+'A'-'a';
else
return ch;
}
I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL)
{
BoolU4 neg=FALSE;
I1 ch;
I8 result=0,k=0;
if (radix<2||radix>36) return 0;
while (*st==CH_SPACE || *st==CH_SHIFT_SPACE || *st==CH_TAB)
st++;
if (*st=='-') {
st++;
neg=TRUE;
}
if (*st=='+') st++;
while (ch=ToUpper(*st++)) {
k++;
if (radix==10) {
if (ch>='0' && ch<='9')
result=MulI8(result,10)+ch-'0';
else if (k==2 && !result) {
if (ch=='X')
radix=16;
else if (ch=='B')
radix=2;
else if (ch=='o')
radix=8;
else
break;
} else
break;
} else if (radix>10) {
if (ch>='0' && ch<='9')
result=MulI8(result,radix)+ch-'0';
else if (ch>='A' && ch<='A'+radix-11)
result=MulI8(result,radix)+ch-'A'+10;
else
break;
} else {
if (ch>='0' && ch<='0'+radix-1)
result=MulI8(result,radix)+ch-'0';
else
break;
}
}
if (end_ptr) *end_ptr=st-1;
return (neg)? -result:result;
}
void BusyWait(U8 uS) //Loosely timed
{
U8 i;
for (i=0;i<uS;i++)
PortNop;
}
void Sleep(U8 mS)
{
U8 old_flags=GetFlags;
U8 target_jiffies=jiffies+(mS*JIFFY_FREQ/1000);
Sti;
do SwapInNext;
while (jiffies<target_jiffies);
SetFlags(old_flags);
}
void Sound(U8 freq)
{
U8 p,old_flags=GetFlags;
if (Bt(&sys_flags,SYSf_NO_SOUND))
return;
if (freq) {
p=SYS_TIMER_FREQ/freq;
Cli;
OutP(0x43,0xB6);
OutP(0x42,p);
OutP(0x42,p.u1[1]);
OutP(0x61,3);
SetFlags(old_flags);
} else
OutP(0x61,0);
}
void Beep(U8 freq=500,BoolU4 busy=FALSE)
{
Sound(freq);
if (busy) BusyWait(500000);
else Sleep(500);
Sound(0);
if (busy) BusyWait(200000);
else Sleep(200);
}
BoolU4 Externs2Imports(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_EXTERNS_TO_IMPORTS,val);
}
BoolU4 KeepPrivate(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_KEEP_PRIVATE,val);
}
BoolU4 PTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_PARSE_TRACE,val);
}
BoolU4 OTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_OPT_TRACE,val);
}
BoolU4 CTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_COMPILE_TRACE,val);
}
BoolU4 LTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_LEX_TRACE,val);
}
BoolU4 NoRegVar(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_NO_REG_VAR,val);
}
BoolU4 Echo(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val);
}
BoolU4 SysEcho(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val);
}
BoolU4 Silent(BoolU4 val) {
return AssignBit(&Fs->crt_flags,CRTf_SILENT,val);
}
BoolU4 Preempt(BoolU4 val) {
return AssignBit(&sys_flags,SYSf_PREEMPTIVE,val);
}
BoolU4 SysDbg(BoolU4 val) {
return AssignBit(&sys_flags,SYSf_DEBUG,val);
}
BoolU4 IsSysDbg() {
return Bt(&sys_flags,SYSf_DEBUG);
}
BoolU4 Raw(BoolU4 val) {
if (val) {
OutP(VGA_SC_INDEX,VGA_MAP_MASK);
OutP(VGA_SC_DATA,0x0F);
}
return AssignBit(&sys_flags,SYSf_RAW_CRT_OUT,val);
}
BoolU4 IsRaw() {
return Bt(&sys_flags,SYSf_RAW_CRT_OUT);
}
U1 *Caller()
{
U4 *bp=GetBasePtr;
bp=*bp+4;
return *bp;
}
U1 *CallerCaller()
{
U4 *bp=GetBasePtr;
bp=*bp;
bp=*bp+4;
return *bp;
}
void DbgStr(I1 *st,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgStr(",st,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgNum(U8 num,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgNum(",num,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgF(double d,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgF(",d,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgAdd(U4 *add,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
PrintF("DbgAdd(%P)",add);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
D(add,cnt);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
Dm(add,cnt);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
SysHashEntry *FindLocalHash(I1 *st,U8 mask)
{
return FindHashEntry(st,Fs->hash_table,mask);
}
void Beeps(U8 j,BoolU4 busy)
{
U8 i,f;
for (i=0;i<8;i++) {
if (Bt(&j,i+24)) {
f=200;
if (Bt(&j,i+8))
f+=400;
if (Bt(&j,i+16))
f+=800;
Sound(f);
if (busy) {
if (Bt(&j,i))
BusyWait(300000);
else
BusyWait(100000);
} else {
if (Bt(&j,i))
Sleep(400);
else
Sleep(150);
}
Sound(0);
}
if (busy)
BusyWait(150000);
else
Sleep(300);
}
}
void UnrecoverableSysError(U8 j)
{
Cli;
while (TRUE) {
Beeps(j,TRUE);
Raw(ON);
coutln "Unrecoverable SysError:",j;
BusyWait(500000);
}
}
asm {CP_BREAK::}
void Break()
{
ReleaseTaskPartitions;
IntFlushMsgs;
throw(EXCEPT_BREAK);
}
void ThrowDivide(U1 *eip)
{
throw(EXCEPT_ARITHMETIC,eip);
}
void ThrowFloating(U1 *eip)
{
throw(EXCEPT_FLOATING,eip);
}
SysHashEntry *FindPSect(U8 add,I8 *offset)
{
SysHashEntry *result=NULL,*temph;
SysHashTable *h=Fs->hash_table;
ClassStruct *tempc;
U8 i,best=0x8000,j;
while (h) {
for (i=0;i<=h->mask;i++) {
temph=h->body[i];
while (temph) {
if (temph->type&HTT_FUNCTION) {
tempc=temph;
j=tempc->executable_address;
} else
j=temph->user0;
j=add-j;
if (temph->type&(HTT_SYS_SYMBOL|HTT_FUNCTION)) {
if (j<best) {
best=j;
result=temph;
}
}
temph=temph->next;
}
}
h=h->next;
}
*offset=best;
return result;
}
U8 GetS(I1 *buf,U8 size)
{
I8 ch;
I1 *buf2;
U8 i=0;
void my_SysGetS();
if (!size || !buf) return 0;
i=FindExtern("SysGetS");
if (i) {
my_SysGetS=i;
buf2=my_SysGetS();
if (StrLen(buf2)>size-1) {
MemCpy(buf,buf2,size-1);
buf[size-1]=0;
} else
StrCpy(buf,buf2);
i=StrLen(buf);
Free(buf2);
} else {
while (TRUE) {
ch=GetKey;
if (ch==CH_CR) {
PutChar(ch);
break;
} if (ch==CH_BACKSPACE) {
if (i>0) {
i--;
PutChar(ch);
}
} else {
if (i<size-1) {
buf[i++]=ch;
PutChar(ch);
}
}
}
buf[i]=0;
}
return i;
}
+1129
View File
File diff suppressed because it is too large. Load diff
+318
View File
@@ -0,0 +1,318 @@
BoolU8 AssignBit(void *field,U8 bit,U8 val)
{
if (val)
return Bts(field,bit);
else
return Btr(field,bit);
}
BoolU8 LAssignBit(void *field,U8 bit,U8 val)
{
if (val)
return LBts(field,bit);
else
return LBtr(field,bit);
}
void PortNop()
{
InP(0x379); //This is an innoculous ISA (parallel port)
//access which should take
//fixed time on all machines.
//It takes 1.66uS
}
void Exit()
{
Bts(&Fs->task_flags,TSSf_KILL_TASK);
while (TRUE)
SwapInNext;
}
BoolU8 ValidateTss(TssStruct *tss)
{
if (tss->absolute_address!=tss)
return FALSE;
if (tss->in_queue_signature!=TSSS_IN_QUEUE_SIGNATURE)
return FALSE;
return TRUE;
}
void Kill(TssStruct *tss,BoolU4 wait=TRUE)
{
U8 i;
CPUStruct *c;
BoolU4 found,old_preempt=Preempt(OFF);
if (ValidateTss(tss)) {
found=FALSE;
if (tss==sys_update_screen_tss)
found=TRUE;
for (i=0;i<mp_cnt;i++) {
c=mp_cpu_structs+sizeof(CPUStruct)*i;
if (tss==c->cain_tss)
found=TRUE;
}
if (!found) {
Bts(&tss->task_flags,TSSf_KILL_TASK);
if (wait) {
do {
SwapInNext;
if (!Bt(&tss->task_flags,TSSf_KILL_TASK))
break;
} while (ValidateTss(tss));
}
}
}
Preempt(old_preempt);
}
void SimpleTimerIrq(U8 rip)
{
U8 old_flags=GetFlags;
nounusedwarn rip;
Cli;
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_SYS_TIMER],0));
sys_jiffies++;
t=1.0*sys_jiffies/JIFFY_FREQ;
sys_timer+=SYS_TIMER0_PERIOD+1;
LBtr(&sys_semas[SYS_SEMA_SYS_TIMER],0);
if (mp_cnt>1)
MPIntAll(0x20);
SetFlags(old_flags);
}
U8 Jiffies()
{
return sys_jiffies;
}
U8 ReadSysTimer()
{
I8 i;
U8 result,old_flags=GetFlags;
Cli;
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_SYS_TIMER],0));
OutP(0x43,0); //Latch Timer0
if ((i=InP(0x40)+InP(0x40)<<8)==SYS_TIMER0_PERIOD) {
if (InP(0x20) & 1)
i=-1;
}
result=sys_timer+SYS_TIMER0_PERIOD-i;
LBtr(&sys_semas[SYS_SEMA_SYS_TIMER],0);
SetFlags(old_flags);
return result;
}
U8 TssTotalTime()
{
U8 old_flags=GetFlags;
U8 result;
Cli;
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_TIMESTAMP],0));
result=GetTimeStamp-Fs->time_slice_start+Fs->total_time;
LBtr(&sys_semas[SYS_SEMA_TIMESTAMP],0);
SetFlags(old_flags);
return result;
}
LTDate BootTime()
//Roughly 49,710ths of a second since boot
{
return ReadSysTimer<<14/(1833333*3*3*3/125);
}
void BusyWait(U8 uS) //Loosely timed
{
U8 i;
uS=uS<<1/3;
for (i=0;i<uS;i++)
PortNop;
}
void Sleep(U8 mS)
//This routine is not for power-saving
//it is to make a program pause without
//hogging the CPU.
{
U8 target_val;
BoolU4 old_idle;
if (!mS)
SwapInNext;
else {
old_idle=Bts(&Fs->task_flags,TSSf_IDLE);
target_val=GetTimeStamp+mS*time_stamp_kHz_freq;
do SwapInNext;
while (Fs->time_slice_start<target_val);
AssignBit(&Fs->task_flags,TSSf_IDLE,old_idle);
}
}
U8 RandU2()
{
U8 i=GetTimeStamp;
rnd_SEED^=rnd_SEED*0x763D+i.u4[0]^i.u4[1]+rnd_SEED%0x56233;
return rnd_SEED.u2[0];
}
U8 RandU4()
{
U8 result=0;
result.u2[0]=RandU2;
result.u2[1]=RandU2;
return result;
}
U8 RandU8()
{
U8 result;
result.u2[0]=RandU2;
result.u2[1]=RandU2;
result.u2[2]=RandU2;
result.u2[3]=RandU2;
return result;
}
void Sound(U8 freq)
{
U8 p,old_flags=GetFlags;
if (Bt(&sys_semas[SYS_SEMA_NO_SOUND],0))
return;
Cli;
if (!LBts(&sys_semas[SYS_SEMA_SOUND],0)) {
if (freq) {
p=SYS_TIMER_FREQ/freq;
OutP(0x43,0xB6);
OutP(0x42,p);
OutP(0x42,p.u1[1]);
OutP(0x61,3|InP(0x61));
} else
OutP(0x61,InP(0x61)&~3);
LBtr(&sys_semas[SYS_SEMA_SOUND],0);
}
SetFlags(old_flags);
}
void Beep(U8 freq=500,BoolU4 busy=FALSE)
{
Sound(freq);
if (busy) BusyWait(500000);
else Sleep(500);
Sound(0);
if (busy) BusyWait(200000);
else Sleep(200);
}
BoolU8 Externs2Imports(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_EXTERNS_TO_IMPORTS,val);
}
//Private symbols are accessible but
//don't show-up in reports
BoolU8 KeepPrivate(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_KEEP_PRIVATE,val);
}
//Displays intermediate code as it is being added
BoolU8 PTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_PARSE_TRACE,val);
}
//Displays intermediate code after passes through optimization
BoolU8 OTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_OPT_TRACE,val);
}
//Controls which optimizerpasses are displayed
U8 OPassTraceMask(U8 i=0b100111111) {
U8 old=Fs->last_lex->pass_trace_mask;
Fs->last_lex->pass_trace_mask=i;
return old;
}
//Turn on compiler option
//See $LK,"OPTf_IGNORE_OVERFLOW","MN:OPTf_IGNORE_OVERFLOW"$
BoolU8 OptOn(U8 num) {
return Bts(&Fs->last_lex->opts,num);
}
//Turn off compiler option
//See $LK,"OPTf_IGNORE_OVERFLOW","MN:OPTf_IGNORE_OVERFLOW"$
BoolU8 OptOff(U8 num) {
return Btr(&Fs->last_lex->opts,num);
}
//Get state of compiler option
//See $LK,"OPTf_IGNORE_OVERFLOW","MN:OPTf_IGNORE_OVERFLOW"$
BoolU8 GetOpt(U8 num) {
return Bt(&Fs->last_lex->opts,num);
}
//Displays assembly code output
BoolU8 CTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_COMPILE_TRACE,val);
}
//Displays lexical analyser's output
BoolU8 LTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_LEX_TRACE,val);
}
BoolU8 NoRegVar(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_NO_REG_VAR,val);
}
//Displays text as it is being compiled
BoolU8 Echo(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val);
}
BoolU8 SysEcho(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val);
}
BoolU8 Silent(BoolU4 val) {
return AssignBit(&Fs->crt_flags,CRTf_SILENT,val);
}
BoolU8 IOSound(BoolU4 val) {
return !LAssignBit(&sys_semas[SYS_SEMA_NO_IO_SOUND],0,!val);
}
BoolU8 IsPreempt() {
return Bt(&Fs->task_flags,TSSf_PREEMPT);
}
BoolU8 SysDbg(BoolU4 val) {
//Sets or resets a bit which you can
//use while debugging.
return LAssignBit(&sys_semas[SYS_SEMA_DEBUG],0,val);
}
BoolU8 IsSysDbg() {
//Returns the value of the debug
//bit.
return Bt(&sys_semas[SYS_SEMA_DEBUG],0);
}
BoolU8 Raw(BoolU4 val) {
//Switches to direct screen output
//mode for when you don't have
//a working window.
return !LAssignBit(&Fs->task_flags,TSSf_NOT_RAW,!val);
}
BoolU8 IsRaw() {
return !Bt(&Fs->task_flags,TSSf_NOT_RAW);
}
SysHashEntry *FindLocalHash(I1 *st,U8 mask)
{
return FindHashEntry(st,Fs->hash_table,mask);
}
+283
View File
@@ -0,0 +1,283 @@
asm {
////**************************PROCEDURE*************************
ALIGN 16,0x90
USE16
MP_INIT_START::
JMP MP2_START2
ALIGN 4,OC_NOP
MP2_SYS_TEMP_PTR: DU4 0,0;
MP2_START2:
CLI
// MOV EAX,CR0
DU1 0x0F,0x20,0xC0;
OR EAX,0x60000000
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
INVD
MOV AX,MP_VECTOR_ADDRESS/16
MOV DS,AX
LGDT U4 [MP_SYS_TEMP_PTR]
MOV EAX,SYS_START_CR0|0x60000000
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0x66,0xEA; //JMP SYS_CS_SEL:MP_INIT_OS
DU4 MP_INIT_OS;
DU2 SYS_CS_SEL;
MP_INIT_END::
USE32
MP_INIT_OS:
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV EDI,U4 [SYS_UNCACHED_MP_CNT]
MOV ESI,U4 [EDI] //TODO: not perfect
LOCK
INC U4 [EDI]
// MOV EAX,CR0
DU1 0x0F,0x20,0xC0;
AND EAX,~0x60000000 //enable cache
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
IMUL2 ESI,CPU_STRUCT_SIZE
ADD ESI,U4 [SYS_MP_CPU_STRUCTS]
LEA EAX,U4 CPU_START_STACK_TOP[ESI]
MOV ESP,EAX
PUSH U4 SYS_START_RFLAGS
POPFD
PUSH U4 0
CALL INIT_EM64T
USE64
PUSH RSI
CALL CP_PUT_GS_BASE
POP RSI
@@2: MOV RBX,U8 CPU_CAIN_TSS[RSI]
OR RBX,RBX
JZ @@2
MOV RAX,RBX
CALL PUT_FS_BASE
MOV RAX,U4 SYS_TEMP_PTR
MOV U2 [RAX],MAXIDT*16-1
MOV U4 2[RAX],SYS_IDTTAB
MOV U2 6[RAX],0
MOV U4 8[RAX],0
REX
LIDT U4 [RAX]
JMP U4 RESTORE_CONTEXT
}
void MPInt(U8 num,U8 cpu_num=1)
{
U4 *dl=MP_ICR_LOW,*dh=MP_ICR_HIGH;
U8 old_flags=GetFlags;
Cli;
while (*dl&0x1000); //TODO semaphore
*dh=cpu_num<<24;
*dl=0x4800+num;
SetFlags(old_flags);
}
void MPIntAll(U8 num)
{
U4 *dl=MP_ICR_LOW;
U8 old_flags=GetFlags;
Cli;
while (*dl&0x1000); //TODO semaphore
*dl=0xC4800+num;
SetFlags(old_flags);
}
void MPNMInt()
{
U4 *dl=MP_ICR_LOW;
*dl=0xC4400;
}
void MPHalt()
{
MPNMInt; //Hlt All other processors
}
void MPInitAPIC()
{
U4 *d;
d=MP_SVR;
*d=*d|MP_APIC_ENABLED;
d=MP_LDR;
*d=Gs->num<<24;
d=MP_DFR;
*d=0xF0000000;
MemSet(MP_IRR,0,0x20);
MemSet(MP_ISR,0,0x20);
MemSet(MP_TMR,0,0x20);
SetTR(Gs->tr);
}
void MPWaitForTask()
{
MPCmdStruct *tempm;
Bts(&Fs->task_flags,TSSf_IDLE);
while (TRUE) {
WbInvd;
FinishOffDyingTsses;
while (mp_ctrl->next_waiting==mp_ctrl)
SwapInNext;
while (LBts(&mp_ctrl->flags,MPCCf_LOCKED))
SwapInNext;
tempm=mp_ctrl->next_waiting;
RemQue(tempm);
LBtr(&mp_ctrl->flags,MPCCf_LOCKED);
if (tempm!=mp_ctrl) {
Btr(&Fs->task_flags,TSSf_IDLE);
switch (tempm->cmd_code) {
case MPCT_CALL:
CallInd(tempm->add,tempm->data);
break;
case MPCT_SPAWN_TASK:
Spawn(tempm->add,"MP Job");
break;
}
if (Bt(&tempm->flags,MPCf_FREE_ON_COMPLETE))
FreeHC(tempm,mp_heap);
else {
while (LBts(&mp_ctrl->flags,MPCCf_LOCKED))
SwapInNext;
InsQue(tempm,mp_ctrl->last_done);
LBtr(&mp_ctrl->flags,MPCCf_LOCKED);
}
LBtr(&Gs->flags,CPUf_NOT_READY);
Bts(&Fs->task_flags,TSSf_IDLE);
}
}
}
void MPQueueJob(void *add,void *data=NULL,
U8 flags=1<<MPCf_FREE_ON_COMPLETE,BoolU4 spawn=FALSE)
{
MPCmdStruct *tempm=MAllocHCZ(sizeof(MPCmdStruct),mp_heap);
if (spawn)
tempm->cmd_code=MPCT_SPAWN_TASK;
else
tempm->cmd_code=MPCT_CALL;
tempm->add=add;
tempm->data=data;
tempm->flags=flags;
while (LBts(&mp_ctrl->flags,MPCCf_LOCKED))
SwapInNext;
InsQue(tempm,mp_ctrl->last_waiting);
LBtr(&mp_ctrl->flags,MPCCf_LOCKED);
}
void MPInitCPUTsk()
{
MPInitAPIC;
Fs->rip=&MPWaitForTask;
Fs->time_slice_start=GetTimeStamp;
RestoreContext;
}
void MPStart()
{
TssStruct *tss;
I1 buf[128];
U4 *d;
MPMainStruct *mp=MP_VECTOR_ADDRESS;
I8 i=0;
CPUStruct *c;
BoolU4 old_preempt=Preempt(OFF);
I8 shared_blks;
if (mp_cnt>1) {
Preempt(old_preempt);
return;
}
MemCpy(MP_VECTOR_ADDRESS,MP_INIT_START,MP_INIT_END-MP_INIT_START);
mp->sys_temp_ptr=MAXGDT*16-1+gdttab<<16;
mp_cnt=1;
*uncached_mp_cnt=1;
d=MP_LVT3;
*d=*d&0xFFFFFF00+MP_VECTOR;
WbInvd;
d=MP_ICR_LOW;
*d=0xCC500; //assert init IPI
BusyWait(10000);
*d=0xC4600+MP_VECTOR; //start-up
BusyWait(200);
*d=0xC4600+MP_VECTOR;$FG$
BusyWait(10000);
mp_cnt=*uncached_mp_cnt;
for (i=1;i<mp_cnt;i++) {
c=mp_cpu_structs+sizeof(CPUStruct)*i;
SPrintF(buf,"Cain Task CPU#%d",i);
tss=Spawn(&MPInitCPUTsk,buf,NULL,NULL,DEFAULT_STACK,FALSE);
tss->in_queue_signature=TSSS_IN_QUEUE_SIGNATURE;
tss->gs=InitCPUStruct(i,c);
shared_blks=1; //One 2Meg blk
c->cpu_heap=Alloc2MegMemBlks(&shared_blks);
InitHeapCtrl(c->cpu_heap,shared_blks<<12);
c->tr=InitTssStruct2;
c->cain_tss=tss;
WbInvd;
}
Preempt(old_preempt);
}
void MPInit()
{
I8 shared_blks=1; //One 2Meg blk
TssStruct *tss;
RaxRbxRcxRdx e;
CPUStruct *c;
CpuId(0x1,&e);
mp_cnt=1;
mp_heap=AllocUncachedMemBlks(&shared_blks);
InitHeapCtrl(mp_heap,shared_blks<<12);
uncached_mp_cnt=MAllocHC(sizeof(U8),mp_heap);
*uncached_mp_cnt=1;
mp_ctrl=MAllocHCZ(sizeof(MPCmdCtrl),mp_heap);
mp_ctrl->next_waiting=mp_ctrl;
mp_ctrl->last_waiting=mp_ctrl;
mp_ctrl->next_done=&mp_ctrl->next_done;
mp_ctrl->last_done=&mp_ctrl->next_done;
mp_cpu_structs=MAllocHCZ(sizeof(CPUStruct)*MP_MAX_PROCESSORS,mp_heap);
c=mp_cpu_structs;
MemCpy(c,&sys_temp_cpu0_struct,sizeof(CPUStruct));
c->absolute_address=c;
SetGs(c);
tss=adam_tss;
tss->time_slice_start=GetTimeStamp;
tss->in_queue_signature=TSSS_IN_QUEUE_SIGNATURE;
c->cain_tss=tss;
c->tr=InitTssStruct2;
SwapInNext; //Store FPU for spawn
if (Bt(&e.rdx,9))
MPInitAPIC;
}
-30
View File
@@ -1,30 +0,0 @@
#include "ADAMK.HPZ"
asm {
#include "OSINC"
ALIGN 16,0x90
SYS_CS_START::
#include "OSMAIN"
#include "IRQHAND"
#include "MEM"
#include "FONT8x8"
#include "SYSUTILS"
#include "SCHED"
#include "CHARIO"
}
#include "ADAMK2.HPZ"
#include "START"
#include "MEM"
#include "CRT"
#include "MISC"
#include "CMD"
#include "DATE"
#include "STRINGS"
#include "SYSTEXT"
#include "SPRINTF"
#include "QSORT"
#include "COMPRESS"
#include "DISK1"
#include "DISK2"
#include "DISK3"
#include "DISK4"
#include "END"
+2518 -2367
View File
File diff suppressed because it is too large. Load diff
BIN
View File
Binary file not shown.
+350
View File
@@ -0,0 +1,350 @@
STRUC 0
SF_RBP: DU8 ?;
SF_RIP: DU8 ?;
SF_PARAM1: DU8 ?;
SF_PARAM2: DU8 ?;
SF_PARAM3: DU8 ?;
SF_PARAM4: DU8 ?;
SF_PARAM5: DU8 ?;
SF_PARAM6: DU8 ?;
SF_PARAM7: DU8 ?;
SF_PARAM8: DU8 ?;
ENDS
STRUC 0
NULL_SEL: DU8 ?,?;
SYS_BOOT_DS_SEL: DU8 ?,?;
SYS_BOOT_CS_SEL: DU8 ?,?;
SYS_CS_SEL: DU8 ?,?;
SYS_CS64_SEL: DU8 ?,?;
ZERO_DS_SEL: DU8 ?,?;
FIRST_FREE_SEL:
ENDS
STRUC 0
EXCEPT_NEXT: DU8 ?;
EXCEPT_LAST: DU8 ?;
EXCEPT_HANDLER_START: DU8 ?;
EXCEPT_HANDLER_SKIP: DU8 ?;
EXCEPT_RSP: DU8 ?;
EXCEPT_RBP: DU8 ?;
EXCEPT_RFLAGS: DU8 ?;
EXCEPT_RSI: DU8 ?;
EXCEPT_RDI: DU8 ?;
EXCEPT_R12: DU8 ?;
EXCEPT_R13: DU8 ?;
EXCEPT_R14: DU8 ?;
EXCEPT_R15: DU8 ?;
EXCEPT_STRUCT_SIZE:
ENDS
STRUC 0
BPT_NEXT:: DU8 ?;
BPT_ADDRESS:: DU8 ?;
BPT_FLAGS:: DU4 ?;
BPT_U1:: DU1 ?;
ENDS
STRUC 0 $LK+BK,"Redundent C+ Struct","FF:/LT/OSMain/AdamK.HPZ,class TssStruct"$
TSS_ABSOLUTE_ADDRESS: DU8 ?;
TSS_TASK_FLAGS: DU8 ?;
TSS_CRT_FLAGS: DU8 ?;
TSS_CUR_LTF: DU8 ?;
TSS_AUX_LTF: DU8 ?;
TSS_WIN_LEFT: DU8 ?;
TSS_WIN_RIGHT: DU8 ?;
TSS_WIN_TOP: DU8 ?;
TSS_WIN_BOTTOM: DU8 ?;
TSS_CUR_PARTITION: DU8 ?;
TSS_CUR_DIR: DU8 ?;
TSS_PARENT_TSS: DU8 ?;
TSS_NEXT_TSS: DU8 ?; //ABSOLUTE ADDRESS OF NEXT TSS
TSS_LAST_TSS: DU8 ?; //ABSOLUTE ADDRESS OF LAST TSS
TSS_NEXT_INPUT_FILTER_TSS: DU8 ?;
TSS_LAST_INPUT_FILTER_TSS: DU8 ?;
TSS_NEXT_SIBLING_TSS: DU8 ?;
TSS_LAST_SIBLING_TSS: DU8 ?;
TSS_NEXT_CHILD_TSS: DU8 ?;
TSS_LAST_CHILD_TSS: DU8 ?;
TSS_WIN_PIXEL_LEFT: DU8 ?; //These are derived
TSS_WIN_PIXEL_RIGHT: DU8 ?;
TSS_WIN_PIXEL_TOP: DU8 ?;
TSS_WIN_PIXEL_BOTTOM: DU8 ?;
TSS_WIN_BORDER_PIXEL_LEFT: DU8 ?; //These are derived
TSS_WIN_BORDER_PIXEL_RIGHT: DU8 ?;
TSS_WIN_BORDER_PIXEL_TOP: DU8 ?;
TSS_WIN_BORDER_PIXEL_BOTTOM: DU8 ?;
TSS_RIP: DU8 ?;
TSS_RFLAGS: DU8 ?;
TSS_RAX: DU8 ?;
TSS_RCX: DU8 ?;
TSS_RDX: DU8 ?;
TSS_RBX: DU8 ?;
TSS_RSP: DU8 ?;
TSS_RBP: DU8 ?;
TSS_RSI: DU8 ?;
TSS_RDI: DU8 ?;
TSS_R8: DU8 ?;
TSS_R9: DU8 ?;
TSS_R10: DU8 ?;
TSS_R11: DU8 ?;
TSS_R12: DU8 ?;
TSS_R13: DU8 ?;
TSS_R14: DU8 ?;
TSS_R15: DU8 ?;
TSS_GS: DU8 ?;
TSS_HEAP_HASH: DU1 HEAP_HASH_SIZE DUP (?);
TSS_FPU: DU1 112 DUP(?);
TSS_TIME_SLICE_START: DU8 ?;
TSS_TOTAL_TIME: DU8 ?;
TSS_SWAP_CNTER: DU8 ?;
TSS_UPDATE_WIN: DU8 ?;
TSS_TASK_DESCRIPTOR: DU1 (TSS_DESC_LENGTH+1) DUP (?);
TSS_TASK_DESCRIPTOR2: DU1 (TSS_DESC_LENGTH+1) DUP (?);
TSS_DOUBLE_BUF_CUR_LTF: DU8 ?;
TSS_DOUBLE_BUF_AUX_LTF: DU8 ?;
TSS_SCROLL_SPEED: DU4 ?;
TSS_TEXT_ATTRIBUTE: DU1 ?;
TSS_BORDER_ATTRIBUTE: DU1 ?;
DU2 ?; //Unused
TSS_SCROLL_X: DU8 ?;
TSS_SCROLL_Y: DU8 ?;
TSS_STACK_BASE: DU8 ?;
TSS_STACK_SIZE: DU8 ?;
TSS_MEM_SIZE: DU8 ?;
TSS_NEXT_MEM_BLK: DU8 ?;
TSS_LAST_MEM_BLK: DU8 ?;
TSS_MALLOC_FREE_LIST: DU8 ?;
TSS_NEXT_EXCEPT: DU8 ?;
TSS_LAST_EXCEPT: DU8 ?;
TSS_EXCEPT_RBP: DU8 ?;
TSS_EXCEPT_ARGC: DU8 ?;
TSS_EXCEPT_ARGV: DU8 ?;
TSS_CATCH_EXCEPT: DU4 ?;
TSS_IGNORE_EXCEPT: DU4 ?;
TSS_BPT_LIST: DU8 ?;
TSS_NEXT_ODE: DU8 ?;
TSS_LAST_ODE: DU8 ?;
TSS_HASH_TABLE: DU8 ?;
TSS_ACCOUNT: DU8 ?;
TSS_NEXT_SERVANT_CMD: DU8 ?;
TSS_LAST_SERVANT_CMD: DU8 ?;
TSS_NEXT_MASTER_CMD: DU8 ?;
TSS_LAST_MASTER_CMD: DU8 ?;
TSS_NEXT_LEX: DU8 ?;
TSS_LAST_LEX: DU8 ?;
TSS_END_TASK_CB: DU8 ?;
TSS_USER_NUM: DU4 ?;
TSS_FAULT_NUM: DU4 ?;
TSS_ANSWERS: DU8 8 DUP(?);
TSS_DOUBLE_ANSWERS: DU8 8 DUP(?);
TSS_ANSWERS_TYPES: DU4 8 DUP(?);
TSS_ANSWERS_DISPLAYED: DU4 ?;
TSS_IN_QUEUE_SIGNATURE: DU4 ?;
TSS_DBG: DU8 ?;
TSS_POPUP: DU8 ?;
TSS_LOCALCHNL: DU8 ?;
TSS_RMTCHNL: DU8 ?;
TSS_USER_DATA0: DU8 ?;
TSS_USER_DATA1: DU8 ?;
TSS_USER_DATA2: DU8 ?;
TSS_USER_DATA3: DU8 ?;
TSS_STRUCT_SIZE:
ENDS
STRUC 0
HT_NEXT: DU8 ?;
HT_MASK: DU8 ?;
HT_BODY:
ENDS
STRUC 0
HTE_NEXT: DU8 ?;
HTE_STR: DU8 ?;
HTE_TYPE: DU4 ?;
HTE_USE_CNT: DU4 ?;
HTE_SOURCE_LINK: DU8 ?;
HTE_INDEX: DU8 ?;
HTE_DEBUG: DU8 ?;
HTE_USER_DATA0: DU8 ?;
ENDS
STRUC 0
SP_R15: DU8 ?;
SP_R14: DU8 ?;
SP_R13: DU8 ?;
SP_R12: DU8 ?;
SP_R11: DU8 ?;
SP_R10: DU8 ?;
SP_R9: DU8 ?;
SP_R8: DU8 ?;
SP_RDI: DU8 ?;
SP_RSI: DU8 ?;
SP_RBP: DU8 ?;
SP_RBX: DU8 ?;
SP_RDX: DU8 ?;
SP_RCX: DU8 ?;
SP_RAX: DU8 ?;
SP_STRUCT_SIZE:
SP_RIP: DU8 ?;
SP_PARAM1: DU8 ?;
SP_PARAM2: DU8 ?;
SP_PARAM3: DU8 ?;
SP_PARAM4: DU8 ?;
SP_PARAM5: DU8 ?;
SP_PARAM6: DU8 ?;
SP_PARAM7: DU8 ?;
SP_PARAM8: DU8 ?;
SP_PARAM9: DU8 ?;
SP_PARAM10: DU8 ?;
SP_PARAM11: DU8 ?;
SP_PARAM12: DU8 ?;
ENDS
STRUC 0
SC_R11: DU8 ?;
SC_R10: DU8 ?;
SC_R9: DU8 ?;
SC_R8: DU8 ?;
SC_RBP: DU8 ?;
SC_RBX: DU8 ?;
SC_RDX: DU8 ?;
SC_RCX: DU8 ?;
SC_RAX: DU8 ?;
SC_STRUCT_SIZE:
SC_RIP: DU8 ?;
SC_PARAM1: DU8 ?;
SC_PARAM2: DU8 ?;
SC_PARAM3: DU8 ?;
SC_PARAM4: DU8 ?;
SC_PARAM5: DU8 ?;
SC_PARAM6: DU8 ?;
SC_PARAM7: DU8 ?;
SC_PARAM8: DU8 ?;
SC_PARAM9: DU8 ?;
SC_PARAM10: DU8 ?;
SC_PARAM11: DU8 ?;
SC_PARAM12: DU8 ?;
ENDS
STRUC 0
C_HASH_NEXT: DU8 ?;
C_HASH_STR: DU8 ?;
C_HASH_TYPE: DU4 ?;
C_USE_CNT: DU4 ?;
C_SOURCE_LINK: DU8 ?;
C_INDEX: DU8 ?;
C_DEBUG: DU8 ?;
C_MEM_CNT: DU2 ?;
C_PARAM_CNT: DU2 ?; //FOR FUNCTIONS
C_SIZE: DU4 ?; //Must be in same position as HTE_USER1
C_MEM_LIST: DU8 ?; //MEMBER LIST
C_MEM_LIST_LAST: DU8 ?;
C_STATEMENTS: DU8 ?; //For functions
ENDS
STRUC 0
IC_CODE: DU2 ?;
IC_PRECIDENCE: DU2 ?;
IC_CNT: DU2 ?;
IC_PAD: DU2 ?;
IC_FLAGS: DU8 ?;
IC_DATA: DU8 ?;
IC_CLASS: DU8 ?;
IC_LINE: DU8 ?;
IC_PARAMS: DU1 12*4 DUP (?);
IC_EXT_BODY: DU8 ?;
IC_BODY: DU1 IC_BODY_SIZE DUP (?);
IC_STRUCT_SIZE:
ENDS
STRUC 0
ATE_NEXT: DU8 ?;
ATE_BASECODE: DU2 ?;
ATE_CH: DU1 ?,?;
ATE_PAD2: DU4 ?;
ATE_STRUCT_SIZE:
ENDS
STRUC 0
ACS_SRC_POS: DU8 ?;
ACS_SRC_SIZE: DU8 ?;
ACS_DST_POS: DU8 ?;
ACS_DST_SIZE: DU8 ?;
ACS_SRC_BUF: DU8 ?;
ACS_DST_BUF: DU8 ?;
ACS_MIN_BITS: DU8 ?;
ACS_MIN_TABLE_ENTRY: DU8 ?;
ACS_CUR_ENTRY: DU8 ?;
ACS_NEXT_ENTRY: DU8 ?;
ACS_CUR_BITS_IN_USE: DU8 ?;
ACS_NEXT_BITS_IN_USE: DU8 ?;
ACS_STACK_PTR: DU8 ?;
ACS_STACK_BASE: DU8 ?;
ACS_FREE_INDEX: DU8 ?;
ACS_FREE_LIMIT: DU8 ?;
ACS_SAVED_BASECODE: DU8 ?;
ACS_ENTRY_USED: DU8 ?;
ACS_LAST_CH: DU8 ?;
ACS_COMPRESS: DU8 (ARC_MAX_TABLE_ENTRY+1)*2 DUP(?);
ACS_HASH: DU8 ARC_MAX_TABLE_ENTRY+1 DUP(?);
ACS_STRUCT_SIZE:
ENDS
STRUC 0
MP_JMP: DU4 ?;
MP_SYS_TEMP_PTR: DU8 ?;
ENDS
STRUC 0
CPU_ABSOLUTE_ADDRESS: DU8 ?;
CPU_FLAGS: DU8 ?;
CPU_NUM: DU8 ?;
CPU_CAIN_TSS: DU8 ?;
CPU_TR: DU8 ?;
CPU_IDLE_POINT_HITS: DU8 ?;
CPU_IDLE_FACTOR: DU8 ?;
CPU_SWAP_CNTER: DU8 ?;
CPU_STARTUP_RIP: DU8 ?;
CPU_START_STACK: DU8 8 DUP(?);
CPU_START_STACK_TOP:
CPU_DYING_TSS_LIST: DU8 ?;
CPU_HEAP: DU8 ?;
CPU_GRBASE: DU8 ?;
CPU_STRUCT_SIZE:
ENDS
//Multiprocessor stuff
#define MP_ICR_LOW 0xFEE00300
#define MP_ICR_HIGH 0xFEE00310
#define MP_EOI 0xFEE000B0
#define MP_SVR 0xFEE000F0
#define MP_APIC_ID 0xFEE00020
#define MP_LVT1 0xFEE00350
#define MP_LVT2 0xFEE00360
#define MP_LVT3 0xFEE00370
#define MP_APIC_ENABLED 0x100
#define MP_VECTOR 0x30
#define MP_VECTOR_ADDRESS (MP_VECTOR<<12)
#define MP_LDR 0xFEE000D0
#define MP_DFR 0xFEE000E0
#define MP_IRR 0xFEE00200
#define MP_ISR 0xFEE00100
#define MP_TMR 0xFEE00180
#define IA32F_LME 0x100
#define IA32F_SCE 0x001
#define IA32_EFER 0xC0000080
#define IA32_FS_BASE 0xC0000100
#define IA32_GS_BASE 0xC0000101
+152 -106
View File
@@ -1,65 +1,82 @@
void InitSysGlbls()
{
sys_timer=0;
jiffies=0;
sys_jiffies=0;
rnd_SEED = 93186752;
time_stamp_freq=2676302000; //give reasonable value
time_stamp_kHz_freq=time_stamp_freq/1000;
sys_cur_focus_task=Fs;
sys_update_screen_tss=NULL;
MemSet(sema_irqs,0,NUM_IRQ_SEMAS*sizeof(sema));
MemSet(sema_irq_busy,0,NUM_IRQ_SEMAS*sizeof(sema));
num_spawned_users=0;
compiled_lines=0;
compiled_functions=0;
ext[EXT_IRQ00]=&SimpleTimerIrq;
StrCpy(sys_temp_filename,"::/LT/DOC/TEMP.TXZ");
StrCpy(sys_temp_filename,"HOME/Temp.TXZ");
sys_macro_queue.next=&sys_macro_queue;
sys_macro_queue.last=&sys_macro_queue;
mouse_evt_time=0;
kbd_evt_time=0;
kbdmouse_fifo=NewU1Fifo(128);
MemSet(&sys_put_key_queue,0,sizeof(KeyDevStruct));
sys_put_key_queue.next=&sys_put_key_queue;
sys_put_key_queue.last=&sys_put_key_queue;
AddKeyDev(&InputFilterPutKey,&InputFilterPutS,0x40000000);
AddKeyDev(&RawCrtPutKey,&RawCrtPutS,0x60000000);
macro_util_tss=NULL;
ip_inhibit_win_operations=FALSE;
local_time_offset=0;
LTDCBase=NULL;
LTDCHashTable=NULL;
ltcd_base=NULL;
ltdc_hash_table=NULL;
sysdbg0=0; sysdbg1=0;
sysdbg2=0; sysdbg3=0;
progress1=0; progress2=0;
progress3=0; progress4=0;
default_iso_name="::/Temp/CDDVD.ISO";
exe {
I1 *buf,*buf2;
#exe {
I1 *buf;
LTDate ltdt;
buf=PmtStr("Start-up Accnt(ENTER will prompt):","");
buf2=PmtStr("Wordstat directory list(separated by ';'):","");
ExePrintF("sys_startup_account=\"%s\";\r\n",buf);
ExePrintF("wordstat_mask=\"%s\";\r\n",buf2);
Free(buf);
Free(buf2);
ltdt=GetCurTimeLTDate;
ExePrintF("sys_compile_time=\"%D %T\";\r\n",ltdt.date,ltdt.time);
buf=PmtStr("Disk Cache Size (ENTER will use default of %s Bytes):","0x1000000");
ExePrintF("sys_compile_time=0x%X;\r\n",ltdt);
buf=PmtStr("Disk Cache Size, gets rounded-up funny, (ENTER will use default of %s Bytes):","0x8000000");
ExePrintF("LTDCInitCache(%s);",buf);
Free(buf);
}
}
void AddModuleHash(I1 *name,U8 base)
{
SysHashEntry *temph,**temph1;
SysHashEntry *temph;
temph=MAllocZ(sizeof(SysHashEntry));
temph->type=HTT_MODULE|HTT_PUBLIC;
temph->use_cnt=0;
temph->user0=base;
temph->user_data0=base;
temph->source_link=NULL;
temph->string=NewString(name);
temph1=FindHashBucket(temph->string,Fs->hash_table);
temph->next=*temph1;
*temph1=temph;
temph->str=NewStr(name);
AddSysHashEntry(temph,Fs->hash_table);
}
void AddOsMapSymbols()
{
SysHashEntry *temph,**temph1;
SysHashEntry *temph;
I1 *sptr;
U1 *ptr;
U4 *dd;
U8 type;
I8 i,code;
code=sys_boot_base;
AddModuleHash("/LT/OSMain/OS",code);
ptr=sys_boot_header_base;
@@ -73,12 +90,10 @@ void AddOsMapSymbols()
temph=MAllocZ(sizeof(SysHashEntry));
temph->type=HTT_SYS_SYMBOL;
temph->use_cnt=0;
temph->user0=i+code;
temph->user_data0=i+code;
temph->source_link=NULL;
temph->string=NewString(sptr);
temph1=FindHashBucket(temph->string,Fs->hash_table);
temph->next=*temph1;
*temph1=temph;
temph->str=NewStr(sptr);
AddSysHashEntry(temph,Fs->hash_table);
} else if (type<EIE_MAIN) {
} else if (type==EIE_MAIN) {
} else if (type==EIE_ABSOLUTE_ADDRESS) {
@@ -89,20 +104,22 @@ void AddOsMapSymbols()
U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
{
I1 *fbuf,*fbuf2;
I1 *fbuf;
U1 *code,*ptr,etype,*bb;
I1 *sptr,*absname;
U2 *ww;
U4 *dd;
U8 size,cnt;
U8 *qq,size,cnt;
BinFileHeaderStruct *bfh;
I8 i,j,l;
SysHashEntry *temph,**temph1,*saved_hash_ptr=NULL;
I8 i,j,n;
SysHashEntry *temph,*saved_hash_ptr=NULL;
ClassStruct *tempc;
GlblVarStruct *tempg;
fbuf=DefaultExtension(filename,"BIZ");
bfh=ReadFile(fbuf,&size); //TODO: align to para
if (!(bfh=ReadFile(fbuf,&size))) {
Free(fbuf);
return NULL;
}
code=bfh+sizeof(BinFileHeaderStruct);
if (ArcCheckSum(bfh,bfh->file_size)!=LT_XSUM)
@@ -110,13 +127,11 @@ U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
absname=AbsoluteFileName(fbuf);
Free(fbuf);
fbuf=NewString(absname);
fbuf2=NewString(absname);
RemoveLastSeg(fbuf,".",fbuf2);
fbuf=NewStr(absname);
RemoveLastSeg(fbuf,".");
if (fbuf[1]==':' && StrLen(fbuf)>2)
AddModuleHash(fbuf+2,code);
Free(fbuf);
Free(fbuf2);
ptr=bfh+bfh->header_offset;
while ((etype=*ptr++)!=EIE_END) { //PASS 1
@@ -127,20 +142,18 @@ U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
ptr+=StrLen(sptr)+1;
if (etype<=EIE_LIT_EXPORT) {
temph=MAllocZ(sizeof(SysHashEntry));
temph->string=NewString(sptr);
temph->str=NewStr(sptr);
temph->type=HTT_SYS_SYMBOL;
temph->use_cnt=0;
l=StrLen(absname);
temph->source_link=MAlloc(l+4);
n=StrLen(absname);
temph->source_link=MAlloc(n+4);
StrCpy(temph->source_link,"FI:");
StrCat(temph->source_link,absname);
if (etype==EIE_LIT_EXPORT)
temph->user0=i;
temph->user_data0=i;
else
temph->user0=i+code;
temph1=FindHashBucket(temph->string,Fs->hash_table);
temph->next=*temph1;
*temph1=temph;
temph->user_data0=i+code;
AddSysHashEntry(temph,Fs->hash_table);
} else if (etype<EIE_MAIN) {
if (*sptr)
saved_hash_ptr=FindLocalHash(sptr,HTT_ALL);
@@ -150,6 +163,7 @@ U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
bb=code+i;
ww=code+i;
dd=code+i;
qq=code+i;
if (saved_hash_ptr->type & HTT_FUNCTION) {
tempc=saved_hash_ptr;
if (etype & 1)
@@ -164,9 +178,9 @@ U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
i=tempg->data_address-code;
} else {
if (etype & 1)
i=saved_hash_ptr->user0;
i=saved_hash_ptr->user_data0;
else
i=saved_hash_ptr->user0-code;
i=saved_hash_ptr->user_data0-code;
}
if (etype<=EIE_LIT_U1)
*bb=i+*bb;
@@ -174,6 +188,8 @@ U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
*ww=i+*ww;
else if (etype<=EIE_LIT_U4)
*dd=i+*dd;
else if (etype<=EIE_LIT_U8)
*qq=i+*qq;
}
} else if (etype==EIE_ABSOLUTE_ADDRESS) {
if (no_abs)
@@ -200,7 +216,7 @@ U1 *Load(I1 *filename,BoolU4 no_abs=FALSE)
if (etype<=EIE_LIT_EXPORT) {
} else if (etype<EIE_MAIN) {
} else if (etype==EIE_MAIN) {
Run(i+code);
Call(i+code);
} else if (etype==EIE_ABSOLUTE_ADDRESS) {
ptr+=sizeof(U4)*i;
}
@@ -230,18 +246,21 @@ void InitIrqs()
OutP(0x21,0x0D); //IW4
OutP(0xA1,0x09); //IW4
PortNop;
OutP(0x21,0x20); //Mask
OutP(0xA1,0x2F); //Mask
OutP(0x21,0x24); //Mask
OutP(0xA1,0x37);
PortNop;
}
GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height)
GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height,TssStruct *tss=NULL)
{ //This only allows widths which are divisible by 8
GrBitMap *result;
result=MAllocZ(sizeof(GrBitMap));
if (!tss) tss=Fs;
result=MAllocZ(sizeof(GrBitMap),tss);
result->win_tss=tss;
result->mem_tss=tss;
result->type=type;
result->width=width;
result->internal_width=(width+7)&-8;
result->internal_width=(width+7)&~7;
result->height=height;
result->left_margin=0;
result->right_margin=width;
@@ -250,96 +269,123 @@ GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height)
switch (type) {
case BMT_COLOR4:
result->plane_size=(result->internal_width*result->height)>>3;
result->body=MAllocZ(result->plane_size<<2);
result->body=MAllocZ(result->plane_size<<2,tss);
break;
case BMT_MONO:
result->plane_size=(result->internal_width*result->height)>>3;
result->body=MAllocZ(result->plane_size);
result->body=MAllocZ(result->plane_size,tss);
break;
default:
throw(EXCEPT_GRAPHICS,1);
}
result->pen_width=1;
result->r=MAllocZ(9<<3);
result->r=MAllocZ(16<<3,tss);
result->r[0].u4[1]=1;
result->r[4].u4[1]=1;
result->r[8].u4[1]=1;
result->r[5].u4[1]=1;
result->r[10].u4[1]=1;
result->r[15].u4[1]=1;
result->speedline_scale=0.04;
result->bitmap_signature=BMS_SIGNATURE;
return result;
}
void InitGraphics(I8 mode)
void InitGraphics()
{
dc_col=0;
//TODO reinit VGA without BIOS
grmode=mode;
grfont=SYS_FONT_8x8;
switch (grmode) {
case 1:
grwidth=640;
grheight=480;
break;
case 2:
grwidth=800;
grheight=600;
break;
}
dc_flags=0;
dc_cursor_blink=0;
grfont=sys_font_8x8;
//TODO free old allocated stuff
grbase=GrBitMapNew(BMT_COLOR4,grwidth,grheight);
grbase->flags|=BMF_SCREEN_BITMAP;
grbase2=GrBitMapNew(BMT_COLOR4,grwidth+64,grheight+64);
grbase2->left_margin=32;
grbase2->right_margin=grbase2->internal_width-32;
grbase2->top_margin=32;
grbase2->bottom_margin=grbase2->height-32;
grbase2=GrBitMapNew(BMT_COLOR4,GR_WIDTH+128,GR_HEIGHT+32);
grbase2->left_margin=64;
grbase2->right_margin=GR_WIDTH+grbase2->left_margin;
grbase2->top_margin=16;
grbase2->bottom_margin=grbase2->height-16;
grbase2->flags|=BMF_SCREEN_BITMAP;
vga_image=MAllocZ(grwidth*grheight>>1);
textbase=MAlloc(grwidth/FONT_WIDTH*(grheight/FONT_HEIGHT)<<2);
GrClear2(grbase);
ClearWindowText;
vga_image=MAlloc(GR_WIDTH*GR_HEIGHT>>1);
textbase=MAlloc(GR_WIDTH/FONT_WIDTH*(GR_HEIGHT/FONT_HEIGHT)<<2);
Gs->grbase=GrBitMapNew(BMT_COLOR4,GR_WIDTH,GR_HEIGHT);
Gs->grbase->flags|=BMF_SCREEN_BITMAP;
GrClear2(Gs->grbase);
gr_merge_base=GrBitMapNew(BMT_COLOR4,GR_WIDTH,GR_HEIGHT);
gr_merge_base->flags|=BMF_SCREEN_BITMAP;
OutP(VGA_SC_INDEX,VGA_MAP_MASK);
OutP(VGA_SC_DATA,0x0F);
MemSet(0xA0000,0,grheight*grwidth>>3);
MemSet(0xA0000,0,GR_HEIGHT*GR_WIDTH>>3);
}
asm {CP_REBOOT:}
void Reboot()
{
U2 *d=0x472;
Cli;
if (mp_cnt>1) {
MPHalt;
BusyWait(100);
}
*d=0;
OutP(0x70,0x8F);
OutP(0x71,0x00);
OutP(0x70,0x00);
OutP(0x92,InP(0x92)|1);
Hlt;
}
asm {CP_OS_MAIN:}
void OsMain()
{
void my_AdamStartUpFile();
U8 i,j;
adam_tss=Fs;
StrCpy(Fs->task_descriptor2,"Adam Task CPU#0");
StrCpy(Fs->task_descriptor,Fs->task_descriptor2);
reverse_bits_table=MAllocZ(256);
for (i=0;i<256;i++)
for (j=0;j<8;j++)
if (Bt(&i,7-j))
Bts(reverse_bits_table+i,j);
set_bits_table=MAllocZ(256);
for (i=0;i<256;i++)
for (j=0;j<8;j++)
if (Bt(&i,j))
set_bits_table[i]++;
ext=MAllocZ(EXT_TABLE_SIZE*sizeof(void *));
ctrl_alt_letter_routines=MAllocZ(26*sizeof(void *));
InitGraphics();
InitSysTask;
AddOsMapSymbols;
InitSysGlbls;
//Before this point use $LK,"Sound","MN:Sound"$() and $LK,"BusyWait","MN:BusyWait"$()
//to debug. After this point, use $LK,"DbgNum","MN:DbgNum"$()
LoadSysStrs;
MPInit;
InitTimer;
InitIrqs;
ext=MAllocZ(EXT_TABLE_SIZE<<2);
InitGraphics(grmode);
coutln "Enable IRQ's";
SetFlags(SYS_NORMAL_RFLAGS);
Preempt(ON);
time_stamp_start=GetTimeStamp;
sys_timer_start=ReadSysTimer;
$FG,5$//$BK,1$WARNING$BK,0$ do not do cout before here (null ext[])
//DbgNum(), DbgStr() are okay, however.$FG$
coutln "InitSysTask";
InitSysTask;
coutln "AddOsMapSymbols";
AddOsMapSymbols;
coutln "InitSysGlbls";
InitSysGlbls;
coutln "LoadSysStrings";
LoadSysStrings;
coutln "ENABLE IRQ's";
SetFlags(SYS_DEFAULT_FLAGS);
InitKeyboard;
coutln "InitAllBlkDevs";
InitAllBlkDevs;
coutln "Select Default Drive";
SelectDefaultDrive;
cout "Loading Compiler...";
Cd("/LT/COMPILE");
Load("CMP");
Cd("/LT/Compiler");
Load("Compiler");
coutln "Done";
my_AdamStartUpFile=FindExtern("AdamStartUpFile");
my_AdamStartUpFile();
CallExtStr("AdamStartUpFile");
//Continues here $LK,"AdamStartUpFile","FF:::/LT/Compiler/CmpMain.CPZ,AdamStartUpFile"$
ContinueServantTask; //Never to return
}
asm { ALIGN 16,0x90
SYS_CS_SIZE::}
+51
View File
@@ -0,0 +1,51 @@
extern void PutSysText(I1 *name);
extern BoolU8 Cd(I1 *name,BoolU4 make_dirs=FALSE);
extern BoolU8 MkDir(I1 *filename);
extern void Msg(U8 code,U8 p1,U8 p2,U8 flags=0);
extern I1 PartitionToDrive(LTPartition *p=NULL);
extern BoolU8 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock);
extern BoolU8 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock);
extern void InvalidateDiskCache(LTPartition *p,BoolU4 unlock);
extern BoolU8 Drive(I1 drive_letter);
extern LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0);
extern U8 FSize(LTFile *f);
extern void FSync(LTFile *f);
extern BoolU8 FRBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
extern BoolU8 FWBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
extern void ReleaseTaskPartitions();
extern BoolU8 IsRaw();
extern void D(U1 *buf,U8 cnt=0x80,BoolU4 show_offset=TRUE);
extern void Dm(U1 *buf,U8 cnt=0x80);
extern void PrintF(I1 *fmt,...);
extern void MPIntAll(U8 num);
extern void XTalk(TssStruct *tss,I1 *fmt,...);
extern GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height,TssStruct *tss=NULL);
extern void InitISOPartition(LTPartition *p,BoolU4 unlock);
extern BoolU8 FindISOFile(LTPartition *p,U8 cur_dir_cluster,I1 *name,LTDirEntry *result,
BoolU4 dir_only,BoolU4 file_only,BoolU4 unlock);
extern LTDirEntry *FindISOFiles(I1 *wild,U8 fuf_flags,LTDirEntry *parent=NULL);
extern void FreeLTFreeList(LTPartition *p,BoolU4 unlock);
extern void InitLTPartition(LTPartition *p,BoolU4 unlock);
extern void FormatLT(I1 drive_letter,BoolU4 quick=TRUE);
extern BoolU8 FindLTFile(LTPartition *p,U8 cur_dir_cluster,I1 *name,LTDirEntry *result,
BoolU4 dir_only,BoolU4 file_only,BoolU4 unlock);
extern U8 AllocLTClusters(LTPartition *p,U8 cnt, BoolU4 unlock);
extern BoolU8 NewLTDirEntry2(LTPartition *p,I1 *cur_dir,LTDirEntry *de,BoolU4 free_old_chain,BoolU4 unlock);
extern LTDirEntry *FindLTFiles(I1 *wild,U8 fuf_flags,LTDirEntry *parent=NULL);
extern TssStruct *Spawn(U1 *start_add,
I1 *desc=NULL,
TssStruct *parent=NULL, //NULL means adam
I1 *account=NULL, //Null means use parent's
U8 stk=DEFAULT_STACK,
BoolU4 add_to_queue=TRUE);
extern void InitUserTask();
extern void AdamLog(I1 *fmt,...);
extern void Debugger(I1 *msg=NULL,U8 num=0);
#define DCF_IN_DOLLAR 1
#define DCF_LAST_DOLLAR 2
+54
View File
@@ -0,0 +1,54 @@
I1 sys_temp_filename[80];
SysAccntStruct sys_accounts;
TssCmdStruct sys_macro_queue;
KeyDevStruct sys_put_key_queue;
TssStruct *macro_util_tss;
HeapCtrl *mp_heap;
MPCmdCtrl *mp_ctrl;
TssStruct *adam_tss;
U4 num_spawned_users;
TssStruct *monitor_floppy_tss;
U1 *grfont;
U4 fdc_retries;
U4 fdc_drive_heads;
U4 fdc_disk_cylinders;
U4 fdc_disk_sectors;
U4 fdc_max_sector;
U4 fdc_dma_buf;
LTCacheBlk *ltcd_base;
LTCacheBlk *ltdc_next_lru,*ltdc_last_lru;
LTCacheBlk **ltdc_hash_table;
U8 ltdc_size;
U8 dc_col,dc_flags,dc_cursor_blink;
GrBitMap *grbase2,*gr_merge_base;
TssStruct *sys_update_screen_tss;
U8 rnd_SEED;
Ltf *sys_clipboard_ltf;
I1 *default_iso_name;
U8 disk_reads,disk_writes,compiled_lines,compiled_functions;
LTBlkDev *local_blkdevs,*boot_blkdev;
LTPartition *local_partitions,*default_partition;
I1 default_drive;
LTPartition *drive_to_partition[32];
I8 num_blkdevs;
I1 *sys_startup_account;
BoolU4 ip_inhibit_win_operations;
LTDate sys_compile_time;
void *vga_image;
U1 *reverse_bits_table,*set_bits_table;
void **ctrl_alt_letter_routines;
LTDate local_time_offset;
U8 time_stamp_start,sys_timer_start;
U8 time_stamp_freq,time_stamp_kHz_freq;
double t;
U8 mouse_evt_time,kbd_evt_time;
U1Fifo *kbdmouse_fifo;
//These are just handy variables
//available for debugging. You might
//put them on your wallpaper.
U8 sysdbg0,sysdbg1,sysdbg2,sysdbg3;
-288
View File
@@ -1,288 +0,0 @@
STRUC 0
SF_EBP: DU4 ?;
SF_EIP: DU4 ?;
SF_PARAM1: DU8 ?;
SF_PARAM2: DU8 ?;
SF_PARAM3: DU8 ?;
SF_PARAM4: DU8 ?;
SF_PARAM5: DU8 ?;
SF_PARAM6: DU8 ?;
SF_PARAM7: DU8 ?;
SF_PARAM8: DU8 ?;
ENDS
STRUC 0
SFI_EBP: DU4 ?;
SFI_EIP: DU4 ?;
SFI_CS: DU4 ?;
SFI_FLAGS: DU4 ?;
SFI_PARAM1: DU8 ?;
SFI_PARAM2: DU8 ?;
SFI_PARAM3: DU8 ?;
SFI_PARAM4: DU8 ?;
SFI_PARAM5: DU8 ?;
SFI_PARAM6: DU8 ?;
SFI_PARAM7: DU8 ?;
SFI_PARAM8: DU8 ?;
ENDS
STRUC 0
NULL_SEL: DU4 ?,?;
SYS_BOOT_DS_SEL: DU4 ?,?;
SYS_BOOT_CS_SEL: DU4 ?,?;
SYS_CS_SEL: DU4 ?,?;
ZERO_DS_SEL: DU4 ?,?;
//ADAM_TSS_SEL: DU4 ?,?;
FIRST_FREE_SEL:
ENDS
STRUC 0
EXCEPT_NEXT: DU4 ?;
EXCEPT_LAST: DU4 ?;
EXCEPT_HANDLER_START: DU4 ?;
EXCEPT_HANDLER_SKIP: DU4 ?;
EXCEPT_ESP: DU4 ?;
EXCEPT_EBP: DU4 ?;
EXCEPT_ESI: DU4 ?;
EXCEPT_EDI: DU4 ?;
EXCEPT_STRUCT_SIZE:
ENDS
STRUC 0
MB_NEXT: DU4 ?;
MB_LAST: DU4 ?;
MB_SIZE: DU4 ?;
MB_STRUCT_SIZE:
ENDS
STRUC 0 //AVAILABLE TO MALLOC MEM
UUM_NEXT: DU4 ?;
UUM_SIZE: DU4 ?;
UUM_STRUCT_SIZE:
ENDS
#define USED_USER_MEM_SIZE -4
STRUC 0
BPT_NEXT:: DU4 ?;
BPT_FLAGS:: DU4 ?;
BPT_ADDRESS:: DU4 ?;
BPT_U1:: DU1 ?;
ENDS
STRUC 0
TSS_BACK_LINK: DU4 ?;
TSS_ESP0: DU4 ?;
TSS_SS0: DU4 ?;
TSS_ESP1: DU4 ?;
TSS_SS1: DU4 ?;
TSS_ESP2: DU4 ?;
TSS_SS2: DU4 ?;
TSS_CR3: DU4 ?;
TSS_EIP: DU4 ?;
TSS_EFLAGS: DU4 ?;
TSS_EAX: DU4 ?;
TSS_ECX: DU4 ?;
TSS_EDX: DU4 ?;
TSS_EBX: DU4 ?;
TSS_ESP: DU4 ?;
TSS_EBP: DU4 ?;
TSS_ESI: DU4 ?;
TSS_EDI: DU4 ?;
TSS_ES: DU4 ?;
TSS_CS: DU4 ?;
TSS_SS: DU4 ?;
TSS_DS: DU4 ?;
TSS_FS: DU4 ?;
TSS_GS: DU4 ?;
TSS_LDTR: DU4 ?;
TSS_TASK_SWITCH_EXCEPT: DU2 ?;
TSS_IO_BITMAP_PTR: DU2 ?;
TSS_IO_BITMAP: DU1 (MAXIO/8) DUP (?);
TSS_TASK_DESCRIPTOR: DU1 (TSS_DESC_LENGTH+1) DUP (?);
TSS_UPDATE_WINDOW: DU4 ?;
TSS_CUR_LTF: DU4 ?;
TSS_AUX_LTF: DU4 ?;
TSS_EDIT_PLUGINS: DU4 ?;
TSS_SCROLL_SPEED: DU4 ?;
TSS_CRT_WIDTH: DU4 ?;
TSS_CRT_HEIGHT: DU4 ?;
TSS_TEXT_ATTRIBUTE: DU1 ?;
TSS_BORDER_ATTRIBUTE: DU1 ?;
DU2 ?; //Unused
TSS_WINDOW_LEFT: DU4 ?;
TSS_WINDOW_RIGHT: DU4 ?;
TSS_WINDOW_TOP: DU4 ?;
TSS_WINDOW_BOTTOM: DU4 ?;
TSS_CURSOR_HOR: DU4 ?;
TSS_CURSOR_VERT: DU4 ?;
TSS_WINDOW_PIXEL_LEFT: DU4 ?; //These are derived
TSS_WINDOW_PIXEL_RIGHT: DU4 ?;
TSS_WINDOW_PIXEL_TOP: DU4 ?;
TSS_WINDOW_PIXEL_BOTTOM: DU4 ?;
TSS_SCROLL_X: DU4 ?;
TSS_SCROLL_Y: DU4 ?;
TSS_CRT_FLAGS: DU4 ?;
TSS_ABSOLUTE_ADDRESS: DU4 ?;
TSS_PARENT_TSS: DU4 ?;
TSS_NEXT_TSS: DU4 ?; //ABSOLUTE ADDRESS OF NEXT TSS
TSS_LAST_TSS: DU4 ?; //ABSOLUTE ADDRESS OF LAST TSS
TSS_INPUT_FILTER_TSS: DU4 ?;
TSS_NEXT_SIBLING_TSS: DU4 ?;
TSS_LAST_SIBLING_TSS: DU4 ?;
TSS_NEXT_CHILD_TSS: DU4 ?;
TSS_LAST_CHILD_TSS: DU4 ?;
TSS_FPU: DU1 108 DUP(?);
TSS_WINDOW_BORDER_PIXEL_LEFT: DU4 ?; //These are derived
TSS_WINDOW_BORDER_PIXEL_RIGHT: DU4 ?;
TSS_WINDOW_BORDER_PIXEL_TOP: DU4 ?;
TSS_WINDOW_BORDER_PIXEL_BOTTOM: DU4 ?;
TSS_TASK_FLAGS: DU4 ?;
TSS_STACK_BASE: DU4 ?;
TSS_NEXT_MEM_BLK: DU4 ?;
TSS_LAST_MEM_BLK: DU4 ?;
TSS_HEAP_HASH: DU1 HEAP_HASH_SIZE DUP (?);
TSS_MALLOC_FREE_LIST: DU4 ?;
TSS_NEXT_EXCEPT: DU4 ?;
TSS_LAST_EXCEPT: DU4 ?;
TSS_EXCEPT_EBP: DU4 ?;
TSS_EXCEPT_ARGC: DU4 ?;
TSS_EXCEPT_ARGV: DU4 ?;
TSS_CATCH_EXCEPT: DU4 ?;
TSS_BPT_LIST: DU4 ?;
TSS_NEXT_ODE: DU4 ?;
TSS_LAST_ODE: DU4 ?;
TSS_HASH_TABLE: DU4 ?;
TSS_ACCOUNT: DU4 ?;
TSS_OPTIMIZATION: DU4 ?;
TSS_NEXT_SERVANT_CMD: DU4 ?;
TSS_LAST_SERVANT_CMD: DU4 ?;
TSS_NEXT_MASTER_CMD: DU4 ?;
TSS_LAST_MASTER_CMD: DU4 ?;
TSS_NEXT_LEX: DU4 ?;
TSS_LAST_LEX: DU4 ?;
TSS_CUR_PARTITION: DU4 ?;
TSS_CUR_DIR: DU4 ?;
TSS_END_TASK_CB: DU4 ?;
TSS_USER_NUM: DU4 ?;
TSS_ANSWERS: DU8 8 DUP(?);
TSS_DOUBLE_ANSWERS: DU8 8 DUP(?);
TSS_ANSWERS_TYPES: DU4 8 DUP(?);
TSS_ANSWERS_DISPLAYED: DU4 ?;
TSS_DBG: DU4 ?;
TSS_POPUP: DU4 ?;
TSS_LOCALCHNL: DU4 ?;
TSS_RMTCHNL: DU4 ?;
TSS_USER_AUX0: DU4 ?;
TSS_USER_AUX1: DU4 ?;
TSS_USER_AUX2: DU4 ?;
TSS_USER_AUX3: DU4 ?;
TSS_STRUCT_SIZE:
ENDS
STRUC 0
HT_NEXT: DU4 ?;
HT_MASK: DU4 ?;
HT_BODY:
ENDS
STRUC 0
HTE_NEXT: DU4 ?;
HTE_STRING: DU4 ?;
HTE_TYPE: DU4 ?;
HTE_USE_CNT: DU4 ?;
HTE_SOURCE_LINK: DU4 ?;
HTE_DEBUG: DU4 ?;
HTE_USER0: DU4 ?;
ENDS
STRUC 0
SP_EDI: DU4 ?;
SP_ESI: DU4 ?;
SP_EBP: DU4 ?;
SP_ESP: DU4 ?;
SP_EBX: DU4 ?;
SP_EDX: DU4 ?;
SP_ECX: DU4 ?;
SP_EAX: DU4 ?;
SP_STRUCT_SIZE:
SP_EIP: DU4 ?;
SP_PARAM1: DU8 ?;
SP_PARAM2: DU8 ?;
SP_PARAM3: DU8 ?;
SP_PARAM4: DU8 ?;
SP_PARAM5: DU8 ?;
SP_PARAM6: DU8 ?;
SP_PARAM7: DU8 ?;
SP_PARAM8: DU8 ?;
SP_PARAM9: DU8 ?;
SP_PARAM10: DU8 ?;
SP_PARAM11: DU8 ?;
SP_PARAM12: DU8 ?;
ENDS
STRUC 0
C_HASH_NEXT: DU4 ?;
C_HASH_STRING: DU4 ?;
C_HASH_TYPE: DU4 ?;
C_USE_CNT: DU4 ?;
C_SOURCE_LINK: DU4 ?;
C_DEBUG: DU4 ?;
C_MEM_CNT: DU2 ?;
C_PARAM_CNT: DU2 ?; //FOR FUNCTIONS
C_SIZE: DU4 ?; //Must be in same position as HTE_USER1
C_MEM_LIST: DU4 ?; //MEMBER LIST
C_MEM_LIST_LAST: DU4 ?;
C_STATEMENTS: DU4 ?; //For functions
ENDS
STRUC 0
IC_CODE: DU4 ?;
IC_FLAGS: DU4 ?;
IC_DATA: DU8 ?;
IC_CLASS: DU4 ?;
IC_LINE: DU4 ?;
IC_STRUCT_SIZE:
ENDS
STRUC 0
ATE_NEXT: DU4 ?;
ATE_BASECODE: DU2 ?;
ATE_CH: DU1 ?,?;
ATE_STRUCT_SIZE:
ENDS
STRUC 0
ACS_SRC_SIZE: DU8 ?;
ACS_SRC_POS: DU8 ?;
ACS_SRC_BUF: DU4 ?;
ACS_DST_SIZE: DU8 ?;
ACS_DST_POS: DU8 ?;
ACS_DST_BUF: DU4 ?;
ACS_MIN_BITS: DU4 ?;
ACS_MIN_TABLE_ENTRY: DU4 ?;
ACS_CUR_ENTRY: DU4 ?;
ACS_CUR_BITS_IN_USE: DU4 ?;
ACS_NEXT_ENTRY: DU4 ?;
ACS_NEXT_BITS_IN_USE: DU4 ?;
ACS_STACK_PTR: DU4 ?;
ACS_STACK_BASE: DU4 ?;
ACS_FREE_INDEX: DU4 ?;
ACS_FREE_LIMIT: DU4 ?;
ACS_SAVED_BASECODE: DU4 ?;
ACS_ENTRY_USED: DU4 ?;
ACS_LAST_CH: DU1 ?,?,?,?;
ACS_COMPRESS: DU8 ARC_MAX_TABLE_ENTRY+1 DUP(?);
ACS_HASH: DU4 ARC_MAX_TABLE_ENTRY+1 DUP(?);
ACS_STRUCT_SIZE:
ENDS
-360
View File
@@ -1,360 +0,0 @@
USE16
JMP U2 J_START2
////**************************PROCEDURE*************************
// ASM Global variables required for 16-bit start-up
ALIGN 4,0x90
SYS_BOOT_BASE:: DU4 ?; //Fixed offset from start used by reboot_J
SYS_BOOT_HEADER_BASE:: DU4 ?;
OS_32START:: DU4 INIT_OS;
ALIGN 16,0x90
GDTTAB:: DU1 MAXGDT*8 DUP(0);
SYS_BOOT_CODE:: DU4 0xFF;
SYS_MEMBLKS:: DU4 0;
FREE_GDT_LIST:: DU4 0;
ADAM_TSS:: DU1 TSS_STRUCT_SIZE DUP(0);
SYS_TEMP_PTR:: DU4 0,0;
////**************************PROCEDURE*************************
//EBX is SYS_BOOT_CODE (value passed from boot blk)
J_START2::
MOV AX,(0xA0000-2*BLK_SIZE)/16
MOV SS,AX
MOV SP,2*BLK_SIZE
PUSH EBX //will be SYS_BOOT_CODE
MOV AX,0xB800
MOV ES,AX
MOV U4 ES:[0],('L'+0xF000)+0x10000*('T'+0xF000)
MOV U4 ES:[4],0
MOV ECX,1200000 //Delay
CALL BUSY_WAIT
CALL U2 GET_IP
GET_IP:
POP BX
SUB BX,GET_IP
SHR BX,4
MOV AX,CS
ADD AX,BX
PUSH AX
PUSH U2 J_START3
RETF
J_START3::
//XSUM OSMain
MOV AX,CS
DEC AX
MOV DS,AX
XOR ESI,ESI
MOV ECX,U4 8[ESI] //Get length
SHR ECX,4
MOV EBX,LT_XSUM
@@2: LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
XOR ESI,ESI
MOV AX,DS
INC AX
MOV DS,AX
LOOP @@2
MOV U4 ES:[4],'O'+65536*'K'+0xF000F000
OR EBX,EBX
JZ J_CONT_START
//XSUM Error
MOV U4 ES:[4],'X'+65536*'M'+0xF000F000
@@3: JMP @@3
BUSY_WAIT::
MOV DX,0x379 //Par Port
@@1: IN AL,DX
DEC ECX
JNZ @@1
RET
////**************************PROCEDURE*************************
J_CONT_START:
STI
//Enter Graphics Mode
exe {
I8 ch,video_mode;
do {
CrLf;
coutln "1) VGA 640x480x16";
coutln "2) SVGA 800x600x16--not supported by all computers";
cout "Video Mode:";
ch=GetChar;
} while (ch<'1' || ch>'2');
video_mode=ch-'0';
switch (video_mode) {
case 1:
ExePutS("MOV AX,0x12");
break;
case 2:
ExePutS("MOV AX,0x6A");
break;
}
}
INT 0x10 //ENABLE VGA
//Get memory map
MOV AX,0xE801
INT 0x15
MOV AX,CS
MOV DS,AX
ADD DX,0x101
MOV U2 [SYS_MEMBLKS+2],DX
CLI
//Enable A20
IN AL,0x92
OR AL,2
OUT 0x92,AL
CLD //Start with known registers
MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX
XOR ESI,ESI
XOR EDI,EDI
XOR EBP,EBP
XOR EAX,EAX
MOV AX,CS
SHL EAX,4
MOV U4 [SYS_BOOT_BASE],EAX
POP U4 [SYS_BOOT_CODE]
MOV BX,CS
DEC BX
MOV GS,BX
MOV EBX,U4 GS:[4]
ADD EAX,EBX
SUB EAX,16
MOV U4 [SYS_BOOT_HEADER_BASE],EAX
MOV U4 [GDTTAB+SYS_BOOT_DS_SEL],0x000FFFF
MOV U4 [GDTTAB+SYS_BOOT_DS_SEL+4],0x0CF9200
MOV U4 [GDTTAB+SYS_BOOT_CS_SEL],0x000FFFF
MOV U4 [GDTTAB+SYS_BOOT_CS_SEL+4],0x0CF9A00
MOV EAX,U4 [SYS_BOOT_BASE]
ADD U4 [GDTTAB+SYS_BOOT_DS_SEL+2],EAX
ADD U4 [GDTTAB+SYS_BOOT_CS_SEL+2],EAX
// SETUP POINTER TO LIMIT AND BASE
//OF GDT. USE ENTRY (0) BECAUSE IT IS
//INVALID.
MOV U2 [SYS_TEMP_PTR],MAXGDT*8-1
MOV EAX,U4 [SYS_BOOT_BASE]
ADD EAX,GDTTAB+NULL_SEL
MOV U4 [SYS_TEMP_PTR+2],EAX
MOV U2 [SYS_TEMP_PTR+6],0
// LGDT FU2 SYS_TEMP_PTR
DU1 0x67,0x0F,0x01,0x15;
DU4 SYS_TEMP_PTR;
// MOV EAX,CR0 //ENTER PROTECTED MODE!!
DU1 0x0F,0x20,0xC0;
OR AL,1
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0x66,0xEA; //JMP SYS_CS_SEL:INIT_OS
DU4 INIT_OS;
DU2 SYS_BOOT_CS_SEL;
////**************************PROCEDURE*************************
// ASM Global variables not required for 16-bit start-up
ALIGN 8,0x90
IDTTAB:: DU1 MAXIDT*8 DUP(0);
SYS_HEAP_BASE:: DU4 0x100000;
SYS_HEAP_LIMIT:: DU4 0;
exe {
ExePrintF("SYS_GRMODE:: DU4 %d;",video_mode);
}
SYS_GRWIDTH:: DU4 ?;
SYS_GRHEIGHT:: DU4 ?;
SYS_FLAGS:: DU4 0x8; //RAW_CRT_OUT=8
SYS_IRQ_FLAGS:: DU4 0;
SYS_IRQ_BUSY_FLAGS:: DU4 0;
SYS_TEXTBASE:: DU4 0;
SYS_GRBASE:: DU4 0;
SYS_GRBASE2:: DU4 0;
SYS_CUR_RAW_SCAN_CODE:: DU4 0;
SYS_CUR_SCAN_CODE:: DU4 0;
SYS_EXTERN_TABLE:: DU4 0;
MEM_FREE_LIST:: DU4 0;
FREE_PAGE_HASH:: DU4 FREE_PAGE_HASH_SIZE DUP(0);
FREE_PAGE_HASH2:: DU4 32 DUP(0);
PROGRESS1:: DU8 0;
PROGRESS2:: DU8 0;
PROGRESS3:: DU8 0;
PROGRESS4:: DU8 0;
SYS_SWAPS_CNTER:: DU4 0;
SYS_CUR_FOCUS_TASK:: DU4 0;
////**************************PROCEDURE*************************
ALIGN 16,0x90
USE32
INIT_OS::
MOV AX,SYS_BOOT_DS_SEL //LOAD DS SELECTOR
MOV DS,AX
MOV ES,AX
MOV U4 [GDTTAB+ZERO_DS_SEL],0x0000FFFF
MOV U4 [GDTTAB+ZERO_DS_SEL+4],0x00CF9200
MOV U4 [GDTTAB+SYS_CS_SEL],0x0000FFFF
MOV U4 [GDTTAB+SYS_CS_SEL+4],0x00CF9A00
//INIT FREE GDT ENTRIES
MOV U4 [FREE_GDT_LIST],0
MOV ECX,MAXGDT-FIRST_FREE_SEL/8
MOV EAX,FIRST_FREE_SEL
@@3: MOV EBX,U4 [FREE_GDT_LIST]
MOV U4 GDTTAB[EAX],EBX
MOV U4 [FREE_GDT_LIST],EAX
ADD EAX,8
LOOP @@3
//Patch absolute addresses
MOV ESI,U4 [SYS_BOOT_HEADER_BASE]
MOV EDI,U4 [SYS_BOOT_BASE]
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV ECX,U4 1[ESI]
LEA ESI,U4 1+4+1[ESI]
@@10: LODSD
ADD EAX,EDI
ADD U4 [EAX],EDI
LOOP @@10
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV ESP,0x800000 //TEMP
DU1 0xEA; //JMP SYS_CS_SEL:CONT_INIT_OS
DU4 CONT_INIT_OS;
DU2 SYS_CS_SEL;
CONT_INIT_OS::
MOV U4 [SYS_HEAP_BASE],0x100000
CALL INIT_MEM
//INIT INTERRUPT TABLE
MOV ECX,MAXIDT
MOV EDI,IDTTAB
MOV ESI,IRQ_VECTORS
@@1: LODSW
STOSW
MOV AX,SYS_CS_SEL
STOSW
MOV AX,0x8E00 //E=32-bit irq gate
STOSW
MOVSW
LOOP @@1
MOV U2 [SYS_TEMP_PTR],MAXIDT*8-1
MOV U4 [SYS_TEMP_PTR+2],IDTTAB
MOV U2 [SYS_TEMP_PTR+6],0
// LIDT FU2 SYS_TEMP_PTR
DU1 0x0F,0x01,0x1D;
DU4 SYS_TEMP_PTR;
//INIT SYSTEM TSS
PUSH 0
PUSH DEFAULT_STACK
PUSH 0
PUSH ADAM_TSS
CALL CP_INIT_TSS+4
ADD ESP,16
MOV FS,AX
MOV ESP,U4 FS:[TSS_ESP]
CALL INIT_FLOATING_CONSTANTS
JMP U4 CP_OS_MAIN+4
////**************************PROCEDURE*************************
CP_REBOOT::
MOV EAX,ZERO_DS_SEL
MOV ES,AX
MOV U2 ES:[0x472],0
MOV AL,0x8F
OUT 0x70,AL
OUT 0xEB,AL
MOV AL,0
OUT 0x71,AL
OUT 0xEB,AL
MOV AL,0
OUT 0x70,AL
OUT 0xEB,AL
IN AL,0x92
OR AL,1
OUT 0x92,AL
OUT 0xEB,AL
@@100: JMP @@100
////**************************PROCEDURE*************************
FC_1:: DU8 0;
FC_PI:: DU8 0;
FC_PI2:: DU8 0;
FC_E:: DU8 0;
FC_LOG2_10:: DU8 0;
FC_LOG2_E:: DU8 0;
FC_LOG10_2:: DU8 0;
FC_LOGE_2:: DU8 0;
INIT_FLOATING_CONSTANTS::
PUSH EBP
MOV EBP,ESP
SUB ESP,8
FLD1
FSTP U4[FC_1]
FLDPI
FSTP U4[FC_PI]
FLDPI
FLDPI
FADDP
FSTP U4[FC_PI2]
FLDL2T
FSTP U4[FC_LOG2_10]
FLDL2E
FSTP U4[FC_LOG2_E]
FLDLG2
FSTP U4[FC_LOG10_2]
FLDLN2
FSTP U4[FC_LOGE_2]
FLD1
FSTP U4 -8[EBP]
CALL CP_EXP
MOV U4 [FC_E],EAX
MOV U4 [FC_E+4],EDX
ADD ESP,8
POP EBP
RET
+457
View File
@@ -0,0 +1,457 @@
USE16
JMP U2 LOSETHOS_START2
////**************************PROCEDURE*************************
// ASM Global variables required for 16-bit start-up
ALIGN 4,OC_NOP
SYS_BOOT_BASE:: DU4 ?; //Fixed offset from start used by reboot
SYS_BOOT_HEADER_BASE:: DU4 ?;
SYS_OS_32START:: DU4 INIT_OS;
ALIGN 16,OC_NOP
SYS_GDTTAB:: DU1 MAXGDT*16 DUP(0);
SYS_BOOT_CODE:: DU4 0xFF;
SYS_MEMBLKS:: DU4 0;
SYS_FREE_GDT_LIST:: DU4 0;
ALIGN 8,OC_NOP
SYS_ADAM_TSS:: DU1 TSS_STRUCT_SIZE DUP(0);
SYS_TEMP_PTR:: DU4 0,0,0;
////**************************PROCEDURE*************************
//EBX is SYS_BOOT_CODE (value passed from boot blk)
LOSETHOS_START2::
MOV AX,(0xA0000-2<<BLK_SIZE_BITS)/16
MOV SS,AX
MOV SP,2<<BLK_SIZE_BITS
PUSH EBX //will be SYS_BOOT_CODE
MOV AX,0xB800
MOV ES,AX
MOV U4 ES:[0],('L'+0x1000)+('T'+0x2000)<<16
MOV U4 ES:[4],0
MOV ECX,100000 //Delay
CALL BUSY_WAIT
CALL U2 GET_IP
GET_IP:
POP BX
SUB BX,GET_IP
SHR BX,4
MOV AX,CS
ADD AX,BX
PUSH AX
PUSH U2 LOSETHOS_START3
RETF
LOSETHOS_START3::
//XSUM OSMain
MOV AX,CS
DEC AX
MOV DS,AX
XOR ESI,ESI
MOV ECX,U4 8[ESI] //Get length
SHR ECX,4
MOV EBX,LT_XSUM
@@2: LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
XOR ESI,ESI
MOV AX,DS
INC AX
MOV DS,AX
LOOP @@2
//$FG,4$If you debug, use text video memory$FG$
MOV U4 ES:[4],'O'+65536*'K'+0xF000F000
OR EBX,EBX
JZ LOSETHOS_CONT_START
//XSUM Error
MOV U4 ES:[4],'X'+65536*'M'+0xF000F000
@@3: JMP @@3
BUSY_WAIT::
MOV DX,0x379 //Par Port
@@1: IN AL,DX
DEC ECX
JNZ @@1
RET
////**************************PROCEDURE*************************
LOSETHOS_CONT_START:
STI
/***********
MOV AX,0x4F00
INT 0x10 //GET MODES
PUSH DS
PUSH ES
MOV CX,0x100
MOV SI,DI
XOR DI,DI
MOV AX,ES
MOV DS,AX
MOV AX,0x8000
MOV ES,AX
REP_MOVSB
POP ES
POP DS
***********/
//Enter Graphics Mode
MOV BX,0x12
MOV AX,0x4F02
INT 0x10 //ENABLE VGA
//Get memory map
MOV AX,0xE801
INT 0x15
MOV AX,CS
MOV DS,AX
ADD DX,0x101
MOV U2 [SYS_MEMBLKS+2],DX
CLI
//Enable A20
IN AL,0x92
OR AL,2
OUT 0x92,AL
CLD //Start with known registers
MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX
XOR ESI,ESI
XOR EDI,EDI
XOR EBP,EBP
XOR EAX,EAX
MOV AX,CS
SHL EAX,4
MOV U4 [SYS_BOOT_BASE],EAX
POP U4 [SYS_BOOT_CODE]
MOV BX,CS
DEC BX
MOV GS,BX
MOV EBX,U4 GS:[4]
ADD EAX,EBX
SUB EAX,16
MOV U4 [SYS_BOOT_HEADER_BASE],EAX
MOV U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL],0x000FFFF
MOV U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL+4],0x0CF9200
MOV U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL],0x000FFFF
MOV U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL+4],0x0CF9A00
MOV EAX,U4 [SYS_BOOT_BASE]
ADD U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL+2],EAX
ADD U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL+2],EAX
// SETUP POINTER TO LIMIT AND BASE
//OF GDT. USE ENTRY (0) BECAUSE IT IS
//INVALID.
MOV U2 [SYS_TEMP_PTR],MAXGDT*16-1
MOV EAX,U4 [SYS_BOOT_BASE]
ADD EAX,SYS_GDTTAB+NULL_SEL
MOV U4 [SYS_TEMP_PTR+2],EAX
MOV U2 [SYS_TEMP_PTR+6],0
LGDT U4 [SYS_TEMP_PTR]
MOV EAX,SYS_START_CR0
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0x66,0xEA; //JMP SYS_CS_SEL:INIT_OS
DU4 INIT_OS;
DU2 SYS_BOOT_CS_SEL;
////**************************PROCEDURE*************************
// ASM Global variables not required for 16-bit start-up
ALIGN 8,OC_NOP
SYS_IDTTAB:: DU1 MAXIDT*16 DUP(0);
SYS_HEAP_BASE:: DU8 0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4);
SYS_HEAP_LIMIT:: DU8 0;
SYS_FLAGS:: DU8 0;
SYS_TEXTBASE:: DU8 0;
SYS_CUR_SCAN_CODE:: DU8 0;
SYS_EXTERN_TABLE:: DU8 0;
SYS_MEM_FREE_LIST:: DU8 0;
SYS_MEM_FREE_2MEG_LIST:: DU8 0;
SYS_FREE_PAGE_HASH:: DU8 FREE_PAGE_HASH_SIZE DUP(0);
SYS_FREE_PAGE_HASH2:: DU8 64 DUP(0);
SYS_PROGRESS1:: DU8 0;
SYS_PROGRESS2:: DU8 0;
SYS_PROGRESS3:: DU8 0;
SYS_PROGRESS4:: DU8 0;
SYS_CUR_FOCUS_TASK:: DU8 0;
SYS_TIMER:: DU8 1;
SYS_JIFFIES:: DU8 1;
SYS_MP_CPU_STRUCTS:: DU8 0;
SYS_MP_CNT:: DU8 1;
SYS_UNCACHED_MP_CNT:: DU8 0;
SYS_TEMP_CPU0_STRUCT:: DU1 CPU_STRUCT_SIZE DUP (0);
ALIGN CPU_CACHE_LINE_WIDTH,OC_NOP
//Align to cache-line boundary,
// compensating for 16 byte segment header
DU1 CPU_CACHE_LINE_WIDTH-16 DUP(0);
SYS_SEMA_IRQS:: DU1 NUM_IRQ_SEMAS*SEMA_STRUCT_SIZE DUP(0);
SYS_SEMA_IRQ_BUSY:: DU1 NUM_IRQ_SEMAS*SEMA_STRUCT_SIZE DUP(0);
SYS_SEMAS:: DU1 NUM_SYS_SEMAS*SEMA_STRUCT_SIZE DUP(0);
////**************************PROCEDURE*************************
ALIGN 16,OC_NOP
USE32
INIT_OS::
PUSH U4 SYS_START_RFLAGS
POPFD
MOV EAX,SYS_START_CR0
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
MOV AL,0xFF
OUT 0x21,AL //mask interrupts
OUT 0xA1,AL
MOV AX,SYS_BOOT_DS_SEL //LOAD DS SELECTOR
MOV DS,AX
MOV ES,AX
MOV U4 [SYS_GDTTAB+ZERO_DS_SEL] ,0x0000FFFF
MOV U4 [SYS_GDTTAB+ZERO_DS_SEL+4] ,0x00CF9200
MOV U4 [SYS_GDTTAB+SYS_CS_SEL] ,0x0000FFFF
MOV U4 [SYS_GDTTAB+SYS_CS_SEL+4] ,0x00CF9A00
MOV U4 [SYS_GDTTAB+SYS_CS64_SEL] ,0x00000000
MOV U4 [SYS_GDTTAB+SYS_CS64_SEL+4] ,0x00209A00
//INIT FREE GDT ENTRIES
MOV U4 [SYS_FREE_GDT_LIST],0
MOV ECX,MAXGDT-FIRST_FREE_SEL/16
MOV EAX,FIRST_FREE_SEL
@@3: MOV EBX,U4 [SYS_FREE_GDT_LIST]
MOV U4 SYS_GDTTAB[EAX],EBX
MOV U4 [SYS_FREE_GDT_LIST],EAX
ADD EAX,16
LOOP @@3
//Patch absolute addresses
MOV ESI,U4 [SYS_BOOT_HEADER_BASE]
MOV EDI,U4 [SYS_BOOT_BASE]
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV ECX,U4 1[ESI]
LEA ESI,U4 1+4+1[ESI]
@@10: LODSD
ADD EAX,EDI
ADD U4 [EAX],EDI
LOOP @@10
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV ESP,0x800000 //Temp
DU1 0xEA; //JMP SYS_CS_SEL:CONT_INIT_OS
DU4 CONT_INIT_OS;
DU2 SYS_CS_SEL;
CONT_INIT_OS::
XOR EAX,EAX
MOV U4 [SYS_FLAGS],EAX
MOV U4 [SYS_FLAGS+4],EAX
MOV EDI,U4 SYS_SEMAS
MOV ECX,NUM_SYS_SEMAS*SEMA_STRUCT_SIZE/4
REP_STOSD
MOV U4 [SYS_HEAP_BASE],0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4)
CALL INIT_MEM
PUSH U4 0
CALL INIT_EM64T
USE64
//INIT INTERRUPT TABLE
MOV RCX,MAXIDT
MOV RDI,U4 SYS_IDTTAB
MOV RSI,U4 IRQ_VECTORS
@@1: MOVSW
MOV AX,SYS_CS64_SEL
STOSW
MOV AX,0x8E00 //E=32-bit irq gate
STOSW
MOVSW
XOR EAX,EAX
STOSQ
LOOP @@1
MOV RAX,U4 SYS_TEMP_PTR
MOV U2 [RAX],MAXIDT*16-1
MOV U4 2[RAX],SYS_IDTTAB
MOV U2 6[RAX],0
MOV U4 8[RAX],0
REX
LIDT U4 [RAX]
//INIT CPU0 STRUCT
PUSH U4 SYS_TEMP_CPU0_STRUCT
PUSH 0
CALL CP_INIT_CPU_STRUCT
ADD RSP,16
PUSH RAX
CALL CP_PUT_GS_BASE
ADD RSP,8
//INIT ADAM TSS
MOV RDI,U4 SYS_ADAM_TSS
MOV RCX,TSS_STRUCT_SIZE
XOR EAX,EAX
REP_STOSB
PUSH DEFAULT_STACK
PUSH U4 SYS_ADAM_TSS
CALL CP_INIT_TSS
ADD RSP,16
CALL PUT_FS_BASE
MOV RSP,U8 TSS_RSP[RAX]
CALL INIT_FLOATING_CONSTS
JMP U4 CP_OS_MAIN
//Continues $LK,"CP_OS_MAIN","FF:::/LT/OSMain/OSEnd.CPZ,CP_OS_MAIN"$
////**************************PROCEDURE*************************
USE32
INIT_EM64T::
//MOV EAX,CR4
DU1 0x0F,0x20,0xE0;
OR EAX,0xB0
//MOV CR4,EAX
DU1 0x0F,0x22,0xE0;
MOV EAX,0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3)
//MOV CR3,EAX
DU1 0x0F,0x22,0xD8;
MOV ECX,IA32_EFER
XOR EDX,EDX
MOV EAX,IA32F_LME
WRMSR
//MOV EAX,CR0
DU1 0x0F,0x20,0xC0;
OR EAX,0x80000000 //enable paging
//MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0xEA; //JMP SYS_CS64_SEL:EM64T_PART3
DU4 EM64T_PART3;
DU2 SYS_CS64_SEL;
USE64
EM64T_PART3:
RET
////**************************PROCEDURE*************************
INIT_FLOATING_CONSTS::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FLD1
MOV RAX,U4 FC_1
FSTP U8[RAX]
FLDPI
MOV RAX,U4 FC_PI
FSTP U8[RAX]
FLDPI
FLDPI
FADDP
MOV RAX,U4 FC_PI2
FSTP U8[RAX]
FLDL2T
MOV RAX,U4 FC_LOG2_10
FSTP U8[RAX]
FLDL2E
MOV RAX,U4 FC_LOG2_E
FSTP U8[RAX]
FLDLG2
MOV RAX,U4 FC_LOG10_2
FSTP U8[RAX]
FLDLN2
MOV RAX,U4 FC_LOGE_2
FSTP U8[RAX]
FLD1
FSTP U8 -8[RBP]
CALL CP_EXP
MOV RBX,U4 FC_E
MOV U8 [RBX],RAX
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
FC_1:: DU8 0;
FC_PI:: DU8 0;
FC_PI2:: DU8 0;
FC_E:: DU8 0;
FC_LOG2_10:: DU8 0;
FC_LOG2_E:: DU8 0;
FC_LOG10_2:: DU8 0;
FC_LOGE_2:: DU8 0;
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
SYS_SHUTDOWN_CPU::
XOR EDI,EDI
MOV EDI,U4 SYS_BOOT_BASE
MOV EDI,U4 [RDI]
XOR ESI,ESI
MOV ESI,U4 SYS_OS_32START
MOV ESI,U4 [RSI]
ADD ESI,EDI
HALT_CPU::
PUSH U4 ZERO_DS_SEL
PUSH U4 0x9C000
PUSH U4 0
PUSH U4 SYS_CS_SEL
CALL @@2
@@2: POP RAX
ADD RAX,10 //@@3-@@2
PUSH RAX
IRET
USE32
@@3:
//disable paging
DU1 0x0F,0x20,0xC0;//MOV EAX,CR0
BTR EAX,31
DU1 0x0F,0x22,0xC0;//MOV CR0,EAX
MOV ECX,IA32_EFER
XOR EDX,EDX
XOR EAX,EAX
WRMSR
MOV EBX,BOOT_CODE_RAM
OR ESI,ESI
JZ @@1
JMP ESI
@@1: HLT
USE64
SYS_SHUTDOWN_CPU_END::
+1 -5
View File
@@ -1,12 +1,9 @@
void QSort(U1 *base,U8 num, U8 width, U1 *compare)
void QSort(void *base,U8 num, U8 width, I8 my_compare(void *e1,void *e2))
{ //This uses a shell sort
I8 my_compare(U1 *elem1,U1 *elem2 );
I8 span=num>>1,i;
U1 *b1,*b2,*temp=MAlloc(width);
BoolU4 cont;
my_compare=compare;
while (span) {
cont=TRUE;
while (cont) {
@@ -26,4 +23,3 @@ void QSort(U1 *base,U8 num, U8 width, U1 *compare)
}
Free(temp);
}
Binary file not shown.
Binary file not shown.
-78
View File
@@ -1,78 +0,0 @@
/**************** EXTERNS *********************/
extern void PutSysText(I1 *name);
extern I1 *ReadTextFile(I1 *filename,U8 *attr=NULL);
extern void throw(...);
extern I1 *MSPrintF(I1 *src,...);
extern BoolU4 Cd(I1 *name,BoolU4 make_dirs=FALSE);
extern BoolU4 MkDir(I1 *filename);
extern void Msg(U8 code,U8 p1,U8 p2,U8 flags=0);
extern I1 PartitionToDrive(LTPartition *p=NULL);
extern BoolU4 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock);
extern BoolU4 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock);
extern void InvalidateDiskCache(LTPartition *p,BoolU4 unlock);
extern BoolU4 InitBlkDev(LTBlkDev *bd,BoolU4 unlock);
extern U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock);
extern BoolU4 Drive(I1 drive_letter);
extern LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0);
extern U8 FSize(LTFile *f);
extern void FSync(LTFile *f);
extern void FClose(LTFile *f);
extern BoolU4 FRBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
extern BoolU4 FWBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1);
extern void ReleaseTaskPartitions();
extern void AdamLog(I1 *src,...);
extern void AdamErr(I1 *src,...);
extern BoolU4 SysDbg(BoolU4 val);
extern BoolU4 IsSysDbg();
extern BoolU4 Raw(BoolU4 val);
extern BoolU4 IsRaw();
extern void D(U1 *buf,U8 cnt=0x80,BoolU4 show_offset=TRUE);
extern void Dm(U1 *buf,U8 cnt=0x80);
extern U1 *Caller();
extern U1 *CallerCaller();
extern void DbgStr(I1 *st,U8 mS=100);
extern void DbgNum(U8 num,U8 mS=100);
extern void DbgAdd(U4 *add,U8 mS=100);
extern void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100);
extern void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100);
extern void PrintF(I1 *fmt,...);
/*********** MOST GLBL VARS ***********/
I1 sys_temp_filename[80];
SysAccntStruct sys_accounts;
TssCmdStruct sys_macro_queue;
TssStruct *macro_util_tss;
TssStruct *adam_tss;
U4 num_spawned_users;
TssStruct *monitor_floppy_tss;
U1 *grfont;
U4 FDC_retries;
U4 FDC_DRIVE_HEADS;
U4 FDC_DISK_CYLINDERS;
U4 FDC_DISK_SECTORS;
U4 FDC_MAX_SECTOR;
U4 FDC_DMA_BUF;
LTCacheBlk *LTDCBase;
LTCacheBlk *LTDCNext_lru,*LTDCLast_lru;
LTCacheBlk **LTDCHashTable;
U8 dc_col;
U8 sys_timer,jiffies;
U8 rnd_SEED;
Ltf *sys_clipboard_ltf;
U8 disk_status_display,compiled_lines;
LTBlkDev *local_blkdevs,*boot_blkdev;
LTPartition *local_partitions,*default_partition;
I1 default_drive;
LTPartition *drive_to_partition[32];
I8 num_blkdevs;
I1 *sys_startup_account;
I1 *wordstat_mask;
BoolU4 ip_inhibit_win_operations;
I1 *sys_compile_time;
U4 *vga_image;
Binary file not shown.
File diff suppressed because it is too large. Load diff
+330
View File
@@ -0,0 +1,330 @@
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
IDLE_START::
SAVE_CONTEXT::
PUSH RAX
PUSHFD
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
POP U8 TSS_RFLAGS[RAX]
MOV U8 TSS_RBX[RAX],RBX
MOV U8 TSS_RCX[RAX],RCX
MOV U8 TSS_RDX[RAX],RDX
MOV U8 TSS_RSI[RAX],RSI
MOV U8 TSS_RDI[RAX],RDI
MOV U8 TSS_RBP[RAX],RBP
MOV U8 TSS_R8[RAX],R8
MOV U8 TSS_R9[RAX],R9
MOV U8 TSS_R10[RAX],R10
MOV U8 TSS_R11[RAX],R11
MOV U8 TSS_R12[RAX],R12
MOV U8 TSS_R13[RAX],R13
MOV U8 TSS_R14[RAX],R14
MOV U8 TSS_R15[RAX],R15
POP U8 TSS_RAX[RAX]
MOV RSI,RAX
XOR EAX,EAX
RDTSC
SHL RDX,32
ADD RAX,RDX
MOV RBX,RAX
@@31: LOCK
BTS U4 [SYS_SEMAS+SYS_SEMA_TIMESTAMP*SEMA_STRUCT_SIZE],0
JC @@31
SUB RBX,U8 TSS_TIME_SLICE_START[RSI]
ADD U8 TSS_TOTAL_TIME[RSI],RBX
LOCK
BTR U4 [SYS_SEMAS+SYS_SEMA_TIMESTAMP*SEMA_STRUCT_SIZE],0
FSAVE U4 TSS_FPU[RSI]
BT U4 TSS_TASK_FLAGS[RSI],TSSf_DISABLE_BPTS
JC @@4
MOV RSI,U8 TSS_BPT_LIST[RSI]
@@3: OR RSI,RSI
JZ @@4
MOV RDI,U8 BPT_ADDRESS[RSI]
MOV AL,U1 BPT_U1[RSI]
MOV U1 [RDI],AL
MOV RSI,U8 BPT_NEXT[RSI]
JMP @@3
@@4: RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
RESTORE_CONTEXT::
XOR EAX,EAX
MOV RAX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
LOCK
INC U8 CPU_SWAP_CNTER[RAX]
XOR EAX,EAX
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RAX]
BT U4 TSS_TASK_FLAGS[RSI],TSSf_DISABLE_BPTS
JC @@4
MOV RDX,U8 TSS_BPT_LIST[RSI]
@@3: OR RDX,RDX
JZ @@4
MOV RDI,U8 BPT_ADDRESS[RDX]
CMP RDI,U8 TSS_RIP[RSI]
JNE @@5
BTR U8 BPT_FLAGS[RDX],SBPTf_DISABLE
JC @@6
@@5: MOV AL,U1 [RDI]
MOV U1 BPT_U1[RDX],AL
MOV U1 [RDI],0xCC
@@6: MOV RDX,U8 BPT_NEXT[RDX]
JMP @@3
@@4: INC U8 TSS_SWAP_CNTER[RSI]
FRSTOR U4 TSS_FPU[RSI]
XOR EAX,EAX
RDTSC
SHL RDX,32
ADD RAX,RDX
MOV RBX,RAX
MOV U8 TSS_TIME_SLICE_START[RSI],RBX
MOV RBX,U8 TSS_RBX[RSI]
MOV RCX,U8 TSS_RCX[RSI]
MOV RDX,U8 TSS_RDX[RSI]
MOV RDI,U8 TSS_RDI[RSI]
MOV RBP,U8 TSS_RBP[RSI]
MOV R8,U8 TSS_R8[RSI]
MOV R9,U8 TSS_R9[RSI]
MOV R10,U8 TSS_R10[RSI]
MOV R11,U8 TSS_R11[RSI]
MOV R12,U8 TSS_R12[RSI]
MOV R13,U8 TSS_R13[RSI]
MOV R14,U8 TSS_R14[RSI]
MOV R15,U8 TSS_R15[RSI]
MOV RAX,U8 TSS_RAX[RSI]
PUSH ZERO_DS_SEL
PUSH U8 TSS_RSP[RSI]
PUSH U8 TSS_RFLAGS[RSI]
PUSH SYS_CS64_SEL
PUSH U8 TSS_RIP[RSI]
MOV RSI,U8 TSS_RSI[RSI]
IRET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
END_TASK_EVT::
MOV RAX,RSI
CALL PUT_FS_BASE
CALL END_TASK
MOV RSI,RAX
CALL PUT_FS_BASE
JMP SIN_PART2
ALIGN 8,OC_NOP
SWAP_IN_NEXT::
PUSHFD
CLI
CALL SAVE_CONTEXT
XOR ESI,ESI
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RSI]
MOV RBX,U4 IDLE_POINT
MOV U8 TSS_RIP[RSI],RBX
POP U8 TSS_RFLAGS[RSI]
MOV U8 TSS_RSP[RSI],RSP
SIN_PART1::
MOV RSI,U8 TSS_NEXT_TSS[RSI]
SIN_PART2::
TEST U4 [SYS_FLAGS],1<<SYSf_CTRL_ALT_DEL|1<<SYSf_CTRL_ALT_ESC|
1<<SYSf_CTRL_ALT_TAB|1<<SYSf_CTRL_ALT_X|1<<SYSf_CTRL_ALT_C
JNZ SWAP_EVT
SIN_PART3::
BT U4 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
JC END_TASK_EVT
@@1: TEST U4 TSS_TASK_FLAGS[RSI],1<<TSSf_AWAITING_MSG|1<<TSSf_SUSPENDED
JNZ SIN_PART1
CMP U4 TSS_IN_QUEUE_SIGNATURE[RSI],TSSS_IN_QUEUE_SIGNATURE
JNE RECOVER_FROM_BAD_TASK
MOV RAX,RSI
CALL PUT_FS_BASE
JMP U4 RESTORE_CONTEXT
RECOVER_FROM_BAD_TASK::
XOR EAX,EAX
MOV RAX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
MOV RSI,U8 CPU_CAIN_TSS[RAX]
JMP SIN_PART2
ALIGN 8,OC_NOP
IDLE_POINT::
RET
ALIGN 8,OC_NOP
SWAP_EVT::
MOV RAX,RSI
CALL PUT_FS_BASE
XOR EAX,EAX
MOV RAX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
MOV RAX,U8 CPU_NUM[RAX]
OR RAX,RAX
JNZ SIN_PART3
MOV RAX,U4 SYS_FLAGS
BTR U4 [RAX],SYSf_CTRL_ALT_DEL
JC U4 CP_REBOOT
BTR U4 [RAX],SYSf_CTRL_ALT_ESC
JNC @@2
CALL SPAWN_USER_AND_ACTIVATE
JMP CONT_SWAP2
@@2: BTR U4 [RAX],SYSf_CTRL_ALT_TAB
JNC @@3
CALL CP_ACTIVATE_NEXT_USER
JMP CONT_SWAP2
@@3: BTR U4 [RAX],SYSf_CTRL_ALT_X
JC END_ACTIVE_USER
BTR U4 [RAX],SYSf_CTRL_ALT_C
JNC U4 SIN_PART2
BREAK_ACTIVE_USER::
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
OR RSI,RSI
JZ RECOVER_FROM_BAD_TASK
BT U4 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
JNC U4 SIN_PART3
MOV RAX,CP_BREAK
MOV U8 TSS_RIP[RSI],RAX
JMP U4 SIN_PART3
END_ACTIVE_USER::
CALL DEACTIVATE_USER
PUSH RSI
CALL ACTIVATE_NEXT_USER
POP RSI
OR RSI,RSI
JZ U4 RECOVER_FROM_BAD_TASK
MOV RAX,RSI
CALL PUT_FS_BASE
BT U4 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
JNC U4 SIN_PART2
BTS U4 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
CONT_SWAP2::
XOR ESI,ESI
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RSI]
JMP U4 SIN_PART2
IDLE_END::
////**************************PROCEDURE*************************
MSG_USER_CMD_DESC: DU1 "User CMD",0;
ALIGN 8,OC_NOP
SPAWN_USER_AND_ACTIVATE::
PUSHFD
CLI
PUSH RAX
PUSH RCX
PUSH RDX
PUSH RBX
PUSH RBP
PUSH RSI
PUSH RDI
MOV U8 [SYS_CUR_FOCUS_TASK],0
PUSH TRUE //add to queue
PUSH DEFAULT_STACK
PUSH 0 ///use adam account
PUSH 0 //Adam is parent
PUSH U4 MSG_USER_CMD_DESC
PUSH U4 CP_USER_CMD_LINE
CALL CP_SPAWN_TASK
ADD RSP,48
PUSH RAX
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_WIN_TO_TOP*8[RAX]
OR RAX,RAX
JZ @@1
CALL RAX
@@1: ADD RSP,8
POP RDI
POP RSI
POP RBP
POP RBX
POP RDX
POP RCX
POP RAX
POPFD
RET
////**************************PROCEDURE*************************
//IN: RSI=CUR User TSS
ALIGN 8,OC_NOP
ACTIVATE_NEXT_USER:
PUSHFD
CLI
PUSH RDI
OR RSI,RSI
JNZ @@11
MOV RSI,U4 SYS_ADAM_TSS
@@11: MOV RDI,RSI
MOV RSI,U8 TSS_NEXT_TSS[RSI]
@@14: BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
JNC @@19
CMP U8 [SYS_CUR_FOCUS_TASK],RSI
JE @@19
MOV U8 [SYS_CUR_FOCUS_TASK],RSI
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_WIN_TO_TOP*8[RAX]
OR RAX,RAX
JZ @@19B
PUSH RAX
PUSH RCX
PUSH RDX
PUSH RBX
PUSH RBP
PUSH RSI
PUSH RDI
PUSH RSI
CALL RAX
ADD RSP,8
POP RDI
POP RSI
POP RBP
POP RBX
POP RDX
POP RCX
POP RAX
JMP @@19B
@@19: MOV RSI,U8 TSS_NEXT_TSS[RSI]
CMP RSI,RDI
JNE @@14
@@19B: POP RDI
POPFD
RET
////**************************PROCEDURE*************************
//OUT: ESI=TSS OF User
ALIGN 8,OC_NOP
DEACTIVATE_USER:
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
MOV U8 [SYS_CUR_FOCUS_TASK],0
RET
////**************************PROCEDURE*************************
//IN: ESI=CUR User TSS
ALIGN 8,OC_NOP
CP_ACTIVATE_NEXT_USER::
PUSH RSI
CALL DEACTIVATE_USER
CALL ACTIVATE_NEXT_USER
POP RSI
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_DEACTIVATE_USER::
PUSH RSI
CALL DEACTIVATE_USER
MOV RAX,RSI
POP RSI
RET
Binary file not shown.
+120 -81
View File
@@ -1,22 +1,6 @@
BoolU4 YorN()
{
I8 ch;
cout "(y or n)? ";
while (TRUE) {
ch=ToUpper(GetKey);
if (ch=='Y') {
coutln "$$FU$$$$BU$$YES$$FG$$$$BG$$";
return TRUE;
} else if (ch=='N') {
coutln "$$FU$$$$BU$$NO$$FG$$$$BG$$";
return FALSE;
}
}
}
I1 *PointAtListEntry(I8 entry_number, I1 *lst)
{
while (*lst && entry_number) {
while (*lst && entry_number>0) {
while (*lst) /* Advance to end of cur entry. */
lst++;
lst++; /* Skip trailing zero */
@@ -26,19 +10,22 @@ I1 *PointAtListEntry(I8 entry_number, I1 *lst)
lst++;
}
}
return lst;
if (entry_number)
return NULL;
else
return lst;
}
I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL)
/* RETURNS: -2 if Ambiguous, -1 if not found, else entry_number */
{
I8 l,entry_num=0,result=-1,unutilized_src;
I8 n,entry_num=0,result=-1,unutilized_src;
I1 *s;
BoolU4 exact_match=FALSE;
l=StrLen(src);
n=StrLen(src);
if (ambiguity_overkill_ptr)
*ambiguity_overkill_ptr=l;
*ambiguity_overkill_ptr=n;
while (*lst) {
if (*lst=='@') { /* Check for '@' alias list entry*/
entry_num--;
@@ -56,7 +43,7 @@ I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL)
s++;
lst++;
}
unutilized_src=l-(s-src);
unutilized_src=n-(s-src);
if (!(*s)) { /* Did we reach end of sourcecout */
if (!(*lst)) { /* Did we reach end of list entrycout */
if (!ambiguity_overkill_ptr)
@@ -91,8 +78,7 @@ I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL)
void UndefinedSysText(I1 *name)
{
PutSysText("ST_UNDEFINED_SYSTEXT");
PutS(name);
coutln "Error: Undefined SysText: '",name,"'.";
throw(EXCEPT_UNDEF_SYSTEXT,name);
}
@@ -101,7 +87,7 @@ I1 *SysText(I1 *name)
{
SysHashEntry *temph=FindLocalHash(name,HTT_SYSTEXT);
if (temph)
return temph->user0;
return temph->user_data0;
else
UndefinedSysText(name);
}
@@ -110,7 +96,7 @@ I1 *SysTextSub(U8 sub,I1 *name)
{
SysHashEntry *temph=FindLocalHash(name,HTT_SYSTEXT);
if (temph)
return PointAtListEntry(sub,temph->user0);
return PointAtListEntry(sub,temph->user_data0);
else
UndefinedSysText(name);
}
@@ -119,7 +105,7 @@ I8 SysTextSubCount(I1 *name)
{
SysHashEntry *temph=FindLocalHash(name,HTT_SYSTEXT);
if (temph)
return temph->user1;
return temph->user_data1;
else
UndefinedSysText(name);
}
@@ -131,7 +117,6 @@ I8 MatchSysTextEntry(I1 *src, I1 *lst_name,
flags,ambiguity_overkill_ptr);
}
asm {CP_PUT_SYSTEXT:}
void PutSysText(I1 *name)
{
PutS(SysText(name));
@@ -140,15 +125,13 @@ void PutSysText(I1 *name)
SysHashEntry *LoadStr(I1 *name, I1 *st)
{
SysHashEntry *temph,
*temph1=FindHashBucket(name,Fs->hash_table);
SysHashEntry *temph;
temph=MAllocZ(sizeof(SysHashEntry));
temph->next=*temph1;
*temph1=temph;
temph->type=HTT_SYSTEXT;
temph->string=NewString(name);
temph->user0=NewString(st);
temph->user1=-1;
temph->str=NewStr(name);
temph->user_data0=NewStr(st);
temph->user_data1=-1;
AddSysHashEntry(temph,Fs->hash_table);
return temph;
}
@@ -156,21 +139,19 @@ SysHashEntry *LoadList(I1 *name, I1 *st)
{
U8 cnt=0;
I1 *ptr;
SysHashEntry *temph,
*temph1=FindHashBucket(name,Fs->hash_table);
SysHashEntry *temph;
temph=MAllocZ(sizeof(SysHashEntry));
temph->next=*temph1;
*temph1=temph;
temph->type=HTT_SYSTEXT;
temph->string=NewString(name);
temph->str=NewStr(name);
ptr=st;
while (*ptr) {
while (*ptr++);
cnt++;
}
temph->user0=MAlloc(ptr+1-st);
MemCpy(temph->user0,st,ptr+1-st);
temph->user1=cnt;
temph->user_data0=MAlloc(ptr+1-st);
MemCpy(temph->user_data0,st,ptr+1-st);
temph->user_data1=cnt;
AddSysHashEntry(temph,Fs->hash_table);
return temph;
}
@@ -249,7 +230,7 @@ I1 *TabsToSpaces(I1 *src)
temp=MAlloc(l<<1);
MemCpy(temp,dst,col+1);
Free(dst);
l*=2;
l<<=1;
dst=temp;
}
col++;
@@ -259,7 +240,7 @@ I1 *TabsToSpaces(I1 *src)
return dst;
}
I1 *StringUtil(I1 *u, I8 mask)
I1 *StrUtil(I1 *u, I8 mask)
{
I1 *src,*dst;
I8 ch;
@@ -331,30 +312,34 @@ I1 *StringUtil(I1 *u, I8 mask)
return u;
}
I1 *MStringUtil(I1 *src,U8 flags)
I1 *MStrUtil(I1 *src,U8 flags)
//Return a $LK,"MAlloc","MN:MAlloc"$()ed result from StrUtil
{
I1 *dst=NewString(src),*dst2,*temp;
StringUtil(dst,flags);
I1 *dst=NewStr(src),*dst2,*temp;
StrUtil(dst,flags);
if (flags & SU_T2S) {
temp=TabsToSpaces(dst);
Free(dst);
dst=temp;
}
dst2=NewString(dst); //Shorten
dst2=NewStr(dst); //Shorten
Free(dst);
return dst2;
}
I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst)
I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst=NULL)
{
I1 *temp,*temp1,ch;
temp = src;
temp1= dst;
while ( (ch= *src++) && !Occurrences(marker,ch) )
*dst++=ch;
if (dst) {
while ( (ch= *src++) && !Occurrences(marker,ch) )
*dst++=ch;
*dst = 0;
} else
while ( (ch= *src++) && !Occurrences(marker,ch) );
*dst = 0;
if (ch)
StrCpy(temp,src);
else
@@ -363,7 +348,7 @@ I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst)
}
I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst)
I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst=NULL)
{
I1 *temp;
@@ -371,16 +356,18 @@ I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst)
while (temp>src && !Occurrences(marker,*temp))
temp--;
if (Occurrences(marker,*temp)) {
StrCpy(dst,temp+1);
if (dst)
StrCpy(dst,temp+1);
*temp=0;
} else {
StrCpy(dst,src);
if (dst)
StrCpy(dst,src);
*src=0;
}
return dst;
}
I1 *SearchString(I1 *src,I1 *pattern,U8 flags=0)
I1 *SearchStr(I1 *src,I1 *pattern,U8 flags=0)
{
BoolU4 cont;
U1 *src2;
@@ -417,7 +404,7 @@ I1 *SearchString(I1 *src,I1 *pattern,U8 flags=0)
return src;
}
BoolU4 WildCardMatch(I1 *wild_st,I1 *src_st)
BoolU8 WildCardMatch(I1 *wild_st,I1 *src_st)
{
U8 ch1,ch2;
while (TRUE) {
@@ -445,10 +432,11 @@ BoolU4 WildCardMatch(I1 *wild_st,I1 *src_st)
}
}
BoolU4 WildFileNameList(I1 *wild_st,I1 *src_st)
BoolU8 WildFileNameList(I1 *wild_st,I1 *src_st)
{
BoolU4 result=FALSE;
I1 *buf1=NewString(wild_st),
I1 *buf1=NewStr(wild_st),
*buf2=MAlloc(StrLen(wild_st)+1);
while (TRUE) {
RemoveFirstSeg(buf1,";",buf2);
@@ -470,13 +458,16 @@ BoolU4 WildFileNameList(I1 *wild_st,I1 *src_st)
return result;
}
I1 *Add2String(I1 *base,I1 *addition)
{ //doubles length
I1 *Add2Str(I1 *base,I1 *addition)
//Concatinates a string onto another string.
//Returns new string.
//Doubles length when it grows.
{
I1 *result;
I8 blen=StrLen(base),alen=StrLen(addition);
I8 bmem=MSize(base);
if (blen+alen+1>bmem) {
result=MAlloc(bmem<<1+alen+1);
result=MAlloc(bmem<<1+alen+4);
MemCpy(result,base,blen);
StrCpy(result+blen,addition);
Free(base);
@@ -519,7 +510,7 @@ void CheckLTBlkDev(LTBlkDev *bdev)
if (!bdev || bdev->ch_L!='L' ||
bdev->ch_B!='B' || bdev->ch_D!='D')
throw(EXCEPT_BLKDEV,1);
if (!bdev->type || bdev->type>LTBDT_FILE)
if (bdev->type<=LTBDT_NULL || bdev->type>LTBDT_NON_LT_FILE)
throw(EXCEPT_BLKDEV,2);
}
@@ -531,7 +522,7 @@ LTBlkDev *DriveToBlkDev(I1 drive=0)
return bdev;
}
BoolU4 DriveIsWritable(I1 drive=0)
BoolU8 DriveIsWritable(I1 drive=0)
{
LTBlkDev *bdev=DriveToBlkDev(drive);
if (bdev->flags & LTBDF_READ_ONLY)
@@ -554,10 +545,10 @@ I1 *AbsoluteDirName(I1 *name)
I8 maxlen;
I1 drive[3],*hdir,*cur_dir,*buf2,*buf3,*buf,*my_name,*temp_name;
if (!Fs->cur_dir)
return NewString(name);
return NewStr(name);
if (!*Fs->cur_dir)
return NewString(name);
my_name=MStringUtil(name,
return NewStr(name);
my_name=MStrUtil(name,
SU_REMOVE_LEADING|SU_REMOVE_TRAILING|
SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS);
temp_name=my_name;
@@ -570,16 +561,16 @@ I1 *AbsoluteDirName(I1 *name)
else
drive[0]=*my_name;
my_name=my_name+2;
cur_dir=NewString("/");
cur_dir=NewStr("/");
} else
cur_dir=NewString(Fs->cur_dir);
cur_dir=NewStr(Fs->cur_dir);
if (*my_name=='/') {
Free(cur_dir);
cur_dir=NewString("/");
cur_dir=NewStr("/");
my_name++;
}
buf2=NewString(my_name);
buf2=NewStr(my_name);
maxlen=StrLen(cur_dir)+1+StrLen(buf2)+1;
buf3=MAlloc(maxlen);
buf =MAlloc(maxlen);
@@ -589,7 +580,7 @@ I1 *AbsoluteDirName(I1 *name)
if (!*buf)
StrCpy(buf3,"/");
else if (!StrCmp(buf,"..")) {
RemoveLastSeg(buf3,"/",buf);
RemoveLastSeg(buf3,"/");
if (!*buf3)
StrCpy(buf3,"/");
} else if (!StrCmp(buf,".")) {
@@ -597,7 +588,7 @@ I1 *AbsoluteDirName(I1 *name)
} else if (*buf) {
if (!StrCmp(buf,"HOME")) {
Free(buf3);
hdir=HomeDirString;
hdir=HomeDirStr;
buf3=MAlloc(maxlen+StrLen(hdir));
StrCpy(buf3,hdir+2);
Free(hdir);
@@ -623,11 +614,11 @@ I1 *AbsoluteDirName(I1 *name)
I1 *AbsoluteFileName(I1 *name)
{
I1 *buf,*buf2,*buf3,*my_name,*temp_name,*temp_buf;
my_name=MStringUtil(name,
my_name=MStrUtil(name,
SU_REMOVE_LEADING|SU_REMOVE_TRAILING|
SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS);
temp_name=my_name;
buf=NewString(my_name);
buf=NewStr(my_name);
temp_buf=buf;
if (*buf && buf[1]==':') {
buf+=2;
@@ -652,14 +643,12 @@ I1 *AbsoluteFileName(I1 *name)
I1 *ChangeExtension(I1 *name,I1 *extension)
{
I1 *buf=MAlloc(StrLen(name)+1),
*result=MAlloc(StrLen(name)+1+StrLen(extension)+1);
I1 *result=MAlloc(StrLen(name)+1+StrLen(extension)+1);
StrCpy(result,name);
if (Occurrences(name,'.'))
RemoveLastSeg(result,".",buf);
RemoveLastSeg(result,".");
StrCat(result,".");
StrCat(result,extension);
Free(buf);
return result;
}
@@ -690,7 +679,7 @@ U8 FileAttr(I1 *name,U8 attr=0)
return attr;
}
BoolU4 CheckFileName(I1 *name)
BoolU8 CheckFileName(I1 *name)
{
I1 *ptr=name;
if (!name) return FALSE;
@@ -705,3 +694,53 @@ BoolU4 CheckFileName(I1 *name)
return FALSE;
return TRUE;
}
I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL)
{
BoolU4 neg=FALSE;
I1 ch;
I8 result=0,k=0;
if (radix<2||radix>36) return 0;
while (*st==CH_SPACE || *st==CH_SHIFT_SPACE || *st==CH_TAB)
st++;
if (*st=='-') {
st++;
neg=TRUE;
}
if (*st=='+') st++;
while (ch=ToUpper(*st++)) {
k++;
if (radix==10) {
if (ch>='0' && ch<='9')
result=result*10+ch-'0';
else if (k==2 && !result) {
if (ch=='X')
radix=16;
else if (ch=='B')
radix=2;
else if (ch=='o')
radix=8;
else
break;
} else
break;
} else if (radix>10) {
if (ch>='0' && ch<='9')
result=result*radix+ch-'0';
else if (ch>='A' && ch<='A'+radix-11)
result=result*radix+ch-'A'+10;
else
break;
} else {
if (ch>='0' && ch<='0'+radix-1)
result=result*radix+ch-'0';
else
break;
}
}
if (end_ptr) *end_ptr=st-1;
return (neg)? -result:result;
}
+97
View File
@@ -0,0 +1,97 @@
void LoadSysStrs()
{
LoadStr("ST_USER_STARTUP","Welcome\r\n");
LoadStr("ST_UNDEFINED_EXTERN","Undefined Extern\r\n");
LoadStr("ST_FILE_NOT_FOUND","File not found.\r\n");
LoadStr("ST_INVALID_FILENAME","Invalid File Name.\r\n");
LoadStr("ST_PRESS_A_KEY","$$BK,1$$PRESS A KEY$$BK,0$$\r\n");
LoadStr("ST_ARE_YOU_SURE","ARE YOU SURE ");
LoadStr("ST_NOT_LT","Not LT Partition\r\n");
LoadStr("ST_NOT_ISO9660","Not ISO9660 Partition\r\n");
LoadStr("ST_DELETE","Del ");
LoadStr("ST_INVALID_DRIVE","Invalid Drive\r\n");
LoadStr("ST_CUR_PARTITION","Current Partition: ");
LoadStr("ST_NO_MATCHING_ENTRIES","No matching entries\r\n");
LoadList("ST_LTF_CMDS","TX\0CR\0SR\0CU\0TB\0CL\0PB\0DA\0PL\0LM\0RM\0HD\0"
"FO\0ID\0FG\0BG\0FD\0BD\0FL\0BL\0"
"FM\0BM\0FA\0BA\0FH\0BH\0FE\0BE\0FU\0BU\0WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0"
"CB\0MA\0MU\0HX\0HS\0HE\0TR\0PI\0IB\0IT\0IS\0BP\0SO\0OL\0OR\0PW\0ER\0");
LoadList("ST_LTF_FLAGS","A\0L\0"
"LC\0LE\0LM\0LA\0RC\0RE\0RM\0RA\0"
"DC\0BI\0X\0Q\0LX\0CX\0RX\0TY\0CY\0BY\0SX\0SY\0SCX\0SCY\0WR\0"
"WD\0HT\0 \0 \0 \0 \0 \0"
"B\0S\0BD\0C\0CK\0RD\0P\0T\0"
"Z\0WW\0UL\0IV\0BK\0SEL\0H\0TR\0SK\0AL\0PU\0PRY\0MRX\0"
"TML\0TMR\0FST\0");
LoadList("ST_HTT_TYPES","StrConst\0SysSym\0KeyWord\0LocVar\0GlbVar\0Class\0"
"IntType\0Funct\0Word\0DictWord\0OpCode\0R8\0R16\0R32\0R64\0"
"SegReg\0SysText\0File\0Module\0HelpFile\0.\0.\0.\0.\0.\0Private\0"
"Public\0Export\0Import\0Lit\0UnrLoc\0UnrGlb\0");
LoadList("ST_DAYS_OF_WEEK","Sunday\0Monday\0Tuesday\0Wednesday\0"
"Thursday\0Friday\0Saturday\0");
LoadList("ST_MONTHS","January\0February\0March\0April\0May\0"
"June\0July\0August\0September\0October\0November\0December\0");
LoadList("ST_EXCEPT_TYPES","Local\0Compiler\0Arithmetic\0Undefined Systext\0"
"Undefined Extern\0File\0Break\0File Xsum\0"
"FDC error\0Partition error\0Blk Dev error\0"
"Floating\0Graphics\0SPrintF\0");
LoadList("ST_FILE_ATTRS","R\0H\0S\0V\0D\0A\0.\0.\0X\0Y\0T\0Z\0"
"C\0F\0");
LoadList("ST_FILE_UTIL_FLAGS","r\0d\0i\0l\0?\0a\0c\0R\0p\0m\0D\0t\0");
LoadList("ST_BLKDEV_TYPES","NULL \0RAM \0FDC \0ATA \0ATAPI\0FILE_\0NONLT\0");
LoadList("ST_GRELEM_TYPES","End\0.\0Color (4-bit)\0.\0Point\0"
"Line\0PolyLine\0PolyPoint\0Width\0Shift\0"
"BSpline2\0BSpline3\0BSpline2 Closed\0BSpline3 Closed\0SpeedLine\0"
" \0 \0Box\0Circle\0Flood Fill Not Color\0Flood Fill\0BitMap (4-bit)\0"
"BitMap (4-bit) Transparent\0Text\0Ellipse\0");
LoadList("ST_LINK_TYPES","FI\0FA\0FF\0FL\0MN\0PI\0PF\0PL\0BF\0DF\0HI\0");
LoadStr("ST_ADDDRIVES0",
"\r\n\r\n\r\n$$BK,1$$$$FG,PURPLE$$Add drives to this installation so they will "
"be present when you boot.$$FG$$$$BK,0$$\r\n");
LoadStr("ST_ADDDRIVES1",
"\r\n****** Add Drives ******\r\n"
"The base drive letter is the letter\r\n"
"of the first partition. If adding\r\n"
"a hard drive, you should pick 'C'.\r\n"
"If more than one partition is present\r\n"
"they will be lettered in sequence.\r\n"
"\r\n"
"Base Drive Letter(ENTER to exit):");
LoadStr("ST_ADDDRIVES2",
"\t1=RAM\r\n\t2=FDC(Floppy)\r\n\t3=ATA(Harddisk)\r\n"
"\t4=ATAPI(CD-ROM)\r\n\t5=LT File\r\n"
"\t6=Non LT File\r\n"
"Type:");
LoadStr("ST_ADDDRIVES3",
"Filename:");
LoadStr("ST_ADDDRIVES4",
"Reformat (with each boot) ");
LoadStr("ST_ADDDRIVES5",
"Blks(2880 for floppy):");
LoadStr("ST_ADDDRIVES7",
"\t0=Master\r\n\t1=Slave\r\nUnit:");
LoadStr("ST_ADDDRIVES11",
"\r\nReformat WHOLE drive!");
LoadStr("ST_ADDDRIVES12a",
"Press ENTER to use booted CD-ROM\r\n");
LoadStr("ST_ADDDRIVES12",
"Base0:\r\n");
LoadStr("ST_ADDDRIVES13",
"Base1:\r\n");
LoadStr("ST_ADDDRIVES14",
"Irq:\r\n");
LoadStr("ST_ADDDRIVES15",
"Non LT Drive Letter:");
LoadStr("ST_ADDDRIVES16",
"File blk num:");
LoadStr("ST_FAILED","\r\n\r\n$$BK,1$$$$FG,RED$$Operation Failed$$BK,0$$$$FG$$\r\n\r\n");
LoadList("ST_COLORS","BLACK\0BLUE\0GREEN\0CYAN\0"
"RED\0PURPLE\0BROWN\0LTGRAY\0DKGRAY\0LTBLUE\0LTGREEN\0"
"LTCYAN\0LTRED\0LTPURPLE\0YELLOW\0WHITE\0\0");
$AN,"Anchor for inserting OS systext","OS_SYSTEXT"$
}
+884
View File
@@ -0,0 +1,884 @@
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_CALL::
PUSH RBP
MOV RBP,RSP
MOV RAX,U8 SF_PARAM1[RBP]
OR RAX,RAX
JZ @@100
CALL RAX
@@100: POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
OR_U4_BIT_FIELD::
PUSH RBP
MOV RBP,RSP
MOV RBX,U8 SF_PARAM2[RBP]
SHR RBX,3
ADD RBX,U8 SF_PARAM1[RBP]
MOV RAX,U8 SF_PARAM3[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
AND RCX,7
SHL RAX,CL
OR U8 [RBX],RAX
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
SYS_EBF_MASKTABLE:
DU8 0,1,3,7,15,31,63,127,255;
DU8 0x1FF,0x3FF,0x7FF,0x0FFF;
DU8 0x1FFF,0x3FFF,0x7FFF,0x0FFFF;
DU8 0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF;
DU8 0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF;
DU8 0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF;
DU8 0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF,0xFFFFFFFF;
EXTRACT_U4_BIT_FIELD::
PUSH RBP
MOV RBP,RSP
MOV RBX,U8 SF_PARAM2[RBP]
MOV CL,3
SHR RBX,3
ADD RBX,U8 SF_PARAM1[RBP]
MOV RAX,U8 [RBX]
MOV RCX,U8 SF_PARAM2[RBP]
AND RCX,7
SHR RAX,CL
MOV RBX,U8 SF_PARAM3[RBP]
AND RAX,U8 SYS_EBF_MASKTABLE[RBX*8]
POP RBP
RET
////**************************PROCEDURE*************************
// IN: RSI=STRUCT TO INSERT
// RDI=PREDECESSOR
ALIGN 8,OC_NOP
INSQUE::
PUSH RBX
MOV RBX,U8 [RDI]
MOV U8 [RDI],RSI
MOV U8 [RSI],RBX
MOV U8 8[RSI],RDI
MOV U8 8[RBX],RSI
POP RBX
RET
////**************************PROCEDURE*************************
// IN: RSI=STRUCT TO INSERT
// RDI=SUCCESSOR
ALIGN 8,OC_NOP
INSQUE_REV::
PUSH RBX
MOV RBX,U8 8[RDI]
MOV U8 [RBX],RSI
MOV U8 [RSI],RDI
MOV U8 8[RSI],RBX
MOV U8 8[RDI],RSI
POP RBX
RET
////**************************PROCEDURE*************************
// IN: RSI=STRUCT TO REMOVE
ALIGN 8,OC_NOP
REMQUE::
PUSH RBX
PUSH RDI
MOV RBX,U8 [RSI]
MOV RDI,U8 8[RSI]
MOV U8 [RDI],RBX
MOV U8 8[RBX],RDI
POP RDI
POP RBX
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_REP_INSW::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RDI,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM3[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
REP_INSW
POP RDI
POP RBP
RET
ALIGN 8,OC_NOP
CP_REP_INSB::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RDI,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM3[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
REP_INSB
POP RDI
POP RBP
RET
ALIGN 8,OC_NOP
CP_REP_OUTSW::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM3[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
REP_OUTSW
POP RSI
POP RBP
RET
ALIGN 8,OC_NOP
CP_REP_OUTSB::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM3[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
REP_OUTSB
POP RSI
POP RBP
RET
ALIGN 8,OC_NOP
CP_HLT::
HLT
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FSQRT::
PUSH RBP
MOV RBP,RSP
FLD U8 SF_PARAM1[RBP]
FSQRT
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FSIN::
PUSH RBP
MOV RBP,RSP
FLD U8 SF_PARAM1[RBP]
FSIN
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FCOS::
PUSH RBP
MOV RBP,RSP
FLD U8 SF_PARAM1[RBP]
FCOS
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FTAN::
PUSH RBP
MOV RBP,RSP
FLD U8 SF_PARAM1[RBP]
@@1: FPTAN
FSTSW
FWAIT
TEST AX,0x400
JNZ @@1
FFREE
FINCSTP
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FATAN::
PUSH RBP
MOV RBP,RSP
FLD U8 SF_PARAM1[RBP]
FLD1
@@1: FPATAN
FSTSW
FWAIT
TEST AX,0x400
JNZ @@1
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_ARG::
PUSH RBP
MOV RBP,RSP
FLD U8 SF_PARAM2[RBP]
FLD U8 SF_PARAM1[RBP]
@@1: FPATAN
FSTSW
FWAIT
TEST AX,0x400
JNZ @@1
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_ROUND::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FSTCW U4 -8[RBP]
FWAIT
MOV AX,U2 -8[RBP]
MOV U2 -6[RBP],AX
AND AX,~0x0C00
MOV U2 -8[RBP],AX
FLDCW U4 -8[RBP]
FLD U8 SF_PARAM1[RBP]
FRNDINT
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
FLDCW U4 -6[RBP]
FWAIT
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_TRUNC::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FSTCW U4 -8[RBP]
FWAIT
MOV AX,U2 -8[RBP]
MOV U2 -6[RBP],AX
OR AX,0x0C00
MOV U2 -8[RBP],AX
FLDCW U4 -8[RBP]
FLD U8 SF_PARAM1[RBP]
FRNDINT
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
FLDCW U4 -6[RBP]
FWAIT
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FLOOR::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FSTCW U4 -8[RBP]
FWAIT
MOV AX,U2 -8[RBP]
MOV U2 -6[RBP],AX
AND AX,~0x0C00
OR AX,0x0400
MOV U2 -8[RBP],AX
FLDCW U4 -8[RBP]
FLD U8 SF_PARAM1[RBP]
FRNDINT
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,U8 SF_PARAM1[RBP]
FLDCW U4 -6[RBP]
FWAIT
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_CEILING::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FSTCW U4 -8[RBP]
FWAIT
MOV AX,U2 -8[RBP]
MOV U2 -6[RBP],AX
AND AX,~0x0C00
OR AX,0x0800
MOV U2 -8[RBP],AX
FLDCW U4 -8[RBP]
FLD U8 SF_PARAM1[RBP]
FRNDINT
FSTP U8 SF_PARAM1[RBP]
FWAIT
MOV RAX,SF_PARAM1[RBP]
FLDCW U4 -6[RBP]
FWAIT
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_POW10::
PUSH RBP
MOV RBP,RSP
SUB RSP,16
FSTCW U4 -8[RBP]
FWAIT
MOV AX,U2 -8[RBP]
MOV U2 -6[RBP],AX
OR AX,0x0C00
MOV U2 -8[RBP],AX
FLDCW U4 -8[RBP]
FLDL2T
FLD U8 SF_PARAM1[RBP]
FMULP
FST U8 SF_PARAM1[RBP]
FRNDINT
FLD U8 SF_PARAM1[RBP]
FSUBRP
F2XM1
FLD1
FADDP
FSTP U8 -16[RBP]
FFREE
FINCSTP
FLD U8 SF_PARAM1[RBP]
FLD U8 -16[RBP]
FSCALE // ST0<<ST1
FSTP U8 -16[RBP]
FFREE
FINCSTP
FLDCW U4 -6[RBP]
FWAIT
POP RAX
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_EXP::
PUSH RBP
MOV RBP,RSP
SUB RSP,16
FSTCW U4 -8[RBP]
FWAIT
MOV AX,U2 -8[RBP]
MOV U2 -6[RBP],AX
OR AX,0x0C00
MOV U2 -8[RBP],AX
FLDCW U4 -8[RBP]
FLDL2E
FLD U8 SF_PARAM1[RBP]
FMULP
FST U8 SF_PARAM1[RBP]
FRNDINT
FLD U8 SF_PARAM1[RBP]
FSUBRP
F2XM1
FLD1
FADDP
FSTP U8 -16[RBP]
FFREE
FINCSTP
FLD U8 SF_PARAM1[RBP]
FLD U8 -16[RBP]
FSCALE // ST0<<ST1
FSTP U8 -16[RBP]
FFREE
FINCSTP
FLDCW U4 -6[RBP]
FWAIT
POP RAX
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_LOG10::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FLDLG2
FLD U8 SF_PARAM1[RBP]
FYL2X // y*log2(x)
FSTP U8 -8[RBP]
FFREE
FINCSTP
FWAIT
POP RAX
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_LOG2::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FLD1
FLD U8 SF_PARAM1[RBP]
FYL2X // y*log2(x)
FSTP U8 -8[RBP]
FFREE
FINCSTP
FWAIT
POP RAX
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_LN::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FLDLN2
FLD U8 SF_PARAM1[RBP]
FYL2X // y*log2(x)
FSTP U8 -8[RBP]
FFREE
FINCSTP
FWAIT
POP RAX
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FLDCW::
PUSH RBP
MOV RBP,RSP
FLDCW U4 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FSTCW::
PUSH RBP
MOV RBP,RSP
SUB RSP,8
FSTCW U4 -8[RBP]
MOVZX RAX,U2 -8[RBP]
ADD RSP,8
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FSTSW::
XOR EAX,EAX
FSTSW
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_FCLEX::
FCLEX
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_CLFLUSH::
PUSH RBP
MOV RBP,RSP
MOV RAX,U8 SF_PARAM1[RBP]
CLFLUSH U1 [RAX]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_CPUID::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RAX,U8 SF_PARAM1[RBP]
CPUID
MOV RSI,U8 SF_PARAM2[RBP]
MOV U8 [RSI],RAX
MOV U8 8[RSI],RBX
MOV U8 16[RSI],RCX
MOV U8 24[RSI],RDX
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_GETCR0::
XOR EAX,EAX
// MOV EAX,CR0
DU1 0x0F,0x20,0xC0;
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_SETCR0::
PUSH RBP
MOV RBP,RSP
MOV RAX,U8 SF_PARAM1[RBP]
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_LTR::
PUSH RBP
MOV RBP,RSP
LTR U4 SF_PARAM1[RBP]
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_GETCR3::
XOR EAX,EAX
// MOV EAX,CR3
DU1 0x0F,0x20,0xD8;
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_SETCR3::
PUSH RBP
MOV RBP,RSP
MOV RAX,U8 SF_PARAM1[RBP]
//dbgo precede with REX
// MOV CR3,EAX
DU1 0x0F,0x22,0xD8;
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_GETCR4::
XOR EAX,EAX
// MOV EAX,CR4
DU1 0x0F,0x20,0xE0;
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_SETCR4::
PUSH RBP
MOV RBP,RSP
MOV RAX,U8 SF_PARAM1[RBP]
// MOV CR4,EAX
DU1 0x0F,0x22,0xE0;
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_INDCALL::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RDX,U8 SF_PARAM1[RBP]
MOV RCX,U8 SF_PARAM2[RBP] //argc
LEA RSI,U8 SF_PARAM3[RBP] //argv
SHL RCX,3
SUB RSP,RCX
MOV RDI,RSP
REP_MOVSB
@@10: OR RDX,RDX
JZ @@100
CALL RDX
@@20: MOV RCX,U8 SF_PARAM2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
@@100: XOR EAX,EAX
MOV RCX,U8 SF_PARAM2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_CALLEXTNUM::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RDX,U8 SF_PARAM1[RBP]
MOV RCX,U8 SF_PARAM2[RBP] //argc
LEA RSI,U8 SF_PARAM3[RBP] //argv
SHL RCX,3
SUB RSP,RCX
MOV RDI,RSP
REP_MOVSB
@@10: MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 [RAX+RDX*8]
OR RAX,RAX
JZ @@100
CALL RAX
@@20: MOV RCX,U8 SF_PARAM2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
@@100: XOR EAX,EAX
MOV RCX,U8 SF_PARAM2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_CALLEXTSTR::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RCX,U8 SF_PARAM2[RBP] //argc
LEA RSI,U8 SF_PARAM3[RBP] //argv
SHL RCX,3
SUB RSP,RCX
MOV RDI,RSP
REP_MOVSB
@@10: MOV RSI,U8 SF_PARAM1[RBP]
CALL FIND_EXTERN
OR RSI,RSI
JZ @@100
CALL RSI
@@20: MOV RCX,U8 SF_PARAM2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
@@100: XOR EAX,EAX
MOV RCX,U8 SF_PARAM2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
/*
I8 ArcDetermineCompressionType(U1 *src,U8 size)
{
U8 i,j=0;
for (i=0;i<size;i++)
j|=src[i];
if (j & 0x80)
return CT_8_BIT;
else
return CT_7_BIT;
}
*/
ALIGN 8,OC_NOP
CP_ARC_DETERMINE_COMPRESSION_TYPE::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
OR RCX,RCX
JZ @@100
XOR EBX,EBX
@@1: LODSB
OR BL,AL
LOOP @@1
OR BL,BL
JNS @@100
MOV RAX,CT_8_BIT
JMP @@110
@@100: MOV RAX,CT_7_BIT
@@110: POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
/*
U8 ArcCheckSum(U1 *buf,U8 size)
{
U4 *ptr=buf;
U8 result=0,i,l=size>>2;
for (i=0;i<l;i++)
result^=ptr[i];
return result;
}
*/
ALIGN 8,OC_NOP
CP_ARC_CHECK_SUM::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U8 SF_PARAM1[RBP]
MOV RCX,U8 SF_PARAM2[RBP]
XOR EBX,EBX
SHR RCX,2
JZ @@100
@@1: LODSD
XOR RBX,RAX
LOOP @@1
@@100: MOV RAX,RBX
POP RSI
POP RBP
RET
////**************************PROCEDURE*************************
/*
void ArcGetTableEntry(ArcCs *c)
{
U8 i;
ArcTableEntry *temp,*temp1;
if (c->entry_used) {
i=c->free_index;
c->entry_used=FALSE;
c->cur_entry=c->next_entry;
c->cur_bits_in_use=c->next_bits_in_use;
if (c->next_bits_in_use<ARC_MAX_BITS) {
c->next_entry = &c->compress[i++];
if (i==c->free_limit) {
c->next_bits_in_use++;
c->free_limit=1<<c->next_bits_in_use;
}
} else {
do if (++i==c->free_limit)
i=c->min_table_entry;
while (c->hash[i]);
temp=&c->compress[i];
c->next_entry=temp;
temp1=&c->hash[temp->basecode];
while (temp1) {
if (temp1->next==temp) {
temp1->next=temp->next;
break;
} else
temp1=temp1->next;
}
}
c->free_index=i;
}
}
*/
ALIGN 8,OC_NOP
CP_ARC_GET_TABLE_ENTRY::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RSI,U8 SF_PARAM1[RBP]
BTR U8 ACS_ENTRY_USED[RSI],0
JNC U4 @@100
MOV RDX,U8 ACS_FREE_INDEX[RSI]
XOR EAX,EAX
MOV RAX,U8 ACS_NEXT_ENTRY[RSI]
MOV U8 ACS_CUR_ENTRY[RSI],RAX
MOV RCX,U8 ACS_NEXT_BITS_IN_USE[RSI]
MOV U8 ACS_CUR_BITS_IN_USE[RSI],RCX
CMP RCX,ARC_MAX_BITS
JAE @@20
MOV RAX,RDX
SHL RAX,4
LEA RAX,U8 ACS_COMPRESS[RSI+RAX]
MOV U8 ACS_NEXT_ENTRY[RSI],RAX
INC RDX
CMP U8 ACS_FREE_LIMIT[RSI],RDX
JNE @@90
INC RCX
MOV U8 ACS_NEXT_BITS_IN_USE[RSI],RCX
MOV RAX,1
SHL RAX,CL
MOV U8 ACS_FREE_LIMIT[RSI],RAX
JMP @@90
@@20: INC RDX
CMP U8 ACS_FREE_LIMIT[RSI],RDX
JNE @@25
MOV RDX,U8 ACS_MIN_TABLE_ENTRY[RSI]
@@25: MOV RAX,U8 ACS_HASH[RSI+RDX*8]
OR RAX,RAX
JNZ @@20
MOV RDI,RDX
SHL RDI,4
LEA RDI,U8 ACS_COMPRESS[RSI+RDI]
MOV U4 ACS_NEXT_ENTRY[RSI],EDI
MOVZX RBX,U2 ATE_BASECODE[RDI]
LEA RCX,U8 ACS_HASH[RSI+RBX*8]
@@50: OR RCX,RCX
JZ @@90
MOV RAX,U8 ATE_NEXT[RCX]
CMP RDI,RAX
JNE @@55
MOV RAX,U8 ATE_NEXT[RDI]
MOV U8 ATE_NEXT[RCX],RAX
JMP @@90
@@55: MOV RCX,RAX
JMP @@50
@@90: MOV U8 ACS_FREE_INDEX[RSI],RDX
@@100: POP RDI
POP RSI
POP RBP
RET
CP_PUT_GS_BASE::
PUSH RBP
MOV RBP,RSP
MOV RAX,SF_PARAM1[RBP]
PUSH RAX
PUSH RCX
PUSH RDX
MOV RDX,RAX
SHR RDX,32
MOV ECX,IA32_GS_BASE
WRMSR
POP RDX
POP RCX
POP RAX
POP RBP
RET
PUT_FS_BASE::
PUSH RAX
PUSH RCX
PUSH RDX
MOV RDX,RAX
SHR RDX,32
MOV ECX,IA32_FS_BASE
WRMSR
POP RDX
POP RCX
POP RAX
RET