(kernel/kernel.asm):00001 ******************************************************************************* (kernel/kernel.asm):00002 * TurbOS (kernel/kernel.asm):00003 ******************************************************************************* (kernel/kernel.asm):00004 * See LICENSE.txt for licensing information. (kernel/kernel.asm):00005 ******************************************************************************* (kernel/kernel.asm):00006 * (kernel/kernel.asm):00007 * Edt/Rev YYYY/MM/DD Modified by (kernel/kernel.asm):00008 * Comment (kernel/kernel.asm):00009 * ---------------------------------------------------------------------------- (kernel/kernel.asm):00010 * 2023/08/11 Boisy Pitre (kernel/kernel.asm):00011 * Initial creation. (kernel/kernel.asm):00012 * (kernel/kernel.asm):00013 ******************************************************************************* (kernel/kernel.asm):00014 * NOTES: (kernel/kernel.asm):00015 * (kernel/kernel.asm):00016 * This is how the memory map looks after the kernel has initialized: (kernel/kernel.asm):00017 * (kernel/kernel.asm):00018 * $0000----> ================================== (kernel/kernel.asm):00019 * | | (kernel/kernel.asm):00020 * | | (kernel/kernel.asm):00021 * $0020-$0111 | System Globals (D.FMBM-D.XNMI) | (kernel/kernel.asm):00022 * | | (kernel/kernel.asm):00023 * | | (kernel/kernel.asm):00024 * $0200---->|==================================| (kernel/kernel.asm):00025 * | Free Memory Bitmap | (kernel/kernel.asm):00026 * $0200-$021F | (1 bit = 256 byte page) | (kernel/kernel.asm):00027 * |----------------------------------| (kernel/kernel.asm):00028 * $0220-$0221 | IOMan I/O Call Pointer | (kernel/kernel.asm):00029 * |----------------------------------| (kernel/kernel.asm):00030 * | System Dispatch Table | (kernel/kernel.asm):00031 * $0222-$0291 | (Room for 56 addresses) | (kernel/kernel.asm):00032 * |----------------------------------| (kernel/kernel.asm):00033 * $0292-$02FF | User Dispatch Table | (kernel/kernel.asm):00034 * | (Room for 56 addresses) | (kernel/kernel.asm):00035 * $0300---->|==================================| (kernel/kernel.asm):00036 * | | (kernel/kernel.asm):00037 * | | (kernel/kernel.asm):00038 * $0300-$03FF | Module Directory Entries | (kernel/kernel.asm):00039 * | (Room for 64 entries) | (kernel/kernel.asm):00040 * | | (kernel/kernel.asm):00041 * $0400---->|==================================| (kernel/kernel.asm):00042 * | | (kernel/kernel.asm):00043 * $0400-$04FF | System Stack | (kernel/kernel.asm):00044 * | | (kernel/kernel.asm):00045 * $0500---->|==================================| (kernel/kernel.asm):00046 * (kernel/kernel.asm):00047 (kernel/kernel.asm):00048 nam Kernel (kernel/kernel.asm):00049 ttl TurbOS Kernel (kernel/kernel.asm):00050 (kernel/kernel.asm):00051 use defs.d ( defs.d):00001 * TurbOS system definitions ( defs.d):00002 use turbos.d ( turbos.d):00001 ******************************************************************************* ( turbos.d):00002 * TurbOS ( turbos.d):00003 ******************************************************************************* ( turbos.d):00004 * See LICENSE.txt for licensing information. ( turbos.d):00005 ******************************************************************************* ( turbos.d):00006 * ( turbos.d):00007 * Edt/Rev YYYY/MM/DD Modified by ( turbos.d):00008 * Comment ( turbos.d):00009 * ---------------------------------------------------------------------------- ( turbos.d):00010 * 2023/08/11 Boisy Pitre ( turbos.d):00011 * Initial creation. ( turbos.d):00012 * ( turbos.d):00013 ******************************************************************************* ( turbos.d):00014 ( turbos.d):00015 ifne TURBOS.D-1 ( turbos.d):00016 0001 ( turbos.d):00017 TURBOS.D set 1 ( turbos.d):00018 ( turbos.d):00019 nam turbos.d ( turbos.d):00020 ttl TurbOS system definitions ( turbos.d):00021 ( turbos.d):00022 * Common definitions 0001 ( turbos.d):00023 true equ 1 0000 ( turbos.d):00024 false equ 0 ( turbos.d):00025 ( turbos.d):00026 pag ( turbos.d):00027 ***************************************** ( turbos.d):00028 * System service request code definitions ( turbos.d):00029 * ( turbos.d):00030 org 0 ( turbos.d):00031 * User and system state calls 0000 ( turbos.d):00032 F$Link rmb 1 link to module 0001 ( turbos.d):00033 F$Load rmb 1 load module from file 0002 ( turbos.d):00034 F$UnLink rmb 1 unlink module 0003 ( turbos.d):00035 F$Fork rmb 1 start new process 0004 ( turbos.d):00036 F$Wait rmb 1 wait for child process to die 0005 ( turbos.d):00037 F$Chain rmb 1 chain process to new module 0006 ( turbos.d):00038 F$Exit rmb 1 terminate process 0007 ( turbos.d):00039 F$Mem rmb 1 set memory size 0008 ( turbos.d):00040 F$Send rmb 1 send signal to process 0009 ( turbos.d):00041 F$Icpt rmb 1 set signal intercept 000A ( turbos.d):00042 F$Sleep rmb 1 suspend process 000B ( turbos.d):00043 F$ID rmb 1 return process ID 000C ( turbos.d):00044 F$SPrior rmb 1 set process priority 000D ( turbos.d):00045 F$SSWI rmb 1 set software interrupt 000E ( turbos.d):00046 F$PErr rmb 1 print Error 000F ( turbos.d):00047 F$PrsNam rmb 1 parse pathlist name 0010 ( turbos.d):00048 F$CmpNam rmb 1 compare two names 0011 ( turbos.d):00049 F$SchBit rmb 1 search bit map 0012 ( turbos.d):00050 F$AllBit rmb 1 allocate in bit map 0013 ( turbos.d):00051 F$DelBit rmb 1 deallocate in bit map 0014 ( turbos.d):00052 F$Time rmb 1 get current time 0015 ( turbos.d):00053 F$STime rmb 1 set current time 0016 ( turbos.d):00054 F$CRC rmb 1 generate CRC ( turbos.d):00055 ( turbos.d):00056 org $27 beginning of system reserved calls ( turbos.d):00057 * System state (privileged) calls 0027 ( turbos.d):00058 F$VIRQ rmb 1 install/delete virtual IRQ 0028 ( turbos.d):00059 F$SRqMem rmb 1 system memory request 0029 ( turbos.d):00060 F$SRtMem rmb 1 system memory return 002A ( turbos.d):00061 F$IRQ rmb 1 enter IRQ polling table 002B ( turbos.d):00062 F$IOQu rmb 1 enter I/O queue 002C ( turbos.d):00063 F$AProc rmb 1 enter active process queue 002D ( turbos.d):00064 F$NProc rmb 1 start next process 002E ( turbos.d):00065 F$VModul rmb 1 validate module 002F ( turbos.d):00066 F$Find64 rmb 1 find process/path descriptor 0030 ( turbos.d):00067 F$All64 rmb 1 allocate process/path descriptor 0031 ( turbos.d):00068 F$Ret64 rmb 1 return process/path descriptor 0032 ( turbos.d):00069 F$SSvc rmb 1 service request table initialization 0033 ( turbos.d):00070 F$IODel rmb 1 delete I/O module ( turbos.d):00071 ( turbos.d):00072 * ( turbos.d):00073 * System calls $70 through $7F are reserved for user definitions ( turbos.d):00074 * ( turbos.d):00075 org $70 0070 ( turbos.d):00076 rmb 16 reserved for user definition ( turbos.d):00077 ( turbos.d):00078 pag ( turbos.d):00079 ************************************** ( turbos.d):00080 * I/O service request code definitions ( turbos.d):00081 * ( turbos.d):00082 org $80 0080 ( turbos.d):00083 I$Attach rmb 1 attach I/O device 0081 ( turbos.d):00084 I$Detach rmb 1 detach I/O device 0082 ( turbos.d):00085 I$Dup rmb 1 duplicate path 0083 ( turbos.d):00086 I$Create rmb 1 create new file 0084 ( turbos.d):00087 I$Open rmb 1 open existing file 0085 ( turbos.d):00088 I$MakDir rmb 1 make directory file 0086 ( turbos.d):00089 I$ChgDir rmb 1 change default directory 0087 ( turbos.d):00090 I$Delete rmb 1 delete file 0088 ( turbos.d):00091 I$Seek rmb 1 change current position 0089 ( turbos.d):00092 I$Read rmb 1 read data 008A ( turbos.d):00093 I$Write rmb 1 write data 008B ( turbos.d):00094 I$ReadLn rmb 1 read line of ASCII data 008C ( turbos.d):00095 I$WritLn rmb 1 write line of ASCII data 008D ( turbos.d):00096 I$GetStt rmb 1 get path status 008E ( turbos.d):00097 I$SetStt rmb 1 set path status 008F ( turbos.d):00098 I$Close rmb 1 close path 0090 ( turbos.d):00099 I$DeletX rmb 1 delete from current exec dir ( turbos.d):00100 ( turbos.d):00101 ******************* ( turbos.d):00102 * File access modes ( turbos.d):00103 * 0001 ( turbos.d):00104 READ. equ %00000001 0002 ( turbos.d):00105 WRITE. equ %00000010 0003 ( turbos.d):00106 UPDAT. equ READ.+WRITE. 0004 ( turbos.d):00107 EXEC. equ %00000100 0008 ( turbos.d):00108 PREAD. equ %00001000 0010 ( turbos.d):00109 PWRIT. equ %00010000 0020 ( turbos.d):00110 PEXEC. equ %00100000 0040 ( turbos.d):00111 SHARE. equ %01000000 0080 ( turbos.d):00112 DIR. equ %10000000 0020 ( turbos.d):00113 ISIZ. equ %00100000 ( turbos.d):00114 ( turbos.d):00115 ************** ( turbos.d):00116 * Signal codes ( turbos.d):00117 * ( turbos.d):00118 org 0 0000 ( turbos.d):00119 S$Kill rmb 1 non-interceptable abort 0001 ( turbos.d):00120 S$Wake rmb 1 wake-up sleeping process 0002 ( turbos.d):00121 S$Abort rmb 1 keyboard abort 0003 ( turbos.d):00122 S$Intrpt rmb 1 keyboard interrupt ( turbos.d):00123 ( turbos.d):00124 pag ( turbos.d):00125 ********************************** ( turbos.d):00126 * Status codes for GetStat/SetStat ( turbos.d):00127 * ( turbos.d):00128 org 0 0000 ( turbos.d):00129 SS.Opt rmb 1 read/Write path descriptor options 0001 ( turbos.d):00130 SS.Ready rmb 1 check for device ready 0002 ( turbos.d):00131 SS.Size rmb 1 read/write file size 0003 ( turbos.d):00132 SS.Reset rmb 1 device restore 0004 ( turbos.d):00133 rmb 1 0005 ( turbos.d):00134 SS.Pos rmb 1 get file's current position 0006 ( turbos.d):00135 SS.EOF rmb 1 test for end of file 0007 ( turbos.d):00136 SS.Link rmb 1 link to status routines 0008 ( turbos.d):00137 SS.ULink rmb 1 unlink status routines 0009 ( turbos.d):00138 rmb 1 000A ( turbos.d):00139 SS.Frz rmb 1 freeze DD. information 000B ( turbos.d):00140 SS.SPT rmb 1 set DD.TKS to given value 000C ( turbos.d):00141 rmb 1 000D ( turbos.d):00142 SS.DCmd rmb 1 send direct command to disk 000E ( turbos.d):00143 SS.DevNm rmb 1 return device name (32-bytes at [X]) 000F ( turbos.d):00144 SS.FD rmb 1 return file descriptor (Y-bytes at [X]) 0010 ( turbos.d):00145 SS.Ticks rmb 1 set lockout honor duration 0011 ( turbos.d):00146 SS.Lock rmb 1 lock/release record 0012 ( turbos.d):00147 rmb 1 0013 ( turbos.d):00148 rmb 1 0014 ( turbos.d):00149 SS.BlkRd rmb 1 block read 0015 ( turbos.d):00150 SS.BlkWr rmb 1 block write 0016 ( turbos.d):00151 SS.Reten rmb 1 retension cycle 0017 ( turbos.d):00152 SS.WFM rmb 1 write file mark 0018 ( turbos.d):00153 SS.RFM rmb 1 read past file mark 0019 ( turbos.d):00154 SS.ELog rmb 1 read error log 001A ( turbos.d):00155 SS.SSig rmb 1 send signal on data ready 001B ( turbos.d):00156 SS.Relea rmb 1 release device 001C ( turbos.d):00157 rmb 1 001D ( turbos.d):00158 rmb 1 001E ( turbos.d):00159 SS.RsBit rmb 1 reserve bitmap sector (do not allocate in) LSB(X)=sct# 001F ( turbos.d):00160 rmb 1 reserved 0020 ( turbos.d):00161 rmb 1 0021 ( turbos.d):00162 rmb 3 0024 ( turbos.d):00163 rmb 1 0025 ( turbos.d):00164 rmb 1 0026 ( turbos.d):00165 rmb 1 0027 ( turbos.d):00166 rmb 1 0028 ( turbos.d):00167 SS.ComSt rmb 1 Getstat/SetStat for baud/parity 0029 ( turbos.d):00168 SS.Open rmb 1 SetStat to tell driver a path was opened 002A ( turbos.d):00169 SS.Close rmb 1 SetStat to tell driver a path was closed 002B ( turbos.d):00170 SS.HngUp rmb 1 SetStat to tell driver to hangup phone 002C ( turbos.d):00171 SS.FSig rmb 1 new signal for temp locked files 002D ( turbos.d):00172 rmb 19 ( turbos.d):00173 ( turbos.d):00174 org $A0 00A0 ( turbos.d):00175 rmb 1 00A1 ( turbos.d):00176 SS.Fill rmb 1 enable command-line history erase (scf) ( turbos.d):00177 ttl Direct Page Definitions ( turbos.d):00178 pag ( turbos.d):00179 ( turbos.d):00180 ********************************** ( turbos.d):00181 * Direct page variable definitions ( turbos.d):00182 * ( turbos.d):00183 org $00 ( turbos.d):00184 org $20 0020 ( turbos.d):00185 D.FMBM rmb 4 free memory bit map pointers 0024 ( turbos.d):00186 D.MLIM rmb 2 upper RAM memory limit 0026 ( turbos.d):00187 D.ModDir rmb 4 module directory pointers (start and end) 002A ( turbos.d):00188 D.Init rmb 2 configuration module base address 002C ( turbos.d):00189 D.SWI3 rmb 2 SWI3 vector 002E ( turbos.d):00190 D.SWI2 rmb 2 SWI2 vector 0030 ( turbos.d):00191 D.FIRQ rmb 2 FIRQ vector 0032 ( turbos.d):00192 D.IRQ rmb 2 IRQ vector 0034 ( turbos.d):00193 D.SWI rmb 2 SWI vector 0036 ( turbos.d):00194 D.NMI rmb 2 NMI vector 0038 ( turbos.d):00195 D.SvcIRQ rmb 2 interrupt service entry 003A ( turbos.d):00196 D.Poll rmb 2 interrupt polling routine 003C ( turbos.d):00197 D.UsrIRQ rmb 2 user interrupt routine 003E ( turbos.d):00198 D.SysIRQ rmb 2 system interrupt routine 0040 ( turbos.d):00199 D.UsrSvc rmb 2 user service request routine 0042 ( turbos.d):00200 D.SysSvc rmb 2 system service request routine 0044 ( turbos.d):00201 D.UsrDis rmb 2 user service request dispatch table 0046 ( turbos.d):00202 D.SysDis rmb 2 system service reuest dispatch table 0048 ( turbos.d):00203 D.Slice rmb 1 process time slice count 0049 ( turbos.d):00204 D.PrcDBT rmb 2 process descriptor block table 004B ( turbos.d):00205 D.Proc rmb 2 process descriptor address 004D ( turbos.d):00206 D.AProcQ rmb 2 active process queue 004F ( turbos.d):00207 D.WProcQ rmb 2 waiting process queue 0051 ( turbos.d):00208 D.SProcQ rmb 2 sleeping process queue 0053 ( turbos.d):00209 D.Time equ . time 0053 ( turbos.d):00210 D.Year rmb 1 current year 0054 ( turbos.d):00211 D.Month rmb 1 current month 0055 ( turbos.d):00212 D.Day rmb 1 current da 0056 ( turbos.d):00213 D.Hour rmb 1 current hour 0057 ( turbos.d):00214 D.Min rmb 1 current minute 0058 ( turbos.d):00215 D.Sec rmb 1 current second 0059 ( turbos.d):00216 D.Ticks rmb 4 number of ticks since boot 005D ( turbos.d):00217 D.Tick rmb 1 current tick 005E ( turbos.d):00218 D.TSec rmb 1 ticks per second 005F ( turbos.d):00219 D.TSlice rmb 1 ticks per time-slice 0060 ( turbos.d):00220 D.IOML rmb 2 I/O manager free memory low bound 0062 ( turbos.d):00221 D.IOMH rmb 2 I/O manager free memory hi bound 0064 ( turbos.d):00222 D.DevTbl rmb 2 device driver table address 0066 ( turbos.d):00223 D.PolTbl rmb 2 interrupt polling table address 0068 ( turbos.d):00224 D.PthDBT rmb 2 path descriptor block table addrress 006A ( turbos.d):00225 D.BTLO rmb 2 bootstrap low address 006C ( turbos.d):00226 D.BTHI rmb 2 bootstrap hi address 006E ( turbos.d):00227 D.Clock rmb 2 address of clock tick routine 0070 ( turbos.d):00228 D.Boot rmb 1 bootstrap attempted flag 0071 ( turbos.d):00229 D.URtoSs rmb 2 address of user to system routine (VIRQ) 0073 ( turbos.d):00230 D.VIRQTable rmb 2 pointer to virtual IRQ table 0075 ( turbos.d):00231 D.CRC rmb 1 CRC checking mode flag ( turbos.d):00232 ( turbos.d):00233 org $100 0100 ( turbos.d):00234 D.XSWI3 rmb 3 0103 ( turbos.d):00235 D.XSWI2 rmb 3 0106 ( turbos.d):00236 D.XSWI rmb 3 0109 ( turbos.d):00237 D.XNMI rmb 3 010C ( turbos.d):00238 D.XIRQ rmb 3 010F ( turbos.d):00239 D.XFIRQ rmb 3 ( turbos.d):00240 ( turbos.d):00241 * Table Sizes 0020 ( turbos.d):00242 BMAPSZ equ 65536/256/8 memory allocation bitmap table size 0002 ( turbos.d):00243 SVCTNM equ 2 number of service request tables 006E ( turbos.d):00244 SVCTSZ equ (256-BMAPSZ)/SVCTNM-2 service request table size ( turbos.d):00245 ( turbos.d):00246 ttl Structure Formats ( turbos.d):00247 pag ( turbos.d):00248 ************************************ ( turbos.d):00249 * Module directory entry definitions ( turbos.d):00250 * ( turbos.d):00251 org 0 0000 ( turbos.d):00252 MD$MPtr rmb 2 module pointer 0002 ( turbos.d):00253 MD$Link rmb 1 module link count 0003 ( turbos.d):00254 rmb 1 0004 ( turbos.d):00255 MD$ESize equ . module directory entry size ( turbos.d):00256 ( turbos.d):00257 ************************************ ( turbos.d):00258 * Module definitions ( turbos.d):00259 * ( turbos.d):00260 * Universal module offsets ( turbos.d):00261 * ( turbos.d):00262 org 0 0000 ( turbos.d):00263 M$ID rmb 2 ID code 0002 ( turbos.d):00264 M$Size rmb 2 module size 0004 ( turbos.d):00265 M$Name rmb 2 module name 0006 ( turbos.d):00266 M$Type rmb 1 type / language 0007 ( turbos.d):00267 M$Revs rmb 1 attributes / revision level 0008 ( turbos.d):00268 M$Parity rmb 1 header parity 0009 ( turbos.d):00269 M$IDSize equ . Mmdule ID size ( turbos.d):00270 ( turbos.d):00271 * ( turbos.d):00272 * Type-dependent module offsets ( turbos.d):00273 * ( turbos.d):00274 * System, file manager, device driver, program module ( turbos.d):00275 * 0009 ( turbos.d):00276 M$Exec rmb 2 execution entry offset ( turbos.d):00277 * ( turbos.d):00278 * Device driver, program module ( turbos.d):00279 * 000B ( turbos.d):00280 M$Mem rmb 2 stack requirement ( turbos.d):00281 * ( turbos.d):00282 * Device driver, device descriptor module ( turbos.d):00283 * 000D ( turbos.d):00284 M$Mode rmb 1 device driver mode capabilities ( turbos.d):00285 * ( turbos.d):00286 * Device descriptor module ( turbos.d):00287 * ( turbos.d):00288 org M$IDSize 0009 ( turbos.d):00289 M$FMgr rmb 2 file manager name offset 000B ( turbos.d):00290 M$PDev rmb 2 device driver name offset 000D ( turbos.d):00291 rmb 1 M$Mode (defined above) 000E ( turbos.d):00292 M$Port rmb 3 port address 0011 ( turbos.d):00293 M$Opt rmb 1 device default options 0012 ( turbos.d):00294 M$DTyp rmb 1 device type 0012 ( turbos.d):00295 IT.DTP equ M$DTyp descriptor type offset ( turbos.d):00296 ( turbos.d):00297 * ( turbos.d):00298 * Configuration module entry offsets ( turbos.d):00299 * ( turbos.d):00300 org M$IDSize 0009 ( turbos.d):00301 CM$MaxMem rmb 3 maximum free memory 000C ( turbos.d):00302 CM$PollCnt rmb 1 entries in interrupt polling table 000D ( turbos.d):00303 CM$DevCnt rmb 1 entries in device table 000E ( turbos.d):00304 CM$TickMod rmb 2 tick generator module name 0010 ( turbos.d):00305 CM$GoMod rmb 2 startup module name ( turbos.d):00306 ifne _FF_UNIFIED_IO 0012 ( turbos.d):00307 CM$StoreMod rmb 2 initial storage device name 0012 ( turbos.d):00308 CM$ConsoleMod rmb 2 initial console device name ( turbos.d):00309 endc ( turbos.d):00310 ifne _FF_BOOTING 0012 ( turbos.d):00311 CM$BootMod rmb 2 boot module name ( turbos.d):00312 endc 0012 ( turbos.d):00313 CM$OSLevel rmb 1 operating system level 0013 ( turbos.d):00314 CM$OSVer rmb 1 operating system version 0014 ( turbos.d):00315 CM$OSMajor rmb 1 operating system major 0015 ( turbos.d):00316 CM$OSMinor rmb 1 operating system minor 0016 ( turbos.d):00317 CM$Feature1 rmb 1 feature byte 1 0017 ( turbos.d):00318 CM$Feature2 rmb 1 feature byte 2 0018 ( turbos.d):00319 rmb 4 reserved for future use ( turbos.d):00320 ( turbos.d):00321 * Feature1 byte definitions 0001 ( turbos.d):00322 CRCOn equ %00000001 CRC checking on 0000 ( turbos.d):00323 CRCOff equ %00000000 CRC checking off ( turbos.d):00324 ( turbos.d):00325 pag ( turbos.d):00326 ************************** ( turbos.d):00327 * Module field definitions ( turbos.d):00328 * ( turbos.d):00329 * ID field - first two bytes of a module ( turbos.d):00330 * 0087 ( turbos.d):00331 M$ID1 equ $87 module ID code byte one 00CD ( turbos.d):00332 M$ID2 equ $CD module ID code byte two 87CD ( turbos.d):00333 M$ID12 equ M$ID1*256+M$ID2 ( turbos.d):00334 ( turbos.d):00335 * ( turbos.d):00336 * Module type/language field masks ( turbos.d):00337 * 00F0 ( turbos.d):00338 TypeMask equ %11110000 type field 000F ( turbos.d):00339 LangMask equ %00001111 language field ( turbos.d):00340 ( turbos.d):00341 * ( turbos.d):00342 * Module type values ( turbos.d):00343 * 00F0 ( turbos.d):00344 Devic equ $F0 device descriptor module 00E0 ( turbos.d):00345 Drivr equ $E0 physical device driver 00D0 ( turbos.d):00346 FlMgr equ $D0 file manager 00C0 ( turbos.d):00347 Systm equ $C0 system module 0040 ( turbos.d):00348 Data equ $40 data module 0020 ( turbos.d):00349 Sbrtn equ $20 subroutine module 0010 ( turbos.d):00350 Prgrm equ $10 program module ( turbos.d):00351 ( turbos.d):00352 * ( turbos.d):00353 * Module language values ( turbos.d):00354 * 0001 ( turbos.d):00355 Objct equ 1 object code module ( turbos.d):00356 ( turbos.d):00357 * ( turbos.d):00358 * Module attributes / revision byte ( turbos.d):00359 * ( turbos.d):00360 * Field masks ( turbos.d):00361 * 00F0 ( turbos.d):00362 AttrMask equ %11110000 attributes field 000F ( turbos.d):00363 RevsMask equ %00001111 revision level field ( turbos.d):00364 ( turbos.d):00365 * ( turbos.d):00366 * Attribute flags ( turbos.d):00367 * 0080 ( turbos.d):00368 ReEnt equ %10000000 re-entrant module ( turbos.d):00369 ( turbos.d):00370 ******************** ( turbos.d):00371 * Device type values ( turbos.d):00372 * ( turbos.d):00373 * These values define various classes of devices, which are ( turbos.d):00374 * managed by a file manager module. The device type is embedded ( turbos.d):00375 * in a device descriptor. ( turbos.d):00376 * 0000 ( turbos.d):00377 DT.SCF equ 0 sequential character file manager 0001 ( turbos.d):00378 DT.RBF equ 1 random block file manager 0002 ( turbos.d):00379 DT.Pipe equ 2 pipe file manager ( turbos.d):00380 ( turbos.d):00381 ********************* ( turbos.d):00382 * CRC result constant ( turbos.d):00383 * 0080 ( turbos.d):00384 CRCCon1 equ $80 0FE3 ( turbos.d):00385 CRCCon23 equ $0FE3 ( turbos.d):00386 ( turbos.d):00387 ttl Process Information ( turbos.d):00388 pag ( turbos.d):00389 ******************************** ( turbos.d):00390 * Process descriptor definitions ( turbos.d):00391 * 000C ( turbos.d):00392 DefIOSiz equ 12 0010 ( turbos.d):00393 NumPaths equ 16 number of local paths ( turbos.d):00394 ( turbos.d):00395 org 0 0000 ( turbos.d):00396 P$ID rmb 1 process ID 0001 ( turbos.d):00397 P$PID rmb 1 parent's ID 0002 ( turbos.d):00398 P$SID rmb 1 sibling's ID 0003 ( turbos.d):00399 P$CID rmb 1 child's ID 0004 ( turbos.d):00400 P$SP rmb 2 stack pointer 0006 ( turbos.d):00401 P$CHAP rmb 1 process chapter number 0007 ( turbos.d):00402 P$ADDR rmb 1 user address beginning page number 0008 ( turbos.d):00403 P$PagCnt rmb 1 memory page count 0009 ( turbos.d):00404 P$User rmb 2 user index 000B ( turbos.d):00405 P$Prior rmb 1 priority 000C ( turbos.d):00406 P$Age rmb 1 age 000D ( turbos.d):00407 P$State rmb 1 status 000E ( turbos.d):00408 P$Queue rmb 2 queue link (process pointer) 0010 ( turbos.d):00409 P$IOQP rmb 1 previous I/O queue link (process ID) 0011 ( turbos.d):00410 P$IOQN rmb 1 next I/O queue link (process ID) 0012 ( turbos.d):00411 P$PModul rmb 2 primary module 0014 ( turbos.d):00412 P$SWI rmb 2 SWI entry point 0016 ( turbos.d):00413 P$SWI2 rmb 2 SWI2 entry point 0018 ( turbos.d):00414 P$SWI3 rmb 2 SWI3 entry point 001A ( turbos.d):00415 P$DIO rmb DefIOSiz default I/O pointers 0026 ( turbos.d):00416 P$PATH rmb NumPaths I/O path table 0036 ( turbos.d):00417 P$Signal rmb 1 signal code 0037 ( turbos.d):00418 P$SigVec rmb 2 signal intercept vector 0039 ( turbos.d):00419 P$SigDat rmb 2 signal intercept data address 003B ( turbos.d):00420 P$NIO rmb 4 003F ( turbos.d):00421 rmb $40-. unused 0040 ( turbos.d):00422 P$Size equ . size of process descriptor ( turbos.d):00423 ( turbos.d):00424 * ( turbos.d):00425 * Process state flags ( turbos.d):00426 * 0080 ( turbos.d):00427 SysState equ %10000000 0040 ( turbos.d):00428 TimSleep equ %01000000 0020 ( turbos.d):00429 TimOut equ %00100000 0010 ( turbos.d):00430 ImgChg equ %00010000 0002 ( turbos.d):00431 Condem equ %00000010 0001 ( turbos.d):00432 Dead equ %00000001 ( turbos.d):00433 ( turbos.d):00434 ttl I/O Definitions ( turbos.d):00435 pag ( turbos.d):00436 ************************* ( turbos.d):00437 * Path descriptor offsets ( turbos.d):00438 * ( turbos.d):00439 org 0 0000 ( turbos.d):00440 PD.PD rmb 1 path number 0001 ( turbos.d):00441 PD.MOD rmb 1 mode (read/write/update) 0002 ( turbos.d):00442 PD.CNT rmb 1 number of open images 0003 ( turbos.d):00443 PD.DEV rmb 2 device table entry address 0005 ( turbos.d):00444 PD.CPR rmb 1 current process 0006 ( turbos.d):00445 PD.RGS rmb 2 caller's register stack 0008 ( turbos.d):00446 PD.BUF rmb 2 buffer address 000A ( turbos.d):00447 PD.FST rmb 32-. file manager's storage 0020 ( turbos.d):00448 PD.OPT equ . path descriptor options 0020 ( turbos.d):00449 PD.DTP rmb 1 device type 0021 ( turbos.d):00450 rmb 64-. path options end 0040 ( turbos.d):00451 PDSIZE equ . ( turbos.d):00452 ( turbos.d):00453 * ( turbos.d):00454 * Pathlist special symbols ( turbos.d):00455 * 002F ( turbos.d):00456 PDELIM equ '/ pathlist name separator 002E ( turbos.d):00457 PDIR equ '. directory 0040 ( turbos.d):00458 PENTIR equ '@ entire device ( turbos.d):00459 ( turbos.d):00460 pag ( turbos.d):00461 **************************** ( turbos.d):00462 * File manager entry offsets ( turbos.d):00463 * ( turbos.d):00464 org 0 0000 ( turbos.d):00465 FMCREA rmb 3 create (open new) file 0003 ( turbos.d):00466 FMOPEN rmb 3 open file 0006 ( turbos.d):00467 FMMDIR rmb 3 make directory 0009 ( turbos.d):00468 FMCDIR rmb 3 change directory 000C ( turbos.d):00469 FMDLET rmb 3 delete file 000F ( turbos.d):00470 FMSEEK rmb 3 position file 0012 ( turbos.d):00471 FMREAD rmb 3 read from file 0015 ( turbos.d):00472 FMWRIT rmb 3 write to file 0018 ( turbos.d):00473 FMRDLN rmb 3 read line 001B ( turbos.d):00474 FMWRLN rmb 3 write line 001E ( turbos.d):00475 FMGSTA rmb 3 get file status 0021 ( turbos.d):00476 FMSSTA rmb 3 set file status 0024 ( turbos.d):00477 FMCLOS rmb 3 close file ( turbos.d):00478 ( turbos.d):00479 ***************************** ( turbos.d):00480 * Device driver entry offsets ( turbos.d):00481 * ( turbos.d):00482 org 0 0000 ( turbos.d):00483 D$INIT rmb 3 device initialization 0003 ( turbos.d):00484 D$READ rmb 3 read from device 0006 ( turbos.d):00485 D$WRIT rmb 3 write to device 0009 ( turbos.d):00486 D$GSTA rmb 3 get device status 000C ( turbos.d):00487 D$PSTA rmb 3 put device status 000F ( turbos.d):00488 D$TERM rmb 3 device termination ( turbos.d):00489 ( turbos.d):00490 ********************* ( turbos.d):00491 * Device table format ( turbos.d):00492 * ( turbos.d):00493 org 0 0000 ( turbos.d):00494 V$DRIV rmb 2 device driver module 0002 ( turbos.d):00495 V$STAT rmb 2 device driver static storage 0004 ( turbos.d):00496 V$DESC rmb 2 device descriptor module 0006 ( turbos.d):00497 V$FMGR rmb 2 file manager module 0008 ( turbos.d):00498 V$USRS rmb 1 use count 0009 ( turbos.d):00499 DEVSIZ equ . ( turbos.d):00500 ( turbos.d):00501 ******************************* ( turbos.d):00502 * Device static storage offsets ( turbos.d):00503 * ( turbos.d):00504 org 0 0000 ( turbos.d):00505 V.PAGE rmb 1 port extended address 0001 ( turbos.d):00506 V.PORT rmb 2 device 'base' port address 0003 ( turbos.d):00507 V.LPRC rmb 1 last active process ID 0004 ( turbos.d):00508 V.BUSY rmb 1 active process ID (0=not busy) 0005 ( turbos.d):00509 V.WAKE rmb 1 active process descriptor if driver MUST wake-up 0006 ( turbos.d):00510 V.USER equ . driver allocation origin ( turbos.d):00511 ( turbos.d):00512 ******************************** ( turbos.d):00513 * Interrupt polling table format ( turbos.d):00514 * ( turbos.d):00515 org 0 0000 ( turbos.d):00516 Q$Poll rmb 2 absolute polling address 0002 ( turbos.d):00517 Q$Flip rmb 1 flip (EOR) byte; normally zero 0003 ( turbos.d):00518 Q$Mask rmb 1 polling mask (after flip) 0004 ( turbos.d):00519 Q$Serv rmb 2 absolute service routine Address 0006 ( turbos.d):00520 Q$Stat rmb 2 static storage address 0008 ( turbos.d):00521 Q$Prty rmb 1 priority (low numbers=top priority) 0009 ( turbos.d):00522 POLSIZ equ . ( turbos.d):00523 ( turbos.d):00524 ******************** ( turbos.d):00525 * VIRQ packet format ( turbos.d):00526 * ( turbos.d):00527 org 0 0000 ( turbos.d):00528 Vi.Cnt rmb 2 count down counter 0002 ( turbos.d):00529 Vi.Rst rmb 2 reset value for counter 0004 ( turbos.d):00530 Vi.Stat rmb 1 status byte 0005 ( turbos.d):00531 Vi.PkSz equ . ( turbos.d):00532 0001 ( turbos.d):00533 Vi.IFlag equ %00000001 status byte virq flag ( turbos.d):00534 ( turbos.d):00535 pag ( turbos.d):00536 ************************************* ( turbos.d):00537 * Machine characteristics definitions ( turbos.d):00538 * 0000 ( turbos.d):00539 R$CC equ 0 condition codes register 0001 ( turbos.d):00540 R$A equ 1 A accumulator 0002 ( turbos.d):00541 R$B equ 2 B accumulator 0001 ( turbos.d):00542 R$D equ R$A combined A:B accumulator 0003 ( turbos.d):00543 R$DP equ 3 direct page register 0004 ( turbos.d):00544 R$X equ 4 X index register 0006 ( turbos.d):00545 R$Y equ 6 Y index register 0008 ( turbos.d):00546 R$U equ 8 user stack register 000A ( turbos.d):00547 R$PC equ 10 program counter register 000C ( turbos.d):00548 R$Size equ 12 total register package size ( turbos.d):00549 0080 ( turbos.d):00550 Entire equ %10000000 full register stack flag 0040 ( turbos.d):00551 FIRQMask equ %01000000 fast interrupt mask bit 0020 ( turbos.d):00552 HalfCrry equ %00100000 half carry flag 0010 ( turbos.d):00553 IRQMask equ %00010000 interrupt mask bit 0008 ( turbos.d):00554 Negative equ %00001000 negative flag 0004 ( turbos.d):00555 Zero equ %00000100 zero flag 0002 ( turbos.d):00556 TwosOvfl equ %00000010 two's complement overflow flag 0001 ( turbos.d):00557 Carry equ %00000001 carry bit 0050 ( turbos.d):00558 IntMasks equ IRQMask+FIRQMask 0080 ( turbos.d):00559 Sign equ %10000000 sign bit ( turbos.d):00560 ( turbos.d):00561 ttl Error code definitions ( turbos.d):00562 pag ( turbos.d):00563 ************************ ( turbos.d):00564 * Error code definitions ( turbos.d):00565 * ( turbos.d):00566 org 200 00C8 ( turbos.d):00567 E$PthFul rmb 1 path table full 00C9 ( turbos.d):00568 E$BPNum rmb 1 bad path number 00CA ( turbos.d):00569 E$Poll rmb 1 polling table Full 00CB ( turbos.d):00570 E$BMode rmb 1 bad Mode 00CC ( turbos.d):00571 E$DevOvf rmb 1 device table overflow 00CD ( turbos.d):00572 E$BMID rmb 1 bad module ID 00CE ( turbos.d):00573 E$DirFul rmb 1 module directory full 00CF ( turbos.d):00574 E$MemFul rmb 1 process memory full 00D0 ( turbos.d):00575 E$UnkSvc rmb 1 unknown service code 00D1 ( turbos.d):00576 E$ModBsy rmb 1 module busy 00D2 ( turbos.d):00577 E$BPAddr rmb 1 bad page address 00D3 ( turbos.d):00578 E$EOF rmb 1 end of file 00D4 ( turbos.d):00579 rmb 1 00D5 ( turbos.d):00580 E$NES rmb 1 non-existent segment 00D6 ( turbos.d):00581 E$FNA rmb 1 file not accesible 00D7 ( turbos.d):00582 E$BPNam rmb 1 bad path name 00D8 ( turbos.d):00583 E$PNNF rmb 1 path name Not Found 00D9 ( turbos.d):00584 E$SLF rmb 1 segment list full 00DA ( turbos.d):00585 E$CEF rmb 1 creating existing file 00DB ( turbos.d):00586 E$IBA rmb 1 illegal block address 00DC ( turbos.d):00587 E$HangUp rmb 1 carrier detect lost 00DD ( turbos.d):00588 E$MNF rmb 1 module not found 00DE ( turbos.d):00589 rmb 1 00DF ( turbos.d):00590 E$DelSP rmb 1 deleting stack pointer memory 00E0 ( turbos.d):00591 E$IPrcID rmb 1 illegal process ID 00E0 ( turbos.d):00592 E$BPrcID equ E$IPrcID bad process ID 00E1 ( turbos.d):00593 rmb 1 00E2 ( turbos.d):00594 E$NoChld rmb 1 no children 00E3 ( turbos.d):00595 E$ISWI rmb 1 illegal SWI code 00E4 ( turbos.d):00596 E$PrcAbt rmb 1 process aborted 00E5 ( turbos.d):00597 E$PrcFul rmb 1 process table full 00E6 ( turbos.d):00598 E$IForkP rmb 1 illegal fork parameter 00E7 ( turbos.d):00599 E$KwnMod rmb 1 known module 00E8 ( turbos.d):00600 E$BMCRC rmb 1 bad module CRC 00E9 ( turbos.d):00601 E$USigP rmb 1 unprocessed signal pending 00EA ( turbos.d):00602 E$NEMod rmb 1 non-existent module 00EB ( turbos.d):00603 E$BNam rmb 1 bad name 00EC ( turbos.d):00604 E$BMHP rmb 1 bad module header parity 00ED ( turbos.d):00605 E$NoRAM rmb 1 no system RAM available 00EE ( turbos.d):00606 E$DNE rmb 1 directory not empty 00EF ( turbos.d):00607 E$NoTask rmb 1 no available task number ( turbos.d):00608 rmb $F0-. reserved 00F0 ( turbos.d):00609 E$Unit rmb 1 illegal media unit 00F1 ( turbos.d):00610 E$Sect rmb 1 bad sector number 00F2 ( turbos.d):00611 E$WP rmb 1 write protect 00F3 ( turbos.d):00612 E$CRC rmb 1 bad checksum 00F4 ( turbos.d):00613 E$Read rmb 1 read error 00F5 ( turbos.d):00614 E$Write rmb 1 write error 00F6 ( turbos.d):00615 E$NotRdy rmb 1 device not ready 00F7 ( turbos.d):00616 E$Seek rmb 1 seek error 00F8 ( turbos.d):00617 E$Full rmb 1 media full 00F9 ( turbos.d):00618 E$BTyp rmb 1 bad type (incompatible) media 00FA ( turbos.d):00619 E$DevBsy rmb 1 device busy 00FB ( turbos.d):00620 E$DIDC rmb 1 media ID change 00FC ( turbos.d):00621 E$Lock rmb 1 record is busy (locked out) 00FD ( turbos.d):00622 E$Share rmb 1 non-sharable file busy 00FE ( turbos.d):00623 E$DeadLk rmb 1 I/O deadlock error ( turbos.d):00624 ( turbos.d):00625 * Character definitions 0020 ( turbos.d):00626 C$Space set $20 002E ( turbos.d):00627 C$Period set '. 002C ( turbos.d):00628 C$Comma set ', 000D ( turbos.d):00629 C$CR set $0D 000A ( turbos.d):00630 C$LF set $0A ( turbos.d):00631 ( turbos.d):00632 endc ( defs.d):00003 ( defs.d):00004 * TurbOS-specific definitions ( defs.d):00005 use turbo9sim.d ( turbo9sim.d):00001 ifne TURBO9SIM.D-1 0001 ( turbo9sim.d):00002 TURBO9SIM.D set 1 ( turbo9sim.d):00003 ( turbo9sim.d):00004 ******************************************************************** ( turbo9sim.d):00005 * Turbo9SimDefs - TurbOS System Definitions for the Turbo9 Simulator ( turbo9sim.d):00006 * ( turbo9sim.d):00007 * This is a high level view of the memory map as setup by TurbOS ( turbo9sim.d):00008 * ( turbo9sim.d):00009 * $0000----> ================================== ( turbo9sim.d):00010 * | | ( turbo9sim.d):00011 * | TurbOS Globals/Stack | ( turbo9sim.d):00012 * | | ( turbo9sim.d):00013 * $0500---->|==================================| ( turbo9sim.d):00014 * | | ( turbo9sim.d):00015 * . . . . . . . . . . . . . . . . . ( turbo9sim.d):00016 * | | ( turbo9sim.d):00017 * | RAM available for allocation | ( turbo9sim.d):00018 * | by TurbOS and Apps | ( turbo9sim.d):00019 * | | ( turbo9sim.d):00020 * . . . . . . . . . . . . . . . . . ( turbo9sim.d):00021 * | | ( turbo9sim.d):00022 * $FF00---->|==================================| ( turbo9sim.d):00023 * | I/O | ( turbo9sim.d):00024 * | & Vectors | ( turbo9sim.d):00025 * ================================== ( turbo9sim.d):00026 * ( turbo9sim.d):00027 * Edt/Rev YYYY/MM/DD Modified by ( turbo9sim.d):00028 * Comment ( turbo9sim.d):00029 * ------------------------------------------------------------------ ( turbo9sim.d):00030 * 2023/02/07 Boisy G. Pitre ( turbo9sim.d):00031 * Started. ( turbo9sim.d):00032 ( turbo9sim.d):00033 ******************************************************************** ( turbo9sim.d):00034 * Ticks per second ( turbo9sim.d):00035 * 003C ( turbo9sim.d):00036 TkPerSec set 60 ( turbo9sim.d):00037 ( turbo9sim.d):00038 ******************************************************************** ( turbo9sim.d):00039 * ( turbo9sim.d):00040 * TurbOS Section ( turbo9sim.d):00041 * ( turbo9sim.d):00042 ( turbo9sim.d):00043 ******************************************************************** ( turbo9sim.d):00044 * Mapped I/O boundaries FF00 ( turbo9sim.d):00045 MappedIOStart set $FF00 FFFF ( turbo9sim.d):00046 MappedIOEnd set $FFFF ( turbo9sim.d):00047 ( turbo9sim.d):00048 ******************************************************************** ( turbo9sim.d):00049 * I/O definitions 0000 ( turbo9sim.d):00050 Term.Out set $00 character written to this port appears in terminal 0001 ( turbo9sim.d):00051 Term.In set $01 character read from this port comes from keyboard (when TERMRX.READY == 1) 0002 ( turbo9sim.d):00052 Reg.Stat set $02 status (Read/Write) 0001 ( turbo9sim.d):00053 Timer.Ready equ %00000001 set if timer is ready (write to clear interrupt) 0002 ( turbo9sim.d):00054 Term.RxReady equ %00000010 set if terminal input is ready (write to clear interrupt) 0003 ( turbo9sim.d):00055 Reg.Ctrl set $03 control (Read/Write) 0001 ( turbo9sim.d):00056 Ctrl.TimrIRQ set %00000001 timer interrupt flag 0002 ( turbo9sim.d):00057 Ctrl.TermIRQ set %00000010 terminal receive interrupt flag ( turbo9sim.d):00058 ( turbo9sim.d):00059 ******************************************************************** ( turbo9sim.d):00060 * Boot definitions for TurbOS ( turbo9sim.d):00061 * ( turbo9sim.d):00062 * These definitions are not strictly for 'Boot', but are for booting the ( turbo9sim.d):00063 * system. ( turbo9sim.d):00064 * 00FF ( turbo9sim.d):00065 HW.Page set $FF device descriptor hardware page ( turbo9sim.d):00066 endc (kernel/kernel.asm):00052 00C1 (kernel/kernel.asm):00053 tylg set Systm+Objct 0080 (kernel/kernel.asm):00054 atrv set ReEnt+rev 0000 (kernel/kernel.asm):00055 rev set $00 0001 (kernel/kernel.asm):00056 edition set 1 (kernel/kernel.asm):00057 0000 87CD0AE7000DC180 (kernel/kernel.asm):00058 ModTop mod eom,name,tylg,atrv,ColdStart,size 1400140000 (kernel/kernel.asm):00059 0000 (kernel/kernel.asm):00060 size equ . (kernel/kernel.asm):00061 000D 6B65726E65EC (kernel/kernel.asm):00062 name fcs /kernel/ 0013 01 (kernel/kernel.asm):00063 fcb edition (kernel/kernel.asm):00064 (kernel/kernel.asm):00065 ************************** (kernel/kernel.asm):00066 * Kernel entry point (kernel/kernel.asm):00067 * 0014 (kernel/kernel.asm):00068 ColdStart equ * (kernel/kernel.asm):00069 ifne f256 (kernel/kernel.asm):00070 *>>>>>>>>>> F256 PORT (kernel/kernel.asm):00071 * In RAM mode, the F256 memory map looks like this: (kernel/kernel.asm):00072 * $0000-$1FFF - RAM at $000000-$001FFF (kernel/kernel.asm):00073 * $2000-$3FFF - RAM at $002000-$003FFF (kernel/kernel.asm):00074 * $4000-$5FFF - RAM at $004000-$005FFF (kernel/kernel.asm):00075 * $6000-$7FFF - RAM at $006000-$007FFF (kernel/kernel.asm):00076 * $8000-$9FFF - RAM at $008000-$009FFF (kernel/kernel.asm):00077 * $A000-$BFFF - RAM at $00A000-$00BFFF (kernel/kernel.asm):00078 * $C000-$DFFF - RAM at $00C000-$00DFFF (kernel/kernel.asm):00079 * $E000-$FFFF - RAM at $00E000-$00FFFF (kernel/kernel.asm):00080 * F256-specific initialization to get the F256 to a sane state. (kernel/kernel.asm):00081 orcc #IntMasks mask interrupts (kernel/kernel.asm):00082 clra clear A (kernel/kernel.asm):00083 tfr a,dp transfer to DP (kernel/kernel.asm):00084 clr MMU_MEM_CTRL set active LUT to set 0 (kernel/kernel.asm):00085 lda #$FF set all bits in A (kernel/kernel.asm):00086 sta INT_MASK_0 mask all set 0 interrupts (kernel/kernel.asm):00087 sta INT_MASK_1 mask all set 1 interrupts (kernel/kernel.asm):00088 sta INT_PENDING_0 clear any pending set 0 interrupts (kernel/kernel.asm):00089 sta INT_PENDING_1 clear any pending set 0 interrupts (kernel/kernel.asm):00090 *<<<<<<<<<< F256 PORT (kernel/kernel.asm):00091 endc (kernel/kernel.asm):00092 (kernel/kernel.asm):00093 * Clear out system global variables from $D.FMBM-$0400. 0014 8E0020 (kernel/kernel.asm):00094 ldx #D.FMBM start clearing memory at D.FMBM 0017 108E03E0 (kernel/kernel.asm):00095 ldy #$400-D.FMBM get the number of bytes to clear 001B 4F (kernel/kernel.asm):00096 clra clear A 001C 5F (kernel/kernel.asm):00097 clrb clear B (D now $0000) 001D ED81 (kernel/kernel.asm):00098 loop@ std ,x++ save off at X and increment 001F 313E (kernel/kernel.asm):00099 leay -2,y decrement counter 0021 26FA (kernel/kernel.asm):00100 bne loop@ continue if not zero (kernel/kernel.asm):00101 (kernel/kernel.asm):00102 * Set up the system globals area. 0023 4C (kernel/kernel.asm):00103 inca D = $100 0024 4C (kernel/kernel.asm):00104 inca D = $200 0025 DD20 (kernel/kernel.asm):00105 std $0100,x S = $500 = system stack (kernel/kernel.asm):00117 (kernel/kernel.asm):00118 * This routine checks for RAM by writing a pattern at an address (kernel/kernel.asm):00119 * then reading it back for validation. It may not be needed, so it's (kernel/kernel.asm):00120 * conditionalized. (kernel/kernel.asm):00121 ifne CHECK_FOR_VALID_RAM (kernel/kernel.asm):00122 *>>>>>>>>>> CHECK_FOR_VALID_RAM (kernel/kernel.asm):00123 leax ModTop,pcr point X to start of kernel module (kernel/kernel.asm):00124 pshs x save it on the stack 003D (kernel/kernel.asm):00125 ChkRAM leay ,x point Y to X ($400) (kernel/kernel.asm):00126 ldd ,y store org contents in D (kernel/kernel.asm):00127 ldx #$00FF set X to pattern to write (kernel/kernel.asm):00128 stx ,y write pattern to ,Y (kernel/kernel.asm):00129 cmpx ,y same as what we wrote? (kernel/kernel.asm):00130 bne EndOfRAM@ nope, not RAM here! (kernel/kernel.asm):00131 ldx #$FF00 try different pattern (kernel/kernel.asm):00132 stx ,y write it to ,Y (kernel/kernel.asm):00133 cmpx ,y same as what we wrote? (kernel/kernel.asm):00134 bne EndOfRAM@ nope, not RAM here! (kernel/kernel.asm):00135 std ,y else restore org contents (kernel/kernel.asm):00136 leax >$0100,y check top of next 256 block (kernel/kernel.asm):00137 cmpx ,s stop short kernel (kernel/kernel.asm):00138 bcs ChkRAM branch if not done (kernel/kernel.asm):00139 leay ,x point Y to X (end of RAM) 003D (kernel/kernel.asm):00140 EndOfRAM@ leax ,y X = end of RAM (kernel/kernel.asm):00141 leas 2,s (kernel/kernel.asm):00142 *<<<<<<<<<< CHECK_FOR_VALID_RAM (kernel/kernel.asm):00143 else (kernel/kernel.asm):00144 *>>>>>>>>>> NOT(CHECK_FOR_VALID_RAM) 003D 308CC0 (kernel/kernel.asm):00145 leax ModTop,pcr point X to start of kernel module (kernel/kernel.asm):00146 *<<<<<<<<<< NOT(CHECK_FOR_VALID_RAM) (kernel/kernel.asm):00147 endc 0040 9F24 (kernel/kernel.asm):00148 stx VectCode,pcr point X to vector code 0048 108E0100 (kernel/kernel.asm):00153 ldy #D.XSWI3 point Y to vector base in low RAM 004C C629 (kernel/kernel.asm):00154 ldb #VectCSz get size of vector code in B 004E A680 (kernel/kernel.asm):00155 loop@ lda ,x+ get source byte 0050 A7A0 (kernel/kernel.asm):00156 sta ,y+ save in destination 0052 5A (kernel/kernel.asm):00157 decb decrement counter 0053 26F9 (kernel/kernel.asm):00158 bne loop@ branch if not done 0055 3510 (kernel/kernel.asm):00159 puls x recover the saved RAM upper limit 0057 108EFF00 (kernel/kernel.asm):00160 ldy #MappedIOStart stop short of IO address area 005B 1709E8 (kernel/kernel.asm):00161 lbsr ValMods validate modules there (kernel/kernel.asm):00162 (kernel/kernel.asm):00163 * Some platforms don't have contiguous RAM in the 64K address space due to "holes" (kernel/kernel.asm):00164 * for areas such as I/O. For these platforms, we have to perform a separate (kernel/kernel.asm):00165 * module scan to look for modules after those holes. (kernel/kernel.asm):00166 (kernel/kernel.asm):00167 * Copy vectors to system globals. 005E 318D0A76 (kernel/kernel.asm):00168 leay >Vectors,pcr point Y to vectors 0062 308DFF9A (kernel/kernel.asm):00169 leax >ModTop,pcr point X to top of the kernel 0066 3410 (kernel/kernel.asm):00170 pshs x save off 0068 8E002C (kernel/kernel.asm):00171 ldx #D.SWI3 point X to vectors in system globals 006B ECA1 (kernel/kernel.asm):00172 copy@ ldd ,y++ get vector bytes 006D E3E4 (kernel/kernel.asm):00173 addd ,s add the kernel's module address 006F ED81 (kernel/kernel.asm):00174 std ,x++ save off in system globals 0071 8C0036 (kernel/kernel.asm):00175 cmpx #D.NMI at the end? 0074 23F5 (kernel/kernel.asm):00176 bls copy@ branch if not 0076 3262 (kernel/kernel.asm):00177 leas 2,s restore stack (kernel/kernel.asm):00178 (kernel/kernel.asm):00179 * Fill in more system globals. 0078 308D00AA (kernel/kernel.asm):00180 leax >URtoSs,pcr get address of user to system state routine 007C 9F71 (kernel/kernel.asm):00181 stx UsrIRQ,pcr get user state IRQ routine 0082 9F3C (kernel/kernel.asm):00183 stx UsrSvc,pcr get the user state service routine 0088 9F40 (kernel/kernel.asm):00185 stx SysIRQ,pcr get the system state IRQ routine 008E 9F3E (kernel/kernel.asm):00187 stx SysSvc,pcr get the system state service routine 0096 9F42 (kernel/kernel.asm):00190 stx FIRQPoller,pcr get the address of the IRQ polling routine (kernel/kernel.asm):00194 else 009A 308D00C0 (kernel/kernel.asm):00195 leax >Poll,pcr get the default polling routine (kernel/kernel.asm):00196 endc 009E 9F3A (kernel/kernel.asm):00197 stx Clock,pcr get the default tick generator routine 00A4 9F6E (kernel/kernel.asm):00199 stx SysTbl,pcr get the system call table address 00AA 170611 (kernel/kernel.asm):00203 lbsr InstallSvc and install it (kernel/kernel.asm):00204 (kernel/kernel.asm):00205 * Link to init module. 00AD 86C0 (kernel/kernel.asm):00206 lda #Systm+0 we want a system module 00AF 308D0A21 (kernel/kernel.asm):00207 leax >InitNam,pcr point to the configuration module name 00B3 103F00 (kernel/kernel.asm):00208 os9 F$Link link to it 00B6 10250049 (kernel/kernel.asm):00209 lbcs FatalErr if error, restart kernel 00BA DF2A (kernel/kernel.asm):00210 stu error (kernel/kernel.asm):00302 (kernel/kernel.asm):00303 * Open the console device. (kernel/kernel.asm):00304 * Entry: U = The address of the Init module 0105 (kernel/kernel.asm):00305 OpenCons clrb clear B (kernel/kernel.asm):00306 ldd D.SvcIRQ] jump to service IRQ address 0116 3494 (kernel/kernel.asm):00329 SWI pshs pc,x,b save off registers 0118 C614 (kernel/kernel.asm):00330 ldb #P$SWI get P$SWI 011A BE004B (kernel/kernel.asm):00331 FixSWI ldx >D.Proc get process descriptor 011D AE85 (kernel/kernel.asm):00332 ldx b,x get SWI entry 011F AF63 (kernel/kernel.asm):00333 stx 3,s put in PC on stack 0121 3594 (kernel/kernel.asm):00334 puls pc,x,b restore registers and return (kernel/kernel.asm):00335 (kernel/kernel.asm):00336 * User state interrupt service routine entry. 0123 318C19 (kernel/kernel.asm):00337 UsrIRQ leay D.Poll] call the interrupt polling routine 0143 2406 (kernel/kernel.asm):00358 bcc go@ branch if carry clear 0145 E6E4 (kernel/kernel.asm):00359 ldb ,s get the CC on the stack 0147 CA10 (kernel/kernel.asm):00360 orb #IRQMask mask IRQs 0149 E7E4 (kernel/kernel.asm):00361 stb ,s and save it back 014B 160095 (kernel/kernel.asm):00362 go@ lbra ActivateProc go activate the process (kernel/kernel.asm):00363 (kernel/kernel.asm):00364 * System state interrupt service routine entry 014E 4F (kernel/kernel.asm):00365 SysIRQ clra clear A 014F 1F8B (kernel/kernel.asm):00366 tfr a,dp and transfer it to the direct page 0151 AD9F003A (kernel/kernel.asm):00367 jsr [>D.Poll] call the vectored IRQ polling routine 0155 2406 (kernel/kernel.asm):00368 bcc ex@ branch if carry is clear 0157 E6E4 (kernel/kernel.asm):00369 ldb ,s get the CC on the stack 0159 CA10 (kernel/kernel.asm):00370 orb #IRQMask mask IRQs 015B E7E4 (kernel/kernel.asm):00371 stb ,s and save it back 015D 3B (kernel/kernel.asm):00372 ex@ rti return from interrupt (kernel/kernel.asm):00373 (kernel/kernel.asm):00374 * This is the default interrupt polling routine -- it does nothing. 015E 53 (kernel/kernel.asm):00375 Poll comb 015F 39 (kernel/kernel.asm):00376 rts (kernel/kernel.asm):00377 (kernel/kernel.asm):00378 * Here is the default clock routine which performs process queue management. 0160 9E51 (kernel/kernel.asm):00379 Clock ldx ActivateProc,pcr point Y to activate process routine 01A4 2080 (kernel/kernel.asm):00412 bra URtoSs go to system state (kernel/kernel.asm):00413 (kernel/kernel.asm):00414 use faproc.asm ( faproc.asm):00001 ******************************************************************************* ( faproc.asm):00002 * TurbOS ( faproc.asm):00003 ******************************************************************************* ( faproc.asm):00004 * See LICENSE.txt for licensing information. ( faproc.asm):00005 ******************************************************************************* ( faproc.asm):00006 * ( faproc.asm):00007 * Edt/Rev YYYY/MM/DD Modified by ( faproc.asm):00008 * Comment ( faproc.asm):00009 * ---------------------------------------------------------------------------- ( faproc.asm):00010 * 2023/08/11 Boisy Pitre ( faproc.asm):00011 * Initial creation. ( faproc.asm):00012 * ( faproc.asm):00013 ******************************************************************************* ( faproc.asm):00014 ( faproc.asm):00015 ;;; F$AProc ( faproc.asm):00016 ;;; ( faproc.asm):00017 ;;; Insert process into active process queue. ( faproc.asm):00018 ;;; ( faproc.asm):00019 ;;; Entry: X = The address of the process descriptor to insert. ( faproc.asm):00020 ;;; ( faproc.asm):00021 ;;; Exit: None. ( faproc.asm):00022 ;;; ( faproc.asm):00023 ;;; Error: B = A non-zero error code. ( faproc.asm):00024 ;;; CC = Carry flag set to indicate error. ( faproc.asm):00025 ;;; ( faproc.asm):00026 ;;; F$AProc inserts a process into the active process queue so that the kernel can schedule the process for execution. ( faproc.asm):00027 ;;; The kernel sorts all processes in the queue by process age (the count of how many process switches have occurred ( faproc.asm):00028 ;;; since the process’s last time slice). When a process moves to the active process queue, the kernel sets its age ( faproc.asm):00029 ;;; according to its priority. The higher the priority, the higher the age. ( faproc.asm):00030 ;;; ( faproc.asm):00031 ;;; An exception is a newly active process that was deactivated while in the system state. The kernel gives such a process ( faproc.asm):00032 ;;; higher priority because it's typically executing critical routines that affect shared system resources. ( faproc.asm):00033 01A6 AE44 ( faproc.asm):00034 FAProc ldx R$X,u get the pointer to process to insert 01A8 3460 ( faproc.asm):00035 SFAProc pshs u,y save U/Y on stack 01AA CE003F ( faproc.asm):00036 ldu #(D.AProcQ-P$Queue) load U with D.AProcQ-P$Queue so we're at the first process in the queue later 01AD 2007 ( faproc.asm):00037 bra getqueue@ start processing the active queue ( faproc.asm):00038 * This loop increases the age of all active processes by 1. 01AF E64C ( faproc.asm):00039 ageloop@ ldb P$Age,u get the process age 01B1 5C ( faproc.asm):00040 incb update it 01B2 2702 ( faproc.asm):00041 beq getqueue@ branch if wrap 01B4 E74C ( faproc.asm):00042 stb P$Age,u save it back to the process descriptor 01B6 EE4E ( faproc.asm):00043 getqueue@ ldu P$Queue,u get the pointer to the next process in the queue 01B8 26F5 ( faproc.asm):00044 bne ageloop@ branch if the process is in the active queue 01BA CE003F ( faproc.asm):00045 ldu #(D.AProcQ-P$Queue) load U with D.AProcQ-P$Queue so we're at the first process in the queue later 01BD A60B ( faproc.asm):00046 lda P$Prior,x get process priority of process to insert 01BF A70C ( faproc.asm):00047 sta P$Age,x save it as its age 01C1 1A50 ( faproc.asm):00048 orcc #IntMasks mask interrupts ( faproc.asm):00049 * This loop finds the process with the age lower than our age in the queue and inserts us ( faproc.asm):00050 * in front of them. 01C3 31C4 ( faproc.asm):00051 loop2@ leay ,u point Y to the process descriptor 01C5 EE4E ( faproc.asm):00052 ldu P$Queue,u get the pointer to the next process in active queue 01C7 2704 ( faproc.asm):00053 beq ex@ branch if empty 01C9 A14C ( faproc.asm):00054 cmpa P$Age,u compare the passed process' age to the current one in the queue 01CB 23F6 ( faproc.asm):00055 bls loop2@ if it's lower or same, keep going 01CD EF0E ( faproc.asm):00056 ex@ stu P$Queue,x insert the process with lower age as the next one into the P$Queue of the passed process 01CF AF2E ( faproc.asm):00057 stx P$Queue,y and put the passed process descriptor pointer in the current location 01D1 5F ( faproc.asm):00058 clrb clear carry 01D2 35E0 ( faproc.asm):00059 puls pc,u,y restore U/Y and return ( faproc.asm):00060 (kernel/kernel.asm):00415 (kernel/kernel.asm):00416 * User state system call entry point. (kernel/kernel.asm):00417 * (kernel/kernel.asm):00418 * All system calls made from user state go through this code. 01D4 318C05 (kernel/kernel.asm):00419 UsrSvc leay 0 for the address 0518 C6D2 ( fsrqmem.asm):00114 ldb #E$BPAddr the error is bad page address 051A 39 ( fsrqmem.asm):00115 rts return to the caller 051B 1E89 ( fsrqmem.asm):00116 returnmem@ exg a,b swap A/B 051D 9E20 ( fsrqmem.asm):00117 ldx = 0 054C 6AE4 ( fallbit.asm):00056 dec _mask@,s else decrement mask byte 054E 2AF6 ( fallbit.asm):00057 bpl loop2@ and branch if hi bit not set 0550 48 ( fallbit.asm):00058 loop3@ lsla divide A by 2 0551 5C ( fallbit.asm):00059 incb increment B 0552 26FC ( fallbit.asm):00060 bne loop3@ continue if B is not 0 0554 AA84 ( fallbit.asm):00061 ora ,x OR A with value at X 0556 A784 ( fallbit.asm):00062 ex@ sta ,x and store it at X 0558 4F ( fallbit.asm):00063 clra clear carry 0559 3261 ( fallbit.asm):00064 leas _mask@+1,s fix stack 055B 35B6 ( fallbit.asm):00065 puls pc,y,x,b,a restore registers and return ( fallbit.asm):00066 ( fallbit.asm):00067 * Calculate address of first byte we want, and which bit in that byte, from ( fallbit.asm):00068 * a bit allocation map given the address of the map & the bit # we want to point to. ( fallbit.asm):00069 * ( fallbit.asm):00070 * Entry: D = The bit number we want. ( fallbit.asm):00071 * X = The pointer to the bitmap table. ( fallbit.asm):00072 * ( fallbit.asm):00073 * Exit: A = A mask that has the bit number within byte we are starting on. ( fallbit.asm):00074 * X = The pointer in allocation map to first byte we are starting on. ( fallbit.asm):00075 * ( fallbit.asm):00076 * Example 1: ( fallbit.asm):00077 * We want bit 18 starting at address 1024. Pass 18 to D and 1024 to X. ( fallbit.asm):00078 * We get back 128 in A (bit 7 set) and 1026 in D (the address of the bit). ( fallbit.asm):00079 * ( fallbit.asm):00080 * Example 2: ( fallbit.asm):00081 * We want bit 5 starting at address 3000. Pass 5 to D and 3000 to X. ( fallbit.asm):00082 * We get back 8 in A (bit 3 set) and 3000 in D (the address of the bit). ( fallbit.asm):00083 055D 3404 ( fallbit.asm):00084 CalcBit pshs b preserve B 055F 44 ( fallbit.asm):00085 lsra divide D 0560 56 ( fallbit.asm):00086 rorb by 2 0561 44 ( fallbit.asm):00087 lsra then divide D 0562 56 ( fallbit.asm):00088 rorb by 2 0563 44 ( fallbit.asm):00089 lsra and divide D 0564 56 ( fallbit.asm):00090 rorb again by 2, now D = D/8, which is the byte offset 0565 308B ( fallbit.asm):00091 leax d,x get address of byte in bitmap to start 0567 3504 ( fallbit.asm):00092 puls b recover B to compute the bit 0569 8680 ( fallbit.asm):00093 lda #$80 load A with hi bit set 056B C407 ( fallbit.asm):00094 andb #%0000111 mask out all but the lower 3 bits (0-7, the bit number) 056D 2704 ( fallbit.asm):00095 beq ex@ branch if 0 (the 0th bit) 056F 44 ( fallbit.asm):00096 loop@ lsra else right shift A 0570 5A ( fallbit.asm):00097 decb and decrement B (the bit counter) 0571 26FC ( fallbit.asm):00098 bne loop@ until B reaches 0 0573 39 ( fallbit.asm):00099 ex@ rts return to the caller ( fallbit.asm):00100 ( fallbit.asm):00101 ;;; F$DelBit ( fallbit.asm):00102 ;;; ( fallbit.asm):00103 ;;; Clears bits in an allocation bitmap. ( fallbit.asm):00104 ;;; ( fallbit.asm):00105 ;;; Entry: D = The number of the first bit to clear. ( fallbit.asm):00106 ;;; X = The address of the allocation bitmap. ( fallbit.asm):00107 ;;; Y = The number of the bits to clear. ( fallbit.asm):00108 ;;; ( fallbit.asm):00109 ;;; Exit: None. ( fallbit.asm):00110 ;;; ( fallbit.asm):00111 ;;; Error: B = A non-zero error code. ( fallbit.asm):00112 ;;; CC = Carry flag set to indicate error. ( fallbit.asm):00113 ;;; ( fallbit.asm):00114 ;;; F$DelBit clears bits in the allocation bitmap. Bit numbers range from 0 to n-1, where n is the number of bits ( fallbit.asm):00115 ;;; in the allocation bit map. ( fallbit.asm):00116 ;;; ( fallbit.asm):00117 ;;; Don't call F$DelBit with Y set to 0 (a bit count of 0). ( fallbit.asm):00118 0574 EC41 ( fallbit.asm):00119 FDelBit ldd R$D,u get bit number to start with 0576 3344 ( fallbit.asm):00120 leau R$X,u point U to the address of the caller's register pointer 0578 3730 ( fallbit.asm):00121 pulu y,x load X/Y/U with this slick trick 057A 3436 ( fallbit.asm):00122 DelBit pshs y,x,b,a preserve registers 057C 8DDF ( fallbit.asm):00123 bsr CalcBit calculate byte and position, and get first bit mask 057E 43 ( fallbit.asm):00124 coma complement the mask 057F 3402 ( fallbit.asm):00125 pshs a then preserve the mask on the stack 0000 ( fallbit.asm):00126 _mask@ set 0 0581 2A0E ( fallbit.asm):00127 bpl delstart@ branch if high bit in A is clear 0583 A684 ( fallbit.asm):00128 lda ,x get byte to clear bits of 0585 A4E4 ( fallbit.asm):00129 loop@ anda _mask@,s AND with mask on stack 0587 313F ( fallbit.asm):00130 leay -1,y decrement the bits to clear counter 0589 271A ( fallbit.asm):00131 beq ex@ if zero, we're done, so return to caller 058B 67E4 ( fallbit.asm):00132 asr _mask@,s else shift right the mask byte on the stack (bit 7 remains constant, bit 0 goe sinto the carry) 058D 25F6 ( fallbit.asm):00133 bcs loop@ and continue if carry set (bit 0 was 1 in the mask) 058F A780 ( fallbit.asm):00134 sta ,x+ else store the updated byte and increment to the next 0591 1F20 ( fallbit.asm):00135 delstart@ tfr y,d transfer bit clear count from Y into D 0593 2002 ( fallbit.asm):00136 bra loopstart@ start the loop 0595 6F80 ( fallbit.asm):00137 loop2@ clr ,x+ clear this byte and move X to next 0597 830008 ( fallbit.asm):00138 loopstart@ subd #$0008 subtract 8 from the clear count 059A 22F9 ( fallbit.asm):00139 bhi loop2@ branch if D > 0 059C 2707 ( fallbit.asm):00140 beq ex@ branch if D = 0 059E 48 ( fallbit.asm):00141 loop3@ lsla shift A left one bit, filling LSB with 0 059F 5C ( fallbit.asm):00142 incb increment B 05A0 26FC ( fallbit.asm):00143 bne loop3@ if not zero, keep shifting 05A2 43 ( fallbit.asm):00144 coma complement A 05A3 A484 ( fallbit.asm):00145 anda ,x and it with byte at X 05A5 A784 ( fallbit.asm):00146 ex@ sta ,x and store it 05A7 6FE0 ( fallbit.asm):00147 clr ,s+ eat the byte at the stack 05A9 35B6 ( fallbit.asm):00148 puls pc,y,x,b,a pull remaining registers and return to the caller ( fallbit.asm):00149 ( fallbit.asm):00150 ;;; F$SchBit ( fallbit.asm):00151 ;;; ( fallbit.asm):00152 ;;; Searches the bitmap for a free area. ( fallbit.asm):00153 ;;; ( fallbit.asm):00154 ;;; Entry: X = The address of the allocation bitmap. ( fallbit.asm):00155 ;;; D = The number of the first bit to start searching. ( fallbit.asm):00156 ;;; Y = The number of clear contiguous bits to search for. ( fallbit.asm):00157 ;;; U = The address of the end of the allocation bitmap ( fallbit.asm):00158 ;;; ( fallbit.asm):00159 ;;; Exit: D = The starting bit number. ( fallbit.asm):00160 ;;; Y = The number of bits cleared. ( fallbit.asm):00161 ;;; ( fallbit.asm):00162 ;;; Error: B = A non-zero error code. ( fallbit.asm):00163 ;;; CC = Carry flag set to indicate error. ( fallbit.asm):00164 ;;; ( fallbit.asm):00165 ;;; F$SchBit searches the specified allocation bit map for contiguous cleared bits of the required length. The search ( fallbit.asm):00166 ;;; starts at the starting bit number. If no block of the specified size exists, the call returns with the carry set, ( fallbit.asm):00167 ;;; starting bit number, and size of the largest block. ( fallbit.asm):00168 05AB 3440 ( fallbit.asm):00169 FSchBit pshs u save off caller's registers 05AD EC41 ( fallbit.asm):00170 ldd R$D,u get bit number to start with 05AF AE44 ( fallbit.asm):00171 ldx R$X,u get the address of allocation bit map 05B1 10AE46 ( fallbit.asm):00172 ldy R$Y,u get the number of cleared contiguous bits to search for 05B4 EE48 ( fallbit.asm):00173 ldu R$U,u get the address of the end of the allocation map 05B6 8D08 ( fallbit.asm):00174 bsr SchBit perform the search 05B8 3540 ( fallbit.asm):00175 puls u recover the caller's registers 05BA ED41 ( fallbit.asm):00176 std R$D,u save the starting bit number in the caller's D 05BC 10AF46 ( fallbit.asm):00177 sty R$Y,u and the number of bits cleared at that point in caller's Y 05BF 39 ( fallbit.asm):00178 rts return 05C0 3476 ( fallbit.asm):00179 SchBit pshs u,y,x,b,a preserve registers 05C2 3426 ( fallbit.asm):00180 pshs y,b,a preserve more 0000 ( fallbit.asm):00181 _stk2A@ set 0 0001 ( fallbit.asm):00182 _stk2B@ set 1 0002 ( fallbit.asm):00183 _stk2Y@ set 2 0004 ( fallbit.asm):00184 _stk1A@ set 4 0005 ( fallbit.asm):00185 _stk1B@ set 5 0006 ( fallbit.asm):00186 _stk1X@ set 6 0008 ( fallbit.asm):00187 _stk1Y@ set 8 000A ( fallbit.asm):00188 _stk1U@ set 10 05C4 6F68 ( fallbit.asm):00189 clr _stk1Y@,s 05C6 6F69 ( fallbit.asm):00190 clr _stk1Y@+1,s 05C8 1F02 ( fallbit.asm):00191 tfr d,y 05CA 8D91 ( fallbit.asm):00192 bsr CalcBit calculate the bit location 05CC 3402 ( fallbit.asm):00193 pshs a save the mask that points to bit number within byte we are starting on. 0000 ( fallbit.asm):00194 _stk3A@ set 0 0001 ( fallbit.asm):00195 _stk2A@ set _stk2A@+1 0002 ( fallbit.asm):00196 _stk2B@ set _stk2B@+1 0003 ( fallbit.asm):00197 _stk2Y@ set _stk2Y@+1 0005 ( fallbit.asm):00198 _stk1A@ set _stk1A@+1 0006 ( fallbit.asm):00199 _stk1B@ set _stk1B@+1 0007 ( fallbit.asm):00200 _stk1X@ set _stk1X@+1 0009 ( fallbit.asm):00201 _stk1Y@ set _stk1Y@+1 000B ( fallbit.asm):00202 _stk1U@ set _stk1U@+1 05CE 200D ( fallbit.asm):00203 bra looptop@ start at the top of the loop 05D0 3121 ( fallbit.asm):00204 loop@ leay 1,y increment Y 05D2 10AF65 ( fallbit.asm):00205 sty _stk1A@,s save onto the stack 05D5 64E4 ( fallbit.asm):00206 loop2@ lsr _stk3A@,s shift the byte on the stack right (bit 0 goes into carry) 05D7 2408 ( fallbit.asm):00207 bcc looptop2@ branch if carry is clear (more to do) 05D9 66E4 ( fallbit.asm):00208 ror _stk3A@,s else rotate right byte on stack 05DB 3001 ( fallbit.asm):00209 leax 1,x advance X by 1 05DD AC6B ( fallbit.asm):00210 looptop@ cmpx _stk1U@,s compare X to the end of the bitmap on the stack 05DF 241E ( fallbit.asm):00211 bcc loopout@ branch if equal (we're finished) 05E1 A684 ( fallbit.asm):00212 looptop2@ lda ,x get the byte in the bitmap at X into A 05E3 A4E4 ( fallbit.asm):00213 anda _stk3A@,s AND with bit mask on stack 05E5 26E9 ( fallbit.asm):00214 bne loop@ branch if not zero 05E7 3121 ( fallbit.asm):00215 leay $01,y else advance Y by 1 byte 05E9 1F20 ( fallbit.asm):00216 tfr y,d transfer it to D 05EB A365 ( fallbit.asm):00217 subd _stk1A@,s subract bit number to start with the on the stack from D 05ED 10A363 ( fallbit.asm):00218 cmpd _stk2Y@,s compare to our counter 05F0 2414 ( fallbit.asm):00219 bcc saveandex@ branch if equal 05F2 10A369 ( fallbit.asm):00220 cmpd _stk1Y@,s compare against the number of bits cleared on the stack with D 05F5 23DE ( fallbit.asm):00221 bls loop2@ branch if the value on the stack is lower or same as D 05F7 ED69 ( fallbit.asm):00222 std _stk1Y@,s else save D into the number of bits cleared position on the stack 05F9 EC65 ( fallbit.asm):00223 ldd _stk1A@,s get the bit number to start with on the stack into D 05FB ED61 ( fallbit.asm):00224 std _stk2A@,s save off into the next position on the stack 05FD 20D6 ( fallbit.asm):00225 bra loop2@ and continue working 05FF EC61 ( fallbit.asm):00226 loopout@ ldd _stk2A@,s get the next position on the stack 0601 ED65 ( fallbit.asm):00227 std _stk1A@,s store it 0603 43 ( fallbit.asm):00228 coma complement A 0604 2002 ( fallbit.asm):00229 bra ex@ and prepare to return to the caller 0606 ED69 ( fallbit.asm):00230 saveandex@ std _stk1Y@,s get the number of bits cleared 0608 3265 ( fallbit.asm):00231 ex@ leas _stk1A@,s clean up the stack 060A 35F6 ( fallbit.asm):00232 puls pc,u,y,x,b,a restore registers and return to the caller (kernel/kernel.asm):00497 use fprsnam.asm ( fprsnam.asm):00001 ******************************************************************************* ( fprsnam.asm):00002 * TurbOS ( fprsnam.asm):00003 ******************************************************************************* ( fprsnam.asm):00004 * See LICENSE.txt for licensing information. ( fprsnam.asm):00005 ******************************************************************************* ( fprsnam.asm):00006 * ( fprsnam.asm):00007 * Edt/Rev YYYY/MM/DD Modified by ( fprsnam.asm):00008 * Comment ( fprsnam.asm):00009 * ---------------------------------------------------------------------------- ( fprsnam.asm):00010 * 2023/08/11 Boisy Pitre ( fprsnam.asm):00011 * Initial creation. ( fprsnam.asm):00012 * ( fprsnam.asm):00013 ******************************************************************************* ( fprsnam.asm):00014 ( fprsnam.asm):00015 ;;; F$PrsNam ( fprsnam.asm):00016 ;;; ( fprsnam.asm):00017 ;;; Parse a pathlist. ( fprsnam.asm):00018 ;;; ( fprsnam.asm):00019 ;;; Entry: X = The address of the pathlist to parse. ( fprsnam.asm):00020 ;;; U = Starting address of the routine’s memory area. ( fprsnam.asm):00021 ;;; ( fprsnam.asm):00022 ;;; Exit: X = The address of the character past the optional "/". ( fprsnam.asm):00023 ;;; Y = The address of the last character plus one. ( fprsnam.asm):00024 ;;; A = The trailing delimiter character. ( fprsnam.asm):00025 ;;; B = The length of the pathlist. ( fprsnam.asm):00026 ;;; CC = Carry flag clear to indicate success. ( fprsnam.asm):00027 ;;; ( fprsnam.asm):00028 ;;; Error: B = A non-zero error code. ( fprsnam.asm):00029 ;;; Y = The address of the first non-delimiter character. ( fprsnam.asm):00030 ;;; CC = Carry flag set to indicate error. ( fprsnam.asm):00031 ;;; ( fprsnam.asm):00032 ;;; F$PrsNam scans the input text string for a legal name. It terminates the name with any character that is not a legal name character. ( fprsnam.asm):00033 ;;; It's useful for processing pathlist arguments passed to a new process. ( fprsnam.asm):00034 ;;; Because it processes only one name, you need several calls to process a pathlist that has more than one name. ( fprsnam.asm):00035 ;;; F$PrsNam completes with Y in position for the next element in the pathlist to parse. ( fprsnam.asm):00036 ;;; If Y is at the end of a pathlist, a bad path error returns. ( fprsnam.asm):00037 ;;; It then moves the pointer in Y past any space characters so that it can parse the next pathlist in a command line. ( fprsnam.asm):00038 ;;; ( fprsnam.asm):00039 ;;; Before the Parse Name call: ( fprsnam.asm):00040 ;;; ( fprsnam.asm):00041 ;;; | / | D | 0 | / | P | A | Y | R | O | L | L | ( fprsnam.asm):00042 ;;; X ( fprsnam.asm):00043 ;;; ( fprsnam.asm):00044 ;;; After the Parse Name call: ( fprsnam.asm):00045 ;;; ( fprsnam.asm):00046 ;;; | / | D | 0 | / | P | A | Y | R | O | L | L | ( fprsnam.asm):00047 ;;; X Y B = 2 ( fprsnam.asm):00048 060C AE44 ( fprsnam.asm):00049 FPrsNam ldx R$X,u get pathlist pointer from caller 060E 8D0A ( fprsnam.asm):00050 bsr ParseNam do the parsing of the name 0610 ED41 ( fprsnam.asm):00051 std R$D,u save the length 0612 2502 ( fprsnam.asm):00052 bcs ex@ branch if the carry is set 0614 AF44 ( fprsnam.asm):00053 stx R$X,u save the updated pathlist pointer 0616 10AF46 ( fprsnam.asm):00054 ex@ sty R$Y,u and the Y 0619 39 ( fprsnam.asm):00055 rts return to the caller ( fprsnam.asm):00056 061A A684 ( fprsnam.asm):00057 ParseNam lda ,x get the first character 061C 812F ( fprsnam.asm):00058 cmpa #PDELIM is it the pathlist character? 061E 2602 ( fprsnam.asm):00059 bne next@ branch if not 0620 3001 ( fprsnam.asm):00060 leax 1,x else go past it 0622 3184 ( fprsnam.asm):00061 next@ leay ,x point Y to X 0624 5F ( fprsnam.asm):00062 clrb clear B 0625 A6A0 ( fprsnam.asm):00063 lda ,y+ get the next character 0627 847F ( fprsnam.asm):00064 anda #$7F mask out the high bit 0629 8D28 ( fprsnam.asm):00065 bsr chkrest@ go check the rest 062B 2512 ( fprsnam.asm):00066 bcs comma@ branch if the carry is set 062D 5C ( fprsnam.asm):00067 loop@ incb increment B 062E A63F ( fprsnam.asm):00068 lda -1,y get the previous character 0630 2B0A ( fprsnam.asm):00069 bmi ex@ if high bit is set on this character, we're done 0632 A6A0 ( fprsnam.asm):00070 lda ,y+ else get the next character 0634 847F ( fprsnam.asm):00071 anda #$7F clear the high bit 0636 8D17 ( fprsnam.asm):00072 bsr chkfirst@ and check first 0638 24F3 ( fprsnam.asm):00073 bcc loop@ branch if the carry is clear 063A A6A2 ( fprsnam.asm):00074 lda ,-y else get the previous character 063C 1CFE ( fprsnam.asm):00075 ex@ andcc #^Carry clear the carry 063E 39 ( fprsnam.asm):00076 rts return to the caller 063F 812C ( fprsnam.asm):00077 comma@ cmpa #C$COMMA is it a comma? 0641 2602 ( fprsnam.asm):00078 bne space@ branch if not 0643 A6A0 ( fprsnam.asm):00079 skip@ lda ,y+ else get the next character 0645 8120 ( fprsnam.asm):00080 space@ cmpa #C$SPACE is it a space? 0647 27FA ( fprsnam.asm):00081 beq skip@ branch if so 0649 A6A2 ( fprsnam.asm):00082 lda ,-y else get the previous character 064B 53 ( fprsnam.asm):00083 comb set the carry 064C C6EB ( fprsnam.asm):00084 ldb #E$BNam indicate a bad pathname error 064E 39 ( fprsnam.asm):00085 rts and return to the caller ( fprsnam.asm):00086 * Check for legal characters in a pathlist 064F 812E ( fprsnam.asm):00087 chkfirst@ cmpa #C$PERIOD is the character a period? 0651 2743 ( fprsnam.asm):00088 beq Match branch if so 0653 8130 ( fprsnam.asm):00089 chkrest@ cmpa #'0 is it zero? 0655 2518 ( fprsnam.asm):00090 bcs errex@ branch if less than 0657 8139 ( fprsnam.asm):00091 cmpa #'9 is it a number? 0659 233B ( fprsnam.asm):00092 bls Match branch if it is between 0-9 065B 815F ( fprsnam.asm):00093 cmpa #'_ is it an underscore? 065D 2737 ( fprsnam.asm):00094 beq Match branch if so 065F 8141 ( fprsnam.asm):00095 cmpa #'A is it A? 0661 250C ( fprsnam.asm):00096 bcs errex@ branch if less than 0663 815A ( fprsnam.asm):00097 cmpa #'Z is it Z? 0665 232F ( fprsnam.asm):00098 bls Match branch if less than or equal (A-Z) 0667 8161 ( fprsnam.asm):00099 cmpa #'a is it a? 0669 2504 ( fprsnam.asm):00100 bcs errex@ branch if less than 066B 817A ( fprsnam.asm):00101 cmpa #'z is it z? 066D 2327 ( fprsnam.asm):00102 bls Match branch if less than or equal (a-z) 066F 1A01 ( fprsnam.asm):00103 errex@ orcc #Carry set the carry 0671 39 ( fprsnam.asm):00104 rts return to the caller (kernel/kernel.asm):00498 use fcmpnam.asm ( fcmpnam.asm):00001 ******************************************************************************* ( fcmpnam.asm):00002 * TurbOS ( fcmpnam.asm):00003 ******************************************************************************* ( fcmpnam.asm):00004 * See LICENSE.txt for licensing information. ( fcmpnam.asm):00005 ******************************************************************************* ( fcmpnam.asm):00006 * ( fcmpnam.asm):00007 * Edt/Rev YYYY/MM/DD Modified by ( fcmpnam.asm):00008 * Comment ( fcmpnam.asm):00009 * ---------------------------------------------------------------------------- ( fcmpnam.asm):00010 * 2023/08/11 Boisy Pitre ( fcmpnam.asm):00011 * Initial creation. ( fcmpnam.asm):00012 * ( fcmpnam.asm):00013 ******************************************************************************* ( fcmpnam.asm):00014 ( fcmpnam.asm):00015 ;;; F$CmpNam ( fcmpnam.asm):00016 ;;; ( fcmpnam.asm):00017 ;;; Compare two names for a match. ( fcmpnam.asm):00018 ;;; ( fcmpnam.asm):00019 ;;; Entry: B = The length of the first name. ( fcmpnam.asm):00020 ;;; X = The address of the first name. ( fcmpnam.asm):00021 ;;; Y = The address of the second name. ( fcmpnam.asm):00022 ;;; ( fcmpnam.asm):00023 ;;; Exit: CC = Carry flag clear if names match; set if names don't match. ( fcmpnam.asm):00024 ;;; ( fcmpnam.asm):00025 ;;; F$CmpNam compares two names and indicates whether they match. Use this call with F$PrsNam. The second name ( fcmpnam.asm):00026 ;;; must have the most significant bit of the last character set. ( fcmpnam.asm):00027 0672 E642 ( fcmpnam.asm):00028 FCmpNam ldb R$B,u get length of the first name 0674 3344 ( fcmpnam.asm):00029 leau R$X,u point U to the caller's R$X 0676 3730 ( fcmpnam.asm):00030 pulu y,x load caller's R$X and R$Y into X and Y in one call 0678 3436 ( fcmpnam.asm):00031 CmpNam pshs y,x,b,a save registers 067A A6A0 ( fcmpnam.asm):00032 loop@ lda ,y+ get character of second name and increment pointer 067C 2B0D ( fcmpnam.asm):00033 bmi hibitset@ branch if hi-bit set 067E 5A ( fcmpnam.asm):00034 decb decrement length 067F 2706 ( fcmpnam.asm):00035 beq nomatch@ if counter is zero, length is different, so not a match 0681 A880 ( fcmpnam.asm):00036 eora ,x+ XOR with character in same position from first name and increment pointer 0683 84DF ( fcmpnam.asm):00037 anda #$DF make result case insensitive 0685 27F3 ( fcmpnam.asm):00038 beq loop@ if zero, characters match, so continue to next character 0687 1A01 ( fcmpnam.asm):00039 nomatch@ orcc #Carry set carry to indicate no match 0689 35B6 ( fcmpnam.asm):00040 puls pc,y,x,b,a restore registers and return to caller 068B 5A ( fcmpnam.asm):00041 hibitset@ decb more? 068C 26F9 ( fcmpnam.asm):00042 bne nomatch@ branch if so, length is different so not a match. 068E A884 ( fcmpnam.asm):00043 eora ,x XOR with character in same position from first name 0690 845F ( fcmpnam.asm):00044 anda #$5F make result case insensitive 0692 26F3 ( fcmpnam.asm):00045 bne nomatch@ if not zero, not a match 0694 3536 ( fcmpnam.asm):00046 puls y,x,b,a restore registers 0696 1CFE ( fcmpnam.asm):00047 Match andcc #^Carry clear carry to indicate a match 0698 39 ( fcmpnam.asm):00048 rts return to caller (kernel/kernel.asm):00499 use fssvc.asm ( fssvc.asm):00001 ******************************************************************************* ( fssvc.asm):00002 * TurbOS ( fssvc.asm):00003 ******************************************************************************* ( fssvc.asm):00004 * See LICENSE.txt for licensing information. ( fssvc.asm):00005 ******************************************************************************* ( fssvc.asm):00006 * ( fssvc.asm):00007 * Edt/Rev YYYY/MM/DD Modified by ( fssvc.asm):00008 * Comment ( fssvc.asm):00009 * ---------------------------------------------------------------------------- ( fssvc.asm):00010 * 2023/08/11 Boisy Pitre ( fssvc.asm):00011 * Initial creation. ( fssvc.asm):00012 * ( fssvc.asm):00013 ******************************************************************************* ( fssvc.asm):00014 ( fssvc.asm):00015 ;;; F$SSvc ( fssvc.asm):00016 ;;; ( fssvc.asm):00017 ;;; Add or replace system calls. ( fssvc.asm):00018 ;;; ( fssvc.asm):00019 ;;; Entry: Y = The address of the system call initialization table. ( fssvc.asm):00020 ;;; ( fssvc.asm):00021 ;;; Exit: None. ( fssvc.asm):00022 ;;; ( fssvc.asm):00023 ;;; Error: B = A non-zero error code. ( fssvc.asm):00024 ;;; CC = Carry flag set to indicate error. ( fssvc.asm):00025 ;;; ( fssvc.asm):00026 ;;; F$SSvc adds or replaces system calls in the kernel's user and system mode system call tables. Y holds the address of a ( fssvc.asm):00027 ;;; table that contains the function codes and offsets for system call routines. The table has the following format: ( fssvc.asm):00028 ;;; ( fssvc.asm):00029 ;;; Relative ( fssvc.asm):00030 ;;; Address Use ( fssvc.asm):00031 ;;; ---------------------------------- ( fssvc.asm):00032 ;;;| $00 Function code |<-- First entry ( fssvc.asm):00033 ;;;| $01 Offset from byte 3 | ( fssvc.asm):00034 ;;;| $02 to function handler | ( fssvc.asm):00035 ;;;|..................................| ( fssvc.asm):00036 ;;;| $03 Function code | <-- Second entry ( fssvc.asm):00037 ;;;| $04 Offset From byte 6 | ( fssvc.asm):00038 ;;;| $05 to function handler | ( fssvc.asm):00039 ;;;|..................................| ( fssvc.asm):00040 ;;;| | ( fssvc.asm):00041 ;;;| More Entries | ( fssvc.asm):00042 ;;;| | ( fssvc.asm):00043 ;;;|..................................| ( fssvc.asm):00044 ;;;| $80 | End-of-table mark ( fssvc.asm):00045 ;;; ---------------------------------- ( fssvc.asm):00046 ;;; ( fssvc.asm):00047 ;;; If the most significant bit of the function code is set, the kernel updates the system table only; otherwise, both ( fssvc.asm):00048 ;;; system and user tables are updated. ( fssvc.asm):00049 ;;; The function request codes are in the range $29-$34. I/O calls are in the range $80-$90. ( fssvc.asm):00050 ;;; To use a privileged system call, you must be executing a program that's executing in the system state. ( fssvc.asm):00051 ;;; The system call handler routine must process the system call and return from the subroutine with an RTS instruction. ( fssvc.asm):00052 ;;; The handler routing may alter all CPU registers, except SP. ( fssvc.asm):00053 ;;; U holds the address of the register stack to the system call hander as shown in the following diagram: ( fssvc.asm):00054 ;;; ( fssvc.asm):00055 ;;; Relative ( fssvc.asm):00056 ;;; Address Name ( fssvc.asm):00057 ;;; ----------------------------------- ( fssvc.asm):00058 ;;; U --> CC $00 R$CC ( fssvc.asm):00059 ;;; A $01 R$A (R$D) ( fssvc.asm):00060 ;;; B $02 R$B ( fssvc.asm):00061 ;;; DP $03 R$DP ( fssvc.asm):00062 ;;; X $04 R$X ( fssvc.asm):00063 ;;; Y $06 R$Y ( fssvc.asm):00064 ;;; U $08 R$U ( fssvc.asm):00065 ;;; PC $0A R$PC ( fssvc.asm):00066 0699 10AE46 ( fssvc.asm):00067 FSSvc ldy R$Y,u get the system call initialization table 069C 2020 ( fssvc.asm):00068 bra InstallSvc install the service 069E 1F98 ( fssvc.asm):00069 loop@ tfr b,a put the system call code in A 06A0 847F ( fssvc.asm):00070 anda #$7F kill the high bit 06A2 817F ( fssvc.asm):00071 cmpa #$7F is the system call code $7F? (I/O handler) 06A4 2708 ( fssvc.asm):00072 beq ok@ branch if so 06A6 8137 ( fssvc.asm):00073 cmpa #$37 compare against highest call allowed 06A8 2504 ( fssvc.asm):00074 bcs ok@ branch if less than or equal to the highest call 06AA 53 ( fssvc.asm):00075 comb else set the carry flag 06AB C6E3 ( fssvc.asm):00076 ldb #E$ISWI and indicate an illegal code 06AD 39 ( fssvc.asm):00077 rts return to the caller 06AE 58 ( fssvc.asm):00078 ok@ lslb B = B * 2 06AF DE46 ( fssvc.asm):00079 ldu | $30/$36 | $30 | ( fall64.asm):00044 ;;; $3000 | Page Table | 64 bytes | ( fall64.asm):00045 ;;; | 64 bytes | | ( fall64.asm):00046 ;;; |------------ ------------| ( fall64.asm):00047 ;;; | $30 | $30 | ( fall64.asm):00048 ;;; | 64 bytes | 64 bytes | ( fall64.asm):00049 ;;; | | | ( fall64.asm):00050 ;;; ------------------------- ( fall64.asm):00051 ;;; ( fall64.asm):00052 ;;; ------------------------- ( fall64.asm):00053 ;;; Next Page --> | $36 | $36 | ( fall64.asm):00054 ;;; $3600 | 64 bytes | 64 bytes | ( fall64.asm):00055 ;;; | | | ( fall64.asm):00056 ;;; |-------------------------| ( fall64.asm):00057 ;;; | $36 | | ( fall64.asm):00058 ;;; | 64 bytes | 64 bytes | ( fall64.asm):00059 ;;; | | | ( fall64.asm):00060 ;;; ------------------------- ( fall64.asm):00061 ;;; ( fall64.asm):00062 ;;; In this example, the first 256 byte page at $3000 is the base page. All four of its 64 byte blocks are allocated ( fall64.asm):00063 ;;; with the first block acting as the page table. Its first two bytes are $30 and $36 which are the MSBs of the addresses ( fall64.asm):00064 ;;; of the allocated pages. ( fall64.asm):00065 ;;; The next 256 byte page at $3600 has three of its four 64 byte blocks allocated and one remaining free. The first byte ( fall64.asm):00066 ;;; of each of the allocated 64 byte blocks contains the MSB of the 256 byte address of its block. ( fall64.asm):00067 0998 AE44 ( fall64.asm):00068 FAll64 ldx R$X,u get base address of page table 099A 2608 ( fall64.asm):00069 bne notempty@ branch if not empty 099C 8D10 ( fall64.asm):00070 bsr Alloc256Bytes otherwise allocate memory for a new page table 099E 250D ( fall64.asm):00071 bcs ex@ exit if error 09A0 AF84 ( fall64.asm):00072 stx ,x save off address of page table in newly allocated page 09A2 AF44 ( fall64.asm):00073 stx R$X,u and in caller's X 09A4 8D1E ( fall64.asm):00074 notempty@ bsr Alloc64Bytes find a free 64 byte block to allocate 09A6 2505 ( fall64.asm):00075 bcs ex@ branch if error 09A8 A741 ( fall64.asm):00076 sta R$A,u save the block number to caller's A 09AA 10AF46 ( fall64.asm):00077 sty R$Y,u and the address to the caller's Y 09AD 39 ( fall64.asm):00078 ex@ rts return to caller ( fall64.asm):00079 ( fall64.asm):00080 * Allocate a 256 byte page from system RAM ( fall64.asm):00081 * ( fall64.asm):00082 * Exit: D = 0 ( fall64.asm):00083 * X = The address of a newly allocated and cleared 256 bytes of RAM. ( fall64.asm):00084 * CC = Carry flag clear to indicate success. ( fall64.asm):00085 * ( fall64.asm):00086 * Error: B = A non-zero error code. ( fall64.asm):00087 * CC = Carry flag set to indicate error. 09AE 3440 ( fall64.asm):00088 Alloc256Bytes pshs u save off caller's registers 09B0 CC0100 ( fall64.asm):00089 ldd #256 we want to allocate 256 bytes 09B3 103F28 ( fall64.asm):00090 os9 F$SRqMem request from system memory 09B6 30C4 ( fall64.asm):00091 leax ,u point X to start of newly allocated area 09B8 3540 ( fall64.asm):00092 puls u and recover U saved earlier 09BA 2507 ( fall64.asm):00093 bcs ex@ branch if error ( fall64.asm):00094 * clear out the newly allocated area 09BC 4F ( fall64.asm):00095 clra A = 0 (used to for clearing byte) 09BD 5F ( fall64.asm):00096 clrb B = 0 (used for 256 loop counter) 09BE A78B ( fall64.asm):00097 loop@ sta d,x clear byte at ,X 09C0 5C ( fall64.asm):00098 incb count loop up 09C1 26FB ( fall64.asm):00099 bne loop@ branch not zero (more to clear) 09C3 39 ( fall64.asm):00100 ex@ rts return to caller ( fall64.asm):00101 ( fall64.asm):00102 * Walk the 64 byte page table to allocate a 64 byte block of memory. ( fall64.asm):00103 * ( fall64.asm):00104 * Entry: X = The base address of the page table. ( fall64.asm):00105 * ( fall64.asm):00106 * Exit: A = The allocated block number. ( fall64.asm):00107 * Y = The address of the allocated 64 byte block. 09C4 3450 ( fall64.asm):00108 Alloc64Bytes pshs u,x save caller's regs and base address of page table 09C6 4F ( fall64.asm):00109 clra A = 0 09C7 3402 ( fall64.asm):00110 searchnext@ pshs a save on stack 09C9 5F ( fall64.asm):00111 clrb B = 0 09CA A686 ( fall64.asm):00112 lda a,x get byte at page table from index A; D now is address 09CC 270B ( fall64.asm):00113 beq pagefree@ branch if zero (no page allocated) 09CE 1F02 ( fall64.asm):00114 tfr d,y else put D in Y 09D0 4F ( fall64.asm):00115 clra clear A 09D1 6DAB ( fall64.asm):00116 checkpage@ tst d,y is this 64 byte page available? 09D3 2706 ( fall64.asm):00117 beq pagefree2@ branch if it is 09D5 CB40 ( fall64.asm):00118 addb #64 else add block size of 64 to B 09D7 24F8 ( fall64.asm):00119 bcc checkpage@ and go check next block if B < 256 09D9 1A01 ( fall64.asm):00120 pagefree@ orcc #Carry set carry flag to indicate this page is free and can be allocated 09DB 31AB ( fall64.asm):00121 pagefree2@ leay d,y point Y to the free 64 byte block 09DD 3502 ( fall64.asm):00122 puls a recover A from stack 09DF 2425 ( fall64.asm):00123 bcc mark2@ branch if no page allocated (carry set earlier) 09E1 4C ( fall64.asm):00124 inca increment A 09E2 8140 ( fall64.asm):00125 cmpa #64 at 64? 09E4 25E1 ( fall64.asm):00126 bcs searchnext@ branch if less than 64 09E6 4F ( fall64.asm):00127 clra A = 0 09E7 6D86 ( fall64.asm):00128 testnext@ tst a,x test value at A,X 09E9 270A ( fall64.asm):00129 beq mark@ branch if 0 09EB 4C ( fall64.asm):00130 inca increment A 09EC 8140 ( fall64.asm):00131 cmpa #64 at 64? 09EE 25F7 ( fall64.asm):00132 bcs testnext@ branch if less than 09F0 C6C8 ( fall64.asm):00133 ldb #E$PthFul otherwise the path table is full (all 64 bytes hold MSB addresses) 09F2 43 ( fall64.asm):00134 coma set carry 09F3 201E ( fall64.asm):00135 bra ex1@ return to caller 09F5 3412 ( fall64.asm):00136 mark@ pshs x,a save X (address of page table) and A (current offset in page table) 09F7 8DB5 ( fall64.asm):00137 bsr Alloc256Bytes go allocate 256 bytes 09F9 251A ( fall64.asm):00138 bcs ex2@ branch if error 09FB 3184 ( fall64.asm):00139 leay ,x point Y to the newly allocated 256 bytes 09FD 1F10 ( fall64.asm):00140 tfr x,d put X into D 09FF 1F89 ( fall64.asm):00141 tfr a,b put MSB of address into B 0A01 3512 ( fall64.asm):00142 puls x,a recover X and A saved earlier 0A03 E786 ( fall64.asm):00143 stb a,x store MSB of address (B) into location in 64 byte page table 0A05 5F ( fall64.asm):00144 clrb B = 0 0A06 58 ( fall64.asm):00145 mark2@ lslb multiply D times 2 0A07 49 ( fall64.asm):00146 rola then... 0A08 58 ( fall64.asm):00147 lslb multiply D times 2 again (D = D*4) 0A09 49 ( fall64.asm):00148 rola A now holds MSB of address of the 256 byte page that this 64 byte block is in 0A0A C63F ( fall64.asm):00149 ldb #64-1 get block size minus 1 (clear remaining 63 bytes) 0A0C 6FA5 ( fall64.asm):00150 loop@ clr b,y clear the byte in the block 0A0E 5A ( fall64.asm):00151 decb decrement b 0A0F 26FB ( fall64.asm):00152 bne loop@ continue if more to clear 0A11 A7A4 ( fall64.asm):00153 sta ,y save MSB of block address in first byte of 64 byte block 0A13 35D0 ( fall64.asm):00154 ex1@ puls pc,u,x pull registers and return 0A15 3263 ( fall64.asm):00155 ex2@ leas 3,s recover stack 0A17 35D0 ( fall64.asm):00156 puls pc,u,x pull registers and return (kernel/kernel.asm):00518 use fret64.asm ( fret64.asm):00001 ******************************************************************************* ( fret64.asm):00002 * TurbOS ( fret64.asm):00003 ******************************************************************************* ( fret64.asm):00004 * See LICENSE.txt for licensing information. ( fret64.asm):00005 ******************************************************************************* ( fret64.asm):00006 * ( fret64.asm):00007 * Edt/Rev YYYY/MM/DD Modified by ( fret64.asm):00008 * Comment ( fret64.asm):00009 * ---------------------------------------------------------------------------- ( fret64.asm):00010 * 2023/08/11 Boisy Pitre ( fret64.asm):00011 * Initial creation. ( fret64.asm):00012 * ( fret64.asm):00013 ******************************************************************************* ( fret64.asm):00014 ( fret64.asm):00015 ;;; F$Ret64 ( fret64.asm):00016 ;;; ( fret64.asm):00017 ;;; Deallocate a 64 byte block of memory. ( fret64.asm):00018 ;;; ( fret64.asm):00019 ;;; Entry: A = The block number to deallocate. ( fret64.asm):00020 ;;; X = The base address of the page table; 0 = allocate the page table. ( fret64.asm):00021 ;;; ( fret64.asm):00022 ;;; Exit: None ( fret64.asm):00023 ;;; ( fret64.asm):00024 ;;; Error: B = A non-zero error code. ( fret64.asm):00025 ;;; CC = Carry flag set to indicate error. ( fret64.asm):00026 ;;; ( fret64.asm):00027 ;;; F$Ret64 returns a previously allocated 64 byte block to the free pool. ( fret64.asm):00028 0A19 A641 ( fret64.asm):00029 FRet64 lda R$A,u get the block number to deallocate 0A1B AE44 ( fret64.asm):00030 ldx R$X,u and the base address of the page table 0A1D 3476 ( fret64.asm):00031 pshs u,y,x,b,a preserve registers 0A1F 5F ( fret64.asm):00032 clrb clear B 0A20 44 ( fret64.asm):00033 lsra divide D by 2 0A21 56 ( fret64.asm):00034 rorb then... 0A22 44 ( fret64.asm):00035 lsra divide D by 2 again 0A23 56 ( fret64.asm):00036 rorb D = D/4 0A24 3402 ( fret64.asm):00037 pshs a A now holds the offset in the page table 0A26 A686 ( fret64.asm):00038 lda a,x get the byte in the page table 0A28 2718 ( fret64.asm):00039 beq ex@ branch if 0; already deallocated, so nothing to do 0A2A 1F02 ( fret64.asm):00040 tfr d,y else copy D in to Y 0A2C 6FA4 ( fret64.asm):00041 clr ,y and clear first byte of 64 byte block at Y to mark it free 0A2E 5F ( fret64.asm):00042 clrb clear B, now D holds address of 256 byte page for this 64 byte block 0A2F 1F03 ( fret64.asm):00043 tfr d,u put D into U 0A31 4F ( fret64.asm):00044 clra clear A ( fret64.asm):00045 * Check if all 64 byte blocks in this 256 byte page are deallocated. If so, free the entire 256 byte block. 0A32 6DCB ( fret64.asm):00046 loop@ tst d,u test first byte of 64 byte block 0A34 260C ( fret64.asm):00047 bne ex@ if not zero, it's allocated; just exit 0A36 CB40 ( fret64.asm):00048 addb #64 else add 64 to B 0A38 26F8 ( fret64.asm):00049 bne loop@ and check the next 64 byte block 0A3A 4C ( fret64.asm):00050 inca increment A 0A3B 103F29 ( fret64.asm):00051 os9 F$SRtMem return 256 byte block to free pool 0A3E A6E4 ( fret64.asm):00052 lda ,s get block number saved earlier 0A40 6F86 ( fret64.asm):00053 clr a,x clear block number in page table to indicate deallocated 0A42 6FE0 ( fret64.asm):00054 ex@ clr ,s+ clear byte and increment stack 0A44 35F6 ( fret64.asm):00055 puls pc,u,y,x,b,a restore registers and return ( fret64.asm):00056 (kernel/kernel.asm):00519 ifne _FF_IRQ_POLL (kernel/kernel.asm):00520 use firq.asm (kernel/kernel.asm):00521 endc (kernel/kernel.asm):00522 ifne _FF_UNIFIED_IO (kernel/kernel.asm):00523 use iocall.asm (kernel/kernel.asm):00524 endc (kernel/kernel.asm):00525 (kernel/kernel.asm):00526 ifne _FF_BOOTING (kernel/kernel.asm):00527 * Attempt to load bootfile and validate the modules it contains. (kernel/kernel.asm):00528 * (kernel/kernel.asm):00529 * Entry: U = The address of the Init module. (kernel/kernel.asm):00530 * (kernel/kernel.asm):00531 * Exit: (kernel/kernel.asm):00532 * (kernel/kernel.asm):00533 * CC Carry set on Error 0A46 (kernel/kernel.asm):00534 LoadBoot pshs u save off the init module address (kernel/kernel.asm):00535 comb set the carry in anticipation of any errors (kernel/kernel.asm):00536 tst D.SWI3] 0A74 6E9F002E (kernel/kernel.asm):00598 SWI2Jmp jmp [>D.SWI2] 0A78 6E9F0034 (kernel/kernel.asm):00599 SWIJmp jmp [>D.SWI] 0A7C 6E9F0036 (kernel/kernel.asm):00600 NMIJmp jmp [>D.NMI] 0A80 6E9F0032 (kernel/kernel.asm):00601 IRQJmp jmp [>D.IRQ] 0A84 6E9F0030 (kernel/kernel.asm):00602 FIRQJmp jmp [>D.FIRQ] 0029 (kernel/kernel.asm):00603 VectCSz equ *-VectCode (kernel/kernel.asm):00604 (kernel/kernel.asm):00605 * The system call table. 0A88 00 (kernel/kernel.asm):00606 SysTbl fcb F$Link 0A89 F809 (kernel/kernel.asm):00607 fdb FLink-*-2 0A8B 03 (kernel/kernel.asm):00608 fcb F$Fork 0A8C F911 (kernel/kernel.asm):00609 fdb FFork-*-2 0A8E 05 (kernel/kernel.asm):00610 fcb F$Chain 0A8F F957 (kernel/kernel.asm):00611 fdb FChain-*-2 0A91 85 (kernel/kernel.asm):00612 fcb F$Chain+SysState 0A92 F966 (kernel/kernel.asm):00613 fdb SFChain-*-2 0A94 0F (kernel/kernel.asm):00614 fcb F$PrsNam 0A95 FB75 (kernel/kernel.asm):00615 fdb FPrsNam-*-2 0A97 10 (kernel/kernel.asm):00616 fcb F$CmpNam 0A98 FBD8 (kernel/kernel.asm):00617 fdb FCmpNam-*-2 0A9A 11 (kernel/kernel.asm):00618 fcb F$SchBit 0A9B FB0E (kernel/kernel.asm):00619 fdb FSchBit-*-2 0A9D 12 (kernel/kernel.asm):00620 fcb F$AllBit 0A9E FA81 (kernel/kernel.asm):00621 fdb FAllBit-*-2 0AA0 13 (kernel/kernel.asm):00622 fcb F$DelBit 0AA1 FAD1 (kernel/kernel.asm):00623 fdb FDelBit-*-2 (kernel/kernel.asm):00624 ifne _FF_MODCHECK (kernel/kernel.asm):00625 fcb F$CRC (kernel/kernel.asm):00626 fdb FCRC-*-2 (kernel/kernel.asm):00627 endc 0AA3 A8 (kernel/kernel.asm):00628 fcb F$SRqMem+SysState 0AA4 FA10 (kernel/kernel.asm):00629 fdb FSRqMem-*-2 0AA6 A9 (kernel/kernel.asm):00630 fcb F$SRtMem+SysState 0AA7 FA5D (kernel/kernel.asm):00631 fdb FSRtMem-*-2 0AA9 AC (kernel/kernel.asm):00632 fcb F$AProc+SysState 0AAA F6FA (kernel/kernel.asm):00633 fdb FAProc-*-2 0AAC AD (kernel/kernel.asm):00634 fcb F$NProc+SysState 0AAD F788 (kernel/kernel.asm):00635 fdb FNProc-*-2 0AAF AE (kernel/kernel.asm):00636 fcb F$VModul+SysState 0AB0 F87D (kernel/kernel.asm):00637 fdb FVModul-*-2 0AB2 32 (kernel/kernel.asm):00638 fcb F$SSvc 0AB3 FBE4 (kernel/kernel.asm):00639 fdb FSSvc-*-2 (kernel/kernel.asm):00640 ifne _FF_UNIFIED_IO (kernel/kernel.asm):00641 fcb $7F (kernel/kernel.asm):00642 fdb IOCall-*-2 (kernel/kernel.asm):00643 endc 0AB5 02 (kernel/kernel.asm):00644 fcb F$Unlink 0AB6 FC0D (kernel/kernel.asm):00645 fdb FUnlink-*-2 0AB8 04 (kernel/kernel.asm):00646 fcb F$Wait 0AB9 FC53 (kernel/kernel.asm):00647 fdb FWait-*-2 0ABB 06 (kernel/kernel.asm):00648 fcb F$Exit 0ABC FC9E (kernel/kernel.asm):00649 fdb FExit-*-2 0ABE 07 (kernel/kernel.asm):00650 fcb F$Mem 0ABF FD06 (kernel/kernel.asm):00651 fdb FMem-*-2 0AC1 08 (kernel/kernel.asm):00652 fcb F$Send 0AC2 FD79 (kernel/kernel.asm):00653 fdb FSend-*-2 0AC4 0A (kernel/kernel.asm):00654 fcb F$Sleep 0AC5 FE13 (kernel/kernel.asm):00655 fdb FSleep-*-2 0AC7 09 (kernel/kernel.asm):00656 fcb F$Icpt 0AC8 FE9D (kernel/kernel.asm):00657 fdb FIcpt-*-2 (kernel/kernel.asm):00658 ifne _FF_ID (kernel/kernel.asm):00659 fcb F$ID (kernel/kernel.asm):00660 fdb FID-*-2 (kernel/kernel.asm):00661 endc (kernel/kernel.asm):00662 ifne _FF_SPRIOR (kernel/kernel.asm):00663 fcb F$SPrior (kernel/kernel.asm):00664 fdb FSPrior-*-2 (kernel/kernel.asm):00665 endc (kernel/kernel.asm):00666 ifne _FF_SSWI (kernel/kernel.asm):00667 fcb F$SSWI (kernel/kernel.asm):00668 fdb FSSWI-*-2 (kernel/kernel.asm):00669 endc 0ACA AF (kernel/kernel.asm):00670 fcb F$Find64+SysState 0ACB FEA8 (kernel/kernel.asm):00671 fdb FFind64-*-2 0ACD B0 (kernel/kernel.asm):00672 fcb F$All64+SysState 0ACE FEC8 (kernel/kernel.asm):00673 fdb FAll64-*-2 0AD0 B1 (kernel/kernel.asm):00674 fcb F$Ret64+SysState 0AD1 FF46 (kernel/kernel.asm):00675 fdb FRet64-*-2 (kernel/kernel.asm):00676 ifne _FF_IRQ_POLL (kernel/kernel.asm):00677 fcb F$IRQ+$80 (kernel/kernel.asm):00678 fdb FIRQ-*-2 (kernel/kernel.asm):00679 endc 0AD3 80 (kernel/kernel.asm):00680 fcb $80 (kernel/kernel.asm):00681 0AD4 496E69F4 (kernel/kernel.asm):00682 InitNam fcs /Init/ (kernel/kernel.asm):00683 0AD8 (kernel/kernel.asm):00684 EOMTop equ * (kernel/kernel.asm):00685 0AD8 0105 (kernel/kernel.asm):00686 Vectors fdb SWI3 SWI3 0ADA 010B (kernel/kernel.asm):00687 fdb SWI2 SWI2 0ADC 0111 (kernel/kernel.asm):00688 fdb DUMMY FIRQ 0ADE 0112 (kernel/kernel.asm):00689 fdb SVCIRQ IRQ 0AE0 0116 (kernel/kernel.asm):00690 fdb SWI SWI 0AE2 0111 (kernel/kernel.asm):00691 fdb SVCNMI NMI (kernel/kernel.asm):00692 000C (kernel/kernel.asm):00693 EOMSize equ *-EOMTop (kernel/kernel.asm):00694 0AE4 7D820D (kernel/kernel.asm):00695 emod 0AE7 (kernel/kernel.asm):00696 eom equ * (kernel/kernel.asm):00697 end