.he Page # EXECUTOR(tm) User's Manual (C) 1982 EXECUTOR(tm) Version 2.0 User's Manual Copyright 1982 by George Massar, Sr. and Kelly Smith - Introduction - EXECUTOR(tm©  ió  á powerfuì 'batcè processor§ foò uså  witè CP/M-80¬   aó   á  replacmenô  foò  Digitaì  Research'ó   limiteä capabilitù  SUBMIÔ  anä  XSU  utilities®  EXECUTOR(tm©  haó  nï constraintó  aó  tï whicè drivå thaô iô musô bå residenô  oî  foò executioî (SUBMIÔ musô bå residenô oî youò CP/M-8° 'A§ disk)¬ noò doeó  iô  requirå  anù additionaì supporô  fileó  foò  unattendeä consolå  inpuô embeddeä withiî youò 'batcè file§ (SUBMIÔ requireó thå additionaì envocatioî oæ XSUB). EXECUTOR(tm©  workó  oî  thå principaì  oæ  á  'stackeä  joâ stream'¬  allowinç nesteä leveló oæ uð tï eighô jobó witè variouó useò defineä controì parameters¬  sucè aó commentary¬ useò query¬ true/falså  parameteò  control¬  "quiet¢  operation¬  etc®  Youò 'batch§  fileó  (oæ filetypå '.JOB'© arå createä usinç  anù  texô editoò (ED¬ WORDMASTER¬ WORDSTAR¬ etc.)¬ witè thå samå techniqueó thaô  yoõ  formallù useä foò creatinç submiô fileó  foò  CP/M-80® Additionally¬ yoõ maù chooså tï noô uså aî editoò tï creatå á joâ filå  aô all¡  Simplù invokå EXECUTOR(tm© withouô á trailinç joâ commanä  argument¬  anä yoõ caî immediatelù inpuô á  joâ  commanä streaí witè thå EXECUTOR(tm© on-linå editoò mode. Youò  currenô submiô fileó (oæ filetypå '.SUB'© wilì executå thå samå aó theù diä witè SUBMIT¬ buô wilì noô requirå invocatioî oæ  XSU tï responä tï embeddeä consolå input®  Notå also¬  thaô EXECUTOR(tm©  doeó noô requirå additionaì disë spacå foò  supporô oæ itó operatioî (i.e.¬  doeó noô creatå á temporarù 'worë file'¬ aó doeó SUBMIÔ whicè musô creatå anä uså á filå nameä '$$$.SUB'). EXECUTOR(tm© wilì indicatå itó systeí activitù oî á line-by- linå  basió tï thå consolå display¬  preceedinç eacè linå witè  á '+§ character. - Getting Started with EXECUTOR(tm) - Variouó exampleó oæ joâ streaí possibilitieó arå provideä oî youò diskettå iî additioî tï thå EXECUTOR(tm© filå 'EXEC.COM'¬ aó possiblå configurationó oæ specializeä taskó thaô yoõ maù wisè tï invoke® Theù arå aó follows: .fo(Information Contained Herein is Proprietary to George Massar) .pa Š - JOB 1 (JOB1.JOB) - 'JOB1.JOB§  ió  á simplå joâ streaí withouô  anù  particulaò speciaì  featureó  (thå samå aó yoõ mighô executå witè  CP/M-80'ó SUBMIÔ anä XSUB)®  Iô simplù assembleó á filå (FOO.ASM)¬ createó aî  executablå  objecô  filå  (FOO.COM¬   froí  FOO.HEX)¬  eraseó 'FOO.HEX'¬  anä theî executeó 'FOO.COM'®  Herå ió thå joâ streaí sequencå foò 'JOB1.JOB': A:ASM FOO <-- get ASM.COM from 'A', assemble 'FOO' on logged disk A:LOAD FOO <-- load 'FOO.HEX' to 'FOO.COM' ERA FOO.HEX <-- erase 'FOO.HEX' FOO <-- execute 'FOO.COM' Thå followinç simplå assemblù languagå tesô filå  'FOO.ASM'¬ ió  representativå  oæ á typicaì prograí thaô outputó á  'messagå string§ tï thå useò consolå display: ; TEST PROGRAM TRUE EQU -1 FALSE EQU 0 DEBUG EQU FALSE ORG 100H LXI D,MSG MVI C,9 ; print string CALL 5 ; BDOS RET ; back to CCP MSG: DB 9,9,9 ; 3 tabs IF NOT DEBUG DB 'Hello, World $' ENDIF IF DEBUG DB 'Debug mode $' ENDIF END .pa Š Therefore¬  tï  invokå  EXECUTOR(tm© tï 'batcè process§  thå 'JOB1.JOB§  file¬  merelù  enteò thå followinç filenameó  aô  thå CP/M-8°  commanä  level¬   wherå  exec job1 <-- user invokes job stream without arguments. EXECUTOR(tm©  wilì theî procesó thå joâ streaí specifieä  iî the file 'JOB1.JOB' as follows: >>>Start execution +B>A:ASM FOO + +CP/M ASSEMBLER - VER 2.0 +011A +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + +FIRST ADDRESS 0100 +LAST ADDRESS 0119 +BYTES READ 001A +RECORDS WRITTEN 01 + +B>ERA FOO.HEX + +FOO .HEX +B>FOO + + Hello, World +B> >>>End execution B> - JOB 2A (JOB2A.JOB) - 'JOB2A.JOB§ ió agaiî á simplå joâ stream¬  buô witè á singlå commanä parameteò thaô ió substituteä intï thå joâ streaí commanä file®  Iî thió example¬  thå secondarù commanä leveì entrù  thaô yoõ  enteò  aô  thå  consolå keyboarä ió  substituteä  intï  eacè occurencå  oæ  '$1§ correspondinç tï thå actuaì parameteò  tï  bå includeä iî thå joâ stream: A:ASM $1 <-- get ASM.COM from 'A', assemble '$1' on logged disk. A:LOAD $1 <-- load $1.HEX to $1.COM. ERA $1.HEX <-- erase $1.HEX $1 <-- execute $1 .pa Š Therefore¬  tï  invokå EXECUTOR(tm© tï 'batcè  process§  thå 'JOB2A.JOB§ file¬  merelù enteò thå followinç filenameó includinç thå  singlå  joâ  parameteò (iî thió caså 'FOO'© aô  thå  CP/M-8° commanä level: B>exeã job2á foo>>Start execution +B>A:ASM FOO + +CP/M ASSEMBLER - VER 2.0 +011A +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + FIRST ADDRESS 0100 +LAST ADDRESS 0119 +BYTES READ 001A +RECORDS WRITTEN 01 + +B>ERA FOO.HEX + +B>FOO + + Hello, World + +B> >>>End execution B> Note¬  thaô uð tï ¹ argumentó maù bå specifieä correspondinç tï thå parameteò substitutioî oæ '$1§ tï '$9'. - JOB 2B (JOB2B.JOB) - 'JOB2B.JOB§  ió á joâ streaí demonstratinç thaô anù texô caî bå   inputteä  froí  thå  buffeò  storeä  bù   thå   EXECUTOR(tm© interpreteò  aó  iæ iô werå inputteä froí thå  consolå  keyboard® Foò  thió  example¬  wå  wilì ediô á  filå  specifieä  aó  á parameter¬  anä alsï inserô á conditionaì assemblù parameteò intï thå specifieä filå (Note¬  thaô somå additionaì featureó arå useä herå anä wilì bå explaineä iî detaiì later): A:ED $1.ASM <-- get ED.COM from 'A', and edit file '$1.ASM'. ##a <-- append all of the file, double '#' is required here. fDEBUG~zki <-- find 'DEBUG', kill the line, insert the next line. EQU $2 ~ze <-- end the edit session on file '1$.ASM'. .pa Š Therefore¬  tï  invokå  EXECUTOR(tm© tï 'batcè process§  thå 'JOB2B.JOB§ file¬  merelù enteò thå followinç filenameó includinç thå singlå joâ parameteò (iî thió caså 'FOO'© aó welì aó á  'texô string§ (TRUE© aô thå CP/M-8° commanä level: B>exeã job2â foï true>>Start execution +B>A:ED FOO.ASM + + : *#a + 1: *fDEBUG^Zki + 6: EQU TRUE + 7: + 7: *e + +B> >>>End execution B> Thå  editeä filå 'FOO.ASM§ wheî typeä foò displaù wilì  theî appear as follows on your console: ; TEST PROGRAM TRUE EQU -1 FALSE EQU 0 DEBUG EQU TRUE <-- behold, this statement is altered! ORG 100H LXI D,MSG MVI C,9 ; print string CALL 5 ; BDOS RET ; back to CCP MSG: DB 9,9,9 ; 3 tabs IF NOT DEBUG DB 'Hello, World $' ENDIF IF DEBUG DB 'Debug mode $' ENDIF END .pa Š - JOB 3 (JOB3.JOB) - 'JOB3.JOB§  ió á joâ streaí tasë witè thå additioî oæ á  fe÷ 'internal§  commenô entrieó (i.e.¬  wilì noô bå displayeä oî  thå console)®  Note¬  thaô alì commentó startinç witè á singlå semi- coloî  wilì  bå removeä completelù froí thå  EXECUTOR(tm©  buffeò durinç  thå interpretinç process®  Alsï note¬  thaô doublå semi- colonó wilì bå treateä aó á singlå semi-coloî anä wilì bå  storeä iî thå EXECUTOR(tm© buffer®  Anythinç followinç thå doublå semi- colonó  wilì  noô bå considereä aó á commenô buô wilì bå parô  oæ thå displayablå texô iî thå buffeò (seå JO 3). Aó á singlå semi-coloî example¬ thå filå 'JOB3.JOB§ includeó 'internal§ commentó aó follows: ; Move file to a specified drive A:PIP $2: = $1 ; copy file onto drive $2 ERA $1 ; remove file from the source disk Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå followinç joâ streaí controì parameters: B>exec job3 trek.xxx a>>Start execution +B> + +B>A:PIP A: = TREK.XXX + +B>ERA TREK.XXX + +B> >>>End execution B> .pa Š - JOB 4 (JOB4.JOB) - 'JOB4.JOB§  ió  á joâ streaí witè á miø  oæ  non-displayablå (i.e.¬   'internal'©   comments¬   anä  somå  displayablå  (i.e.¬ 'external'©  comments®  Alì  commentó startinç witè á  coloî  oò doublå  semi-coloî wilì bå storeä iî thå EXECUTOR(tm© buffeò  anä wilì bå displayeä durinç thå executioî phase®  Foò example¬  thió miø oæ non-displayablå anä displayablå commentarù mighô appeaò iî youò filå aó follows: ; Move file to a specified drive ; Usage: EXEC JOB4 ; : Warning! file will be deleted from the source disk : A:PIP $2: = $1 ; copy file onto drive $2 ERA $1 Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå followinç joâ streaí controì parameters: B>exec job4 a:trek.xxx b>>Start execution +B> + +B>: Warning! file(s) will be deleted from the source disk +B>: +B>A:PIP B: = A:TREK.XXX + +B>ERA A:TREK.XXX + +B> >>>End execution B> - JOB 5 - 'JOB5.JOB§  ió á joâ streaí witè somå parameteò  specifiers¬ wherå  anythinç  betweeî  '%n§  anä thå enä oæ  á  linå  wilì  bå displayeä  providinç  thaô  thå  correspondinç  argument(s©  werå intentionallù  oò unintentionallù omitteä froí thå commanä  line® Notå  also¬  thaô  thoså lineó witè parameteò specifieró arå  noô necessarilù iî numericaì order®  Eacè linå maù contaiî onlù  onå parameteò  specifier®  .pa Š Anù absent-mindeä professoò won'ô havå tï remembeò whaô lisô oæ  argumentó arå supposeä tï filì iî thå commanä linå  followinç thå joâ streaí filename¬ aó showî iî thå followinç example: ; Move file to a specified drive ; Usage: EXEC JOB4 ; : Warning! file will be deleted from the source disk : %1Enter ambiguous filename -> %2Enter destination drive -> A:PIP $2: = $1 ; copy file onto drive $2 ERA $1 ; watch out! Thereforå  EXECUTOR(tm© coulä bå executeä bù thå useò  aô  á minimuí level¬ witè thå followinç joâ streaí controì parameters: B>exeã job5trek.xxx <-- user inputs those arguments atthe console keyboard interactively Enter destination drive ->a <-- user specified disk drive >>>Start execution +B> + +B>: Warning! file will be deleted from the source disk +B>: +B>A:PIP a: = trek.xxx + +B>ERA trek.xxx + +B> >>>End execution B> .pa Š Iî thå nexô example¬ EXECUTOR(tm© ió executeä bù thå useò tï includå a 'second§ arguemenô iî thå 'JOB5' commanä level: B>exec job5 a:trek.xxx <-- the second argument is missing! Enter destination drive ->b <-- user inputs here >>>Start execution +B> + +B>: Warning! file will be deleted from the source disk +B>: +B>A:PIP b: = A:TREK.XXX + +B>ERA A:TREK.XXX + +B> >>>End execution B> - JOB 6 (JOB6.JOB) - 'JOB6.JOB§  ió  á joâ streaí witè  quoteä  arguments¬  wherå anythinç  encloseä witè á paiò oæ singlå quotatioî markó wilì  bå considereä  aó  á singlå argument®  Notå thaô iî  thå  followinç example¬ thå tildù (~© markeò ió useä insteaä oæ thå careô (^© tï avoiä  thå  confusioî  oæ thå conventionaì displaù oæ  á  controì code® Thå pairó (þ anä z© wilì bå converteä tï aî actuaì controì characteò iî thå EXECUTOR(tm© texô buffeò durinç thå interpretinç process: %1Enter filename -> %2Enter date -> A:PIP $1.DOC = $1.RAW ; make a copy for demo purpose A:ED $1.DOC 10A S*DATE*~z$2~z ; substitute DATE with the quoted argument E ERA $1.BAK TYPE $1.DOC ; show it with a new date .pa Š Thå followinç simplå tesô filå 'TEST.RAW'¬ ió representativå oæ  á  typicaì  portioî oæ á prograí oò documenô  thaô  coulä  bå modifieä  bù thå uså oæ singlå quoteä strinç aô thå useò  commanä level: This is test document. The lastest modification was on *DATE*. Blah, blah, .... End of doc Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå  followinç  joâ streaí controì parameters¬  notinç  thaô  alì parameteró havå beeî specified: B>exec job6 test '5 Apr 1900' <-- quoted argument. >>>Start execution +B>A:PIP TEST.DOC = TEST.RAW + +B>A:ED TEST.DOC + + : *10A + 1: *S*DATE*^Z5 APR 1900^Z + 3: *E + +B>ERA TEST.BAK + +B>TYPE TEST.DOC + +This is test document. + +The lastest modification was on 5 APR 1900. + +Blah, blah, .... + +End of doc + +B> >>>End execution B> .pa Š Also¬  EXECUTOR(tm©  coulä bå executeä bù thå useò witè  thå followinç joâ streaí controì parameters¬  wherå thå lasô argumenô haó noô beeî specified: B>exec job6 test <-- the last argument is missing! Enter date ->22 Dec 1944 <-- user inputs the argument, quotation marks are not needed. >>>Start execution +B>A:PIP TEST.DOC = TEST.RAW + +B>A:ED TEST.DOC + + : *10A + 1: *S*DATE*^Z22 Dec 1944^Z + 3: *E + +B>ERA TEST.BAK + +B>TYPE TEST.DOC + +This is test document. + +The lastest modification was on 22 DEC 1944. + +Blah, blah, .... + +End of doc + +B> >>>End execution B> .pa Š - JOB 7A (JOB7A.JOB) - 'JOB7A.JO  ió  á joâ streaí witè interventioî  codes®  Thå paiò þ anä Å iî thå nexô example¬ wilì bå converteä tï á Control- Å  codå  (^E©  anä  passeä  tï thå  EXECUTOR(tm©  buffeò  bù  thå interpreter®  Durinç  thå executioî phase¬  thå procesó wilì  bå "halted¢ aô thå momenô thå Control-Å codå ió encountereä foò  thå useò  intervention®  Thå 'batcè process§ wilì resumå aó sooî  aó thå  useò  presseó Control-Å manuallù (usuallù  markeä  'CNTÌ  oò 'CTRL§  oî  mosô consolå keyboards¬  wherå 'CNTL§ oò  'CTRL§  anä characteò  'E§  keyó arå presseä simultaneously)®  Iæ  thå  useò presseó Control-Ú instead¬  thå remaininç portioî oæ thå texô  iî thå  EXECUTOR(tm©  buffeò  aô thå currenô leveì wilì  bå  skippeä completelù ("currenô level¢ wilì bå explaineä later©: %1Enter .ASM filename -> A:ASM $1 :OK to load? (yes=cntl-E, no=cntl-Z) ~E ; pause for user to respond A:LOAD $1 ERA $1.HEX ; throw it away - who wants it? :Want to print listing? ~E A:PIP LST:=$1.PRN ERA $1.PRN ; throw it away, too - why save it? .pa Š Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå followinç joâ streaí controì parameters: B>exec job7a foo <-- useò invokeó joâ streaí >>>Start execution +B>A:ASM FOO + +CP/M ASSEMBLER - VER 2.0 +0118 +000H USE FACTOR +END OF ASSEMBLY + +B>:OK to load? (yes=cntl-E, no=cntl-Z) +B>^E <-- user presses CNTL-E +B>A:LOAD FOO + +FIRST ADDRESS 0100 +LAST ADDRESS 0117 +BYTES READ 0018 +RECORDS WRITTEN 01 + +B>ERA FOO.HEX + +B>:Want to print listing? +B>^Z <-- user presses CNTL-Z >>>End execution B> - JOB 7B (JOB7B) - 'JOB7B.JOB§ introduceó anotheò useò controì code¬  Control-Ó (~Ó iî thå followinç example)®  Thió pair¬  likå others¬ wilì bå converteä anä passeä tï thå EXECUTOR(tm© texô buffer® Durinç thå interventioî  mode¬  iæ  thå useò presseä  Control-Ú  insteaä  oæ Control-E¬  thaô  parô oæ thå remaininç texô iî thå  EXECUTOR(tm© buffeò wilì bå skippeä alì thå waù untiì á Control-Ó codå (~S© ió encountered¬  anä  theî thå 'batcè process§ wilì resumå witè  thå remaininç texô iî thå buffer. %1Enter .ASM filename -> A:ASM $1 :OK to load? (yes=cntl-E, no=cntl-Z) ~E ; pause for user to respond A:LOAD $1 ~S ; skip to this point ERA $1.HEX :Want to print listing? ~E A:PIP LST:=$1.PRN ~S ; skip to the second point ERA $1.PRN .pa Š Thereforå EXECUTOR(tm© woulä bå executeä bù thå  user¬  witè thå followinç joâ streaí controì parameters: B>exec job7b foo <-- useò invokeó joâ streaí >>>Start execution +B>A:ASM FOO +CP/M ASSEMBLER - VER 2.0 +0118 +000H USE FACTOR +END OF ASSEMBLY + +B>:OK to load? (yes=cntl-E, no=cntl-Z) +B>^Z <-- user presses CNTL-Z +B>ERA FOO.HEX +B>:Want to print listing? +B>^Z <-- user presses CNTL-Z +B>ERA FOO.PRN +B> >>>End execution B> .pa Š - JOB 8 (JOB8.JOB) - 'JOB8.JOB§ introduceó thå joâ streaí repeaô code¬  Control-Ò (~R)®  Á  useò maù presó Control-Ò durinç thå interventioî  modå anä anythinç previouslù inputteä bù thå EXECUTOR(tm© prograí wilì be repeated starting at the nearest Control-R code. For example: : Use to repeat the following commands;; otherwise, : use to exit ~R ; place repeat marker here : Insert blank disk in drive B and press ~E ; pause for user to respond FORMAT B ; this is to respond to "which drive?" PIP ; copy two files on ea. new disk B:=PIP.COM B:=STAT.COM ; Above is a blank line which responds to exit the PIP program. : Format again? ~E ; pause for user to decide Thå   followinç   simplå   assemblù   languagå   tesô   filå 'FORMAT.ASM'¬ ió representativå oæ á typicaì prograí thaô outputó á 'messagå string§ tï thå useò consolå display¬ requestinç "whicè disk to format": ; This is a dummy program for demo purpose. ORG 100H LXI D,MSG MVI C,9 ; print message CALL 5 ; BDOS MVI C,1 ; console input CALL 5 RET MSG: DB 'Which drive? $' END .pa Š Typicallù  theî  (foò formattinç disks)¬  yoõ woulä wanô  tï placå  youò  'JOB§ filå (iî thió  case¬  'JOB8.JOB'©  anä  formaô utilitù (FORMAT.COM© oî youò 'A§ disk¬ then: A>exec job8 <-- useò invokeó joâ streaí >>>Start execution +A>: Use to repeat the following commands; otherwise, +A>: use to exit +A> +A>: Insert blank disk in drive B and press +A>^E <-- user presses CNTL-E +A>FORMAT + +Which drive? B +A> +A> +A>PIP +*B:=PIP.COM +*B:=STAT.COM +* + +A>: Format again?^R <-- user presses CNTL-R +A>: Insert blank disk in drive B and press +A>^E <-- user presses CNTL-E +A>FORMAT + +Which drive? B +A> +A> +A>PIP +*B:=PIP.COM +*B:=STAT.COM +* + +A>: Format again?^E <-- user presses CNTL-E + +A> >>>End execution A> Notå  iî thå previouó example¬  thaô iô ió noô necessarù  tï inserô  Control-Ò  (~R© aô thå verù beginninç oæ thå  joâ  streaí text® Thå interpreteò doeó thaô foò you! .pa Š - JOB 9 (JOB9.JOB) - 'JOB9.JOB§  demonstrateó  thå  abilitù  oæ  EXECUTOR(tm©  tï enablå oò disablå joâ streaí displaù foò 'quieô mode§ (eitheò  oî oò  off© witè Control-Ñ codå (~Q)¬  anä maù bå useä iî á 'toggle§ manneò durinç thå executioî process. Additionally¬  thió controì codå (~Q© wilì havå nï effecô oî thå CP/M-8° lisô devicå (LST:© printeò output® However¬ thå useò maù  uså  Control-Р (^Ð oò ~P© tï turî thå printeò  oî  oò  off® Wheneveò  thå  EXECUTOR(tm©  ió active¬  thå statå  oæ  thå  lasô invocatioî  oæ  Control-Р wilì remaiî  unchangeä  untiì  anotheò Control-Ð ió encountereä iî thå texô buffer®  Thå useò maù presó Control-Р jusô  beforå thå firsô invocatioî oæ thå  EXECUTOR(tm© prograí  oò thå useò maù inserô '~P§ somewherå iî thå joâ  streaí text. Aî  examplå  theî foò thå usagå oæ Control-Ñ tï disablå  anä enable display on the user console, is as follows: %1Enter filename -> %2Enter date -> A:PIP $1.DOC = $1.RAW : Processing ... ~Q ; display off A:ED $1.DOC 10A S*DATE*~z$2~z E ERA $1.BAK ~Q ; display on TYPE $1.DOC .pa Š Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå followinç joâ streaí controì parameters: B>exec job9 test <-- useò invokeó joâ streaí Enter date ->31 Feb 2001 >>>Start execution +B>A:PIP TEST.DOC = TEST.RAW + +B>: Processing ... +B> +B> <-- editing process is not displayed here!!! +B>TYPE TEST.DOC + +This is test document. + +The lastest modification was on 31 FEB 2001. + +Blah, blah, .... + +End of doc + +B> >>>End execution B> .pa Š - JOB 10 (JOB10.JOB) - 'JOB10.JO  demonstrateó ho÷ EXECUTOR(tm© caî procesó á  joâ streaí  whicè  containó severaì 'sub-jobs§ withiî thå  filå  (buô onlù  onå  oæ  theí  maù bå executeä eacè  timå  EXECUTOR(tm©  ió invoked). Eacè 'sub-job§ startó eitheò aô thå beginninç oò aô thå pre- defineä  pounä  (#© flaç (á '#§ characteò followeä  bù  á  singlå character)®  Thå  joâ endó eitheò aô thå enä oæ texô iî thå filå oò thå nexô pounä flag®  Eacè 'sub-job§ ió invokeä bù specifyinç iô  aó thå firsô characteò iî thå filetypå field®  Thå characteò maù  bå anù valiä characteò accordinç tï thå CP/M-8°  convention® Iæ  thå characteò ió omitteä froí thå filetypå field¬  thå  firsô 'sub-job§ iî thå joâ streaí filå ió invoked® Foò example: ; A debug section(s) may be included or excluded from ; the program before assembling... ; : Usage: : Debug: EXEC JOB10.D <.ASM filename> : Un-debug: EXEC JOB10.U <.ASM filename> ; #D ; activate DEBUG %1Enter .ASM filename -> A:ED $1.ASM ; invoke editor ##a ; double #'s is required here fDEBUG~zki ; look for the DEBUG equate EQU TRUE ~ze ; exit from editor A:ASM $1 A:LOAD $1 $1 ; #U ; inactivate DEBUG %1Enter .ASM filename -> A:ED $1.ASM ; invoke editor ##a fDEBUG~zki ; look for the DEBUG equate EQU FALSE ~ze ; exit A:ASM $1 A:LOAD $1 $1 .pa Š Thereforå EXECUTOR(tm© coulä bå executeä bù thå user¬ witè á missinç  'sub-job§  definitioî  iî  thå filetypå  fielä  foò  thå followinç joâ streaí controì parameter: B>exec job10 <-- useò invokeó joâ streaí, where the character in filetype field is missing >>>Start execution +B> +B>: Usage: +B>: Debug: EXEC JOB10.D <.ASM filename> +B>: Un-debug: EXEC JOB10.U <.ASM filename> +B> >>>End execution B> Oò alternately¬  EXECUTOR(tm© coulä bå executeä bù thå user¬ tï  includå á 'sub-job§ definitioî iî thå filetypå fielä foò  thå followinç joâ streaí controì parameters: B>exec job10.u foo <-- the 'sub-job' #U is to be called >>>Start execution +B> +B>A:ED FOO.ASM + + : *#a + 1: *fDEBUG^Zki + 6: EQU FALSE + 7: + 7: *e + +B>A:ASM FOO +CP/M ASSEMBLER - VER 2.0 +011A +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + +FIRST ADDRESS 0100 +LAST ADDRESS 0119 +BYTES READ 001A +RECORDS WRITTEN 01 + +B>FOO + + Hello, World +B> >>>End execution B> .pa Š Finally¬  EXECUTOR(tm©  coulä bå executeä bù  thå  user¬  tï includå  aî alternatå 'sub-job§ definitioî iî thå filetypå  fielä foò thå followinç joâ streaí controì parameters: B>exec job10.d foo <-- the 'sub-job' #D is to be invoked >>>Start execution +B> +B>A:ED FOO.ASM + + : *#a + 1: *fDEBUG^Zki + 6: EQU TRUE + 7: + 7: *e + +B>A:ASM FOO +CP/M ASSEMBLER - VER 2.0 +0118 +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + +FIRST ADDRESS 0100 +LAST ADDRESS 0117 +BYTES READ 0018 +RECORDS WRITTEN 01 + +B>FOO + + Debug mode +B> >>>End execution B> .pa Š - JOB 11A (JOB11A.JOB) - 'JOB11A.JOB§ demonstrateó thå usagå oæ á nesteä joâ  stream¬ wherå  eacè  joâ streaí maù invokå anotheò joâ bù  EXECutinç  it® Upoî  thå completioî oæ thå invokeä job¬  thå invokinç joâ streaí theî  continueó  witè thå remaininç portioî oæ thå  texô  iî  thå EXECUTOR(tm©  buffer®  Uð tï ninå leveló oæ nestinç arå  allowed¬ buô notå thaô thå useò controì codeó (~E¬  ~S¬ ~R© arå valiä onlù withiî á level. For example: ; A debug section(s) may be included or excluded from ; the program before assembling... ; : Usage: : Debug: EXEC JOB11A.D <.ASM filename> : Un-debug: EXEC JOB11A.U <.ASM filename> ; #D ; activate DEBUG %1Enter .ASM filename -> A:EXEC JOB2B $1 TRUE ; edit program ERA $1.BAK A:EXEC JOB2A $1 ; assemble, load, and go ; #U ; inactivate DEBUG %1Enter .ASM filename -> A:EXEC JOB2B $1 FALSE ; edit program ERA $1.BAK A:EXEC JOB2A $1 ; assemble, load, and go .pa Š Thereforå EXECUTOR(tm© woulä bå executeä bù thå  user¬  witè thå followinç joâ streaí controì parameters: B>exec job11a.u foo <-- useò invokeó joâ streaí >>>Start execution +B> +B>A:EXEC JOB2B FOO FALSE <-- 'JOB2B.JOB' is invoked here + +B>A:ED FOO.ASM + + : *#a + 1: *fDEBUG^Zki + 6: EQU FALSE + 7: + 7: *e + +B> +B>ERA FOO.BAK <-- 'JOB2B.JOB' ends here + +B>A:EXEC JOB2A FOO <-- 'JOB2A.JOB' is invoked here + +B>A:ASM FOO +CP/M ASSEMBLER - VER 2.0 +011A +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + + +FIRST ADDRESS 0100 +LAST ADDRESS 0119 +BYTES READ 001A +RECORDS WRITTEN 01 + + +B>ERA FOO.HEX + +B>FOO + + Hello, World +B> +B> <-- there is nothing left in 'Level 0' buffer of EXECUTOR(tm) >>>End execution B> Additionallù note¬ thaô thå 'quitå mode§ (~Q© ió independenô iî alì levels®  Thaô is¬  onå leveì maù turî thå consolå displaù ofæ whilå thå otheò leveì turnó thå consolå displaù on. .pa Š - JOB 11B (JOB11B.JOB) - 'JOB11B.JOB§ demonstrateó anotheò forí oæ nesteä job®  Eacè joâ maù invokå anotheò joâ froí thå samå joâ streaí bù specifyinç thå character in the filetype field. For example: ; A debug section(s) may be included or excluded from ; the program before assembling... ; : Usage: : Debug: EXEC JOB11B.D <.ASM filename> : Un-debug: EXEC JOB11B.U <.ASM filename> ; #D ; activate DEBUG %1Enter .ASM filename -> A:EXEC JOB11B.E $1 TRUE ; edit program (see below) ERA $1.BAK A:EXEC JOB2A $1 ; assemble, load, and go ; #U ; inactivate DEBUG %1Enter .ASM filename -> A:EXEC JOB11B.E $1 FALSE ; edit program (see below) ERA $1.BAK A:EXEC JOB2A $1 ; assemble, load, and go #E ~Q ; display off A:ED $1.ASM ; invoke editor ##a fDEBUG~zki EQU $2 ; modify debug mode ~ze ; exit editor ~Q ; display on .pa Š Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå followinç joâ streaí controì parameters: B>exec job11b.d foo <-- useò invokeó joâ streaí >>>Start execution +B> +B>A:EXEC JOB11B.E FOO TRUE <-- 'sub-job' #E is invoked + +B> <-- display is off while the job is in process +B> +B> <-- end of the 'sub-job' #E +B>ERA FOO.BAK + +B>A:EXEC JOB2A FOO <-- JOB2A.JOB from another job stream is invoked + +B>A:ASM FOO +CP/M ASSEMBLER - VER 2.0 +0118 +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + +FIRST ADDRESS 0100 +LAST ADDRESS 0117 +BYTES READ 0018 +RECORDS WRITTEN 01 + + +B>ERA FOO.HEX +B>FOO + + Debug mode +B> +B> >>>End execution B> .pa Š - JOB 12 (JOB12.JOB) - EXECUTOR(tm©  alsï  allowó redefinitioî oæ itó  owî  controì codes®  Foò example¬  iæ á prograí needó á controì codå inputteä froí  á  useò whicè happenó tï bå thå samå aó onå oæ thå  defaulô useò  controì codeó Control-E¬  Control-Ú oò Control-Ò  (^E¬  ^Z¬ ^R,)¬  thå  useò caî changå anù defaulô controì codå tï  hió  owî preference. Á  'commerciaì  aô  sign§ (@© preceedinç onå  oæ  thå  threå previouslù defineä controì characteò letters¬  followeä bù á  ne÷ useò  defineä  characteò  letteò ió alì thaô ió  requireä  (i.e.¬ @E %2Enter filetype -> @ZN ; change default ^Z to ^N A:ED $1.$2 ##a22t ---> Interactive mode now active (use ctrl-E when done) ~U~Ee :Want to delete $1.BAK file? (yes=ctrl-E, no=ctrl-N) ~E ERA $1.BAK .pa Š Thereforå  EXECUTOR(tm© woulä bå executeä bù thå user¬  witè thå followinç joâ streaí controì parameters: B>exec job12 foo asm <-- useò invokeó joâ streaí >>>Start execution +B> +B>A:ED FOO.ASM + + : *#a22t + 1: ; TEST PROGRAM + 2: + 3: TRUE EQU -1 + 4: FALSE EQU 0 + 5: + 6: DEBUG EQU TRUE + 7: + 8: ORG 100H + 9: + 10: LXI D,MSG + 11: MVI C,9 ; print string + 12: CALL 5 ; BDOS + 13: RET ; back to CCP + 14: + 15: MSG: DB 9,9,9 ; 3 tabs + 16: + 17: IF NOT DEBUG + 18: DB 'Hello, World $' + 19: ENDIF + 20: + 21: IF DEBUG + 22: DB 'Debug mode $' + 1: *---> Interactive mode now active (use ctrl-E when done) # + fMSG^Z0TT <-- user inputs here + 10: LXI D,MSG + 10: *e <-- user presses CNTL-E + +B>:Want to delete FOO.BAK file? (yes=ctrl-E, no=ctrl-N) +B>^N <-- user presses CNTL-N >>>End execution B> .pa Š - Edit Mode - Á commanä containinç EXEà withouô anù argumenô iî thå  CP/M- 8°  commanä linå invokeó EXECUTOR(tm© intï aî on-linå  ediô  modå (Note¬  thaô thå useò maù presó Control-Ú aô anù timå tï exiô thå ediô mode). An example usage might be: B>exec <-- useò invokeó EXECUTOR(tm) only >>>Edit mode >exec job2a foo <-- user supplies the job text >era foo.prn <-- user wants to erase the print file >^Z <-- Control-Z to exit the edit mode >>>Start execution +B>exec job2a foo + +B>A:ASM FOO +CP/M ASSEMBLER - VER 2.0 +011A +000H USE FACTOR +END OF ASSEMBLY + +B>A:LOAD FOO + +FIRST ADDRESS 0100 +LAST ADDRESS 0119 +BYTES READ 001A +RECORDS WRITTEN 01 + +B>ERA FOO.HEX + +B>FOO + + Hello, World +B> +B>era foo.prn + +FOO .PRN +B> >>>End execution B> .pa Š - EXECUTOR(tm) Command Summary - EXECUTOR(tm) Control Codes are summarized as follows: ~E - User Intervention Code ~R - Repeat Marker Code ~Z - Skip Marker Code ~Q - Quiet Mode (toggle) Code ~P - Print Mode Code ~C - Abort Further Processing Code (return to CP/M) EXECUTOÒ  (tm©  'escapå  characters§ anä  'functioî  commanä characters§  (useä  bù variouó CP/Í utilies¬  arå  summarizeä  aó follows: ; - Single Semi-colon (non-displayable commentary) ;; - Double Semi-colon (displayable commentary) : - Single Colon (displayable commentary) # - Single Pound Sign ('Sub-job' Indicator Flag) ## - Double Pound Sign ('Append 65535 Lines'; CP/M Editor, 'ED.COM') % - Single Percent Sign (Parameter Substitution Specifier) $ - Single Dollar Sign (Argument Substitution Specifier) @ - Commercial 'At' Sign (Control Code Modifier) ~ - Tildy (Control Code Specifier) .pa Š - EXECUTOR(tm) Error Messages - EXECUTOR(tm© continuouslù monitoró thå useò joâ streaí foò á varietù  oæ possiblå erroró (followinç thå erroò codå wilì  bå  á pointer¬  "erroò  ->¢  whicè displaù thå joâ streaí texô linå  iî error© anä reportó theí oî thå consolå displaù aó follows: >>>Too many nesting levels Thió  erroò indicateó thaô thå joâ streaí haó  attempteä  tï 'stack§ morå thaî eighô jobó intï thå EXECUTOR(tm© buffer® Limiô youò joâ oò 'sub-job§ tasë leveì tï eighô oò less. >>>Too many arguments Thió  erroò indicateó thaô thå joâ streaí haó  attempteä  tï procesó  morå thaî ninå commanä leveì argumentó (i.e.¬  yoõ  havå attempteä  tï  replacå parameteò definitionó iî youò '.JOB§  filå exceeding '$9'. >>>File .JOB not there Thió  erroò  indicateó thaô thå useò specifieä  '.JOB§  filå does not exist on the specified disk, or on the 'A' system disk. >>>Parameter Thió erroò indicateó thaô á parameteò replacemenô erroò  haó occureä  iî á '$n§ parameteò definition¬  anä usuallù indicateó á mismatch in context of the attempted task. >>>Parm specifier Thió  erroò  indicateó  thaô  thå  joâ  streaí  containó   á replacement specifier greater than '$9'. >>>Parameter too long Thió  erroò indicateó thaô á joâ streaí parameteò strinç  ió greateò  thaî  8° characteró (i.e.¬  exceedó thå 'currenô  level§ string buffer size). >>>Control code Thió erroò indicateó thaô á controì codå iteí waó  specifieä iî thå joâ stream¬  thaô waó lesó thaî ASCIÉ '@§ (40H© oò greateò thaî ASCIÉ '~' (7EH) iî á possiblå controì group. .pa Š >>>Changå markeò code Thió  erroò  indicateó  thaô  aî '@§  markeò  codå  waó  noô followeä bù 'Z'¬  'R'¬  oò 'E'®  Eitheò thå codå waó missing¬ oò it was some character other than 'Z', 'R', or 'E'. >>>Subjob not found Thió  erroò  indicateó thaô thå 'sub-job§ filå specifieä  iî the command stream does not exist in the invoked file. Noteº  EXECUTOR(tm© wilì aborô furtheò processinç oæ thå joâ streaí iæ á filå doeó noô exist. .pa Š EXECUTOR(tm) Structure in the CP/M-80 Environment EXECUTOR(tm©  self-relocateó  tï  thaô areá oæ  thå  CP/M-8° environmenô  iî  memorù  jusô  belo÷  thå  CCР (Consolå  Commanä Processor)®  Alì  EXECUTOR(tm© joâ streaí bufferó worë  dowî  iî memorù   towardó   thå  Transienô  Prograí  Areá   (TPA)¬   whilå automaticallù  protectinç  theså  bufferó  froí  anù  attempô  tï overlaù thå buffeò area(s© bù thå currenô joâ streaí  applicatioî program® Thå structurå oæ EXECUTOR(tm© anä subsequenô buffeò  storagå area(s© arå allocateä iî thå CP/Í Memorù Organizatioî aó follows: ~ ~ | | ------------ | BIOS | Basic Input/Output System WBOOTV --> ------------ | BDOS | Basic Disk Operating System OBDOSV --> ------------ | CCP | Console Command Processor WBOOTV-1600H --> ------------ | EXEC | EXECUTOR(tm) EXEC BASE --> ------------ | BUF0 | Buffer 0 (first buffer) ------------ | BUF1 | Buffer 1 ------------ | BUF2 | Buffer 2 ------------ :: :: Buffers 3 - 6 :: ------------ | BUF7 | Buffer 7 (last buffer) ------------ | | | TPA | Transient Program Area | | 0100H --> ------------ | DBUF | Default Disk Buffer 0080H --> ------------ | FCB | Default File Control Block 005CH --> ------------ | BASE | Base of CP/M-80 System 0000H --> ------------ Note¬  thaô  EXECUTOR(tm© musô reservå locationó ¸ anä ¹  iî thå  CP/M-8°  systeí BASÅ foò aî 'EXEà Vectoò  Pointeò  directlù afteò thå systeí 'JUMÐ BDOÓ Vector'¬ aó follows: 0 1 - 2 3 4 5 6 - 7 8 - 9 | JMP | WBOOTV | IOBYTE | DISK# | JMP | BDOSV | EXECV | Š Refeò  tï  youò Digitaì Researcè manuaì 'CP/Í User'ó  Guide§ for details on the CP/M Memory Organization. EXECUTOR(tm) is a trademark of George Massar, Sr. CP/M(tm) and CP/M-80(tm) are trademarks of Digital Research