;***************************************************************************;
;                                                                           ;
;                                    BOX                                    ;
;                    Draws a graphics box on the screen                     ;
;                                                                           ;
;***************************************************************************;
;Copyright (C) 1986 by UltraSoft.  All Rights Reserved.
;
;Written by: David Pallmann
;
;Usage: XCALL BOX, StartRow, StartCol, EndRow, EndCol
;
;To assemble: (1) .M68 BOX
;             (2) .LNKLIT BOX

;1.0 12-Nov-85 created. /DFP

       OBJNAM  .SBR

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       EXTERN  $GTARG

;XCALL Argument List - indexed by A3

       .OFINI
       .OFDEF  XC.ARG,2
       .OFDEF  XC.TY1,2
       .OFDEF  XC.AD1,4
       .OFDEF  XC.SZ1,4
       .OFDEF  XC.TY2,2
       .OFDEF  XC.AD2,4
       .OFDEF  XC.SZ2,4
       .OFDEF  XC.TY3,2
       .OFDEF  XC.AD3,4
       .OFDEF  XC.SZ3,4
       .OFDEF  XC.TY4,2
       .OFDEF  XC.AD4,4
       .OFDEF  XC.SZ4,4
       .OFSIZ  XC.SIZ

;Variable type codes

       XC$UNF=0                        ; unformatted
       XC$STR=2                        ; string
       XC$FLT=4                        ; floating point
       XC$BIN=6                        ; binary

DEFINE  TCALL   CODE
       MOVW    #-1_8.+^D<CODE>,D1
       TCRT
       ENDM

DEFINE CLS=TCALL 0
DEFINE GRAFIX=TCALL 23
DEFINE TEXT=TCALL 24

DEFINE  CURSOR  ROW,COL
       MOVW    ROW,D1
       ROLW    D1,#8.
       ADDW    COL,D1
       TCRT
       ENDM

       MEM=A4

       .OFINI
       .OFDEF  STAROW,2                ; start row
       .OFDEF  STACOL,2                ; start column
       .OFDEF  ENDROW,2                ; end row
       .OFDEF  ENDCOL,2                ; end column
       .OFDEF  WIDTH,2                 ; box width
       .OFSIZ  MEMSIZ

DEFINE  MOVWL   SRC,DST
       CLR     DST
       MOVW    SRC,DST
       ENDM

DEFINE  TCALL   CHAR1
       MOVW    #-1_8.+^D<CHAR1>,D1
       TCRT
       ENDM

       VMAJOR=1
       VMINOR=0

START:  PHDR    -1,0,PH$REE!PH$REU

CHKCNT: CMMW    XC.ARG(A3),#4
       BEQ     GETARG
       TYPECR  ?Invalid number of arguments in BOX.SBR
       RTN

GETARG: MOV     #XC.TY1,D1
       CALL    $GTARG
       MOVW    D1,STAROW(MEM)

GETAG2: MOV     #XC.TY2,D1
       CALL    $GTARG
       MOVW    D1,STACOL(MEM)

GETAG3: MOV     #XC.TY3,D1
       CALL    $GTARG
       MOVW    D1,ENDROW(MEM)

GETAG4: MOV     #XC.TY4,D1
       CALL    $GTARG
       MOVW    D1,ENDCOL(MEM)

CHECK:  CMMW    STAROW(MEM),#1
       JLT     RANGE
       CMMW    ENDROW(MEM),#24.
       JGT     RANGE
       CMMW    STAROW(MEM),ENDROW(MEM)
       JGE     RANGE
       CMMW    STACOL(MEM),#1
       JLT     RANGE
       CMMW    ENDCOL(MEM),#80.
       JGT     RANGE
       CMMW    STACOL(MEM),ENDCOL(MEM)
       JGE     RANGE

CALC:   CLR     D0
       MOVW    ENDCOL(MEM),D0
       SUBW    STACOL(MEM),D0
       MOVW    D0,WIDTH(MEM)

TOPLIN: GRAFIX
       CURSOR  STAROW(MEM),STACOL(MEM)
       TCALL   38
       MOVWL   WIDTH(MEM),D0
       BEQ     20$
       DEC     D0
       BEQ     20$
10$:    TCALL   46
       SOB     D0,10$
20$:    TCALL   39
       INCW    STAROW(MEM)

MIDLIN: CTRLC   EXIT
       CMMW    STAROW(MEM),ENDROW(MEM)
       BEQ     BTMLIN
       CURSOR  STAROW(MEM),STACOL(MEM)
       TCALL   47
       CURSOR  STAROW(MEM),ENDCOL(MEM)
       TCALL   47
       INCW    STAROW(MEM)
       BR      MIDLIN

BTMLIN: CURSOR  ENDROW(MEM),STACOL(MEM)
       TCALL   40
       MOVWL   WIDTH(MEM),D0
       BEQ     20$
       DEC     D0
       BEQ     20$
10$:    TCALL   46
       SOB     D0,10$
20$:    TCALL   41

EXIT:   TEXT
       RTN

RANGE:  TYPECR  ?Argument out of range in BOX.SBR
       RTN

       END