em.s 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932
  1. #
  2. ! This program is an EM interpreter for the Z80.
  3. ! Register pair bc is used to hold lb.
  4. ! Register ix is used to hold the EM program counter.
  5. ! The interpreter assumes 16-bit words and 16-bit pointers.
  6. ! #define CPM1 1
  7. ! Definitions:
  8. zone = 8 ! size of subroutine call block (address + old lb)
  9. bdos = 5 ! standard entry into I/O-routines
  10. boot = 0
  11. fcb = 0x5c ! file descriptor of EM-1 file (5C hex)
  12. reset=0
  13. delete=19
  14. makefile=22
  15. close=16
  16. readconsole = 10
  17. writeconsole = 2
  18. open = 15
  19. read = 20
  20. write = 21
  21. setdma = 26
  22. printstring = 9
  23. seqread = 20
  24. randomread = 33
  25. seqwrite = 21
  26. randomwrite = 34
  27. consolein = 1
  28. diconio = 6
  29. RAW=0 !0 for cooked,1 for raw io
  30. timebuf=0xFFDE
  31. b_lolp = 176
  32. b_loln = 179
  33. b_lof = 161
  34. b_loi = 168
  35. b_lal = 130
  36. b_lil = 146
  37. b_stlm = 227
  38. b_stf = 214
  39. b_sti = 218
  40. b_inl = 112
  41. b_cal = 63
  42. b_asp = 44
  43. b_zrl = 249
  44. EARRAY = 0
  45. ERANGE = 1
  46. EILLINS=18
  47. EILLSIZE=19
  48. ECASE=20
  49. EMON=25
  50. !--------------------------- Initialization ---------------------------
  51. .base 0x100
  52. jp init ! 3 byte instruction.
  53. !------------------------- MAIN DISPATCH ------------------------------
  54. !
  55. ! must be put in a suitable place in memory to reduce memory usage
  56. ! must be put on a page boundary
  57. dispat = . - 3 ! base of dispatch table
  58. ! .byte loc.0 /256
  59. ! .byte loc.1 /256
  60. ! .byte loc.2 /256
  61. .byte loc.3 /256
  62. .byte loc.4 /256
  63. .byte loc.5 /256
  64. .byte loc.6 /256
  65. .byte loc.7 /256
  66. .byte loc.8 /256
  67. .byte loc.9 /256
  68. .byte loc.10 /256
  69. .byte loc.11 /256
  70. .byte loc.12 /256
  71. .byte loc.13 /256
  72. .byte loc.14 /256
  73. .byte loc.15 /256
  74. .byte loc.16 /256
  75. .byte loc.17 /256
  76. .byte loc.18 /256
  77. .byte loc.19 /256
  78. .byte loc.20 /256
  79. .byte loc.21 /256
  80. .byte loc.22 /256
  81. .byte loc.23 /256
  82. .byte loc.24 /256
  83. .byte loc.25 /256
  84. .byte loc.26 /256
  85. .byte loc.27 /256
  86. .byte loc.28 /256
  87. .byte loc.29 /256
  88. .byte loc.30 /256
  89. .byte loc.31 /256
  90. .byte loc.32 /256
  91. .byte loc.33 /256
  92. .byte aar.2 /256
  93. .byte adf.s0 /256
  94. .byte adi.2 /256
  95. .byte adi.4 /256
  96. .byte adp.l /256
  97. .byte adp.1 /256
  98. .byte adp.2 /256
  99. .byte adp.s0 /256
  100. .byte adp.sm1 /256
  101. .byte ads.2 /256
  102. .byte and.2 /256
  103. .byte asp.2 /256
  104. .byte asp.4 /256
  105. .byte asp.6 /256
  106. .byte asp.8 /256
  107. .byte asp.10 /256
  108. .byte asp.w0 /256
  109. .byte beq.l /256
  110. .byte beq.s0 /256
  111. .byte bge.s0 /256
  112. .byte bgt.s0 /256
  113. .byte ble.s0 /256
  114. .byte blm.s0 /256
  115. .byte blt.s0 /256
  116. .byte bne.s0 /256
  117. .byte bra.l /256
  118. .byte bra.sm1 /256
  119. .byte bra.sm2 /256
  120. .byte bra.s0 /256
  121. .byte bra.s1 /256
  122. .byte cal.1 /256
  123. .byte cal.2 /256
  124. .byte cal.3 /256
  125. .byte cal.4 /256
  126. .byte cal.5 /256
  127. .byte cal.6 /256
  128. .byte cal.7 /256
  129. .byte cal.8 /256
  130. .byte cal.9 /256
  131. .byte cal.10 /256
  132. .byte cal.11 /256
  133. .byte cal.12 /256
  134. .byte cal.13 /256
  135. .byte cal.14 /256
  136. .byte cal.15 /256
  137. .byte cal.16 /256
  138. .byte cal.17 /256
  139. .byte cal.18 /256
  140. .byte cal.19 /256
  141. .byte cal.20 /256
  142. .byte cal.21 /256
  143. .byte cal.22 /256
  144. .byte cal.23 /256
  145. .byte cal.24 /256
  146. .byte cal.25 /256
  147. .byte cal.26 /256
  148. .byte cal.27 /256
  149. .byte cal.28 /256
  150. .byte cal.s0 /256
  151. .byte cff.z /256
  152. .byte cif.z /256
  153. .byte cii.z /256
  154. .byte cmf.s0 /256
  155. .byte cmi.2 /256
  156. .byte cmi.4 /256
  157. .byte cmp.z /256
  158. .byte cms.s0 /256
  159. .byte csa.2 /256
  160. .byte csb.2 /256
  161. .byte dec.z /256
  162. .byte dee.w0 /256
  163. .byte del.wm1 /256
  164. .byte dup.2 /256
  165. .byte dvf.s0 /256
  166. .byte dvi.2 /256
  167. .byte fil.l /256
  168. .byte inc.z /256
  169. .byte ine.l /256
  170. .byte ine.w0 /256
  171. .byte inl.m2 /256
  172. .byte inl.m4 /256
  173. .byte inl.m6 /256
  174. .byte inl.wm1 /256
  175. .byte inn.s0 /256
  176. .byte ior.2 /256
  177. .byte ior.s0 /256
  178. .byte lae.l /256
  179. .byte lae.w0 /256
  180. .byte lae.w1 /256
  181. .byte lae.w2 /256
  182. .byte lae.w3 /256
  183. .byte lae.w4 /256
  184. .byte lae.w5 /256
  185. .byte lae.w6 /256
  186. .byte lal.p /256
  187. .byte lal.n /256
  188. .byte lal.0 /256
  189. .byte lal.m1 /256
  190. .byte lal.w0 /256
  191. .byte lal.wm1 /256
  192. .byte lal.wm2 /256
  193. .byte lar.2 /256
  194. .byte ldc.0 /256
  195. .byte lde.l /256
  196. .byte lde.w0 /256
  197. .byte ldl.0 /256
  198. .byte ldl.wm1 /256
  199. .byte lfr.2 /256
  200. .byte lfr.4 /256
  201. .byte lfr.s0 /256
  202. .byte lil.wm1 /256
  203. .byte lil.w0 /256
  204. .byte lil.0 /256
  205. .byte lil.2 /256
  206. .byte lin.l /256
  207. .byte lin.s0 /256
  208. .byte lni.z /256
  209. .byte loc.l /256
  210. .byte loc.m1 /256
  211. .byte loc.s0 /256
  212. .byte loc.sm1 /256
  213. .byte loe.l /256
  214. .byte loe.w0 /256
  215. .byte loe.w1 /256
  216. .byte loe.w2 /256
  217. .byte loe.w3 /256
  218. .byte loe.w4 /256
  219. .byte lof.l /256
  220. .byte lof.2 /256
  221. .byte lof.4 /256
  222. .byte lof.6 /256
  223. .byte lof.8 /256
  224. .byte lof.s0 /256
  225. .byte loi.l /256
  226. .byte loi.1 /256
  227. .byte loi.2 /256
  228. .byte loi.4 /256
  229. .byte loi.6 /256
  230. .byte loi.8 /256
  231. .byte loi.s0 /256
  232. .byte lol.p /256
  233. .byte lol.n /256
  234. .byte lol.0 /256
  235. .byte lol.2 /256
  236. .byte lol.4 /256
  237. .byte lol.6 /256
  238. .byte lol.m2 /256
  239. .byte lol.m4 /256
  240. .byte lol.m6 /256
  241. .byte lol.m8 /256
  242. .byte lol.m10 /256
  243. .byte lol.m12 /256
  244. .byte lol.m14 /256
  245. .byte lol.m16 /256
  246. .byte lol.w0 /256
  247. .byte lol.wm1 /256
  248. .byte lxa.1 /256
  249. .byte lxl.1 /256
  250. .byte lxl.2 /256
  251. .byte mlf.s0 /256
  252. .byte mli.2 /256
  253. .byte mli.4 /256
  254. .byte rck.2 /256
  255. .byte ret.0 /256
  256. .byte ret.2 /256
  257. .byte ret.s0 /256
  258. .byte rmi.2 /256
  259. .byte sar.2 /256
  260. .byte sbf.s0 /256
  261. .byte sbi.2 /256
  262. .byte sbi.4 /256
  263. .byte sdl.wm1 /256
  264. .byte set.s0 /256
  265. .byte sil.wm1 /256
  266. .byte sil.w0 /256
  267. .byte sli.2 /256
  268. .byte ste.l /256
  269. .byte ste.w0 /256
  270. .byte ste.w1 /256
  271. .byte ste.w2 /256
  272. .byte stf.l /256
  273. .byte stf.2 /256
  274. .byte stf.4 /256
  275. .byte stf.s0 /256
  276. .byte sti.1 /256
  277. .byte sti.2 /256
  278. .byte sti.4 /256
  279. .byte sti.6 /256
  280. .byte sti.8 /256
  281. .byte sti.s0 /256
  282. .byte stl.p /256
  283. .byte stl.n /256
  284. .byte stl.p0 /256
  285. .byte stl.p2 /256
  286. .byte stl.m2 /256
  287. .byte stl.m4 /256
  288. .byte stl.m6 /256
  289. .byte stl.m8 /256
  290. .byte stl.m10 /256
  291. .byte stl.wm1 /256
  292. .byte teq.z /256
  293. .byte tgt.z /256
  294. .byte tlt.z /256
  295. .byte tne.z /256
  296. .byte zeq.l /256
  297. .byte zeq.s0 /256
  298. .byte zeq.s1 /256
  299. .byte zer.s0 /256
  300. .byte zge.s0 /256
  301. .byte zgt.s0 /256
  302. .byte zle.s0 /256
  303. .byte zlt.s0 /256
  304. .byte zne.s0 /256
  305. .byte zne.sm1 /256
  306. .byte zre.l /256
  307. .byte zre.w0 /256
  308. .byte zrl.m2 /256
  309. .byte zrl.m4 /256
  310. .byte zrl.wm1 /256
  311. .byte zrl.n /256
  312. .byte loop1 /256
  313. .byte loop2 /256
  314. .errnz .-dispat-256
  315. .byte loc.0 %256
  316. .byte loc.1 %256
  317. .byte loc.2 %256
  318. .byte loc.3 %256
  319. .byte loc.4 %256
  320. .byte loc.5 %256
  321. .byte loc.6 %256
  322. .byte loc.7 %256
  323. .byte loc.8 %256
  324. .byte loc.9 %256
  325. .byte loc.10 %256
  326. .byte loc.11 %256
  327. .byte loc.12 %256
  328. .byte loc.13 %256
  329. .byte loc.14 %256
  330. .byte loc.15 %256
  331. .byte loc.16 %256
  332. .byte loc.17 %256
  333. .byte loc.18 %256
  334. .byte loc.19 %256
  335. .byte loc.20 %256
  336. .byte loc.21 %256
  337. .byte loc.22 %256
  338. .byte loc.23 %256
  339. .byte loc.24 %256
  340. .byte loc.25 %256
  341. .byte loc.26 %256
  342. .byte loc.27 %256
  343. .byte loc.28 %256
  344. .byte loc.29 %256
  345. .byte loc.30 %256
  346. .byte loc.31 %256
  347. .byte loc.32 %256
  348. .byte loc.33 %256
  349. .byte aar.2 %256
  350. .byte adf.s0 %256
  351. .byte adi.2 %256
  352. .byte adi.4 %256
  353. .byte adp.l %256
  354. .byte adp.1 %256
  355. .byte adp.2 %256
  356. .byte adp.s0 %256
  357. .byte adp.sm1 %256
  358. .byte ads.2 %256
  359. .byte and.2 %256
  360. .byte asp.2 %256
  361. .byte asp.4 %256
  362. .byte asp.6 %256
  363. .byte asp.8 %256
  364. .byte asp.10 %256
  365. .byte asp.w0 %256
  366. .byte beq.l %256
  367. .byte beq.s0 %256
  368. .byte bge.s0 %256
  369. .byte bgt.s0 %256
  370. .byte ble.s0 %256
  371. .byte blm.s0 %256
  372. .byte blt.s0 %256
  373. .byte bne.s0 %256
  374. .byte bra.l %256
  375. .byte bra.sm1 %256
  376. .byte bra.sm2 %256
  377. .byte bra.s0 %256
  378. .byte bra.s1 %256
  379. .byte cal.1 %256
  380. .byte cal.2 %256
  381. .byte cal.3 %256
  382. .byte cal.4 %256
  383. .byte cal.5 %256
  384. .byte cal.6 %256
  385. .byte cal.7 %256
  386. .byte cal.8 %256
  387. .byte cal.9 %256
  388. .byte cal.10 %256
  389. .byte cal.11 %256
  390. .byte cal.12 %256
  391. .byte cal.13 %256
  392. .byte cal.14 %256
  393. .byte cal.15 %256
  394. .byte cal.16 %256
  395. .byte cal.17 %256
  396. .byte cal.18 %256
  397. .byte cal.19 %256
  398. .byte cal.20 %256
  399. .byte cal.21 %256
  400. .byte cal.22 %256
  401. .byte cal.23 %256
  402. .byte cal.24 %256
  403. .byte cal.25 %256
  404. .byte cal.26 %256
  405. .byte cal.27 %256
  406. .byte cal.28 %256
  407. .byte cal.s0 %256
  408. .byte cff.z %256
  409. .byte cif.z %256
  410. .byte cii.z %256
  411. .byte cmf.s0 %256
  412. .byte cmi.2 %256
  413. .byte cmi.4 %256
  414. .byte cmp.z %256
  415. .byte cms.s0 %256
  416. .byte csa.2 %256
  417. .byte csb.2 %256
  418. .byte dec.z %256
  419. .byte dee.w0 %256
  420. .byte del.wm1 %256
  421. .byte dup.2 %256
  422. .byte dvf.s0 %256
  423. .byte dvi.2 %256
  424. .byte fil.l %256
  425. .byte inc.z %256
  426. .byte ine.l %256
  427. .byte ine.w0 %256
  428. .byte inl.m2 %256
  429. .byte inl.m4 %256
  430. .byte inl.m6 %256
  431. .byte inl.wm1 %256
  432. .byte inn.s0 %256
  433. .byte ior.2 %256
  434. .byte ior.s0 %256
  435. .byte lae.l %256
  436. .byte lae.w0 %256
  437. .byte lae.w1 %256
  438. .byte lae.w2 %256
  439. .byte lae.w3 %256
  440. .byte lae.w4 %256
  441. .byte lae.w5 %256
  442. .byte lae.w6 %256
  443. .byte lal.p %256
  444. .byte lal.n %256
  445. .byte lal.0 %256
  446. .byte lal.m1 %256
  447. .byte lal.w0 %256
  448. .byte lal.wm1 %256
  449. .byte lal.wm2 %256
  450. .byte lar.2 %256
  451. .byte ldc.0 %256
  452. .byte lde.l %256
  453. .byte lde.w0 %256
  454. .byte ldl.0 %256
  455. .byte ldl.wm1 %256
  456. .byte lfr.2 %256
  457. .byte lfr.4 %256
  458. .byte lfr.s0 %256
  459. .byte lil.wm1 %256
  460. .byte lil.w0 %256
  461. .byte lil.0 %256
  462. .byte lil.2 %256
  463. .byte lin.l %256
  464. .byte lin.s0 %256
  465. .byte lni.z %256
  466. .byte loc.l %256
  467. .byte loc.m1 %256
  468. .byte loc.s0 %256
  469. .byte loc.sm1 %256
  470. .byte loe.l %256
  471. .byte loe.w0 %256
  472. .byte loe.w1 %256
  473. .byte loe.w2 %256
  474. .byte loe.w3 %256
  475. .byte loe.w4 %256
  476. .byte lof.l %256
  477. .byte lof.2 %256
  478. .byte lof.4 %256
  479. .byte lof.6 %256
  480. .byte lof.8 %256
  481. .byte lof.s0 %256
  482. .byte loi.l %256
  483. .byte loi.1 %256
  484. .byte loi.2 %256
  485. .byte loi.4 %256
  486. .byte loi.6 %256
  487. .byte loi.8 %256
  488. .byte loi.s0 %256
  489. .byte lol.p %256
  490. .byte lol.n %256
  491. .byte lol.0 %256
  492. .byte lol.2 %256
  493. .byte lol.4 %256
  494. .byte lol.6 %256
  495. .byte lol.m2 %256
  496. .byte lol.m4 %256
  497. .byte lol.m6 %256
  498. .byte lol.m8 %256
  499. .byte lol.m10 %256
  500. .byte lol.m12 %256
  501. .byte lol.m14 %256
  502. .byte lol.m16 %256
  503. .byte lol.w0 %256
  504. .byte lol.wm1 %256
  505. .byte lxa.1 %256
  506. .byte lxl.1 %256
  507. .byte lxl.2 %256
  508. .byte mlf.s0 %256
  509. .byte mli.2 %256
  510. .byte mli.4 %256
  511. .byte rck.2 %256
  512. .byte ret.0 %256
  513. .byte ret.2 %256
  514. .byte ret.s0 %256
  515. .byte rmi.2 %256
  516. .byte sar.2 %256
  517. .byte sbf.s0 %256
  518. .byte sbi.2 %256
  519. .byte sbi.4 %256
  520. .byte sdl.wm1 %256
  521. .byte set.s0 %256
  522. .byte sil.wm1 %256
  523. .byte sil.w0 %256
  524. .byte sli.2 %256
  525. .byte ste.l %256
  526. .byte ste.w0 %256
  527. .byte ste.w1 %256
  528. .byte ste.w2 %256
  529. .byte stf.l %256
  530. .byte stf.2 %256
  531. .byte stf.4 %256
  532. .byte stf.s0 %256
  533. .byte sti.1 %256
  534. .byte sti.2 %256
  535. .byte sti.4 %256
  536. .byte sti.6 %256
  537. .byte sti.8 %256
  538. .byte sti.s0 %256
  539. .byte stl.p %256
  540. .byte stl.n %256
  541. .byte stl.p0 %256
  542. .byte stl.p2 %256
  543. .byte stl.m2 %256
  544. .byte stl.m4 %256
  545. .byte stl.m6 %256
  546. .byte stl.m8 %256
  547. .byte stl.m10 %256
  548. .byte stl.wm1 %256
  549. .byte teq.z %256
  550. .byte tgt.z %256
  551. .byte tlt.z %256
  552. .byte tne.z %256
  553. .byte zeq.l %256
  554. .byte zeq.s0 %256
  555. .byte zeq.s1 %256
  556. .byte zer.s0 %256
  557. .byte zge.s0 %256
  558. .byte zgt.s0 %256
  559. .byte zle.s0 %256
  560. .byte zlt.s0 %256
  561. .byte zne.s0 %256
  562. .byte zne.sm1 %256
  563. .byte zre.l %256
  564. .byte zre.w0 %256
  565. .byte zrl.m2 %256
  566. .byte zrl.m4 %256
  567. .byte zrl.wm1 %256
  568. .byte zrl.n %256
  569. .byte loop1 %256
  570. .byte loop2 %256
  571. .errnz .-dispat-512
  572. !----------------- END OF MAIN DISPATCH -------------------------------
  573. init:
  574. ld sp,(bdos+1) ! address of fbase
  575. ld hl,dispat
  576. ld (hl),loc.0/256
  577. inc hl
  578. ld (hl),loc.1/256
  579. inc hl
  580. ld (hl),loc.2/256
  581. call uxinit
  582. warmstart:
  583. ld sp,(bdos+1) ! address of fbase
  584. call makeargv
  585. ld de,0x80
  586. ld c,setdma
  587. call bdos
  588. ld c,open
  589. ld de,fcb
  590. call bdos
  591. inc a
  592. jr z,bademfile
  593. ld c,read
  594. ld de,fcb
  595. call bdos
  596. or a
  597. jr nz,bademfile ! no file
  598. ld de,header
  599. ld hl,0x90 ! start of 2nd half of header
  600. ld bc,10 ! we copy only first 5 words
  601. ldir
  602. ld de,(ntext) ! size of program text in bytes
  603. ld hl,0
  604. sbc hl,de
  605. add hl,sp
  606. ld sp,hl ! save space for program
  607. ld (pb),hl ! set procedure base
  608. ld a,0xa0
  609. ld (nextp),a
  610. ld de,(ntext)
  611. xor a
  612. ld h,a
  613. ld l,a
  614. sbc hl,de
  615. ex de,hl
  616. ld h,a
  617. ld l,a
  618. add hl,sp
  619. 1: call getb
  620. ld (hl),c
  621. inc hl
  622. inc e
  623. jr nz,1b
  624. inc d
  625. jr nz,1b
  626. ! now program text has been read,so start read-
  627. ld iy,0 ! ing data descriptors, (nextp) (was hl) is
  628. ld ix,eb+eb%2 ! pointer into DMA,ix is pointer into global
  629. ! data area,iy is #bytes pushed in last instr (used for repeat)
  630. rddata: ld hl,(ndata)
  631. ld a,h
  632. or l
  633. jr z,prdes ! no data left
  634. dec hl
  635. ld (ndata),hl
  636. call getb ! read 1 byte (here:init type) into register c
  637. dec c
  638. jp p,2f
  639. call getw
  640. push iy
  641. pop hl
  642. ld a,h
  643. or l
  644. jr z,5f ! size of block is zero, so no work
  645. push hl
  646. push bc
  647. 3: pop hl ! #repeats
  648. pop bc ! block size
  649. push bc
  650. ld a,h
  651. or l
  652. jr z,4f ! ready
  653. dec hl
  654. push hl
  655. push ix
  656. pop hl
  657. add ix,bc
  658. dec hl
  659. ld d,h
  660. ld e,l
  661. add hl,bc
  662. ex de,hl
  663. lddr
  664. jr 3b
  665. 4: pop bc
  666. 5: ld iy,0 ! now last instruction = repeat = type 0
  667. jr rddata
  668. 2: ld b,c ! here other types come
  669. jr nz,2f ! Z-flag was (re-)set when decrementing c
  670. call getb ! uninitialized words, fetch #words
  671. sla c
  672. rl b
  673. ld iy,0
  674. add iy,bc
  675. add ix,bc
  676. 4: jr rddata
  677. 2: call getb ! remaining types, first fetch #bytes/words
  678. ld a,b
  679. cp 7
  680. jr z,rdflt
  681. jp p,bademfile ! floats are not accepted,nor are illegal types
  682. ld b,0
  683. cp 1
  684. jr z,2f
  685. cp 5
  686. jp m,1f
  687. 2: ld iy,0 ! initialized bytes, simply copy from EM-1 file
  688. add iy,bc
  689. ld b,c ! #bytes
  690. 3:
  691. call getb
  692. ld (ix),c
  693. inc ix
  694. djnz 3b
  695. jr 4b
  696. 1: cp 2
  697. jr z,2f
  698. cp 3
  699. jr z,3f
  700. ld hl,(pb)
  701. jr 4f
  702. 3: ld hl,eb+eb%2
  703. jr 4f
  704. 2: ld hl,0
  705. 4: ld (ntext),hl ! ntext is used here to hold base address of
  706. ld iy,0 ! correct type: data,instr or 0 (plain numbers)
  707. add iy,bc
  708. add iy,bc
  709. ld b,c
  710. 1:
  711. push bc
  712. ex de,hl ! save e into l
  713. call getw
  714. ex de,hl
  715. ld hl,(ntext)
  716. add hl,bc
  717. ld (ix),l
  718. inc ix
  719. ld (ix),h
  720. inc ix
  721. pop bc
  722. djnz 1b
  723. 2: jr rddata
  724. rdflt:
  725. ld a,c
  726. cp 4
  727. jr nz,bademfile
  728. push ix
  729. pop hl
  730. 1: call getb
  731. ld a,c
  732. ld (hl),a
  733. inc hl
  734. or a
  735. jr nz,1b
  736. push ix
  737. pop hl
  738. call atof
  739. ld b,4
  740. 1: ld a,(hl)
  741. ld (ix),a
  742. inc ix
  743. inc hl
  744. djnz 1b
  745. jr rddata
  746. bademfile:
  747. ld c,printstring
  748. ld de,1f
  749. call bdos
  750. jp 0
  751. 1: .ascii 'load file error\r\n$'
  752. ! now all data has been read,so on with the procedure descriptors
  753. prdes:
  754. ld (hp),ix ! initialize heap pointer
  755. ld de,(nproc)
  756. ld hl,0
  757. xor a
  758. sbc hl,de
  759. add hl,hl
  760. add hl,hl ! 4 bytes per proc-descriptor
  761. add hl,sp
  762. ld sp,hl ! save space for procedure descriptors
  763. push hl
  764. pop ix
  765. ld (pd),hl ! initialize base
  766. ld hl,(nproc)
  767. 1: ld a,h
  768. or l
  769. jr z,2f
  770. dec hl
  771. call getb
  772. ld (ix),c
  773. inc ix
  774. call getb
  775. ld (ix),c
  776. inc ix
  777. call getw
  778. ex de,hl
  779. ld hl,(pb)
  780. add hl,bc
  781. ld (ix),l
  782. inc ix
  783. ld (ix),h
  784. inc ix
  785. ex de,hl
  786. jr 1b
  787. 2:
  788. ld de,(entry) ! get ready for start of program
  789. ld ix,0 ! reta, jumping here will stop execution
  790. push ix
  791. ld hl,argv
  792. push hl
  793. ld hl,(argc)
  794. push hl
  795. jr cal ! call EM-1 main program
  796. getw: call getb
  797. ld b,c
  798. call getb
  799. ld a,b
  800. ld b,c
  801. ld c,a
  802. ret
  803. getb: push hl ! getb reads 1 byte in register c from standard
  804. push de
  805. ld a,(nextp) ! DMA buffer and refills if necessary
  806. or a
  807. jr nz,1f
  808. push bc
  809. ld c,read
  810. ld de,fcb
  811. call bdos
  812. or a
  813. jr nz,bademfile
  814. pop bc
  815. ld a,0x80
  816. 1: ld l,a
  817. ld h,0
  818. ld c,(hl)
  819. inc a
  820. ld (nextp),a
  821. pop de
  822. pop hl
  823. ret
  824. !------------------------- Main loop of the interpreter ---------------
  825. phl: push hl
  826. loop:
  827. .errnz dispat%256
  828. ld l,(ix) ! l = opcode byte
  829. inc ix ! advance program counter
  830. ld h,dispat/256 ! hl=address of high byte of jumpaddress
  831. ld d,(hl) ! d=high byte of jump address
  832. inc h ! hl=address of low byte of jumpaddress
  833. ld e,(hl) ! de=jumpaddress
  834. xor a ! clear a and carry
  835. ld h,a ! and clear h
  836. ex de,hl ! d:=0; hl:=jumpaddress
  837. jp (hl) ! go execute the routine
  838. loop1: ld e,(ix) ! e = opcode byte
  839. inc ix ! advance EM program counter to next byte
  840. ld hl,dispat1 ! hl = address of dispatching table
  841. xor a
  842. ld d,a
  843. add hl,de ! compute address of routine for this opcode
  844. add hl,de ! hl = address of routine to dispatch to
  845. ld d,(hl) ! e = low byte of routine address
  846. inc hl ! hl now points to 2nd byte of routine address
  847. ld h,(hl) ! h = high byte of routine address
  848. ld l,d ! hl = address of routine
  849. ld d,a
  850. jp (hl) ! go execute the routine
  851. loop2: ld e,(ix) ! e = opcode byte
  852. inc ix ! advance EM program counter to next byte
  853. ld hl,dispat2 ! hl = address of dispatching table
  854. xor a
  855. ld d,a
  856. add hl,de ! compute address of routine for this opcode
  857. add hl,de ! hl = address of routine to dispatch to
  858. ld d,(hl) ! e = low byte of routine address
  859. inc hl ! hl now points to 2nd byte of routine address
  860. ld h,(hl) ! h = high byte of routine address
  861. ld l,d ! hl = address of routine
  862. ld d,a
  863. jp (hl) ! go execute the routine
  864. ! Note that d and a are both still 0, and the carry bit is cleared.
  865. ! The execution routines make heavy use of these properties.
  866. ! The reason that the carry bit is cleared is a little subtle, since the
  867. ! two instructions add hl,de affect it. However, since dispat is being
  868. ! added twice a number < 256, no carry can occur.
  869. !---------------------- Routines to compute addresses of locals -------
  870. ! There are four addressing routines, corresponding to four ways the
  871. ! offset can be represented:
  872. ! loml: 16-bit offset. Codes 1-32767 mean offsets -2 to -65534 bytes
  873. ! loms: 8-bit offset. Codes 1-255 mean offsets -2 to -510 bytes
  874. ! lopl: 16-bit offset. Codes 0-32767 mean offsets 0 to +65534 bytes
  875. ! lops: 8-bit offset. Codes 0-255 mean offsets 0 to +510 bytes
  876. loml: ld d,(ix) ! loml is for 16-bit offsets with implied minus
  877. inc ix
  878. jr 1f
  879. loms:
  880. dec d
  881. 1: ld e,(ix) ! loms is for 8-bit offsets with implied minus
  882. inc ix
  883. ld h,b
  884. ld l,c ! hl = bc
  885. add hl,de
  886. add hl,de ! hl now equals lb - byte offset
  887. jp (iy)
  888. lopl: ld d,(ix) ! lopl is for 16-bit offsets >= 0
  889. inc ix
  890. lops: ld h,d
  891. ld l,(ix) ! fetch low order byte of offset
  892. inc ix
  893. add hl,hl ! convert offset to bytes
  894. ld de,zone ! to account of return address zone
  895. add hl,de
  896. add hl,bc ! hl now equals lb - byte offset
  897. jp (iy)
  898. !---------------------------- LOADS -----------------------------------
  899. ! LOC, LPI
  900. loc.l: lpi.l:
  901. ld d,(ix) ! loc with 16-bit offset
  902. inc ix
  903. loc.s0: ld e,(ix) ! loc with 8-bit offset
  904. inc ix
  905. loc.0: loc.1: loc.2: loc.3: loc.4: loc.5: loc.6: loc.7:
  906. loc.8: loc.9: loc.10: loc.11: loc.12: loc.13: loc.14: loc.15:
  907. loc.16: loc.17: loc.18: loc.19: loc.20: loc.21: loc.22: loc.23:
  908. loc.24: loc.25: loc.26: loc.27: loc.28: loc.29: loc.30: loc.31:
  909. loc.32: loc.33:
  910. push de
  911. jr loop
  912. loc.m1: ld hl,-1
  913. jr phl
  914. loc.sm1:dec d ! for constants -256...-1
  915. jr loc.s0
  916. ! LDC
  917. ldc.f: ld h,(ix)
  918. inc ix
  919. ld l,(ix)
  920. inc ix
  921. push hl
  922. ld h,(ix)
  923. inc ix
  924. ld l,(ix)
  925. inc ix
  926. jr phl
  927. ldc.l: ld h,(ix)
  928. inc ix
  929. ld l,(ix)
  930. inc ix
  931. ld e,d
  932. bit 7,h
  933. jr z,1f
  934. dec de
  935. 1:
  936. push de
  937. jr phl
  938. ldc.0: ld e,d
  939. push de
  940. push de
  941. jr loop
  942. ! LOL
  943. lol.0: lol.1: lol.2: lol.3: lol.4: lol.5: lol.6:
  944. ld hl,-b_lolp-b_lolp+zone
  945. add hl,de
  946. add hl,de
  947. add hl,bc
  948. jr ipsh
  949. lol.m2: lol.m4: lol.m6: lol.m8: lol.m10: lol.m12: lol.m14: lol.m16:
  950. ld hl,b_loln+b_loln
  951. sbc hl,de
  952. xor a ! clear carry bit
  953. sbc hl,de
  954. add hl,bc ! hl = lb - byte offset
  955. ipsh: ld e,(hl)
  956. inc hl
  957. ld d,(hl)
  958. push de
  959. jr loop
  960. lol.wm1:ld iy,ipsh
  961. jr loms
  962. lol.n: ld iy,ipsh
  963. jr loml
  964. lol.w0: ld iy,ipsh
  965. jr lops
  966. lol.p: ld iy,ipsh
  967. jr lopl
  968. ! LOE
  969. loe.w4: inc d
  970. loe.w3: inc d
  971. loe.w2: inc d
  972. loe.w1: inc d
  973. loe.w0: ld e,(ix)
  974. inc ix
  975. ld hl,eb+eb%2
  976. add hl,de
  977. add hl,de
  978. jr ipsh
  979. loe.l: ld d,(ix)
  980. inc ix
  981. jr loe.w0
  982. ! LOF
  983. lof.2: lof.4: lof.6: lof.8:
  984. ld hl,-b_lof-b_lof ! assume lof 1 means stack +2, not -2
  985. add hl,de
  986. add hl,de
  987. 1: pop de
  988. add hl,de
  989. jr ipsh
  990. lof.s0: ld h,d
  991. 2: ld l,(ix)
  992. inc ix
  993. jr 1b
  994. lof.l: ld h,(ix)
  995. inc ix
  996. jr 2b
  997. ! LAL
  998. lal.m1: ld h,b
  999. ld l,c
  1000. dec hl
  1001. jr phl
  1002. lal.0: ld h,b
  1003. ld l,c
  1004. ld de,zone
  1005. add hl,de
  1006. jr phl
  1007. lal.wm2:dec d
  1008. lal.wm1:ld iy,phl
  1009. jr loms
  1010. lal.w0: ld iy,phl
  1011. jr lops
  1012. lal.n: ld h,(ix)
  1013. inc ix
  1014. ld l,(ix)
  1015. inc ix
  1016. add hl,bc
  1017. jr phl
  1018. lal.p: ld h,(ix)
  1019. inc ix
  1020. ld l,(ix)
  1021. inc ix
  1022. add hl,bc
  1023. ld de,zone
  1024. add hl,de
  1025. jr phl
  1026. ! LAE
  1027. lae.w8: inc d
  1028. lae.w7: inc d
  1029. lae.w6: inc d
  1030. lae.w5: inc d
  1031. lae.w4: inc d
  1032. lae.w3: inc d
  1033. lae.w2: inc d
  1034. lae.w1: inc d
  1035. lae.w0: ld e,(ix)
  1036. inc ix
  1037. ld hl,eb+eb%2
  1038. add hl,de
  1039. add hl,de
  1040. jr phl
  1041. lae.l: ld d,(ix)
  1042. inc ix
  1043. ld e,(ix)
  1044. inc ix
  1045. ld hl,eb+eb%2
  1046. add hl,de
  1047. jr phl
  1048. ! LIL
  1049. lil.0: lil.2:
  1050. ld hl,-b_lil-b_lil+zone
  1051. add hl,de
  1052. add hl,de
  1053. add hl,bc
  1054. 1: ld e,(hl)
  1055. inc hl
  1056. ld h,(hl)
  1057. ld l,e
  1058. jr ipsh
  1059. lil.wm1:ld iy,1b
  1060. jr loms
  1061. lil.n: ld iy,1b
  1062. jr loml
  1063. lil.w0: ld iy,1b
  1064. jr lops
  1065. lil.p: ld iy,1b
  1066. jr lopl
  1067. ! LXL, LXA
  1068. lxl.1:
  1069. ld a,1
  1070. jr 7f
  1071. lxl.2:
  1072. ld a,2
  1073. jr 7f
  1074. lxl.l: ld d,(ix)
  1075. inc ix
  1076. lxl.s: ld a,(ix)
  1077. inc ix
  1078. 7: ld iy,phl
  1079. 5: ld h,b
  1080. ld l,c
  1081. or a
  1082. jr z,3f
  1083. 2: inc hl
  1084. inc hl
  1085. inc hl
  1086. inc hl
  1087. inc hl
  1088. inc hl
  1089. inc hl
  1090. inc hl
  1091. .errnz .-2b-zone
  1092. ld e,(hl)
  1093. inc hl
  1094. ld h,(hl)
  1095. ld l,e
  1096. dec a
  1097. jr nz,2b
  1098. 3: cp d
  1099. jr z,4f
  1100. dec d
  1101. jr 2b
  1102. 4: jp (iy)
  1103. lxa.1:
  1104. ld a,1
  1105. jr 7f
  1106. lxa.l: ld d,(ix)
  1107. inc ix
  1108. lxa.s: ld a,(ix)
  1109. inc ix
  1110. 7: ld iy,1f
  1111. jr 5b
  1112. 1: ld de,zone
  1113. add hl,de
  1114. jr phl
  1115. lpb.z:
  1116. pop hl
  1117. .errnz zone/256
  1118. ld e,zone
  1119. add hl,de
  1120. jr phl
  1121. dch.z:
  1122. ld e,2
  1123. jr loi
  1124. exg.z:
  1125. pop de
  1126. jr exg
  1127. exg.l:
  1128. ld d,(ix)
  1129. inc ix
  1130. exg.s0:
  1131. ld e,(ix)
  1132. inc ix
  1133. exg:
  1134. push bc
  1135. pop iy
  1136. ld hl,0
  1137. add hl,sp
  1138. ld b,h
  1139. ld c,l
  1140. add hl,de
  1141. 1:
  1142. ld a,(bc)
  1143. ex af,af2
  1144. ld a,(hl)
  1145. ld (bc),a
  1146. ex af,af2
  1147. ld (hl),a
  1148. inc bc
  1149. inc hl
  1150. dec de
  1151. ld a,d
  1152. or e
  1153. jr nz,1b
  1154. push iy
  1155. pop bc
  1156. jr loop
  1157. ! LDL
  1158. ldl.0: ld de,zone
  1159. ld h,b
  1160. ld l,c
  1161. add hl,de
  1162. dipsh: inc hl
  1163. inc hl
  1164. inc hl
  1165. ld d,(hl)
  1166. dec hl
  1167. ld e,(hl)
  1168. dec hl
  1169. push de
  1170. ld d,(hl)
  1171. dec hl
  1172. ld e,(hl)
  1173. push de
  1174. jr loop
  1175. ldl.wm1:ld iy,dipsh
  1176. jr loms
  1177. ldl.n: ld iy,dipsh
  1178. jr loml
  1179. ldl.w0: ld iy,dipsh
  1180. jr lops
  1181. ldl.p: ld iy,dipsh
  1182. jr lopl
  1183. ! LDE
  1184. lde.l: ld d,(ix)
  1185. inc ix
  1186. jr lde.w0
  1187. lde.w3: inc d
  1188. lde.w2: inc d
  1189. lde.w1: inc d
  1190. lde.w0: ld e,(ix)
  1191. inc ix
  1192. ld hl,eb+eb%2
  1193. add hl,de
  1194. add hl,de
  1195. jr dipsh
  1196. ! LDF
  1197. ldf.l: ld d,(ix)
  1198. inc ix
  1199. ld e,(ix)
  1200. inc ix
  1201. pop hl
  1202. add hl,de
  1203. jr dipsh
  1204. ! LOI,LOS
  1205. los.z:
  1206. ld iy,los.2
  1207. jr pop2
  1208. los.l: call long2
  1209. los.2: pop de
  1210. loi: pop hl
  1211. add hl,de
  1212. dec hl
  1213. srl d
  1214. rr e
  1215. jr nc,1f
  1216. ld a,e
  1217. or d
  1218. jr nz,eilsize
  1219. ld e,(hl) ! here the 1-byte case is caught
  1220. push de
  1221. jr loop
  1222. 1: push bc
  1223. pop iy
  1224. 2: ld b,(hl)
  1225. dec hl
  1226. ld c,(hl)
  1227. dec hl
  1228. push bc
  1229. dec de
  1230. ld a,d
  1231. or e
  1232. jr nz,2b
  1233. loiend: push iy
  1234. pop bc
  1235. jr loop
  1236. loi.1: loi.2: loi.4: loi.6: loi.8:
  1237. ld hl,-b_loi-b_loi
  1238. add hl,de
  1239. adc hl,de ! again we use that the carry is cleared
  1240. jr nz,1f
  1241. inc hl ! in case loi.0 object size is 1 byte!
  1242. 1: ex de,hl
  1243. jr loi
  1244. loi.l: ld d,(ix)
  1245. inc ix
  1246. loi.s0: ld e,(ix)
  1247. inc ix
  1248. jr loi
  1249. ! ------------------------------ STORES --------------------------------
  1250. ! STL
  1251. stl.p2: ld hl,2
  1252. jr 4f
  1253. stl.p0: ld hl,0
  1254. 4: ld de,zone
  1255. add hl,de
  1256. add hl,bc
  1257. jr ipop
  1258. stl.m2: stl.m4: stl.m6: stl.m8: stl.m10:
  1259. ld hl,b_stlm+b_stlm
  1260. stl.zrl:sbc hl,de
  1261. xor a
  1262. sbc hl,de
  1263. add hl,bc
  1264. ipop: pop de
  1265. ld (hl),e
  1266. inc hl
  1267. ld (hl),d
  1268. jr loop
  1269. stl.wm1:ld iy,ipop
  1270. jr loms
  1271. stl.n: ld iy,ipop
  1272. jr loml
  1273. stl.w0: ld iy,ipop
  1274. jr lops
  1275. stl.p: ld iy,ipop
  1276. jr lopl
  1277. ! STE
  1278. ste.w3: inc d
  1279. ste.w2: inc d
  1280. ste.w1: inc d
  1281. ste.w0: ld e,(ix)
  1282. inc ix
  1283. ld hl,eb+eb%2
  1284. add hl,de
  1285. add hl,de
  1286. jr ipop
  1287. ste.l: ld d,(ix)
  1288. inc ix
  1289. jr ste.w0
  1290. ! STF
  1291. stf.2: stf.4: stf.6:
  1292. ld hl,-b_stf-b_stf
  1293. add hl,de
  1294. add hl,de
  1295. 1: pop de
  1296. add hl,de
  1297. jr ipop
  1298. stf.s0: ld h,d
  1299. 2: ld l,(ix)
  1300. inc ix
  1301. jr 1b
  1302. stf.l: ld h,(ix)
  1303. inc ix
  1304. jr 2b
  1305. ! SIL
  1306. 1: ld e,(hl)
  1307. inc hl
  1308. ld h,(hl)
  1309. ld l,e
  1310. jr ipop
  1311. sil.wm1:ld iy,1b
  1312. jr loms
  1313. sil.n: ld iy,1b
  1314. jr loml
  1315. sil.w0: ld iy,1b
  1316. jr lops
  1317. sil.p: ld iy,1b
  1318. jr lopl
  1319. ! STI, STS
  1320. sts.z:
  1321. ld iy,sts.2
  1322. jr pop2
  1323. sts.l: call long2
  1324. sts.2: pop de
  1325. sti: pop hl
  1326. srl d
  1327. rr e
  1328. jr nc,1f
  1329. ld a,e
  1330. or d
  1331. jr nz,eilsize
  1332. pop de ! here the 1-byte case is caught
  1333. ld (hl),e
  1334. jr loop
  1335. 1: push bc
  1336. pop iy
  1337. 2: pop bc
  1338. ld (hl),c
  1339. inc hl
  1340. ld (hl),b
  1341. inc hl
  1342. dec de
  1343. ld a,e
  1344. or d
  1345. jr nz,2b
  1346. jr loiend
  1347. sti.1: sti.2: sti.4: sti.6: sti.8:
  1348. ld hl,-b_sti-b_sti
  1349. add hl,de
  1350. adc hl,de ! again we use that the carry is cleared
  1351. jr nz,1f
  1352. inc hl ! in case sti.0 object size is 1 byte!
  1353. 1: ex de,hl
  1354. jr sti
  1355. sti.l: ld d,(ix)
  1356. inc ix
  1357. sti.s0: ld e,(ix)
  1358. inc ix
  1359. jr sti
  1360. ! SDL
  1361. sdl.wm1:ld iy,1f
  1362. jr loms
  1363. sdl.n: ld iy,1f
  1364. jr loml
  1365. sdl.w0: ld iy,1f
  1366. jr lops
  1367. sdl.p: ld iy,1f
  1368. jr lopl
  1369. ! SDE
  1370. sde.l: ld d,(ix)
  1371. inc ix
  1372. ld e,(ix)
  1373. inc ix
  1374. ld hl,eb+eb%2
  1375. 2: add hl,de
  1376. 1: pop de
  1377. ld (hl),e
  1378. inc hl
  1379. ld (hl),d
  1380. inc hl
  1381. jr ipop
  1382. ! SDF
  1383. sdf.l: ld d,(ix)
  1384. inc ix
  1385. ld e,(ix)
  1386. inc ix
  1387. pop hl
  1388. jr 2b
  1389. !------------------------- SINGLE PRECISION ARITHMETIC ---------------
  1390. ! ADI, ADP, ADS, ADU
  1391. adi.z: adu.z:
  1392. pop de
  1393. 9:
  1394. call chk24
  1395. .word adi.2,adi.4
  1396. adi.l: adu.l:
  1397. ld d,(ix) ! I guess a routine chk24.l could do this job
  1398. inc ix
  1399. ld e,(ix)
  1400. inc ix
  1401. jr 9b
  1402. ads.z:
  1403. ld iy,adi.2
  1404. jr pop2
  1405. ads.l:
  1406. call long2
  1407. ads.2: adi.2: adu.2:
  1408. pop de
  1409. 1: pop hl
  1410. add hl,de
  1411. jr phl
  1412. adp.l: ld d,(ix)
  1413. inc ix
  1414. ld e,(ix)
  1415. inc ix
  1416. jr 1b
  1417. adp.sm1:dec d
  1418. adp.s0: ld e,(ix)
  1419. inc ix
  1420. jr 1b
  1421. adp.2: pop hl
  1422. inc hl
  1423. jr 1f
  1424. inc.z:
  1425. adp.1: pop hl
  1426. 1: inc hl
  1427. jr phl
  1428. ! SBI, SBP, SBS, SBU (but what is SBP?)
  1429. sbi.z: sbu.z:
  1430. pop de
  1431. 9:
  1432. call chk24
  1433. .word sbi.2,sbi.4
  1434. sbi.l: sbu.l:
  1435. ld d,(ix)
  1436. inc ix
  1437. ld e,(ix)
  1438. inc ix
  1439. jr 9b
  1440. sbs.z:
  1441. ld iy,sbi.2
  1442. jr pop2
  1443. sbs.l:
  1444. call long2
  1445. sbi.2:
  1446. pop de
  1447. pop hl
  1448. sbc hl,de
  1449. jr phl
  1450. ! NGI
  1451. ngi.z:
  1452. pop de
  1453. 9:
  1454. call chk24
  1455. .word ngi.2,ngi.4
  1456. ngi.l:
  1457. ld d,(ix)
  1458. inc ix
  1459. ld e,(ix)
  1460. inc ix
  1461. jr 9b
  1462. ngi.2: ld hl,0
  1463. pop de
  1464. sbc hl,de
  1465. jr phl
  1466. ! MLI, MLU Johan version
  1467. mli.z: mlu.z:
  1468. pop de
  1469. 9:
  1470. call chk24
  1471. .word mli.2,mli.4
  1472. mli.l: mlu.l:
  1473. ld d,(ix)
  1474. inc ix
  1475. ld e,(ix)
  1476. inc ix
  1477. jr 9b
  1478. mli.2: mlu.2:
  1479. ld iy,loop
  1480. mliint: pop de
  1481. pop hl
  1482. push bc
  1483. ld b,h
  1484. ld c,l
  1485. ld hl,0
  1486. ld a,16
  1487. 0:
  1488. bit 7,d
  1489. jr z,1f
  1490. add hl,bc
  1491. 1:
  1492. dec a
  1493. jr z,2f
  1494. ex de,hl
  1495. add hl,hl
  1496. ex de,hl
  1497. add hl,hl
  1498. jr 0b
  1499. 2:
  1500. pop bc
  1501. push hl
  1502. jp (iy)
  1503. ! DVI, DVU
  1504. dvi.z:
  1505. pop de
  1506. 9:
  1507. call chk24
  1508. .word dvi.2,dvi.4
  1509. dvi.l:
  1510. ld d,(ix)
  1511. inc ix
  1512. ld e,(ix)
  1513. inc ix
  1514. jr 9b
  1515. dvi.2:
  1516. pop hl
  1517. pop de
  1518. push bc
  1519. ld b,h
  1520. ld c,l
  1521. xor a
  1522. ld h,a
  1523. ld l,a
  1524. sbc hl,bc
  1525. jp m,1f
  1526. ld b,h
  1527. ld c,l
  1528. cpl
  1529. 1:
  1530. or a
  1531. ld hl,0
  1532. sbc hl,de
  1533. jp m,1f
  1534. ex de,hl
  1535. cpl
  1536. 1:
  1537. push af
  1538. ld hl,0
  1539. ld a,16
  1540. 0:
  1541. add hl,hl
  1542. ex de,hl
  1543. add hl,hl
  1544. ex de,hl
  1545. jr nc,1f
  1546. inc hl
  1547. or a
  1548. 1:
  1549. sbc hl,bc
  1550. inc de
  1551. jp p,2f
  1552. add hl,bc
  1553. dec de
  1554. 2:
  1555. dec a
  1556. jr nz,0b
  1557. pop af
  1558. or a
  1559. jr z,1f
  1560. ld hl,0
  1561. sbc hl,de
  1562. ex de,hl
  1563. 1:
  1564. pop bc
  1565. push de
  1566. jr loop
  1567. dvu.z:
  1568. pop de
  1569. 9:
  1570. call chk24
  1571. .word dvu.2,dvu.4
  1572. dvu.l:
  1573. ld d,(ix)
  1574. inc ix
  1575. ld e,(ix)
  1576. inc ix
  1577. jr 9b
  1578. dvu.2:
  1579. pop hl
  1580. pop de
  1581. push bc
  1582. ld b,h
  1583. ld c,l
  1584. ld hl,0
  1585. ld a,16
  1586. 0:
  1587. add hl,hl
  1588. ex de,hl
  1589. add hl,hl
  1590. ex de,hl
  1591. jr nc,1f
  1592. inc hl
  1593. or a
  1594. 1:
  1595. sbc hl,bc
  1596. inc de
  1597. jp p,2f
  1598. add hl,bc
  1599. dec de
  1600. 2:
  1601. dec a
  1602. jr nz,0b
  1603. pop bc
  1604. push de
  1605. jr loop
  1606. ! RMI, RMU
  1607. rmi.z:
  1608. pop de
  1609. 9:
  1610. call chk24
  1611. .word rmi.2,rmi.4
  1612. rmi.l:
  1613. ld d,(ix)
  1614. inc ix
  1615. ld e,(ix)
  1616. inc ix
  1617. jr 9b
  1618. rmi.2:
  1619. pop hl
  1620. pop de
  1621. push bc
  1622. ld b,h
  1623. ld c,l
  1624. xor a
  1625. ld h,a
  1626. ld l,a
  1627. sbc hl,bc
  1628. jp m,1f
  1629. ld b,h
  1630. ld c,l
  1631. 1:
  1632. or a
  1633. ld hl,0
  1634. sbc hl,de
  1635. jp m,1f
  1636. ex de,hl
  1637. cpl
  1638. 1:
  1639. push af
  1640. ld hl,0
  1641. ld a,16
  1642. 0:
  1643. add hl,hl
  1644. ex de,hl
  1645. add hl,hl
  1646. ex de,hl
  1647. jr nc,1f
  1648. inc hl
  1649. or a
  1650. 1:
  1651. sbc hl,bc
  1652. inc de
  1653. jp p,2f
  1654. add hl,bc
  1655. dec de
  1656. 2:
  1657. dec a
  1658. jr nz,0b
  1659. ex de,hl
  1660. pop af
  1661. or a
  1662. jr z,1f
  1663. ld hl,0
  1664. sbc hl,de
  1665. ex de,hl
  1666. 1:
  1667. pop bc
  1668. push de
  1669. jr loop
  1670. rmu.4:
  1671. ld iy,.dvu4
  1672. jr 1f
  1673. rmi.4:
  1674. ld iy,.dvi4
  1675. 1:
  1676. ld (retarea),bc
  1677. ld (retarea+2),ix
  1678. ld hl,1f
  1679. push hl
  1680. push iy
  1681. ret
  1682. 1:
  1683. pop hl
  1684. pop hl
  1685. push bc
  1686. push de
  1687. ld bc,(retarea)
  1688. ld ix,(retarea+2)
  1689. jr loop
  1690. rmu.z:
  1691. pop de
  1692. 9:
  1693. call chk24
  1694. .word rmu.2,rmu.4
  1695. rmu.l:
  1696. ld d,(ix)
  1697. inc ix
  1698. ld e,(ix)
  1699. inc ix
  1700. jr 9b
  1701. rmu.2:
  1702. pop hl
  1703. pop de
  1704. push bc
  1705. ld b,h
  1706. ld c,l
  1707. ld hl,0
  1708. ld a,16
  1709. 0:
  1710. add hl,hl
  1711. ex de,hl
  1712. add hl,hl
  1713. ex de,hl
  1714. jr nc,1f
  1715. inc hl
  1716. or a
  1717. 1:
  1718. sbc hl,bc
  1719. inc de
  1720. jp p,2f
  1721. add hl,bc
  1722. dec de
  1723. 2:
  1724. dec a
  1725. jr nz,0b
  1726. pop bc
  1727. jr phl
  1728. ! SLI, SLU
  1729. slu.z: sli.z:
  1730. pop de
  1731. 9:
  1732. call chk24
  1733. .word sli.2,sli.4
  1734. slu.l:
  1735. sli.l:
  1736. ld d,(ix)
  1737. inc ix
  1738. ld e,(ix)
  1739. inc ix
  1740. jr 9b
  1741. sli.2:
  1742. pop de
  1743. pop hl
  1744. ld a,d
  1745. or a
  1746. jr z,1f
  1747. ld e,15
  1748. 2: add hl,hl
  1749. 1: dec e
  1750. jp m,phl
  1751. jr 2b
  1752. sli.4:
  1753. slu.4:
  1754. pop de
  1755. pop iy
  1756. pop hl
  1757. inc d
  1758. dec d
  1759. jr z,1f
  1760. ld e,31
  1761. 1:
  1762. dec e
  1763. jp m,2f
  1764. add iy,iy
  1765. adc hl,hl
  1766. jr 1b
  1767. 2:
  1768. push hl
  1769. push iy
  1770. jr loop
  1771. ! SRI, SRU
  1772. sri.z:
  1773. pop de
  1774. 9:
  1775. call chk24
  1776. .word sri.2,sri.4
  1777. sri.l:
  1778. ld d,(ix)
  1779. inc ix
  1780. ld e,(ix)
  1781. inc ix
  1782. jr 9b
  1783. sri.2: pop de
  1784. pop hl
  1785. ld a,d
  1786. or a
  1787. jr z,1f
  1788. ld e,15
  1789. 2: sra h
  1790. rr l
  1791. 1: dec e
  1792. jp m,phl
  1793. jr 2b
  1794. sri.4:
  1795. pop de
  1796. ld a,e
  1797. inc d
  1798. dec d
  1799. pop de
  1800. pop hl
  1801. jr z,1f
  1802. ld a,31
  1803. 1:
  1804. dec a
  1805. jp m,2f
  1806. sra h
  1807. rr l
  1808. rr d
  1809. rr e
  1810. jr 1b
  1811. 2:
  1812. push hl
  1813. push de
  1814. jr loop
  1815. sru.z:
  1816. pop de
  1817. 9:
  1818. call chk24
  1819. .word sru.2,sru.4
  1820. sru.l:
  1821. ld d,(ix)
  1822. inc ix
  1823. ld e,(ix)
  1824. inc ix
  1825. jr 9b
  1826. sru.2: pop de
  1827. pop hl
  1828. ld a,d
  1829. or a
  1830. jr z,1f
  1831. ld e,15
  1832. 2: srl h
  1833. rr l
  1834. 1: dec e
  1835. jp m,phl
  1836. jr 2b
  1837. sru.4:
  1838. pop de
  1839. ld a,e
  1840. inc d
  1841. dec d
  1842. pop de
  1843. pop hl
  1844. jr z,1f
  1845. ld a,31
  1846. 1:
  1847. dec a
  1848. jp m,2f
  1849. srl h
  1850. rr l
  1851. rr d
  1852. rr e
  1853. jr 1b
  1854. 2:
  1855. push hl
  1856. push de
  1857. jr loop
  1858. ! ROL, ROR
  1859. rol.z:
  1860. pop de
  1861. 9:
  1862. call chk24
  1863. .word rol.2,rol.4
  1864. rol.l:
  1865. ld d,(ix)
  1866. inc ix
  1867. ld e,(ix)
  1868. inc ix
  1869. jr 9b
  1870. rol.2: pop de
  1871. pop hl
  1872. ld a,e
  1873. and 15
  1874. jr z,phl
  1875. ld de,0
  1876. 1: add hl,hl
  1877. adc hl,de
  1878. dec a
  1879. jr nz,1b
  1880. jr phl
  1881. rol.4:
  1882. pop de
  1883. pop iy
  1884. pop hl
  1885. ld a,e
  1886. and 31
  1887. jr z,3f
  1888. 1:
  1889. add iy,iy
  1890. adc hl,hl
  1891. jr nc,2f
  1892. inc iy
  1893. 2:
  1894. dec a
  1895. jr nz,1b
  1896. 3:
  1897. push hl
  1898. push iy
  1899. ror.z:
  1900. pop de
  1901. 9:
  1902. call chk24
  1903. .word ror.2,ror.4
  1904. ror.l:
  1905. ld d,(ix)
  1906. inc ix
  1907. ld e,(ix)
  1908. inc ix
  1909. jr 9b
  1910. ror.2: pop de
  1911. pop hl
  1912. ld a,e
  1913. and 15
  1914. jr z,phl
  1915. 1: srl h
  1916. rr l
  1917. jr nc,2f
  1918. set 7,h
  1919. 2: dec a
  1920. jr nz,1b
  1921. jr phl
  1922. ror.4:
  1923. pop de
  1924. ld a,e
  1925. pop de
  1926. pop hl
  1927. and 31
  1928. jr z,0f
  1929. 1:
  1930. srl h
  1931. rr l
  1932. rr d
  1933. rr e
  1934. jr nc,2f
  1935. set 7,h
  1936. 2:
  1937. dec a
  1938. jr nz,1b
  1939. 0:
  1940. push hl
  1941. push de
  1942. jr loop
  1943. pop2: ld de,2
  1944. pop hl
  1945. sbc hl,de
  1946. jr nz,eilsize
  1947. xor a
  1948. ld d,a
  1949. jp (iy)
  1950. chk24:
  1951. ! this routine is used to call indirectly
  1952. ! a routine for either 2 or 4 byte operation
  1953. ! ( e.g. mli.2 or mli.4)
  1954. ! de contains 2 or 4
  1955. ! iy points to a descriptor containing
  1956. ! the addresses of both routines
  1957. pop iy ! address of descriptor
  1958. ld a,d ! high byte must be 0
  1959. or a
  1960. jr nz,unimpld
  1961. ld a,e
  1962. cp 2
  1963. jr z,1f
  1964. inc iy
  1965. inc iy ! points to word containing
  1966. ! address of 4 byte routine
  1967. cp 4
  1968. jr nz,unimpld
  1969. 1:
  1970. ld h,(iy+1)
  1971. ld l,(iy)
  1972. xor a
  1973. jp (hl)
  1974. !--------------------- INCREMENT, DECREMENT, ZERO ----------------------
  1975. ! INC
  1976. inl.m2: inl.m4: inl.m6:
  1977. ld hl, b_inl+b_inl
  1978. sbc hl,de
  1979. xor a
  1980. sbc hl,de
  1981. add hl,bc
  1982. 1: inc (hl)
  1983. jr nz,loop
  1984. inc hl
  1985. inc (hl)
  1986. jr loop
  1987. inl.wm1:ld iy,1b
  1988. jr loms
  1989. inl.n: ld iy,1b
  1990. jr loml
  1991. inl.p: ld iy,1b
  1992. jr lopl
  1993. ! INE
  1994. ine.w3: inc d
  1995. ine.w2: inc d
  1996. ine.w1: inc d
  1997. ine.w0: ld e,(ix)
  1998. inc ix
  1999. ld hl,eb+eb%2
  2000. add hl,de
  2001. add hl,de
  2002. jr 1b
  2003. ine.l: ld d,(ix)
  2004. inc ix
  2005. jr ine.w0
  2006. ! DEC
  2007. dec.z: pop hl
  2008. dec hl
  2009. push hl
  2010. jr loop
  2011. 1: ld e,(hl)
  2012. inc hl
  2013. ld d,(hl)
  2014. dec de
  2015. ld (hl),d
  2016. dec hl
  2017. ld (hl),e
  2018. jr loop
  2019. del.wm1:ld iy,1b
  2020. jr loms
  2021. del.n: ld iy,1b
  2022. jr loml
  2023. del.p: ld iy,1b
  2024. jr lopl
  2025. ! DEE
  2026. dee.w3: inc d
  2027. dee.w2: inc d
  2028. dee.w1: inc d
  2029. dee.w0: ld e,(ix)
  2030. inc ix
  2031. ld hl,eb+eb%2
  2032. add hl,de
  2033. add hl,de
  2034. jr 1b
  2035. dee.l: ld d,(ix)
  2036. inc ix
  2037. jr dee.w0
  2038. ! ZERO
  2039. zri2: zru2:
  2040. ld h,d
  2041. ld l,d
  2042. jr phl
  2043. zrf.z:
  2044. zer.z: pop de
  2045. 2: ld hl,0
  2046. sra d
  2047. rr e
  2048. 1: push hl
  2049. dec de
  2050. ld a,e
  2051. or d
  2052. jr nz,1b
  2053. jr loop
  2054. zrf.l:
  2055. zer.l: ld d,(ix)
  2056. inc ix
  2057. zer.s0: ld e,(ix)
  2058. inc ix
  2059. jr 2b
  2060. zrl.m2: zrl.m4:
  2061. ld h,d
  2062. ld l,d
  2063. push hl
  2064. ld hl,b_zrl+b_zrl
  2065. jr stl.zrl
  2066. zrl.wm1:
  2067. ld h,d
  2068. ld l,d
  2069. push hl
  2070. jr stl.wm1
  2071. zrl.n:
  2072. ld h,d
  2073. ld l,d
  2074. push hl
  2075. jr stl.n
  2076. zrl.w0:
  2077. ld h,d
  2078. ld l,d
  2079. push hl
  2080. jr stl.w0
  2081. zrl.p:
  2082. ld h,d
  2083. ld l,d
  2084. push hl
  2085. jr stl.p
  2086. zre.w0:
  2087. ld h,d
  2088. ld l,d
  2089. push hl
  2090. jr ste.w0
  2091. zre.l:
  2092. ld h,d
  2093. ld l,d
  2094. push hl
  2095. jr ste.l
  2096. ! ------------------------- CONVERT GROUP ------------------------------
  2097. ! CII, CIU
  2098. cii.z: ciu.z:
  2099. pop hl
  2100. pop de
  2101. sbc hl,de ! hl and de can only have values 2 or 4, that's
  2102. ! why a single subtract can split the 3 cases
  2103. jr z,loop ! equal, so do nothing
  2104. jp p,2f
  2105. 3: pop hl ! smaller, so shrink size from double to single
  2106. pop de
  2107. jr phl
  2108. 2: pop hl ! larger, so expand (for cii with sign extend)
  2109. res 1,e
  2110. bit 7,h
  2111. jr z,1f
  2112. dec de
  2113. 1: push de
  2114. jr phl
  2115. ! CUI, CUU
  2116. cui.z: cuu.z:
  2117. pop hl
  2118. pop de
  2119. sbc hl,de
  2120. jr z,loop
  2121. jp m,3b
  2122. res 1,e
  2123. pop hl
  2124. jr 1b
  2125. ! ------------------------------ SETS ---------------------------------
  2126. ! SET
  2127. set.z: pop hl
  2128. doset: pop de
  2129. push bc
  2130. pop iy
  2131. ld b,h
  2132. ld c,l
  2133. xor a
  2134. 0: push af
  2135. inc sp
  2136. dec c
  2137. jr nz,0b
  2138. dec b
  2139. jp p,0b
  2140. push iy
  2141. pop bc
  2142. ex de,hl
  2143. ld a,l
  2144. sra h
  2145. jp m,unimpld
  2146. rr l
  2147. sra h
  2148. rr l
  2149. sra h
  2150. rr l
  2151. push hl
  2152. or a
  2153. sbc hl,de
  2154. pop hl
  2155. jp p,unimpld
  2156. add hl,sp
  2157. ld (hl),1
  2158. and 7
  2159. jr 1f
  2160. 0: sla (hl)
  2161. dec a
  2162. 1: jr nz,0b
  2163. jr loop
  2164. set.l: ld d,(ix)
  2165. inc ix
  2166. set.s0: ld e,(ix)
  2167. inc ix
  2168. ex de,hl
  2169. jr doset
  2170. ! INN
  2171. inn.z: pop hl
  2172. jr 1f
  2173. inn.l: ld d,(ix)
  2174. inc ix
  2175. inn.s0: ld e,(ix)
  2176. inc ix
  2177. ex de,hl
  2178. 1:
  2179. pop de
  2180. add hl,sp
  2181. push hl
  2182. pop iy
  2183. ex de,hl
  2184. ld a,l
  2185. sra h
  2186. jp m,0f
  2187. rr l
  2188. sra h
  2189. rr l
  2190. sra h
  2191. rr l
  2192. add hl,sp
  2193. push hl
  2194. or a ! clear carry
  2195. sbc hl,de
  2196. pop hl
  2197. jp m,1f
  2198. 0: xor a
  2199. jr 4f
  2200. 1: ld e,(hl)
  2201. and 7
  2202. jr 2f
  2203. 3: rrc e
  2204. dec a
  2205. 2: jr nz,3b
  2206. ld a,e
  2207. and 1
  2208. 4: ld l,a
  2209. ld h,0
  2210. ld sp,iy
  2211. jr phl
  2212. ! ------------------------- LOGICAL GROUP -----------------------------
  2213. ! AND
  2214. and.z: pop de
  2215. doand: ld h,d
  2216. ld l,e
  2217. add hl,sp
  2218. push bc
  2219. ld b,h
  2220. ld c,l
  2221. ex de,hl
  2222. add hl,de
  2223. 1: dec hl
  2224. dec de
  2225. ld a,(de)
  2226. and (hl)
  2227. ld (hl),a
  2228. xor a
  2229. sbc hl,bc
  2230. jr z,2f
  2231. add hl,bc
  2232. jr 1b
  2233. 2: ld h,b
  2234. ld l,c
  2235. pop bc
  2236. ld sp,hl
  2237. jr loop
  2238. and.l: ld d,(ix)
  2239. inc ix
  2240. and.s0: ld e,(ix)
  2241. inc ix
  2242. jr doand
  2243. and.2: ld e,2
  2244. jr doand
  2245. ! IOR
  2246. ior.z: pop de
  2247. ior: ld h,d
  2248. ld l,e
  2249. add hl,sp
  2250. push bc
  2251. ld b,h
  2252. ld c,l
  2253. ex de,hl
  2254. add hl,de
  2255. 1: dec hl
  2256. dec de
  2257. ld a,(de)
  2258. or (hl)
  2259. ld (hl),a
  2260. xor a
  2261. sbc hl,bc
  2262. jr z,2f
  2263. add hl,bc
  2264. jr 1b
  2265. 2: ld h,b
  2266. ld l,c
  2267. pop bc
  2268. ld sp,hl
  2269. jr loop
  2270. ior.l: ld d,(ix)
  2271. inc ix
  2272. ior.s0: ld e,(ix)
  2273. inc ix
  2274. jr ior
  2275. ior.2: ld e,2
  2276. jr ior
  2277. ! XOR
  2278. xor.z: pop de
  2279. exor: ld h,d
  2280. ld l,e
  2281. add hl,sp
  2282. push bc
  2283. ld b,h
  2284. ld c,l
  2285. ex de,hl
  2286. add hl,de
  2287. 1: dec hl
  2288. dec de
  2289. ld a,(de)
  2290. xor (hl)
  2291. ld (hl),a
  2292. xor a
  2293. sbc hl,bc
  2294. jr z,2f
  2295. add hl,bc
  2296. jr 1b
  2297. 2: ld h,b
  2298. ld l,c
  2299. pop bc
  2300. ld sp,hl
  2301. jr loop
  2302. xor.l: ld d,(ix)
  2303. inc ix
  2304. ld e,(ix)
  2305. inc ix
  2306. jr exor
  2307. ! COM
  2308. com.z: pop hl
  2309. com: add hl,sp
  2310. 1: dec hl
  2311. ld a,(hl)
  2312. cpl
  2313. ld (hl),a
  2314. xor a
  2315. sbc hl,sp
  2316. jr z,loop
  2317. add hl,sp
  2318. jr 1b
  2319. com.l: ld d,(ix)
  2320. inc ix
  2321. ld e,(ix)
  2322. inc ix
  2323. ex de,hl
  2324. jr com
  2325. ! ------------------------- COMPARE GROUP ------------------------------
  2326. ! CMI
  2327. cmi.2: pop de
  2328. pop hl
  2329. ld a,h
  2330. xor d ! check sign bit to catch overflow with subtract
  2331. jp m,1f
  2332. sbc hl,de
  2333. jr phl
  2334. 1: xor d ! now a equals (original) h again
  2335. jp m,phl
  2336. set 0,l ! to catch case hl=0>de bit 0 is set explicitly
  2337. jr phl
  2338. ! CMU, CMP
  2339. cmi.4: inc a
  2340. ld de,4
  2341. jr docmu
  2342. cmp.z: ld de,2
  2343. jr docmu
  2344. cmi.z: inc a
  2345. cmu.z:
  2346. pop de
  2347. jr docmu
  2348. cmi.l: inc a
  2349. cmu.l: ld d,(ix)
  2350. inc ix
  2351. ld e,(ix)
  2352. inc ix
  2353. docmu: push bc
  2354. pop iy
  2355. ld b,d
  2356. ld c,e
  2357. ld hl,0
  2358. add hl,sp
  2359. add hl,bc
  2360. dec hl
  2361. ld d,h
  2362. ld e,l
  2363. add hl,bc
  2364. ld (retarea),hl ! save new sp-1
  2365. or a
  2366. jr z,1f
  2367. ld a,(de)
  2368. cp (hl)
  2369. dec hl
  2370. dec de
  2371. dec bc
  2372. jr z,1f
  2373. jp p,4f
  2374. jp pe,5f
  2375. jr 6f
  2376. 1:
  2377. ld a,(de)
  2378. cp (hl)
  2379. dec de
  2380. dec hl
  2381. dec bc
  2382. jr nz,2f
  2383. ld a,b
  2384. or c
  2385. jr nz,1b
  2386. ld d,a
  2387. ld e,a
  2388. jr 3f
  2389. 2:
  2390. jr nc,5f
  2391. 6:
  2392. ld de,1
  2393. jr 3f
  2394. 4:
  2395. jp pe,6b
  2396. 5:
  2397. ld de,-1
  2398. 3:
  2399. ld hl,(retarea)
  2400. inc hl
  2401. ld sp,hl
  2402. push de
  2403. push iy
  2404. pop bc
  2405. jr loop
  2406. ! CMS
  2407. cms.z: pop hl
  2408. jr 1f
  2409. cms.l: ld d,(ix)
  2410. inc ix
  2411. cms.s0: ld e,(ix)
  2412. inc ix
  2413. ex de,hl
  2414. 1: push bc
  2415. pop iy
  2416. ld b,h
  2417. ld c,l
  2418. add hl,sp
  2419. 0:
  2420. dec sp
  2421. pop af
  2422. cpi
  2423. jr nz,1f
  2424. ld a,b
  2425. or c
  2426. jr nz,0b
  2427. ld de,0
  2428. jr 2f
  2429. 1:
  2430. add hl,bc
  2431. ld de,1
  2432. 2:
  2433. ld sp,hl
  2434. push de
  2435. push iy
  2436. pop bc
  2437. jr loop
  2438. ! TLT, TLE, TEQ, TNE, TGE, TGT
  2439. tlt.z:
  2440. ld h,d
  2441. ld l,d
  2442. pop de
  2443. bit 7,d
  2444. jr z,1f
  2445. inc l
  2446. 1:
  2447. jr phl
  2448. tle.z: ld hl,1
  2449. pop de
  2450. xor a
  2451. add a,d
  2452. jp m,phl
  2453. jr nz,1f
  2454. xor a
  2455. add a,e
  2456. jr z,2f
  2457. 1: dec l
  2458. 2:
  2459. jr phl
  2460. teq.z:
  2461. ld h,d
  2462. ld l,d
  2463. pop de
  2464. ld a,d
  2465. or e
  2466. jr nz,1f
  2467. inc l
  2468. 1:
  2469. jr phl
  2470. tne.z:
  2471. ld h,d
  2472. ld l,d
  2473. pop de
  2474. ld a,d
  2475. or e
  2476. jr z,1f
  2477. inc l
  2478. 1:
  2479. jr phl
  2480. tge.z:
  2481. ld h,d
  2482. ld l,d
  2483. pop de
  2484. bit 7,d
  2485. jr nz,1f
  2486. inc l
  2487. 1:
  2488. jr phl
  2489. tgt.z:
  2490. ld h,d
  2491. ld l,d
  2492. pop de
  2493. xor a
  2494. add a,d
  2495. jp m,phl
  2496. jr nz,1f
  2497. xor a
  2498. add a,e
  2499. jr z,2f
  2500. 1: inc l
  2501. 2:
  2502. jr phl
  2503. ! ------------------------- BRANCH GROUP -------------------------------
  2504. ! BLT, BLE, BEQ, BNE, BGE, BGT, BRA
  2505. b.pl: ld d,(ix)
  2506. inc ix
  2507. b.ps: ld e,(ix)
  2508. inc ix
  2509. push ix
  2510. pop hl
  2511. add hl,de
  2512. pop de
  2513. ex (sp),hl
  2514. xor a
  2515. jp (iy)
  2516. bra.l: ld d,(ix)
  2517. inc ix
  2518. jr bra.s0
  2519. bra.sm2:dec d
  2520. bra.sm1:dec d
  2521. dec d
  2522. bra.s1: inc d
  2523. bra.s0: ld e,(ix)
  2524. inc ix
  2525. add ix,de
  2526. jr loop
  2527. bgo: pop ix ! take branch
  2528. jr loop
  2529. blt.s0: ld iy,blt
  2530. jr b.ps
  2531. blt.l: ld iy,blt
  2532. jr b.pl
  2533. blt: ld a,h
  2534. xor d
  2535. jp m,1f
  2536. sbc hl,de
  2537. jr 2f
  2538. 1: xor d
  2539. 2: jp m,bgo
  2540. pop de
  2541. jr loop
  2542. ble.s0: ld iy,ble
  2543. jr b.ps
  2544. ble.l: ld iy,ble
  2545. jr b.pl
  2546. ble: ex de,hl
  2547. jr bge
  2548. beq.s0: ld iy,beq
  2549. jr b.ps
  2550. beq.l: ld iy,beq
  2551. jr b.pl
  2552. beq: sbc hl,de
  2553. jr z,bgo
  2554. pop de ! keep stack clean, so dump unused jump address
  2555. jr loop
  2556. bne.s0: ld iy,bne
  2557. jr b.ps
  2558. bne.l: ld iy,bne
  2559. jr b.pl
  2560. bne: sbc hl,de
  2561. jr nz,bgo
  2562. pop de ! keep stack clean, so dump unused jump address
  2563. jr loop
  2564. bge.s0: ld iy,bge
  2565. jr b.ps
  2566. bge.l: ld iy,bge
  2567. jr b.pl
  2568. bge: ld a,h
  2569. xor d ! check sign bit to catch overflow with subtract
  2570. jp m,1f
  2571. sbc hl,de
  2572. jr 2f
  2573. 1: xor d ! now a equals (original) h again
  2574. 2: jp p,bgo
  2575. pop de ! keep stack clean, so dump unused jump address
  2576. jr loop
  2577. bgt.s0: ld iy,bgt
  2578. jr b.ps
  2579. bgt.l: ld iy,bgt
  2580. jr b.pl
  2581. bgt: ex de,hl
  2582. jr blt
  2583. ! ZLT, ZLE, ZEQ, ZNE, ZGE, ZGT
  2584. z.pl: ld d,(ix)
  2585. inc ix
  2586. z.ps: ld e,(ix)
  2587. inc ix
  2588. push ix
  2589. pop hl
  2590. add hl,de
  2591. ex de,hl
  2592. pop hl
  2593. xor a
  2594. add a,h
  2595. jp (iy)
  2596. zlt.l: ld iy,zlt
  2597. jr z.pl
  2598. zlt.s0: ld iy,zlt
  2599. jr z.ps
  2600. zlt: jp m,zgo
  2601. jr loop
  2602. zle.l: ld iy,zle
  2603. jr z.pl
  2604. zle.s0: ld iy,zle
  2605. jr z.ps
  2606. zle: jp m,zgo
  2607. jr nz,loop
  2608. xor a
  2609. add a,l
  2610. jr z,zgo
  2611. jr loop
  2612. zeq.l: ld iy,zeq
  2613. jr z.pl
  2614. zeq.s1: inc d
  2615. zeq.s0: ld iy,zeq
  2616. jr z.ps
  2617. zeq: ld a,l
  2618. or h
  2619. jr nz,loop
  2620. zgo: push de
  2621. pop ix
  2622. jr loop
  2623. zne.sm1:dec d
  2624. jr zne.s0
  2625. zne.l: ld iy,zne
  2626. jr z.pl
  2627. zne.s0: ld iy,zne
  2628. jr z.ps
  2629. zne: ld a,l
  2630. or h
  2631. jr nz,zgo
  2632. jr loop
  2633. zge.l: ld iy,zge
  2634. jr z.pl
  2635. zge.s0: ld iy,zge
  2636. jr z.ps
  2637. zge: jp m,loop
  2638. jr zgo
  2639. zgt.l: ld iy,zgt
  2640. jr z.pl
  2641. zgt.s0: ld iy,zgt
  2642. jr z.ps
  2643. zgt: jp m,loop
  2644. jr nz,zgo
  2645. xor a
  2646. add a,l
  2647. jr z,loop
  2648. jr zgo
  2649. ! ------------------- ARRAY REFERENCE GROUP ---------------------------
  2650. ! AAR
  2651. aar.z:
  2652. ld iy,aar.2
  2653. jr pop2
  2654. aar.l: call long2
  2655. aar.2: ld hl,loop
  2656. aarint: pop iy ! descriptor
  2657. ex (sp),hl ! save return address and hl:=index
  2658. ld e,(iy+0)
  2659. ld d,(iy+1) ! de := lwb
  2660. ld a,h
  2661. xor d
  2662. jp m,1f
  2663. sbc hl,de
  2664. jr 2f
  2665. 1: sbc hl,de
  2666. xor d
  2667. 2: call m,e.array
  2668. ld e,(iy+2)
  2669. ld d,(iy+3) ! de := upb - lwb
  2670. push hl
  2671. ex de,hl
  2672. ld a,h
  2673. xor d
  2674. jp m,1f
  2675. sbc hl,de
  2676. jr 2f
  2677. 1: xor d
  2678. 2: ex de,hl
  2679. pop hl
  2680. call m,e.array
  2681. 1: ld e,(iy+4)
  2682. ld d,(iy+5)
  2683. pop iy
  2684. ex (sp),iy
  2685. push iy ! exchange base address and return address
  2686. push de
  2687. push de
  2688. push hl
  2689. ld iy,1f
  2690. jr mliint
  2691. 1: pop de
  2692. pop iy
  2693. pop hl
  2694. push iy
  2695. add hl,de
  2696. pop de
  2697. ex (sp),hl
  2698. jp (hl)
  2699. lar.l: call long2
  2700. lar.2: ld hl,loi
  2701. jr aarint
  2702. lar.z:
  2703. ld iy,lar.2
  2704. jr pop2
  2705. sar.l: call long2
  2706. sar.2: ld hl,sti
  2707. jr aarint
  2708. sar.z:
  2709. ld iy,sar.2
  2710. jr pop2
  2711. ! --------------------- PROCEDURE CALL/RETURN --------------------------
  2712. ! CAL
  2713. cal.1: cal.2: cal.3: cal.4: cal.5: cal.6: cal.7: cal.8:
  2714. cal.9: cal.10: cal.11: cal.12: cal.13: cal.14: cal.15: cal.16:
  2715. cal.17: cal.18: cal.19: cal.20: cal.21: cal.22: cal.23: cal.24:
  2716. cal.25: cal.26: cal.27: cal.28:
  2717. ld hl,-b_cal
  2718. add hl,de
  2719. ex de,hl
  2720. jr cal
  2721. cal.l: ld d,(ix)
  2722. inc ix
  2723. cal.s0: ld e,(ix)
  2724. inc ix
  2725. cal: push ix ! entry point for main program of interpreter
  2726. push bc
  2727. ld hl,(eb+eb%2)
  2728. push hl
  2729. ld hl,(eb+eb%2+4)
  2730. push hl
  2731. ! temporary tracing facility
  2732. ! NOP it if you don't want it
  2733. push de
  2734. ld de,(eb+eb%2+4)
  2735. ld hl,(eb+eb%2)
  2736. call prline
  2737. pop de
  2738. ! end of temporary tracing
  2739. ld hl,0
  2740. add hl,sp
  2741. ld b,h
  2742. ld c,l
  2743. ld hl,(pd)
  2744. ex de,hl
  2745. add hl,hl
  2746. add hl,hl
  2747. add hl,de
  2748. push hl
  2749. pop iy
  2750. ld e,(iy+0)
  2751. ld d,(iy+1)
  2752. ld l,c
  2753. ld h,b
  2754. xor a
  2755. sbc hl,de
  2756. ld sp,hl
  2757. ld e,(iy+2)
  2758. ld d,(iy+3)
  2759. ld ix,0
  2760. add ix,de
  2761. jr loop
  2762. ! CAI
  2763. cai.z: pop de
  2764. jr cal
  2765. ! LFR
  2766. lfr.z: pop de
  2767. 2: ld a,e
  2768. rr a
  2769. cp 5
  2770. jp p,eilsize ! only result sizes <= 8 are allowed
  2771. ld hl,retarea
  2772. add hl,de
  2773. 1: dec hl
  2774. ld d,(hl)
  2775. dec hl
  2776. ld e,(hl)
  2777. push de
  2778. dec a
  2779. jr nz,1b
  2780. jr loop
  2781. lfr.l: ld d,(ix)
  2782. inc ix
  2783. lfr.s0: ld e,(ix)
  2784. inc ix
  2785. jr 2b
  2786. lfr.2: ld hl,(retarea)
  2787. jr phl
  2788. lfr.4: ld de,4
  2789. jr 2b
  2790. ! RET
  2791. ret.2: ld a,1
  2792. jr 3f
  2793. ret.z: pop de
  2794. 2: ld a,d
  2795. or e
  2796. jr z,ret.0
  2797. rr a
  2798. cp 5
  2799. jp p,eilsize ! only result sizes <= 8 bytes are allowed
  2800. 3: ld hl,retarea
  2801. 1: pop de
  2802. ld (hl),e
  2803. inc hl
  2804. ld (hl),d
  2805. inc hl
  2806. dec a
  2807. jr nz,1b
  2808. ret.0:
  2809. ld h,b
  2810. ld l,c
  2811. ld sp,hl
  2812. pop hl
  2813. ld (eb+eb%2+4),hl
  2814. pop hl
  2815. ld (eb+eb%2),hl
  2816. pop bc ! old LB
  2817. pop ix ! reta
  2818. push ix ! check to see if reta = boot (= 0)
  2819. pop hl
  2820. ld a,l
  2821. or h
  2822. jr nz,loop ! not done yet
  2823. call uxfinish
  2824. jr boot
  2825. ret.l: ld d,(ix)
  2826. inc ix
  2827. ret.s0: ld e,(ix)
  2828. inc ix
  2829. jr 2b
  2830. ! ------------------------- MISCELLANEOUS -----------------------------
  2831. ! SIG, TRP, RTT
  2832. sig.z:
  2833. ld hl,(trapproc)
  2834. ex (sp),hl
  2835. ld (trapproc),hl
  2836. jr loop
  2837. trp.z:
  2838. ex (sp),hl
  2839. push de
  2840. push af
  2841. push ix
  2842. push iy
  2843. push bc
  2844. ! ld iy,trapproc
  2845. ! ld a,(iy)
  2846. ! or (iy+1)
  2847. ! jr nz,1f
  2848. ld iy,2f+13
  2849. call octnr
  2850. ld c,printstring
  2851. ld de,2f
  2852. call bdos
  2853. ld de,(eb+eb%2+4)
  2854. ld hl,(eb+eb%2)
  2855. call prline
  2856. 0:
  2857. pop iy ! LB
  2858. ld a,(iy+6)
  2859. or (iy+7) ! reta
  2860. jr nz,3f
  2861. call uxfinish
  2862. jp boot
  2863. 3:
  2864. ld c,(iy+4)
  2865. ld b,(iy+5)
  2866. push bc ! next LB
  2867. ld e,(iy)
  2868. ld d,(iy+1) ! file name
  2869. ld l,(iy+2)
  2870. ld h,(iy+3) ! lineno
  2871. call prline
  2872. jr 0b
  2873. !1:
  2874. ! ld ix,0
  2875. ! push hl
  2876. ! ld hl,(trapproc)
  2877. ! push hl
  2878. ! ld hl,0
  2879. ! ld (trapproc),hl
  2880. ! jr cai.z
  2881. 2: .ascii 'error 0xxxxxx\r\n$'
  2882. prline:
  2883. ! prints lineno (hl) and filename (de)
  2884. push de
  2885. ld iy,2f+12
  2886. call octnr
  2887. ld c,printstring
  2888. ld de,2f
  2889. call bdos
  2890. pop de
  2891. ld hl,4f
  2892. 0:
  2893. ld a,(de)
  2894. or a
  2895. jr z,1f
  2896. ld (hl),a
  2897. inc de
  2898. inc hl
  2899. jr 0b
  2900. 1:
  2901. ld (hl),36 ! '$'
  2902. ld de,4f
  2903. ld c,printstring
  2904. call bdos
  2905. ld de,3f
  2906. ld c,printstring
  2907. call bdos
  2908. ret
  2909. 2: .ascii 'line 0xxxxxx in $'
  2910. 3: .ascii '\r\n$'
  2911. 4: .space 12
  2912. rtt.z=ret.0
  2913. ! NOP
  2914. ! changed into output routine to print linenumber
  2915. ! in octal (6 digits)
  2916. nop.z: push bc
  2917. ld iy,1f+12
  2918. ld hl,(eb+eb%2)
  2919. call octnr
  2920. ld iy,1f+20
  2921. ld hl,0
  2922. add hl,sp
  2923. call octnr
  2924. ld c,printstring
  2925. ld de,1f
  2926. call bdos
  2927. pop bc
  2928. jr loop
  2929. 1: .ascii 'test 0xxxxxx 0xxxxxx\r\n$'
  2930. octnr:
  2931. ld b,6
  2932. 1: ld a,7
  2933. and l
  2934. add a,'0'
  2935. dec iy
  2936. ld (iy+0),a
  2937. srl h
  2938. rr l
  2939. srl h
  2940. rr l
  2941. srl h
  2942. rr l
  2943. djnz 1b
  2944. ret
  2945. ! DUP
  2946. dup.2: pop hl
  2947. push hl
  2948. jr phl
  2949. dus.z:
  2950. ld iy,1f
  2951. jr pop2
  2952. dus.l: call long2
  2953. 1: push bc
  2954. pop iy
  2955. pop bc
  2956. jr dodup
  2957. dup.l:
  2958. push bc
  2959. pop iy
  2960. ld b,(ix)
  2961. inc ix
  2962. ld c,(ix)
  2963. inc ix
  2964. dodup: ld h,d
  2965. ld l,d ! ld hl,0
  2966. add hl,sp
  2967. ld d,h
  2968. ld e,l
  2969. xor a
  2970. sbc hl,bc
  2971. ld sp,hl
  2972. ex de,hl
  2973. ldir
  2974. push iy
  2975. pop bc
  2976. jr loop
  2977. ! BLM, BLS
  2978. bls.z:
  2979. ld iy,blm
  2980. jr pop2
  2981. bls.l: call long2
  2982. blm:
  2983. push bc
  2984. pop iy
  2985. pop bc
  2986. pop de
  2987. pop hl
  2988. ldir
  2989. push iy
  2990. pop bc
  2991. jr loop
  2992. blm.l:
  2993. ld d,(ix)
  2994. inc ix
  2995. blm.s0: ld e,(ix)
  2996. inc ix
  2997. push de
  2998. jr blm
  2999. ! ASP, ASS
  3000. ass.z:
  3001. ld iy,1f
  3002. jr pop2
  3003. ass.l: call long2
  3004. 1: pop hl
  3005. jr 1f
  3006. asp.l:
  3007. ld h,(ix)
  3008. inc ix
  3009. ld l,(ix)
  3010. inc ix
  3011. asp: add hl,hl
  3012. 1: add hl,sp
  3013. ld sp,hl
  3014. jr loop
  3015. asp.2: asp.4: asp.6: asp.8: asp.10:
  3016. ld hl,-b_asp
  3017. add hl,de
  3018. jr asp
  3019. asp.w0: ld e,(ix)
  3020. inc ix
  3021. ex de,hl
  3022. jr asp
  3023. ! CSA
  3024. csa.z:
  3025. ld iy,csa.2
  3026. jr pop2
  3027. csa.l: call long2
  3028. csa.2:
  3029. !! temporary version while bug in cem remains
  3030. ! pop iy
  3031. ! pop de
  3032. ! push bc
  3033. ! ld c,(iy)
  3034. ! ld b,(iy+1)
  3035. ! ld l,(iy+4)
  3036. ! ld h,(iy+5)
  3037. ! xor a
  3038. ! sbc hl,de
  3039. ! jp m,1f
  3040. ! ex de,hl
  3041. ! ld e,(iy+2)
  3042. ! ld d,(iy+3)
  3043. ! xor a
  3044. ! sbc hl,de
  3045. ! jp m,1f
  3046. ! end of temporary piece
  3047. pop iy
  3048. pop hl
  3049. push bc
  3050. ld c,(iy)
  3051. ld b,(iy+1)
  3052. ld e,(iy+2)
  3053. ld d,(iy+3)
  3054. xor a
  3055. sbc hl,de
  3056. jp m,1f
  3057. ex de,hl
  3058. ld l,(iy+4)
  3059. ld h,(iy+5)
  3060. xor a
  3061. sbc hl,de
  3062. jp m,1f
  3063. ex de,hl
  3064. add hl,hl
  3065. ld de,6
  3066. add hl,de
  3067. ex de,hl
  3068. add iy,de
  3069. ld l,(iy)
  3070. ld h,(iy+1)
  3071. ld a,h
  3072. or l
  3073. jr nz,2f
  3074. 1: ld a,b
  3075. or c
  3076. jr z,e.case
  3077. ld l,c
  3078. ld h,b
  3079. 2: pop bc
  3080. push hl
  3081. pop ix
  3082. jr loop
  3083. ! CSB
  3084. csb.z:
  3085. ld iy,csb.2
  3086. jr pop2
  3087. csb.l: call long2
  3088. csb.2:
  3089. pop ix
  3090. pop iy
  3091. ld e,(ix)
  3092. inc ix
  3093. ld d,(ix)
  3094. inc ix
  3095. push de
  3096. ex (sp),iy
  3097. pop de
  3098. push bc
  3099. ld c,(ix)
  3100. inc ix
  3101. ld b,(ix)
  3102. inc ix
  3103. 1:
  3104. ld a,b
  3105. or c
  3106. jr z,noteq
  3107. ld a,(ix+0)
  3108. cp e
  3109. jr nz,2f
  3110. ld a,(ix+1)
  3111. cp d
  3112. jr nz,2f
  3113. ld l,(ix+2)
  3114. ld h,(ix+3)
  3115. jr 3f
  3116. 2: inc ix
  3117. inc ix
  3118. inc ix
  3119. inc ix
  3120. dec bc
  3121. jr 1b
  3122. noteq: push iy
  3123. pop hl
  3124. 3: ld a,l
  3125. or h
  3126. jr z,e.case
  3127. 2:
  3128. pop bc
  3129. push hl
  3130. pop ix
  3131. jr loop
  3132. ! LIN
  3133. lin.l: ld d,(ix)
  3134. inc ix
  3135. lin.s0: ld e,(ix)
  3136. inc ix
  3137. ld (eb+eb%2),de
  3138. jr loop
  3139. ! FIL
  3140. fil.z: pop hl
  3141. 1:
  3142. ld (eb+eb%2+4),hl
  3143. jr loop
  3144. fil.l: ld h,(ix)
  3145. inc ix
  3146. ld l,(ix)
  3147. inc ix
  3148. ld de,eb+eb%2
  3149. add hl,de
  3150. jr 1b
  3151. ! LNI
  3152. lni.z: ld hl,(eb+eb%2)
  3153. inc hl
  3154. ld (eb+eb%2),hl
  3155. jr loop
  3156. ! RCK
  3157. rck.z:
  3158. ld iy,rck.2
  3159. jr pop2
  3160. rck.l: call long2
  3161. rck.2:
  3162. pop iy
  3163. 3: pop hl
  3164. push hl
  3165. ld e,(iy)
  3166. ld d,(iy+1)
  3167. ld a,h
  3168. xor d ! check sign bit to catch overflow with subtract
  3169. jp m,1f
  3170. sbc hl,de
  3171. jr 2f
  3172. 1: xor d ! now a equals (original) h again
  3173. 2: call m,e.rck
  3174. pop de
  3175. push de
  3176. ld l,(iy+2)
  3177. ld h,(iy+3)
  3178. ld a,h
  3179. xor d ! check sign bit to catch overflow with subtract
  3180. jp m,1f
  3181. sbc hl,de
  3182. jr 2f
  3183. 1: xor d ! now a equals (original) h again
  3184. 2: call m,e.rck
  3185. jr loop
  3186. ! LIM
  3187. lim.z: ld hl,(ignmask)
  3188. jr phl
  3189. ! SIM
  3190. sim.z: pop de
  3191. ld (ignmask),de
  3192. jr loop
  3193. ! LOR
  3194. lor.s0: ld e,(ix)
  3195. inc ix
  3196. ld a,d
  3197. or e
  3198. jr nz,1f
  3199. push bc
  3200. jr loop
  3201. 1: ld hl,-1
  3202. adc hl,de
  3203. jr nz,1f
  3204. add hl,sp
  3205. jr phl
  3206. 1: ld hl,(hp)
  3207. jr phl
  3208. ! STR
  3209. str.s0: ld e,(ix)
  3210. inc ix
  3211. ld a,d
  3212. or e
  3213. jr nz,1f
  3214. pop bc
  3215. jr loop
  3216. 1: pop hl
  3217. dec de
  3218. ld a,d
  3219. or e
  3220. jr nz,1f
  3221. ld sp,hl
  3222. jr loop
  3223. 1: ld (hp),hl
  3224. jr loop
  3225. ! Floating point calling routines
  3226. loadfregs:
  3227. pop hl
  3228. pop de
  3229. ld (fpac),de
  3230. pop de
  3231. ld (fpac+2),de
  3232. pop de
  3233. ld (fpop),de
  3234. pop de
  3235. ld (fpop+2),de
  3236. jp (hl)
  3237. dofltop:
  3238. call loadfregs
  3239. push bc
  3240. push ix
  3241. ld hl,1f
  3242. push hl
  3243. push iy
  3244. ret ! really a call
  3245. 1:
  3246. pop ix
  3247. pop bc
  3248. ld hl,(fpac+2)
  3249. push hl
  3250. ld hl,(fpac)
  3251. jr phl
  3252. pop4:
  3253. pop hl
  3254. or h
  3255. jr nz,9f
  3256. ld a,l
  3257. cp 4
  3258. jr nz,9f
  3259. jp (iy)
  3260. arg4:
  3261. or d
  3262. jr nz,9f
  3263. ld a,(ix)
  3264. inc ix
  3265. cp 4
  3266. jr nz,9f
  3267. jp (iy)
  3268. 9: jr unimpld
  3269. adf.z: ld iy,doadf
  3270. jr pop4
  3271. adf.l: ld d,(ix)
  3272. inc ix
  3273. adf.s0: ld iy,doadf
  3274. jr arg4
  3275. doadf:
  3276. ld iy,fpadd ! routine to call
  3277. jr dofltop
  3278. sbf.z: ld iy,dosbf
  3279. jr pop4
  3280. sbf.l: ld d,(ix)
  3281. inc ix
  3282. sbf.s0: ld iy,dosbf
  3283. jr arg4
  3284. dosbf:
  3285. ld iy,fpsub ! routine to call
  3286. jr dofltop
  3287. mlf.z: ld iy,domlf
  3288. jr pop4
  3289. mlf.l: ld d,(ix)
  3290. inc ix
  3291. mlf.s0: ld iy,domlf
  3292. jr arg4
  3293. domlf:
  3294. ld iy,fpmult ! routine to call
  3295. jr dofltop
  3296. dvf.z: ld iy,dodvf
  3297. jr pop4
  3298. dvf.l: ld d,(ix)
  3299. inc ix
  3300. dvf.s0: ld iy,dodvf
  3301. jr arg4
  3302. dodvf:
  3303. ld iy,fpdiv ! routine to call
  3304. jr dofltop
  3305. cmf.z: ld iy,docmf
  3306. jr pop4
  3307. cmf.l: ld d,(ix)
  3308. inc ix
  3309. cmf.s0: ld iy,docmf
  3310. jr arg4
  3311. docmf:
  3312. call loadfregs
  3313. push bc
  3314. push ix
  3315. call fpcmf
  3316. pop ix
  3317. pop bc
  3318. ld hl,(fpac)
  3319. jr phl
  3320. cfi.z:
  3321. pop de
  3322. call chk24
  3323. .word 1f,0f
  3324. 1: ld iy,1f
  3325. jr pop4
  3326. 1: pop hl
  3327. ld (fpac),hl
  3328. pop hl
  3329. ld (fpac+2),hl
  3330. push bc
  3331. push ix
  3332. call fpcfi
  3333. pop ix
  3334. pop bc
  3335. ld hl,(fpac)
  3336. jr phl
  3337. 0: ld iy,1f
  3338. jr pop4
  3339. 1: pop hl
  3340. ld (fpac),hl
  3341. pop hl
  3342. ld (fpac+2),hl!
  3343. push bc
  3344. push ix
  3345. call fpcfd
  3346. jr 8f
  3347. cif.z:
  3348. ld iy,1f
  3349. jr pop4
  3350. 1:
  3351. pop de
  3352. call chk24
  3353. .word 1f,0f
  3354. 1: pop hl
  3355. ld (fpac),hl
  3356. push bc
  3357. push ix
  3358. call fpcif
  3359. 8: pop ix
  3360. pop bc
  3361. ld hl,(fpac+2)
  3362. push hl
  3363. ld hl,(fpac)
  3364. jr phl
  3365. 0: pop hl
  3366. ld (fpac),hl
  3367. pop hl
  3368. ld (fpac+2),hl
  3369. push bc
  3370. push ix
  3371. call fpcdf
  3372. jr 8b
  3373. ngf.l: ld d,(ix)
  3374. inc ix
  3375. ld iy,1f
  3376. jr arg4
  3377. ngf.z:
  3378. ld iy,1f
  3379. jr pop4
  3380. 1: pop hl
  3381. ld (fpac),hl
  3382. pop hl
  3383. ld (fpac+2),hl
  3384. push bc
  3385. push ix
  3386. call fpcomp
  3387. jr 8b
  3388. fif.z:
  3389. ld iy,1f
  3390. jr pop4
  3391. fif.l:
  3392. ld d,(ix)
  3393. inc ix
  3394. ld iy,1f
  3395. jr arg4
  3396. 1: call loadfregs
  3397. push bc
  3398. push ix
  3399. call fpfif
  3400. pop ix
  3401. pop bc
  3402. ld hl,(fpac+2)
  3403. push hl
  3404. ld hl,(fpac)
  3405. push hl
  3406. ld hl,(fpop+2)
  3407. push hl
  3408. ld hl,(fpop)
  3409. jr phl
  3410. fef.z:
  3411. ld iy,1f
  3412. jr pop4
  3413. fef.l:
  3414. ld d,(ix)
  3415. inc ix
  3416. ld iy,1f
  3417. jr arg4
  3418. 1: pop hl
  3419. ld (fpop),hl
  3420. pop hl
  3421. ld (fpop+2),hl
  3422. push bc
  3423. push ix
  3424. call fpfef
  3425. pop ix
  3426. pop bc
  3427. ld hl,(fpop+2)
  3428. push hl
  3429. ld hl,(fpop)
  3430. push hl
  3431. ld hl,(fpac)
  3432. jr phl
  3433. ! double aritmetic
  3434. adi.4:
  3435. push bc
  3436. pop iy
  3437. pop hl
  3438. pop de
  3439. pop bc
  3440. add hl,bc
  3441. ex de,hl
  3442. pop bc
  3443. adc hl,bc
  3444. push hl
  3445. push de
  3446. push iy
  3447. pop bc
  3448. jr loop
  3449. sbi.4:
  3450. push bc
  3451. pop iy
  3452. pop bc
  3453. pop de
  3454. pop hl
  3455. sbc hl,bc
  3456. ex de,hl
  3457. ld b,h
  3458. ld c,l
  3459. pop hl
  3460. 9:
  3461. sbc hl,bc
  3462. push hl
  3463. push de
  3464. push iy
  3465. pop bc
  3466. jr loop
  3467. ngi.4:
  3468. push bc
  3469. pop iy
  3470. ld hl,0
  3471. pop de
  3472. sbc hl,de
  3473. ex de,hl
  3474. ld hl,0
  3475. pop bc
  3476. jr 9b
  3477. mli.4:
  3478. ld iy,.mli4
  3479. 0:
  3480. ld (retarea),bc
  3481. ld (retarea+2),ix
  3482. ld hl,1f
  3483. push hl
  3484. push iy
  3485. ret
  3486. 1:
  3487. ld bc,(retarea)
  3488. ld ix,(retarea+2)
  3489. jr loop
  3490. dvu.4:
  3491. ld iy,.dvu4
  3492. jr 0b
  3493. dvi.4:
  3494. ld iy,.dvi4
  3495. jr 0b
  3496. ! list of not yet implemented instructions
  3497. cuf.z:
  3498. cff.z:
  3499. cfu.z:
  3500. unimpld: ! used in dispatch table to
  3501. ! catch unimplemented instructions
  3502. ld hl,EILLINS
  3503. 9: push hl
  3504. jr trp.z
  3505. eilsize:
  3506. ld hl,EILLSIZE
  3507. jr 9b
  3508. e.case:
  3509. ld hl,ECASE
  3510. jr 9b
  3511. e.mon:
  3512. ld hl,EMON
  3513. jr 9b
  3514. e.array:
  3515. push af
  3516. ld a,(ignmask)
  3517. bit 0,a
  3518. jr nz,8f
  3519. ld hl,EARRAY
  3520. jr 9b
  3521. e.rck:
  3522. push af
  3523. ld a,(ignmask)
  3524. bit 1,a
  3525. jr nz,8f
  3526. ld hl,ERANGE
  3527. jr 9b
  3528. 8:
  3529. pop af
  3530. ret
  3531. long2: ld a,(ix)
  3532. inc ix
  3533. or a
  3534. jr nz,unimpld
  3535. ld a,(ix)
  3536. inc ix
  3537. cp 2
  3538. jr nz,unimpld
  3539. xor a ! clear carry
  3540. ret
  3541. ! monitor instruction
  3542. ! a small collection of UNIX system calls implemented under CP/M
  3543. ux_indir=e.mon
  3544. ux_fork=e.mon
  3545. ux_wait=e.mon
  3546. ux_link=e.mon
  3547. ux_exec=e.mon
  3548. ux_chdir=e.mon
  3549. ux_mknod=e.mon
  3550. ux_chmod=e.mon
  3551. ux_chown=e.mon
  3552. ux_break=e.mon
  3553. ux_stat=e.mon
  3554. ux_seek=e.mon
  3555. ux_mount=e.mon
  3556. ux_umount=e.mon
  3557. ux_setuid=e.mon
  3558. ux_getuid=e.mon
  3559. ux_stime=e.mon
  3560. ux_ptrace=e.mon
  3561. ux_alarm=e.mon
  3562. ux_fstat=e.mon
  3563. ux_pause=e.mon
  3564. ux_utime=e.mon
  3565. ux_stty=e.mon
  3566. ux_gtty=e.mon
  3567. ux_access=e.mon
  3568. ux_nice=e.mon
  3569. ux_sync=e.mon
  3570. ux_kill=e.mon
  3571. ux_dup=e.mon
  3572. ux_pipe=e.mon
  3573. ux_times=e.mon
  3574. ux_prof=e.mon
  3575. ux_unused=e.mon
  3576. ux_setgid=e.mon
  3577. ux_getgid=e.mon
  3578. ux_sig=e.mon
  3579. ux_umask=e.mon
  3580. ux_chroot=e.mon
  3581. EPERM = 1
  3582. ENOENT = 2
  3583. ESRCH = 3
  3584. EINTR = 4
  3585. EIO = 5
  3586. ENXIO = 6
  3587. E2BIG = 7
  3588. ENOEXEC = 8
  3589. EBADF = 9
  3590. ECHILD = 10
  3591. EAGAIN = 11
  3592. ENOMEM = 12
  3593. EACCES = 13
  3594. EFAULT = 14
  3595. ENOTBLK = 15
  3596. EBUSY = 16
  3597. EEXIST = 17
  3598. EXDEV = 18
  3599. ENODEV = 19
  3600. ENOTDIR = 20
  3601. EISDIR = 21
  3602. EINVAL = 22
  3603. ENFILE = 23
  3604. EMFILE = 24
  3605. ENOTTY = 25
  3606. ETXTBSY = 26
  3607. EFBIG = 27
  3608. ENOSPC = 28
  3609. ESPIPE = 29
  3610. EROFS = 30
  3611. EMLINK = 31
  3612. EPIPE = 32
  3613. EDOM = 33
  3614. ! Structure of filearea maintained by this implementation
  3615. ! First iobuffer of 128 bytes
  3616. ! Then the fcb area of 36 bytes
  3617. ! The number of bytes left in the buffer, 1 byte
  3618. ! The iopointer into the buffer, 2 bytes
  3619. ! The openflag 0 unused, 1 reading, 2 writing, 1 byte
  3620. ! The filedescriptor starting at 3, 1 byte
  3621. ! The number of CTRL-Zs that have been absorbed, 1 byte
  3622. ! The byte read after a sequence of CTRL-Zs, 1 byte
  3623. maxfiles=8
  3624. filesize=128+36+1+2+1+1+1+1
  3625. filefcb=0 ! pointers point to fcb
  3626. position=33
  3627. nleft=36
  3628. iopointer=37
  3629. openflag=39
  3630. fildes=40
  3631. zcount=41
  3632. zsave=42
  3633. .errnz filefcb
  3634. 0: .space maxfiles*filesize
  3635. filearea = 0b+128
  3636. sibuf:
  3637. .word 0
  3638. .space 82
  3639. siptr: .space 2
  3640. saveargs:
  3641. .space 128
  3642. argv: .space 40 ! not more than 20 args
  3643. argc: .space 2
  3644. ttymode:.byte 9,9,8,21;.short 06310+RAW*040 ! raw = 040
  3645. uxinit:
  3646. xor a
  3647. ld c,maxfiles
  3648. ld hl,0b
  3649. 1: ld b,filesize
  3650. 2: ld (hl),a
  3651. inc hl
  3652. djnz 2b
  3653. dec c
  3654. jr nz,1b
  3655. ret
  3656. uxfinish:
  3657. ld a,maxfiles-1
  3658. 1: push af
  3659. call closefil
  3660. pop af
  3661. dec a
  3662. cp 0377
  3663. jr nz,1b
  3664. ret
  3665. makeargv:
  3666. ld hl,0x80
  3667. ld de,saveargs
  3668. ld bc,128
  3669. ldir
  3670. ld hl,saveargs
  3671. ld e,(hl)
  3672. inc hl
  3673. ld d,0
  3674. add hl,de
  3675. ld (hl),0
  3676. ld hl,saveargs+1
  3677. ld ix,argv
  3678. 1: ld a,(hl)
  3679. or a
  3680. jr z,9f
  3681. cp ' '
  3682. jr nz,2f
  3683. 4: ld (hl),0
  3684. inc hl
  3685. jr 1b
  3686. 2: ld (ix),l
  3687. inc ix
  3688. ld (ix),h
  3689. inc ix
  3690. 3: inc hl
  3691. ld a,(hl)
  3692. or a
  3693. jr z,9f
  3694. cp ' '
  3695. jr nz,3b
  3696. jr 4b
  3697. 9: push ix
  3698. pop hl
  3699. ld de,-argv
  3700. add hl,de
  3701. srl h;rr l
  3702. ld (argc),hl
  3703. ld (ix+0),0
  3704. ld (ix+1),0
  3705. ret
  3706. mon.z:
  3707. pop de ! system call number
  3708. xor a
  3709. or d
  3710. jr nz,unimpld ! too big
  3711. ld a,e
  3712. and 0300 ! only 64 system calls
  3713. jr nz,unimpld
  3714. sla e
  3715. ld hl,systab
  3716. add hl,de
  3717. ld e,(hl)
  3718. inc hl
  3719. ld d,(hl)
  3720. ex de,hl
  3721. jp (hl)
  3722. systab:
  3723. .word ux_indir
  3724. .word ux_exit
  3725. .word ux_fork
  3726. .word ux_read
  3727. .word ux_write
  3728. .word ux_open
  3729. .word ux_close
  3730. .word ux_wait
  3731. .word ux_creat
  3732. .word ux_link
  3733. .word ux_unlink
  3734. .word ux_exec
  3735. .word ux_chdir
  3736. .word ux_time
  3737. .word ux_mknod
  3738. .word ux_chmod
  3739. .word ux_chown
  3740. .word ux_break
  3741. .word ux_stat
  3742. .word ux_seek
  3743. .word ux_getpid
  3744. .word ux_mount
  3745. .word ux_umount
  3746. .word ux_setuid
  3747. .word ux_getuid
  3748. .word ux_stime
  3749. .word ux_ptrace
  3750. .word ux_alarm
  3751. .word ux_fstat
  3752. .word ux_pause
  3753. .word ux_utime
  3754. .word ux_stty
  3755. .word ux_gtty
  3756. .word ux_access
  3757. .word ux_nice
  3758. .word ux_ftime
  3759. .word ux_sync
  3760. .word ux_kill
  3761. .word unimpld
  3762. .word unimpld
  3763. .word unimpld
  3764. .word ux_dup
  3765. .word ux_pipe
  3766. .word ux_times
  3767. .word ux_prof
  3768. .word ux_unused
  3769. .word ux_setgid
  3770. .word ux_getgid
  3771. .word ux_sig
  3772. .word unimpld
  3773. .word unimpld
  3774. .word unimpld
  3775. .word unimpld
  3776. .word unimpld
  3777. .word ux_ioctl
  3778. .word unimpld
  3779. .word unimpld
  3780. .word unimpld
  3781. .word unimpld
  3782. .word ux_exece
  3783. .word ux_umask
  3784. .word ux_chroot
  3785. .word unimpld
  3786. .word unimpld
  3787. emptyfile:
  3788. ! searches for a free filestructure
  3789. ! returns pointer in iy, 0 if not found
  3790. ld iy,filearea
  3791. ld l,maxfiles
  3792. 1:
  3793. xor a
  3794. or (iy+openflag)
  3795. jr nz,3f
  3796. ld a,maxfiles+3
  3797. sub l
  3798. ld (iy+fildes),a
  3799. #ifdef CPM1
  3800. push bc
  3801. push iy
  3802. ld de,-128
  3803. add iy,de
  3804. push iy
  3805. pop de
  3806. ld c,setdma
  3807. call bdos
  3808. pop iy
  3809. pop bc
  3810. or a ! to clear C
  3811. #endif
  3812. ret
  3813. 3:
  3814. ld de,filesize
  3815. add iy,de
  3816. dec l
  3817. jr nz,1b
  3818. scf
  3819. ret
  3820. findfile:
  3821. ld iy,filearea
  3822. ld de,filesize
  3823. 0:
  3824. dec a
  3825. ret m
  3826. add iy,de
  3827. jr 0b
  3828. getchar:
  3829. push bc
  3830. push de
  3831. push hl
  3832. dec (iy+nleft)
  3833. jp p,0f
  3834. push iy
  3835. pop hl
  3836. ld de,-128
  3837. add hl,de
  3838. ld (iy+iopointer),l
  3839. ld (iy+iopointer+1),h
  3840. ex de,hl
  3841. push iy
  3842. ld c,setdma
  3843. call bdos
  3844. #ifdef CPM1
  3845. ld c,seqread
  3846. #else
  3847. ld c,randomread
  3848. #endif
  3849. pop de
  3850. call bdos
  3851. or a
  3852. jr z,1f
  3853. ld (iy+zcount),0
  3854. pop hl
  3855. pop de
  3856. pop bc
  3857. scf
  3858. ret
  3859. 1:
  3860. inc (iy+position)
  3861. jr nz,2f
  3862. inc (iy+position+1)
  3863. 2:
  3864. ld a,127
  3865. ld (iy+nleft),a
  3866. 0:
  3867. ld h,(iy+iopointer+1)
  3868. ld l,(iy+iopointer)
  3869. ld a,(hl)
  3870. inc hl
  3871. ld (iy+iopointer),l
  3872. ld (iy+iopointer+1),h
  3873. pop hl
  3874. pop de
  3875. pop bc
  3876. ret
  3877. or a
  3878. putchar:
  3879. push hl
  3880. ld h,(iy+iopointer+1)
  3881. ld l,(iy+iopointer)
  3882. ld (hl),a
  3883. dec (iy+nleft)
  3884. jr z,0f
  3885. inc hl
  3886. ld (iy+iopointer+1),h
  3887. ld (iy+iopointer),l
  3888. pop hl
  3889. ret
  3890. 0:
  3891. pop hl
  3892. flsbuf:
  3893. push hl
  3894. push de
  3895. push bc
  3896. push iy
  3897. pop hl
  3898. ld de,-128
  3899. add hl,de
  3900. ld (iy+iopointer+1),h
  3901. ld (iy+iopointer),l
  3902. ex de,hl
  3903. push iy
  3904. ld c,setdma
  3905. call bdos
  3906. pop de
  3907. #ifdef CPM1
  3908. ld c,seqwrite
  3909. #else
  3910. ld c,randomwrite
  3911. #endif
  3912. call bdos
  3913. or a
  3914. jr z,1f
  3915. pop bc
  3916. pop de
  3917. pop hl
  3918. scf
  3919. ret
  3920. 1:
  3921. inc (iy+position)
  3922. jr nz,2f
  3923. inc (iy+position+1)
  3924. 2:
  3925. ld a,128
  3926. ld (iy+nleft),a
  3927. ld b,a
  3928. push iy
  3929. pop hl
  3930. ld de,-128
  3931. add hl,de
  3932. ld a,26 ! ctrl z
  3933. 1: ld (hl),a
  3934. inc hl
  3935. djnz 1b
  3936. pop bc
  3937. pop de
  3938. pop hl
  3939. or a
  3940. ret
  3941. parsename:
  3942. ! parses file name pointed to by hl and fills in fcb
  3943. ! of the file pointed to by iy.
  3944. ! recognizes filenames as complicated as 'b:file.zot'
  3945. ! and as simple as 'x'
  3946. push bc
  3947. push iy
  3948. pop de
  3949. xor a
  3950. push de
  3951. ld b,36 ! sizeof fcb
  3952. 0: ld (de),a
  3953. inc de
  3954. djnz 0b
  3955. pop de
  3956. inc hl
  3957. ld a,(hl)
  3958. dec hl
  3959. cp ':' ! drive specified ?
  3960. jr nz,1f
  3961. ld a,(hl)
  3962. inc hl
  3963. inc hl
  3964. dec a
  3965. and 15
  3966. inc a ! now 1<= a <= 16
  3967. ld (de),a
  3968. 1: inc de
  3969. ld b,8 ! filename maximum of 8 characters
  3970. 1: ld a,(hl)
  3971. or a
  3972. jr nz,8f
  3973. dec hl
  3974. ld a,'.'
  3975. 8:
  3976. inc hl
  3977. cp '.'
  3978. jr z,2f
  3979. and 0177 ! no parity
  3980. bit 6,a
  3981. jr z,9f
  3982. and 0337 ! UPPER case
  3983. 9:
  3984. ld (de),a
  3985. inc de
  3986. djnz 1b
  3987. ld a,(hl)
  3988. inc hl
  3989. cp '.'
  3990. jr z,3f
  3991. ld a,' '
  3992. ld (de),a
  3993. inc de
  3994. ld (de),a
  3995. inc de
  3996. ld (de),a
  3997. pop bc
  3998. ret ! filenames longer than 8 are truncated
  3999. 2: ld a,' ' ! fill with spaces
  4000. 0: ld (de),a
  4001. inc de
  4002. djnz 0b
  4003. 3: ld b,3 ! length of extension
  4004. 1: ld a,(hl)
  4005. inc hl
  4006. or a
  4007. jr z,4f
  4008. cp 0100
  4009. jp m,2f
  4010. and 0137
  4011. 2: ld (de),a
  4012. inc de
  4013. djnz 1b
  4014. pop bc
  4015. ret
  4016. 4: ld a,' '
  4017. 0: ld (de),a
  4018. inc de
  4019. djnz 0b
  4020. pop bc
  4021. ret
  4022. ! various routines
  4023. ux_close:
  4024. pop hl
  4025. ld a,l
  4026. sub 3
  4027. jp m,1f
  4028. cp maxfiles
  4029. call m,closefil
  4030. 1: ld hl,0
  4031. jr phl
  4032. closefil:
  4033. call findfile
  4034. ld a,(iy+openflag)
  4035. or a
  4036. jr z,3f
  4037. ld (iy+openflag),0
  4038. cp 1
  4039. jr z,2f
  4040. ld a,(iy+nleft)
  4041. cp 128
  4042. jr z,2f
  4043. call flsbuf
  4044. 2:
  4045. push bc
  4046. push iy
  4047. pop de
  4048. ld c,close
  4049. call bdos
  4050. pop bc
  4051. 3: ret
  4052. ux_ioctl:
  4053. pop hl
  4054. ld a,l
  4055. sub 3
  4056. jp p,1f
  4057. pop hl
  4058. ld a,h
  4059. cp 't'
  4060. jr nz,e.mon
  4061. ld a,l
  4062. cp 8
  4063. jr z,tiocgetp
  4064. cp 9
  4065. jr z,tiocsetp
  4066. jr e.mon
  4067. 1: pop hl
  4068. pop hl
  4069. ld hl,-1
  4070. jr phl
  4071. tiocgetp:
  4072. pop de
  4073. ld hl,ttymode
  4074. 2: push bc
  4075. ld bc,6
  4076. ldir
  4077. ld h,b
  4078. ld l,c
  4079. pop bc
  4080. jr phl
  4081. tiocsetp:
  4082. pop hl
  4083. ld de,ttymode
  4084. jr 2b
  4085. ux_time:
  4086. call time4
  4087. jr loop
  4088. ux_ftime:
  4089. pop hl
  4090. ld (retarea+6),hl
  4091. call time4
  4092. ld hl,(retarea+6)
  4093. pop de
  4094. ld (hl),e
  4095. inc hl
  4096. ld (hl),d
  4097. inc hl
  4098. pop de
  4099. ld (hl),e
  4100. inc hl
  4101. ld (hl),d
  4102. inc hl
  4103. xor a
  4104. ld (hl),a
  4105. inc hl
  4106. ld (hl),a
  4107. inc hl
  4108. ld (hl),a
  4109. inc hl
  4110. ld (hl),a
  4111. inc hl
  4112. ld (hl),a
  4113. inc hl
  4114. ld (hl),a
  4115. jr loop
  4116. time4:
  4117. pop hl
  4118. ld (retarea),bc
  4119. ld (retarea+2),ix
  4120. ld (retarea+4),hl
  4121. ld hl,(timebuf+2)
  4122. push hl
  4123. ld hl,(timebuf)
  4124. push hl
  4125. ld hl,0
  4126. push hl
  4127. ld hl,50
  4128. push hl
  4129. call .dvu4
  4130. ld bc,(retarea)
  4131. ld ix,(retarea+2)
  4132. ld hl,(retarea+4)
  4133. jp (hl)
  4134. ux_exit:
  4135. call uxfinish
  4136. ld c,reset
  4137. call bdos
  4138. ! no return
  4139. ux_creat:
  4140. call emptyfile
  4141. jr c,openfailed
  4142. pop hl
  4143. call parsename
  4144. pop hl ! file mode, not used under CP/M
  4145. push bc
  4146. push iy
  4147. push iy
  4148. pop de
  4149. ld c,delete
  4150. call bdos
  4151. pop de
  4152. ld c,makefile
  4153. call bdos
  4154. pop bc
  4155. ld l,1
  4156. jr afteropen
  4157. ux_open:
  4158. call emptyfile
  4159. jr nc,1f
  4160. openfailed:
  4161. pop hl
  4162. pop hl ! remove params
  4163. ld hl,EMFILE
  4164. push hl
  4165. jr phl
  4166. 1:
  4167. pop hl ! filename
  4168. call parsename
  4169. push bc
  4170. ld c,open
  4171. push iy
  4172. pop de
  4173. call bdos
  4174. pop bc
  4175. pop hl
  4176. afteropen:
  4177. inc a
  4178. jr nz,1f
  4179. ld hl,ENOENT
  4180. push hl
  4181. jr phl
  4182. 1:
  4183. inc l
  4184. ld (iy+openflag),l
  4185. xor a
  4186. ld (iy+nleft),a
  4187. ld (iy+zcount),a
  4188. ld (iy+zsave),26
  4189. bit 1,l
  4190. jr z,2f
  4191. ld (iy+nleft),128
  4192. 2:
  4193. ld (iy+position),a
  4194. ld (iy+position+1),a
  4195. push iy
  4196. pop hl
  4197. push bc
  4198. ld b,128
  4199. 3: dec hl
  4200. ld (hl),26
  4201. djnz 3b
  4202. pop bc
  4203. ld (iy+iopointer+1),h
  4204. ld (iy+iopointer),l
  4205. ld h,a
  4206. ld l,(iy+fildes)
  4207. push hl
  4208. ld l,a
  4209. jr phl
  4210. ux_read:
  4211. pop hl
  4212. ld a,l
  4213. sub 3
  4214. jp p,readfile
  4215. ld a,(ttymode+4)
  4216. bit 5,a
  4217. jr z,1f ! not raw
  4218. push bc
  4219. #ifdef CPM1
  4220. !raw echo interface
  4221. ld c,consolein
  4222. call bdos
  4223. #else
  4224. !no echo interface
  4225. 4:
  4226. ld c,diconio
  4227. ld e,0xff
  4228. call bdos
  4229. or a
  4230. jr z,4b
  4231. !end of no echo interface
  4232. #endif
  4233. pop bc
  4234. pop hl
  4235. ld (hl),a
  4236. pop hl
  4237. ld hl,1
  4238. push hl
  4239. ld hl,0
  4240. jr phl
  4241. 1:
  4242. ld hl,sibuf+1 ! read from console assumed
  4243. dec (hl)
  4244. jp p,2f
  4245. dec hl ! go read console line
  4246. ld (hl),80 ! max line length
  4247. push bc
  4248. push hl
  4249. ld c,readconsole
  4250. ex de,hl
  4251. call bdos
  4252. ld c,writeconsole
  4253. ld e,'\n'
  4254. call bdos
  4255. pop hl
  4256. pop bc
  4257. inc hl
  4258. inc (hl)
  4259. ld (siptr),hl ! ready for transfer
  4260. push hl
  4261. ld e,(hl)
  4262. ld d,0
  4263. add hl,de
  4264. ld (hl),'\r'
  4265. inc hl
  4266. ld (hl),'\n'
  4267. pop hl
  4268. 2:
  4269. push bc
  4270. pop iy
  4271. ld b,(hl)
  4272. inc b ! bytes remaining
  4273. pop hl ! copy to
  4274. pop de ! bytes wanted (probably 512)
  4275. push iy
  4276. ld iy,(siptr) ! copy from
  4277. xor a ! find out minimum of ramaining and wanted
  4278. or d
  4279. jr nz,3f ! more than 255 wanted (forget that)
  4280. ld a,b
  4281. cp e
  4282. jp m,3f ! not enough remaining
  4283. ld b,e
  4284. 3:
  4285. ld c,b ! keep copy
  4286. 0:
  4287. inc iy
  4288. ld a,(iy)
  4289. ld (hl),a
  4290. inc hl
  4291. djnz 0b
  4292. ld a,(sibuf+1)
  4293. sub c
  4294. inc a
  4295. ld (sibuf+1),a
  4296. ld (siptr),iy
  4297. pop hl
  4298. push bc
  4299. ld c,b
  4300. push bc ! load 0
  4301. ld b,h
  4302. ld c,l
  4303. jr loop
  4304. readfile:
  4305. call findfile
  4306. pop de
  4307. pop hl ! count
  4308. push bc
  4309. ld bc,0
  4310. 0:
  4311. xor a
  4312. or l
  4313. jr z,1f
  4314. dec l
  4315. 3:
  4316. ! warning: this may not work if zcount overflows
  4317. ld a,(iy+zcount)
  4318. or a
  4319. jr nz,5f
  4320. ld a,(iy+zsave)
  4321. cp 26
  4322. jr z,4f
  4323. ld (iy+zsave),26
  4324. jr 8f
  4325. 4:
  4326. call getchar
  4327. jr c,2f
  4328. ld (de),a
  4329. sub 26 ! CTRL-Z
  4330. jr z,7f
  4331. ld a,(iy+zcount)
  4332. or a
  4333. jr z,6f
  4334. ld a,(de)
  4335. ld (iy+zsave),a
  4336. 5:
  4337. ld a,26
  4338. dec (iy+zcount)
  4339. 8:
  4340. ld (de),a
  4341. 6:
  4342. inc de
  4343. inc bc
  4344. jr 0b
  4345. 1:
  4346. dec l
  4347. dec h
  4348. jp p,3b
  4349. 2:
  4350. pop hl
  4351. push bc
  4352. ld b,h
  4353. ld c,l
  4354. ld hl,0
  4355. jr phl
  4356. 7:
  4357. inc (iy+zcount)
  4358. jr 4b
  4359. ux_write:
  4360. pop hl
  4361. ld a,l
  4362. sub 3
  4363. jp p,writefile
  4364. pop hl ! buffer address
  4365. pop de ! count
  4366. push de
  4367. ld iy,0
  4368. push iy
  4369. push bc
  4370. ld b,e ! count now in 'db'
  4371. 0:
  4372. ld a,b
  4373. or a
  4374. jr nz,1f
  4375. ld a,d
  4376. or a
  4377. jr nz,2f
  4378. pop bc
  4379. jr loop
  4380. 2:
  4381. dec d
  4382. 1:
  4383. dec b
  4384. ld e,(hl)
  4385. inc hl
  4386. push bc
  4387. push de
  4388. push hl
  4389. ld c,writeconsole
  4390. call bdos
  4391. pop hl
  4392. pop de
  4393. pop bc
  4394. jr 0b
  4395. writefile:
  4396. call findfile
  4397. pop de
  4398. pop hl ! count
  4399. push bc
  4400. ld bc,0
  4401. 0:
  4402. xor a
  4403. or l
  4404. jr z,1f
  4405. dec l
  4406. 3:
  4407. ld a,(de)
  4408. inc de
  4409. call putchar
  4410. jr c,4f
  4411. inc bc
  4412. jr 0b
  4413. 1:
  4414. dec l
  4415. dec h
  4416. jp p,3b
  4417. ld iy,0
  4418. 2:
  4419. pop hl
  4420. push bc
  4421. ld b,h
  4422. ld c,l
  4423. push iy
  4424. jr loop
  4425. 4:
  4426. ld iy,ENOSPC
  4427. jr 2b
  4428. ux_unlink:
  4429. pop hl
  4430. ld iy,fcb
  4431. call parsename
  4432. push bc
  4433. ld c,delete
  4434. ld de,fcb
  4435. call bdos
  4436. pop bc
  4437. inc a
  4438. jr nz,1f
  4439. ld hl,ENOENT
  4440. jr phl
  4441. 1:
  4442. ld hl,0
  4443. jr phl
  4444. ux_getpid:
  4445. ld hl,12345 ! nice number
  4446. jr phl
  4447. ux_exece:
  4448. ld iy,fcb
  4449. pop hl
  4450. call parsename
  4451. pop hl
  4452. ld b,h;ld c,l
  4453. pop iy
  4454. ld ix,0x82
  4455. ld (ix-1),' '
  4456. 4: ld h,b;ld l,c
  4457. 3: ld e,(hl)
  4458. inc hl
  4459. ld d,(hl)
  4460. inc hl
  4461. ld b,h;ld c,l
  4462. ex de,hl
  4463. ld a,h
  4464. or l
  4465. jr z,1f
  4466. 2:
  4467. ld a,(hl)
  4468. inc hl
  4469. ld (ix),a
  4470. inc ix
  4471. or a
  4472. jr nz,2b
  4473. ld (ix-1),' '
  4474. jr 4b
  4475. 1:
  4476. ld (ix),'X'
  4477. ld (ix+1),'\r'
  4478. ld (ix+2),'\n'
  4479. ld (ix+3),'$'
  4480. ld de,0x81
  4481. push ix
  4482. ld c,printstring
  4483. call bdos
  4484. pop hl
  4485. ld de,-129
  4486. add hl,de
  4487. ld a,l
  4488. ld (0x80),a
  4489. jr warmstart
  4490. dispat1: ! base for escaped opcodes
  4491. .word aar.l, aar.z, adf.l, adf.z, adi.l, adi.z, ads.l, ads.z
  4492. .word adu.l, adu.z, and.l, and.z, asp.l, ass.l, ass.z, bge.l
  4493. .word bgt.l, ble.l, blm.l, bls.l, bls.z, blt.l, bne.l, cai.z
  4494. .word cal.l, cfi.z, cfu.z, ciu.z, cmf.l, cmf.z, cmi.l, cmi.z
  4495. .word cms.l, cms.z, cmu.l, cmu.z, com.l, com.z, csa.l, csa.z
  4496. .word csb.l, csb.z, cuf.z, cui.z, cuu.z, dee.l, del.p, del.n
  4497. .word dup.l, dus.l, dus.z, dvf.l, dvf.z, dvi.l, dvi.z, dvu.l
  4498. .word dvu.z, fef.l, fef.z, fif.l, fif.z, inl.p, inl.n, inn.l
  4499. .word inn.z, ior.l, ior.z, lar.l, lar.z, ldc.l, ldf.l, ldl.p
  4500. .word ldl.n, lfr.l, lil.p, lil.n, lim.z, los.l, los.z, lor.s0
  4501. .word lpi.l, lxa.l, lxl.l, mlf.l, mlf.z, mli.l, mli.z, mlu.l
  4502. .word mlu.z, mon.z, ngf.l, ngf.z, ngi.l, ngi.z, nop.z, rck.l
  4503. .word rck.z, ret.l, rmi.l, rmi.z, rmu.l, rmu.z, rol.l, rol.z
  4504. .word ror.l, ror.z, rtt.z, sar.l, sar.z, sbf.l, sbf.z, sbi.l
  4505. .word sbi.z, sbs.l, sbs.z, sbu.l, sbu.z, sde.l, sdf.l, sdl.p
  4506. .word sdl.n, set.l, set.z, sig.z, sil.p, sil.n, sim.z, sli.l
  4507. .word sli.z, slu.l, slu.z, sri.l, sri.z, sru.l, sru.z, sti.l
  4508. .word sts.l, sts.z, str.s0, tge.z, tle.z, trp.z, xor.l, xor.z
  4509. .word zer.l, zer.z, zge.l, zgt.l, zle.l, zlt.l, zne.l, zrf.l
  4510. .word zrf.z, zrl.p, dch.z, exg.s0, exg.l, exg.z, lpb.z
  4511. dispat2: ! base for 4 byte offsets
  4512. .word ldc.f
  4513. ignmask: .word 0 ! ignore mask (variable)
  4514. retarea: .word 0 ! base of buffer for result values (max 8 bytes)
  4515. .word 0
  4516. .word 0
  4517. .word 0
  4518. trapproc:
  4519. .word 0
  4520. nextp: .byte 0
  4521. header:
  4522. ntext: .word 0
  4523. ndata: .word 0
  4524. nproc: .word 0
  4525. entry: .word 0
  4526. nline: .word 0
  4527. hp: .word 0
  4528. pb: .word 0
  4529. pd: .word 0