|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 56192 (0xdb80)
Types: TextFile
Names: »EENTRY.MAC«
└─⟦77f87173f⟧ Bits:30005981/disk3.imd Turn Key Data Entry System/Datenerfassungspaket - Vers. 1.90
└─⟦77f87173f⟧ Bits:30008911 Turn Key Data Entry System - ASSEMBLER FILES - 1.90
└─⟦this⟧ »EENTRY.MAC«
;*************************************************
;* *
;* MODULE : EENTRY.MAC (RC-700) *
;* DATE : 01.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'.
;
INCLUDE B:EKBEQU.MAC ;include all the keyboard equates
INCLUDE B:EPUB/EXT.MAC ;include all the public's and externals
;
;
;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,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 z,ENTRY3 ;yes,bypass FSB-check.
ld hl,(SOFFBA) ;
dec hl ;
ld c,(hl) ;get FSB (if it is one)
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,1921 ;
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 a,2eh ;
ld (hl),a ;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 hl,(SOFUBA) ;
ld de,(SOFCBA) ;
ld a,(hl) ;move char. from user-buffer
ld (de),a ;to screen.
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 de,(SOFCBA) ;fill up
ld a,2eh ;with period.
ld (de),a ;
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 a,(hl) ;
ld hl,(SOFCBA) ;
ld (hl),a ;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 a,(hl) ;
ld hl,(SOFCBA) ;
ld (hl),a ;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 1bh ;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 ;crt buffer by two
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 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,0ffbbh ;load display area in line 25
ld (SOFCBA),de ;
ld bc,3h ;
ldir ;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) ;
ld (hl),c ;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 1bh ;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,0ffbbh ;
ld hl,3h ;
ld a,20h ;
call INBUFF ;clear message area
ld a,0ffh ;
ld (MLNFLG),a ;
ld hl,(SVFMT1) ;
ld (SOFCBA),hl ;
call INCCRS ;
jp SETMSG ;restore the cursor
FMTCH5: ld a,0h ;
ld (BTCNT),a ;
ld hl,0ffbbh ;
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,0ffbbh ;
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,0ffbbh ;updated
ld bc,3 ;FCK to
ldir ;to FRMCHN in the ccb
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,0ff84h ;
ld (hl),a ;display the fdb on crt.
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 hl,(SOFUBA) ;
ld de,(SOFCBA) ;
ld a,(RAFCHR) ;get 'should-be' fill character
ld c,a ;to c-reg.
ld a,(hl) ;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,(hl) ;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 (de),a ;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 (hl),a ;
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 de,0ff80h ;
ld hl,ONMSG ;
ld bc,3h ;
ldir ;
ret ;
;
ONMSG: db 'ASD' ;
;
ASDOFF: ld de,0ff80h ;
ld hl,OFFMSG ;
ld bc,3h ;
ldir ;
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,(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,00h ;
ret ;return on no must fill situation
;
MFLCH4: 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»