em.s 54 KB

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