; ZCPR3 TCAP Facility (Z3TCAP)
; Program Name:  TCMAKE
; Author:  Richard Conn
; Version:  1.0
; Date:  10 Mar 84
version equ     10

;
;       TCMAKE allows the user to create a Z3T file for his particular
; terminal.
;

;
;  Basic Equates
;
z3env   SET     0f400h  ;ZCPR3 Environment Descriptor
qch     equ     '\'     ;quote char
fcb     equ     5ch
tbuff   equ     80h
ctrlc   equ     'C'-'@'
cr      equ     0dh
lf      equ     0ah

;
;  ZCPR3 and SYSLIB References
;
       ext     z3init,qprint,z3log
       ext     bbline,sksp,eval
       ext     codend,moveb,fillb,hmovb
       ext     print,pfn1,pstr,capine,cin,caps,crlf,cout,pafdc,pa2hc
       ext     initfcb,f$make,f$write,f$close
       ext     f$exist,gfa,f$delete

;
; Environment Definition
;
       if      z3env ne 0
;
; External ZCPR3 Environment Descriptor
;
       jmp     start
       db      'Z3ENV' ;This is a ZCPR3 Utility
       db      1       ;External Environment Descriptor
z3eadr:
       dw      z3env
start:
       lhld    z3eadr  ;pt to ZCPR3 environment
;
       else
;
; Internal ZCPR3 Environment Descriptor
;
       MACLIB  Z3BASE.LIB
       MACLIB  SYSENV.LIB
z3eadr:
       jmp     start
       SYSENV
start:
       lxi     h,z3eadr        ;pt to ZCPR3 environment
       endif

;
; Start of Program -- Initialize ZCPR3 Environment
;
       call    z3init  ;initialize the ZCPR3 Env and the VLIB Env

;
; Print Banner
;
       call    qprint
       db      'TCMAKE, Version '
       db      (version/10)+'0','.',(version mod 10)+'0'
       db      cr,lf,0

;
; Check for Entry in FCB
;
       lda     fcb+1   ;get first char
       cpi     ' '     ;none if space
       jz      help
       cpi     '/'     ;none if slash
       jnz     start1
;
; Print Help Info
;
help:
       call    print
       db      'TCMAKE - Create a Z3T File'
       db      cr,lf,'Syntax:'
       db      cr,lf,' TCMAKE outfile  -or-  TCMAKE outfile.typ'
       db      cr,lf
       db      cr,lf,'where "outfile" is the file to be generated by'
       db      cr,lf,'the execution of TCMAKE.  If no file type is'
       db      cr,lf,'given, a file type of Z3T is the default.'
       db      0
       ret
;
; Resume Processing
;
start1:
;
; Set Default File Type if None
;
       lxi     d,fcb+9         ;pt to file type
       lxi     h,deftyp        ;pt to default file type
       mvi     b,3             ;3 bytes
       ldax    d               ;get first char
       cpi     ' '             ;none if space
       cz      moveb           ;set default file type
;
; Init the Buffers and Pointers
;
       call    codend  ;pt to scratch area
       shld    scratch ;set ptr
       lxi     d,100h  ;give space (overkill)
       xra     a       ;init strings to empty
       sta     rcfirst ;clear flag
       dad     d
       shld    cladr   ;CL
       mov     m,a     ;clear
       dad     d
       shld    cmadr   ;CM
       mov     m,a     ;clear
       dad     d
       shld    ceadr   ;CE
       mov     m,a     ;clear
       dad     d
       shld    soadr   ;SO
       mov     m,a     ;clear
       dad     d
       shld    seadr   ;SE
       mov     m,a     ;clear
       dad     d
       shld    tiadr   ;TI
       mov     m,a     ;clear
       dad     d
       shld    teadr   ;TE
       mov     m,a     ;clear
       dad     d
       shld    cmbadr  ;CM Beginning
       mov     m,a     ;clear
       dad     d
       shld    cmmadr  ;CM Middle
       mov     m,a     ;clear
       dad     d
       shld    cmeadr  ;CM Ending
       mov     m,a     ;clear
       dad     d
       shld    reqn    ;Row Equation
       mov     m,a
       dad     d
       shld    ceqn    ;Column Equation
       mov     m,a
       lxi     h,ku    ;clear 1-byte buffers
       mvi     b,7     ;7 of them
       xra     a       ;0 fill
       call    fillb
;
; Create the Data Base
;
menu1:
       call    create          ;create entry
       call    assemble        ;assemble the entry
       jz      menu1           ;continue if buffer overflow
;
; Confirm Selection
;
       call    print
       db      cr,lf,'  Selected Terminal is: ',0
       lhld    scratch         ;pt to buffer
       call    prent           ;print name
       call    print
       db      ' -- Confirm (Y/N)? ',0
       call    capine          ;get input
       call    crlf
       cpi     'Y'
       jnz     menu1           ;continue
       call    wrfile          ;write file
       ret
;
; Assemble Data into Z3T Format
;       Return with Z if Buffer Overflow (more than 128 bytes)
;       Return with NZ if OK
;
assemble:
       mvi     c,128-23        ;128 bytes max with 23 bytes for header
       mvi     b,23            ;copy 23 byte header
       lhld    scratch         ;into scratch area
       lxi     d,tname         ;from TNAME
       xchg
       call    hmovb
       lhld    cladr           ;copy CL string
       call    asmcopy
       lxi     h,crcmd         ;reverse row/col to col/row?
       lda     rcfirst         ;get flag
       cpi     'C'             ;reverse if C
       jnz     asmc0
       call    asmcopy
       dcx     d               ;don't let zero in
asmc0:
       lhld    cmbadr          ;CM Beginning
       call    asmcopy
       dcx     d
       lhld    ceqn            ;prepare for col first
       lda     rcfirst         ;get row/col flag
       cpi     'C'             ;col/row?
       jz      asmc1
       lhld    reqn            ;row first, so store row
asmc1:
       call    asmcopy
       dcx     d               ;skip 0
       lhld    cmmadr          ;CM Middle
       call    asmcopy
       dcx     d               ;skip 0
       lhld    reqn            ;prepare for row first
       lda     rcfirst         ;get row/col flag
       cpi     'C'             ;col/row?
       jz      asmc2
       lhld    ceqn            ;col first, so store col
asmc2:
       call    asmcopy
       dcx     d               ;skip 0
       lhld    cmeadr          ;CM Ending
       call    asmcopy
       lhld    ceadr           ;CE
       call    asmcopy
       lhld    soadr           ;SO
       call    asmcopy
       lhld    seadr           ;SE
       call    asmcopy
       lhld    tiadr           ;TI
       call    asmcopy
       lhld    teadr           ;TE
       call    asmcopy
       xra     a               ;zero rest
asmzero:
       stax    d               ;store 0
       inx     d
       dcr     c               ;count down
       jnz     asmzero
       dcr     c               ;return NZ for OK
       ret
;
; Copy TCAP String from HL to DE
;       Check for SCRATCH Area Overflow by Counting C Down
;       Allow For Quotes
;
asmcopy:
       mov     a,m             ;get char
       stax    d               ;store it
       inx     h               ;pt to next
       inx     d
       ora     a               ;done?
       rz
       dcr     c               ;check for overflow
       jz      asmovfl
       cpi     qch             ;quote?
       jnz     asmcopy
       mov     a,m             ;get quoted byte
       stax    d               ;store it
       inx     h               ;pt to next
       inx     d
       dcr     c               ;check for overflow
       jnz     asmcopy
asmovfl:
       pop     psw             ;clear stack
       call    print
       db      cr,lf,'** Buffer Overflow **',0
       xra     a               ;error code
       ret

;
; Create Entries
;
create:
       call    print
       db      cr,lf
       db      cr,lf,' ** Z3TCAP Main Menu',0
       call    prfdata ;print file data
       call    print
       db      cr,lf
       db      cr,lf,'Define:  1. Clear Screen Sequence'
       db      cr,lf,' 2. Cursor Motion Sequence'
       db      cr,lf,' 3. Clear to End of Line Sequence'
       db      cr,lf,' 4. Standout Mode Sequences'
       db      cr,lf,' 5. Terminal Init/Deinit Sequences'
       db      cr,lf,' 6. Arrow Keys'
       db      cr,lf,' 7. Terminal Name'
       db      cr,lf
       db      cr,lf,'Status:  S. Print Status (Definitions so far)'
       db      cr,lf
       db      cr,lf,'Exit:    X. Exit and Write File'
       db      cr,lf,' Q. Quit and Abort Program without Writing File'
       db      cr,lf
       db      cr,lf,'Command? ',0
       call    capine  ;get response
       call    crlf
       lxi     h,ctable        ;pt to command table
       call    tscan   ;scan table
       call    print
       db      ' Invalid Command: ',0
       call    cout    ;print char
       jmp     create  ;resume
;
; Print File Data
;
prfdata:
       call    print
       db      ' for File ',0
       lxi     d,fcb+1
       call    pfn1
       call    print
       db      ' **',0
       ret
;
; Define Name of Terminal
;
namedef:
       lxi     h,tname ;space fill terminal name buffer
       mvi     a,' '
       mvi     b,16
       call    fillb
       call    print
       db      cr,lf,' Input Name of Terminal: ',0
       xra     a       ;no caps
       call    bbline  ;get line from user
       call    sksp    ;skip over leading spaces
       lxi     d,tname ;save name in buffer
       mvi     b,16    ;16 bytes max
putname:
       mov     a,m     ;get next char
       ora     a       ;done?
       jz      pn1
       stax    d       ;put next char
       inx     h       ;pt to next
       inx     d
       dcr     b       ;count down
       jnz     putname
pn1:
       jmp     create
;
; Define Arrow Keys
;
arrowdef:
       call    print
       db      'Arrow Key Definition'
       db      cr,lf,' Your Terminal''s Arrow Keys may be defined ONLY'
       db      cr,lf,' if they generate only one character each.  If they'
       db      cr,lf,' do, type Y to continue.  If not, type anything else.'
       db      cr,lf,' Define Arrow Keys (Y/N)? ',0
       call    capine
       cpi     'Y'
       jnz     create
       call    print
       db      cr,lf,' Strike the Appropriate Arrow Key'
       db      cr,lf,' 1. Arrow UP?    ',0
       lxi     h,ku    ;pt to first entry
       call    cin
       mov     m,a     ;store it
       inx     h       ;pt to next
       call    ccout
       call    print
       db      cr,lf,' 2. Arrow DOWN?  ',0
       call    cin
       mov     m,a
       inx     h
       call    ccout
       call    print
       db      cr,lf,' 3. Arrow RIGHT? ',0
       call    cin
       mov     m,a
       inx     h
       call    ccout
       call    print
       db      cr,lf,' 4. Arrow LEFT?  ',0
       call    cin
       mov     m,a
       call    ccout
       jmp     create
;
; Review Arrow Keys
;
arrowrev:
       call    print
       db      cr,lf,'Review of Arrow Key Definitions'
       db      cr,lf,' 1. Arrow UP =    ',0
       lxi     h,ku    ;pt to first
       mov     a,m
       call    ccout
       inx     h
       call    print
       db      cr,lf,' 2. Arrow DOWN =  ',0
       mov     a,m
       call    ccout
       inx     h
       call    print
       db      cr,lf,' 3. Arrow RIGHT = ',0
       mov     a,m
       call    ccout
       inx     h
       call    print
       db      cr,lf,' 4. Arrow LEFT =  ',0
       mov     a,m
       call    ccout
       ret

;
; Quit Create Mode and Program
;
crquit:
       call    print
       db      'Do you really want to quit (Y/N)? ',0
       call    capine  ;get input from user
       cpi     'Y'     ;see if he typed a Y
       jnz     create  ;resume if not
       pop     psw     ;clear stack
;
; Exit Create Mode
;
crexit:
       ret
;
; CL Definition
;
cldef:
       call    print
       db      'Clear Screen Definition',cr,lf
       db      ' 1. Timing Delay',0
       call    getdelay        ;get delay constant
       sta     cld             ;save delay constant
       call    print
       db      cr,lf,' 2. Clear Screen Byte Sequence',0
       lhld    cladr           ;pt to buffer
       call    getstr
       jmp     create

;
; CL Review
;
clreview:
       call    print
       db      cr,lf,'Review of Clear Screen Definition'
       db      cr,lf,' 1. Timing Delay = ',0
       lda     cld
       call    pafdc
       call    print
       db      ' Milliseconds'
       db      cr,lf,' 2. Clear Screen Sequence:',0
       lhld    cladr
       call    prtstr
       ret
;
; CE Definition
;
cedef:
       call    print
       db      'Clear to End of Line Definition',cr,lf
       db      ' 1. Timing Delay',0
       call    getdelay        ;get delay constant
       sta     ced             ;save delay constant
       call    print
       db      cr,lf,' 2. Clear to End of Line Byte Sequence',0
       lhld    ceadr           ;pt to buffer
       call    getstr
       jmp     create
;
; CE Review
;
cereview:
       call    print
       db      cr,lf,'Review of Clear to End of Line Definition'
       db      cr,lf,' 1. Timing Delay = ',0
       lda     ced
       call    pafdc
       call    print
       db      ' Milliseconds'
       db      cr,lf,' 2. Clear to End of Line Sequence:',0
       lhld    ceadr
       call    prtstr
       ret
;
; SO Definition
;
sodef:
       call    print
       db      'Standout Mode Definition',cr,lf
       db      ' 1. Begin Standout Mode Byte Sequence',0
       lhld    soadr           ;pt to buffer
       call    getstr
       call    print
       db      cr,lf,' 2. End Standout Mode Byte Sequence',0
       lhld    seadr           ;pt to buffer
       call    getstr
       jmp     create
;
; SO Review
;
soreview:
       call    print
       db      cr,lf,'Review of Standout Mode Definition'
       db      cr,lf,' 1. Begin Standout Mode Sequence:',0
       lhld    soadr
       call    prtstr
       call    print
       db      cr,lf,' 2. End Standout Mode Sequence:',0
       lhld    seadr
       call    prtstr
       ret
;
; TI Definition
;
tidef:
       call    print
       db      'Terminal Init/Deinit Definition',cr,lf
       db      ' 1. Terminal Initialization Byte Sequence',0
       lhld    tiadr           ;pt to buffer
       call    getstr
       call    print
       db      cr,lf,' 2. Terminal Deinitialization Byte Sequence',0
       lhld    teadr           ;pt to buffer
       call    getstr
       jmp     create
;
; TI Review
;
tireview:
       call    print
       db      cr,lf,'Review of Terminal Init/Deinit Definition'
       db      cr,lf,' 1. Terminal Initialization Sequence: ',0
       lhld    tiadr
       call    prtstr
       call    print
       db      cr,lf,' 2. Terminal Deinitialization Sequence: ',0
       lhld    teadr
       call    prtstr
       ret
;
; CM Definition
;
cmdef:
       call    print
       db      'Cursor Motion Definition',cr,lf
       db      ' 1. Timing Delay',0
       call    getdelay        ;get delay
       sta     cmd
cmcrdef:
       call    print
       db      cr,lf,' 2. Enter R if Row/Column or C for Column/Row: ',0
       call    capine
       cpi     'C'     ;col/row
       jz      cmdef1
       cpi     'R'
       jz      cmdef1
       call    print
       db      ' - Invalid',0
       jmp     cmcrdef
cmdef1:
       sta     rcfirst ;set flag
       call    print
       db      cr,lf,' 3. Enter Equation for Row:    ',0
       xra     a       ;no caps
       call    bbline  ;get input
       call    sksp    ;skip spaces
       xchg
       lhld    reqn
       xchg
       call    copy0
       call    print
       db      cr,lf,' 4. Enter Equation for Column: ',0
       xra     a       ;no caps
       call    bbline  ;get input
       call    sksp    ;skip spaces
       xchg
       lhld    ceqn
       xchg
       call    copy0
       call    print
       db      cr,lf,' 5. Enter Prefix Byte Sequence',0
       lhld    cmbadr  ;beginning
       call    getstr
       call    print
       db      cr,lf,' 6. Enter Middle Byte Sequence',0
       lhld    cmmadr  ;middle
       call    getstr
       call    print
       db      cr,lf,' 7. Enter Suffix Byte Sequence',0
       lhld    cmeadr  ;ending
       call    getstr
       jmp     create
;
; Copy HL to DE until 0
;
copy0:
       mov     a,m     ;copy
       stax    d
       cpi     qch     ;quote?
       jz      copyq
       ora     a       ;done if 0
       rz
       inx     h       ;pt to next
       inx     d
       jmp     copy0
copyq:
       inx     h       ;copy quoted char
       inx     d
       mov     a,m     ;copy
       stax    d
       inx     h       ;advance
       inx     d
       jmp     copy0
;
; Review CM Data
;
cmreview:
       call    print
       db      cr,lf,'Review of Cursor Motion Data'
       db      cr,lf,' 1. Timing Delay = ',0
       lda     cmd
       call    pafdc
       call    print
       db      ' Milliseconds'
       db      cr,lf,' 2. Row or Column First: ',0
       lda     rcfirst
       call    cout
       call    print
       db      cr,lf,' 3. Row Equation:    -->',0
       lhld    reqn
       call    pstr
       call    print
       db      '<--'
       db      cr,lf,' 4. Column Equation: -->',0
       lhld    ceqn
       call    pstr
       call    print
       db      '<--'
       db      cr,lf,' 5. Prefix Byte Sequence: ',0
       lhld    cmbadr
       call    prtstr
       call    print
       db      cr,lf,' 6. Middle Byte Sequence: ',0
       lhld    cmmadr
       call    prtstr
       call    print
       db      cr,lf,' 7. Suffix Byte Sequence: ',0
       lhld    cmeadr
       call    prtstr
       ret

;
; Status Display
;
rstatus:
       call    print
       db      cr,lf,' Strike Any Key to Continue - ',0
       call    cin
status:
       call    print
       db      cr,lf,' ** Z3TCAP Status',0
       call    prfdata ;file data
       call    print
       db      cr,lf
       db      cr,lf,'Review:  1. Clear Screen Definition'
       db      cr,lf,' 2. Cursor Motion Definition'
       db      cr,lf,' 3. Clear to End of Line Definition'
       db      cr,lf,' 4. Standout Mode Definition'
       db      cr,lf,' 5. Terminal Init/Deinit Definition'
       db      cr,lf,' 6. Arrow Key Definition'
       db      cr,lf,' 7. Terminal Name Definition'
       db      cr,lf
       db      cr,lf,'Exit:    X. Exit to Main Menu'
       db      cr,lf
       db      cr,lf,'Command? ',0
       call    capine
       lxi     h,rtable
       call    tscan
       call    print
       db      cr,lf,' Invalid Command: ',0
       call    cout
       jmp     status
;
; Review Name
;
rname:
       call    print
       db      cr,lf,'Terminal Name: ',0
       lxi     h,tname
       mvi     b,16
rname1:
       mov     a,m     ;get char
       call    cout
       inx     h       ;pt to next
       dcr     b       ;count down
       jnz     rname1
       jmp     rstatus
;
; Review CL
;
rcl:
       call    clreview
       jmp     rstatus
;
; Review CE
;
rce:
       call    cereview
       jmp     rstatus
;
; Review CM
;
rcm:
       call    cmreview
       jmp     rstatus
;
; Review SO
;
rso:
       call    soreview
       jmp     rstatus
;
; Review TI
;
rti:
       call    tireview
       jmp     rstatus
;
; Review Arrow Keys
;
rarrow:
       call    arrowrev
       jmp     rstatus
;
; Status Review Commands
;
rtable:
       db      '1'
       dw      rcl
       db      '2'
       dw      rcm
       db      '3'
       dw      rce
       db      '4'
       dw      rso
       db      '5'
       dw      rti
       db      '6'
       dw      rarrow
       db      '7'
       dw      rname
       db      'X'
       dw      create
       db      0

;
; Scan Command Table
;
tscan:
       mov     b,a     ;save char in B
tscan1:
       mov     a,m     ;get char
       ora     a       ;end of table?
       jz      tscanx  ;exit
       cmp     b       ;compare
       jz      tscanf  ;found
       inx     h       ;skip to next
       inx     h
       inx     h
       jmp     tscan1
tscanx:
       mov     a,b     ;restore char and exit - not found
       ret
tscanf:
       inx     h       ;get address
       mov     a,m
       inx     h
       mov     h,m
       mov     l,a
       pop     psw     ;clear stack
       pchl            ;branch to routine
;
; Command Table
;
ctable:
       db      '1'     ;CL
       dw      cldef
       db      '2'     ;CM
       dw      cmdef
       db      '3'     ;CE
       dw      cedef
       db      '4'     ;SO
       dw      sodef
       db      '5'     ;TI
       dw      tidef
       db      '6'     ;arrows
       dw      arrowdef
       db      '7'     ;name
       dw      namedef
       db      'S'     ;status
       dw      status
       db      'Q'     ;quit
       dw      crquit
       db      'X'     ;exit
       dw      crexit
       db      0
;
; Routine to Input Delay Constant
;
getdelay:
       call    print
       db      cr,lf,' Enter Delay Time in Milliseconds: ',0
       mvi     a,0ffh  ;caps
       call    bbline
       call    sksp
       call    eval    ;convert to binary
       ret
;
; Routine to Define Text String
;
getstr:
       shld    firstch ;set ptr to first char
getfirst:
       mvi     b,1     ;set count
       lhld    firstch ;set next char to first
       shld    nxtchar
getnext:
       call    print
       db      cr,lf,'  Char #',0
       mov     a,b     ;get char number
       call    pafdc   ;print it
       inr     b       ;increment count
       push    b       ;save it
;
; Prompt for Type of Input
;
       call    print
       db      ' - Type Char, .=Number, or <CR>=Done: ',0
       call    cin     ;get response
       cpi     cr      ;exit
       jz      getx
       cpi     '.'     ;number?
       jz      getnum
;
; Input Character
;
       call    print
       db      'Char ',0
       call    ccout   ;echo character
       jmp     putch
;
; Input Number
;
getnum:
       call    print
       db      'Enter Number: ',0
       mvi     a,0ffh  ;caps
       call    bbline  ;get input
       call    sksp    ;skip spaces
       call    eval    ;convert
;
; Save Character with Quoting
;
putch:
       lhld    nxtchar ;pt to next char
       ora     a       ;quote if null
       jz      quote
       cpi     qch     ;quote if quote
       jz      quote
putch1:
       mov     m,a     ;store it
       inx     h       ;pt to next
       shld    nxtchar ;set ptr
       pop     b       ;get count
       jmp     getnext ;get next char
;
; Quote the Character
;
quote:
       mvi     m,qch   ;save quote char
       inx     h
       jmp     putch1
;
; Exit
;
getx:
       pop     psw     ;clear stack
       lhld    nxtchar ;store ending 0
       mvi     m,0
       ret
;
; Print String Pted to by HL
;
prtstr:
       mvi     b,0     ;set count
       call    crlf    ;new line
       mov     a,m     ;empty?
       ora     a
       jnz     prts0
       call    print
       db      '  -- Empty --',0
       ret
prts0:
       mov     a,m     ;get next char
       ora     a       ;done?
       rz
       call    print
       db      '  (',0
       mov     a,b     ;print count
       inr     a
       call    pafdc
       call    print
       db      ') ',0
       mov     a,m     ;get next char
       inx     h       ;pt to next
       cpi     qch     ;check for quote
       jnz     prts1
       mov     a,m     ;get char that is quoted
       inx     h       ;pt to next
prts1:
       call    ccout
       call    print
       db      '  ',0
       call    pa2hc   ;print as 2 hex chars
       call    print
       db
       'H  ',0
       inr     b       ;increment count
       mov     a,b     ;get count
       ani     3
       cz      crlf    ;new line
       jmp     prts0

;
; Create Target File
;
wrfile:
       lxi     d,fcb           ;pt to FCB
       call    z3log           ;log into proper directory
       call    f$exist         ;test of presence of file
       jz      make2           ;create file
       call    gfa             ;get file attributes
       ani     1               ;R/O?
       jz      make1
       call    print
       db      cr,lf,'File ',0
       lxi     d,fcb+1
       call    pfn1
       call    print
       db      ' is Read/Only - Saving as $$$.Z3T',0
       lxi     h,tempfcb       ;set $$$.Z3T
       lxi     d,fcb+1
       mvi     b,11            ;11 chars
       call    moveb
       lxi     d,fcb           ;reinit
       call    initfcb         ;resume
make1:
       call    f$delete        ;delete file
make2:
       call    f$make          ;create file
       cpi     0ffh            ;error
       jnz     writef
       call    print
       db      cr,lf,'File Create Error',0
       ret
;
; Write Block to File
;
writef:
       lhld    scratch         ;pt to entry
       lxi     d,tbuff         ;copy into buffer
       mvi     b,128           ;128 bytes
       call    moveb
       lxi     d,fcb           ;pt to FCB
       call    f$write         ;write block
       jnz     werr
       call    f$close         ;close file
       call    print
       db      cr,lf,'File ',0
       lxi     d,fcb+1
       call    pfn1
       call    print
       db      ' Created',0
       ret
;
; Can't Write File
;
werr:
       call    print
       db      cr,lf,'File Write Error',0
       ret
;
; Print Entry Name Pted to by HL
;
prent:
       mvi     b,16    ;16 chars
prtname:
       mov     a,m     ;get char
       call    cout
       inx     h       ;advance
       dcr     b       ;count down
       jnz     prtname
       ret
;
; Print Char in A with Control Char Processing
;
ccout:
       push    psw     ;save char
       ani     7fh     ;mask MSB
       cpi     7fh     ;DEL?
       jz      ccout2
       cpi     ' '
       jnc     ccout1
       push    psw     ;save char
       mvi     a,'^'
       call    cout
       pop     psw
       adi     '@'     ;convert to char
ccout1:
       call    cout
       pop     psw
       ret
ccout2:
       call    print
       db      '<DEL>',0
       pop     psw
       ret

;
; Buffers
;
crcmd:
       db      '%r',0
tempfcb:
       db      '$$$     '
       db      'Z3T'
tname:
       db      '** Empty Name **'      ;16 chars
ku:
       ds      1       ;cursor up
kd:
       ds      1       ;cursor down
kr:
       ds      1       ;cursor right
kl:
       ds      1       ;cursor left
cld:
       ds      1       ;CL delay
cmd:
       ds      1       ;CM delay
ced:
       ds      1       ;CE delay
cladr:
       ds      2       ;CL address
cmadr:
       ds      2       ;CM address
ceadr:
       ds      2       ;CE address
soadr:
       ds      2       ;SO address
seadr:
       ds      2       ;SE address
tiadr:
       ds      2       ;TI address
teadr:
       ds      2       ;TE address
cmbadr:
       ds      2       ;CM Beginning
cmmadr:
       ds      2       ;CM Middle
cmeadr:
       ds      2       ;CM Ending
reqn:
       ds      2       ;Row Equation
ceqn:
       ds      2       ;Column Equation
rcfirst:
       ds      1       ;R if Row First, C if Col First
deftyp:
       db      'Z3T'           ;default file type
firstch:
       ds      2       ;ptr to first char in string
nxtchar:
       ds      2       ;ptr to next char in string
scratch:
       ds      2       ;ptr to scratch area

       end