|
|
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: 60416 (0xec00)
Types: TextFile
Names: »EENTRY.MAC«
└─⟦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«
;*************************************************
;* *
;* 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»