|
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: 21632 (0x5480) Types: TextFile Names: »EFMTINT.MAC«
└─⟦77f87173f⟧ Bits:30005981/disk3.imd Turn Key Data Entry System/Datenerfassungspaket - Vers. 1.90 └─⟦this⟧ »EFMTINT.MAC«
;************************************************* ;* * ;* MODULE : EFMTINT.MAC (RC-700) * ;* DATE : 01.02.82 * ;* BY : ASE GmbH , 6472 Altenstadt * ;* VERSION: 1.90 * ;* * ;************************************************* ; ; THIS MODULE CHECKS AND INITIALIZES A FORMAT , GIVEN IN THE ; FORMAT-BUFFER , AFTER A 'CALL INIT' HAS BEEN MADE BY THE ; APPLICATION PROGRAMM. THIS MODULE ALSO BUILDS UP THE CRT. ; IT IS USED IN ALL MODES EXCEPT 'FORMAT' AND 'FORMAT-UPDATE'. ; PUBLIC CRFLG PUBLIC FMTINT PUBLIC INTFLG PUBLIC FDBTAB PUBLIC GENFSB PUBLIC CLDEF PUBLIC CHKBTE PUBLIC INITFL PUBLIC NXTFDB PUBLIC FPTTAB PUBLIC ANYRG3 ; ext CLRCUR ext ILLFRM ext INTCRT ext CLBMSK ext FILCTR ext BCPCTR ext ENTRY ext ENTFLG ext INBUFF ext SOFFBA ext BFNO ext SOFCBA ext DEMODE ext VFCTR ext SOFUBA ext UBFADD ext DSPMSG ext CONBTA ext CHRRD ext FRMCHN ext VFPCTR ext CBFADD ext F05FLG ext FSFLG ext FRMFLG ext FRMLNG ext KEFLG ext FBFADD ext ALLINC ext CFLAG ext INCCRS ext FRMCPL ext STBMSK ext CHRCNV ext co ext ci ext DUPBFF ; SPACE equ 20h ESCCHR equ 1bh CTRLQ equ 11h BELL equ 07h CHEX equ 12h ENDCRT equ 0ff7fh ; ; FMTINT: ld a,(DEMODE) ; cp 03h ;format mode? jp z,FMTIN1 ;yes it is. cp 04h ;format update mode? call nz,INTCRT ;no,clear and build the crt. FMTIN1: call CLDEF ;clear and init all DE-Flags ld a,0ffh ; ld (INTFLG),a ; call CLRCUR ;set cursor to 1 ld a,(KEFLG) ;clear line 25 cp 0ffh ;if key error flag is set call z,BLKLN ; ; ; ld hl,(SOFFBA) ;get FDB ld a,(hl) ;to a-reg GENCHK: cp 'E' ;is it an End of format? jp z,ENDCHR ;yes. cp SPACE ; jp z,GENCH2 ; call GENFSB ;check for any FSB's cp 0ffh ; jp z,FSBCHK ;yes it is an FSB. cp 55h ; jp z,ERR1 ;error , hex'00' found cp 0h ; jp z,GENCH1 ;should be a fld-strt byte cp SPACE ; jp z,GENCH2 ; ERR1: jp KERTRY ;allow manual correction ; GENCH1: ld a,c ;restore a-reg jp VARFL1 ; ; GENCH2: call NXTFDB ; jp GENCHK ; ; ;this will xlate the crt control character (upper half of the FSB) ;and move it to the crt. ; FSBCHK: ld hl,(SOFFBA) ;get FDB ld c,(hl) ;to c-reg. ld a,0f0h ;mask out the and c ; cp 80h ;fsb. is it normal display? jp nz,FSBCH1 ;no ld hl,(SOFCBA) ;yes set ld b,128 ;the normal display ld (hl),b ;control character jp FSBCH3 ; ; FSBCH1: cp 90h ;is it blinking? jp nz,FSBCH0 ;no ld hl,(SOFCBA) ;yes , set ld b,130 ;the blinking ld (hl),b ;control character jp FSBCH3 ; ; FSBCH0: cp 0b0h ;is it blink. and inverted? jp nz,FSBCH2 ;no ld hl,(SOFCBA) ;yes set ld b,146 ;the blk/inv. display ld (hl),b ;control character. jp FSBCH3 ; ; ; FSBCH2: ld hl,(SOFCBA) ;must be inverted display! ld b,144 ; ld (hl),b ; ; FSBCH3: ld a,0fh ;mask out the and c ;crt control cp 05h ;is it 05(fixed field) jp z,FXFLD ;yes,go fixed field cp 06h ;format-duplication field? jp z,FDFLD ;yes. ; ; arriving here means we have a FSB in the range ; X1-X4 , i.e. a variable field. ; VARFLD: call NXTFDB ;get next fdb VARFL1: cp '+' ;is it a jp z,VARF13 ;go on auto-inc field. ; ;the following has been 'commented' out as it is an addittion ;to the RRZ-TKDES system and does not apply to the standard ;system. ; ; cp '?' ; ; jp z,VARF13 ;go on date-field. ; cp '(' ; ; jp z,VARF13 ;go on date/dup field. ; cp '<' ; ; jp z,VARF13 ;go on range check 1 field. ; cp '=' ; ; jp z,VARF13 ;go on range check 2 field. jp VARFL4 ; VARF13: call SETDUP ;set the call BLDFPT ;buil field pointer entry call INCVFP ;inc the var.pos.ctr call CHKMDE ; jp FCCNUM ;dupflag VARFL4: ld b,a ;check the ld a,40h ;field start byte range and a ; sub b ; jp p,VARERR ;<A;not a field start byte ld a,5ah ; cpl ; add a,b ; jp p,VARERR ;>Z;not a field start byte ld hl,(SOFFBA) ;get the current ld a,(hl) ;FDB again ld b,41h ;build offset sub b ;into the ld hl,FDBTAB ;get FDB/FCC Table ld c,a ; ld b,0 ; add hl,bc ;got pointer in hl ld a,(hl) ;got content of table in a-reg ld hl,VARSVE ;save it ld (hl),a ;for later ; cp 0ffh ;is it a legal field start byte? jp z,VARERR ;no its not. ; ;arriving here means having a legal Field start byte ; call INCVFP ; call CHKMDE ; ; call BLDFPT ;build field pointer table entry call CHKMDE ; ; ; VARFL3: ld hl,VARSVE ;get the saved ld a,(hl) ;FDBTAB-Content to a-reg. cp 01h ; jp z,FCCALP ;go to alpha FCC cp 02h ; jp z,FCCNUM ;go to numeric FCC cp 03h ; jp nz,VARFL5 ;its not a numeric with dup function call SETDUP ;yes,set Dup-flag jp FCCNUM ;go to numeric fcc ; ; VARFL5: cp 04h ;is it alpha dup fdb? jp nz,VARFL6 ;no. call SETDUP ;yes. jp FCCALP ;and go to alpha fcc ; ;coming here means that we should have found the ;end of format character. ; VARFL6: cp 0eeh ; jp nz,VARERR ;must be format-error call DECVFP ; ld bc,(VFCTR) ; dec bc ;dec the VFCTR ld (VFCTR),bc ; jp ENDCHR ; ; ;this is the first level of the numeric checks. ; FCCNUM: call CHKMDE ; call NXTFDB ;get next fdb call INCVFP ; FCCNM1: cp SPACE ; call z,DECVFP ; jp z,GENCHK ;back to the front. cp ':' ; jp z,FCCNUM ;numeric must fill cp '-' ; jp z,FCCNUM ;normal numeric call ANYREG ;check for possible register code cp 0ffh ; jp z,FCCNUM ;yes,its areg.,go for next fdb ld a,c ; cp 'E' ;end of format? call z,DECVFP ; jp z,ENDCHR ;yes call GENFSB ;test for FSB's. cp 0ffh ; call z,DECVFP ; jp z,FSBCHK ;yes it is an FSB cp 55h ; jp z,FCNUME ;fcc num.error. ; ;numeric fcc error routine ; FCNUME: jp KERTRY ;get manual correction ; ;this checks for numeric,must-fill fields ; NUMMFL: call CHKMDE ; call NXTFDB ;get next fdb call INCVFP ; NUMFL1: cp SPACE ; call z,DECVFP ; jp z,GENCHK ;its a space , back to the start cp ':' ; jp z,FCCNUM ;regular num.must fill,get next fcc call ANYREG ;check for registers cp 0ffh ; jp z,FCCNUM ; ld a,c ; cp 'E' ;end of format? call z,DECVFP ; jp z,ENDCHR ;yes. call GENFSB ;check for any FSB cp 55h ; jp z,NMMFLE ;num.must fillerror cp 0ffh ; call z,DECVFP ; jp z,FSBCHK ;yes its anm FSB NMMFLE: jp KERTRY ;error correction ; ;this checks for normal,numeric fcc's ; NUMNRM: call CHKMDE ; call NXTFDB ;get next fdb call INCVFP ; NMNRM1: cp SPACE ; call z,DECVFP ; jp z,GENCHK ;its aspace cp '-' ; jp z,FCCNUM ;normalnum., get next fdb call ANYREG ;check for reg.code cp 0ffh ; jp z,FCCNUM ;its a reg.,get next fdb call GENFSB ;check for possible FSB cp 55h ; jp z,NMNRME ;error cp 0ffh ; call z,DECVFP ; jp z,FSBCHK ;yes its an FSB NMNRME: jp KERTRY ;error correction ; ;this is the first level in the alpha checks. ; FCCALP: call CHKMDE ; call NXTFDB ;get next format call INCVFP ; FCCAL1: cp SPACE ; call z,DECVFP ; jp z,GENCHK ; cp '-' ; jp z,FCCALP ;mixed fcc's in an alpha field cp '.' ; jp z,FCCALP ;mixed fcc's in an alpha field cp ';' ; jp z,FCCALP ;alpha must fill cp ':' ; jp z,FCCALP ;num.must fill in alpha field call GENFSB ;check for any FSB's cp 55h ; jp z,FCCALE ;error cp 0ffh ; call z,DECVFP ; jp z,FSBCHK ;yes its an FSB FCCALE: jp KERTRY ;get correction ; ;this checks alpha must fill fields ; ALMFL: call CHKMDE ; call NXTFDB ;get next fdb call INCVFP ; ALMFL1: cp SPACE ; call z,DECVFP ; jp z,GENCHK ;yes it is a space cp 'E' ; call z,DECVFP ; jp z,ENDCHR ;its the end of format cp ';' ; jp z,FCCALP ;regular must fill alpha cp ':' ; jp z,FCCALP ;regular must fill numeric call GENFSB ; cp 55h ; jp z,ALMFLE ;error cp 0ffh ; call z,DECVFP ; jp z,FSBCHK ;yes its a FSB ALMFLE: jp KERTRY ;get error correction ; ;this checks normal alpha fields with mixed fcc's ; ALPMIX: call CHKMDE ; call NXTFDB ;get next fdb call INCVFP ; ALPMX1: cp SPACE ; call z,DECVFP ; jp z,GENCHK ; cp 'E' ; call z,DECVFP ; jp z,ENDCHR ; cp '.' ; jp z,FCCALP ;normal alpha cp '-' ; jp z,FCCALP ;normal num.fcc call GENFSB ;check for FSB's cp 55h ; jp z,ALPMXE ;error cp 0ffh ; call z,DECVFP ; jp z,FSBCHK ;yes,its an fsb ALPMXE: jp KERTRY ;get manual correction ; ;this handles fixed fields (mask fields) ; FXFLD: call NXTFDB ;get next fdb FXFLD1: ld c,a ; call GENFSB ;check for FSB's cp 0ffh ; jp z,FSBCHK ;yes found one cp 55h ; jp z,FXFLDE ;error ld hl,(SOFCBA) ;move the character call CHRCNV ;to the crt jp FXFLD ;go for next FXFLDE: jp KERTRY ;get manual correction ; FXDFL2: ld a,0 ;clear the ld (FXFFLG),a ;fixed field flag call NXTFDB ; jp GENCHK ;back to front level ; FXFFLG: ds 1 ;fixed field flag ; ;the following handles the format-duplication field , which moves ;data from the format-record to the duplication buffer from which it ;will be automatically duplicated into the data-buffer when in ;entry-mode and the field has been encountered. ;this is actually an addittion to the RRZ-KASSEL system which has ;been added to the standard system. ; FDFLD: call NXTFDB ;step the counters call BLDFPT ;make field entry FDFLD1: call GENFSB ; cp 0ffh ;FSB? jp z,FSBCHK ;yes. cp 55h ; jp z,KERTRY ;go on format-error ld hl,DUPBFF ;get dup-buff.base. ld de,(VFPCTR) ;get no. of var. positions add hl,de ; ld (hl),c ;move character to dup-buffer ld hl,(SOFCBA) ; call CHRCNV ;move character to crt call INCVFP ;inc no. of var. pos. call NXTFDB ; jp FDFLD1 ; ; ; ;setdup will set the duplicate flag on any of the following ;fdb's : D , U , L , M , + . ;setdup is not used anymore and has been made a dummy-subroutine. ;all reference to setdup will be removed at alater date. ; SETDUP: ret ;ret to caller ; ; VARERR: jp KERTRY ;get manual correction ; ;the following will check wether the current fdb is a ;legal FSB.After execution the fdb will be aviallable ;in the c-reg.this routine is also used to analyse normal ;keyboard input characters in non-formatting modes , in these ;cases the CHKBTE (check byte) entrance is used . a character is ;is the expected in the a-reg.the following codes will be returned ;in the a-reg.: ; 00 = not an FSB , normal asccii character on formatting ; modes or ascii range 21-2f on other modes ; 55 = not an FSB but anything in the range 00-1f ; (error on formatting modes and a possible ; function key on other modes) ; FF = an fsb has been found. ; 20 = a space has been found ; 01 = ascii range 30 - 39 (numeric) on non-formatting modes ; (not used on formatting modes) ; 02 = ascii range 40 - 7e (alpha) on non-formatting modes ; (not used on formatting modes) ; ; GENFSB: ld hl,(SOFFBA) ;get current ld a,(hl) ;fdb CHKBTE: ld c,a ;save it in c cp 20h ; ret z ;its aspace character,return bit 7,a ;test bit 7 jp z,NRMCHR ;check if normal asccii ; ;check for FSB from 81 to 86 ; ld c,a ; ld a,80h ; and a ; sub c ; jp p,FSBERR ;not an FSB , < then 81 ld a,86h ; cpl ; add a,c ; jp m,FSBNRM ;its an FSB , not > then 86 ; ;the following chechs for 87 to 90 if the entry flag is set. ; ld a,(ENTFLG) ; cp 0ffh ; jp nz,CHKBT1 ; ld a,90h ; cpl ; add a,c ; jp m,FSBNRM ; ; ; ;check for 91 to 96 ; CHKBT1: ld a,90h ; and a ; sub c ; jp p,FSBERR ;not an FSB , < then 91 ld a,96h ; cpl ; add a,c ; jp m,FSBNRM ;not an FSB , > then 96 ; ;check for A1 to A6 ; ld a,0a0h ; and a ; sub c ; jp p,FSBERR ;< then A1 ld a,0a6h ; cpl ; add a,c ; jp m,FSBNRM ;its an FSB , not > then A6 ; ;check for B1 to B6 ; ld a,0b0h ; and a ; sub c ; jp p,FSBERR ; ld a,0b6h ; cpl ; add a,c ; jp m,FSBNRM ;its an FSB , not > then B6 ; ;the following checks the asccii range from ;21 t0 2f . ; NRMCHR: ld a,20h ; and a ; sub c ; jp p,FSBERR ; ld a,2fh ; cpl ; add a,c ; jp m,FSBCHR ;yes its normal asccii ; ;the following checks the ascii range 30-39 (numeric) ; NMPCHR: ld a,39h ; cpl ; add a,c ; jp m,FSBNMR ;its a numeric 0 - 9 ; ;the following checks the ascii range 40-7e (alpha) ; ALPCHR: ld a,7eh ; cpl ; add a,c ; jp m,FSBALP ; ; ; FSBERR: ld a,55h ; ret ; FSB-error return ; FSBNRM: ld a,(ENTFLG) ; cp 0ffh ; jp z,FSBNR1 ; ld a,0ffh ; ret ; FSB found return ; FSBNR1: ld a,0ffh ; ret ; ; FSBCHR: ld a,00 ; ret ;normal asccii return FSBNMR: ld a,(ENTFLG) ; cp 0ffh ; jp nz,FSBCHR ; ld a,01h ;set a on non-formatting modes ret ; ; FSBALP: ld a,(ENTFLG) ; cp 0ffh ; jp nz,FSBCHR ; ld a,02h ;set a on non-formatting modes ret ; ; ; ; ;the following will inc the buffers and cursor and load the ;next FDB to a-reg. ; NXTFDB: ld hl,ENDCRT ; ld de,(SOFCBA) ;last position on crt ? and a ; sbc hl,de ; jp z,ENDERR ;yes,no end of format found call ALLINC ;inc the buffers and cursor ld hl,(SOFFBA) ; ld a,(hl) ;get next fdb ret ;return ; INTFLG: ds 1 ;int-flag , if set prevents cur.pos.upd. ; ENDERR: ld a,(DEMODE) ; cp 00h ;entry-mode? jp z,ILLFRM ;exit to user interface cp 01h ;verify-mode? jp z,ILLFRM ; cp 02h ;modify-mode? jp z,ILLFRM ; ld a,29h ; call DSPMSG ;msg no end of format ld a,07h ; call co ;beep the user call CHRRD ; ld a,0a6h ;ret to call DSPMSG ;format entry pop hl ;decrement the stack ld a,00h ;reset ld (INTFLG),a ;the int-flag jp ILLFRM ;**replaced from jp HOME ** form. modes* ;; ;the following will exit to the user-interface when a format-error ;has been detected by previous logic. ; KERTRY: ld a,(DEMODE) ; cp 00h ;entry-mode? jp z,ILLFRM ;exit to user interface. cp 01h ; jp z,ILLFRM ; cp 02h ;modify-mode? jp z,ILLFRM ; cp 05h ;format data mode? jp z,ILLFRM ; ld a,03h ; call DSPMSG ;format error message KELOOP: ld c,BELL ; call co ;beep the user KELP1: call CHRRD ; ld a,00h ; ld (INTFLG),a ;reset int-flag call INCCRS ;set the cursor ld a,0a6h ;set enter call DSPMSG ;format message jp ILLFRM ;*replaced from 'jp FLOOP'******* ; ;the following handles the end of format character. ;and hands over control to the eentry-modul. ; ENDCHR: ld a,0 ; ld (ENDCTR),a ;clear the end Ctr ld a,0ffh ;set ld (ENDFLG),a ;endflag call BLDFPT ;build field pointer table entry for E ld a,00h ;reset ld (ENDFLG),a ;endflag ld hl,(SOFFBA) ; inc hl ; ld (ENDSVE),hl ;save the format buffer address ld a,00h ; ld (INTFLG),a ;reset int-flag ENDCH1: call ALLINC ; call GENFSB ; cp 00h ;regular asccii? jp nz,KERTRY ;no,error. ld a,2fh ; and a ; sub c ; jp p,KERTRY ;error < 30h ld a,39h ; cpl ; add a,c ; jp p,KERTRY ;error > 39h ld a,c ; cp 30h ; jp z,ENDCH9 ;if zero go. ld a,0ffh ; ld (ZROFLG),a ; ENDCH8: ld a,(ENDCTR) ; cp 02h ; jp z,ENDEXT ;full form chain key checked. ld a,(ENDCTR) ; inc a ;inc the ctr. ld (ENDCTR),a ; jp ENDCH1 ;go for next round ENDEXT: ld a,(ZROFLG) ; cp 00h ; jp z,KERTRY ;format-chain-key all zero! ld a,0h ; ld (ZROFLG),a ;reset the zroflg ld hl,(ENDSVE) ; ld de,FRMCHN ; ld bc,03h ; ldir ; ld a,(DEMODE) ;check cp 03h ;for jp z,FRMMDE ;format mode cp 04h ; jp z,FRMMDE ; ld a,0ffh ; ld (INITFL),a ;set the format-initialized flag call CLBMSK ;clear the field-bit mask table ld a,(DEMODE) ; cp 00h ;entry-mode? jp nz,ENDCH7 ;no,bypass. ld bc,(UBFADD) ; ld hl,(VFPCTR) ; ld a,20h ; call INBUFF ;clear the user-buffer on entry-mode. ENDCH7: jp ENTRY ; FRMMDE: ld a,05h ;display call DSPMSG ;the format complete ld a,(CRFLG) ;is the carriage return flag set? cp 0ffh ; jp z,ENDCH3 ;yes ld a,0h ;clear the ; ld (UPFFLG),a ;format-update flag in case its set. ;previous statement needed only with formatting modes jp FRMCPL ;format complete , ret to user interf. ; ENDCH3: ld ix,0ff80h ; ld hl,(VFPCTR) ; call CONBTA ;display no.of var.positions ld a,0h ; ld (CRFLG),a ; jp KELP1 ; ; ENDCH9: ld a,(ZROFLG) ; cp 0ffh ; jp z,ENDCH8 ; ld a,0h ; ld (ZROFLG),a ;set the format-chain-key zero flag jp ENDCH8 ; ; ENDSVE: ds 2 ;save for SOFFBA at start of FRMCHN ENDCTR: ds 1 ;ctr for # of formchainkey bytes CRFLG: ds 1 ; ENDFLG: ds 1 ;set on field table entry on end (E) INITFL: db 0h ;format initialized-flag ZROFLG: db 0h ;format-chain-key zero flag ; ; ;the following is used to clear the DE-flags. ;and reset pointers. ; CLDEF: ld bc,0h ;clear the ld (VFPCTR),bc ;VFPCTR ld (VFCTR),bc ;clear the variable field ctr. ld (BCPCTR),bc ;clear backward pos.ctr. ld (FILCTR),bc ;clear field length ctr. ld bc,(FBFADD) ;reset ld (SOFFBA),bc ;buffer address ld bc,(UBFADD) ;reset ld (SOFUBA),bc ;the user buffer address ld bc,(CBFADD) ; ld (SOFCBA),bc ;crt buffer address ld a,0h ; ld (FXFFLG),a ; ld (ENTFLG),a ; ld (INTFLG),a ; ld (F05FLG),a ; ld (ENDFLG),a ; ld (FSFLG),a ; ld (FRMFLG),a ; and a ; sbc hl,hl ; ld (VFCTR),hl ; ld de,01h ;set format length ld (FRMLNG),de ;to 1 ret ;return to user ; ; ;the following will blank the message area in line 25 ; BLKLN: ld a,0a7h ;set msg.number call DSPMSG ;display it ret ;ret to caller ; ;the following will check all possible register codes ;and will return with 0ffh in a-reg if a reg has been found, ;otherwise the a-reg will be zero. ; ANYREG: ld hl,(SOFFBA) ;get current ld a,(hl) ;fdb to a-reg ANYRG3: cp '*' ;is it the multiplik,reg.? jp z,ANYRG1 ;yes cp 40h ; jp z,AREGER ;error ld c,a ; ld a,30h ; and a ; sbc a,c ; jp p,AREGER ; ld a,39h ; cpl ; add a,c ; jp m,ANYRG2 ;ok , not more then 39h ld a,40h ; and a ; sbc a,c ; jp p,AREGER ;out of range;<41h ld a,4fh ; cpl ; add a,c ; jp p,AREGER ;out of range;>4fh ld c,02h ;set A to O indicator ld a,0ffh ; ret ; ANYRG1: ld a,0ffh ;legal register found ld c,00h ;set '*' indicator ret ; ANYRG2: ld c,01h ;set 1 to 9 indicator ld a,0ffh ; ret ; AREGER: ld a,0 ;out of range ret ;return INCVFP: push hl ; ld hl,(VFPCTR) ; inc hl ; ld (VFPCTR),hl ; pop hl ; ret ; ; DECVFP: push hl ; ld hl,(VFPCTR) ; dec hl ; ld (VFPCTR),hl ; pop hl ; ret ; ; ; CHKMDE: push af ; ld hl,(SOFCBA) ; ld de,(SOFFBA) ; ld a,2eh ;display a period in place CHKMD2: ld (hl),a ;of a variable field position pop af ;on all modes ret ; ; CHKMD1: ld a,20h ;load a space to a jp CHKMD2 ;and go and display it. ; ;the following are definitions and tables used by the format. ; VARSVE: ds 1 ;save byte for FSB/FCC Table (FDBTAB) ; ;the FDBTAB is a 2-way table which tells the field start to ;field continuation relationship. ; FDBTAB: db 01h ;A db 02h ;B db 02h ;C db 03h ;D db 0eeh ;E db 02h ;F db 02h ;G db 02h ;H db 01h ;I db 02h ;J db 01h ;K db 03h ;L db 03h ;M db 02h ;N db 01h ;O db 02h ;P db 02h ;Q db 02h ;R db 02h ;S db 02h ;T db 04h ;U db 02h ;V db 01h ;W db 02h ;X db 02h ;Y db 01h ;Z ; ;the following routine will build the field pointer table , there will ;an entry for each variable field consisting of 4 bytes: ;this table is used throughout the package to access the variable ;fields of the format. ; ; YY = pointer to field in format buffer ; ZZ = pointer to field in user buffer ; ;the format end character is treated as a variable field and therefore ;gets an entry , the last , in the table . in this case the YY pointer ;is as normal but the ZZ pointer will be set to FFFF , to indicate ;the end of the table. ; BLDFPT: ld bc,(VFCTR) ; LD HL,125 ; sbc hl,bc ;max.no of fields reached? jp m,FLDERR ;yes. ld de,FPTTAB ; ld bc,(SOFFBA) ; ld hl,(VFCTR) ;load no.of fields add hl,hl ;x2 add hl,hl ;x4 add hl,de ;build the table entry address ld (hl),c ;store it inc hl ; ld (hl),b ;in the table ld a,(ENDFLG) ; cp 0ffh ; jp z,ENDFLD ;it must be the end of format! ld bc,(SOFUBA) ;store also inc hl ; ld (hl),c ;the inc hl ; ld (hl),b ;user buffer pointer BLDFP1: ld bc,(VFCTR) ;inc inc bc ;the ld (VFCTR),bc ;no. of variable fields. ret ; FLDERR: ld a,2ch ; call DSPMSG ;display error message pop hl ;pop the stack ld hl,0h ;clear the ld (VFCTR),hl ;var.field counter JP KELP1 ;AND GET CORRECTION ; ENDFLD: ld bc,0ffffh ; inc hl ; ld (hl),c ; inc hl ; ld (hl),b ; jp BLDFP1 ;go and inc the VFCTR ; ; ;the following is the field pointer table , which contains direct ;pointers to th start of any variable field in the Format buffer ;and the start of field in the user buffer. The start of field ;in the crt-buffer may be derived from here.Each pointer entry ;contains of 4 bytes , the first two bytes are the format buffer ;pointer the following 2 are the user buffer pointer. the number ;of pointers is limited to 128 ,which makes it a 512-bytes table. ; FPTTAB: ds 512 ; end ; ; «eof»