; ************************** AMUS Program Label ******************************
; Filename: BYTE.M68                                        Date: 01/23/90
; Category: UTIL         Hash Code: 525-467-332-132      Version: 1.0(101)
; Initials: ULTR/AM      Name: DAVID PALLMANN
; Company: ULTRASOFT CORPORATION                   Telephone #: 5163484848
; Related Files:
; Min. Op. Sys.: AMOSL 1.3B                    Expertise Level: BEG
; Special: Requires 2.0 assembler -- After assembly: .LNKLIT BYTE
; Description: Byte conversion utility & dynamic ASCII/ISO Latin I character
; set chart.  Useful to programmers who need to do conversions (just about
; all of us at one time or another).  A must for AM65 users in particular.
; ****************************************************************************

;****************************************************************************
;*                                                                          *
;*                                  BYTE                                    *
;*                         Byte Conversion Utility                          *
;*                                                                          *
;****************************************************************************
;Copyright (C) 1990 UltraSoft Corporation.  All Rights Reserved.
;
;Written by: David Pallmann
;
;Edit History:
;1.0(100)  23-Jan-90  created. /DFP
;1.0(101)  23-Jan-90  fix descriptions (thanks Bob Currier). /DFP

       VMAJOR  =1
       VMINOR  =0
       VSUB    =0
       VEDIT   =101.
       VWHO    =0

       AUTOEXTERN

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

;ASCII character defintions

       $ESC    =33                     ; escape

;variables

       .OFINI
       .OFDEF  ROW,    1               ; row number (1-8)
       .OFDEF  BYTE,   1               ; current value
       .OFDEF  POS,    1               ; relative position (0,2,4,...)
       .OFDEF  COL,    1               ; cursor column position
       .OFDEF  BYTTBL, 16.             ; byte value table
       .OFDEF  BUFFER, 4               ; conversion buffer
       .OFSIZ  MEMSIZ

;macros

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

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

DEFINE  REPEAT  COUNT,INSTR
       MOV     #COUNT,D0
1$$:    INSTR
       DEC     D0
       BNE     1$$
       ENDM

;***********
;*  START  *
;***********
;Start of program

START:  PHDR    -1,0,PH$REE!PH$REU      ; program header
       GETIMP  MEMSIZ,A5               ;
       TRMRST  D0                      ;
       ORW     #T$DAT!T$ECS!T$XLT,D0   ;
       TRMWST  D0                      ;
       CALL    SCREEN                  ; display the screen
       CLRB    ROW(A5)                 ; clear row
       CALL    GETVAL                  ;
       MOVB    #32.,POS(A5)            ; start out in character column

;come here to get a new data line

NEWLIN: CALL    PUTVAL                  ;
       CMPB    ROW(A5),#16.            ;
       BGE     10$
       INCB    ROW(A5)                 ; update row
       CALL    GETVAL                  ;
       BR      20$                     ;
10$:    MOVB    #1,ROW(A5)              ;
       CALL    GETVAL                  ;
20$:    CALL    UPDATE                  ; clear out current data line
       BR      GETCOL                  ;

PRVLIN: CALL    PUTVAL                  ;
       CMPB    ROW(A5),#1              ;
       BLE     10$                     ;
       DECB    ROW(A5)                 ;
       CALL    GETVAL                  ;
       BR      20$                     ;
10$:    MOVB    #16.,ROW(A5)            ;
       CALL    GETVAL                  ;
20$:    CALL    UPDATE                  ;

;get column based on relative position

GETCOL: LEA     A6,COLTBL               ;
       CLR     D6                      ;
       MOVB    POS(A5),D6              ;
       ASR     D6                      ;
       ADD     D6,A6                   ;
       MOVB    @A6,COL(A5)             ;

;position cursor and get a character

POSITION:
       MOV     #5,D0                   ;
       ADDB    ROW(A5),D0              ;
       CURSOR  D0,COL(A5)              ;
       CRT     28                      ;
       TIN                             ;
       MOV     D1,D0                   ;
       CRT     29                      ;
       MOV     D0,D1                   ;

EDIT:   CMPB    D1,#$ESC                ;
       JEQ     QUIT                    ;
       CMPB    D1,#'M-'@               ;
       JEQ     NEWLIN                  ;
       CMPB    D1,#'J-'@               ;
       JEQ     NEWLIN                  ;
       CMPB    D1,#'K-'@               ;
       JEQ     PRVLIN                  ;
       CMPB    D1,#'H-'@               ;
       JEQ     BACKUP                  ;
       CMPB    D1,#'L-'@               ;
       JEQ     ADVANCE                 ;
       CMPB    D1,#'U-'@               ;
       JEQ     FAR.LEFT                ;
       CMPB    D1,#'N-'@               ;
       JEQ     FAR.RIGHT               ;
       CMPB    D1,#'A-'@               ;
       JEQ     PREV.WORD               ;
       CMPB    D1,#'W-'@               ;
       JEQ     NEXT.WORD               ;
       CMPB    D1,#'S-'@               ;
       JEQ     CHART                   ;
       CMPB    D1,#'R-'@               ;
       JEQ     PREV.SCREEN             ;
       CMPB    D1,#'T-'@               ;
       JEQ     NEXT.SCREEN             ;
       CMPB    D1,#'^-'@               ;
       JEQ     HOME                    ;
       CMPB    D1,#'E-'@               ;
       JEQ     ENDCHT                  ;
       CMPB    D1,#'?                  ;
       JEQ     HELP                    ;
       CMPB    D1,#'G-'@               ;
       BNE     JUMP                    ;
       TIN                             ;

JUMP:   CLRB    D0                      ;
       MOVB    POS(A5),D0              ;
       MOVW    JMPTBL[~D0],D0          ;
       JMP     JMPTBL[~D0]             ;

DEFINE CASE LABEL=WORD LABEL-JMPTBL

JMPTBL: CASE    BINARY8                 ; 000
       CASE    BINARY7                 ; 002
       CASE    BINARY6                 ; 004
       CASE    BINARY5                 ; 006
       CASE    BINARY4                 ; 008
       CASE    BINARY3                 ; 010
       CASE    BINARY2                 ; 012
       CASE    BINARY1                 ; 014
       CASE    OCTAL3                  ; 016
       CASE    OCTAL2                  ; 018
       CASE    OCTAL1                  ; 020
       CASE    DECIMAL3                ; 022
       CASE    DECIMAL2                ; 024
       CASE    DECIMAL1                ; 026
       CASE    HEX2                    ; 028
       CASE    HEX1                    ; 030
       CASE    CHAR                    ; 032

BINARY8:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B01111111,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B10000000,D1          ;
       JMP     DIGIT                   ;

BINARY7:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B10111111,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B01000000,D1          ;
       JMP     DIGIT                   ;

BINARY6:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11011111,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B00100000,D1          ;
       JMP     DIGIT                   ;

BINARY5:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11101111,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B00010000,D1          ;
       JMP     DIGIT                   ;

BINARY4:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11110111,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B00001000,D1          ;
       JMP     DIGIT                   ;

BINARY3:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11111011,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B00000100,D1          ;
       JMP     DIGIT                   ;

BINARY2:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11111101,D1          ;
       CMPB    D0,#'0                  ;
       JEQ     DIGIT                   ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B00000010,D1          ;
       JMP     DIGIT                   ;

BINARY1:
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11111110,D1          ;
       CMPB    D0,#'0                  ;
       BEQ     10$                     ;
       CMPB    D0,#'1                  ;
       JNE     POSITION                ;
       ORB     #^B00000001,D1          ;
10$:    MOVB    D1,BYTE(A5)             ;
       CALL    UPDATE                  ;
       CLRW    POS(A5)                 ;
       JMP     NEWLIN                  ;

OCTAL3: MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B00111111,D1          ;
       CMPB    D0,#'0                  ;
       JLO     POSITION                ;
       CMPB    D0,#'7                  ;
       JHI     POSITION                ;
       SUBB    #'0,D0                  ;
       ROL     D0,#6                   ;
       ADDB    D0,D1                   ;
       JMP     DIGIT                   ;

OCTAL2: MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11000111,D1          ;
       CMPB    D0,#'0                  ;
       JLO     POSITION                ;
       CMPB    D0,#'7                  ;
       JHI     POSITION                ;
       SUBB    #'0,D0                  ;
       ROL     D0,#3                   ;
       ADDB    D0,D1                   ;
       JMP     DIGIT                   ;

OCTAL1: MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11111000,D1          ;
       CMPB    D0,#'0                  ;
       JLO     POSITION                ;
       CMPB    D0,#'7                  ;
       JHI     POSITION                ;
       SUBB    #'0,D0                  ;
       ADDB    D0,D1                   ;
       MOVB    D1,BYTE(A5)             ;
       CALL    UPDATE                  ;
       MOVB    #16.,POS(A5)            ;
       JMP     NEWLIN                  ;

DECIMAL3:
       CMPB    D1,#'0                  ;
       JLO     POSITION                ;
       CMPB    D1,#'9                  ;
       JHI     POSITION                ;
       MOVB    D1,D0                   ;
       CLR     D1                      ;
       MOVB    BYTE(A5),D1             ;
       LEA     A2,BUFFER(A5)           ;
       DCVT    3,OT$MEM                ;
       CLRB    @A2                     ;
       CLRB    BUFFER(A5)              ;
       ADDB    D0,BUFFER(A5)           ;
       LEA     A2,BUFFER(A5)           ;
       GTDEC                           ;
       JMP     DIGIT                   ;

DECIMAL2:
       CMPB    D1,#'0                  ;
       JLO     POSITION                ;
       CMPB    D1,#'9                  ;
       JHI     POSITION                ;
       MOVB    D1,D0                   ;
       CLR     D1                      ;
       MOVB    BYTE(A5),D1             ;
       LEA     A2,BUFFER(A5)           ;
       DCVT    3,OT$MEM                ;
       CLRB    @A2                     ;
       CLRB    BUFFER+1(A5)            ;
       ADDB    D0,BUFFER+1(A5)         ;
       LEA     A2,BUFFER(A5)           ;
       GTDEC                           ;
       JMP     DIGIT                   ;

DECIMAL1:
       CMPB    D1,#'0                  ;
       JLO     POSITION                ;
       CMPB    D1,#'9                  ;
       JHI     POSITION                ;
       MOVB    D1,D0                   ;
       CLR     D1                      ;
       MOVB    BYTE(A5),D1             ;
       LEA     A2,BUFFER(A5)           ;
       DCVT    3,OT$MEM                ;
       CLRB    @A2                     ;
       CLRB    BUFFER+2(A5)            ;
       ADDB    D0,BUFFER+2(A5)         ;
       LEA     A2,BUFFER(A5)           ;
       GTDEC                           ;
       MOVB    D1,BYTE(A5)             ;
       CALL    UPDATE                  ;
       MOVB    #22.,POS(A5)            ;
       JMP     NEWLIN                  ;

HEX2:   UCS                             ;
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B00001111,D1          ;
       CMPB    D0,#'A                  ;
       BLO     10$                     ;
       CMPB    D0,#'F                  ;
       BHI     10$                     ;
       SUBB    #'A,D0                  ;
       ADDB    #10.,D0                 ;
       BR      20$                     ;
10$:    CMPB    D0,#'0                  ;
       JLO     POSITION                ;
       CMPB    D0,#'7                  ;
       JHI     POSITION                ;
       SUBB    #'0,D0                  ;
20$:    ROL     D0,#4                   ;
       ADDB    D0,D1                   ;
       JMP     DIGIT                   ;

HEX1:   UCS                             ;
       MOVB    D1,D0                   ;
       MOVB    BYTE(A5),D1             ;
       AND     #^B11110000,D1          ;
       CMPB    D0,#'A                  ;
       BLO     10$
       CMPB    D0,#'F                  ;
       BHI     10$                     ;
       SUBB    #'A,D0                  ;
       ADDB    #10.,D0                 ;
       BR      20$                     ;
10$:    CMPB    D0,#'0                  ;
       JLO     POSITION                ;
       CMPB    D0,#'7                  ;
       JHI     POSITION                ;
       SUBB    #'0,D0                  ;
20$:    ADDB    D0,D1                   ;
       MOVB    D1,BYTE(A5)             ;
       CALL    UPDATE                  ;
       MOVB    #28.,POS(A5)            ;
       JMP     NEWLIN                  ;

DIGIT:  MOVB    D1,BYTE(A5)             ;
       ADDB    #2,POS(A5)              ;
       CALL    PUTVAL                  ;
       CALL    UPDATE                  ;
       JMP     GETCOL                  ;

CHAR:   MOVB    D1,BYTE(A5)             ;
       CALL    PUTVAL                  ;
       CALL    UPDATE                  ;
       JMP     NEWLIN                  ;

;move left one cursor position

BACKUP: TSTB    POS(A5)                 ;
       BNE     10$                     ;
       MOVB    #32.,POS(A5)            ;
       BR      20$                     ;
10$:    SUBB    #2,POS(A5)              ;
20$:    JMP     GETCOL                  ;

;move right one cursor position

ADVANCE:
       ADDB    #2,POS(A5)              ;
       CMPB    POS(A5),#32.            ;
       BLOS    10$                     ;
       CLRB    POS(A5)                 ;
10$:    JMP     GETCOL                  ;

;move to far left cursor position

FAR.LEFT:
       CLRB    POS(A5)                 ;
       JMP     GETCOL                  ;

;move to far right cursor position

FAR.RIGHT:
       MOVB    #32.,POS(A5)            ;
       JMP     GETCOL                  ;

;move "word" back

PREV.WORD:
       TSTB    POS(A5)                 ;
       BNE     10$                     ;
       MOVB    #32.,POS(A5)            ;
       JMP     GETCOL                  ;
10$:    LEA     A6,COLTBL               ;
       CLR     D6                      ;
       MOVB    POS(A5),D6              ;
       ASR     D6                      ;
       ADD     D6,A6                   ;
       MOVB    @A6,D6                  ;
20$:    DECB    D6                      ;
       SUBB    #2,POS(A5)              ;
       JEQ     FAR.LEFT                ;
       MOVB    -(A6),D7                ;
       CMPB    D6,D7                   ;
       BEQ     20$                     ;
       MOVB    D7,D6                   ;
30$:    DECB    D6                      ;
       MOVB    -(A6),D7                ;
       CMPB    D6,D7                   ;
       JNE     GETCOL                  ;
       SUBB    #2,POS(A5)              ;
       BR      30$                     ;

;move "word" forward

NEXT.WORD:
       LEA     A6,COLTBL               ;
       CLR     D6                      ;
       MOVB    POS(A5),D6              ;
       ASR     D6                      ;
       ADD     D6,A6                   ;
       MOVB    (A6)+,D6                ;
10$:    INCB    D6                      ;
       ADDB    #2,POS(A5)              ;
       MOVB    (A6)+,D7                ;
       BEQ     FAR.LEFT                ;
       CMPB    D6,D7                   ;
       BEQ     10$                     ;
       JMP     GETCOL                  ;

;**********
;*  HOME  *
;**********
;Home - display first page of ISO Latin I character set chart

HOME:   CALL    PUTVAL                  ;
       MOVB    #1,ROW(A5)              ;
       CALL    GETVAL                  ;
       CLRB    BYTE(A5)                ;
       CALL    PUTVAL                  ;
       BR      CHART                   ;

;************
;*  ENDCHT  *
;************
;End of chart - display last page of ISO Latin I character set chart

ENDCHT: CALL    PUTVAL                  ;
       MOVB    #1,ROW(A5)              ;
       CALL    GETVAL                  ;
       MOVB    #255.-15.,BYTE(A5)      ;
       CALL    PUTVAL                  ;
       BR      CHART                   ;

;*****************
;*  PREV.SCREEN  *
;*****************
;Show previous screen of ISO Latin I character set chart

PREV.SCREEN:
       CALL    PUTVAL                  ;
       MOVB    #1,ROW(A5)              ;
       CALL    GETVAL                  ;
       SUBB    #16.,BYTE(A5)           ;
       CALL    PUTVAL                  ;
       BR      CHART                   ;

;*****************
;*  NEXT.SCREEN  *
;*****************
;Show next screen of ISO Latin I character set chart

NEXT.SCREEN:
       CALL    PUTVAL                  ;
       MOVB    #1,ROW(A5)              ;
       CALL    GETVAL                  ;
       ADDB    #16.,BYTE(A5)           ;
       CALL    PUTVAL                  ;
                                       ; fall through
;***********
;*  CHART  *
;***********
;Display section of ISO Latin I character set chart centered around
;current position and value

CHART:  LEA     A0,BYTTBL(A5)           ;
       CLR     D6                      ;
       MOVB    ROW(A5),D6              ;
       DEC     D6                      ;
       ADD     D6,A0                   ;
       MOVB    ROW(A5),D0              ;

10$:    DECB    D0                      ;
       BEQ     12$                     ;
       MOVB    @A0,D7                  ;
       DECB    D7                      ;
       MOVB    D7,-(A0)                ;
       BR      10$                     ;

12$:    LEA     A0,BYTTBL(A5)           ;
       CLR     D6                      ;
       MOVB    ROW(A5),D6              ;
       DEC     D6                      ;
       ADD     D6,A0                   ;
       MOVB    ROW(A5),D0              ;

20$:    INCB    D0                      ;
       CMPB    D0,#16.                 ;
       BHI     22$                     ;
       MOVB    @A0,D7                  ;
       INCB    D7                      ;
       MOVB    D7,1(A0)                ;
       INC     A0                      ;
       BR      20$                     ;

22$:    CALL    SHOW.LINES              ;
       JMP     POSITION                ;

;**********
;*  HELP  *
;**********
;Display help screen

HELP:   CRT     23                      ;

       CURSOR  #3,#21.                 ;
       CRT     46                      ;
       CURSOR  #3,#27.                 ;
       CRT     46                      ;
       CURSOR  #3,#33.                 ;
       CRT     46                      ;
       CURSOR  #3,#39.                 ;
       CRT     46                      ;
       CURSOR  #3,#44.                 ;
       CRT     46                      ;

       CURSOR  #5,#10.                 ;
       CRT     47                      ;
       CURSOR  #5,#70.                 ;
       CRT     47                      ;

       CURSOR  #22.,#21.               ;
       CRT     46                      ;
       CURSOR  #22.,#27.               ;
       CRT     46                      ;
       CURSOR  #22.,#33.               ;
       CRT     46                      ;
       CURSOR  #22.,#39.               ;
       CRT     46                      ;
       CURSOR  #22.,#44.               ;
       CRT     46                      ;

       CRT     24                      ;

       CURSOR  #4,#11.                 ;
       TYPE    < The BYTE utility is a living conversion table.  To obtain >
       CURSOR  #5,#11.                 ;
       TYPE    < a conversion, simply move the cursor to the appropriate   >
       CURSOR  #6,#11.                 ;
       TYPE    < column using the left or right arrow keys, and then enter >
       CURSOR  #7,#11.                 ;
       TYPE    < a value.  As you type, all of the other columns update    >
       CURSOR  #8.,#11.                ;
       TYPE    < dynamically.  Press RETURN, down arrow, or up arrow to    >
       CURSOR  #9.,#11.                ;
       TYPE    < move up or down a line at a time.                         >
       CURSOR  #10.,#11.               ;
       TYPE    <                                                           >
       CURSOR  #11.,#11.               ;
       TYPE    < BYTE supports the ISO Latin I character set, a superset   >
       CURSOR  #12.,#11.               ;
       TYPE    < of ASCII.  Source: UltraSoft Corporation (516) 348-4848.  >
       CURSOR  #13.,#11.               ;
       TYPE    <                                                           >
       CURSOR  #14.,#11.               ;
       TYPE    < To enter a character that BYTE normally responds to (ESC, >
       CURSOR  #15.,#11.               ;
       TYPE    < for example), press Control-G and then the character.     >
       CURSOR  #16.,#11.               ;
       TYPE    <                                                           >
       CURSOR  #17.,#11.               ;
       TYPE    <                     ADDITIONAL COMMANDS                   >
       CURSOR  #18.,#11.               ;
       TYPE    < ESC - exit to AMOS                       ? - help         >
       CURSOR  #19.,#11.               ;
       TYPE    < ^S - fill out table   ^A - field left   ^W - field right  >
       CURSOR  #20.,#11.               ;
       TYPE    < ^^ - top of chart     ^U - far left     ^N - far right    >
       CURSOR  #21.,#11.               ;
       TYPE    < ^E - end of chart     ^R - page back    ^T - page forward >
       TIN                             ;
       CALL    SCREEN                  ;
       CALL    SHOW.LINES              ;
       JMP     POSITION                ;

;************
;*  UPDATE  *
;************
;Function:      Update values on current line
;
;Inputs:        BYTE(A5) - current value

UPDATE: SAVE    A0,D0,D5                ;
       MOV     #5,D5                   ;
       ADDB    ROW(A5),D5              ;

;binary

UP.BIN: CURSOR  D5,#12.                 ;
       CLR     D0                      ;
       MOVB    BYTE(A5),D0             ;
       MOV     #8.,D2                  ;
10$:    ASLB    D0                      ;
       BCC     20$                     ;
       TYPE    1                       ;
       BR      30$                     ;
20$:    TYPE    0                       ;
30$:    SOB     D2,10$                  ;

;octal

UP.OCT: CURSOR  D5,#23.                 ;
       JOBIDX                          ;
       ANDW    #^C<J.HEX>,JOBTYP(A6)   ;
       CLR     D1                      ;
       MOVB    BYTE(A5),D1             ;
       OCVT    3,OT$TRM                ;

;decimal

UP.DEC: CURSOR  D5,#29.                 ;
       CLR     D1                      ;
       MOVB    BYTE(A5),D1             ;
       DCVT    3,OT$TRM                ;

;hexadecimal

UP.HEX: CURSOR  D5,#36.                 ;
       JOBIDX                          ;
       ORW     #J.HEX,JOBTYP(A6)       ;
       CLR     D1                      ;
       MOVB    BYTE(A5),D1             ;
       OCVT    2,OT$TRM                ;

;output character image

UP.CHR: CURSOR  D5,#41.                 ;
       MOVB    BYTE(A5),D1             ;
       CMPB    D1,#40                  ;
       BLO     UP.CHC                  ;
       CMPB    D1,#'~                  ;
       BLOS    UP.CHP                  ;
       CMPB    D1,#240                 ;
       BLO     UP.CHN                  ;

UP.CHP: TYPESP                          ;
       TTY                             ;
       BR      UP.DSC                  ;

UP.CHC: TYPE    ^                       ;
       ADDB    #'@,D1                  ;
       TTY                             ;
       BR      UP.DSC                  ;

UP.CHN: TYPE    <  >                    ;

;output character description

UP.DSC: CURSOR  D5,#46.                 ;
       LEA     A0,DSCTBL               ;
       CLR     D0                      ;
       MOVB    BYTE(A5),D0             ;
       BEQ     20$                     ;
10$:    TSTB    (A0)+                   ;
       BNE     10$                     ;
       SOB     D0,10$                  ;
20$:    MOV     #23.,D2                 ;
30$:    MOVB    (A0)+,D1                ;
       BEQ     40$                     ;
       TTY                             ;
       DEC     D2                      ;
       BR      30$                     ;
40$:    TST     D2                      ;
       BLE     60$                     ;
50$:    TYPE    < >                     ;
       SOB     D2,50$                  ;
60$:

;return

UP.RTN: REST    A0,D0,D5                ;
       RTN                             ;

;**********
;*  QUIT  *
;**********
;Exit program

QUIT:   CURSOR  #23.,#1                 ;
       CRT     9                       ;
       CURSOR  #24.,#1                 ;
       CRT     9                       ;
       CRT     12                      ;
       CRT     28                      ;
       EXIT                            ;

;***********
;*  CLEAR  *
;***********
;Function:      Clear current data line

CLEAR:  SAVE    D0                      ;
       MOV     #5,D0                   ;
       ADDB    ROW(A5),D0              ;
       CURSOR  D0,#12.                 ;
       TYPE    00000000                ;
       CLRB    BYTE(A5)                ;
       CURSOR  D0,#23.                 ;
       TYPE    000                     ;
       CURSOR  D0,#29.                 ;
       TYPE    000                     ;
       CURSOR  D0,#35.                 ;
       TYPE    $00                     ;
       CURSOR  D0,#41.                 ;
       TYPE    <^@>                    ;
       CURSOR  D0,#46.                 ;
       TYPE    <Null                   >
       REST    D0                      ;
       RTN                             ;

;************
;*  SCREEN  *
;************
;Function:      Put up display screen

SCREEN: CRT     29                      ; turn off cursor
       CRT     0                       ; clear screen
       CRT     12                      ; high intensity

       CURSOR  #1,#55.                 ; reverse video banner
       CRT     33                      ;
       CURSOR  #1,#27.                 ;
       CRT     32                      ;
       TYPE    < Byte Conversion Utility >
       CRT     33                      ;

       CRT     11                      ; low intensity
       CURSOR  #1,#1                   ; output
user name
       JOBIDX                          ;
       TTYL    JOBUSN(A6)              ;

       CURSOR  #1,#63.                 ; output date and time
       CLR     D3                      ;
       CLR     D4                      ;
       CLR     D5                      ;
       MOV     #0,A2                   ;
       CALL    $ODTIM                  ;
       CRT     12                      ; high intensity

       CRT     23                      ; enable alternate character set

;top of grid

       CURSOR  #3,#10.                 ;
       CRT     38                      ; top left corner
       REPEAT  10.,<CRT 46>            ; line over "Binary"
       CRT     42                      ; top intersect
       REPEAT  5,<CRT 46>              ; line over "Oct"
       CRT     42                      ; top intersect
       REPEAT  5,<CRT 46>              ; line over "Dec"
       CRT     42                      ; top intersect
       REPEAT  5,<CRT 46>              ; line over "Hex"
       CRT     42                      ; top intersect
       REPEAT  4,<CRT 46>              ; line over "Ch"
       CRT     42                      ; top intersect
       REPEAT  25.,<CRT 46>            ; line over "Description"
       CRT     39                      ; top right corner

;label line of grid

       CURSOR  #4,#10.                 ;
       CRT     47                      ; vertical line
       CRT     24                      ;
       TYPE    <  Binary  >            ;
       CRT     23                      ;
       CRT     47                      ;
       CRT     24                      ;
       TYPE    < Oct >                 ;
       CRT     23                      ;
       CRT     47                      ;
       CRT     24                      ;
       TYPE    < Dec >                 ;
       CRT     23                      ;
       CRT     47                      ;
       CRT     24                      ;
       TYPE    < Hex >                 ;
       CRT     23                      ;
       CRT     47                      ;
       CRT     24                      ;
       TYPE    < Ch >                  ;
       CRT     23                      ;
       CRT     47                      ;
       CRT     24                      ;
       TYPE    < Description             >
       CRT     23                      ;
       CRT     47                      ;

;lines under labels

       CURSOR  #5,#10.                 ;
       CRT     44                      ; left intersect
       REPEAT  10.,<CRT 46>            ; line over "Binary"
       CRT     48                      ; center intersect
       REPEAT  5,<CRT 46>              ; line over "Oct"
       CRT     48                      ; center intersect
       REPEAT  5,<CRT 46>              ; line over "Dec"
       CRT     48                      ; center intersect
       REPEAT  5,<CRT 46>              ; line over "Hex"
       CRT     48                      ; center intersect
       REPEAT  4,<CRT 46>              ; line over "Ch"
       CRT     48                      ; center intersect
       REPEAT  25.,<CRT 46>            ; line over "Description"
       CRT     43                      ; right intersect

;data lines

       MOV     #6,D0                   ;
       MOV     #16.,D2                 ;
10$:    CURSOR  D0,#10.                 ;
       CRT     47                      ; vertical line
       CURSOR  D0,#21.                 ;
       CRT     47                      ;
       CURSOR  D0,#27.                 ;
       CRT     47                      ;
       CURSOR  D0,#33.                 ;
       CRT     47                      ;
       CURSOR  D0,#39.                 ;
       CRT     47                      ;
       CURSOR  D0,#44.                 ;
       CRT     47                      ;
       CURSOR  D0,#70.                 ;
       CRT     47                      ;
       INCW    D0                      ;
       SOB     D2,10$                  ;

;bottom of grid

       CURSOR  #22.,#10.               ;
       CRT     40                      ; bottom left corner
       REPEAT  10.,<CRT 46>            ; line under "Binary"
       CRT     45                      ; bottom intersect
       REPEAT  5,<CRT 46>              ; line under "Oct"
       CRT     45                      ; bottom intersect
       REPEAT  5,<CRT 46>              ; line under "Dec"
       CRT     45                      ; bottom intersect
       REPEAT  5,<CRT 46>              ; line under "Hex"
       CRT     45                      ; bottom intersect
       REPEAT  4,<CRT 46>              ; line under "Ch"
       CRT     45                      ; bottom intersect
       REPEAT  25.,<CRT 46>            ; line under "Description"
       CRT     41                      ; bottom right corner

       CRT     24                      ; turn off alternate character set

       CURSOR  #23.,#30.               ;
       TYPE    [ Press ? for help ]    ;
       CURSOR  #24.,#21.               ;
       TYPE    [ Press ESCAPE to leave this screen ]

       RTN                             ;

;****************
;*  SHOW.LINES  *
;****************
;Function:      Show value of all data lines

SHOW.LINES:
       PUSHB   ROW(A5)                 ;
       PUSHB   BYTE(A5)                ;

       LEA     A0,BYTTBL(A5)           ;
       MOVB    #1,ROW(A5)              ;
30$:    MOVB    (A0)+,BYTE(A5)          ;
       CALL    UPDATE                  ;
       INCB    ROW(A5)                 ;
       CMPB    ROW(A5),#16.            ;
       BLE     30$                     ;

       POPB    BYTE(A5)                ;
       POPB    ROW(A5)                 ;
       RTN                             ;

;************
;*  GETVAL  *
;************
;Function:      Get current data line value from table
;
;Inputs:        BYTTBL(A5) - byte table
;               ROW(A5)    - row (1-16)
;
;Outputs:       BYTE(A5)   - value for current row

GETVAL: CLR     D6                      ;
       MOVB    ROW(A5),D6              ;
       DEC     D6                      ;
       LEA     A6,BYTTBL(A5)           ;
       ADD     D6,A6                   ;
       MOVB    @A6,BYTE(A5)            ;
       RTN                             ;

;************
;*  PUTCAL  *
;************
;Function:      Put current byte into data line value table
;
;Inputs:        BYTE(A5)   - byte
;               ROW(A5)    - row (1-16)
;
;Outputs:       BYTTBL(A5) - updated

PUTVAL: CLR     D6                      ;
       MOVB    ROW(A5),D6              ;
       DEC     D6                      ;
       LEA     A6,BYTTBL(A5)           ;
       ADD     D6,A6                   ;
       MOVB    BYTE(A5),@A6            ;
       RTN                             ;

;************
;*  COLTBL  *
;************
;table of column positions

       BYTE    0                       ; ** start of table marker **

COLTBL: BYTE    12.                     ; 000 binary 8
       BYTE    13.                     ; 002 binary 7
       BYTE    14.                     ; 004 binary 6
       BYTE    15.                     ; 006 binary 5
       BYTE    16.                     ; 008 binary 4
       BYTE    17.                     ; 010 binary 3
       BYTE    18.                     ; 012 binary 2
       BYTE    19.                     ; 014 binary 1

       BYTE    23.                     ; 016 octal 3
       BYTE    24.                     ; 018 octal 2
       BYTE    25.                     ; 020 octal 1

       BYTE    29.                     ; 022 decimal 3
       BYTE    30.                     ; 024 decimal 2
       BYTE    31.                     ; 026 decimal 1

       BYTE    36.                     ; 028 hex 2
       BYTE    37.                     ; 030 hex 1

       BYTE    42.                     ; 032 char 1

       BYTE    0                       ; ** end of table **

;************
;*  DSCTBL  *
;************
;table of character descriptions

DSCTBL: ASCIZ   "Null"                  ; 000
       ASCIZ   "Start of Heading"      ; 001
       ASCIZ   "Start of Text"         ; 002
       ASCIZ   "End of Text"           ; 003
       ASCIZ   "End of Transmission"   ; 004
       ASCIZ   "Enquiry"               ; 005
       ASCIZ   "Acknowledge"           ; 006
       ASCIZ   "Bell"                  ; 007
       ASCIZ   "Backspace"             ; 008
       ASCIZ   "Horizontal Tab"        ; 009
       ASCIZ   "Line Feed"             ; 010
       ASCIZ   "Vertical Tab"          ; 011
       ASCIZ   "Form Feed"             ; 012
       ASCIZ   "Carriage Return"       ; 013
       ASCIZ   "Shift Out"             ; 014
       ASCIZ   "Shift In"              ; 015
       ASCIZ   "Data Link Escape"      ; 016
       ASCIZ   "Device Control 1"      ; 017
       ASCIZ   "Device Control 2"      ; 018
       ASCIZ   "Device Control 3"      ; 019
       ASCIZ   "Device Control 4"      ; 020
       ASCIZ   "Negative Acknowledge"  ; 021
       ASCIZ   "Synchronous Idle"      ; 022
       ASCIZ   "End Transmission Blocks" ; 023
       ASCIZ   "Cancel"                ; 024
       ASCIZ   "End of Medium"         ; 025
       ASCIZ   "Special Sequence"      ; 026
       ASCIZ   "Escape"                ; 027
       ASCIZ   "File Separator"        ; 028
       ASCIZ   "Group Separator"       ; 029
       ASCIZ   "Record Sepatator"      ; 030
       ASCIZ   "Unit Separator"        ; 031
       ASCIZ   "Space"                 ; 032
       ASCIZ   "Exclamation Mark"      ; 033
       ASCIZ   "Quotation Mark"        ; 034
       ASCIZ   "Number Sign"           ; 035
       ASCIZ   "Dollar Sign"           ; 036
       ASCIZ   "Percent Sign"          ; 037
       ASCIZ   "Ampersand"             ; 038
       ASCIZ   "Apostrophe"            ; 039
       ASCIZ   "Opening Parenthesis"   ; 040
       ASCIZ   "Closing Parenthesis"   ; 041
       ASCIZ   "Asterisk"              ; 042
       ASCIZ   "Plus"                  ; 043
       ASCIZ   "Comma"                 ; 044
       ASCIZ   "Dash or Minus"         ; 045
       ASCIZ   "Period"                ; 046
       ASCIZ   "Slash"                 ; 047
       ASCIZ   "Zero"                  ; 048
       ASCIZ   "One"                   ; 049
       ASCIZ   "Two"                   ; 050
       ASCIZ   "Three"                 ; 051
       ASCIZ   "Four"                  ; 052
       ASCIZ   "Five"                  ; 053
       ASCIZ   "Six"                   ; 054
       ASCIZ   "Seven"                 ; 055
       ASCIZ   "Eight"                 ; 056
       ASCIZ   "Nine"                  ; 057
       ASCIZ   "Colon"                 ; 058
       ASCIZ   "Semicolon"             ; 059
       ASCIZ   "Left Angle Bracket"    ; 060
       ASCIZ   "Equal Sign"            ; 061
       ASCIZ   "Right Angle Bracket"   ; 062
       ASCIZ   "Question Mark"         ; 063
       ASCIZ   "Commerical At"         ; 064
       ASCIZ   "Upper case A"          ; 065
       ASCIZ   "Upper case B"          ; 066
       ASCIZ   "Upper case C"          ; 067
       ASCIZ   "Upper case D"          ; 068
       ASCIZ   "Upper case E"          ; 069
       ASCIZ   "Upper case F"          ; 070
       ASCIZ   "Upper case G"          ; 071
       ASCIZ   "Upper case H"          ; 072
       ASCIZ   "Upper case I"          ; 073
       ASCIZ   "Upper case J"          ; 074
       ASCIZ   "Upper case K"          ; 075
       ASCIZ   "Upper case L"          ; 076
       ASCIZ   "Upper case M"          ; 077
       ASCIZ   "Upper case N"          ; 078
       ASCIZ   "Upper case O"          ; 079
       ASCIZ   "Upper case P"          ; 080
       ASCIZ   "Upper case Q"          ; 081
       ASCIZ   "Upper case R"          ; 082
       ASCIZ   "Upper case S"          ; 083
       ASCIZ   "Upper case T"          ; 084
       ASCIZ   "Upper case U"          ; 085
       ASCIZ   "Upper case V"          ; 086
       ASCIZ   "Upper case W"          ; 087
       ASCIZ   "Upper case X"          ; 088
       ASCIZ   "Upper case Y"          ; 089
       ASCIZ   "Upper case Z"          ; 090
       ASCIZ   "Left Square Bracket"   ; 091
       ASCIZ   "Backslash"             ; 092
       ASCIZ   "Right Square Bracket"  ; 093
       ASCIZ   "Circumflex"            ; 094
       ASCIZ   "Underscore"            ; 095
       ASCIZ   "Grave Accent"          ; 096
       ASCIZ   "Lower case a"          ; 097
       ASCIZ   "Lower case b"          ; 098
       ASCIZ   "Lower case c"          ; 099
       ASCIZ   "Lower case d"          ; 100
       ASCIZ   "Lower case e"          ; 101
       ASCIZ   "Lower case f"          ; 102
       ASCIZ   "Lower case g"          ; 103
       ASCIZ   "Lower case h"          ; 104
       ASCIZ   "Lower case i"          ; 105
       ASCIZ   "Lower case j"          ; 106
       ASCIZ   "Lower case k"          ; 107
       ASCIZ   "Lower case l"          ; 108
       ASCIZ   "Lower case m"          ; 109
       ASCIZ   "Lower case n"          ; 110
       ASCIZ   "Lower case o"          ; 111
       ASCIZ   "Lower case p"          ; 112
       ASCIZ   "Lower case q"          ; 113
       ASCIZ   "Lower case r"          ; 114
       ASCIZ   "Lower case s"          ; 115
       ASCIZ   "Lower case t"          ; 116
       ASCIZ   "Lower case u"          ; 117
       ASCIZ   "Lower case v"          ; 118
       ASCIZ   "Lower case w"          ; 119
       ASCIZ   "Lower case x"          ; 120
       ASCIZ   "Lower case y"          ; 121
       ASCIZ   "Lower case z"          ; 122
       ASCIZ   "Right Curly Brace"     ; 123
       ASCIZ   "Vertical Bar"          ; 124
       ASCIZ   "Left Curly Brace"      ; 125
       ASCIZ   "Tilde"                 ; 126
       ASCIZ   "Del"                   ; 127
       ASCIZ   "ISO Upper Control-@"   ; 128
       ASCIZ   "ISO Upper Control-A"   ; 129
       ASCIZ   "ISO Upper Control-B"   ; 130
       ASCIZ   "ISO Upper Control-C"   ; 131
       ASCIZ   "ISO Upper Control-D"   ; 132
       ASCIZ   "ISO Upper Control-E"   ; 133
       ASCIZ   "ISO Upper Control-F"   ; 134
       ASCIZ   "ISO Upper Control-G"   ; 135
       ASCIZ   "ISO Upper Control-H"   ; 136
       ASCIZ   "ISO Upper Control-I"   ; 137
       ASCIZ   "ISO Upper Control-J"   ; 138
       ASCIZ   "ISO Upper Control-K"   ; 139
       ASCIZ   "ISO Upper Control-L"   ; 140
       ASCIZ   "ISO Upper Control-M"   ; 141
       ASCIZ   "ISO Upper Control-N"   ; 142
       ASCIZ   "ISO Upper Control-O"   ; 143
       ASCIZ   "ISO Upper Control-P"   ; 144
       ASCIZ   "ISO Upper Control-Q"   ; 145
       ASCIZ   "ISO Upper Control-R"   ; 146
       ASCIZ   "ISO Upper Control-S"   ; 147
       ASCIZ   "ISO Upper Control-T"   ; 148
       ASCIZ   "ISO Upper Control-U"   ; 149
       ASCIZ   "ISO Upper Control-V"   ; 150
       ASCIZ   "ISO Upper Control-W"   ; 151
       ASCIZ   "ISO Upper Control-X"   ; 152
       ASCIZ   "ISO Upper Control-Y"   ; 153
       ASCIZ   "ISO Upper Control-Z"   ; 154
       ASCIZ   "ISO Upper Control-["   ; 155
       ASCIZ   "ISO Upper Control-\"   ; 156
       ASCIZ   "ISO Upper Control-]"   ; 157
       ASCIZ   "ISO Upper Control-^"   ; 158
       ASCIZ   "ISO Upper Control-_"   ; 159
       ASCIZ   "Required Space"        ; 160
       ASCIZ   "Inverse Exclamation Mrk" ; 161
       ASCIZ   "Cents"                 ; 162
       ASCIZ   "Sterling"              ; 163
       ASCIZ   "Currency"              ; 164
       ASCIZ   "Yen"                   ; 165
       ASCIZ   "Split Bar"             ; 166
       ASCIZ   "Section"               ; 167
       ASCIZ   "Dieresis"              ; 168
       ASCIZ   "Copyright"             ; 169
       ASCIZ   "Ord Feminine"          ; 170
       ASCIZ   "Opening Guillemets"    ; 171
       ASCIZ   "Not"                   ; 172
       ASCIZ   "Discretionary Hyphen"  ; 173
       ASCIZ   "Registered"            ; 174
       ASCIZ   "Hyphen"                ; 175
       ASCIZ   "Ring"                  ; 176
       ASCIZ   "Plus or Minus"         ; 177
       ASCIZ   "2 superscript"         ; 178
       ASCIZ   "3 superscript"         ; 179
       ASCIZ   "Acute Accent"          ; 180
       ASCIZ   "Micro"                 ; 181
       ASCIZ   "Paragraph"             ; 182
       ASCIZ   "Bullet"                ; 183
       ASCIZ   "Cedilla"               ; 184
       ASCIZ   "1 superscript"         ; 185
       ASCIZ   "Ord Masculine"         ; 186
       ASCIZ   "Closing Guillemets"    ; 187
       ASCIZ   "One-quarter"           ; 188
       ASCIZ   "One-half"              ; 189
       ASCIZ   "Three-quarters"        ; 190
       ASCIZ   "Inverse question mark" ; 191
       ASCIZ   "Upper case A grave"    ; 192
       ASCIZ   "Upper case A acute"    ; 193
       ASCIZ   "Upper case A circumflex" ; 194
       ASCIZ   "Upper case A tilde"    ; 195
       ASCIZ   "Upper case A umlaut"   ; 196
       ASCIZ   "Upper case A ring"     ; 197
       ASCIZ   "Upper case AE ligature" ; 198
       ASCIZ   "Upper case C cedilla" ; 199
       ASCIZ   "Upper case E grave"    ; 200
       ASCIZ   "Upper case E acute"    ; 201
       ASCIZ   "Upper case E circumflex" ; 202
       ASCIZ   "Upper case E dieresis" ; 203
       ASCIZ   "Upper case I grave"    ; 204
       ASCIZ   "Upper case I acute"    ; 205
       ASCIZ   "Upper case I circumflex" ; 206
       ASCIZ   "Upper case I dieresis" ; 207
       ASCIZ   "Upper case Eth"        ; 208
       ASCIZ   "Upper case N tilde"    ; 209
       ASCIZ   "Upper case O grave"    ; 210
       ASCIZ   "Upper case O acute"    ; 211
       ASCIZ   "Upper case O circumflex" ; 212
       ASCIZ   "Upper case O tilde"    ; 213
       ASCIZ   "Upper case O umlaut"   ; 214
       ASCIZ   "Times"                 ; 215
       ASCIZ   "Upper case O slash"    ; 216
       ASCIZ   "Upper case U grave"    ; 217
       ASCIZ   "Upper case U acute"    ; 218
       ASCIZ   "Upper case U circumflex" ; 219
       ASCIZ   "Upper case U umlaut"   ; 220
       ASCIZ   "Upper case Y acute"    ; 221
       ASCIZ   "Upper case Thorn"      ; 222
       ASCIZ   "Ess tset"              ; 223
       ASCIZ   "Lower case A grave"    ; 224
       ASCIZ   "Lower case A acute"    ; 225
       ASCIZ   "Lower case A circumflex" ; 226
       ASCIZ   "Lower case A tilde"    ; 227
       ASCIZ   "Lower case A umlaut"   ; 228
       ASCIZ   "Lower case A ring"     ; 229
       ASCIZ   "Lower case AE ligature" ; 230
       ASCIZ   "Lower case C cedilla"  ; 231
       ASCIZ   "Lower case E grave"    ; 232
       ASCIZ   "Lower case E acute"    ; 233
       ASCIZ   "Lower case E circumflex" ; 234
       ASCIZ   "Lower case E dieresis" ; 235
       ASCIZ   "Lower case I grave"    ; 236
       ASCIZ   "Lower case I acute"    ; 237
       ASCIZ   "Lower case I circumflex" ; 238
       ASCIZ   "Lower case I umlaut"   ; 239
       ASCIZ   "Lower case Eth"        ; 240
       ASCIZ   "Lower case N tilde"    ; 241
       ASCIZ   "Lower case O grave"    ; 242
       ASCIZ   "Lower case O acute"    ; 243
       ASCIZ   "Lower case O circumflex" ; 244
       ASCIZ   "Lower case O tilde"    ; 245
       ASCIZ   "Lower case O umlaut"   ; 246
       ASCIZ   "Division"              ; 247
       ASCIZ   "Lower case O slash"    ; 248
       ASCIZ   "Lower case U grave"    ; 249
       ASCIZ   "Lower case U acute"    ; 250
       ASCIZ   "Lower case U circumflex" ; 251
       ASCIZ   "Lower case U umlaut"   ; 252
       ASCIZ   "Lower case Y acute"    ; 253
       ASCIZ   "Lower case Thorn"      ; 254
       ASCIZ   "Lower case Y umlaut"   ; 255
       BYTE    0                       ; ** end of table **

       EVEN                            ;

       END