.TITLE FRMIO ... form i/o module .IDENT /070683/ .enabl lc ; ; ; ; WRITTEN BY RAY DI MARCO ; 25-SEP-80. ; ; ; VERSION 250980/08. ; ; ; ;-------------------------------------------------------------------------- ; ; ; THIS MODULE CONTAINS THE ROUTINES 'FRM.BG' AND 'FRM.FG' WHICH ARE USED ; TO DISPLAY THE BACK-GROUND AND FORE-GROUND PARTS OF A FORM. THE ROUTINES ; REQUIRE THAT 'R0' HOLD THE ADDRESS OF THE FORM/RECORD TABLE AT ENTRY, ; AND R5 THE ADDRESS OF THE RECORD TO BE DISPLAYED. REFER TO DOCUMENTATION ; ON 'FORMAT' FOR EXTRA DETAILS. ; ; THIS MODULE ALSO CONTAINS THE 'FRM.EF' ROUTINE WHICH IS USED TO CLEAR THE ; SECTION OF SCREEN USED TO DISPLAY FORMS, AND 'FRM.ZE' WHICH IS USED ; TO ZERO THE DATA CURRENTLY STORED IN THE FORM RECORD. ; ; .SBTTL MODIFICATIONS ; ; ; 12-JAN-81 CHANGE 'FRM.EF' SO THAT ERASE ALL SCREEN AND REWRITE STATUS ; AND PROMPT. ; ; 14-JAN-81 ADD IN 'FRM.ZP' TO ZERO ALL FORM, EVEN PROTECTED PARTS. ; ; 5-MAR-81 ADD IN REVERSE/COLOUR CONTROL CODE IN 'FRM.BG' ; ; 28-APR-81 'BACKIT' DO NOT DISPLAY NAME IF STARTS WITH A '!' SYMBOL ; 30-APR-81 MAJOR CHANGES TO SUPPORT MULTIPLE PAGES ; 1-Sep-82 Change FRM.FG/BACKIT to improve efficiency ; 7-Jun-83 change FRM.BG to support labels more efficiently ; change FRM.Z* so that old labels not zeroed ; .SBTTL DOCUMENTATION - ARGUMENT PASSING ; ; ; ALL ROUTINES PRESERVE ALL REGISTERS. ; ; THE 'FRM.EF' ROUTINE ACCEPTS NO ARGUMENTS. TWO CONSTANTS DEFINED IN ; THIS MODULE DEFINE THE FORMS WINDOW. ; ; THE OTHER ROUTINES EXPECT THE RDT AND RECADD ARGUMENTS TO BE HELD ; IN 'R0' AND 'R1' AT ENTRY. ; ; .SBTTL DECLARATIONS ; ; ; .MCALL .PUSH,.POP ; STACKING ; .GLOBL FRM.EF,FRM.BG,FRM.FG,FRM.ZE ; I/O ROUTINES .GLOBL FRM.ZP .GLOBL FLD.OU ; OUTPUT TO FIELD .GLOBL FLD.ZE,FLD.ZP ; ZERO FIELD CONTENTS .GLOBL CON.XY ; POSITION CUSOR .GLOBL CON.EL ; CLEAR LINE .GLOBL CON.ES,IOM.ST,IOM.PT,IOM.TB ; FOR 'FRM.EF' .GLOBL PAGE$$ ;; PAGE NUMBER ; ; ; .SBTTL DEFINITIONS ; ; SCNSIZ = 24. ; 24 LINES/SCREEN STFORM = 5. ; FORM STARTS AT LINE 5 .XN = 20 ; OFFSET TO X-NAME COORDINATE .YN = 21 ; OFFSET TO Y-NAME COORDINATE .NAME = 22 ; OFFSET TO NAME ADDRESS .XLD = 24 ; LEFT DELIMITER X COORDINATE .YLD = 25 ; LEFT DELIMITER Y COORDINATE .LD = 26 ; LEFT DELIMITER .XRD = 27 ; RIGHT DELIMITER X .YRD = 30 ; RIGHT DELIMITER Y .RD = 31 ; RIGHT DELIMITER ; ; ; .PSECT CODE ; OPEN CODE SECTION ; ; .SBTTL DEFINITION - MACRO '.OUT' ; ; ; THIS ROUTINE CAUSES A NUMBER OF CHARCATERS TO BE OUTPUT TO ; THE CONSOLE. ; ; .MACRO .OUT CHAR .GLOBL CON.CO .IF B, CALL CON.CO .MEXIT .ENDC MOV R0,-(SP) .IRP X, MOVB X,R0 CALL CON.CO .ENDR MOV (SP)+,R0 .ENDM .OUT ; ; ; .SBTTL DEFINITION - MACRO '.PRINT' ; ; .MACRO .PRINT MESSAGE .GLOBL CON.LO .IIF NB,MESSAGE, MOV MESSAGE,R0 CALL CON.LO .ENDM .PRINT ; ; .SBTTL ROUTINE - 'FRM.ER' ... ERASE FORM FROM SCREEN ; ; ; FRM.EF: .PUSH R0 ; SAVE CALL CON.ES ; ERASE SCREEN MOV IOM.TB,R0 ; GET STATUS MESSAGE CALL IOM.ST ; DISPLAY STATUS MOV IOM.TB+2,R0 ; GET ADDRESS PROMPT MESSAGE CALL IOM.PT ; DISPLAY PROMPT .POP R0 ; RESTORE RETURN ; EXIT ; ; ; .SBTTL Routine - FRM.BG ... display background ; ; This routine is called to display the background data associated with the ; form whose header block is pointed to by R0. The background information ; consists of the field names/delimiters and any labels on the currently ; selected page. The address of the label string is stored in the last ; word of the first FDB. ; ; setup registers ; FRM.BG: .PUSH ; save .OUT #201 ; turn on 'bg' colour MOV (R0),R1 ; R1 -> record buffer MOV 2(R0),R2 ; R2 -> first FDB MOV 4(R0),R3 ; R3 = number FDBs ; ; ; output any labels ; MOV 36(R2),R4 ; R4 = offset to backgound labels BEQ 7000$ ; skip if none defined ADD R2,R4 ; R4 -> labels 1000$: MOVB (R4)+,R0 ; R0 = page BMI 7000$ ; skip if @EOS BEQ 1100$ ; accept if on page 0 CMP R0,PAGE$$ ; on this page? BNE 1700$ ; no --> ignore 1100$: MOVB (R4)+,R0 ; R0 = Y BIC #^C377,R0 ; discard unwanted bits SWAB R0 ; R0 = Y:0 BISB (R4)+,R0 ; R0 = Y:X CALL CON.XY ; position cursor 1200$: MOVB (R4)+,R0 ; R0 = next byte BLE 1000$ ; restart if done CALL CON.CO ; output character BR 1200$ ; loop 1700$: TSTB (R4)+ ; @eos? BGT 1700$ ; no --> loop BR 1000$ ; yes -> next ; ; output field names/delimiters ; 7000$: MOV R2,R0 ; R0 -> fdb CALL BACKIT ; display field name/delimiters ADD #40,R2 ; R2 -> next fdb SOB R3,7000$ ; loop till all done ; ; exit ; .OUT #202 ; turn off BG colour .POP ; restore RETURN ; home ; .SBTTL ROUTINE - 'FRM.FG' ... FRMPLAY FORM FOREGROUND ; ; ; FRM.FG: .PUSH ; SAVE MOV (R0),R1 ; ADDRESS OF RECORD MOV 2(R0),R2 ; TABLE OF FDBS MOV 4(R0),R3 ; COUNT OF NUMBER OF FIELDS 10$: MOV R2,R0 ; ARGUMENT IS FDB TST 10(R0) ;; processing LABEL entry? (ie Y=0) BEQ 60$ ;; yes -> skip TST 14(R0) ;; FIELD ON PAGE 0? BEQ 40$ ;; YES -> DISPLAY CMP 14(R0),PAGE$$ ;; FIELD ON THIS PAGE? BNE 60$ ;; NO -> NO DISPALY 40$: CALL FLD.OU ;; OUTPUT FIELD CONTENTS 60$: ADD #40,R2 ;; POINT NEXT FDB SOB R3,10$ ; LOOP .POP ; RESTORE RETURN ; HOME ; ; .SBTTL ROUTINE - 'FRM.ZE' ... ZERO FORM ; ; ; FRM.ZE: .PUSH ; save MOV (R0),R1 ; R1 -> record MOV 2(R0),R2 ; R2 -> FDBs MOV 4(R0),R3 ; R3 = number FDBs 10$: MOV R2,R0 ; R0 -> FDB TST 10(R0) ; Y = 0 (ie label)? BEQ 20$ ; yes -> skip CALL FLD.ZE ; no --> zero 20$: ADD #40,R2 ; point next fdb SOB R3,10$ ; loop .POP ; restore RETURN ; home ; ; .SBTTL ROUTINE - 'FRM.ZP' ... ZERO FORM ; ; ; FRM.ZP: .PUSH ; save MOV (R0),R1 ; R1 -> record MOV 2(R0),R2 ; R2 -> FDBs MOV 4(R0),R3 ; R3 = number FDBs 10$: MOV R2,R0 ; R0 -> FDB TST 10(R0) ; Y = 0 (ie label)? BEQ 20$ ; yes -> skip CALL FLD.ZP ; no --> zero 20$: ADD #40,R2 ; point next fdb SOB R3,10$ ; loop .POP ; restore RETURN ; home ; ; .SBTTL ROUTINE - 'BACKIT' ... FRMPLAY A FORM ENTRY ; ; ; ; THIS ROUTINE FRMPLAYS THE ENTRY/BACKGROUND INFORMATION WHICH ; IS ASSOCIATED WITH A FIELD. THE ADDRESS OF THE FDB IS PASSED ; OVER IN R0. ; ; BACKIT: .PUSH ;; SAVE TST 14(R0) ;; PAGE 0 FIELD? BEQ 20$ ;; YES -> DISPLAY CMP 14(R0),PAGE$$ ;; ON THIS PAGE? BNE 200$ ;; NO -> SKIP ; 20$: MOV R0,R4 ; ADDRESS RDB -> R4 CMPB @.NAME(R4),#'! ;; suppress name? BEQ 40$ ;; yes -> 40$ MOV .XN(R4),R0 ; NAME COORDINATES -> R0 CALL CON.XY ; POSITION CUSOR .PRINT .NAME(R4) ; FRMPLAY NAME ; 40$: TSTB .LD(R4) ;; suppress LD? BEQ 100$ ;; yes -> skip MOV .XLD(R4),R0 ;; LEFT DELIMITIER COORDINATES -> R0 CALL CON.XY ;; POSITION CUSOR .OUT .LD(R4) ;; OUTPUT DELIMITER ; 100$: TSTB .RD(R4) ;; suppress RD? BEQ 200$ ;; yes -> skip MOVB .XRD(R4),R0 ; DELIMITER ... MOVB .YRD(R4),R1 ; ... COORDINATES ... SWAB R1 ; ... ---> ... ADD R1,R0 ; ... R0 CALL CON.XY ; POSITION CUSOR .OUT .RD(R4) ; OUTPUT DELIMITER ; 200$: .POP ;; RESTORE RETURN ; HOME ; ; ; .END