;*************************** AMUS Program Label ******************************
; Filename: CVTX.M68 Date: 05/01/91
; Category: UTIL Hash Code: 305-560-730-131 Version: 1.0(102)
; Initials: Name: John Paiement
; Company: Holidair Insurance Services Ltd. Telephone #: 6044214047
; Related Files: CVTX0.M68, CVTSYM.M68
; Min. Op. Sys.: Expertise Level: INT
; Special: Terminal needs box draw and reverse video capability.
; Description: Full function calculator/ Numeric base translator with memory
; operations.
;
;*****************************************************************************
;*; Updated on 01-May-91 at 4:36 PM by John Paiement; edit time: 0:44:49
;
; NOTE all floats are in standard AM format (48 bit)
OBJNAM CVTX.LIT
RADIX 8
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
COPY CVTSYM.M68 ; Symbols and equates for CVTX
; -------------------------------------------------------------
;
; START OF PROGRAM CODE
;
PHDR -1,0,PH$REE!PH$REU ; Program header
;
; Initialization section
;
GETIMP IMPSIZ,A5 ; A5 * to impure area
MOVB #0,XITFLG(A5)
ECHO
CALL DRAWSC ; Draw calculator
MOVB #ADDF,FUNC(A5) ; Start in ADD function
CALL U.FUNC
MOVB #DECN,BASE(A5) ; Start in Decimal base
CALL U.BASE
G1CH:
;
; Controlling module for processing of user input.
; The first character is processed alone to determine special key handling
; The no-input flag is set on special handling to bypass processing.
;
CLRBUF
MOVB #0,NOINP(A5) ; Clear no-input flag
ONEKEY ; Get one character
LEA A2,BASE(A5) ; Check base to process
MOVB @A2,D1
CMPB D1,#RADN
BNE G.35
MOVB #36.,D2 ; Rad input at column 36
JMP G.36
G.36:
ROWCOL
ECHO
KBD ; Get 1 character input
UCS
CTRLC SETXIT ; Exit on CTRL-C
CMPB D1,#ESC ; Or ESC
BNE GET.IN
JMP SETXIT
GET.IN:
;
; Check first character for change of base/function or memory operations
; BYPASS(A5) is set when memory functions selected to avoid placing first
; character in BUFFER
;
PUSH D1
CALL CK1CH
CALL U.FUNC
POP D1
D.OK:
MOVB D1,(A4)+ ; Place in buffer
PUSH D1
ROWCOL
POP D1
TTY ; Echo character
INCB D2 ; Inc column
DL2:
CALL CHR.IN ; Get next char of input
JMP D.IN ; Validate
D.BUZZ:
CMP D1,#RUB ; [101] Process the RUBOUT char
BNE D.RING
CMPB D2,#35.
BEQ D.B2
MOVB #0,-(A4)
DECB D2
D.B2:
ROWCOL
MOVB #32.,D1
JMP D.ECH
D.RING:
MOVB #BELL,D1 ; Ring bell
D.ECH:
TTY
JMP DL2 ; Get again
MOVB D1,(A4)+ ; Place in buffer
PUSH D1
ROWCOL
POP D1
TTY ; Echo character
INCB D2 ; Inc column
O.LOOP:
CALL CHR.IN ; Get rest of input
JMP O.IN ; Get next
O.BUZZ:
CMP D1,#RUB ; [101] Process the RUBOUT char
BNE O.RING
CMPB D2,#35.
BEQ O.B2
MOVB #0,-(A4)
DECB D2
O.B2:
ROWCOL
MOVB #32.,D1
JMP O.ECH
O.RING:
MOVB #BELL,D1 ; Ring bell
O.ECH:
TTY
JMP O.LOOP ; Get again
O.DONE:
RTN
R.IN:
;
; input of Rad50 number
;
MOVB #1,D3
PUSH D1
ROWCOL
POP D1
TTY ; Echo character
MOVB D1,(A4)+ ; Place in buffer
INCB D2 ; Inc column
R.GET:
CALL CHR.IN ; Get 2nd char
CMP D1,#RUB ; [101] Process the RUBOUT char
BNE R.SAV
MOVB D1,(A4)+ ; Place in buffer
PUSH D1
ROWCOL
POP D1
TTY ; Echo character
INCB D2 ; Inc column
B.LOOP:
CALL CHR.IN ; Get rest of input
JMP B.IN ; Get next
B.BUZZ:
CMP D1,#RUB ; [101] Process the RUBOUT char
BNE B.RING
CMPB D2,#35.
BEQ B.B2
MOVB #0,-(A4)
DECB D2
B.B2:
ROWCOL
MOVB #32.,D1
JMP B.ECH
B.RING:
MOVB #BELL,D1 ; Ring bell
B.ECH:
TTY
JMP B.LOOP ; Get again
P.CNT:
MOVB D1,(A4)+ ; Place in buffer
PUSH D1
ROWCOL
POP D1
TTY ; Echo character
INCB D2 ; Inc column
P.LOOP:
CALL CHR.IN ; Get rest of input
JMP P.IN ; Get next
P.BUZZ:
CMP D1,#RUB ; [101] Process the RUBOUT char
BNE P.RING
CMPB D2,#36.
BEQ P.B2
MOVB #0,-(A4)
DECB D2
P.B2:
ROWCOL
MOVB #32.,D1
JMP P.ECH
P.RING:
MOVB #BELL,D1 ; Ring bell
P.ECH:
TTY
JMP P.LOOP ; Get again
P.DONE:
RTN
CK1CH:
;
; Check first character input for special processing
;
CMPB D1,#CR ; Display total on CR
BNE C10
LEA A2,ACCUM(A5)
LEA A4,DISVAL(A5)
MOV (A2)+,(A4)+ ; Set the ACCUM to be displayed
MOVW @A2,@A4
MOVB #34.,D2
CALL SHW.IT
CALL N.PROC
RTN
C10:
CMPB D1,#CLRM ; Clear memory
BNE CLR.D
LEA A2,MEMVAL(A5)
MOV #0,(A2)+
MOVW #0, @A2
LEA A2,MEMVAL(A5)
LEA A4,DISVAL(A5)
MOV (A2)+,(A4)+ ; Set the ACCUM to be displayed
MOVW @A2,@A4
MOVB #56.,D2
CALL SHW.IT
CALL N.PROC
RTN
CLR.D:
CMPB D1,#CLRD ; Clear display
BNE S.ADD
CLRACC ; Clear accumulator
CLRVAL ; Clear input value
LEA A2,INVAL(A5)
LEA A4,DISVAL(A5)
MOV (A2)+,(A4)+ ; Set the INVAL to be displayed
MOVW @A2,@A4
MOVB #34.,D2
CALL SHW.IT
CALL N.PROC
RTN
S.ADD:
CMPB D1,#PLUS ; Set function to ADD
BNE S.SUB
MOVB #ADDF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.SUB:
CMPB D1,#MINS ; Set function to Subt
BNE S.MUL
MOVB #SUBF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.MUL:
CMPB D1,#TIMS ; Set function to Mult
BNE S.DIV
MOVB #MULF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.DIV:
CMPB D1,#DIVS ; Set function to Div
BNE S.AND
MOVB #DIVF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.AND:
CMPB D1,#LAND ; Set function to And
BNE S.OR
MOVB #ANDF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.OR:
CMPB D1,#LOR ; Set function to Or
BNE S.NOT
MOVB #ORF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.NOT:
CMPB D1,#LNOT ; Set function to Not
BNE S.XOR
MOVB #NOTF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
S.XOR:
CMPB D1,#LXOR ; Set function to Xor
BNE CK.MEM
MOVB #XORF,FUNC(A5)
CALL N.PROC ; Set No-processing flag
RTN
CK.MEM:
CMPB D1,#MFNC ; Check if memory manipulation CTRL-P
BEQ M.ADD
CMPB D1,#TAB ; Change base
BEQ S.BAS
RTN
S.BAS:
CALL SLCT.B
CALL N.PROC ; Set No-processing flag
RTN
M.ADD:
KBD ; Get 2nd half of memory op
UCS
CMPB D1,#PLUS ; Add to memory <+>
BNE M.SUB
LEA A2,DISVAL(A5)
LEA A3,MEMVAL(A5)
FADD A2, A3
LEA A2,MEMVAL(A5)
LEA A4,DISVAL(A5)
MOV (A2)+,(A4)+ ; Set the ACCUM to be displayed
MOVW @A2,@A4
MOVB #56.,D2
CALL SHW.IT
CALL N.PROC ; Set No-processing flag
RTN
M.SUB:
CMPB D1,#MINS ; Subtract from memory <->
BNE M.OUT
LEA A2,DISVAL(A5)
LEA A3,MEMVAL(A5)
FSUB A2, A3
LEA A2,MEMVAL(A5)
LEA A4,DISVAL(A5)
MOV (A2)+,(A4)+ ; Set the ACCUM to be displayed
MOVW @A2,@A4
MOVB #56.,D2
CALL SHW.IT
CALL N.PROC ; Set No-processing flag
RTN
M.OUT:
CMPB D1,#CR ; Recall memory on <CR>
BNE M.IN
LEA A2,MEMVAL(A5)
LEA A4,DISVAL(A5)
MOV (A2)+,(A4)+ ; Set the ACCUM to be displayed
MOVW @A2,@A4
MOVB #56.,D2
CALL SHW.IT
CALL N.PROC ; Set No-processing flag
CK.DON:
RTN
CHR.IN:
;
; Get the rest of the input from user
;
ROWCOL
ECHO
KBD
UCS
RTN
AND D2,D1
CLRBUF
CLRVAL
LEA A2,BUFFER(A5)
DCVT 0,OT$MEM ; Place decimal string in buffer
LEA A2,BUFFER(A5)
GTFLT INVAL(A5) ; Convert buffer to float at INVAL
LEA A2,INVAL(A5)
LEA A3,DISVAL(A5)
LEA A4,ACCUM(A5)
MOV (A3)+,@A4
MOV (A2)+,(A4)+ ; Set the INVAL to be displayed
MOVW @A3,@A4
MOVW @A2,@A4
OR D2,D1
CLRBUF
CLRVAL
LEA A2,BUFFER(A5)
DCVT 0,OT$MEM ; Place decimal string in buffer
LEA A2,BUFFER(A5)
GTFLT INVAL(A5) ; Convert buffer to float at INVAL
LEA A2,INVAL(A5)
LEA A3,DISVAL(A5)
LEA A4,ACCUM(A5)
MOV (A3)+,@A4
MOV (A2)+,(A4)+ ; Set the INVAL to be displayed
MOVW @A3,@A4
MOVW @A2,@A4
NOT D1
CLRBUF
CLRVAL
LEA A2,BUFFER(A5)
DCVT 0,OT$MEM ; Place decimal string in buffer
LEA A2,BUFFER(A5)
GTFLT INVAL(A5) ; Convert buffer to float at INVAL
LEA A2,INVAL(A5)
LEA A3,DISVAL(A5)
LEA A4,ACCUM(A5)
MOV (A3)+,@A4
MOV (A2)+,(A4)+ ; Set the INVAL to be displayed
MOVW @A3,@A4
MOVW @A2,@A4
NOT.DN:
CMPB D1,#68. ; Is it D
BNE CHK.H
MOVB #DECN,BASE(A5)
PRTTAB -1,28. ; Cursor on
JMP SB.END
CHK.H:
CMPB D1,#72. ; Is it H
BNE CHK.O
MOVB #HEXN,BASE(A5)
JMP SB.END
CHK.O:
CMPB D1,#79. ; Is it O
BNE CHK.R
MOVB #OCTN,BASE(A5)
JMP SB.END
CHK.R:
CMPB D1,#82. ; Is it R
BNE CHK.B
MOVB #RADN,BASE(A5)
JMP SB.END
CHK.B:
CMPB D1,#66. ; Is it B
BNE CHK.P
MOVB #BINN,BASE(A5)
JMP SB.END
CHK.P:
CMPB D1,#80. ; Is it P
BEQ PPN
JMP BAS.10
PPN:
MOVB #PPNN,BASE(A5)
SB.END:
CALL U.BASE
PRTTAB -1,28. ; Cursor on
RTN
HILIT:
;
; Hilite the current base for selection
;
PUSH D1
MOVB #28.,D2
ROWCOL ; At current base row,28
PRTTAB -1,32. ; Hilite char
MOVB #34.,D2
ROWCOL
PRTTAB -1,33.
POP D1
RTN
UNLIT:
;
; Restore normal video on selection
;
PUSH D1
MOVB #28.,D2
ROWCOL ; At current base row,28
PRTTAB -1,33. ; End Hilite char
POP D1
RTN
U.BASE:
;
; Update the base in calculator window
;
DEFINE OFFTAB A0,A1,A2,A3,A4,A5
IF NB, A0, WORD A0-.
IF NB, A1, WORD A1-.
IF NB, A2, WORD A2-.
IF NB, A3, WORD A3-.
IF NB, A4, WORD A4-.
IF NB, A5, WORD A5-.
ENDM
; Word offset and data table for base/function text placement
;
BT1: OFFTAB BA0,BA1,BA2,BA3,BA4,BA5
FT1: OFFTAB FA1,FA2,FA3,FA4,FA5,FA6
OFFTAB FA7,FA8