home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug060.arc / CPM#005.LBR / MAKEST20.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  28KB  |  1,577 lines

  1. xVersion    equ    '2'
  2. yVersion    equ    '0'
  3. ;**** MAKEST Version x.y ****
  4. ;
  5. ;Copyright (c) Peter C. Cole   March, 1985   Duncanville, TX
  6. ;All commercial rights reserved.
  7. ;Released for free distribution only. Not to be sold.
  8.  
  9.  
  10. ;**** Version Changes ****
  11. ;
  12. ;1.0  - Released March, 1985
  13. ;
  14. ;1.1  - Added "user selectable drive" and 
  15. ;    "display existing EXECST.COM command line".
  16. ;
  17. ;1.2  -    Added "exit MAKEST only on command".
  18. ;    DO NOT USE THIS VERSION.
  19. ;
  20. ;1.3  - Corrected problem of not sending proper end flag for 
  21. ;    Bdos function 47.
  22. ;
  23. ;1.4  - Corrected problem that MAKEST sometimes recognizes a one sector
  24. ;    EXECST that was not made by MAKEST.
  25. ;
  26. ;1.5  - Corrected the "chain flag" of Bdos Function 47 (Chain to 
  27. ;    Program). It was incorrectly set to 0FFh. Now set to 0h.
  28. ;    Made "Program Data Assembly Area" more straightforward.
  29. ;
  30. ;2.0  - Added on board editor and file name change capability.
  31. ;
  32.  
  33. PAGE
  34. ;**** Assembly Definations ****
  35. NL:    equ    0A0Dh    ;new line
  36. CPage:    equ    5A1Bh    ;clear page
  37. MsgEnd:    equ    0    ;message end flag
  38. Bdos:    equ    5    ;Bdos address
  39. Stack1:    equ    4000h    ;Location of MAKEST and FileName stack
  40. Temp:    equ    Stack1+2 ;Location to store temp string for editing
  41. Existing: equ    4800h    ;Location to store existing FileName program
  42.  
  43.     org    100h
  44. ;**** Start Program ****
  45.  
  46. ;Set stack
  47.     lxi    sp,Stack1
  48.  
  49. ;Set output delimiter
  50.     mvi    c,110
  51.     mvi    d,0
  52.     mvi    e,MsgEnd
  53.     call    Bdos
  54.  
  55. ;Set Bdos error mode to "return and display error" 
  56.     mvi    c,45
  57.     mvi    e,0FEh
  58.     call    Bdos
  59.  
  60. ;Set number of read/write sectors to 2
  61.     mvi    c,44
  62.     mvi    e,2
  63.     call    Bdos
  64.  
  65. ;Now continue with program
  66.     jmp    BeginMsg
  67.  
  68.  
  69.  
  70.  
  71. ;**** Exit Program ****
  72. Exit:    jmp    0
  73.  
  74. PAGE
  75. ;**** Begin Message ****
  76. BeginMsg: mvi    c,9
  77.     lxi    d,BM2
  78.     call    Bdos
  79.     jmp    BM10
  80. èBM2:    dw    CPage
  81.     db    '****************************** MAKEST Version '
  82.     db    xVersion,'.',yVersion,' ******************************'
  83.     db    'Copyright (c) 1985 by Peter C. Cole'
  84.     dw    NL
  85.     db    'Duncanville, Texas.'
  86.     dw    NL
  87.     db    'All commercial rights reserved.'
  88.     dw    NL
  89.     db    'Released for free distribution only. Not to be sold.'
  90.     dw    NL
  91.     db    '****************************************'
  92.     db    '****************************************'
  93.     dw    NL
  94.     db    'MAKEST will create or edit a "Command File" '    ;44
  95.     db    'on the disk drive of your choice.'        ;33
  96.     dw    NL
  97.     db    'A "Command File" is a file that when run '    ;41
  98.     db    'will send a command string to CP/M as '    ;38
  99.     dw    NL
  100.     db    'if you had typed it in after the '        ;33
  101.     db    'system prompt. Normal use of MAKEST is to'    ;41
  102.     dw    NL
  103.     db    'create an EXECST file which is the first '    ;41
  104.     db    'file CP/M Plus looks for when it first'    ;38
  105.     dw    NL
  106.     db    'boots up. Use EXECST to '            ;24
  107.     db     'autoload a favorite program on boot up.'    ;39
  108.     dw    NL
  109.     db    'MAKEST will only run on the Osborne '        ;36
  110.     db    'Executive. '                    ;11
  111.     dw    NL,NL
  112.     db    MsgEnd
  113.  
  114. PAGE
  115. ;**** Main Menu ****
  116. Begin:    call    HomeIt
  117. BM10:    mvi    c,9
  118.     lxi    d,BM11
  119.     call    Bdos
  120.     jmp    BM12
  121.  
  122. BM11:    db    'Please select:'
  123.     dw    NL
  124.     db    '  A,B,etc - Read this disk drive for an existing '
  125.     db    MsgEnd
  126.  
  127. BM12:    call    FileName
  128.     mvi    c,9
  129.     lxi    d,BM13
  130.     call    Bdos
  131.     jmp    BM14
  132.  
  133. BM13:    db    ' command line.'
  134.     dw    NL
  135.     db    '  ^C or X - Exit to CP/M.'
  136.     dw    NL
  137.     db    '  1 - Create a new '
  138.     db    MsgEnd
  139.  
  140. BM14:    call    FileName
  141.     mvi    c,9
  142.     lxi    d,BM15è    call    Bdos
  143.     jmp    BM16
  144.  
  145. BM15:    db    ' command line.'
  146.     dw    NL
  147.     db    '  2 - Change to a different file name.'
  148.     dw    NL
  149.     db    '  <RETURN> - Edit the below command line (if any).'
  150.     dw    NL
  151.     db    '  W - Write the below command line (if any) to'
  152.     db    ' a "to be selected" disk drive:'
  153.     dw    NL,NL
  154.     db    MsgEnd
  155.  
  156. BM16:    mvi    c,9
  157.     lxi    d,String
  158.     call    Bdos
  159.  
  160.     mvi    c,9
  161.     lxi    d,BM20
  162.     call    Bdos
  163.     jmp    Wait
  164.  
  165. BM20:    dw    NL
  166.     db    MsgEnd
  167. PAGE
  168. ;**** Subroutine FileName ****
  169. ;Displays active file name
  170. FileName: mvi    c,9
  171.     lxi    d,FN1
  172.     call    Bdos
  173.     ret
  174.  
  175. FN1:    db    'EXECST',0,0    ;allow for max. of 8 characters
  176.     db    MsgEnd
  177.  
  178. ;**** Subroutine Create ****
  179. ;Creates a fresh FCB
  180. Create:    lxi    h,FcbRun
  181.     lxi    d,FcbNew
  182.     mvi    b,FcbEnd-FcbNew
  183. Create1: ldax    d
  184.     mov    m,a
  185.     inx    h
  186.     inx    d
  187.     dcr    b
  188.     jnz    Create1
  189.     ret
  190.  
  191. ;**** Subroutine HomeIt ****
  192. ;Homes cursor to just under Header and clears to end of page.
  193. HomeIt:    mvi    c,9
  194.     lxi    d,Clear
  195.     call    Bdos
  196.     ret
  197.  
  198. Clear:    db    1Bh,3Dh    ;move cursor
  199.     db    27h,20h    ;to just under header
  200.     db    1Bh,59h    ;clear from cursor to endè    db    MsgEnd
  201.  
  202. PAGE
  203. ;**** Wait for key ****
  204. Wait:    mvi    c,6
  205.     mvi    e,0FDh
  206.     call    Bdos
  207.     cpi    3    ;test if ^C
  208.     jz    Exit
  209.     cpi    0Dh    ;<RETURN>
  210.     jz    ReEdit
  211.     cpi    '1'
  212.     jz    New
  213.     cpi    '2'
  214.     jz    Diff
  215.     ani    5Fh    ;convert if small to cap.
  216.     cpi    'X'    ;test if X
  217.     jz    Exit
  218.     cpi    'W'
  219.     jz    Write
  220.     cpi    'A'    ;is it less than 'A'?
  221.     jc    Wait    ;jmp if yes (not A to P)
  222.     cpi    'Q'    ;is it less than 'Q'?
  223.     jc    ExistFile ;jmp if yes
  224.     jmp    Wait    ;sorry, not A to P.
  225.  
  226.  
  227. ;****  Open Existing File ****
  228.  
  229. ;Convert to drive code and store
  230. ExistFile: ani    1Fh
  231.     sta    FcbNew
  232.  
  233. ;Create FcbRun 
  234.     call    Create
  235.  
  236. ;Clear screen
  237.     call    HomeIt
  238.  
  239. PAGE
  240. ;Open Existing File
  241.     mvi    c,15
  242.     lxi    d,FcbRun
  243.     call    Bdos
  244. è;Test if file opened
  245.     ana    a
  246.     jz    FileExists    ;jmp if file opened with no problem
  247.     mov    a,h
  248.     cpi    0
  249.     jnz    BadWait
  250.  
  251. ;File not found. Give message.
  252.     mvi    c,9
  253.     lxi    d,NoFileMsg
  254.     call    Bdos
  255.     jmp    BadWait
  256.  
  257. NoFileMsg: dw    NL,NL
  258.     db    'File not found.'
  259.     dw    NL
  260.     db    MsgEnd
  261.  
  262.  
  263. ;Test Existing file
  264. FileExists: call TestFile
  265.     jnz    BadWait
  266.  
  267. ;Makest file - give message
  268.     mvi    c,9
  269.     lxi    d,MSmsg1
  270.     call    Bdos
  271.     jmp    MS2
  272.  
  273. MSmsg1:    dw    NL,NL
  274.     db    'Do you want to edit this file? (Y/N) '
  275.     db    MsgEnd
  276.  
  277. PAGE
  278. ;Wait for Answer
  279. MS2:    mvi    c,6
  280.     mvi    e,0FDh
  281.     call    Bdos
  282.  
  283.     cpi    'Y'
  284.     jz    ExistEdit
  285.     cpi    'y'
  286.     jz    ExistEdit
  287.     jmp    Begin
  288.  
  289. ;Edit existing command string
  290. ExistEdit: call    HomeIt
  291.     lxi    h,Existing+Buffer-Data
  292.     mvi    m,126    ;only allow max of 126 char
  293.     xchg
  294.     call    LineEdit
  295.     cpi    0
  296.     jz    LoadBuffer
  297.     cpi    1
  298.     jz    Begin
  299.     cpi    2
  300.     jz    BadWait
  301.     jmp    Begin
  302.  
  303.  
  304. ;Load from Makest file to "Buffer"
  305. LoadBuffer: 
  306.     lxi    h,Buffer
  307.     lxi    d,Existing+Buffer-Data
  308. LB0:    ldax    d    ;load max char
  309.     mov    m,a
  310.     inx    h
  311.     inx    d
  312.     ldax    d    ;load char returned
  313.     mov    m,a
  314.     inx    h
  315.     inx    d
  316. LB1:    ldax    d    ;load data
  317.     mov    m,a
  318.     inx    h
  319.     inx    d
  320.     ana    a    ;is it end flag?
  321.     jnz    LB1    ;jmp if no
  322.     jmp    Begin
  323. PAGE
  324. ;**** Routine New ****
  325.  
  326. ;Create a string with no data
  327. New:    lxi    h,Temp
  328.     mvi    m,126
  329.     inx    h
  330.     mvi    m,0
  331.     inx    h
  332.     mvi    m,0
  333.  
  334. ;Edit command string
  335.     jmp    ReEdit2
  336.  
  337.  
  338. ;**** Routine ReEdit ****
  339.  
  340. ;Move Buffer to new location
  341. ReEdit:    lxi    h,Temp
  342.     lxi    d,Buffer
  343.     ldax    d    ;Load max char
  344.     mov    m,a
  345.     inx    h
  346.     inx    d
  347.     ldax    d    ;load char returned
  348.     mov    m,a
  349.     inx    h
  350.     inx    d
  351. ReEdit1: ldax    d
  352.     mov    m,a
  353.     inx    h
  354.     inx    d
  355.     ana    a
  356.     jnz    ReEdit1
  357.  
  358. ;Edit command string
  359. ReEdit2: call HomeIt
  360.     lxi    h,Temp
  361.     mvi    m,126
  362.     xchg
  363.     call    LineEdit
  364.     cpi    0
  365.     jz    ReEdit5
  366.     cpi    1
  367.     jz    Begin
  368.     cpi    2
  369.     jz    BadWait
  370.     jmp    Begin
  371.  
  372. ;Load new command line to Buffer
  373. ReEdit5: lxi    h,Buffer
  374.     lxi    d,Temp
  375.     jmp    LB0
  376.  
  377. PAGE
  378. ;**** Subroutine LineEdit ****
  379. ;
  380. ;DE = Start address of string to edit (set by user)
  381. ; 1st byte = maximum number of characters (set by user)
  382. ;          Does not include end flag of 0.
  383. ; 2nd byte = total number of characters returned (set by LineEdit)
  384. ;         Does not include end flag of 0.
  385. ; 3rd byte = zero if string has no data (set by user)
  386. ; 3rd byte = not zero if string has data (string must end with 0)
  387. ;
  388. ;Preload "WhichRow" with the row number to be used for the displayed line.
  389. ; 00h = 1st row (Top row of screen)
  390. ; 01h = 2nd row
  391. ;    etc
  392. ; 17h = 24th row (Bottom row of screen)
  393. ;
  394. ;CP/M cursor is moved to far left so LineEdit can remove it.
  395. ;LineEdit Cursor will start at far left.
  396. ;Cursor will be inverse, blinking, full intensity.
  397. ;Non-cursor characters will be black background, full intensity.
  398. ;
  399. ;Nonprintable characters will not be allowed in string.
  400. ;
  401. ;MsgEnd must be 0h.
  402. ;
  403. ;Returns with accumulator set to:
  404. ; 0 - good edit. (2nd byte equals 0 to maximum characters in string)
  405. ; 1 - edit not wanted (ESC pushed)
  406. ; 2 - problem opening line (one line message given)
  407. ;
  408. ;"String" is location of data .
  409. ;"Line" is location of video ram.
  410. ;
  411.  
  412. LineMax: db    126    ;maximum number of characters allowed (max = 255)
  413.             ;1st byte can be equal to or less than LineMax
  414. WhichRow: db    17h    ;row that line editor will use
  415. StringStart: ds    2    ;start address of string to edit
  416. StringBegin: ds    2    ;First char of string
  417. String1st: ds    2    ;Address of char in string that is 1st char in line
  418. StringCursor: ds 2    ;cursor location in string
  419. LineBegin: ds    2    ;start address of line
  420. LineCursor: ds    2    ;cursor location in line
  421.  
  422.  
  423.  
  424. PAGE
  425. ;Store start address of string
  426. LineEdit: xchg
  427.     shld    StringStart
  428.  
  429. ;Make CP/M cursor start location same as LineEdit location
  430.     lda    WhichRow
  431.     ani    24
  432.     sta    CursorY
  433.  
  434. ;Send Edit header
  435.     mvi    c,9
  436.     lxi    d,EditMsg
  437.     call    Bdos
  438.     jmp    Edit3
  439.  
  440. EditMsg: db    'You can use ! to chain several commands if needed. '
  441.     db    'Example: DIR A:!DIR B:'
  442.     dw    NL
  443.     db    'Enter up to 126 characters. '
  444. Edit1:    dw    NL,NL
  445.     db    'Use these keys for editing:'
  446.     dw    NL,NL
  447.     db    '  ^A - Go to far left.'
  448.     dw    NL
  449.     db    '  ^F - Go to far right.'
  450.     dw    NL
  451.     db    '  ^G or down arrow - delete character.'
  452.     dw    NL
  453.     db    '  ^- or ^left arrow - delete character on left.'
  454.     dw    NL
  455.     db    '  Use left and right arrow keys to move cursor.'
  456.     dw    NL
  457.     db    '  Only printable characters allowed.'
  458.     dw    NL
  459.     db    '  Push <ESC> to exit without new edit.'
  460.     dw    NL
  461.     db    '  Push <RETURN> when finished.'
  462.     db    1Bh,3Dh        ;position cursor
  463. CursorY    db    0+32
  464. CursorX    db    0+32
  465.     db    MsgEnd
  466.  
  467. ;Create video bank start address
  468. Edit3:    ora    a        ;clear carry
  469.     lda    WhichRow    ;get row number
  470.     lxi    h,0C000h    ;preload hl for video bank address
  471.     rar            ;get LSB of WhichRow for MSB of reg l
  472.     mov    b,a        ;store LSB's for reg h
  473.     mov    a,l        ;move LSB of WhichRow into MSB of reg l
  474.     rar
  475.     mov    l,a
  476.     mov    a,b        ;get LSB's for reg h
  477.     ora    h        ;move MSB's of WhichRow into LSB's of reg h
  478.     mov    h,a        ;
  479.     shld    LineBegin    ;store line start address
  480. PAGE
  481. ;Test if max desired ok
  482. Edit5:    lhld    StringStart
  483.     mov    c,m    ;load max char's
  484.     inx    h
  485.     mvi    m,0    ;set to 0 char returned for now
  486.     inx    h
  487.     lda    LineMax    ;load max allowed
  488.     cmp    c    ;test if equal to or less than
  489.     jz    Edit8    ;ok (equal)
  490.     jnc    Edit8    ;ok (less than)
  491.     
  492. ;Max desired not ok - send message
  493.     mvi    c,9
  494.     lxi    d,Edit6
  495.     call    Bdos
  496.     mvi    a,2
  497.     ret
  498.  
  499. Edit6:    db    'Maximum characters desired is more than that allowed.'
  500.     db    MsgEnd
  501.  
  502. ;Test if any nonprintable char found
  503. Edit8:    
  504.     mvi    b,0    ;to keep track of number of char
  505.     lda    LineMax    ;to test if max exceeded
  506.     inr    a    ;account for end flag
  507.     mov    c,a
  508. Edit9:    mov    a,m
  509.     ana    a
  510.     jz    Edit20    ;jmp if end flag of 0 found
  511.     cpi    ' '
  512.     jc    Edit11    ;jmp if control char
  513.     cpi    7Fh
  514.     jnc    Edit11    ;jmp if equal to or greater than 7Fh
  515.     inr    b
  516.     dcr    c
  517.     jz    Edit16    ;jmp if max exceeded
  518.     inx    h
  519.     jmp    Edit9
  520.  
  521. ;nonprintable char found
  522. Edit11:    mvi    c,9
  523.     lxi    d,Edit12
  524.     call    Bdos
  525.     mvi    a,2
  526.     ret
  527.  
  528. Edit12:    db    'Sorry, this string has a nonprintable character.'
  529.     db    MsgEnd
  530.  
  531. PAGE
  532. ;number of char's exceed limit
  533. Edit16:    mvi    c,9
  534.     lxi    d,Edit17
  535.     call    Bdos
  536.     mvi    a,2
  537.     ret
  538.  
  539. Edit17: db    'Sorry, this string is too long.'
  540.     db    MsgEnd
  541.     
  542.  
  543. ;does string given exceed its own limit?
  544. Edit20:    lhld    StringStart
  545.     mov    a,m
  546.     cmp    b
  547.     jnc    Edit25    ;jmp if ok
  548.  
  549. ;string given exceeds its own limit
  550.     mvi    c,9
  551.     lxi    d,Edit22
  552.     call    Bdos
  553.     mvi    a,2
  554.     ret
  555.  
  556. Edit22: db    'Sorry, this string exceeds its own maximum limit.'
  557.     db    MsgEnd
  558.     
  559. ;Load number of char's found
  560. Edit25:    lhld    StringStart
  561.     inx    h
  562.     mov    m,b
  563.  
  564. ;display line
  565.     lhld    StringStart    ;preload start address of string
  566.     inx    h
  567.     inx    h
  568.     shld    StringBegin
  569.     shld    String1st
  570.     shld    StringCursor
  571.  
  572.     lhld    LineBegin    ;preload start address of line
  573.     shld    LineCursor
  574.     shld    OldCursor
  575.  
  576.     call    Display
  577.     jmp    Edit
  578.  
  579. PAGE
  580. ;** Subroutine Display **
  581. OldCursor: ds    2
  582. Bank:    ds    1
  583.  
  584. ;Turn on Video Bank
  585. Display: in    0
  586.     sta    Bank
  587.     ori    40h
  588.     out    0
  589.  
  590. ;Turn off old cursor
  591.     lhld    OldCursor
  592.     mov    a,m
  593.     ani    01111111b ;turn off reverse video
  594.     mov    m,a
  595.     mov    a,h    ;go to DXXX address
  596.     adi    10h
  597.     mov    h,a
  598.     mov    a,m
  599.     ani    11011111b ;turn off blink
  600.     mov    m,a
  601.  
  602. ;Load new line data until end flag
  603.     lhld    String1st
  604.     xchg
  605.     lhld    LineBegin
  606.     mvi    b,80
  607. Display1: ldax    d
  608.     ana    a    ;test if 0 end flag
  609.     jz    Display2 ;jmp if yes
  610.     mov    m,a
  611.     inx    h
  612.     inx    d
  613.     dcr    b
  614.     jnz    Display1
  615.  
  616. ;Finish with blanks
  617. Display2: mvi    a,' '
  618. Display3: mov    m,a
  619.     inx    h
  620.     dcr    b
  621.     jnz    Display3
  622.  
  623. PAGE
  624. ;Turn on new cursor and store location as OldCursor
  625.     lhld    LineCursor
  626.     shld    OldCursor
  627.     mov    a,m
  628.     ori    10000000b ;turn on inverse video
  629.     mov    m,a
  630.     mov    a,h    ;go to DXXX address
  631.     adi    10h
  632.     mov    h,a
  633.     mov    a,m
  634.     ori    00100000b ;turn on blink
  635.     mov    m,a
  636.  
  637. ;Turn off Video Bank
  638.     lda    Bank
  639.     out    0
  640.     ret
  641.  
  642. PAGE
  643. ;Wait for edit key
  644. Edit:    mvi    c,6
  645.     mvi    e,0FDh
  646.     call    Bdos
  647.     cpi    1Bh    ;ESC
  648.     jz    ExitEdit
  649.     cpi    01h    ;^A (CP/M to left edge)
  650.     jz    LeftEdge
  651.     cpi    06h    ;^F (CP/M to right edge)
  652.     jz    RightEdge
  653.     cpi    07h    ;^G (CP/M and WS delete character)
  654.     jz    DeleteChar
  655.     cpi    0Ah    ;^J (CP/M Arrow down)
  656.     jz    DeleteChar
  657.     cpi    18h    ;^X (WS Arrow down)
  658.     jz    DeleteChar
  659.     cpi    1Fh    ;^_ (WS delete character on left - also ^ arrow left) 
  660.     jz    DeleteLeft
  661.     cpi    7Fh    ;DEL
  662.     jz    DeleteLeft
  663.     cpi    04h    ;^D (WS arrow right)
  664.     jz    Right
  665.     cpi    0Ch    ;^L (CP/M arrow right)
  666.     jz    Right
  667.     cpi    13h    ;^S (WS arrow left)
  668.     jz    Left
  669.     cpi    08h    ;^H (CP/M arrow left)
  670.     jz    Left
  671.     cpi    0Dh    ;^M (Carriage Return)
  672.     jz    DoneEdit
  673.     cpi    ' '
  674.     jc    Edit    ;jmp if control char
  675.     cpi    80h
  676.     jnc    Edit    ;jmp if equal to or greater than 80h
  677.     jmp    EnterChar
  678.  
  679. ;Return from Edit with flag of abandon edit
  680. ExitEdit: mvi    a,1
  681.     ret
  682.  
  683. ;Return from Edit with flag of good new edit
  684. DoneEdit: mvi    a,0
  685.     ret
  686.  
  687. PAGE
  688. ;**** Routine Right ****
  689. ;move cursor right
  690.  
  691. ;can String move right?
  692. Right:    lhld    StringCursor
  693.     mov    a,m
  694.     ana    a
  695.     jz    Edit    ;jmp if no
  696.  
  697. ;move String right
  698.     inx    h
  699.     shld    StringCursor
  700.  
  701. ;can Line move right?
  702.     lhld    LineCursor
  703.     mov    a,l
  704.     cpi    4Fh
  705.     jz    RightMove ;jmp if no
  706.     cpi    0CFh
  707.     jz    RightMove ;jmp if no
  708.  
  709. ;move Line right
  710.     inx    h
  711.     shld    LineCursor
  712.  
  713. ;display new line
  714. RightOut: call    Display
  715.     jmp    Edit
  716.  
  717. ;move String right
  718. RightMove: lhld    String1st
  719.     inx    h
  720.     shld    String1st
  721.     jmp    RightOut
  722.  
  723. PAGE
  724. ;**** Routine Left ****
  725. ;moves cursor left
  726.  
  727. ;Can String move left?
  728. Left:    lhld    StringBegin
  729.     xchg
  730.     lhld    StringCursor
  731.     mov    a,d
  732.     cmp    h
  733.     jnz    Left1    ;jmp if yes
  734.     mov    a,e
  735.     cmp    l
  736.     jnz    Left1    ;jmp if yes
  737.     jmp    Edit    ;jmp if no
  738.  
  739. ;Move String left
  740. Left1    dcx    h
  741.     shld    StringCursor
  742.  
  743. ;Can Line move left?
  744.     lhld    LineCursor
  745.     mov    a,l
  746.     cpi    0h
  747.     jz    LeftMove ;jmp if no
  748.     cpi    80h
  749.     jz    LeftMove ;jmp if no
  750.  
  751. ;move Line left
  752.     dcx    h
  753.     shld    LineCursor
  754.  
  755. ;display new line
  756. LeftOut: call    Display
  757.     jmp    Edit
  758.  
  759. ;move String left
  760. LeftMove: lhld    String1st
  761.     dcx    h
  762.     shld    String1st
  763.     jmp    LeftOut
  764.  
  765. PAGE
  766. ;**** Routine RightEdge ****
  767. ;Moves cursor to far right edge
  768.  
  769. ;Can String move right?
  770. RightEdge: lhld    LineCursor    ;for top
  771.     push    h
  772.     lhld    String1st    ;for de
  773.     xchg
  774.     lhld    StringCursor    ;for hl
  775.     mov    a,m
  776.     cpi    0h
  777.     jz    REout    ;jmp if no
  778.  
  779. ;Move StringCursor and LineCursor right
  780. ;Can LineCursor move right
  781. RE1:    xthl
  782.     mov    a,l
  783.     cpi    4Fh
  784.     jz    RE5    ;jmp if no
  785.     cpi    0CFh
  786.     jz    RE5    ;jmp if no
  787.  
  788. ;move LineCursor right
  789.     inx    h
  790. RE2:    xthl
  791.  
  792. ;move StringCursor right
  793.     inx    h
  794.  
  795. ;can String move right
  796.     mov    a,m
  797.     cpi    0h
  798.     jnz    RE1    ;jmp if yes
  799.  
  800. ;load new values
  801. RE3:    shld    StringCursor
  802.     xchg
  803.     shld    String1st
  804.     pop    h
  805.     shld    LineCursor
  806.  
  807. ;display new line
  808.     call    Display
  809.     jmp    Edit
  810.  
  811. PAGE
  812. ;Move StringCursor and String1st right
  813. ;Return LineCursor
  814. RE5:    xthl
  815.  
  816. ;move StringCursor and String1st right
  817. RE6:    inx    h
  818.     inx    d
  819.  
  820. ;can String move right
  821.     mov    a,m
  822.     cpi    0h
  823.     jnz    RE6    ;jmp if yes
  824.     jmp    RE3
  825.  
  826. REout:    pop    h
  827.     jmp    Edit
  828.  
  829. PAGE
  830. ;**** Routine LeftEdge ****
  831. ;Moves cursor to far left edge
  832.  
  833. ;Can String move left?
  834. LeftEdge: 
  835.     lhld    StringBegin    ;for bc
  836.     mov    b,h
  837.     mov    c,l
  838.     lhld    StringCursor
  839.     mov    a,b
  840.     cmp    h
  841.     jnz    LE0    ;jmp if yes
  842.     mov    a,c
  843.     cmp    l
  844.     jnz    LE0    ;jmp if yes
  845.     jmp    Edit    ;jmp if no
  846.  
  847. LE0:    lhld    LineCursor    ;for top
  848.     push    h
  849.     lhld    String1st    ;for de
  850.     xchg
  851.     lhld    StringCursor    ;for hl
  852.  
  853. ;Move StringCursor and LineCursor left
  854. ;Can LineCursor move left
  855. LE1:    xthl
  856.     mov    a,l
  857.     cpi    0h
  858.     jz    LE5    ;jmp if no
  859.     cpi    80h
  860.     jz    LE5    ;jmp if no
  861.  
  862. ;move LineCursor left
  863.     dcx    h
  864. LE2:    xthl
  865.  
  866. ;move StringCursor left
  867.     dcx    h
  868.  
  869. ;can String move left
  870.     mov    a,b
  871.     cmp    h
  872.     jnz    LE1    ;jmp if yes
  873.     mov    a,c
  874.     cmp    l
  875.     jnz    LE1    ;jmp if yes
  876.  
  877. PAGE
  878. ;load new values
  879. LE3:    shld    StringCursor
  880.     xchg
  881.     shld    String1st
  882.     pop    h
  883.     shld    LineCursor
  884.  
  885. ;display new line
  886.     call    Display
  887.     jmp    Edit
  888.  
  889. ;Move StringCursor and String1st left
  890. ;Return LineCursor
  891. LE5:    xthl
  892.  
  893. ;move StringCursor and String1st left
  894. LE6:    dcx    h
  895.     dcx    d
  896.  
  897. ;can String move left
  898.     mov    a,b
  899.     cmp    h
  900.     jnz    LE6    ;jmp if yes
  901.     mov    a,c
  902.     cmp    l
  903.     jnz    LE6    ;jmp if yes
  904.     jmp    LE3    ;jmp if no
  905. PAGE
  906. ;**** Routine DeleteChar ****
  907. ;Deletes character cursor is on
  908.  
  909. ;Is StringCursor at end?
  910. DeleteChar:
  911.     lhld    StringCursor
  912.     mov    a,m
  913.     dcx    h
  914.     ana    a
  915.     jz    Edit    ;jmp if yes
  916.  
  917. ;Delete data at cursor
  918. DelChar1: inx    h
  919.     inx    h
  920.     mov    a,m
  921.     dcx    h
  922.     mov    m,a
  923.     ana    a    ;is it last char
  924.     jnz    DelChar1 ;jmp if no
  925.  
  926. ;Decrement char count
  927.     lhld    StringStart
  928.     inx    h
  929.     mov    a,m
  930.     dcr    a
  931.     mov    m,a
  932.  
  933. ;Display new line
  934.     call    Display
  935.     jmp    Edit
  936. PAGE
  937. ;**** Routine DeleteLeft ****
  938. ;Delete character on left of cursor
  939.  
  940. ;Is StringCursor at end?
  941. DeleteLeft:
  942.     lhld    StringBegin
  943.     xchg
  944.     lhld    StringCursor
  945.     mov    a,d
  946.     cmp    h
  947.     jnz    DelLeft1    ;jmp if no
  948.     mov    a,e
  949.     cmp    l
  950.     jnz    DelLeft1    ;jmp if no
  951.     jmp    Edit        ;jmp if yes
  952.  
  953. ;Is LineCursor at end?
  954. DelLeft1:
  955.     lhld    LineCursor
  956.     mov    a,l
  957.     cpi    0h
  958.     jz    Edit    ;jmp if yes
  959.     cpi    80h
  960.     jz    Edit    ;jmp if yes
  961.  
  962. ;Decrement LineCursor position
  963.     dcx    h
  964.     shld    LineCursor
  965.  
  966. ;Decrement StringCursor position
  967.     lhld    StringCursor
  968.     dcx    h
  969.     shld    StringCursor
  970.  
  971. ;Delete data at left of cursor
  972.     dcx    h
  973. DelLeft2: inx    h
  974.     inx    h
  975.     mov    a,m
  976.     dcx    h
  977.     mov    m,a
  978.     ana    a    ;is it last char
  979.     jnz    DelLeft2 ;jmp if no
  980.  
  981. ;Decrement char count
  982.     lhld    StringStart
  983.     inx    h
  984.     mov    a,m
  985.     dcr    a
  986.     mov    m,a
  987.  
  988. ;Display new line
  989.     call    Display
  990.     jmp    Edit
  991.  
  992. PAGE
  993. ;**** Routine EnterChar ****
  994. ;Enter character at cursor position. 
  995. ;Cursor and all to right moves right.
  996.  
  997. ;Store character
  998. EnterChar:
  999.     mov    c,a    ;char stored in c
  1000.  
  1001. ;Is String full?
  1002.     lhld    StringStart
  1003.     mov    a,m
  1004.     inx    h
  1005.     cmp    m
  1006.     jnz    Char1    ;jmp if no
  1007.  
  1008. ;Send bell
  1009.     mvi    c,2
  1010.     mvi    e,7h
  1011.     call    Bdos
  1012.     jmp    Edit
  1013.  
  1014. ;Increment String count
  1015. Char1:    mov    a,m
  1016.     inr    a
  1017.     mov    m,a
  1018.  
  1019. ;Increment StringCursor
  1020.     lhld    StringCursor
  1021.     inx    h
  1022.     shld    StringCursor
  1023.     dcx    h
  1024.  
  1025. ;Move in new data
  1026. Char2:    mov    a,m    ;get data for next
  1027.     mov    m,c    ;write data
  1028.     mov    c,a    ;set up for next
  1029.     inx    h
  1030.     ana    a    ;is it last
  1031.     jnz    Char2    ;jmp if no
  1032.     mov    m,c    ;write end flag
  1033.  
  1034. PAGE
  1035. ;Can LineCursor move right?
  1036.     lhld    LineCursor
  1037.     mov    a,l
  1038.     cpi    4Fh
  1039.     jz    Char5    ;jmp if no
  1040.     cpi    0CFh
  1041.     jz    Char5    ;jmp if no
  1042.  
  1043. ;move LineCursor right
  1044.     inx    h
  1045.     shld    LineCursor
  1046.  
  1047. ;Display line
  1048. Char4:    call    Display
  1049.     jmp    Edit
  1050.  
  1051. ;Increment String1st
  1052. Char5:    lhld    String1st
  1053.     inx    h
  1054.     shld    String1st
  1055.     jmp    Char4
  1056.  
  1057.  
  1058.  
  1059. ;**** Routine BadWait ****
  1060. ;Will wait for any key (sends message) and then jmp to Begin
  1061.  
  1062. BadWait: mvi    c,9    ;send message
  1063.     lxi    d,BadOpen1
  1064.     call    Bdos
  1065.  
  1066.     mvi    e,0FDh    ;wait for key
  1067.     mvi    c,6
  1068.     call    Bdos
  1069.     jmp    Begin
  1070.  
  1071. BadOpen1: dw    NL,NL
  1072.     db    'Push any key to continue.'
  1073.     dw    NLè    db    MsgEnd
  1074.  
  1075. PAGE
  1076. ;**** Subroutine TestFile ****
  1077. ;Test existing file found on disk
  1078. ;If MAKEST file then return with Zero Flag set
  1079.  
  1080. ;Send message
  1081. TestFile: 
  1082.     call    FileName
  1083.     mvi    c,9
  1084.     lxi    d,FEmsg
  1085.     call    Bdos
  1086.     jmp    FEmsgOut
  1087.  
  1088. FEmsg:    db    ' exists on the selected drive.'
  1089.     db    MsgEnd
  1090. FEmsgOut: db    0
  1091.  
  1092. ;Clear area for existing FileName
  1093.     lxi    h,Existing
  1094.     lxi    b,200h    ;more than enough
  1095. ClearArea: mvi    m,0
  1096.     inx    h
  1097.     dcx    b
  1098.     mov    a,b
  1099.     ora    c
  1100.     jnz    ClearArea
  1101.  
  1102. ;Load existing file
  1103.     mvi    c,26    ;set DMA address
  1104.     lxi    d,Existing
  1105.     call    Bdos
  1106.  
  1107.     mvi    c,15    ;open existing file
  1108.     lxi    d,FcbRun
  1109.     call    Bdosè
  1110.     mvi    c,20    ;read sequential
  1111.     lxi    d,FcbRun
  1112.     call    Bdos
  1113.  
  1114. PAGE
  1115. ;Test if embedded "MAKEST end message" is present
  1116.     lxi    h,Existing+0FFh-(+EndS9-EndS8)    ;first load "MsgEnd" to 
  1117.                         ;byte before embedded message
  1118.     mvi    m,MsgEnd
  1119.     inx    h    ;now set HL to first byte of embedded message
  1120.     lxi    d,EndS8
  1121.     mvi    b,EndS9-EndS8
  1122. Test:    ldax    d
  1123.     cmp    m
  1124.     jnz    NotFile    ;jmp if embedded message not MAKEST's
  1125.     inx h !inx d
  1126.     dcr    b
  1127.     jnz    Test
  1128.  
  1129. ;This is a MAKEST file - Test if before Version 1.5
  1130.  
  1131.     lxi    h,Existing+EndS7-Data    ;Get 'V'
  1132.     mov    a,m
  1133.     cpi    'V'
  1134.     jnz    B15V    ;jmp if before Version 1.5
  1135.  
  1136. ;This is a MAKEST file of Version 1.5 or after - Send message
  1137.     mvi    c,9
  1138.     lxi    d,MFmsg1
  1139.     call    Bdos
  1140.     jmp    MF2
  1141.  
  1142. MFmsg1:    dw    NL
  1143.     db    'This file was created by MAKEST '
  1144.     db    MsgEnd
  1145.  
  1146. MF2:    mvi    c,9            ;Send Version number
  1147.     lxi    d,Existing+EndS7-Data
  1148.     call    Bdos
  1149.  
  1150. MF3:    mvi    c,9
  1151.     lxi    d,MFmsg3
  1152.     call    Bdos
  1153.     jmp    MF4
  1154.  
  1155. MFmsg3:    dw    NL
  1156.     db    'It',39,'s command line is:'
  1157.     dw    NL
  1158.     db    MsgEnd
  1159.  
  1160. MF4:    mvi    c,9    ;Send String message
  1161.     lxi    d,Existing+String-Data
  1162.     call    Bdos
  1163.  
  1164.     xra    a    ;set zero flag
  1165.     ret
  1166. èPAGE
  1167. ;Not a MAKEST file - Send message
  1168. NotFile: mvi    c,9
  1169.     lxi    d,NMmsg
  1170.     call    Bdos
  1171.  
  1172.     mvi    a,1    ;clear zero flag
  1173.     ana    a
  1174.     ret
  1175.  
  1176. NMmsg:    db    'This file was not made by MAKEST. '
  1177.     dw    NL
  1178.     db    MsgEnd
  1179.  
  1180.  
  1181. ;File created before MAKEST Version 1.5 - Send message
  1182. B15V:    mvi    c,9
  1183.     lxi    d,B15Vmsg1
  1184.     call    Bdos
  1185.     jmp    MF3
  1186.  
  1187. B15Vmsg1: dw    NL
  1188.     db    'This file was made by MAKEST before Version 1.5  '
  1189.     db    27,94,'It should be replaced.',27,113
  1190.     db    MsgEnd
  1191.  
  1192. PAGE
  1193. ;**** Write File to Disk ****
  1194.  
  1195. ;Is there data?
  1196. Write:    lxi    h,Buffer
  1197.     inx    h
  1198.     mov    a,m
  1199.     ana    a
  1200.     jz    Wait    ;jmp if none
  1201.  
  1202. ;Ask which drive to select
  1203.     call HomeIt
  1204.     mvi    c,9
  1205.     lxi    d,Write2
  1206.     call    Bdos
  1207.     jmp    Write3
  1208.  
  1209. Write2:    db    'Which drive do you want to write '
  1210.     db    MsgEnd
  1211.  
  1212. Write3:    call    FileName
  1213.     mvi    c,9
  1214.     lxi    d,Write5
  1215.     call    Bdos
  1216.     jmp    Write6
  1217.  
  1218. Write5:    db    ' to?'
  1219.     dw    NL
  1220.     db    'Select A,B,etc. or <ESC> to return to main menu.'
  1221.     dw    NL
  1222.     db    MsgEnd
  1223.  
  1224. ;Wait for key
  1225. Write6:    mvi    c,6
  1226.     mvi    e,0FDh
  1227.     call    Bdos
  1228.     cpi    1Bh    ;ESC
  1229.     jz    Begin
  1230.     ani    5Fh    ;convert from small to cap.
  1231.     cpi    'A'    ;is it less than 'A'?
  1232.     jc    Write6    ;jmp if yes
  1233.     cpi    'Q'    ;is it less than 'Q'
  1234.     jc    Write10    ;jmp if yes
  1235.     jmp    Write6    ;sorry, not A to P
  1236.  
  1237. ;Convert to drive code and store
  1238. Write10: sta    Write17    ;store drive letter
  1239.     ani    1Fh
  1240.     sta    FcbNew
  1241.  
  1242. ;Create FcbRun 
  1243.     call    Create
  1244.  
  1245. PAGE
  1246. ;Clear screen
  1247. Write11: call    HomeIt
  1248.  
  1249. ;Open New File
  1250.     mvi    c,22
  1251.     lxi    d,FcbRun
  1252.     call    Bdos
  1253. è;Test if file opened
  1254.     ana    a
  1255.     jz    Write40    ;jmp if file opened with no problem
  1256.     mov    a,h
  1257.     cpi    8h
  1258.     jz    Write15
  1259.     cpi    0
  1260.     jnz    BadWait
  1261.  
  1262. ;No directory space available
  1263.     mvi    c,9
  1264.     lxi    d,Write12
  1265.     call    Bdos
  1266.     jmp    BadWait
  1267.  
  1268. Write12: dw    NL,NL
  1269.     db    'No directory space available.'
  1270.     dw    NL
  1271.     db    MsgEnd
  1272.  
  1273. ;Ask if file to be overwritten?
  1274. Write15: call    HomeIt
  1275.     call    FileName
  1276.  
  1277.     mvi    c,9
  1278.     lxi    d,Write16
  1279.     call    Bdos
  1280.     jmp    Write20
  1281.  
  1282. Write16: db    ' already exists on drive '
  1283. Write17: db    'A: '
  1284.     dw    NL
  1285.     db    'Do you wish to overwrite this file with your new '
  1286.     db    '"command" file? (Y/N) '    
  1287.     db    MsgEnd
  1288.  
  1289. PAGE
  1290. ;Wait for Erase Answer
  1291. Write20: mvi    c,6
  1292.     mvi    e,0FDh
  1293.     call    Bdos
  1294.  
  1295.     cpi    'Y'
  1296.     jz    Write22
  1297.     cpi    'y'
  1298.     jz    Write22
  1299.     jmp    Begin
  1300.  
  1301. ;Erase fileèWrite22: mvi    c,19
  1302.     lxi    d,FcbRun
  1303.     call    Bdos
  1304.  
  1305.     ana    a    ;test if erased
  1306.     jz    Write11    ;jmp if erased
  1307.     mov    a,h    ;test if R/O
  1308.     cpi    3
  1309.     jz    Write30    ;jmp if R/O
  1310.     jmp    BadWait
  1311.  
  1312. ;Ask About Read/Only
  1313. Write30: mvi    c,9
  1314.     lxi    d,Write31
  1315.     call    Bdos
  1316.     jmp    Write32
  1317.  
  1318. Write31: dw    NL,NL
  1319.     db    'The file is Read/Only. Overwrite? (Y/N) '
  1320.     db    MsgEnd
  1321.  
  1322. ;Wait for answer
  1323. Write32: mvi    c,6
  1324.     mvi    e,0FDh
  1325.     call    Bdos
  1326.  
  1327.     cpi    'Y'
  1328.     jz    Write35
  1329.     cpi    'y'
  1330.     jz    Write35
  1331.     jmp    Begin
  1332.  
  1333. ;Erase Read/Only
  1334. Write35:lda    FcbRun+9    ;set FCB to R/Wè    ani    7Fh
  1335.     sta    FcbRun+9
  1336.  
  1337.     mvi    c,30    ;now set file on disk to R/W
  1338.     lxi    d,FcbRun
  1339.     call    Bdos
  1340.     jmp    Write22
  1341. PAGE
  1342. ;**** Load End Flags into Data ****
  1343.  
  1344. ;Get next address after String
  1345. Write40: mvi    b,0    ;load number of char to bc
  1346.     lda    Buffer+1
  1347.     mov    c,a
  1348.     lxi    h,String ;load string start adr
  1349.     dad    b    ;offset
  1350.  
  1351. ;add end flag of 0h
  1352.     mvi    m,0
  1353.     inx    h
  1354.  
  1355. ;add message end flag of $
  1356.     mvi    m,'$'
  1357.     inx    h
  1358.  
  1359.  
  1360. ;**** Write Data to Disk ****
  1361.     mvi    c,26    ;set DMA address
  1362.     lxi    d,Data
  1363.     call    Bdos
  1364.  
  1365.     mvi    c,21    ;write data
  1366.     lxi    d,FcbRun
  1367.     call    Bdos
  1368.  
  1369.     mvi    c,16    ;close file
  1370.     lxi    d,FcbRun
  1371.     call    Bdos
  1372.  
  1373.     jmp    Begin
  1374.  
  1375. **** FCB "to be run" location ***
  1376. FcbRun:    ds    1
  1377.     db    'EXECST  COM'
  1378.     db    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1379.  
  1380. **** FCB "to be read" location ****
  1381. FcbNew:    ds    1
  1382.     db    'EXECST  COM'
  1383.     db    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1384. FcbEnd:    ds    1
  1385.  
  1386. PAGE
  1387. **** Program Data Assembly Area ****
  1388.  
  1389. ;Set Stack
  1390. Data:    lxi    sp,Stack1                        ;0100h
  1391.  
  1392. ;Get/Set System Control Block
  1393. ;Without the following routine the system prompt may display on theè;same line last written to. This routine is the same format as found
  1394. ;in the Osborne EXECST.COM. What it exactly does is unknown by this
  1395. ;programmer. DR says that an offset of 3Ah is "Reserved for System Use".
  1396.     mvi    c,49    ;get/set System Control Block            ;0103h
  1397.     lxi    d,SCB-Data+100h    ;location of SCB Parameter Block
  1398.     call    Bdos
  1399.     mvi    l,0B5h
  1400.     mov    a,m
  1401.     ori    2
  1402.     mov    m,a
  1403.  
  1404. ;Move String to Default DMA
  1405.     lxi    h,String-Data+100h ;address of String when        ;0111h
  1406.                    ; Data moved to 100h
  1407.     lxi    d,80h    ;Default DMA start address
  1408. Data3:    mvi    b,128    ;maximum character count of string
  1409. Data4:    mov    a,m    ;get String
  1410.     stax    d    ;store String
  1411.     inx    h    ;go to next char
  1412.     inx    d    ;go to next char
  1413.     dcr    b    ;test if last char
  1414.     jnz    Data4-Data+100h ;address of Data4 when Data moved to 100h
  1415.  
  1416. ;Chain String to Program
  1417.     mvi    c,47    ;chain to program                ;0121h
  1418.     mvi    e,0h    ;use default CCP values of drive and user number
  1419.     jmp    Bdos
  1420.  
  1421. ;SCB Parameter Block
  1422. SCB:    db    3Ah    ;offset of SCB                    ;0128
  1423.     db    0    ;"get" operation
  1424.  
  1425. ;Development Area for String
  1426. Buffer:    ds    2    ;2 bytes for number of characters in string    ;012Ah
  1427. String:    db    0    ;Start of string of characters to be chained.    ;012Ch
  1428.     db    '$'    ;At first command must be 0h then '$'.
  1429.     ds    124    ;A total of 126 characters.
  1430.     ds    2    ;String must end with 0h then '$'.
  1431.  
  1432. ;Unused space
  1433.     ds    36                            ;01CAh
  1434.  
  1435. ;Version number
  1436. EndS7:    db    'Ver. ',xVersion,'.',yVersion,0,'$',0            ;01D0h
  1437.  
  1438. ;Recognition message
  1439. EndS8:    db    'This EXECST.COM was created by MAKEST'            ;01DBh
  1440. EndS9:    db    0                            ;0200h
  1441. PAGE
  1442. ;**** Routine Diff ****
  1443. ;Change to a different file name
  1444.  
  1445. ;Send message
  1446. Diff:    call HomeIt
  1447.     mvi    c,9
  1448.     lxi    d,Diff1
  1449.     call    Bdos
  1450.     jmp    Diff2
  1451.  
  1452. Diff1:    db    'What is the new file name to be?'
  1453.     dw    NL
  1454.     db    'Enter up to an 8 character file name.'
  1455.     dw    NL
  1456.     db    MsgEnd
  1457.  
  1458. ;Setup NewName
  1459. Diff2:    lxi    h,NewName
  1460.     mvi    m,8    ;8 characters max
  1461.     inx    h
  1462.     inx    h
  1463.     mvi    m,0    ;no data to start
  1464.     jmp    Diff4
  1465.  
  1466. NewName: ds    15
  1467.  
  1468. ;Get file name
  1469. Diff4:    lxi    d,NewName
  1470.     call    NameEdit
  1471.     cpi    0
  1472.     jz    Diff10
  1473.     cpi    1
  1474.     jz    Begin
  1475.     cpi    2
  1476.     jz    BadWait
  1477.     jmp    Begin
  1478.  
  1479. ;Setup similar to LineEdit
  1480. NameEdit: xchg
  1481.     shld    StringStart
  1482.  
  1483.     lda    WhichRow
  1484.     ani    24
  1485.     sta    CursorY
  1486.  
  1487.     mvi    c,9
  1488.     lxi    d,Edit1
  1489.     call    Bdos
  1490.     jmp    Edit3
  1491.  
  1492. PAGE
  1493. ;Test if no data
  1494. Diff10:    lda    NewName+1
  1495.     ana    a
  1496.     jz    Begin    ;Forget it if no data
  1497.  
  1498. ;Convert small letters to caps
  1499.     lxi    h,NewName+2
  1500. Diff11:    mov    a,m
  1501.     ana    a
  1502.     jz    Diff13
  1503.     cpi    'a'
  1504.     jc    Diff12    ;jmp if less than 'a'
  1505.     cpi    'z'+1
  1506.     jnc    Diff12    ;jmp if greater than 'z'
  1507.     sui    20h    ;convert
  1508.     mov    m,a
  1509. Diff12:    inx    h
  1510.     jmp    Diff11
  1511.  
  1512. ;Fill FcbRun file name with blanks
  1513. Diff13:    mvi    b,8
  1514.     mvi    a,' '
  1515.     lxi    h,FcbRun+1
  1516. Diff15:    mov    m,a
  1517.     inx    h
  1518.     dcr    b
  1519.     jnz    Diff15
  1520.  
  1521. ;Move new file name to FcbRun
  1522.     lxi    h,NewName+2
  1523.     lxi    d,FcbRun+1
  1524. Diff17:    mov    a,m
  1525.     ana    a
  1526.     jz    Diff20
  1527.     stax    d
  1528.     inx    h
  1529.     inx    d
  1530.     jmp    Diff17
  1531.  
  1532. PAGE
  1533. ;Fill FcbNew file name with blanks
  1534. Diff20:    mvi    b,8
  1535.     mvi    a,' '
  1536.     lxi    h,FcbNew+1
  1537. Diff21:    mov    m,a
  1538.     inx    h
  1539.     dcr    b
  1540.     jnz    Diff21
  1541.  
  1542. ;Move new file name to FcbNew
  1543.     lxi    h,NewName+2
  1544.     lxi    d,FcbNew+1
  1545. Diff23:    mov    a,m
  1546.     ana    a
  1547.     jz    Diff25
  1548.     stax    d
  1549.     inx    h
  1550.     inx    d
  1551.     jmp    Diff23
  1552.  
  1553. ;Fill FN1 file name with 0's
  1554. Diff25:    mvi    b,8
  1555.     mvi    a,0
  1556.     lxi    h,FN1
  1557. Diff27:    mov    m,a
  1558.     inx    h
  1559.     dcr    b
  1560.     jnz    Diff27
  1561.  
  1562. ;Move new file name to FN1
  1563.     lxi    h,NewName+2
  1564.     lxi    d,FN1
  1565. Diff30:    mov    a,m
  1566.     ana    a
  1567.     jz    Diff33
  1568.     stax    d
  1569.     inx    h
  1570.     inx    d
  1571.     jmp    Diff30
  1572.  
  1573. ;That's it. Lets go home.
  1574. Diff33:    jmp    Begin
  1575.  
  1576.     end    100h
  1577.