DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC850

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC850

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦79d4fca9f⟧ TextFile

    Length: 60416 (0xec00)
    Types: TextFile
    Names: »EENTRY.MAC«

Derivation

└─⟦4f77bd9c1⟧ Bits:30005982/disk2.imd RC Computer - Turn Key Data Entry System - Vers. 1.91
    └─⟦this⟧ »EENTRY.MAC« 
└─⟦8417fc433⟧ Bits:30005982/disk1.imd RC Computer - Turn Key Data Entry System - Vers. 1.91
    └─⟦this⟧ »EENTRY.MAC« 

TextFile

;*************************************************
;*                                               *
;*	MODULE : EENTRY.MAC        (RC-850)      *
;*	DATE   : 05.02.82                        *
;*	BY     : ASE GmbH , 6472 Altenstadt      *
;*	VERSION: 1.90                            *
;*                                               *
;*************************************************
;
; THIS IS THE KEYSTROKE-PROCESSING MODUL WHICH HANDLES ALL
; KEYSTROKES AND FUNCTION-KEYS BASED ON THE FIELD-DESCRIPTIONS
; IT IS USED IN ALL MODES EXCEPT 'FORMAT' AND 'FORMAT-UPDATE'.
;
;
; THE FOLLOWING CONTAINS
; THE KEYBOARD CODES FOR THE RC-850 KEYBOARD (MODEL PTY 001)
;
RSTCHR	equ	01h	;reset character
CHRADV	equ	24 	;character advance (right arrow)
CHRBWD	equ	08h	;character backward (left arrow)
CTRLQ	equ	86h	;this is the quit-function (PF11)
HOME	equ	29 	;cursor home position (arrow north-west)
CTRLK	equ	82h	;change format-chain-key (pa3)
CLRKEY	equ	20 	;this is the del.record key (ERASE INPUT)
CARTN	equ	0dh	;carriage return key
FADV	equ	09h	;field advance (diode symbol pointing right)
FBWD	equ	05h	;field backward (diode symbol pointing left)
CTRLD	equ	31 	;duplication key (DUP)
CTRLA	equ	85h	;PF10-key , auto-skip-dup off
CTRLFR	equ	81h	;pa2 is record advance
CTRLBR	equ	80h	;pa1 is record backward
FLDCRR	equ	84h	;field corr. key (PA5)
CTRLZ	equ	28 	;this is the insert rec key (INS LINE)
CTRLC	equ	02 	;this is the send-key
DCD	equ	88h	;pf13 is the display check-digit key
RGDSP	equ	87h	;pf12 is the register display key
NUMDUP	equ	31 	;is equal to dup-key            
;
;THE FOLLOWING EQUATES ARE DEFINED FOR THE 850-CRT-MEMORY-MAP.
;
ENDCRT	equ	0ff3dh	;end of 850-crt-buffer
FCKDSP	equ	0ff1bh	;format-chain-key display area (rc 850)
FDBDSP	equ	0feadh	;field-definition-byte-display in line 25 (rc 850)
ASDDSP	equ	0fea5h	;ASD-indicator display in line 25 (rc 850)
;
;
	PUBLIC	ENTFLG
	PUBLIC	ENTRY
	PUBLIC	FMTCHK
	PUBLIC	STBMSK
	PUBLIC	CLRFLG
	PUBLIC	CLBMSK
	PUBLIC	DUPBFF
	PUBLIC	UPDFLG
	PUBLIC	EOFLD
	PUBLIC	KEYER3
	PUBLIC	SVEBF1
	PUBLIC	REGCHK
	PUBLIC	SVEBFF
	PUBLIC	TSTFDB
	PUBLIC	REGCHK
	PUBLIC	SVEBF2
	PUBLIC	CAVFLG
	PUBLIC	UPDM15
	PUBLIC	VCRFLG
	PUBLIC	MINFLG
	PUBLIC	EFTFLG
	PUBLIC	KEYER7
	PUBLIC	CBWD4
	PUBLIC	RSTBFF
	PUBLIC	NXTLPE
	PUBLIC	MFLCHK
	PUBLIC	SKRRAC
	PUBLIC	DUPFLD
	PUBLIC	SETMSG	
	PUBLIC	FNFLG
	PUBLIC	KEYERR
	PUBLIC	BRFLD
	PUBLIC	DTEFLG
	PUBLIC	F03FLG
	PUBLIC	FLDZRO
	PUBLIC	EFRCHD
	PUBLIC	UPDM19
	PUBLIC	SKIP
	PUBLIC	RAVER
; 
	ext	R0FLG
	ext	R1FLG
	ext	R2FLG
	ext	R3FLG
	ext	R4FLG
	ext	R5FLG
	ext	R6FLG
	ext	R7FLG
	ext	R8FLG
	ext	R9FLG
	ext	R10FLG
	ext	R11FLG
	ext	R12FLG
	ext	R13FLG
	ext	R14FLG
	ext	R15FLG
	ext	R16FLG
	ext	R17FLG
	ext	R18FLG
	ext	R19FLG
	ext	R20FLG
	ext	R21FLG
	ext	R22FLG
	ext	R23FLG
	ext	R24FLG
	ext	R25FLG
	ext	LFSTB
	ext	FDBTAB
	ext	USRABT
	ext	ENTSND
	ext	FTMFLG
	ext	ENTHME
	ext	CFLAG
	ext	INTFLG
	ext	CLDEF
	ext	AUTFLG
	ext	FLDADV
	ext	FLDBWD
	ext	XFMT
	ext	VFPCTR
	ext	ENTCPL
	ext	VFCTR
	ext	FRMCPL
	ext	ILLFNO
	ext	FBFADD
	ext	SOFUBA
	ext	CBFADD
	ext	SOFCBA
	ext	BFNO
	ext	FPTTAB
	ext	SOFFBA
	ext	INCCRS
	ext	ALLINC
	ext	DSPMSG
	ext	GENFSB
	ext	ILLFRM
	ext	CHRRD
	ext	CHKBTE
	ext	NXTFDB
	ext	EFOFLG
	ext	ENDFRM
	ext	BCPCTR
	ext	DEMODE
	ext	UBFADD
	ext	INBUFF
	ext	FMTINT
	ext	DELREC
	ext	CBWFLG
	ext	FTMFLG
	ext	DUPFLG
	ext	FRMCHN
	ext	EERCTR
	ext	VERCTR
	ext	NKECTR
	ext	NKVCTR
	ext	FNCFLG
	ext	VRTCTR
	ext	VCRCTR
	ext	FMFFLG
	ext	FILCTR
	ext	RECBWD
	ext	RECADV
	ext	INSRCD
	ext	EOFPRC
	ext	RACHK
	ext	REGPRC
	ext	REGFLG
	ext	INCCRS
	ext	QFLD
	ext	TFLD
	ext	MLNFLG
	ext	AUTINC
	ext	DSPCD
	ext	CHRCNV
	ext	SGNCHK
	ext	SGNSET
	ext	ZNSGN
	ext	DSPREG
	ext	FCORR
	ext	VCRPSS
	ext	PF2FLG
	ext	SOKBBA
	ext	ATTBYT
	ext	ATTSVE
	ext	BLINIT
	ext	BLMVE
	ext	ATTCHK
	ext	co
	ext	CONST
	ext	SGNCHK
;
;
;
;the following mainly checks for a legal field number and
;builds up the field oriented pointers to the 3 main buffers:
;format-buffer, user-buffer, crt-buffer
;
ENTRY:	ld	a,(CLRFLG)	;test the
	cp	0ffh		;clear key flag
	jp	z,CLRKY1	;its set.
	ld	a,00h		;
	ld	bc,R0FLG	;
	ld	hl,25		;
	call	INBUFF		;clear all the register flags
	ld	a,0ffh		;
	ld	(STRFLG),a	;set start of field flag
	ld	hl,(BFNO)	;get binary field number
	ld	bc,0h		;
	and	a		;
	sbc	hl,bc		;
	jp	nz,ENTRY8	;
	ld	a,(DEMODE)	;
	cp	05h		;format-data mode?
	jp	nz,FLDZRO	;ret to user if not.
ENTRY8:	ld	hl,(BFNO)	;
	ld	de,(VFCTR)	;
	and	a		;
	ex	de,hl		;
	sbc	hl,de		;compare with max.no of fields
	jp	m,ILLFNO	;illegal field number
	ex	de,hl		;
	ld	a,(DEMODE)	;
	cp	02h		;update-mode?
	jp	z,UPDMV		;yes.
	cp	05h		;format-data mode?
	jp	z,UPDM15	;yes.
ENTRY6:	dec	hl		;align with fpt-entry zero
	add	hl,hl		;x2
	add	hl,hl		;x4
	ld	de,FPTTAB	;derive buffer
	add	hl,de		;addresses
	ld	c,(hl)		;
	inc	hl		;
	ld	b,(hl)		;
	ld	(SOFFBA),bc	;from
	inc	hl		;the
	ld	c,(hl)		;
	inc	hl		;field pointer table
	ld	b,(hl)		;
	ld	hl,0ffffh	;
	and	a		;
	sbc	hl,bc		;
	jp	z,ENDFLD	;end of format reached!
	ld	(SOFUBA),bc	;
	ld	de,(FBFADD)	;calculate
	ld	hl,(SOFFBA)	;crt - start
	and	a		;
	sbc	hl,de		;format buffer address
	ld	de,(CBFADD)	;
	add	hl,hl		;
	add	hl,de		;
	ld	(SOFCBA),hl	;
;
;the following will wether a record is to be displayed on the crt
;during update-mode before allowing entry.
;
	ld	a,(DEMODE)	;
	cp	02h		;
	jp	z,UPDMV9	;test for updatemode-move.
;
	cp	05h		;
	jp	z,UPDMV9	;go on format-data mode.
	ld	a,(CAVFLG)	;
	cp	0ffh		;clear all var.flds flg set?
	ret	z		;ret if it is.
;
;the following will check for an FSB in the format
;this check will be bypassed if fieldstart is equal buffer-start.
;
ENTRY7:	ld	hl,(SOFFBA)	;
	ld	bc,(FBFADD)	;
	and	a		;
	sbc	hl,bc		;fieldstart = start of formatbuffer?
        jp      nz,ENTR11       ;go on not equal
	ld	a,00h		;
	ld	(ATTBYT),a	;set to normal attribute
	jp	ENTRY3		;
ENTR11: ld      hl,(SOFFBA)	;
	dec	hl		;
	ld	c,(hl)		;get FSB (if it is one)
        call	ATTCHK		;xlate attribute byte
        ld	c,(hl)		;
	ld	a,0fh		;
	and	c		;mask out upper 4 bits
	cp	02h		;display-only field?
	jp	z,TSTFLD	;yes.
	cp	04h		;no-display/no-modify field?
	jp	z,TSTFLD	;yes.
	cp	03h		;
	jp	z,SETF03	;update-only field.
	cp	06h		;duplicate-format field?
	jp	nz,ENTRY4	;bypass if not.
	ld	a,0ffh		;
	ld	(DFFLG),a	;set duplicate-format flag
ENTRY4:	ld	a,0h		;
	ld	(F03FLG),a	;clear the flag
;
;the following will test the bit-mask for the current field
;if bit set cursor movement will be allowed over the full 
;field. if not the bit in the mask will be set.
;
ENTRY3:	call	TSBMSK		;test the field-mask bit
	cp	0ffh		;
	jp	z,ENTRY1	;go if bit set.
	ld	a,0ffh		;
	ld	(RESFLG),a	;
	ld	hl,0h		;
	ld	(BCPCTR),hl	;
	call	STBMSK		;
	jp	ENTRY2		;
ENTRY1:	ld	a,0h		;
	ld	(RESFLG),a	;
	ld	(MTCFLG),a	;
	ld	hl,(BFNO)	;
	ld	bc,(RESSV1)	;
        and	a		;
	sbc	hl,bc		;
	jp	nz,ENTRY2	;actual and saved fno dont match.
	ld	hl,(RESSV2)	;
	ld	(BCPCTR),hl	;
	ld	a,0ffh		;
	ld	(RESFLG),a	;
	ld	(MTCFLG),a	;
;
;the following presets and clears vaious flags
;
ENTRY2:	ld	a,0ffh		;
	ld	(ENTFLG),a	;set entry-mode flag
	ld	hl,0		;clear the
	ld	(FILCTR),hl	;field length counter
	ld	(MXFLNG),hl	;
	ld	a,0		;
	ld	(FBFLG),a	;clear the fwd-flag
	ld	(FFLG),a	;clear the fwd-flag
	ld	(CADFLG),a	;
	ld	(FNFLG),a	;clear function-key flag
	ld	(VRTCTR),a	;clear verify retry ctr
	ld	(MFFLG),a	;clear must fill flag
	ld	(EFRCHD),a	;clear end-of-field-reached flag
	ld	a,(DFFLG)	;
	cp	0ffh		;
	jp	z,DFFLD		;go if duplicate format flag set.
;
;
;the following (thru to ENTRY5) will fill the field on crt with
;periods after it has been verify/field corrected in verify mode
;to allow succeding verifying of the corrected field
;
	ld	a,(VCRPSS)	;verify/field correction pass flag set?
	cp	0ffh		;
	jp	nz,ENTRY5	;
	call	SVEBFF		;save the buffers
	ld	a,0ffh		;
	ld	(INTFLG),a	;set intflag
ENTRY9:	ld	hl,(SOFCBA)	;
	ld	a,2eh		;
	ld	(hl),a		;display period 
	call	NXTFDB		;
	call	GENFSB		;
	cp	0ffh		;
	jp	z,ENTR10	;end of field
	cp	20h		;
	jp	z,ENTR10	;end of field
	jp	ENTRY9		;
ENTR10:	call	RSTBFF		;restore the buffers
	ld	a,00h		;
	ld	(INTFLG),a	;
;
;THE FOLLOWING WILL SET THE CURSOR TO START OF FIELD
;
ENTRY5:	call	INCCRS		;
;
;the following will read and test the field - start/continuation byte.
;
NXTLPE:	call	GENFSB		;
	cp	0ffh		;FSB ?
	jp	z,EFT   	;yes , means end of field.
	cp	20h		;space?
	jp	z,EFT   	;yes ,end of field
	cp	55h		;00-1fh ?
	jp	z,ILLFRM	;format error.
	cp	00h		;21-2f ?
	jp	z,CNTFDB	;could be field cont.character.
	cp	01		;could be a register (alpha range)
	jp	z,REGCHK	;
	cp	02		;Field start byte or register ?
	jp	z,TSTFDB	;
	jp	ILLFRM		;bad format !
SETMSG:	ld	a,85h		;
	call	DSPMSG		;set entry-ready message
;
;the following will read acharacter from the keyboard, unless
;the current field is a duplication-field.
;
GETCHR:	ld	a,0h		;
	ld	(CADFLG),a	;
	ld	a,(DUPFLG)	;
	cp	0ffh		;dup-flag set?
	jp	z,DUPFLD	;yes.
	call	CHRRD		;get character from keyboard
;
;the following will analyse the class of character just received
;from the keyboard and branch to the respective routines.
;
GETCH1:	call	CHKBTE		;check range of character
	cp	02h		;normal alpha ?
	jp	z,ALPCHR	;yes
	cp	01h		;normal numeric ?
	jp	z,NUMCHR	;yes
	cp	0ffh		;function key ?
	jp	z,FNKEY		;yes
	CP	55H		;CTRL KEY FUNCTION ?
	JP	Z,FNKEY		;YES.
	cp	20h		;space ?
	jp	z,ALPCHR	;yes
	cp	00h		;special characters ?
	jp	z,ALPCHR	;yes
	jp	KEYERR		;anything else is an error.
;
;the following will increment the buffer pointers and branch
;for the processing of the next character.
;
NXTCHR:	call	NXTFDB		;step to next position.
	JP	NXTLPE		;LOOP FOR NEXT CHARACTER
;
;
;whenever the application programm addresses field zero (not existant)
;the following will set the cursor to the last position on the
;crt,set field-number to 1 and return to the user-interface.
;
FLDZRO:	ld	hl,ENDCRT       ;
	ld	(SOFCBA),hl	;
	call	INCCRS		;
	ld	hl,1h		;
	ld	(BFNO),hl	;set field no. to 1.
	jp	ENTCPL		;
;
;
;the following will inc the field length ctr and dec the field backward
;position counter (if not zero)
;
ASCE14:	ld	a,(SKPFLG)	;
	cp	0ffh		;skip flag set?
	jp	z,ASCE15	;yes,bypass incr.the FILCTR
	ld	a,(EFRCHD)	;
	cp	0ffh		;end of format flag set?
	jp	nz,ASCE25	;bypass if end-of-field has been reachd
	ld	bc,(FILCTR)	;
	ld	hl,(MXFLNG)	;
	and	a		;
	sbc	hl,bc		;
	jp	z,ASCE15	;bypass incrementing the Field length.
ASCE25:	ld	bc,(FILCTR)	;inc the
	inc	bc		;field length counter
	ld	(FILCTR),bc	;
ASCE15:	ld	hl,(BCPCTR)	;
	ld	de,0h		;
	and	a		;
	sbc	hl,de		;
	ret	z		;
	dec	hl		;dec bcpctr if not zero.
	ld	(BCPCTR),hl	;
	ret			;
;
;
;depending on the mode in use , the following will update the 
;statistical counters and write the entered character to the 
;screen and user-buffer.
;
ASCENT:	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	z,ASCEN3	;yes.
	cp	00h		;entry mode?
	jp	nz,ASCE10	;go, if not.
	ld	hl,(NKECTR)	;
	inc	hl		;inc
	ld	(NKECTR),hl	;the # of keys entered
ASCE10:	ld	hl,(SOFUBA)	;
	ld	(hl),c		;store character in user buffer
ASCEN5:	ld	hl,(SOFCBA)	;
	ld	a,(F03FLG)	;FSB03-flag set?
	cp	0ffh		;
	jp	z,ASCEN2	;yes.
	call	CHRCNV		;convert char and store to crt
	ld	a,(EFTFLG)	;
	cp	0ffh		;
	jp	z,NXTCHR	;
	call	ASCE14		;
	jp	NXTCHR		;
;
ASCEN2:	ld	c,2eh		;
	call    CHRCNV          ;display period in place of character
	ld	a,(EFTFLG)	;
	cp	0ffh		;
	jp	z,NXTCHR	;
	call	ASCE14		;
	jp	NXTCHR		;
;
ASCEN3:	ld	a,00h		;
	ld	(MINFLG),a	;clear minus-flag
	ld	(POSFLG),a	;clear pos-flag
	ld	a,(F03FLG)	;
	cp	0ffh		;no-display flg set?
	jp	z,EOFLD		;force end of field on verify mode.
	ld	hl,(SOFUBA)	;get char.from userbuffer.
	ld	a,(hl)		;to a-reg.
	cp	c		;compare with keyboard character.
	jp	nz,ASCEN4	;go on no-match.
ASCE16:	ld	a,00h		;
	ld	(VRTCTR),a	;clear the verify-retry ctr.
	ld	hl,(NKVCTR)	;
	inc	hl		;
	ld	(NKVCTR),hl	;inc the # of keys verified.
	jp	ASCEN5		;
;
;comes here on verify mismatch.
;checks for 4th retry.if it isnt will display the full field and
;display the error message.
;
ASCEN4:	ld	a,c		;
	ld	(SGNCHR),a	;save keyboard character
	ld	(KBCHR),a	;here too.
	call	RACHK		;
	cp	0ffh		;right adjust field?
	jp	nz,ASCE13	;
	ld	hl,(SOFUBA)	;
	ld	a,(hl)		;get character from user-buffer
	ld	hl,SGNCHR	;load address
	ld	c,a		;save user buffer char. to c-reg
	call	SGNSET		;get zoned equivalent character
	ld	a,(SGNCHR)	;to a-reg
	cp	c		;match with user buffer character?
	jp	nz,ASCE13	;go if not.
	ld	a,0ffh		;
	ld	(MINFLG),a	;set minus flag
	ld	a,(KBCHR)	;
	ld	c,a		;
	jp	ASCE16		;
ASCE13:	ld	a,(SKPFLG)	;
	cp	0ffh		;
	jp	nz,ASCE22	;
	ld	a,00h		;
	ld	(SKPFLG),a	;
	jp	ASCE23		;
ASCE22:	ld	a,(VRTCTR)	;
	cp	03h		;4th retry on same character?
	jp	z,ASCEN6	;yes.
	inc	a		;
	ld	(VRTCTR),a	;inc the retry ctr
ASCE23:	ld	a,(MINFLG)	;
	cp	0ffh		;
	jp	nz,ASCE17	;
	ld	a,11		;
	call	DSPMSG		;set 'sign-error ' msg
	ld	a,0ffh		;
	ld	(CFLAG),a	;set call flag
	call	KEYER3		;handle error msg procedur
	jp	SETMSG		;and get next keyboard entry
ASCE17:	call	SVEBFF		;save the buffer-pointers.
	ld	a,01h		;
	call	DSPMSG		;set verify-error message
ASCEN8:	ld	a,0ffh		;
	ld	(INTFLG),a	;
	ld	de,(SOFUBA)	;
	ld	hl,(SOFCBA)	;
	ld	a,(de)		;move char. from user-buffer
	ld	c,a		;
	call    CHRCNV          ;to the crt
	call	NXTFDB		;
	call	GENFSB		;
	cp	0ffh		;
	jp	z,ASCEN9	;end of field.
	cp	20h		;
	jp	z,ASCEN9	;end of field.
	jp	ASCEN8		;
;
;this calls the keyerror routine followed by resetting the
;the field's display .
;
ASCEN9:	ld	a,0ffh		;
	ld	(CFLAG),a	;
	call	KEYER3		;handle the verify-error
	call	RSTBFF		;restore the buffer pointers
ASCE12:	ld	a,0ffh		;
	ld	(INTFLG),a	;set int-flag
	ld	hl,(SOFCBA)	;fill up
	ld	c,2eh		;with period.
	call    CHRCNV          ;
	call	NXTFDB		;
	call	GENFSB		;
	cp	0ffh		;end of field?
	jp	z,ASCE11	;yes.
	cp	20h		;end of field?
	jp	z,ASCE11	;yes.
	jp	ASCE12		;
;
ASCE11:	call	RSTBFF		;restore the buffers
	ld	a,00h		;
	ld	(INTFLG),a	;
	jp	SETMSG		;and ret to the loop.
;
;comes here after the 3rd verify retry.
;
ASCEN6:	ld	a,(MINFLG)	;
	cp	0ffh		;
	jp	z,ASCE18	;handle minus to positive sign correct.
	ld	a,(POSFLG)	;
	cp	0ffh		;
	jp	z,ASCE19	;handle positive to minus sign correct.
	ld	hl,(SOFUBA)	;
	ld	a,(hl)		;get char. from user buffer
	ld	hl,SGNCHR	;
	ld	(hl),a		;
	call	SGNCHK		;check if character zoned.
	ld	a,(KBCHR)	;
	ld	c,a		;keyboard character to c-reg
	ld	a,(ZNSGN)	;
	cp	0ffh		;user buffer char.zoned?
	jp	nz,ASCE21	;go if not.
	ld	hl,KBCHR	;
	call	SGNSET		;xlate kb-char to zoned
	ld	c,(hl)		;
	ld	a,0ffh		;
	ld	(MINFLG),a	;set minus-flag
ASCE21:	ld	hl,(SOFUBA)	;
	ld	(hl),c		;write char. to user-buffer.
	ld	hl,(SOFCBA)	;
	call	CHRCNV		;xlate and store to the crt
	ld	a,0ffh		;
	ld	(VCRFLG),a	;set the verify correction flag
	ld	hl,(VCRCTR)	;
	inc	hl		;
	ld	(VCRCTR),hl	;inc the verify-corr.ctr
	ld	a,00h		;
	ld	(VRTCTR),a	;reste the verify-retry ctr.
	call	ASCE14		;
	jp	NXTCHR		;and join the loop again.
;
;comes here to correct a zoned field to a positive field during
;verify mode.(only on right adjust fields)
;
ASCE18:	ld	hl,(SOFUBA)	;
	call	SGNCHK		;xløate zoned to non-zoned
	ld	c,(hl)		;
	ld	hl,(SOFCBA)	;
	call    CHRCNV          ;also correct crt
	ld	a,00h		;
	ld	(MINFLG),a	;clear minus flag
	jp	ASCE20		;
;
;comes here to correct a positive field to a zoned field as above.
;
ASCE19:	ld	hl,(SOFUBA)	;
	call	SGNSET		;xlate positive to zoned
	ld	c,(hl)		;
	ld	hl,(SOFCBA)	;
	call    CHRCNV          ;correct also crt
	ld	a,00h		;
	ld	(POSFLG),a	;
;
ASCE20:	ld	a,0ffh		;
	ld	(VCRFLG),a	;set verify correction flag
	ld	hl,(VCRCTR)	;
	inc	hl		;
	ld	(VCRCTR),hl	;inc the verify corr. ctr.
	jp	EOFPRC		;
;
SGNCHR:	db	00h		;
VCRFLG:	db	00h		;verify correction flag
KBCHR:	db	00h		;
;
;the following are used to save and restore the 3 buffer pointers
;for the userbuffer,formatbuffer,crtbuffer.
;
SVEBFF:	ld	(SVEBF0),hl	;save hl-reg
	ld	hl,(SOFUBA)	;
	ld	(SVEBF1),hl	;
	ld	hl,(SOFCBA)	;
	ld	(SVEBF2),hl	;
	ld	hl,(SOFFBA)	;
	ld	(SVEBF3),hl	;
	ld	hl,(SVEBF0)	;restore hl-reg
	ret			;
;
RSTBFF:	ld	(SVEBF0),hl	;
	ld	hl,(SVEBF1)	;
	ld	(SOFUBA),hl	;
	ld	hl,(SVEBF2)	;
	ld	(SOFCBA),hl	;
	ld	hl,(SVEBF3)	;
	ld	(SOFFBA),hl	;
	ld	hl,(SVEBF0)	;
	ret			;
;
SVEBF0:	dw	0000h		;
SVEBF1:	dw	0000h		;
SVEBF2:	dw	0000h		;
SVEBF3:	dw	0000h		;
;
;
;the following routine will be used whenever the end-of-format
;character was found.
;
ENDFLD:	ld	a,0ffh		;
	ld	(EFOFLG),a	;
	ld	a,(DEMODE)	;
	cp	02h		;
	jp	z,ENDFL1	;
	ld	a,(CAVFLG)	;
	cp	0ffh		;
	ret	z		;
ENDFL2:	ld	a,0h		;clear flags and ctr's
	ld	(FFLG),a	;
	ld	(FBFLG),a	;
	ld	(CLRFLG),a	;
	ld	(CBWFLG),a	;
	ld	(F03FLG),a	;
	ld	(FTMFLG),a	;
	ld	a,0ffh		;
	ld	(UPDFLG),a	;
	ld	hl,0h		;
	ld	(BCPCTR),hl	;
	ld	(FILCTR),hl	;
	jp	ENDFRM		;return to user interf. on end of form.
;
ENDFL1:	ld	a,(UPDFLG)	;
	cp	0ffh		;
	ret	z		;
	jp	ENDFL2		;
;
;the following stops the user from leaving the field without
;without using a function key on all right-adjust fields.
;on all other fields the field will be exited.
;
EFT:	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	nz,EOFLD	;go if not
	ld	a,(MINFLG)	;
	cp	0ffh		;minus-flag set?(Zoned)
	jp	nz,EOFLD	;go if not
	call	RACHK		;check for right adjust fields
	cp	00h		;
	jp	z,EOFLD		;go if it isnt.
	ld	a,(EFRCHD)	;
	cp	0ffh		;
	jp	z,EFT1		;
	ld	hl,(FILCTR)	;
	ld	(MXFLNG),hl	;
EFT1:	ld	a,0ffh		;
	ld	(EFRCHD),a	;set end-of-field-reached flag
	ld	a,(CADFLG)	;
	cp	0ffh		;
	jp	z,EOFLD		;
	ld	a,(CBWFLG)	;
	cp	0ffh		;
	jp	z,EOFLD		;
	ld	a,0ffh		;
	ld	(EFTFLG),a	;
	jp	CBWD4		;go character backward.
;
EFTFLG:	db	00h		;
EFRCHD:	db	00h		;end of field reached flag
MXFLNG:	dw	00h		;max.-field-length counted up.
;
;the following handles the end of field .
;
EOFLD:	ld	a,(CADFLG)	;
	cp	0ffh		;
	jp	z,FLADV		;
	ld	a,0ffh		;
	ld	(EFLFLG),a	;
	ld	a,(CBWFLG)	;
	cp	0ffh		;char.backw.flag set?
	jp	z,CBWD2		;yes.
	ld	a,0ffh		;
	ld	(FFLG),a	;
	ld	a,0h		;
	ld	(FBFLG),a	;
	ld	(DUPFLG),a	;
	ld	(INTFLG),a	;
	ld	(EFTFLG),a	;
	ld	(CFLAG),a	;
	call	FLDCHK		;
	ld	a,0h		;
	ld	(EFLFLG),a	;
	ld	a,(FLDERR)	;
	cp	0ffh		;
	jp	nz,REGPRC	;
	ld	a,0		;
	ld	(FLDERR),a	;
	ld	(EFTFLG),a	;
	jp	KEYERR		;
;
EFLFLG:	db	0h		;
;
;
;the following handles the key-errors by setting a message and
;requesting a reset-key (ESC).
;
KEYERR:	ld	a,03h		;set the
KEYER7:	call	DSPMSG		;entry-error message.
KEYER3:	ld	c,07h		;beep the
	call	co		;user
	call	CHRRD		;
	cp	RSTCHR		;escape character
	jp	z,KEYER1	;yes
	ld	a,0ffh		;
	jp	KEYER7		;wait for it
KEYER1:	ld	a,(FNCFLG)	;
	cp	0ffh		;function flag set?
	jp	z,KEYER6	;yes,its set.
	ld	a,(DEMODE)	;
	cp	00h		;entry mode?
	jp	z,KEYER4	;yes.
	cp	01h		;verify mode?
	jp	z,KEYER5	;yes.
KEYER6:	ld	a,00h		;
	ld	(DUPFLG),a	;clear the dup-flag
	ld	(FNCFLG),a	;clear the function-flag
	ld	(INTFLG),a	;clear the Int-flg (preventive measure)
	ld	a,(CFLAG)	;test
	cp	0ffh		;call flag
	jp	z,KEYER2	;its set
	jp	SETMSG		;restore the entry-message and continue
KEYER2:	ld	a,0h		;
	ld	(CFLAG),a	;
	ret			;
;
KEYER4:	ld	hl,(EERCTR)	;
	inc	hl		;
	ld	(EERCTR),hl	;inc the entry-error ctr.
	jp	KEYER6		;
;
KEYER5:	ld	hl,(VERCTR)	;
	inc	hl		;
	ld	(VERCTR),hl	;inc the verify-error ctr.
	jp	KEYER6		;
;
;
;
ENTFLG:	ds	1		;entry-mode flag
;
;the following will analyse the function-key received from
;the keyboard and branch off to the respective routine.
;
FNKEY:	ld	a,0ffh		;
	ld	(FNFLG),a	;set function key flag
	ld	a,c		;character to a
	cp	CHRADV		;character advance?
	jp	z,CADV		;yes
	cp	CHRBWD		;character backward?
	jp	z,CBWD		;yes.
	cp	CTRLQ		;quit?
	jp	z,USRABT	;yes
	cp	HOME		;home?
	jp	z,HME		;yes.
	cp	CLRKEY		;
	jp	z,CLRREC	;yes clear key.
	cp	FADV		;field advance?
	jp	z,FLADV		;yes.
	cp	FBWD		;field backward?
	jp	z,FLBWD		;yes
	cp	CARTN		;carriage return?
	jp	z,SKRRAC	;check for skip/right adjust
	cp	CTRLK		;modify format chain key?
	jp	z,FMTCHK	;yes.
	cp	CTRLD		;dup-field?
	jp	z,DUPFLD	;yes.
	cp	NUMDUP		;additional dup-key (pf1) ?
	jp	z,DUPFLD	;yes.
	cp	CTRLA		;override-dup function?
	jp	z,OVRDUP	;yes.
	cp	FLDCRR		;field correction?
	jp	z,FCORR		;yes.
	cp	CTRLFR		;record-advance?
	jp	z,RECFOB	;yes
	cp	CTRLBR		;record-backward?
	jp	z,RECFOB	;yes.
	cp	CTRLZ		;insert record ?
	jp	z,INSREC	;yes.
	cp	CTRLC		;send key?
	jp	z,SNDCHK	;yes.
	cp	DCD		;display check digit?
	jp	z,DSPCD		;yes.
	cp	RGDSP		;display register?
	jp	z,DSPREG	;yes.
	ld	a,0ffh		;
	ld	(FNCFLG),a	;set function flag.
	ld	a,00h		;
	ld	(FNFLG),a	;clear function key flag
	jp	KEYERR		;must be an illegal function
FNFLG:	db	00h		;function key flag
;
;
;the following handles the character-advance function key.
;
CADV:	ld	a,0ffh		;
	ld	(CADFLG),a	;
	ld	a,(DEMODE)	;
	cp	02h		;update mode?
	jp	nz,OTMODE	;no , other mode's
CHRAD1:	jp	CHRAD2		;
OTMODE:	ld	a,(RESFLG)	;
	cp	0h		;
	jp	z,CHRAD2	;
	ld	hl,0h		;
	ld	bc,(BCPCTR)	;
	and	a		;
	sbc	hl,bc		;backward pos.ctr zero?
	jp	z,KEYERR	;yes it is,dont allow advance.
CHRAD2:	ld	hl,00h		;
	ld	bc,(BCPCTR)	;
	and	a		;
	sbc	hl,bc		;
	jp	z,CHRAD3	;
	ld	bc,(BCPCTR)	;
	dec	bc		;
	ld	(BCPCTR),bc	;decr.backw.pos ctr
CHRAD3:	ld	bc,(FILCTR)	;
	inc	bc		;
	ld	(FILCTR),bc	;inc the field length counter
	jp	NXTCHR		;
;
CADFLG:	db	00h		;
;
;the following handles the character-backward function key.
;
CBWD:	ld	a,(EFLFLG)		;
	cp	0ffh			;
	jp	nz,CBWD7		;
	ld	hl,01h			;
	ld	bc,(FILCTR)	;
	and	a		;
	sbc	hl,bc		;go only if end-of-field-reached
	jp	nz,CBWD7	;bypass if not
	jp	CBWD1		;
CBWD7:	ld	bc,(FILCTR)		;
	ld	hl,0h			;
	and	a		;
	sbc	hl,bc		;field pos.ctr = zero ?
	jp	z,CBWD1		;field crossing needed
	dec	bc		;
	ld	(FILCTR),bc	;dec field pos. ctr.
	ld	a,00h		;
	ld	(EFLFLG),a	;
	ld	hl,00h		;
	and	a		;
	sbc	hl,bc		;
	jp	nz,CBWD6	;
	ld	a,0ffh		;
	ld	(STRFLG),a	;set the field start flag again.
CBWD6:	ld	bc,(BCPCTR)	;
	inc	bc		;inc the backward pos.ctr.
	ld	(BCPCTR),bc	;
CBWD4:	ld	bc,(SOFCBA)	;
	dec	bc		;dec the 
	dec	bc		;
	dec	bc		;
	dec	bc		;crt buffer by four
	ld	(SOFCBA),bc	;
	ld	bc,(SOFFBA)	;
	dec	bc		;dec the
	dec	bc		;format buffer address
	ld	(SOFFBA),bc	;by two.
	ld	bc,(SOFUBA)	;
	dec	bc		;dec the
	dec	bc		;user buffer address
	ld	(SOFUBA),bc	;by two.
	jp	NXTCHR		;
;
;this handles field-backward crossing on character backward.
;
CBWD1:	ld	hl,(BFNO)	;
	ld	bc,1h		;
	and	a		;
	sbc	hl,bc		;check for field 1/pos.1.
	jp	z,GETCHR	;ignore CBWD if it is.
	ld	a,0ffh		;
	ld	(CBWFLG),a	;set character backward flag
	ld	(INTFLG),a	;set int-flag to inhibit cursor movem.
	ld	a,00h		;
	ld	(EFLFLG),a	;clear the end of field flag
	jp	FLBWD		;exit via field backward.
;
;control comes back here after field-backward resulting from
;previous character-backward has been issued by the application
;program.
;
CBWD2:	ld	a,(EFLFLG)	;
	cp	0ffh		;end of field flag set?
	jp	z,CBWD3		;yes.
	ld	hl,(FILCTR)	;
	inc	hl		;
	ld	(FILCTR),hl	;inc the field pos. ctr.
	ld	a,(MTCFLG)	;
	cp	0ffh		;
	jp	z,CBWD5		;
	ld	a,0ffh		;
	ld	(INTFLG),a	;set int-flag again.
	jp	NXTCHR		;keep looping
;
CBWD5:	ld	bc,(BCPCTR)	;
	ld	hl,0h		;
	and	a		;
	sbc	hl,bc		;
	jp	z,CBWD3		;
	dec	bc		;
	ld	(BCPCTR),bc	;
	jp	CBWD2		;
;
CBWD3:	ld	a,0h		;reset
	ld	(CBWFLG),a	;the character backward flag
	ld	(INTFLG),a	;reset intflag
	ld	(STRFLG),a	;reset the start-of-field flag
	ld	(EFLFLG),a	;reset end of field flag
	ld	(EFRCHD),a	;reset end-of-field-reached flag
	ld	hl,(BCPCTR)	;
	inc	hl		;
	ld	(BCPCTR),hl	;inc the backw.pos.ctr.
	ld	hl,(FILCTR)	;
	dec	hl		;adjust the field length counter.
	ld	(FILCTR),hl	;
	ld	bc,00h		;
	and	a		;
	sbc	hl,bc		;
	jp	nz,CBWD4	;go if not one-pos.field.
	ld	hl,00h		;
	ld	(BCPCTR),hl	;
	ld	a,0ffh		;
	ld	(STRFLG),a	;
	jp	CBWD4		;join the backward code.
;
;the following allows clearing (spacing) of the record held
;in user-buffer during update-mode.
;
;
CLRREC:	ld	a,(DEMODE)	;
	cp	02h		;update mode?
	jp	z,CLRRE1	;
	ld	a,0ffh		;
	ld	(FNCFLG),a	;
	jp	KEYERR		;
CLRRE1:	ld	bc,(UBFADD)	;clear the
	ld	hl,(VFPCTR)	;user buffer
	ld	a,20h		;
	call	INBUFF		;
;
	ld	a,0h		;clear the
	ld	(ENTFLG),a	;entry-mode-flag
	ld	a,0ffh		;set the
	ld	(CLRFLG),a	;clear function flag
	jp	FMTINT		;
;
CLRKY1:	ld	a,0h		;
	ld	(CLRFLG),a	;clear the clear-flag
	jp	DELREC		;ret to user interface.
;
CLRFLG:	ds	1		;
;
;
;the following handles the field-advance function.
;
FLADV:	ld	a,0ffh		;
	ld	(FFLG),a	;
	ld	a,0h		;
	ld	(FBFLG),a	;
	call	FLDCHK		;
	ld	a,(FLDERR)	;
	cp	0ffh		;
	jp	nz,FLDADV	;
	ld	a,0h		;
	ld	(FLDERR),a	;
	ld	a,(CADFLG)	;
	cp	0ffh		;
	jp	nz,KEYERR	;
	ld	a,00h		;
	ld	(CADFLG),a	;
;	ld	a,(EFRCHD)	;
	ld	a,(EFLFLG)	;
	cp	0ffh		;
	jp	nz,KEYERR	;
	ld	a,0ffh		;
	ld	(EFTFLG),a	;set end of field flag
	jp	CBWD4		;
	jp	KEYERR		;
;
;
FFLG:	db	0h		;
;
;
;the following handles the field-backward function.
;
FLBWD:	ld	hl,(BFNO)	;
	ld	bc,1		;
	and	a		;
	sbc	hl,bc		;
	jp	z,GETCHR	;ignore it , already at fld 1
	ld	a,0ffh		;
	ld	(FBFLG),a	;
	ld	a,0h		;
	ld	(FFLG),a	;
	call	FLDCHK		;
	ld	a,(FLDERR)	;
	cp	0ffh		;
	jp	nz,FLDBWD	;
	ld	a,0h		;
	ld	(CBWFLG),a	;
	ld	(FLDERR),a	;
	jp	KEYERR		;
FLBWD1:	ld	a,0ffh		;
	ld	(FBFLG),a	;set fld-backw.flg
	ld	a,00h		;
	ld	(EFTFLG),a	;
	jp	FLDBWD		;
;
FBFLG:	db	00h		;
;
;the following allows positioning into the first variable
;field of the current format.
;
HME:	ld	a,0ffh		;
	ld	(HMEFLG),a	;
	call	FLDCHK		;
	ld	a,(FLDERR)	;
	cp	0ffh		;
	jp	nz,ENTHME	;
	ld	a,0h		;
	ld	(FLDERR),a	;
	jp	KEYERR		;
;
HMEFLG:	db	0h		;
;
;the following handles the change-format-chain-key function
;
FMTCHK:	ld	a,0h		;
	ld	(BTCNT),a	;
	ld	a,(ATTBYT)	;
	ld	(ATTSVE),a	;
	ld	bc,(SOFCBA)	;
	ld	(SVFMT1),bc	;save current crt buffer pointer
	ld	bc,FPTTAB	;calc. format buffer
	ld	hl,(VFCTR)	;for last field (E)
	dec	hl		;
	add	hl,hl		;x2
	add	hl,hl		;x4
	add	hl,bc		;
	ld	c,(hl)		;
	inc	hl		;
	ld	b,(hl)		;
	inc	bc		;
	push	bc		;move it to
	pop	hl		;the hl reg
	ld	(SVFMT2),hl	;and save it
	ld	de,FCKDSP	;load display area in line 25
	ld	(SOFCBA),de	;
	ld	bc,3h		;
	call    BLMVE           ;and move the FCK to line 25
	ld	a,0ffh		;set 
	ld	(MLNFLG),a	;message line flag
	call	INCCRS		;set cursor to line 25
FMTCH4:	ld	a,84h		;
	call	DSPMSG		;set form.chain.key message
FMTCH3:	call	CHRRD		;get keyboard character
	call	CHKBTE		;check the character
	cp	01h		;is it a numeric ? (30-39h)
	jp	nz,FMTCH1	;no .
	ld	hl,(SOFCBA)	;
	call    CHRCNV		;display the character
	inc	hl		;
	ld	(SOFCBA),hl	;inc the crt-buffer
	ld	a,(BTCNT)	;get byte-count
	cp	02h		;3rd byte?
	jp	z,FMTCH5	;yes.
	inc	a		;
	ld	(BTCNT),a	;inc the byte count
	ld	a,0ffh		;
	ld	(MLNFLG),a	;set the message line flag
	call	INCCRS		;inc the cursor
	jp	FMTCH3		;loop for next character
FMTCH1:	ld	a,c		;
	cp	0dh		;carriage return ?
	jp	z,FMTCH6	;prepare exit to user interface
	cp	RSTCHR		;escape character ?
	jp	z,FMTCH2	;yes time to ret to entry-level
FMTCH7:	ld	a,0ffh		;
	ld	(CFLAG),a	;set call-flag.
	call	KEYERR		;do keystroke error
	jp	FMTCH4		;loop for next character
FMTCH2:	ld	bc,FCKDSP	;
	ld	hl,3h		;
	ld	a,20h		;
	call	BLINIT		;clear message area
	ld	a,0ffh		;
	ld	(MLNFLG),a	;
	ld	hl,(SVFMT1)	;
	ld	(SOFCBA),hl	;
	call	INCCRS		;
        ld	a,(ATTSVE)	;
	ld	(ATTBYT),a	;
	jp	SETMSG		;restore the cursor
FMTCH5:	ld	a,0h		;
	ld	(BTCNT),a	;
	ld	hl,FCKDSP	;
	ld	(SOFCBA),hl	;
	ld	a,0ffh		;
	ld	(MLNFLG),a	;
	call	INCCRS		;
	jp	FMTCH3		;set cursor back to pos.1 os mesg.area
;
;
FMTCH6:	ld	hl,FCKDSP	;
FMTCH9:	ld	a,(hl)		;
	cp	30h		;
	jp	z,FMTCH8	;
	ld	a,0ffh		;
	ld	(ZROFLG),a	;
FMTC10:	inc	hl		;
	ld	a,l		;
	cp	0beh		;
	jp	nz,FMTCH9	;
	ld	a,(ZROFLG)	;
	cp	00h		;
	jp	z,FMTCH7	;error,FCK all zeroes.
	ld	a,00h		;
	ld	(ZROFLG),a	;
	ld	de,FRMCHN	;move
	ld	hl,FCKDSP	;updated
	ld	bc,3		;FCK to
FMTC11:	ldi                     ;to FRMCHN in the CCB
	inc	hl		;
	jp	pe,FMTC11	;loop until done
	jp	XFMT		;exit to user interface
;
FMTCH8:	ld	a,(ZROFLG)	;
	cp	0ffh		;
	jp	z,FMTC10	;
	ld	a,00h		;
	ld	(ZROFLG),a	;
	jp	FMTC10		;
;
BTCNT:	ds	1		;byte count for FCK Display (0-3)
SVFMT1:	ds	2		;crt bufferaddress savearea
SVFMT2:	ds	2		;msg area address save address
ZROFLG:	db	00h		;
;
;
TSTFLD:	ld	a,(AUTFLG)	;
	cp	0ffh		;authorized flag set?
	jp	z,ENTRY3	;yes.
	ld	a,(FBFLG)	;
	cp	0ffh		;
	jp	z,BFDIR		;back.field.
	ld	hl,(BFNO)	;
	inc	hl		;
	ld	(BFNO),hl	;
	jp	FLDADV		;
;
BFDIR:	ld	hl,(BFNO)	;
	ld	bc,1		;
	and	a		;
	sbc	hl,bc		;
	jp	z,BFDIR1	;fwd.fld if on fld 1
	ld	hl,(BFNO)	;
	dec	hl		;
	ld	(BFNO),hl	;
	jp	FLDBWD		;
BFDIR1:	ld	a,0h		;
	ld	(FBFLG),a	;
	ld	a,0ffh		;
	ld	(FFLG),a	;
	ld	hl,(BFNO)	;
	inc	hl		;
	ld	(BFNO),hl	;
	jp	FLDADV		;
;
;the following sets aflag on FSB03-fields.
;
SETF03:	ld	a,(AUTFLG)	;
	cp	0ffh		;authorized flag set?
	jp	z,ENTRY4	;yes,bypass.
	ld	a,0ffh		;
	ld	(F03FLG),a	;
	jp	ENTRY3		;
;
F03FLG:	db	0h		;
;
;
;
;the following are the routines that do the setting,testing and
;clearing of the field-bit-mask table . for each variable
;field there will be one bit in the bit-mask table.
;if the bit for a corresponding field is set , the cursor may
;be moved within the complete field as the must have been entered
;previously. if the bit is not set , which means the field has not
;been touched yet, the cursor may not be positioned beyond the
;current cursor-position.
;
;
;STBMSK can be called to set the bit.
;TSBMSK will test the bit and ret with FFh in a-reg if set,else
;       with 00h .
;CLBMSK will clear the complete bit-table to all zeroes.
;
STBMSK:	ld	de,0h		;
	ld	(BMCNT),de	;clear byte ctr.
	ld	(BITCNT),de	;clear bitcnt.
	ld	hl,(BFNO)	;
	dec	hl		;
	ld	bc,8		;
STBMS1:	and	a		;
	ld	(BITCNT),hl	;
	sbc	hl,bc		;divide into no.of bytes.
	jp	m,STBMS2	;go if no. of bytes found.
	ld	de,(BMCNT)	;
	inc	de		;
	ld	(BMCNT),de	;
	jp	STBMS1		;loop back
STBMS2:	ld	bc,BMTAB	;form
	ld	hl,(BMCNT)	;the
	add	hl,bc		;byte offset address
	ld	ix,(BITCNT)	;
	ld	a,(TSTFLG)	;
	cp	0ffh		;
	jp	nz,STBMS6	;test-bit flag not set.
	ld	a,0h		;
	ld	(TSTFLG),a	;reset the flag .
	ld	de,STBMS7	;
	jp	STBMS5		;
STBMS6:	ld	de,STBMS3	;
STBMS5:	push	ix		;
	add	ix,ix		;
	add	ix,ix		;
	pop	bc		;
	add	ix,bc		;ix-reg now multiplied by 5.
	add	ix,de		;
	ld	a,(hl)		;get the byte to a-reg. 
	jp	(ix)		;branch off to appropriate bit-funct.
;
STBMS3:	set	0,a		;set bit 0
	jp	STBMS4		;
	set	1,a		;set bit 1
	jp	STBMS4		;
	set	2,a		;
	jp	STBMS4		;
	set	3,a		;
	jp	STBMS4		;
	set	4,a		;
	jp	STBMS4		;
	set	5,a		;
	jp	STBMS4		;
	set	6,a		;
	jp	STBMS4		;
	set	7,a		;
	jp	STBMS4		;
;
STBMS4:	ld	(hl),a		;store the updated byte (bit)
	ret			;and return.
;
STBMS7:	bit	0,a		;
	jp	STBMS8		;
	bit	1,a		;
	jp	STBMS8		;
	bit	2,a		;
	jp	STBMS8		;
	bit	3,a		;
	jp	STBMS8		;
	bit	4,a		;
	jp	STBMS8		;
	bit	5,a		;
	jp	STBMS8		;
	bit	6,a		;
	jp	STBMS8		;
	bit	7,a		;
	jp	STBMS8		;
;
STBMS8:	ret			;ret to caller
;
;
;the following will test the bit for the fieldnumber given in (BFNO)
;
TSBMSK:	ld	a,0ffh		;
	ld	(TSTFLG),a	;
	call	STBMSK		;
	jp	z,TSBMS1	;
	ld	a,0ffh		;
	ret			;ret if bit was set.
TSBMS1:	ld	a,0h		;
	ret			;ret if bit was not set
;
;
;the following will clear the complete bit-mask to zero.
;
CLBMSK:	ld	bc,BMTAB	;
	ld	hl,16		;number 0f bytes.
	ld	a,00h		;
	call	INBUFF		;
	ret			;
;
;
BMCNT:	dw	0000h		;bit-mask byte counter
BITCNT:	dw	0000h		;bit-mask bit counter
TSTFLG:	db	00h		;testbit flag.
;
BMTAB:	ds	16		;bit-mask table ,currently 16 bytes.
;
;THE FOLLOWING WILL CHECK WETHER A GIVEN FIELD MAY BE USED FOR 
;MANUAL ENTRY AND THE CURSOR POSITIONED IN THIS FIELD.
;THIS IS USED TO EXTEND A FIELD-ADVANCE OR FIELD-BACKWARD
;OVER A AUTOMATIC OR RESTRICTED FIELD.
;
;
FLDCHK:	ld	a,0		;
	ld	(FLDERR),a	;
	ld	hl,(BFNO)	;
	ld	(RESSV4),hl	;save BFNO
FLDC13:	ld	a,(HMEFLG)	;
	cp	0ffh		;home-flag set?
	jp	z,FLDC11	;yes.
	ld	a,(FFLG)	;
	cp	0ffh		;forward field flag set?
	jp	z,FLDC12	;yes.
	dec	hl		;must be backward field.
FLDC10:	ld	(BFNO),hl	;keep BFNO updated
	dec	hl		;allign with field-entry zero.
	add	hl,hl		;x2
	add	hl,hl		;x4
	ld	de,FPTTAB	;load field ptr,table start address
	add	hl,de		;and get pointer address to hl
	ld	e,(hl)		;
	inc	hl		;
	ld	d,(hl)		;field start address in form.buff.in de
	ld	hl,(BFNO)	;
	ld	a,(FFLG)	;
	cp	0ffh		;
	jp	z,FLDCH9	;bypass on forward-field.
;
;the following checks for duplicate format fields , which have an
;fsb of x6.
;
	ld	hl,(FBFADD)	;
	and	a		;
	sbc	hl,de		;
	jp	z,FLDC20	;
	ld	hl,(BFNO)	;
	dec	de		;
	ld	a,(de)		;
	ld	c,0fh		;
	and	c		;
	cp	06h		;
	jp	z,FLDC13	;yes its a fsb x6
	inc	de		;
;
FLDC20:	ld	hl,(BFNO)	;
	ld	a,(FTMFLG)	;
	cp	0ffh		;first-time flag set?
	jp	z,FLDCH9	;yes,dont check for dup-fdb's
	ld	a,(de)		;get fdb.
	cp	'D'		;
	jp	z,FLDC13	;yes.
	cp	'U'		;
	jp	z,FLDC13	;yes.
	cp	'L'		;
	jp	z,FLDC13	;yes.
	cp	'M'		;
	jp	z,FLDC13	;yes.
	cp	'+'		;
	jp	z,FLDC13	;yes.
	cp	'('		;
	jp	z,FLDC13	;
FLDCH9:	ld	a,(FFLG)	;
	cp	0ffh		;
	jp	z,FLDCH7	;
	ld	a,(de)		;
	cp	'B'		;
	jp	z,FLDC13	;yes.
	cp	'Q'		;
	jp	z,FLDC13	;
	cp	'T'		;
	jp	z,FLDC13	;
	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	nz,FLDCH7	;no,go.
	ld	a,(de)		;
	cp	'V'		;
	jp	z,FLDC13	;
	cp	'W'		;
	jp	z,FLDC13	;
	cp	'X'		;
	jp	z,FLDC13	;
	cp	'Y'		;
	jp	z,FLDC13	;
	cp	'Z'		;
	jp	z,FLDC13	;
FLDCH7:	ld	a,(AUTFLG)	;
	cp	0ffh		;authorized-flag set?
	jp	z,FLDCH2	;yes bypass FSB-check
	dec	de		;get address to FSB
	ld	a,(de)		;possible FSB now in A
	ld	c,0fh		;
	and	c		;mask out upprer 4 bits
	cp	02h		;display only FSB?
	jp	z,FLDC13	;yes.
	cp	04h		;no-display/no-update FSB?
	jp	z,FLDC13	;yes.
FLDCH2:	ld	a,(DEMODE)	;
	cp	02h		;
	ret	z		;
	ld	a,(EFLFLG)	;
	cp	0ffh		;is the end-of-field flag set?
	ret	z		;yes,ret uncondit.
	call	TSBMSK		;
	cp	0ffh		;
	jp	z,FLDCH1	;go,if bit set
	ld	a,0ffh		;
	ld	(FLDERR),a	;
	ld	hl,(RESSV4)	;
	ld	(BFNO),hl	;restore original BFNO
	ret			;not allowed in this mode.
FLDCH1:	ld	a,(RESFLG)	;
	cp	0ffh		;
	ret	nz		;
	ld	hl,(RESSV4)	;
	ld	(RESSV1),hl	;
FLDCH3:	ld	bc,(FILCTR)	;
	ld	hl,0h		;
	and	a		;
	sbc	hl,bc		;
	jp	z,FLDCH4	;
	dec	bc		;
	ld	(FILCTR),bc	;
	ld	bc,(BCPCTR)	;
	inc	bc		;
	ld	(BCPCTR),bc	;
	jp	FLDCH3		;
FLDCH4:	ld	hl,(BCPCTR)	;
	ld	(RESSV2),hl	;save backward field pos.ctr.
	ld	a,0h		;
	ld	(RESFLG),a	;clear resume-flag
	ret			;
;
FLDC11:	ld	hl,1h		;
	ld	(BFNO),hl	;
	ld	a,0h		;
	ld	(HMEFLG),a	;
	ld	(FBFLG),a	;clear the flags
	ld	a,0ffh		;
	ld	(FFLG),a	;set the forward flag
	jp	FLDC10		;
;
;
FLDC12:	inc	hl		;
	jp	FLDC10		;
;
;
FLDERR:	db	0h		;
RESFLG:	db	0h		;
RESSV1:	dw	0000h		;
RESSV2:	dw	0000h		;
RESSV3:	dw	0000h		;
RESSV4:	dw	0000h		;
MTCFLG:	db	00h		;matched field flag
;
;the following will handle the moving of the userbuffer to the
;crt-buffer on update-mode.after the move control will be
;handed to the entry-routine.
;this routine is also used to move the user-buffer to the format-buffer
;during format-data mode.
;
UPDMV:	ld	a,(UPDFLG)	;
	cp	00h		;update-mode flag reset?
	jp	z,ENTRY6	;yes,bypass.
UPDM15:	ld	hl,(BFNO)	;
	ld	(UPDSVE),hl	;save bfno
	ld	a,0ffh		;
	ld	(INTFLG),a	;
	ld	(ENTFLG),a	;
	ld	(UPDFLG),a	;
	ld	hl,1h		;
	ld	(BFNO),hl	;set field to 1
UPDMV5:	ld	hl,(BFNO)	;
	call	ENTRY6		;load all buffer-addresses
	ld	hl,(SOFFBA)	;
	ld	de,(FBFADD)	;
	and	a		;
	sbc	hl,de		;
	ld	hl,(SOFFBA)	;
	jp	z,UPDM44	;bypass if fieldaddress=bufferstart
	dec	hl		;
	ld	a,(hl)		;
	ld	c,0fh		;
	and	c		;
	cp	06h		;
	jp	z,UPDM43	;
UPDM44:	ld	a,(EFOFLG)	;
	cp	0ffh		;
	jp	z,UPDM13	;end of format.
	ld	hl,(SOFFBA)	;
	ld	de,(FBFADD)	;
	and	a		;
	sbc	hl,de		;
	jp	z,UPDMV1	;start of field=start of buffer.
	ld	hl,(SOFFBA)	;
	dec	hl		;
	ld	c,(hl)		;
	ld	a,(DEMODE)	;
	cp	05h		;format-data mode?
	jp	nz,UPDM18	;go if not.
	ld	a,08h		;
	call	DSPMSG		;set 'printout message'
	ld	a,80h		;
	and	c		;test bit 8
	jp	z,UPDM18	;no , not set
	ld	a,20h		;
	ld	(hl),a		;space the field security byte
UPDM18:	ld	a,0fh		;
	and	c		;
	cp	03h		;no-display FSB?
	jp	z,UPDMV2	;yes.
	cp	04h		;no-display/no-update.
	jp	z,UPDMV2	;
	ld	a,00h		;
	ld	(F03FLG),a	;
UPDMV1:	ld	a,(F03FLG)	;
	cp	0ffh		;
	jp	z,UPDMV3	;no-display field
UPDM11:	ld	a,(CAVFLG)	;
	cp	0ffh		;is the 'clear all var.fields'flag set?
	jp	nz,UPDMV8	;jp if not.
	ld	a,2eh		;load aperiod.
	jp	UPDM10		;
UPDMV8:	ld	hl,(SOFUBA)	;
	ld	a,(hl)		;
UPDM10:	call	WRTCHR		;
UPDMV4:	call	NXTFDB		;
	call	GENFSB		;inc all buffers,get next fdb
	cp	0ffh		;
	jp	z,UPDMV6	;
	cp	20h		;
	jp	z,UPDMV6	;
	ld	a,(DEMODE)	;
	cp	05h		;
	jp	nz,UPDMV1	;bypass following code if not mode 05
	call	CONST		;
	cp	0ffh		;
	jp	nz,UPDMV1	;
	call	CHRRD		;read character if one is waiting
	cp	CTRLQ		;user abort?
	jp	z,USRABT	;yes.
	ld	a,09h		;
	call	DSPMSG		;set 'printout halted' message
UPDM30:	call	CONST		;
	cp	0ffh		;
	jp	nz,UPDM30	;wait for another character
	call	CHRRD		;
	cp	CTRLQ		;
	jp	z,USRABT	;user abort during print halted.
	ld	a,08h		;
	call	DSPMSG		;display 'printout' message again
	jp	UPDMV1		;
;
UPDMV6:	ld	hl,(BFNO)	;
	inc	hl		;
	ld	(BFNO),hl	;update bfno
	ld	a,00h		;
	ld	(F03FLG),a	;
	jp	UPDMV5		;
;
UPDMV3:	ld	a,(AUTFLG)	;
	cp	0ffh		;
	jp	z,UPDM11	;authorized flag set.
	ld	a,2eh		;
	call	WRTCHR		;
	jp	UPDMV4		;
;
UPDMV2:	ld	a,0ffh		;
	ld	(F03FLG),a	;set FSB-03 flag
	jp	UPDMV1		;
;
UPDM13:	ld	a,(DEMODE)	;
	cp	05h		;format-data mode?
	jp	nz,UPDM17	;no.
	ld	bc,(SOFFBA)	;
	ld	hl,4h		;
	ld	a,20h		;
	call	INBUFF		;space the 4-character end of format.
	ld	de,(FBFADD)	;
	ld	hl,00h		;
	ld	(VFPCTR),hl	;clear the variable pos ctr
UPDM19:	ld	hl,(SOFFBA)	;
	and	a		;
	sbc	hl,de		;
	jp	z,UPDM17	;all done
	ld	a,(de)		;get character from format buffer
	ld	c,a		;
	ld	a,80h		;test bit 7
	and	c		;
	jp	z,UPDM20	;go if not set
	ld	a,20h		;
	ld	(de),a		;space that character
UPDM20:	inc	de		;bump the buffer pointer
	ld	hl,(VFPCTR)	;
	inc	hl		;
	ld	(VFPCTR),hl	;
	jp	UPDM19		;keep looping
UPDM17:	ld	a,(CAVFLG)	;
	cp	0ffh		;
	jp	z,UPDM14	;
UPDMV7:	ld	a,00h		;
	ld	(UPDFLG),a	;
UPDM16:	ld	a,00h		;
	ld	(INTFLG),a	;
	ld	(ENTFLG),a	;
	ld	(F03FLG),a	;
	ld	(EFOFLG),a	;
	ld	(CAVFLG),a	;
	ld	hl,(UPDSVE)	;
	ld	(BFNO),hl	;
	ld	a,(DEMODE)	;
	cp	05h		;format data mode?
	jp	z,ENDFRM	;
	jp	ENTRY		;
;
UPDMV9:	ld	a,(UPDFLG)	;
	cp	0ffh		;
	ret	z		;
	jp	ENTRY7		;
;
UPDM14:	call	CLBMSK		;
	ld	hl,00h		;
	ld	(BCPCTR),hl	;
	ld	(FILCTR),hl	;
	ld	a,(DEMODE)	;
	cp	00h		;
	jp	nz,UPDM16	;
	ld	bc,(UBFADD)	;
	ld	hl,(VFPCTR)	;
	ld	a,20h		;
	call	INBUFF		;
	jp	UPDM16		;
;
UPDM43:	ld	hl,(BFNO)	;
	inc	hl		;
	ld	(BFNO),hl	;
	ld	a,00h		;
	ld	(F03FLG),a	;
	jp	UPDMV5		;
;
;the following is used by the previous routine (UPDMV) to write
;a character from the user buffer to the screen (update-mode)
;or to the format-buffer (format-data-mode).
;
WRTCHR:	ld	c,a		;save character
	ld	a,(DEMODE)	;
	cp	05h		;format update mode?
	jp	z,WRTCH1	;yes.
	ld	hl,(SOFCBA)	;
	call	CHRCNV		;
	ret			;
WRTCH1:	ld	hl,(SOFFBA)	;
	ld	a,80h		;
	and	c		;test bit 8
	jp	z,WRTCH2	;go if not set
	ld	a,20h		;
	ld	(hl),a		;space the field security byte
	ret			;
WRTCH2:	ld	(hl),c		;
	ret			;
;
UPDSVE:	dw	0000h		;
UPDFLG:	db	0ffh		;
CAVFLG:	db	00h		;clear all variable fields flag.
;
;
;the following will test the field start byte and set the 
;num/alpha flag.it also saves the field start byte.
;
TSTFDB:	ld	a,(STRFLG)	;
	cp	00h		;start flag reset?
	jp	z,TSTFD5	;yes,filter the character
TSTFD9:	ld	a,00h		;
	ld	(STRFLG),a	;reset the field start flag
	ld	a,c		;
	ld	(LFSTB),a	;save the field start byte
	ld	hl,FDBDSP	;
        ld	a,(ATTBYT)      ;          
	ld	(ATTSVE),a	;save attribute byte
	ld	a,00h		;
	ld	(ATTBYT),a	;set normat display
	call	CHRCNV		;write fdb to line 25
	ld	a,(ATTSVE)	;
	ld	(ATTBYT),a	;restore attribute byte
	ld	a,(LFSTB)	;get last-field-start-byte
	cp	'+'		;is it autoinc field?
	jp	z,TSTFD2	;yes , go straight to set num-flag.
;
;the following is an addittion to the RRZ-KASSEL system
;and has been commented out.
;
;	cp	'<'		;range check1?
;	jp	z,TSTFD2	;
;	cp	'?'		;date field?
;	jp	z,TSTFD2	;
;	cp	'('		;date/dup field?
;	jp	z,TSTFD2	;
;	cp	'='		;range check2?
;	jp	z,TSTFD2	;
	ld	b,41h		;
	sub	b		;subtract offset
	ld	hl,FDBTAB	;get fdb/fcc table
	ld	c,a		;
	ld	b,0h		;
	add	hl,bc		;get adress into table
	ld	a,(hl)		;get fcc-code for current fsb
	cp	01h		;alpha type?
	jp	z,TSTFD1	;yes
	cp	02h		;num.-type?
	jp	z,TSTFD2	;yes.
	cp	03		;num-dup?
	jp	z,TSTFD2	;yes
	cp	04h		;alp-dup?
	jp	z,TSTFD1	;yes.
	jp	ILLFRM		;anything else is illegal(format error)
;
TSTFD1:	ld	a,0ffh		;
	ld	(ALPFLG),a	;set alpha flag.
	ld	a,00h		;
	ld	(NUMFLG),a	;reset num flag.
	jp	TSTFD3		;
;
TSTFD2:	ld	a,0ffh		;
	ld	(NUMFLG),a	;
	ld	a,00h		;
	ld	(ALPFLG),a	;
	jp	TSTFD3		;
;
TSTFD3:	ld	a,(CBWFLG)	;
	cp	0ffh		;
	jp	z,CBWD2		;
	ld	a,(LFSTB)	;
	cp	'B'		;uncond.branch field?
	jp	z,BRFLD 	;
	cp	'T'		;register readout with reg.clear?
	jp	z,TFLD		;yes go T-field.
	cp	'Q'		;register readout?
	jp	z,QFLD		;yes go Q-field.
	cp	'?'		;date-field
	jp	nz,TSTF16	;bypass if not.
	ld	a,0ffh		;
	ld	(DTEFLG),a	;set date-flag
	jp	TSTFD7		;
TSTF16:	cp	'('		;date/dup field?
	jp	nz,TSTF15	;
	ld	a,(FTMFLG)	;
	cp	0ffh		;
	jp	nz,DUPCHK	;
	ld	a,0ffh		;
	ld	(DTEFLG),a	;set date-flag
	jp	TSTFD7		;
TSTF15:	cp	'<'		;range check 1 field?
	jp	nz,TSTF11	;bypass if not.
	ld	a,0ffh		;
	ld	(RC1FLG),a	;set range-check 1 flag.
	jp	TSTFD7		;
TSTF11:	cp	'='		;range check 2 field?
	jp	nz,TSTF12	;bypass if not.
	ld	a,0ffh		;
	ld	(RC2FLG),a	;
	jp	TSTFD7		;
TSTF12:	call	RACHK		;test for right adjust field
	cp	0ffh		;
	jp	nz,TSTFD6	;no right adjust field
	ld	a,c		;
	ld	(RAFCHR),a	;save 'should be right adjust fill chr'
	ld	a,(DEMODE)	;
	cp	01h		;verify mode
	jp	z,RAVER		;yes.
TSTFD6:	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	nz,TSTFD7	;no.
	ld	a,(LFSTB)	;
	cp	'V'		;numeric bypass on verify?
	jp	z,BRFLD		;yes.
	cp	'W'		;alphanum bypass on verify?
	jp	z,BRFLD		;yes
	cp	'+'		;
	jp	z,BRFLD		;autoincrement field.
TSTFD7:	ld	a,(FTMFLG)	;
	cp	00h		;
	jp	z,TSTFD4	;first-time flag is reset..
	call	ASDOFF		;reset the autom.skip/dup message.
	ld	a,(DUPFLG)	;
	cp	0ffh		;dup-flag set?
	jp	z,DUPCHK	;yes
	jp	SETMSG		;
;
TSTFD4:	call	ASDON		;set the autom.skip/dup msg.
	ld	a,(LFSTB)	;get fdb again.
	cp	'D'		;D field?
	jp	z,DUPCHK	;yes.
	cp	'U'		;U field?
	jp	z,DUPCHK	;yes.
	cp	'L'		;L field?
	jp	z,DUPCHK	;
	cp	'M'		;M field?
	jp	z,DUPCHK	;yes.
	cp	'+'		;auto inc field?
	jp	z,AUTINC	;yes.
	cp	'S'		;num.skip?
	jp	z,NUMSKP	;yes.
	cp	'K'		;alpha skip?
	jp	z,ALPSKP	;yes.
	cp	'F'		;f-field?
	jp	z,NUMSKP	;yes.
	cp	'G'		;G-field?
	jp	z,NUMSKP	;yes.
	jp	SETMSG		;
;
TSTFD5:	ld	a,(EFTFLG)	;
	cp	0ffh		;
	jp	nz,TSTFD8	;
	ld	hl,(FILCTR)	;
	ld	de,01h		;
	and	a		;
	sbc	hl,de		;
	jp	z,TSTFD9	;go on 1-position field length
TSTFD8:	ld	a,(FNFLG)	;
	cp	00h		;function key flag set?
	jp	z,TSTF10	;go if not.
	ld	a,00h		;
	ld	(FNFLG),a	;clear the flag
	ld	hl,(FILCTR)	;
	ld	de,00h		;
	and	a		;
	sbc	hl,de		;filctr = 0 ?
	jp	z,TSTFD9	;go and allow start of field.
;	ld	a,(EFRCHD)	;
	ld	a,(EFLFLG)	;
	cp	0ffh		;
	jp	nz,TSTF10	;
	ld	de,01h		;
	ld	hl,(FILCTR)	;
	and	a		;
	sbc	hl,de		;
	jp	z,TSTFD9	;allow start of field
TSTF10:	ld	a,c		;
	cp	3bh		;semicolon?
	jp	z,CNTFDB	;yes
	cp	3ah		;colon?
	jp	z,CNTFDB	;yes.
	cp	'-'		;num fcc
	jp	z,CNTFDB	;
	cp	'.'		;alpha fcc?
	jp	z,CNTFDB	;
	jp	REGCHK		;no,must be a register
;
DTEFLG:	db	00h		;date flag
RC1FLG:	db	00h		;range check 1 flag
RC2FLG:	db	00h		;range check 2 flag
;
;the following handles the verifying of the right adjust-fill charact.
;and checks first for right adjust bypass fsb's during verify
;
RAVER:	ld	a,(LFSTB)	;
	cp	'X'		;
	jp	z,BRFLD		;
	cp	'Y'		;
	jp	z,BRFLD		;
	cp	'Z'		;
	jp	z,BRFLD		;
RAVER2:	ld	de,(SOFUBA)	;
	ld	hl,(SOFCBA)	;
	ld	a,(RAFCHR)	;get 'should-be' fill character
	ld	c,a		;to c-reg.
	ld	a,(de)		;get 'is' character to a-reg
	cp	c		;do they match?
	jp	z,RAVER1	;yes.
;
;the following accepts blanks in a zero-fill field (type R) as
;legal fill characters during verify.
;
	ld	a,(LFSTB)	;
	cp	'R'		;right adjust/zero fill type?
	jp	nz,SETMSG	;no.
	ld	a,(de)		;get 'is' character from user buffer
	cp	' '		;fill char. = blank?
	jp	nz,SETMSG	;go if it is not.
	ld	(RAFCHR),a	;set r/a fill character to blank
RAVER1:	ld	a,(RAFCHR)	;
 	ld	c,a		;
	call	CHRCNV		;display the fill character
	ld	hl,(FILCTR)	;
	inc	hl		;
	ld	(FILCTR),hl	;
	call	NXTFDB		;
	call	GENFSB		;
	cp	0ffh		;
	jp	z,NXTLPE	;end of field(only fill chars found)
	cp	20h		;
	jp	z,NXTLPE	;end of field (only fill-characters)
	ld	a,0ffh		;
	ld	(CFLAG),a	;
	call	REGCHK		;
	ld	a,00h		;
	ld	(CFLAG),a	;
	jp	RAVER2		;keep looping
;
RAFCHR:	db	00h		;save for right-adjust fill character
;
;the following will check the register code (*,1-9,A-O) and
;set the respective flags.
;
REGCHK:	ld	a,(STRFLG)	;
	cp	0ffh		;field start flag set?
	jp	z,REGC99	;yes,illegal format.
	ld	a,(NUMFLG)	;
	cp	00h		;num-flag reset?
	jp	z,REGC99	;yes,illegal format.
	ld	a,c		;
	cp	'*'		;mul-reg?
	jp	z,REGCH0	;yes.
	cp	'1'		;reg.1?
	jp	z,REGCH1	;yes
	cp	'2'		;comment as before
	jp	z,REGCH2	;
	cp	'3'		;
	jp	z,REGCH3	;
	cp	'4'		;
	jp	z,REGCH4	;
	cp	'5'		;
	jp	z,REGCH5	;
	cp	'6'		;
	jp	z,REGCH6	;
	cp	'7'		;
	jp	z,REGCH7	;
	cp	'8'		;
	jp	z,REGCH8	;
	cp	'9'		;
	jp	z,REGCH9	;
	cp	'A'		;
	jp	z,REGC10	;
	cp	'B'		;
	jp	z,REGC11	;
	cp	'C'		;
	jp	z,REGC12	;
	cp	'D'		;
	jp	z,REGC13	;
	cp	'E'		;
	jp	z,REGC14	;
	cp	'F'		;
	jp	z,REGC15	;
	cp	'G'		;
	jp	z,REGC16	;
	cp	'H'		;
	jp	z,REGC17	;
	cp	'I'		;
	jp	z,REGC18	;
	cp	'J'		;
	jp	z,REGC19	;
	cp	'K'		;
	jp	z,REGC20	;
	cp	'L'		;
	jp	z,REGC21	;
	cp	'M'		;
	jp	z,REGC22	;
	cp	'N'		;	
	jp	z,REGC23	;
	cp	'O'		;
	jp	z,REGC24	;
	ld	a,(CFLAG)	;
	cp	0ffh		;
	ret	z		;return if call flag set
	jp	ILLFRM		;anything else is illegal format.
REGCH0:	ld	a,0ffh		;
	ld	(R0FLG),a	;
	jp	REGCK1		;
REGCH1:	ld	a,0ffh		;
	ld	(R1FLG),a	;
	jp	REGCK1		;
REGCH2:	ld	a,0ffh		;
	ld	(R2FLG),a	;
	jp	REGCK1		;
REGCH3:	ld	a,0ffh		;
	ld	(R3FLG),a	;
	jp	REGCK1		;
REGCH4:	ld	a,0ffh		;
	ld	(R4FLG),a	;
	jp	REGCK1		;
REGCH5:	ld	a,0ffh		;
	ld	(R5FLG),a	;
	jp	REGCK1		;
REGCH6:	ld	a,0ffh		;
	ld	(R6FLG),a	;
	jp	REGCK1		;
REGCH7:	ld	a,0ffh		;
	ld	(R7FLG),a	;
	jp	REGCK1		;
REGCH8:	ld	a,0ffh		;
	ld	(R8FLG),a	;
	jp	REGCK1		;
REGCH9:	ld	a,0ffh		;
	ld	(R9FLG),a	;
	jp	REGCK1		;
REGC10:	ld	a,0ffh		;
	ld	(R10FLG),a	;
	jp	REGCK1		;
REGC11:	ld	A,0ffh		;
	ld	(R11FLG),a	;
	jp	REGCK1		;
REGC12:	ld	a,0ffh		;
	ld	(R12FLG),a	;
	jp	REGCK1		;
REGC13:	ld	a,0ffh		;
	ld	(R13FLG),a	;
	jp	REGCK1		;
REGC14:	ld	a,0ffh		;
	ld	(R14FLG),a	;
	jp	REGCK1		;
REGC15:	ld	a,0ffh		;
	ld	(R15FLG),a	;
	jp	REGCK1		;
REGC16:	ld	a,0ffh		;
	ld	(R16FLG),a	;
	jp	REGCK1		;
REGC17:	ld	a,0ffh		;
	ld	(R17FLG),a	;
	jp	REGCK1		;
REGC18:	ld	a,0ffh		;
	ld	(R18FLG),a	;
	jp	REGCK1		;
REGC19:	ld	a,0ffh		;
	ld	(R19FLG),a	;
	jp	REGCK1		;
REGC20:	ld	a,0ffh		;
	ld	(R20FLG),a	;
	jp	REGCK1		;
REGC21:	ld	a,0ffh		;
	ld	(R21FLG),a	;
	jp	REGCK1		;
REGC22:	ld	a,0ffh		;
	ld	(R22FLG),a	;
	jp	REGCK1		;
REGC23:	ld	a,0ffh		;
	ld	(R23FLG),a	;
	jp	REGCK1		;
REGC24:	ld	a,0ffh		;
	ld	(R24FLG),a	;
	jp	REGCK1		;
;
REGCK1:	ld	a,0ffh		;
	ld	(REGFLG),a	;
	ld	a,(CBWFLG)	;
	cp	0ffh		;char.bwd set?
	jp	z,CBWD2		;yes,return here.
	ld	a,(CFLAG)	;
	cp	0ffh		;
	ret	z		;return if call flag set.
	jp	SETMSG		;
;
REGC99:	ld	a,(CFLAG)	;
	cp	0ffh		;
	ret	z		;ret if call flag set
	jp	ILLFRM		;otherwise illegal format.
;
;
;the following checks the field start byte to field cont.byte
;relationship and set appropriate flags.
;
CNTFDB:	ld	a,c		;get fcc to a
	cp	'+'		;
	jp	z,TSTFDB	;filter out auto inc.start byte
	cp	'('		;
	jp	z,TSTFDB	;
	ld	a,(STRFLG)	;
	cp	0ffh		;
	jp	z,ILLFRM	;
	ld	a,c		;get fcc to a again
	cp	'*'		;
	jp	z,REGCHK	;
	cp	'-'		;
	jp	z,CNTFD5	;numeric fcc
	cp	'.'		;
	jp	z,CNTFD2	;alpha fcc.
	cp	':'		;
	jp	z,CNTFD3	;num. must-field
	cp	';'		;
	jp	z,CNTFD4	;alpha must-field
	cp	'?'		;
	jp	z,TSTFDB	;
	cp	'('		;
	jp	z,TSTFDB	;
	cp	'<'		;
	jp	z,TSTFDB	;
	cp	'='		;
	jp	z,TSTFDB	;
	jp	ILLFRM		;anything else is illegal format
CNTFD2:	ld	a,(ALPFLG)	;
	cp	00h		;alpha-flag reset?
	jp	z,ILLFRM	;illegal: alpha fcc but non-alpha fsc
	jp	CNTFD5		;
CNTFD3:	ld	a,0ffh		;
	ld	(MFFLG),a	;set must fill flag
	jp	CNTFD5		;
CNTFD4:	ld	a,0ffh		;
	ld	(MFFLG),a	;set must fill flag
	jp	CNTFD2		;
CNTFD5:	ld	a,(CBWFLG)	;
	cp	0ffh		;char.bwd.flag set?
	jp	z,CBWD2		;yes.
	ld	a,00h		;
	ld	(MFFLG),a	;reset the must fill flag
	jp	SETMSG		;
;
;
;the following will check the alpha-flag for every alpha-character
;
ALPCHR:	ld	a,(ALPFLG)	;
	cp	00h		;
	jp	z,ALPCH1	;
	jp	ASCENT		;
;
;
;the following allows blanks to be duped into a numeric field.
;it also allows the minus to be entered on numeric right adjust fields.
;
ALPCH1:	ld	a,(DUPFLG)	;
	cp	0ffh		;dup-flag set.
	jp	z,ASCENT	;
	ld	a,c		;
	cp	'-'		;minus?
	jp	nz,KEYERR	;no must be an error.
	ld	(ALPSV),a	;
	call	RACHK		;check for right adjust.
	cp	0ffh		;
	jp	nz,KEYERR	;error.
	ld	a,(DEMODE)	;
	cp	01h		;
	jp	z,ALPCH2	;
	ld	a,0ffh		;
	ld	(MINFLG),a	;set minus flag
	jp	EOFPRC		;process the right adjust
;
ALPCH2:	ld	a,(MINFLG)	;
	cp	0ffh		;
	jp	z,EOFPRC	;
	ld	a,0ffh		;
	ld	(POSFLG),a	;
	jp	ASCE13		;
;
MINFLG:	db	00h		;
POSFLG:	db	00h		;
ALPSV:	db	00h		;
;
;the following will check the num.-flag for every numeric character
;
NUMCHR:	ld	a,(NUMFLG)	;
	cp	00h		;
	jp	z,ALPCHR	;could be a numeric in an alpha field
	jp	ASCENT		;
;
;
MFFLG:	db	00h		;must fill flag
ALPFLG:	db	00h		;alpha-flag
NUMFLG:	db	00h		;numeric flag
STRFLG:	db	00h		;start of field flag
;
;the following allows manual entry into one autom. dup.-field 
;of the current record by setting the 'first-time-flag'.
;
OVRDUP:	ld	a,0ffh		;
	ld	(FTMFLG),a	;set the first time flag
	jp	SETMSG		;
;
;
;the following prevents automatic duplication during update mode
;
DUPCHK:	ld	a,(DEMODE)	;
	cp	02h		;
	jp	nz,DUPFLD	;allow duping on non-update mode
	ld	a,00h		;
	ld	(DUPFLG),a	;clear dupflag
	jp	SETMSG		;go to manual entry loop
;
;
;the following moves a character from the dup-buffer to the a-reg
;on all dup-fields or dup-functions. It kind of simulates a keyboard
;entry during such situations.
;
DUPFLD:	ld	a,(EFTFLG)	;
	cp	0ffh		;
	jp	z,EOFLD		;go if end of field
	call	CONST		;read console status
	cp	0ffh		;character waiting?
	jp	nz,DUPFL1	;go if not.
	call	CHRRD		;get keyboard character
	cp	CTRLA		;reset auto-dup function?
	jp	z,OVRDUP	;yes.
DUPFL1:	ld	a,(DEMODE)	;
	cp	00h		;entry mode?
	jp	nz,DUPFL9	;
	call	RACHK		;
	cp	00h 		;right adjust field?
	jp	z,DUPFL9	;no
	ld	hl,(FILCTR)	;
	ld	bc,00h		;
	and	a		;
	sbc	hl,bc		;
	jp	z,DUPFL9	;allow dup in right adj.fld.on filctr=0
	ld	a,(DUPFLG)	;
	cp	0ffh		;
	jp	z,DUPFL9	;
	ld	a,0ffh		;
	ld	(FNCFLG),a	;set function flag
	ld	a,02h		;
	call	DSPMSG		;
	jp	KEYER3		;
DUPFL9:	ld	a,0ffh		;
	ld	(DUPFLG),a	;
	ld	de,(UBFADD)	;
	ld	hl,(SOFUBA)	;
	and	a		;
	sbc	hl,de		;get user buffer offset to hl
	ld	de,DUPBFF	;
	add	hl,de		;start of field in dup-buffer now in hl
	ld	c,(hl)		;get character to c-reg
	ld	a,(hl)		;and to a-reg
	jp	GETCH1		;and join the entry-loop again.
;
;the following 2048-byte definition defines the dup-buffer
;
DUPBFF:	ds	2048		;
;
;
;the following will handle the record forward/backward function.
;
RECFOB:	ld	c,a		;save a
	ld	a,(DEMODE)	;
	cp	02h		;update-mode?
	jp	nz,RECFO1	;no,dont allow it.
	ld	a,c		;
	cp	CTRLFR		;record-advance?
	jp	z,RECADV	;exit to user interface.
RECFO1:	ld	a,c		;
	cp	CTRLBR		;record-backward?
	jp	z,RECFO2	;go and check mode.
	jp	SKIP1		;function illegal for current mode.
;
RECFO2:	ld	a,(DEMODE)	;
	cp	01		;verify mode?
	jp	z,SKIP1		;yes,dont allow backw.record.
	jp	RECBWD		;perform record backward.
;
;skip or right adjust check.
;
SKRRAC:	call	MFLCHK		;
	cp	0ffh		;must fill situation?
	jp	z,SKRRA1	;yes.
	call	RACHK		;
	cp	00h		;
	jp	z,SKIP		;
	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	nz,EOFPRC	;no.
	ld	a,(MINFLG)	;
	cp	0ffh		;
	jp	z,ASCE13	;handle sign error
	jp	EOFPRC		;
;
;the following handles the error on must fill situations
;
SKRRA1:	ld	a,10		;
	call	DSPMSG		;
	ld	a,0ffh		;
	ld	(FNCFLG),a	;
	ld	(CFLAG),a	;
	call	KEYER3		;
	ld	a,00h		;
	ld	(FNCFLG),a	;
	jp	SETMSG		;
;
;the following handles the skip-field function.
;the routine will fill the remainder of the field with blanks
;and exit the field.
;
SKIP:	ld	a,(EFTFLG)	;
	cp	0ffh		;
	jp	z,EOFLD		;
	ld	a,20h		;
	ld	(SKPCHR),a	;set skip character
SKIP99:	ld	a,0ffh		;
	ld	(INTFLG),a	;set INT flag
SKIP2:	ld	a,(SKPCHR)		;
	ld	hl,(SOFUBA)	;
	cp	0ffh		;
	jp	z,SKIP3		;must be uncond.branch skip
	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	z,SKIP5		;yes
	ld	a,(SKPCHR)	;
	ld	(hl),a		;space user buffer
	ld	hl,(FILCTR)	;
	inc	hl		;
	ld	(FILCTR),hl	;
SKIP4:	ld	hl,(SOFCBA)	;
	ld	c,a		;
	call	CHRCNV		;
	ld	a,0ffh		;
	ld	(SKPFLG),a	;
	call	ASCE14		;
	ld	a,00h		;
	ld	(SKPFLG),a	;
	call	NXTFDB		;
	call	GENFSB		;
	cp	0ffh		;end of field?
	jp	z,EOFLD		;
	cp	20h		;
	jp	z,EOFLD		;end of field?
	ld	a,0ffh		;
	ld	(CFLAG),a	;
	call	REGCHK		;
	ld	a,00h		;
	ld	(CFLAG),a	;
	jp	SKIP2		;go for next character.
;
SKIP1:	ld	a,0ffh		;
	ld	(FNCFLG),a	;
	jp	KEYERR		;
;
SKIP3:	ld	a,(hl)		;get character from user buffer
	jp	SKIP4		;
;
SKIP5:	ld	hl,(SOFUBA)	;get character from user buffer
	ld	a,(hl)		;to a-reg.
	ld	c,a		;
	ld	a,(SKPCHR)	;get skip-fill character
	cp	c		;
	jp	nz,SKIP6	;dont match.
	ld	a,(SKPCHR)	;
	jp	SKIP4		;no match.
SKIP6:	ld	a,00h		;
	ld	(INTFLG),a	;reset INTFLG
	call	INCCRS		;set the cursor
	ld	a,0ffh		;
	ld	(SKPFLG),a	;set skip-flag
	jp	ASCEN4		;handle verify error.
;
SKPCHR:	db	00h		;skip fill character
SKPFLG:	db	00h		;skip flag,prevents increm. the FILCTR
;
;the following handles the unconditional branch (B) which fills
;the field with all blanks on all modes.
;
BRFLD:	ld	a,0ffh		;
	ld	(SKPCHR),a	;set skip fill chr. to bypass .
	jp	SKIP99		;
;
;
;the following handles the insert record function
;
INSREC:	ld	a,(DEMODE)	;
	cp	02h		;
	jp	z,INSRCD	;
	ld	a,0ffh		;
	ld	(FNCFLG),a	;
	jp	KEYERR		;
;
;this will allow skipping of fields with zero-filling of the field.
;
NUMSKP:	ld	a,30h		;
	ld	(SKPCHR),a	;
	jp	SKIP99		;
;
;this allows skipping of field with blank-filling of field.
;
ALPSKP:	ld	a,20h		;
	ld	(SKPCHR),a	;
	jp	SKIP99		;
;
;
;the following sets/resets the autom.skip/dup (ASD) message.
;
ASDON:	LD	A,(ATTBYT)      ;
	LD	(ATTSVE),a	;
	ld	a,00h		;
	ld  	(ATTBYT),a	;
	ld	de,ASDDSP	;
	ld	hl,ONMSG	;
	ld	bc,03h		;
	call	BLMVE		;
	ld	a,(ATTSVE)	;
	ld	(ATTBYT),a	;
	ret			;
;
ONMSG:	db	'ASD'		;
;
ASDOFF:	ld	a,(ATTBYT)      ;
	ld	(ATTSVE),a      ;
	ld	a,00h		;
	ld      (ATTBYT),a	;
	ld	de,ASDDSP	;
	ld	hl,OFFMSG	;
	ld	bc,03h		;
	call	BLMVE		;
	ld	a,(ATTSVE)	;
	ld	(ATTBYT),a	;
	ret			;
;
OFFMSG:	db	'   '		;
;
;
;the following will check for a must-fill situation and return with
;the a-reg set to 0ffh if it is , and with a-reg equal zero if not.
;
MFLCHK:	ld	a,(ATTBYT)	;
	ld 	(ATTSVE),a	;
       	ld	a,(EFTFLG)	;
	cp	0ffh		;
	jp	z,MFLCH6	;bypass check if end-of-format flag set
	call	SVEBFF		;save current buffers
MFLCH7:	ld	a,0ffh		;
	ld	(INTFLG),a	;set cursor inc inhibit flag
MFLCH3:	call	GENFSB		;
	cp	20h		;end of format?
	jp	z,MFLCH1	;yes
	cp	0ffh		;end of format?
	jp	z,MFLCH1	;yes
	ld	a,c		;
	cp	';'		;alpha must fill
	jp	z,MFLCH2	;yes.
	cp	':'		;numeric must fill?
	jp	z,MFLCH2	;yes.
	call	NXTFDB		;
	jp	MFLCH3		;keep looping
;
MFLCH2:	ld	a,0ffh		;
	ld	(MFFLG),a	;set must fill flag
;
MFLCH1:	call	RSTBFF		;
	ld	a,00h		;
	ld	(INTFLG),a	;
	ld	a,(MFFLG)	;
	cp	0ffh		;
	jp	z,MFLCH4	;must fill flag set.
;
MFLCH5:	ld	a,(LFSTB)	;
	cp	'H'		;
	jp	z,MFLCH2	;
	cp	'C'		;
	jp	z,MFLCH2	;
	cp	'F'		;
	jp	z,MFLCH2	;
	cp	'G'		;
	jp	z,MFLCH2	;
	cp	'L'		;
	jp	z,MFLCH2	;
	cp	'M'		;
	jp	z,MFLCH2	;
	cp	'O'		;single must fill field?
	jp	z,MFLCH8	;
	cp	'P'		;
	jp	z,MFLCH8	;
	ld	a,(DEMODE)	;
	cp	01h		;verify mode?
	jp	nz,MFLCH6	;go 'no-must-fill
	ld	a,(LFSTB)	;
	cp	'J'		;
	jp	z,MFLCH2	;
	cp	'R'		;
	jp	z,MFLCH2	;
	cp	'I'		;
	jp	z,MFLCH2	;
MFLCH6:	ld	a,(ATTSVE)	;
	ld	(ATTBYT),a	;
       	ld	a,00h		;
	ret			;return on no must fill situation
;
MFLCH4:	ld	a,(ATTSVE)	;
	ld	(ATTBYT),a	;
       	ld	a,0ffh		;
	ret			;ret on must fill situation
;
MFLCH8:	ld	hl,(FILCTR)	;
	ld	de,00h		;
	and	a		;
	sbc	hl,de		;at least one character entered?
	jp	z,MFLCH2	;go if not.
	jp	MFLCH6		;yes,must fill satisfied.
;
;the following checks for must-fill fields before allowing a SEND-key
;to go thru. on update mode the check will be bypassed.
;
SNDCHK:	ld	a,(DEMODE)	;
	cp	02h		;update mode?
	jp	z,ENTSND	;go straight thru
	cp	01h		;verify mode?
	jp	z,ENTSND	;go to send (RRZ-KASSEL VERSION)
	ld	(SNDSV2),a	;
	call	SVEBFF		;save all buffer pointers
	ld	hl,(BFNO)	;
	ld	(SNDSV1),hl	;save current field number
	call	MFLCHK		;check rest of current field
	cp	0ffh		;
	jp	z,SNDCH1	;must-fill in current field
	ld	a,(MFFLG)	;
	ld	(SNDSV4),a	;save current state of must fill flag
	ld	a,02h		;
	ld	(DEMODE),a	;fake update mode
	ld	a,0ffh		;
	ld	(UPDFLG),a	;set update flag 
	ld	a,(LFSTB)	;
	ld	(SNDSV3),a	;save current field start byte
SNDCH3:	ld	hl,(BFNO)	;
	inc	hl		;
	ld	(BFNO),hl	;inc the field number
	call	ENTRY6		;calculate buffer pointers for nxt fld.
	ld	a,(EFOFLG)	;
	cp	0ffh		;
	jp	z,SNDCH2	;all fields checked
	ld	hl,(SOFFBA)	;
	ld	a,(hl)		;
	ld	(LFSTB),a	;
	call	MFLCH7		;check next field
	cp	0ffh		;
	jp	z,SNDCH1	;go on must fill fields
	jp	SNDCH3		;go for next field
SNDCH1:	ld	a,10		;
	call	DSPMSG		;set 'must fill' msg
	ld	a,0ffh		;
	ld	(FNCFLG),a	;set function flag
	ld	(CFLAG),a	;set call flag
	call	KEYER3		;handle the must-fill error
	ld	a,00h		;
	ld	(FNCFLG),a	;reset function flag
	ld	a,(SNDSV4)	;
	ld	(MFFLG),a	;restore must fill flag
	call	SNDRST		;restore all buffer pointers and flags
	jp	SETMSG		;and return to the entry-loop
;
SNDCH2:	call	SNDRST		;restore all bufferpointers and flags
	jp	ENTSND		;and return to user interface
;
SNDRST:	call	RSTBFF		;restore the buffer pointers
	ld	hl,(SNDSV1)	;
	ld	(BFNO),hl	;restore field number
	ld	a,(SNDSV2)	;
	ld	(DEMODE),a	;restore demode
	ld	a,00h		;
	ld	a,(SNDSV3)	;restore
	ld	(LFSTB),a	;field start byte
	ld	(UPDFLG),a	;reset update flag
	ld	(EFOFLG),a	;reset end of format flag
	ret			;
;
SNDSV1:	dw	0000h		;
SNDSV2:	db	00h		;
SNDSV3:	db	00h		;
SNDSV4:	db	00h		;
;
;the following handles the duplication of format data on entry mode 
;only.
;
DFFLD:	ld	hl,(BFNO)	;
	inc	hl		;
	ld	(BFNO),hl	;update to next field number
	ld	a,00h		;
	ld	(DFFLG),a	;clear the duplicate format flag.
	ld	a,(DEMODE)	;
	cp	00h		;
	jp	nz,ENTCPL	;go end-of-field if not entry-mode.
DFFLD1:	call	GENFSB		;
	cp	0ffh		;closing FSB found?
	jp	z,ENTCPL	;yes,go to end the field.
	ld	de,(UBFADD)	;
	ld	hl,(SOFUBA)	;
	and	a		;
	sbc	hl,de		;get userbuffer offset to hl-reg.
	ld	de,DUPBFF	;
	add	hl,de		;get start in dup-buffer to hl-reg.
	ld	a,(hl)		;
	ld	hl,(SOFUBA)	;
	ld	(hl),a		;move char. from dup-bff to usrbff
	ld	hl,(FILCTR)	;
	inc	hl		;
	ld	(FILCTR),hl	;inc the fld. length ctr.
	call	NXTFDB		;
	jp	DFFLD1		;keep looping till end of field.
;
DFFLG:	db	00h		;duplicate format flag.
;
	end
«eof»