Specification CTMMOS

Processing layers
Resources
Editor
Executables
Executables' format
System calls
Processing layers
- highest priority: serial interrupt routines transfer bytes to fifos
- middle priority: timer0 interrupt routine
A process is executed when timer0 interrupts and its processtimer=0. The process is run as in timer0 interrupt, only interrupted by serial interrupts. Priorityorder decrementing procestimers.
- lowest priority: program running after startup and intitializing, looking for scheduler messages (sent by processes) to execute batch files or executables. Interrupted by processes and serial interrupts.
Resources
; RESOURCE DESCRIPTOR-FORMAT: ID
; resource handle: no: description: location: number: length: remark:
; 0000 0XXX tty 8 ; ttyidformat ttyids:0f700h ttyno:5/2 ttyid:16 implemented
; 0000 1XXX fipc 8 ; fipcformat fipcids:ttyids+80h ext. ram fipcno:8 fipcid:8 implemented
; 0001 XXXX mini fipc 16 ; ext. ram mipcno:16 mipcid:4 256 bytes data
; 0010 XXXX mini fifo 16 ; int. ram :4 256 bytes data
; 0011 XXXX fifo 16 ; fifoformat fifoids:80h int. ram fifno:8 fifoid:8 implemented
; 010X XXXX mailbox 32 ; mailformat mailids:60h int. ram mailno:32 mailid:1 pointers 2x4bits
; 011X XXXX proces 32 ; procesformat procesno:32
; 100X XXXX mini block 32 ; ext. ram 128 bytes
; 101X XXXX reserved2 32 ;
; 11XX XXXX block 64 ; blockidformat blockids:0fc00h ext. ram blockno:32 blockid:4 implemented
Edit process
Generates command lines, while backspace editing, when entering CR on serial line. Command line is signalled in scheduler fipc.
Executables
;
; *********************************************
; *** MODULE DEFINITION OF MODULE HANDLER ***
; *********************************************
;
dirallmod: modulet all,081h,direct,950924,moduledirall,manualdirall
dirctmmod: modulet ctm,0feh,direct,950924,moduledirctm,manualdirctm
diruser1mod: modulet user1,0fdh,direct,950924,modulediruser1,manualdiruser1
;asciimod: modulet ascii,0ffh,batch,950921,moduleascii,manualstartup
blockmod: modulet block,081h,binary,951207,moduleblock,manualblock
commandmod: modulet command,081h,binary,960311,modulecommand,manualcommand
clsmod: modulet cls,0ffh,tekst,960201,modulecls,manualver
crlfmod: modulet crlf,0ffh,binary,961026,modulecrlf,manualcrlf
commentmod: modulet comment,0ffh,binary,961127,modulecomment,manualcomment
copyrammod: modulet copyram,081h,binary,960909,modulecopyram,manualcopyram
copyflashmod: modulet copyflash,081h,binary,960909,modulecopyflash,manualcopyflash
;delmod: modulet deleted..,080h,binary,951128,moduledeleted,manualdeleted
delfilemod: modulet deletefile,0ffh,binary,951128,moduledelfile,manualdelfile
dirmod: modulet dir,0ffh,binary,950905,moduledir,manualdir
dirammod: modulet diram,0ffh,binary,960207,modulediram,manualdir
dirommod: modulet dirom,0ffh,binary,960207,moduledirom,manualdir
dispfifomod: modulet dispfifo,080h,proces,960117,moduledispfifo,manualdispfifo
displayfilemod: modulet displayfile,0ffh,binary,950921,moduleprintasc,manualprintasc
displaymemmod: modulet displaymem,0ffh,binary,961114,moduledispmem,manualdispmem
displaycodemod: modulet displaycode,0ffh,binary,960531,moduledispcode,manualdispcode
displayrammod: modulet displayram,0ffh,binary,951015,moduledispram,manualdispram
emptyrammod: modulet emptyram,080h,binary,960503,moduleemptyram,manualemptyram
erafilemod: modulet erasefile,0ffh,binary,950927,moduleerafile,manualerafile
editmod: modulet edit,080h,proces,951224,moduleedit,manualedit
fastmod: modulet fast,081h,binary,960311,modulefast,manualfast
fifomod: modulet fifo,081h,binary,951111,modulefifo,manualfifo
fipcmod: modulet fipc,081h,binary,951111,modulefipc,manualfipc
flashpagemod: modulet flashpage,081h,binary,960910,moduleflashpage,manualflashpage
;forkfifomod: modulet forkfifo,080h,proces,960117,moduleforkfifo,manualforkfifo
hostallmod: modulet host,080h,binary,990916,modulehostall,manualhostall
hostctmmod: modulet host,081h,binary,960916,modulehostctm,manualhostctm
hostuser1mod: modulet host,082h,tekst,950924,modulehostuser1,manualver
homemod: modulet home,0ffh,tekst,960201,modulehome,manualver
initmod: modulet init,0ffh,binary,950905,moduleinit,manualinit
intjumpmod: modulet intjump,081h,binary,961114,moduleintjump,manualintjump
intramdispmod: modulet intramdisp,080h,proces,960105,moduleintdisp,manualintdisp
intramdispbmod: modulet intramdisp,081h,batch,960105,moduleintdispb,manualstartup
initfipcmod: modulet initfipc,081h,batch,960102,moduleinitfipc,manualstartup
initfifomod: modulet initfifo,081h,batch,960102,moduleinitfifo,manualstartup
initmipcmod: modulet initmipc,081h,batch,960102,moduleinitmipc,manualstartup
initblockmod: modulet initblock,081h,batch,960102,moduleinitblck,manualstartup
initinitmod: modulet initinit,080h,batch,960102,moduleinitinit,manualstartup
init1mod: modulet init1,080h,batch,961204,moduleinit1,manualstartup
init2mod: modulet init2,080h,batch,961204,moduleinit2,manualstartup
init3mod: modulet init3,080h,batch,961204,moduleinit3,manualstartup
makefilemod: modulet makefile,0ffh,binary,950921,modulemakeasci,manualmakeasci
ledsmod: modulet leds,080h,proces,950905,moduleleds,manualleds
ledsmailmod: modulet ledsmail,080h,proces,961129,moduleledsmail,manualledsmail
notusedmod: modulet notused,080h,proces,951114,modulenotused,manualnotused
mailmod: modulet mail,081h,binary,961008,modulemail,manualmail
manmod: modulet man,0ffh,binary,950905,moduleman,manualman
mipcmod: modulet mipc,081h,binary,961230,modulemipc,manualmipc
pausemod: modulet pause,0ffh,binary,960111,modulepause,manualpause
printmod: modulet print,0ffh,binary,960424,moduleprint,manualprint
printomod: modulet printo,0ffh,binary,961026,moduleprinto,manualprinto
prioritymod: modulet priority,080h,binary,960320,modulepriority,manualpriority
procesmod: modulet proces,081h,binary,951113,moduleproces,manualproces
pushtxmod: modulet pushtx,080h,proces,960110,modulepushtx,manualpushtx
ramdisplaymod: modulet ramdisplay,080h,proces,960102,moduleextdisp,manualextdisp
restartmod: modulet restart,081h,binary,950905,modulerestart,manualrestart
setmemmod: modulet setmem,081h,binary,961114,modulesetmem,manualsetmem
setrammod: modulet setram,081h,binary,960424,modulesetram,manualsetram
serialmod: modulet serial,081h,intrpt,950905,moduleinitser,manualinitser
stopprocmod: modulet stopproces,081h,binary,960923,modulestopproc,manualstopproc
strtprocmod: modulet startproces,081h,binary,960923,modulestrtproc,manualstopproc
closeprocmod: modulet closeproces,081h,binary,960923,modulecloseproc,manualstopproc
killprocmod: modulet killproces,080h,binary,960923,modulekillproc,manualstopproc
slowmod: modulet slow,081h,binary,960311,moduleslow,manualslow
startupmod: modulet startup,080h,batch,950925,modulestartup,manualstartup
testmod: modulet test,081h,batch,951129,moduletest,manualstartup
tickmod: modulet tick,0ffh,binary,951229,moduletick,manualtick
;ttymod: modulet tty,081h,binary,950905,moduletty,manualtty
userstartupmod: modulet userstartup,081h,batch,960102,moduleuserstartup,manualstartup
vulmemmod: modulet vulmem,081h,binary,961115,moduleextvulmem,manualextvulmem
vulrammod: modulet vulram,081h,binary,950918,moduleextvulram,manualextvulram
vermod: modulet ver,0ffh,tekst,950905,modulever,manualver
writomod: modulet writo,0ffh,binary,961128,modulewrito,manualwrito
;
modulet rob,0ffh,binary,950905,modulerob,manualrob
;
; last module definition always a file for all directories
;
; *********************************************
; *** END OF MODULE DEFINITION ***
; *********************************************
;
Executables' format
; * datum: 6 bytes as in 950905 *
; * modulecode: macro which defines code of module *
; ***********************************************************
modulet macro naam,syn,soort,datum,modulecode,manualtext ; *
modstart# ; *
db high(sync) ; *
db low(sync) ; *
db syn ; *
dw soort ; eig./soort *
dw modstart# ; *
dw modend# ; *
ascii datum
dw naam# ; naam *
dw mcode# ; code *
dw manualtext ; manual *
; end of header fixed frame ; *
; *
naam# ascii naam
db 0 ; *
db 0 ; place for header checksum *
; end of header frame ; *
; *
mcode# modulecode ; *
; *
modend# ; *
db 0 ; place for module checksum *
endm ; *
; ***********************************************************
System calls
;
;/* (c) Copyright C.T.M., All rights reserved. */
;
; JMPTAB.ASM
;
xint: equ 7d00h+000h
xintexinc: equ 7d00h+003h
xintexdec: equ 7d00h+006h
xintexstart: equ 7d00h+009h
xintexkill: equ 7d00h+00ch
;
xcopycodetoblock: equ 7d00h+00fh
xfindblock: equ 7d00h+012h
xclaimblockifnotopen: equ 7d00h+015h
xreturnifblockempty: equ 7d00h+018h
xcloseblock: equ 7d00h+01bh
xcopyramtoblock: equ 7d00h+01eh
xcopycodetoproces: equ 7d00h+021h
xdecblockstorep: equ 7d00h+024h
xrewblockp: equ 7d00h+027h
xgetblockp: equ 7d00h+02ah
xcopycode: equ 7d00h+02dh
xcopystring: equ 7d00h+030h
xcopyline: equ 7d00h+033h
xcopymemory: equ 7d00h+036h
xparseblock: equ 7d00h+039h
xexecuteblock: equ 7d00h+03ch
;
; fifosub.asm
xreturniffifoempty: equ 7d00h+03fh
xreturniftxfifofull: equ 7d00h+042h
xreturniffifoopen: equ 7d00h+045h
xopenfifo: equ 7d00h+048h
xreadatblock: equ 7d00h+04bh
xwriteatblock: equ 7d00h+04eh
xcopyblocktoram: equ 7d00h+051h
xsetprocesurgent: equ 7d00h+054h
xdisphx2: equ 7d00h+057h
xdisphx1: equ 7d00h+05ah
xscheduler: equ 7d00h+05dh
xexecuteblockbuff: equ 7d00h+060h
xstoreschedmess: equ 7d00h+063h
;
; seriesub.asm
xttygetc: equ 7d00h+066h
xgetrxfifo: equ 7d00h+069h
xgettxfifo: equ 7d00h+06ch
xttyprnthx2: equ 7d00h+06fh
xttyprnthx1: equ 7d00h+072h
xttysendbyte: equ 7d00h+075h
xttycrlf: equ 7d00h+078h
xttydptrdisp: equ 7d00h+07bh
xttydptrdispc: equ 7d00h+07eh
xttydptrdisplf: equ 7d00h+081h
xformdisplay: equ 7d00h+084h
xstoreainTXseriebuff: equ 7d00h+087h
xdisr1: equ 7d00h+08ah
xcheckend: equ 7d00h+08dh
xpushit: equ 7d00h+090h
;
; modsub.asm
xgetfilefromblock: equ 7d00h+093h
xgotonaam: equ 7d00h+096h
xgotocode: equ 7d00h+099h
xgotomanual: equ 7d00h+09ch
xgotoend: equ 7d00h+09fh
xgotonaamm: equ 7d00h+0a2h
xgotosoortloc: equ 7d00h+0a5h
xgotostartloc: equ 7d00h+0a8h
xgotomanualoc: equ 7d00h+0abh
xgotoendloc: equ 7d00h+0aeh
xgetvarhexnibble: equ 7d00h+0b1h
xgetvarhexbyte: equ 7d00h+0b4h
xgetvarhexword: equ 7d00h+0b7h
xdptrtonaam: equ 7d00h+0bah
;
xd16by8: equ 7d00h+0bdh
xprint10000: equ 7d00h+0c0h
xconv: equ 7d00h+0c3h
xconvasc: equ 7d00h+0c6h
xcallmodule: equ 7d00h+0c9h
;
xsetblockp: equ 7d00h+0cch
xpushat: equ 7d00h+0cfh
xmoveupram: equ 7d00h+0d2h
xmovedownram: equ 7d00h+0d5h
xproceswait: equ 7d00h+0d8h
xreturniftxbusy: equ 7d00h+0dbh
xclosefipc: equ 7d00h+0deh
xkillproces: equ 7d00h+0e1h
xreturniffipcempty: equ 7d00h+0e4h
;
xreadfifo: equ 7d00h+0e7h
xreadblock: equ 7d00h+0eah
xreadfipc: equ 7d00h+0edh
xwriteblocktofifo equ 7d00h+0f0h
xwriteblock equ 7d00h+0f3h
xwritefifo equ 7d00h+0f6h
xwriteexpress equ 7d00h+0f9h
xwritefipc equ 7d00h+0fch
;
xwritemail equ 7d00h+0ffh
xreadmail equ 7d00h+0102h
xreturnifmailempty equ 7d00h+0105h
;
xtimerevents: equ 7d00h+0108h ; uses a,dpl; decrement timer: if zero make event TO+ or - in a and set carry
xdebugmail: equ 7d00h+010bh ; uses a,r5; needs r1=debugdata
xlog_actions: equ 7d00h+010eh ; uses a,r5, needs r0,r1,r4,r7
xcheckpppid: equ 7d00h+0111h ; uses r1,dptr(dph = #(ppp-proces+.high.procesids), r6= received block; carry set when id's equal
xwrite: equ 7d00h+0114h ; uses , stores character in a to ID; r7 contains ID
xincommsid: equ 7d00h+0117h ; uses dptr(dph = #(ppp-proces+.high.procesids)
xwritetty: equ 7d00h+011ah ; uses , stores character in a to tty; r7 contains # of tty
xfill_lcphead: equ 7d00h+011dh ; uses a,r1,r2,r4,r6, needs r0; pointers r1 & dptr at loc. in block & codemem., r6= opened block# on exit
xfill_ipcphead: equ 7d00h+0120h ; uses a,r1,r2,r4,r6, needs r0; pointers r1 & dptr at loc. in block & codemem., r6= opened block# on exit
xldecrement_retry: equ 7d00h+0123h ; uses a,dpl
xlinit_timer: equ 7d00h+0126h ; uses a,dpl
xwritepppblocktofifo: equ 7d00h+0129h ; uses , needs r6,r7 ; r6 contains - # of block; r7= # of fifo; carry set on result
xccittblock: equ 7d00h+012ch ; uses , blockno in r6, append ccitt to block
xcheckccittblock: equ 7d00h+012fh ; uses , blockno in r6, check ccitt of block, carry set on good crc
xread: equ 7d00h+0132h ; uses a, gets character in a from ID; r7 contains ID
xreadtty: equ 7d00h+0135h ; uses a, gets character in a from tty; r7 contains # of tty
xcheckcrciphead: equ 7d00h+0138h ; uses r1,r2,r3,r4, blockno in r6, check crc of ip-head in block, carry set on good crc
xfillcrciphead: equ 7d00h+013bh ; uses r1,r2,r3,r4, blockno in r6, fill crc of ip-head in block
xcheckipadres: equ 7d00h+013eh ; uses r1, blockno in r6, check ip-adres in block versus own adres, carry set on good crc
xmoveipadres: equ 7d00h+0141h ; uses r1, blockno in r6; MOVE IP source adres to destination in block
xfillipadres: equ 7d00h+0144h ; uses r1, blockno in r6; FILL IP destination adres in block
;
xblockdisp: equ 7d00h+0147h ; uses all, r6 is block#; display block
xfifodisp: equ 7d00h+014ah ; uses all, a is fifo#; display 1st fifo block
xfipcdisp: equ 7d00h+014dh ; uses all, a is fipc#; display 1st fipc block
xprocesdisp: equ 7d00h+0150h ; uses all, a is proces#; display 1st proces block
;
xsetup_new_ip_head: equ 7d00h+0153h ; uses a,r1; set-up data in block r6
xmoveiphead: equ 7d00h+0156h ; uses a,r1,r2,r4; move up data (#=ipheadlength+8) in block r6 from datapoint=(ipfield_vers) with offset=(5*4+4)
xdecttliphead: equ 7d00h+0159h ; uses r1,r2,r3,r4, blockno in r6; decrement ttl of ip-head
xsetr1toipdata: equ 7d00h+015ch ; uses a,r1; set r1 to IP-data field
xgetipheadlength: equ 7d00h+015fh ; uses a; set a to length of ip-head in bytes
xfillcrcicmphead: equ 7d00h+0162h ; uses r1,r2,r3,r4, blockno in r6, fill crc of icmp-head in block
;
xrewfipcp: equ 7d00h+0165h ; uses none; fipcno in r7, rewinds fipcpointers
xgetfipcadres: equ 7d00h+0168h ; uses a,dptr; r7 contains - # of Fipc, gets high(fipcstart) in a
xgetfipcstatus: equ 7d00h+016bh ; uses a,dptr; r7 contains - # of Fipc, gets fipcstatus in a
xgetfipclength: equ 7d00h+016eh ; uses a,dptr; r7 contains - # of Fipc, gets fipclength in a
xgetfipcstoreph: equ 7d00h+0171h ; uses a,dptr; r7 contains - # of Fipc, gets fipcstoreph in a
xgetfipcstorepl: equ 7d00h+0174h ; uses a,dptr; r7 contains - # of Fipc, gets fipcstorepl in a
xgetfipcgetph: equ 7d00h+0177h ; uses a,dptr; r7 contains - # of Fipc, gets fipcgetph in a
xgetfipcgetpl: equ 7d00h+017ah ; uses a,dptr; r7 contains - # of Fipc, gets fipcgetpl in a
xstorefipcadres: equ 7d00h+017dh ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores high(fipcstart) in r0
xstorefipcstatus: equ 7d00h+0180h ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores fipcstatus in r0
xstorefipclength: equ 7d00h+0183h ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores fipclength in r0
xstorefipcstoreph: equ 7d00h+0186h ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores fipcstoreph in r0
xstorefipcstorepl: equ 7d00h+0189h ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores fipcstorepl in r0
xstorefipcgetph: equ 7d00h+018ch ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores fipcgetph in r0
xstorefipcgetpl: equ 7d00h+018fh ; uses a,dptr; needs r0; r7 contains - # of Fipc, stores fipcgetpl in r0
xanswer_icmp: equ 7d00h+0192h ; uses a,r1,r2,r3,r4, blockno in r6, a= ICMP-code
xsend_icmp_mess: equ 7d00h+0195h ; uses a,r1,r2,r3,r4, blockno in r6
xtcpd_sockadres: equ 7d00h+0198h ; uses dpl, add socket(r3)-adres to dpl
xuseblock: equ 7d00h+019bh ; uses a,r1,r2,needs dph; r6= # of block on exit; no carry if all BLOCK's already open
xtcpd_findsock: equ 7d00h+019eh ; uses r3,dpl, blockno in r6; r3=socket# on return, set startadres of socket in procesmemory in dpl, carry set when socket found
xtcpd_findopensock: equ 7d00h+01a1h ; uses r3,dpl, blockno in r6; r3=socket# on return, set startadres of socket in procesmemory in dpl, carry set when socket found
xtcpd_closesock: equ 7d00h+01a4h ; uses a,dpl; r3=socket# to delete, carry set when socket existed
xtcpd_findemptysock: equ 7d00h+01a7h ; uses r3,dpl; r3=socket# on return, set startadres of socket in procesmemory in dpl, carry set when socket found
xcheckcrctcp: equ 7d00h+01aah ; uses r2,r3,r4, blockno in r6, check crc of ip-head in block, carry set on good crc
xfillcrctcphead: equ 7d00h+01adh ; uses r1,r2,r3,r4, blockno in r6, fill crc of ip-head in block
xgettcpheadlength: equ 7d00h+01b0h ; uses a; set a to length of tcp-head in bytes
xgettcplength: equ 7d00h+01b3h ; uses a; set a to length of tcp-head in bytes
xcalccrctcp: equ 7d00h+01b6h ; uses a,r1,r2,r3,r4; calculate crc of tcp-block (r6) in r2/r4
xaddr3crc: equ 7d00h+01b9h ; uses a,r2,r3,r4; add a & data in block at r1 to r2,r4; r3>0, even
xgetc: equ 7d00h+01bch ; uses a, test on ID-data, gets character in a from ID; r7 contains ID
xfindfipc: equ 7d00h+01bfh ; uses a, a=grootte, r2=client#; r7= # of fipc on exit; no carry if all fipc's already open
xclaimfipcifnotopen: equ 7d00h+01c2h ; uses a, a=grootte, r2=client#; r7= # of fipc; no carry if fipc already open; fipc is opened and rewind on exit
xopen equ 7d00h+01c5h ; uses , a=client#, r7 contains - # of ID
xclose equ 7d00h+01c8h ; uses , r7 contains - # of ID
xreturnifempty equ 7d00h+01cbh ; uses , r7 contains - # of ID ; returns (carry clear) if ID empty
xreturnifttyempty equ 7d00h+01ceh ; uses , returns (carry clear) if rxtty-fifo empty
xreturnid equ 7d00h+01d1h ; uses a, returns cleaned ID in a, r7 contains - # of ID ljmp errorroutine
xreadmipc equ 7d00h+01d4h ; uses a, gets character in a at (storep); r7 contains - # of mipc
xwritemipc equ 7d00h+01d7h ; uses , stores character in a at (storep); r7 contains - # of mipc
xopenmipc equ 7d00h+01dah ; uses , a=client#, r7 contains - # of mipc
xclosemipc equ 7d00h+01ddh ; uses , r7 contains - # of mipc
xreturnifmipcempty equ 7d00h+01e0h ; uses , r7 contains - # of fipc ; returns (carry clear) if fipc empty
xfindmipc equ 7d00h+01e3h ; uses a, r2=client#; r7= # of mipc on exit; no carry if all mipc's already open
xclaimmipcifnotopen equ 7d00h+01e6h ; uses , r2=client#; r7= # of mipc; no carry if fipc already open; mipc is opened and rewind on exit
xreturnifprocesopen equ 7d00h+01e9h ; uses , r5 contains - # of proces ; returns (carry clear) if proces already open
xsendmail equ 7d00h+01ech ; uses , needs r0,r5, stores own proces ID/a to proces-mail; r5 = ID or # of proces
xsendexpress equ 7d00h+01efh ; uses , needs r0,r5, stores own proces ID/a to proces-mail; r5 = ID or # of proces
xreceivemail equ 7d00h+01f2h ; uses a,r5, needs r0; get sent mail: a=mail, r5 = ID of sendingproces, carry set when mail
xemptymail equ 7d00h+01f5h ; uses , empties mailbox r5 contains - # of proces
xstrtproces equ 7d00h+01f8h ; uses a (proces# in a)
xfindproces: equ 7d00h+01fbh ; uses a, r5= # of proces on exit; no carry if all processes already open
xstopproces: equ 7d00h+01feh ; uses a (proces# in a)
xtimerevent: equ 7d00h+0201h ; uses a,dpl; decrement timer: if zero make event TO+ or - in a and set carry
xinit_timer_retry: equ 7d00h+0204h ; uses a,dpl ; initialize retrycounterx
xinit_timer: equ 7d00h+0207h ; uses a,dpl ; initialize timerx
xdecrement: equ 7d00h+020ah ; uses a ; decrement var at dpl
;