(e/modules/scf.asm):00001 ******************************************************************** (e/modules/scf.asm):00002 * scf - Sequential Character File Manager (e/modules/scf.asm):00003 * (e/modules/scf.asm):00004 * Edt/Rev YYYY/MM/DD Modified by (e/modules/scf.asm):00005 * Comment (e/modules/scf.asm):00006 * ------------------------------------------------------------------ (e/modules/scf.asm):00007 * 1 2025/04/06 Boisy Pitre (e/modules/scf.asm):00008 * Migrated from the NitrOS-9 Project. (e/modules/scf.asm):00009 (e/modules/scf.asm):00010 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 (e/modules/scf.asm):00011 use scf.d ( scf.d):00001 IFNE SCF.D-1 ( scf.d):00002 0001 ( scf.d):00003 SCF.D SET 1 ( scf.d):00004 ( scf.d):00005 ******************************************************************** ( scf.d):00006 * scf.d - Sequential Character File Manager Definitions ( scf.d):00007 * ( scf.d):00008 * $Id$ ( scf.d):00009 * ( scf.d):00010 * SCF stands for 'Sequential Character Filemanager' and is a package of subroutines ( scf.d):00011 * that define the logical structure of a serial device. ( scf.d):00012 * ( scf.d):00013 * The data structures in this file give SCF its 'personality' and are used ( scf.d):00014 * by SCF itself, as well as applications that will require disk I/O. ( scf.d):00015 * ( scf.d):00016 * Edt/Rev YYYY/MM/DD Modified by ( scf.d):00017 * Comment ( scf.d):00018 * ------------------------------------------------------------------ ( scf.d):00019 * 1984/01/11 YO ( scf.d):00020 * Added V.KANJI, V.KBUF, V.MODADR for new kanji input process. ( scf.d):00021 * ( scf.d):00022 * 1985/04/20 Mark G. Hawkins ( scf.d):00023 * Added V.PDLHd Path Descriptor List Head. ( scf.d):00024 * ( scf.d):00025 * 1985/04/21 Mark G. Hawkins ( scf.d):00026 * Added PD.PLP and PD.PST for modem handling. ( scf.d):00027 * ( scf.d):00028 * 1987/06/23 Kevin K. Darling ( scf.d):00029 * Updated with Dev Desc info. ( scf.d):00030 * ( scf.d):00031 * 1998/10/03 Boisy G. Pitre ( scf.d):00032 * Consolidated L1/L2 scfdefs. ( scf.d):00033 * ( scf.d):00034 * 2003/01/21 Boisy G. Pitre ( scf.d):00035 * Added symbolics for enhanced SCF line editing. ( scf.d):00036 * ( scf.d):00037 * 2003/06/02 Boisy G. Pitre ( scf.d):00038 * Updated comments for clarity. ( scf.d):00039 * ( scf.d):00040 * 2004/05/17 Boisy G. Pitre ( scf.d):00041 * Added higher baud rates. ( scf.d):00042 ( scf.d):00043 NAM scf.d ( scf.d):00044 TTL Sequential File Manager Definitions ( scf.d):00045 ( scf.d):00046 PAG ( scf.d):00047 ******************************* ( scf.d):00048 * SCF Device Descriptor Offsets ( scf.d):00049 * ( scf.d):00050 * These definitions are for SCF device descriptors. ( scf.d):00051 ( scf.d):00052 ORG M$DTyp 0012 ( scf.d):00053 IT.DVC RMB 1 Device type (DT.SCF) 0013 ( scf.d):00054 IT.UPC RMB 1 Uppercase flag 0014 ( scf.d):00055 IT.BSO RMB 1 Backspace behavior 0015 ( scf.d):00056 IT.DLO RMB 1 Delete behavior 0016 ( scf.d):00057 IT.EKO RMB 1 Echo flag 0017 ( scf.d):00058 IT.ALF RMB 1 Auto linefeed flag 0018 ( scf.d):00059 IT.NUL RMB 1 End-of-line null count 0019 ( scf.d):00060 IT.PAU RMB 1 Page pause flag 001A ( scf.d):00061 IT.PAG RMB 1 Number of lines per page 001B ( scf.d):00062 IT.BSP RMB 1 Backspace character 001C ( scf.d):00063 IT.DEL RMB 1 Delete-line character 001D ( scf.d):00064 IT.EOR RMB 1 End-of-record character 001E ( scf.d):00065 IT.EOF RMB 1 End-of-file character 001F ( scf.d):00066 IT.RPR RMB 1 Reprint-line character 0020 ( scf.d):00067 IT.DUP RMB 1 Duplicate-last-line character 0021 ( scf.d):00068 IT.PSC RMB 1 Pause character 0022 ( scf.d):00069 IT.INT RMB 1 Interrupt character 0023 ( scf.d):00070 IT.QUT RMB 1 Quit character 0024 ( scf.d):00071 IT.BSE RMB 1 Backspace echo character 0025 ( scf.d):00072 IT.OVF RMB 1 Bell character 0026 ( scf.d):00073 IT.PAR RMB 1 Parity 0027 ( scf.d):00074 IT.BAU RMB 1 Baud rate 0028 ( scf.d):00075 IT.D2P RMB 2 Attached device name string offset 002A ( scf.d):00076 IT.XON RMB 1 X-ON character 002B ( scf.d):00077 IT.XOFF RMB 1 X-OFF character 002C ( scf.d):00078 IT.COL RMB 1 Number of columns for display 002D ( scf.d):00079 IT.ROW RMB 1 Number of rows for display 002E ( scf.d):00080 IT.XTYP RMB 1 Extended type (added by BRI) ( scf.d):00081 ( scf.d):00082 IFGT Level-1 ( scf.d):00083 * Window Descriptor Additions ( scf.d):00084 * For CoCo window, where IT.PAR = $80 ( scf.d):00085 ORG IT.ROW+1 002F ( scf.d):00086 IT.WND RMB 1 Window number (matches device name) ($2E) 002F ( scf.d):00087 IT.VAL RMB 1 Use defaults on Init (0=no, 1=yes) 002F ( scf.d):00088 IT.STY RMB 1 Screen type default 002F ( scf.d):00089 IT.CPX RMB 1 Column start default 002F ( scf.d):00090 IT.CPY RMB 1 Row start default 002F ( scf.d):00091 IT.FGC RMB 1 Foreground color default 002F ( scf.d):00092 IT.BGC RMB 1 Background color default 002F ( scf.d):00093 IT.BDC RMB 1 Border color default ( scf.d):00094 ENDC ( scf.d):00095 ( scf.d):00096 ( scf.d):00097 PAG ( scf.d):00098 ******************** ( scf.d):00099 * SCF Static Storage ( scf.d):00100 * ( scf.d):00101 * SCF devices must reserve this space for SCF ( scf.d):00102 * ( scf.d):00103 ORG V.USER 0006 ( scf.d):00104 V.TYPE RMB 1 Device type or parity 0007 ( scf.d):00105 V.LINE RMB 1 Lines left until end of page 0008 ( scf.d):00106 V.PAUS RMB 1 Immediate Pause request 0009 ( scf.d):00107 V.DEV2 RMB 2 Attached device's static 000B ( scf.d):00108 V.INTR RMB 1 Interrupt char 000C ( scf.d):00109 V.QUIT RMB 1 Quit char 000D ( scf.d):00110 V.PCHR RMB 1 Pause char 000E ( scf.d):00111 V.ERR RMB 1 Accumulated errors 000F ( scf.d):00112 V.XON RMB 1 X-On char 0010 ( scf.d):00113 V.XOFF RMB 1 X-Off char 0011 ( scf.d):00114 V.KANJI RMB 1 Kanji mode flag 0012 ( scf.d):00115 V.KBUF RMB 2 Kana - Kanji convert routine work address 0014 ( scf.d):00116 V.MODADR RMB 2 Kana - Kanji convert module address 0016 ( scf.d):00117 V.PDLHd RMB 2 Open path descriptor list head pointer 0018 ( scf.d):00118 V.RSV RMB 5 Reserve bytes for future expansion 001D ( scf.d):00119 V.SCF EQU . Total SCF manager static overhead ( scf.d):00120 ( scf.d):00121 ( scf.d):00122 PAG ( scf.d):00123 *********************** ( scf.d):00124 * Character Definitions ( scf.d):00125 * 0000 ( scf.d):00126 C$NULL SET 0 Null char 0001 ( scf.d):00127 C$RPET SET $01 (CTRL-A - SOH) Repeat last input line 0003 ( scf.d):00128 C$INTR SET $03 (CTRL-C - ETX) Keyboard interrupt 0004 ( scf.d):00129 C$RPRT SET $04 (CTRL-D - EOT) Reprint current input line 0005 ( scf.d):00130 C$QUIT SET $05 (CTRL-E - ENQ) Keyboard Abort 0007 ( scf.d):00131 C$BELL SET $07 (CTRL-G - BEL) Line overflow warning 0008 ( scf.d):00132 C$BSP SET $08 (CTRL-H - BS ) Back space 0009 ( scf.d):00133 C$RARR SET $09 Right Arrow 0005 ( scf.d):00134 C$EL SET $05 Erase Line 000A ( scf.d):00135 C$LF SET $0A Line feed 000B ( scf.d):00136 C$HOME SET $0B Home position Code 0015 ( scf.d):00137 C$Clsgr SET $15 Graphic screen clear (use FM-11) 0016 ( scf.d):00138 C$Clsall SET $16 Graphic & character clear (use FM-11) 000D ( scf.d):00139 C$CR SET $0D Carriage return 000C ( scf.d):00140 C$FORM SET $0C (CTRL-L - FF ) Form Feed ... screen clear 000F ( scf.d):00141 C$SI SET $0F Shift IN Code 000E ( scf.d):00142 C$SO SET $0E Shift OUT Code 0010 ( scf.d):00143 C$DELETE SET $10 Delete char (for SCF enhanced line editing) 0011 ( scf.d):00144 C$XON SET $11 (CTRL-Q - DC1) Transmit Enable 0011 ( scf.d):00145 C$INSERT SET C$XON Insert char (for SCF enhanced line editing) 0013 ( scf.d):00146 C$XOFF SET $13 (CTRL-S - DC3) Transmit Disable 0013 ( scf.d):00147 C$PLINE SET C$XOFF Print remaining line (for SCF enhanced line editing) 0017 ( scf.d):00148 C$PAUS SET $17 (CTRL-W - ETB) Pause character 0018 ( scf.d):00149 C$DEL SET $18 (CTRL-X - CAN) Delete line 0019 ( scf.d):00150 C$SHRARR SET $19 Shift Right-Arrow 001B ( scf.d):00151 C$EOF SET $1B (CTRL-[ - ESC) END of file 001C ( scf.d):00152 C$RGT SET $1C Cursor right 001D ( scf.d):00153 C$LFT SET $1D Cursor left 001E ( scf.d):00154 C$UP SET $1E Cursor up 001F ( scf.d):00155 C$DWN SET $1F Cursor down 0020 ( scf.d):00156 C$SPAC SET $20 Space 002E ( scf.d):00157 C$PERD SET '. 002C ( scf.d):00158 C$COMA SET ', ( scf.d):00159 ( scf.d):00160 ( scf.d):00161 PAG ( scf.d):00162 ********************************************* ( scf.d):00163 * Sequential Character Path Descriptor Format ( scf.d):00164 * ( scf.d):00165 * A path descriptor is created for every new path that is open ( scf.d):00166 * via the I$Open system call (processed by IOMan). Process ( scf.d):00167 * descriptors track state information of a path. ( scf.d):00168 * ( scf.d):00169 ORG PD.FST 000A ( scf.d):00170 PD.DV2 RMB 2 Output device table pointer 000C ( scf.d):00171 PD.RAW RMB 1 Read/Write or ReadLn/WritLn mode 000D ( scf.d):00172 PD.MAX RMB 2 ReadLn high byte count 000F ( scf.d):00173 PD.MIN RMB 1 Devices are "mine" if clear 0010 ( scf.d):00174 PD.STS RMB 2 Status routine module addr 0012 ( scf.d):00175 PD.STM RMB 2 Reserved for status routine ( scf.d):00176 ORG PD.OPT 0020 ( scf.d):00177 RMB 1 Device type 0021 ( scf.d):00178 PD.UPC RMB 1 Case (0=both, 1=upper only) 0022 ( scf.d):00179 PD.BSO RMB 1 Backspace (0=BSE, 1=BSE,SP,BSE) 0023 ( scf.d):00180 PD.DLO RMB 1 Delete (0=BSE over line, 1=CRLF) 0024 ( scf.d):00181 PD.EKO RMB 1 Echo (0=No Echo) 0025 ( scf.d):00182 PD.ALF RMB 1 Auto linefeed (0=No auto LF) 0026 ( scf.d):00183 PD.NUL RMB 1 End of Line null count 0027 ( scf.d):00184 PD.PAU RMB 1 Page pause (0=No end of page pause) 0028 ( scf.d):00185 PD.PAG RMB 1 Lines per page 0029 ( scf.d):00186 PD.BSP RMB 1 Backspace character 002A ( scf.d):00187 PD.DEL RMB 1 Delete Line character 002B ( scf.d):00188 PD.EOR RMB 1 End of Record character (read only) 002C ( scf.d):00189 PD.EOF RMB 1 End of File character 002D ( scf.d):00190 PD.RPR RMB 1 Repront Line character 002E ( scf.d):00191 PD.DUP RMB 1 Dup Last Line character 002F ( scf.d):00192 PD.PSC RMB 1 Pause character 0030 ( scf.d):00193 PD.INT RMB 1 Keyboard interrupt character (CTRL-C) 0031 ( scf.d):00194 PD.QUT RMB 1 Keyboard quit character (CTRL-E) 0032 ( scf.d):00195 PD.BSE RMB 1 Backspace echo character 0033 ( scf.d):00196 PD.OVF RMB 1 Line overflow character (BELL) 0034 ( scf.d):00197 PD.PAR RMB 1 Parity code 0035 ( scf.d):00198 PD.BAU RMB 1 ACIA baud rate (Color Computer) 0036 ( scf.d):00199 PD.D2P RMB 2 Offset of DEV2 name 0038 ( scf.d):00200 PD.XON RMB 1 ACIA X-ON character 0039 ( scf.d):00201 PD.XOFF RMB 1 ACIA X-OFF character 001A ( scf.d):00202 OPTCNT EQU .-PD.OPT Total user settable options 003A ( scf.d):00203 PD.ERR RMB 1 Most recent I/O error status 003B ( scf.d):00204 PD.TBL RMB 2 Device table addr (copy) 003D ( scf.d):00205 PD.PLP RMB 2 Path Descriptor List Pointer 003F ( scf.d):00206 PD.PST RMB 1 Current path status ( scf.d):00207 ( scf.d):00208 ( scf.d):00209 * PD.PST values Path Descriptor Status byte ( scf.d):00210 * 0001 ( scf.d):00211 PST.DCD EQU %00000001 Set if DCD is lost on Serial port ( scf.d):00212 ( scf.d):00213 ( scf.d):00214 * PD.PAR definitions ( scf.d):00215 * ( scf.d):00216 * Parity 0000 ( scf.d):00217 PARNONE EQU %00000000 0020 ( scf.d):00218 PARODD EQU %00100000 0060 ( scf.d):00219 PAREVEN EQU %01100000 00A0 ( scf.d):00220 PARMARK EQU %10100000 00E0 ( scf.d):00221 PARSPACE EQU %11100000 00E0 ( scf.d):00222 PARMASK EQU %11100000 ( scf.d):00223 ( scf.d):00224 * PD.BAU definitions ( scf.d):00225 * ( scf.d):00226 * Baud rate 0000 ( scf.d):00227 B110 EQU %00000000 0001 ( scf.d):00228 B300 EQU %00000001 0002 ( scf.d):00229 B600 EQU %00000010 0003 ( scf.d):00230 B1200 EQU %00000011 0004 ( scf.d):00231 B2400 EQU %00000100 0005 ( scf.d):00232 B4800 EQU %00000101 0006 ( scf.d):00233 B9600 EQU %00000110 0007 ( scf.d):00234 B19200 EQU %00000111 0008 ( scf.d):00235 B38400 EQU %00001000 0009 ( scf.d):00236 B57600 EQU %00001001 000A ( scf.d):00237 B115200 EQU %00001010 ( scf.d):00238 * Word size 0000 ( scf.d):00239 WORD8 EQU %00000000 0020 ( scf.d):00240 WORD7 EQU %00100000 ( scf.d):00241 * Stop bits 0000 ( scf.d):00242 STOP1 EQU %00000000 0010 ( scf.d):00243 STOP2 EQU %00010000 ( scf.d):00244 ( scf.d):00245 ENDC (e/modules/scf.asm):00012 00D1 (e/modules/scf.asm):00013 tylg set FlMgr+Objct 0080 (e/modules/scf.asm):00014 atrv set ReEnt+rev 0000 (e/modules/scf.asm):00015 rev set 0 0001 (e/modules/scf.asm):00016 edition equ 1 (e/modules/scf.asm):00017 0000 87CD06D0000DD180 (e/modules/scf.asm):00018 mod eom,SCFName,tylg,atrv,SCFEnt,0 3F02940000 (e/modules/scf.asm):00019 000D 7363E6 (e/modules/scf.asm):00020 SCFName fcs /scf/ 0010 01 (e/modules/scf.asm):00021 fcb edition (e/modules/scf.asm):00022 (e/modules/scf.asm):00023 * Default input buffer setting for SCF devices when Opened/Created (e/modules/scf.asm):00024 * 123456789!123456789!1234567890 (e/modules/scf.asm):00025 *msg fcc 'by B.Nobel,C.Boyle,W.Gale-1993' 0011 7777772E6E697472 (e/modules/scf.asm):00026 msg fcc 'www.nitros9.org' 6F73392E6F7267 000F (e/modules/scf.asm):00027 msgsize equ *-msg Size of default input buffer message 0020 0D (e/modules/scf.asm):00028 fcb C$CR 2nd CR for buffer pad fill 00F1 (e/modules/scf.asm):00029 blksize equ 256-msgsize Size of blank space after it (e/modules/scf.asm):00030 (e/modules/scf.asm):00031 * Return bad pathname error 0021 3520 (e/modules/scf.asm):00032 opbpnam puls y 0023 53 (e/modules/scf.asm):00033 bpnam comb Set carry for error 0024 C6D7 (e/modules/scf.asm):00034 ldb #E$BPNam Get error code 0026 39 (e/modules/scf.asm):00035 oerr rts Return to caller (e/modules/scf.asm):00036 (e/modules/scf.asm):00037 * I$Create/I$Open entry point (e/modules/scf.asm):00038 * Entry: Y= Path dsc. ptr 0027 AE23 (e/modules/scf.asm):00039 open ldx PD.DEV,y Get device table pointer 0029 AFA83B (e/modules/scf.asm):00040 stx PD.TBL,y Save it 002C EE26 (e/modules/scf.asm):00041 ldu PD.RGS,y Get callers register stack pointer 002E 3420 (e/modules/scf.asm):00042 pshs y Save path descriptor pointer 0030 AE44 (e/modules/scf.asm):00043 ldx R$X,u Get pointer to device pathname 0032 103F0F (e/modules/scf.asm):00044 os9 F$PrsNam Parse it 0035 25EA (e/modules/scf.asm):00045 bcs opbpnam Error, exit 0037 4D (e/modules/scf.asm):00046 tsta End of pathname? 0038 2B07 (e/modules/scf.asm):00047 bmi open1 Yes, go on 003A 30A4 (e/modules/scf.asm):00048 leax ,y Point to actual device name 003C 103F0F (e/modules/scf.asm):00049 os9 F$PrsNam Parse it again 003F 24E0 (e/modules/scf.asm):00050 bcc opbpnam Return to caller with bad path name if more 0041 10AF44 (e/modules/scf.asm):00051 open1 sty R$X,u Save updated name pointer to caller 0044 3520 (e/modules/scf.asm):00052 puls y Restore path descriptor pointer 0046 CC0100 (e/modules/scf.asm):00053 ldd #256 Get size of input buffer in bytes 0049 103F28 (e/modules/scf.asm):00054 os9 F$SRqMem Allocate it 004C 25D8 (e/modules/scf.asm):00055 bcs oerr Can't allocate it return with error 004E EF28 (e/modules/scf.asm):00056 stu PD.BUF,y Save buffer address to path descriptor 0050 308CBE (e/modules/scf.asm):00057 leax D.Proc Get current process pointer 0164 308826 (e/modules/scf.asm):00222 leax P$Path,x Point to local path table 0167 4F (e/modules/scf.asm):00223 clra Start path # = 0 (Std In) 0168 E186 (e/modules/scf.asm):00224 L0198 cmpb a,x Same path as one is process' local path list? 016A 2731 (e/modules/scf.asm):00225 beq L01CA Yes, return 016C 4C (e/modules/scf.asm):00226 inca Move to next path 016D 8110 (e/modules/scf.asm):00227 cmpa #NumPaths Done all paths? 016F 25F7 (e/modules/scf.asm):00228 blo L0198 No, keep going 0171 3420 (e/modules/scf.asm):00229 pshs y Preserve path descriptor pointer 0173 CC1B0C (e/modules/scf.asm):00230 ldd #SS.Relea*256+D$PSTA 0176 8D53 (e/modules/scf.asm):00231 bsr L01FA Execute driver setstat routine 0178 3520 (e/modules/scf.asm):00232 puls y Restore path pointer 017A BE004B (e/modules/scf.asm):00233 ldx >D.Proc Get current process pointer 017D A601 (e/modules/scf.asm):00234 lda P$PID,x Get parent process ID 017F A7E4 (e/modules/scf.asm):00235 sta ,s Save it 0181 9E49 (e/modules/scf.asm):00236 ldx D.Proc Get current process pointer 01F4 A646 (e/modules/scf.asm):00301 lda R$Y,u Get flag byte for CR/NO CR 01F6 3402 (e/modules/scf.asm):00302 pshs a Save it 01F8 A680 (e/modules/scf.asm):00303 loop lda ,x+ 01FA A7C0 (e/modules/scf.asm):00304 sta ,u+ 01FC 313F (e/modules/scf.asm):00305 leay -1,y 01FE 26F8 (e/modules/scf.asm):00306 bne loop 0200 A6E4 (e/modules/scf.asm):00307 lda ,s Get CR flag 0202 2B04 (e/modules/scf.asm):00308 bmi putkey1 Don't want CR appended, exit 0204 860D (e/modules/scf.asm):00309 lda #C$CR Get code for carriage return 0206 A7C5 (e/modules/scf.asm):00310 sta b,u Put it in buffer to terminate string 0208 35F2 (e/modules/scf.asm):00311 putkey1 puls a,x,y,u,pc Eat stack & return (e/modules/scf.asm):00312 020A C60C (e/modules/scf.asm):00313 L021B ldb #D$PSTA Get driver entry offset for setstat 020C A642 (e/modules/scf.asm):00314 lda R$B,u Get function code from caller 020E 26DB (e/modules/scf.asm):00315 bne putkey Not SS.OPT, go check buffer load (e/modules/scf.asm):00316 * SS.OPT SETSTAT 0210 AEA827 (e/modules/scf.asm):00317 ldx PD.PAU,y Get current pause & page 0213 3430 (e/modules/scf.asm):00318 pshs x,y 0215 AE44 (e/modules/scf.asm):00319 ldx R$X,u 0217 31A820 (e/modules/scf.asm):00320 leay PD.OPT,y 021A C61A (e/modules/scf.asm):00321 ldb #OPTCNT 021C A680 (e/modules/scf.asm):00322 optloop lda ,x+ 021E A7A0 (e/modules/scf.asm):00323 sta ,y+ 0220 5A (e/modules/scf.asm):00324 decb 0221 26F9 (e/modules/scf.asm):00325 bne optloop 0223 3530 (e/modules/scf.asm):00326 puls x,y 0225 3410 (e/modules/scf.asm):00327 pshs x 0227 ECA827 (e/modules/scf.asm):00328 ldd PD.PAU,y Get new page/pause status 022A 10A3E1 (e/modules/scf.asm):00329 cmpd ,s++ 022D 2708 (e/modules/scf.asm):00330 beq L0250 Yes, go on 022F EE23 (e/modules/scf.asm):00331 ldu PD.DEV,y Get device table pointer 0231 EE42 (e/modules/scf.asm):00332 ldu V$STAT,u Get static storage pointer 0233 2702 (e/modules/scf.asm):00333 beq L0250 Go on if none 0235 E747 (e/modules/scf.asm):00334 stb V.LINE,u Update new line count 0237 AEA834 (e/modules/scf.asm):00335 L0250 ldx PD.PAR,y Get parity/baud 023A 8628 (e/modules/scf.asm):00336 lda #SS.ComSt Get code for ComSt 023C 3412 (e/modules/scf.asm):00337 pshs a,x Preserve them 023E 8D02 (e/modules/scf.asm):00338 bsr L025B Update parity & baud 0240 3592 (e/modules/scf.asm):00339 puls a,x,pc Restore & return (e/modules/scf.asm):00340 (e/modules/scf.asm):00341 * Update path Parity & baud 0242 3470 (e/modules/scf.asm):00342 L025B pshs x,y,u Preserve everything 0244 AE26 (e/modules/scf.asm):00343 ldx PD.RGS,y Get callers register pointer 0246 EE06 (e/modules/scf.asm):00344 ldu R$Y,x Get his Y 0248 A602 (e/modules/scf.asm):00345 lda R$B,x Get his B 024A 3472 (e/modules/scf.asm):00346 pshs a,x,y,u Preserve it all 024C ECE810 (e/modules/scf.asm):00347 ldd $10,s Get current parity/baud 024F ED06 (e/modules/scf.asm):00348 std R$Y,x Put it in callers Y 0251 A66F (e/modules/scf.asm):00349 lda $0F,s Get function code 0253 A702 (e/modules/scf.asm):00350 sta R$B,x Put it in callers B 0255 170157 (e/modules/scf.asm):00351 lbsr L04A7 Wait for device to be ready 0258 17FF87 (e/modules/scf.asm):00352 lbsr L0212 Send it to driver 025B 3572 (e/modules/scf.asm):00353 puls a,x,y,u Restore callers registers 025D EF06 (e/modules/scf.asm):00354 stu R$Y,x Put back his Y 025F A702 (e/modules/scf.asm):00355 sta R$B,x Put back his B 0261 2405 (e/modules/scf.asm):00356 bcc L0282 Return if no error 0263 C1D0 (e/modules/scf.asm):00357 cmpb #E$UnkSvc Unknown service request? 0265 2701 (e/modules/scf.asm):00358 beq L0282 Yes, return 0267 43 (e/modules/scf.asm):00359 coma Set carry 0268 35F0 (e/modules/scf.asm):00360 L0282 puls x,y,u,pc Restore & return (e/modules/scf.asm):00361 (e/modules/scf.asm):00362 * I$Read entry point 026A 17013D (e/modules/scf.asm):00363 read lbsr L04A2 Go wait for device to be ready for us 026D 2401 (e/modules/scf.asm):00364 bcc L028A No error, go on 026F 39 (e/modules/scf.asm):00365 L0289 rts Return with error (e/modules/scf.asm):00366 0270 6C2C (e/modules/scf.asm):00367 L028A inc PD.RAW,y Make sure we do Raw read 0272 AE46 (e/modules/scf.asm):00368 ldx R$Y,u Get number of characters to read 0274 2772 (e/modules/scf.asm):00369 beq L02DC Return if zero 0276 3410 (e/modules/scf.asm):00370 pshs x Save character count 0278 8E0000 (e/modules/scf.asm):00371 ldx #0 027B EE28 (e/modules/scf.asm):00372 ldu PD.BUF,y Get buffer address 027D 8D6B (e/modules/scf.asm):00373 bsr L03E2 Read 1 character from device 027F 250A (e/modules/scf.asm):00374 bcs L02A4 Return if error 0281 4D (e/modules/scf.asm):00375 tsta Character read zero? 0282 274C (e/modules/scf.asm):00376 beq L02C4 Yes, go try again 0284 A1A82C (e/modules/scf.asm):00377 cmpa PD.EOF,y End of file character? 0287 263F (e/modules/scf.asm):00378 bne L02BC No, keep checking 0289 C6D3 (e/modules/scf.asm):00379 L02A2 ldb #E$EOF Get EOF error code 028B 3262 (e/modules/scf.asm):00380 L02A4 leas 2,s Purge stack 028D 3404 (e/modules/scf.asm):00381 pshs b Save error code 028F 8D51 (e/modules/scf.asm):00382 bsr L02D5 Return 0291 53 (e/modules/scf.asm):00383 comb Set carry 0292 3584 (e/modules/scf.asm):00384 puls b,pc Restore & return (e/modules/scf.asm):00385 (e/modules/scf.asm):00386 ****************************** (e/modules/scf.asm):00387 * (e/modules/scf.asm):00388 * SCF file manager entry point (e/modules/scf.asm):00389 * (e/modules/scf.asm):00390 * Entry: Y = Path descriptor pointer (e/modules/scf.asm):00391 * U = Callers register stack pointer (e/modules/scf.asm):00392 * (e/modules/scf.asm):00393 0294 16FD90 (e/modules/scf.asm):00394 SCFEnt lbra open Create path 0297 16FD8D (e/modules/scf.asm):00395 lbra open Open path 029A 16FD86 (e/modules/scf.asm):00396 lbra bpnam Makdir 029D 16FD83 (e/modules/scf.asm):00397 lbra bpnam Chgdir 02A0 16FE4F (e/modules/scf.asm):00398 lbra L0129 Delete (return no error) 02A3 16FE4C (e/modules/scf.asm):00399 lbra L0129 Seek (return no error) 02A6 20C2 (e/modules/scf.asm):00400 bra read Read character 02A8 12 (e/modules/scf.asm):00401 nop 02A9 16013B (e/modules/scf.asm):00402 lbra write Write character 02AC 16008E (e/modules/scf.asm):00403 lbra readln ReadLn 02AF 160131 (e/modules/scf.asm):00404 lbra writln WriteLn 02B2 16FEEA (e/modules/scf.asm):00405 lbra getstt Get Status 02B5 16FF27 (e/modules/scf.asm):00406 lbra setstt Set Status 02B8 16FE25 (e/modules/scf.asm):00407 lbra close Close path (e/modules/scf.asm):00408 (e/modules/scf.asm):00409 * MAIN READ LOOP (no editing) 02BB 1F10 (e/modules/scf.asm):00410 L02AD tfr x,d move character count to D 02BD 5D (e/modules/scf.asm):00411 tstb past buffer end? 02BE 2604 (e/modules/scf.asm):00412 bne L02B7 no, go get character from device (e/modules/scf.asm):00413 * Not often used: only when buffer is full 02C0 8D50 (e/modules/scf.asm):00414 bsr L042B move buffer to caller's buffer 02C2 EE28 (e/modules/scf.asm):00415 ldu PD.BUF,y reset buffer pointer back to start (e/modules/scf.asm):00416 * Main char by char read loop 02C4 8D24 (e/modules/scf.asm):00417 L02B7 bsr L03E2 get a character from device 02C6 25C3 (e/modules/scf.asm):00418 bcs L02A4 exit if error 02C8 E6A824 (e/modules/scf.asm):00419 L02BC ldb PD.EKO,y echo turned on? 02CB 2703 (e/modules/scf.asm):00420 beq L02C4 no, don't write it to device 02CD 170233 (e/modules/scf.asm):00421 lbsr L0565 send it to device write 02D0 C601 (e/modules/scf.asm):00422 L02C4 ldb #1 Bump up char count 02D2 3A (e/modules/scf.asm):00423 abx 02D3 A7C0 (e/modules/scf.asm):00424 sta ,u+ save character in local buffer 02D5 2705 (e/modules/scf.asm):00425 beq L02CF go try again if it was a null 02D7 A1A82B (e/modules/scf.asm):00426 cmpa PD.EOR,y end of record charcter? 02DA 2704 (e/modules/scf.asm):00427 beq L02D3 yes, return 02DC ACE4 (e/modules/scf.asm):00428 L02CF cmpx ,s done read? 02DE 25DB (e/modules/scf.asm):00429 blo L02AD no, keep going till we are (e/modules/scf.asm):00430 02E0 3262 (e/modules/scf.asm):00431 L02D3 leas 2,s purge stack 02E2 8D2E (e/modules/scf.asm):00432 L02D5 bsr L042B move local buffer to caller 02E4 EE26 (e/modules/scf.asm):00433 ldu PD.RGS,y get register stack pointer 02E6 AF46 (e/modules/scf.asm):00434 stx R$Y,u save number of characters read 02E8 2071 (e/modules/scf.asm):00435 L02DC bra L0453 update path descriptor and return (e/modules/scf.asm):00436 (e/modules/scf.asm):00437 * Read character from device 02EA 3470 (e/modules/scf.asm):00438 L03E2 pshs u,y,x Preserve regs 02EC AE23 (e/modules/scf.asm):00439 ldx PD.DEV,y Get device table pointer for input 02EE 2720 (e/modules/scf.asm):00440 beq L0401 None, exit 02F0 EE2A (e/modules/scf.asm):00441 ldu PD.DV2,y Get device table pointer for echoed output 02F2 2707 (e/modules/scf.asm):00442 beq L03F1 No echoed output device, skip ahead 02F4 EE42 (e/modules/scf.asm):00443 L03EA ldu V$STAT,u Get device static storage ptr for echo device 02F6 E6A828 (e/modules/scf.asm):00444 ldb PD.PAG,y Get lines per page 02F9 E747 (e/modules/scf.asm):00445 stb V.LINE,u Store it in device static 02FB 1F30 (e/modules/scf.asm):00446 L03F1 tfr u,d Yes, move echo device' static storage to D 02FD EE02 (e/modules/scf.asm):00447 ldu V$STAT,x Get static storage ptr for input 02FF ED49 (e/modules/scf.asm):00448 std V.DEV2,u Save echo device's static storage into input device 0301 4F (e/modules/scf.asm):00449 clra 0302 A745 (e/modules/scf.asm):00450 sta V.WAKE,u Flag input device to be awake 0304 3406 (e/modules/scf.asm):00451 pshs d 0306 AE84 (e/modules/scf.asm):00452 ldx V$DRIV,x get driver module 0308 EC09 (e/modules/scf.asm):00453 ldd M$EXEC,x Get driver execution pointer 030A 308B (e/modules/scf.asm):00454 leax d,x 030C 3506 (e/modules/scf.asm):00455 puls d 030E AD03 (e/modules/scf.asm):00456 jsr D$READ,x Execute READ routine in driver 0310 35F0 (e/modules/scf.asm):00457 L0401 puls pc,u,y,x Restore regs & return (e/modules/scf.asm):00458 (e/modules/scf.asm):00459 * Move buffer to caller (e/modules/scf.asm):00460 * Entry: Y=Path dsc. ptr (e/modules/scf.asm):00461 * X=# chars to move 0312 3430 (e/modules/scf.asm):00462 L042B pshs y,x Preserve path dsc. ptr & char. count 0314 ECE4 (e/modules/scf.asm):00463 ldd ,s Get # bytes to move 0316 2723 (e/modules/scf.asm):00464 beq L0451 Exit if none 0318 5D (e/modules/scf.asm):00465 tstb Uneven # bytes (not even page of 256)? 0319 2601 (e/modules/scf.asm):00466 bne L0435 Yes, go on 031B 4A (e/modules/scf.asm):00467 deca >256, so bump MSB down 031C 5F (e/modules/scf.asm):00468 L0435 clrb Force to even page 031D EE26 (e/modules/scf.asm):00469 ldu PD.RGS,y Get callers register stack pointer 031F EE44 (e/modules/scf.asm):00470 ldu R$X,u Get ptr to caller's buffer 0321 33CB (e/modules/scf.asm):00471 leau d,u 0323 4F (e/modules/scf.asm):00472 clra 0324 E661 (e/modules/scf.asm):00473 ldb 1,s 0326 2601 (e/modules/scf.asm):00474 bne L0442 No, go on 0328 4C (e/modules/scf.asm):00475 inca 0329 3406 (e/modules/scf.asm):00476 L0442 pshs d 032B AE28 (e/modules/scf.asm):00477 ldx PD.BUF,y Get buffer pointer 032D 3520 (e/modules/scf.asm):00478 puls y 032F 3440 (e/modules/scf.asm):00479 pshs u 0331 A680 (e/modules/scf.asm):00480 L0443 lda ,x+ 0333 A7C0 (e/modules/scf.asm):00481 sta ,u+ 0335 313F (e/modules/scf.asm):00482 leay -1,y 0337 26F8 (e/modules/scf.asm):00483 bne L0443 0339 3540 (e/modules/scf.asm):00484 puls u 033B 35B0 (e/modules/scf.asm):00485 L0451 puls pc,y,x Restore & return (e/modules/scf.asm):00486 (e/modules/scf.asm):00487 * I$ReadLn entry point 033D 8D6B (e/modules/scf.asm):00488 readln bsr L04A2 Go wait for device to be ready for us 033F 2401 (e/modules/scf.asm):00489 bcc L02E5 No error, continue 0341 39 (e/modules/scf.asm):00490 rts Error, exit with it (e/modules/scf.asm):00491 0342 EC46 (e/modules/scf.asm):00492 L02E5 ldd R$Y,u Get character count 0344 2715 (e/modules/scf.asm):00493 beq L0453 If none, mark device as un-busy 0346 4D (e/modules/scf.asm):00494 tsta Past 256 bytes? 0347 2703 (e/modules/scf.asm):00495 beq L02EF No, go on 0349 CC0100 (e/modules/scf.asm):00496 ldd #$0100 Get new character count 034C 3406 (e/modules/scf.asm):00497 L02EF pshs d Save character count 034E CCFFFF (e/modules/scf.asm):00498 ldd #$FFFF Get maximum character count 0351 ED2D (e/modules/scf.asm):00499 std PD.MAX,y Store it in path descriptor 0353 8E0000 (e/modules/scf.asm):00500 ldx #0 Set character count so far to 0 0356 EE28 (e/modules/scf.asm):00501 ldu PD.BUF,y Get buffer ptr 0358 1601DD (e/modules/scf.asm):00502 lbra L05F8 Go process readln (e/modules/scf.asm):00503 (e/modules/scf.asm):00504 * Wait for device - Clears out V.BUSY if either Default or output devices are (e/modules/scf.asm):00505 * no longer busy (e/modules/scf.asm):00506 * Modifies X and A 035B (e/modules/scf.asm):00507 L0453 035B BE004B (e/modules/scf.asm):00508 ldx >D.Proc Get current process 035E A684 (e/modules/scf.asm):00509 lda P$ID,x Get it's process ID 0360 AE23 (e/modules/scf.asm):00510 ldx PD.DEV,y Get device table pointer from our path dsc. 0362 8D02 (e/modules/scf.asm):00511 bsr L045D Check if it's busy 0364 AE2A (e/modules/scf.asm):00512 ldx PD.DV2,y Get output device table pointer 0366 2709 (e/modules/scf.asm):00513 L045D beq L0467 Doesn't exist, exit 0368 AE02 (e/modules/scf.asm):00514 ldx V$STAT,x Get static storage pointer for our device 036A A104 (e/modules/scf.asm):00515 cmpa V.BUSY,x Same process as current process? 036C 2603 (e/modules/scf.asm):00516 bne L0467 No, device busy return 036E 4F (e/modules/scf.asm):00517 clra 036F A704 (e/modules/scf.asm):00518 sta V.BUSY,x Yes, mark device as free for use 0371 39 (e/modules/scf.asm):00519 L0467 rts Return (e/modules/scf.asm):00520 0372 3412 (e/modules/scf.asm):00521 L0468 pshs x,a Preserve device table entry pointer & process ID 0374 AE02 (e/modules/scf.asm):00522 L046A ldx V$STAT,x Get device static storage address 0376 E604 (e/modules/scf.asm):00523 ldb V.BUSY,x Get active process ID 0378 271A (e/modules/scf.asm):00524 beq L048A No active process, device not busy go reserve it 037A E1E4 (e/modules/scf.asm):00525 cmpb ,s Is it our own process? 037C 2729 (e/modules/scf.asm):00526 beq L049F Yes, return without error 037E 8DDB (e/modules/scf.asm):00527 bsr L0453 Go wait for device to no longer be busy 0380 1F98 (e/modules/scf.asm):00528 tfr b,a Get process # busy using device 0382 103F2B (e/modules/scf.asm):00529 os9 F$IOQu Put our process into the IO Queue 0385 6C2F (e/modules/scf.asm):00530 inc PD.MIN,y Mark device as not mine 0387 BE004B (e/modules/scf.asm):00531 ldx >D.Proc Get current process 038A E68836 (e/modules/scf.asm):00532 ldb P$Signal,x Get signal code 038D A6E4 (e/modules/scf.asm):00533 lda ,s Get our process id # again for L046A 038F 27E3 (e/modules/scf.asm):00534 beq L046A No signal go try again 0391 43 (e/modules/scf.asm):00535 coma Set carry 0392 3592 (e/modules/scf.asm):00536 puls x,a,pc Restore device table ptr (eat a) & return (e/modules/scf.asm):00537 (e/modules/scf.asm):00538 * Mark device as busy;copy pause/interrupt/quit/xon/xoff chars into static mem 0394 A704 (e/modules/scf.asm):00539 L048A sta V.BUSY,x Make it as process # busy on this device 0396 A703 (e/modules/scf.asm):00540 sta V.LPRC,x Save it as the last process to use device 0398 A6A82F (e/modules/scf.asm):00541 lda PD.PSC,y Get pause character from path dsc. 039B A70D (e/modules/scf.asm):00542 sta V.PCHR,x Save copy in static storage (faster later) 039D ECA830 (e/modules/scf.asm):00543 ldd PD.INT,y Get keyboard interrupt & quit chars 03A0 ED0B (e/modules/scf.asm):00544 std V.INTR,x Save copies in static mem 03A2 ECA838 (e/modules/scf.asm):00545 ldd PD.XON,y Get XON/XOFF chars 03A5 ED0F (e/modules/scf.asm):00546 std V.XON,x Save them in static mem too 03A7 4F (e/modules/scf.asm):00547 L049F clra No error & return 03A8 3592 (e/modules/scf.asm):00548 puls pc,x,a Restore A=Process #,X=Dev table entry ptr (e/modules/scf.asm):00549 (e/modules/scf.asm):00550 * Wait for device? 03AA A6A83F (e/modules/scf.asm):00551 L04A2 lda PD.PST,y Get path status (carrier) 03AD 261F (e/modules/scf.asm):00552 bne L04C4 If carrier was lost, hang up process 03AF (e/modules/scf.asm):00553 L04A7 03AF BE004B (e/modules/scf.asm):00554 ldx >D.Proc Get current process ID 03B2 4F (e/modules/scf.asm):00555 clra 03B3 A72F (e/modules/scf.asm):00556 sta PD.MIN,y Flag device is mine 03B5 A684 (e/modules/scf.asm):00557 lda P$ID,x Get process ID # 03B7 AE23 (e/modules/scf.asm):00558 ldx PD.DEV,y Get device table pointer 03B9 8DB7 (e/modules/scf.asm):00559 bsr L0468 Busy? 03BB 250E (e/modules/scf.asm):00560 bcs L04C1 No, return 03BD AE2A (e/modules/scf.asm):00561 ldx PD.DV2,y Get output device table pointer 03BF 2704 (e/modules/scf.asm):00562 beq L04BB Go on if it doesn't exist 03C1 8DAF (e/modules/scf.asm):00563 bsr L0468 Busy? 03C3 2506 (e/modules/scf.asm):00564 bcs L04C1 No, return 03C5 A62F (e/modules/scf.asm):00565 L04BB lda PD.MIN,y Device mine? 03C7 26E1 (e/modules/scf.asm):00566 bne L04A2 No, go wait for it 03C9 A72C (e/modules/scf.asm):00567 sta PD.RAW,y Mark device with editing 03CB EE26 (e/modules/scf.asm):00568 L04C1 ldu PD.RGS,y Get register stack pointer 03CD 39 (e/modules/scf.asm):00569 rts Return (e/modules/scf.asm):00570 (e/modules/scf.asm):00571 * Hangup process 03CE 3262 (e/modules/scf.asm):00572 L04C4 leas 2,s Purge return address 03D0 C6DC (e/modules/scf.asm):00573 L04C6 ldb #E$HangUp Get hangup error code 03D2 8102 (e/modules/scf.asm):00574 cmpa #S$Abort Termination signal (or carrier lost)? 03D4 2507 (e/modules/scf.asm):00575 blo L04D3 Yes, increment status flag & return 03D6 A625 (e/modules/scf.asm):00576 lda PD.CPR,y Get current process ID # using path 03D8 C600 (e/modules/scf.asm):00577 ldb #S$Kill Get kill signal 03DA 103F08 (e/modules/scf.asm):00578 os9 F$Send Send it to process 03DD 6CA83F (e/modules/scf.asm):00579 L04D3 inc PD.PST,y Set path status 03E0 1A01 (e/modules/scf.asm):00580 orcc #Carry Set carry 03E2 39 (e/modules/scf.asm):00581 rts Return (e/modules/scf.asm):00582 (e/modules/scf.asm):00583 * I$WritLn entry point 03E3 8DC5 (e/modules/scf.asm):00584 writln bsr L04A2 Go wait for device to be ready for us 03E5 2004 (e/modules/scf.asm):00585 bra L04E1 Go write (e/modules/scf.asm):00586 (e/modules/scf.asm):00587 * I$Write entry point 03E7 8DC1 (e/modules/scf.asm):00588 write bsr L04A2 Go wait for device to be ready for us 03E9 6C2C (e/modules/scf.asm):00589 inc PD.RAW,y Mark device for raw write 03EB AE46 (e/modules/scf.asm):00590 L04E1 ldx R$Y,u Get number of characters to write 03ED 10270082 (e/modules/scf.asm):00591 lbeq L055A Zero so return 03F1 3410 (e/modules/scf.asm):00592 pshs x Save character count 03F3 8E0000 (e/modules/scf.asm):00593 ldx #$0000 Get write data offset 03F6 2005 (e/modules/scf.asm):00594 bra L04F1 Go write data (e/modules/scf.asm):00595 03F8 1F30 (e/modules/scf.asm):00596 L04EC tfr u,d Move current position in PD.BUF to D 03FA 5D (e/modules/scf.asm):00597 tstb At 256 (end of PD.BUF)? 03FB 2634 (e/modules/scf.asm):00598 bne L0523 No, keep writing from current PD.BUF (e/modules/scf.asm):00599 (e/modules/scf.asm):00600 * Get new block of data to write into [PD.BUF] (e/modules/scf.asm):00601 * Only allows up to 32 bytes at a time, and puts them in the last 32 bytes of (e/modules/scf.asm):00602 * the 256 byte [PD.BUF] buffer. This way, can use TFR U,D/TSTB to see if fin- (e/modules/scf.asm):00603 * ished. (e/modules/scf.asm):00604 * NOTE: 32 bytes max for 6809, to keep "lockout" of grfdrv down to less CPU time 03FD 3430 (e/modules/scf.asm):00605 L04F1 pshs y,x Save write offset & path descriptor pointer 03FF 1F10 (e/modules/scf.asm):00606 tfr x,d Move data offset to D 0401 EE26 (e/modules/scf.asm):00607 ldu PD.RGS,y Get register stack pointer 0403 AE44 (e/modules/scf.asm):00608 ldx R$X,u Get pointer to user's WRITE string 0405 308B (e/modules/scf.asm):00609 leax d,x Point to where we are in it now 0407 EC46 (e/modules/scf.asm):00610 ldd R$Y,u Get # chars of original write 0409 A3E4 (e/modules/scf.asm):00611 subd ,s Calculate # chars we have left to write 040B 10830020 (e/modules/scf.asm):00612 cmpd #32 More than 32? 040F 2303 (e/modules/scf.asm):00613 bls L0508 No, go on 0411 CC0020 (e/modules/scf.asm):00614 ldd #32 Max size per chunk 6809=32 0414 3406 (e/modules/scf.asm):00615 L0508 pshs d Save buffered chunk size on stack 0416 EC28 (e/modules/scf.asm):00616 ldd PD.BUF,y Get buffer ptr 0418 4C (e/modules/scf.asm):00617 inca Point to PD.BUF+256 (1 byte past end) 0419 A3E4 (e/modules/scf.asm):00618 subd ,s Subtract data size 041B 1F03 (e/modules/scf.asm):00619 tfr d,u Move it to U 041D 860D (e/modules/scf.asm):00620 lda #C$CR Put a carriage return 1 byte before start 041F A75F (e/modules/scf.asm):00621 sta -1,u of write portion of buffer 0421 3520 (e/modules/scf.asm):00622 puls y Move data to buffer (level 1) 0423 3440 (e/modules/scf.asm):00623 pshs u 0425 A680 (e/modules/scf.asm):00624 L0509 lda ,x+ 0427 A7C0 (e/modules/scf.asm):00625 sta ,u+ 0429 313F (e/modules/scf.asm):00626 leay -1,y 042B 26F8 (e/modules/scf.asm):00627 bne L0509 042D 3540 (e/modules/scf.asm):00628 puls u 042F 3530 (e/modules/scf.asm):00629 puls y,x Restore path descriptor pointer and data offset (e/modules/scf.asm):00630 (e/modules/scf.asm):00631 * at this point, we have (e/modules/scf.asm):00632 * 0,s = end address of characters to write (e/modules/scf.asm):00633 * X = number of characters written (e/modules/scf.asm):00634 * Y = PD pointer (e/modules/scf.asm):00635 * U = pointer to data buffer to write (e/modules/scf.asm):00636 * Level 2: Use callcode $06 to call grfdrv (old DWProtSW from previous versions, (e/modules/scf.asm):00637 * now unused by GrfDrv 0431 (e/modules/scf.asm):00638 L0523 0431 A6C0 (e/modules/scf.asm):00639 L0524 lda ,u+ Get character to write 0433 E62C (e/modules/scf.asm):00640 ldb PD.RAW,y Raw mode? 0435 2618 (e/modules/scf.asm):00641 bne L053D Yes, go write it 0437 E6A821 (e/modules/scf.asm):00642 ldb PD.UPC,y Force uppercase? 043A 2702 (e/modules/scf.asm):00643 beq L052A No, continue 043C 8D38 (e/modules/scf.asm):00644 bsr L0403 Make it uppercase 043E 810A (e/modules/scf.asm):00645 L052A cmpa #C$LF Is it a Line feed? 0440 260D (e/modules/scf.asm):00646 bne L053D No, go print it 0442 860D (e/modules/scf.asm):00647 lda #C$CR Get code for carriage return 0444 E6A825 (e/modules/scf.asm):00648 ldb PD.ALF,y Auto Line feed? 0447 2606 (e/modules/scf.asm):00649 bne L053D Yes, go print carriage return first 0449 8D3E (e/modules/scf.asm):00650 bsr L0573 Print carriage return 044B 2534 (e/modules/scf.asm):00651 bcs L055D If error, go wait for device 044D 860A (e/modules/scf.asm):00652 lda #C$LF Now, print the line feed (e/modules/scf.asm):00653 (e/modules/scf.asm):00654 * Write character to device (call driver) 044F 8D38 (e/modules/scf.asm):00655 L053D bsr L0573 Go write it to device 0451 252E (e/modules/scf.asm):00656 bcs L055D If error, go wait for device 0453 C601 (e/modules/scf.asm):00657 ldb #1 Bump up # chars we have written 0455 3A (e/modules/scf.asm):00658 abx 0456 ACE4 (e/modules/scf.asm):00659 L0544 cmpx ,s Done whole WRITE call? 0458 2413 (e/modules/scf.asm):00660 bhs L0554 Yes, go save # chars written & exit 045A E62C (e/modules/scf.asm):00661 ldb PD.RAW,y Raw mode? 045C 1026FF98 (e/modules/scf.asm):00662 lbne L04EC Yes, keep writing 0460 A65F (e/modules/scf.asm):00663 lda -1,u Get the char we wrote 0462 1027FF92 (e/modules/scf.asm):00664 lbeq L04EC NUL, keep writing 0466 A1A82B (e/modules/scf.asm):00665 cmpa PD.EOR,y End of record? 0469 1026FF8B (e/modules/scf.asm):00666 lbne L04EC No, keep writing 046D 3262 (e/modules/scf.asm):00667 L0554 leas 2,s Eof record, stop & Eat end of buffer ptr??? 046F EE26 (e/modules/scf.asm):00668 L0556 ldu PD.RGS,y Get callers register pointer 0471 AF46 (e/modules/scf.asm):00669 stx R$Y,u Save character count to callers Y 0473 16FEE5 (e/modules/scf.asm):00670 L055A lbra L0453 Mark device write clear and return (e/modules/scf.asm):00671 (e/modules/scf.asm):00672 * Check for forced uppercase 0476 8161 (e/modules/scf.asm):00673 L0403 cmpa #'a Less then 'a'? 0478 2506 (e/modules/scf.asm):00674 blo L0412 Yes, leave it 047A 817A (e/modules/scf.asm):00675 cmpa #'z Higher than 'z'? 047C 2202 (e/modules/scf.asm):00676 bhi L0412 Yes, leave it 047E 8020 (e/modules/scf.asm):00677 suba #$20 Make it uppercase 0480 39 (e/modules/scf.asm):00678 L0412 rts Return (e/modules/scf.asm):00679 0481 3262 (e/modules/scf.asm):00680 L055D leas 2,s Purge stack 0483 3405 (e/modules/scf.asm):00681 pshs b,cc Preserve registers 0485 8DE8 (e/modules/scf.asm):00682 bsr L0556 Wait for device 0487 3585 (e/modules/scf.asm):00683 puls pc,b,cc Restore & return (e/modules/scf.asm):00684 (e/modules/scf.asm):00685 * Check for end of page (part of send char to driver) 0489 3472 (e/modules/scf.asm):00686 L0573 pshs u,y,x,a Preserve registers 048B AE23 (e/modules/scf.asm):00687 ldx PD.DEV,y Get device table pointer 048D 810D (e/modules/scf.asm):00688 cmpa #C$CR Carriage return? 048F 267C (e/modules/scf.asm):00689 bne L056F No, go print it 0491 EE02 (e/modules/scf.asm):00690 ldu V$STAT,x Get pointer to device stactic storage 0493 E648 (e/modules/scf.asm):00691 ldb V.PAUS,u Pause request? 0495 2620 (e/modules/scf.asm):00692 bne L0590 Yes, go pause device 0497 E62C (e/modules/scf.asm):00693 ldb PD.RAW,y Raw output mode? 0499 262C (e/modules/scf.asm):00694 bne L05A2 Yes, go on 049B E6A827 (e/modules/scf.asm):00695 ldb PD.PAU,y End of page pause enabled? 049E 2727 (e/modules/scf.asm):00696 beq L05A2 No, go on 04A0 6A47 (e/modules/scf.asm):00697 dec V.LINE,u Subtract a line 04A2 2623 (e/modules/scf.asm):00698 bne L05A2 Not done, go on 04A4 C6FF (e/modules/scf.asm):00699 ldb #$ff do a immediate pause request 04A6 E748 (e/modules/scf.asm):00700 stb V.PAUS,u 04A8 2016 (e/modules/scf.asm):00701 bra L059A Go read next character (e/modules/scf.asm):00702 04AA 3470 (e/modules/scf.asm):00703 L03DA pshs u,y,x Preserve registers 04AC AE2A (e/modules/scf.asm):00704 ldx PD.DV2,y Get output device table pointer 04AE 2705 (e/modules/scf.asm):00705 beq NoOut None, exit 04B0 EE23 (e/modules/scf.asm):00706 ldu PD.DEV,y Get device table pointer 04B2 16FE3F (e/modules/scf.asm):00707 lbra L03EA Process & return (e/modules/scf.asm):00708 04B5 35F0 (e/modules/scf.asm):00709 NoOut puls pc,u,y,x No output device so exit (e/modules/scf.asm):00710 (e/modules/scf.asm):00711 * Wait for pause release 04B7 8DF1 (e/modules/scf.asm):00712 L0590 bsr L03DA Read next character 04B9 2505 (e/modules/scf.asm):00713 bcs L059A Error, try again 04BB A1A82F (e/modules/scf.asm):00714 cmpa PD.PSC,y Pause char? 04BE 26F7 (e/modules/scf.asm):00715 bne L0590 No, try again 04C0 8DE8 (e/modules/scf.asm):00716 L059A bsr L03DA Reset line count and read a character 04C2 A1A82F (e/modules/scf.asm):00717 cmpa PD.PSC,y Pause character? 04C5 27F9 (e/modules/scf.asm):00718 beq L059A Yes, go read again (e/modules/scf.asm):00719 * Process Carriage return - do auto linefeed & Null's if necessary (e/modules/scf.asm):00720 * Entry: A=CHR$($0D) 04C7 EE02 (e/modules/scf.asm):00721 L05A2 ldu V$STAT,x Get static storage pointer 04C9 4F (e/modules/scf.asm):00722 clra 04CA A748 (e/modules/scf.asm):00723 sta V.PAUS,u Clear pause request 04CC 860D (e/modules/scf.asm):00724 lda #C$CR Carriage return (in cases from pause) 04CE 8D1E (e/modules/scf.asm):00725 bsr L05C9 Send it to driver 04D0 A62C (e/modules/scf.asm):00726 lda PD.RAW,y Raw mode? 04D2 2618 (e/modules/scf.asm):00727 bne L05C7 Yes, return 04D4 E6A826 (e/modules/scf.asm):00728 ldb PD.NUL,y Get end of line null count 04D7 3404 (e/modules/scf.asm):00729 pshs b Save it 04D9 A6A825 (e/modules/scf.asm):00730 lda PD.ALF,y Auto line feed enabled? 04DC 2706 (e/modules/scf.asm):00731 beq L05BE No, go on 04DE 860A (e/modules/scf.asm):00732 lda #C$LF Get line feed code 04E0 8D0C (e/modules/scf.asm):00733 L05BA bsr L05C9 Execute driver write routine 04E2 2506 (e/modules/scf.asm):00734 bcs L05C5 Error, purge stack and return 04E4 4F (e/modules/scf.asm):00735 L05BE clra Get null character 04E5 6AE4 (e/modules/scf.asm):00736 dec ,s Done null count? 04E7 2AF7 (e/modules/scf.asm):00737 bpl L05BA No, go send it to driver 04E9 4F (e/modules/scf.asm):00738 clra Clear carry 04EA 3261 (e/modules/scf.asm):00739 L05C5 leas 1,s Purge stack 04EC 35F2 (e/modules/scf.asm):00740 L05C7 puls pc,u,y,x,a Restore & return (e/modules/scf.asm):00741 (e/modules/scf.asm):00742 * Execute device driver write routine (e/modules/scf.asm):00743 * Entry: A=Character to write (e/modules/scf.asm):00744 * Execute device driver (e/modules/scf.asm):00745 * Entry: W=Entry offset (for type of function, ex. Write, Read) (e/modules/scf.asm):00746 * A=Code to send to driver 04EE EE02 (e/modules/scf.asm):00747 L05C9 ldu V$STAT,x Get device static storage pointer 04F0 3430 (e/modules/scf.asm):00748 pshs y,x Preserve registers 04F2 5F (e/modules/scf.asm):00749 clrb 04F3 E745 (e/modules/scf.asm):00750 stb V.WAKE,u Wake it up 04F5 3406 (e/modules/scf.asm):00751 pshs d 04F7 AE84 (e/modules/scf.asm):00752 ldx V$DRIV,x Get driver execution pointer 04F9 EC09 (e/modules/scf.asm):00753 ldd M$EXEC,x 04FB 308B (e/modules/scf.asm):00754 leax d,x 04FD 3506 (e/modules/scf.asm):00755 puls d 04FF AD06 (e/modules/scf.asm):00756 jsr D$WRIT,x Execute driver 0501 35B0 (e/modules/scf.asm):00757 puls pc,y,x Restore & return (e/modules/scf.asm):00758 (e/modules/scf.asm):00759 * Send character to driver 0503 3472 (e/modules/scf.asm):00760 L0565 pshs u,y,x,a Preserve registers 0505 AE2A (e/modules/scf.asm):00761 ldx PD.DV2,y Get output device table pointer 0507 2715 (e/modules/scf.asm):00762 beq L0571 Return if none 0509 810D (e/modules/scf.asm):00763 cmpa #C$CR Carriage return? 050B 27BA (e/modules/scf.asm):00764 beq L05A2 Yes, go process it 050D EE02 (e/modules/scf.asm):00765 L056F ldu V$STAT,x Get device static storage pointer 050F 5F (e/modules/scf.asm):00766 clrb 0510 E745 (e/modules/scf.asm):00767 stb V.WAKE,u Wake it up 0512 3406 (e/modules/scf.asm):00768 pshs d 0514 AE84 (e/modules/scf.asm):00769 ldx V$DRIV,x get driver module 0516 EC09 (e/modules/scf.asm):00770 ldd M$EXEC,x 0518 308B (e/modules/scf.asm):00771 leax d,x 051A 3506 (e/modules/scf.asm):00772 puls d 051C AD06 (e/modules/scf.asm):00773 jsr D$WRIT,x Execute driver 051E 35F2 (e/modules/scf.asm):00774 L0571 puls pc,u,y,x,a Restore & return (e/modules/scf.asm):00775 (e/modules/scf.asm):00776 (e/modules/scf.asm):00777 * Check for printable character (Entry: A=char to echo) 0520 E6A824 (e/modules/scf.asm):00778 L0413 ldb PD.EKO,y Echo turned on? 0523 2601 (e/modules/scf.asm):00779 bne L0418 Yes, go do 0525 39 (e/modules/scf.asm):00780 rts No, just return (e/modules/scf.asm):00781 0526 8120 (e/modules/scf.asm):00782 L0418 cmpa #C$SPAC CHR$(32) or higher? 0528 24D9 (e/modules/scf.asm):00783 bhs L0565 Yes, go send to driver 052A 810D (e/modules/scf.asm):00784 cmpa #C$CR Ctrl char; is it a Carriage return? 052C 27D5 (e/modules/scf.asm):00785 beq L0565 Yes, send it to the driver (e/modules/scf.asm):00786 * Any ctrl char <> CR, replace with period when echoed to device 052E 3402 (e/modules/scf.asm):00787 L0423 pshs a Save code 0530 862E (e/modules/scf.asm):00788 lda #'. Get code for period 0532 8DCF (e/modules/scf.asm):00789 bsr L0565 Output it to device 0534 3582 (e/modules/scf.asm):00790 puls pc,a Restore original ctrl char & return (e/modules/scf.asm):00791 0536 8DEE (e/modules/scf.asm):00792 L0624 bsr L0418 check if it's printable and send it to driver (e/modules/scf.asm):00793 * Process ReadLn 0538 17FDAF (e/modules/scf.asm):00794 L05F8 lbsr L03E2 get a character from device 053B 10250120 (e/modules/scf.asm):00795 lbcs L0370 return if error 053F 4D (e/modules/scf.asm):00796 tsta usable character? 0540 102700A1 (e/modules/scf.asm):00797 lbeq L02FE no, check path descriptor special characters 0544 E6A82D (e/modules/scf.asm):00798 ldb PD.RPR,y get reprint line code 0547 C104 (e/modules/scf.asm):00799 cmpb #C$RPRT cntrl D? 0549 10270098 (e/modules/scf.asm):00800 lbeq L02FE yes, check path descriptor special characters 054D A1A82D (e/modules/scf.asm):00801 cmpa PD.RPR,y reprint line? 0550 261A (e/modules/scf.asm):00802 bne L0629 no, Check line editor keys 0552 AC2D (e/modules/scf.asm):00803 cmpx PD.MAX,y character count at maximum? 0554 27E2 (e/modules/scf.asm):00804 beq L05F8 yes, go read next character 0556 C601 (e/modules/scf.asm):00805 ldb #1 Bump char count up by 1 0558 3A (e/modules/scf.asm):00806 abx 0559 ACE4 (e/modules/scf.asm):00807 cmpx ,s done? 055B 240B (e/modules/scf.asm):00808 bhs L0620 yes, exit 055D A6C0 (e/modules/scf.asm):00809 lda ,u+ get character read 055F 27D5 (e/modules/scf.asm):00810 beq L0624 null, go send it to driver 0561 A1A82B (e/modules/scf.asm):00811 cmpa PD.EOR,y end of record character? 0564 26D0 (e/modules/scf.asm):00812 bne L0624 no, go send it to driver 0566 335F (e/modules/scf.asm):00813 leau -1,u bump buffer pointer back 1 0568 301F (e/modules/scf.asm):00814 L0620 leax -1,x bump character count back 1 056A 20CC (e/modules/scf.asm):00815 bra L05F8 go read next character (e/modules/scf.asm):00816 056C 8113 (e/modules/scf.asm):00817 L0629 cmpa #C$PLINE Print rest of line code? 056E 2619 (e/modules/scf.asm):00818 bne L0647 No, check insert (e/modules/scf.asm):00819 * Process print rest of line 0570 3440 (e/modules/scf.asm):00820 L062D pshs u Save buffer pointer 0572 170105 (e/modules/scf.asm):00821 lbsr L038B Go print rest of line 0575 A6A832 (e/modules/scf.asm):00822 lda PD.BSE,y Get backspace echo character 0578 11A3E4 (e/modules/scf.asm):00823 L0634 cmpu ,s Beginning of buffer? 057B 2708 (e/modules/scf.asm):00824 beq L0642 Yes, exit 057D 335F (e/modules/scf.asm):00825 leau -1,u Bump buffer pointer back 1 057F 301F (e/modules/scf.asm):00826 leax -1,x Bump character count back 1 0581 8D80 (e/modules/scf.asm):00827 bsr L0565 Print it 0583 20F3 (e/modules/scf.asm):00828 bra L0634 Keep going (e/modules/scf.asm):00829 0585 3262 (e/modules/scf.asm):00830 L0642 leas 2,s Purge buffer pointer 0587 20AF (e/modules/scf.asm):00831 bra L05F8 Return (e/modules/scf.asm):00832 0589 8111 (e/modules/scf.asm):00833 L0647 cmpa #C$INSERT Insert character code? 058B 2619 (e/modules/scf.asm):00834 bne L0664 No, check delete (e/modules/scf.asm):00835 * Process Insert character (NOTE:Currently destroys W) 058D 3440 (e/modules/scf.asm):00836 pshs u 058F 1F30 (e/modules/scf.asm):00837 tfr u,d Move buffer ptr to D 0591 C6FF (e/modules/scf.asm):00838 ldb #$FF Point to end of buffer 0593 1F03 (e/modules/scf.asm):00839 tfr d,u Move back to U 0595 A6C2 (e/modules/scf.asm):00840 L06DE lda ,-u shift buffer later by 1 char 0597 A741 (e/modules/scf.asm):00841 sta 1,u 0599 11A3E4 (e/modules/scf.asm):00842 cmpu ,s 059C 26F7 (e/modules/scf.asm):00843 bne L06DE 059E 8620 (e/modules/scf.asm):00844 lda #C$SPAC Insert space at insert point in buffer 05A0 A7C4 (e/modules/scf.asm):00845 sta ,u 05A2 3262 (e/modules/scf.asm):00846 leas 2,s 05A4 20CA (e/modules/scf.asm):00847 bra L062D Go print rest of line (e/modules/scf.asm):00848 05A6 8110 (e/modules/scf.asm):00849 L0664 cmpa #C$DELETE Delete character code? 05A8 2623 (e/modules/scf.asm):00850 bne L068B No, check end of line (e/modules/scf.asm):00851 * Process delete line 05AA 3440 (e/modules/scf.asm):00852 pshs u Save buffer pointer 05AC A6C4 (e/modules/scf.asm):00853 lda ,u Get character there 05AE A1A82B (e/modules/scf.asm):00854 cmpa PD.EOR,y End of record? 05B1 2716 (e/modules/scf.asm):00855 beq L0687 Yes, don't bother to delete it 05B3 A641 (e/modules/scf.asm):00856 L0671 lda 1,u Get character beside it 05B5 A1A82B (e/modules/scf.asm):00857 cmpa PD.EOR,y This an end of record? 05B8 2704 (e/modules/scf.asm):00858 beq L067C Yes, delete it 05BA A7C0 (e/modules/scf.asm):00859 sta ,u+ Bump character back 05BC 20F5 (e/modules/scf.asm):00860 bra L0671 Go do next character (e/modules/scf.asm):00861 05BE 8620 (e/modules/scf.asm):00862 L067C lda #C$SPAC Get code for space 05C0 A1C4 (e/modules/scf.asm):00863 cmpa ,u Already there? 05C2 2603 (e/modules/scf.asm):00864 bne L0685 No, put it in 05C4 A6A82B (e/modules/scf.asm):00865 lda PD.EOR,y Get end of record code 05C7 A7C4 (e/modules/scf.asm):00866 L0685 sta ,u Put it there 05C9 3540 (e/modules/scf.asm):00867 L0687 puls u Restore buffer pointer 05CB 20A3 (e/modules/scf.asm):00868 bra L062D Go print rest of line (e/modules/scf.asm):00869 (e/modules/scf.asm):00870 * Delete rest of buffer 05CD A1A82B (e/modules/scf.asm):00871 L068B cmpa PD.EOR,y End of record code? (normally CR) 05D0 2613 (e/modules/scf.asm):00872 bne L02FE No, check for special path dsc. chars (e/modules/scf.asm):00873 * CR hit, replace rest of buffer with spaces? 05D2 3440 (e/modules/scf.asm):00874 pshs u Yes, Save buffer pointer 05D4 2009 (e/modules/scf.asm):00875 bra L069F Go erase rest of buffer (e/modules/scf.asm):00876 05D6 3402 (e/modules/scf.asm):00877 L0696 pshs a Save CR code 05D8 8620 (e/modules/scf.asm):00878 lda #C$SPAC Get code for space 05DA 17FF26 (e/modules/scf.asm):00879 lbsr L0565 Print it 05DD 3502 (e/modules/scf.asm):00880 puls a Restore CR code 05DF A1C0 (e/modules/scf.asm):00881 L069F cmpa ,u+ End of record? 05E1 26F3 (e/modules/scf.asm):00882 bne L0696 No, go print a space 05E3 3540 (e/modules/scf.asm):00883 puls u Restore buffer pointer (e/modules/scf.asm):00884 * Check character read against path descriptor 05E5 4D (e/modules/scf.asm):00885 L02FE tsta Usable character? 05E6 270B (e/modules/scf.asm):00886 beq L030C No, go on 05E8 C629 (e/modules/scf.asm):00887 ldb #PD.BSP Get start point in path descriptor 05EA A1A5 (e/modules/scf.asm):00888 L0303 cmpa b,y Match code in descriptor? 05EC 272D (e/modules/scf.asm):00889 beq L032C Yes, go process it 05EE 5C (e/modules/scf.asm):00890 incb Move to next one 05EF C131 (e/modules/scf.asm):00891 cmpb #PD.QUT Done check? 05F1 23F7 (e/modules/scf.asm):00892 bls L0303 No, keep going 05F3 AC2D (e/modules/scf.asm):00893 L030C cmpx PD.MAX,y Past maximum character count? 05F5 2302 (e/modules/scf.asm):00894 bls L0312 No, go on 05F7 AF2D (e/modules/scf.asm):00895 stx PD.MAX,y Update maximum character count 05F9 C601 (e/modules/scf.asm):00896 L0312 ldb #1 Add 1 char 05FB 3A (e/modules/scf.asm):00897 abx 05FC ACE4 (e/modules/scf.asm):00898 cmpx ,s Past requested amount? 05FE 250B (e/modules/scf.asm):00899 blo L0322 No, go on 0600 A6A833 (e/modules/scf.asm):00900 lda PD.OVF,y Get overflow character 0603 17FEFD (e/modules/scf.asm):00901 lbsr L0565 Send it to driver 0606 301F (e/modules/scf.asm):00902 leax -1,x Subtract a character 0608 16FF2D (e/modules/scf.asm):00903 lbra L05F8 Go try again (e/modules/scf.asm):00904 060B E6A821 (e/modules/scf.asm):00905 L0322 ldb PD.UPC,y Force uppercase? 060E 2703 (e/modules/scf.asm):00906 beq L0328 No, put char in buffer 0610 17FE63 (e/modules/scf.asm):00907 lbsr L0403 Make character uppercase 0613 A7C0 (e/modules/scf.asm):00908 L0328 sta ,u+ Put character in buffer 0615 17FF08 (e/modules/scf.asm):00909 lbsr L0413 Check for printable 0618 16FF1D (e/modules/scf.asm):00910 lbra L05F8 Go try again (e/modules/scf.asm):00911 (e/modules/scf.asm):00912 * Process path option characters 061B 3490 (e/modules/scf.asm):00913 L032C pshs x,pc Preserve character count & PC 061D 308C0D (e/modules/scf.asm):00914 leax