Category : Communication (modem) tools and utilities
Archive   : CA29-3.ZIP
Filename : XLATE.CMD

 
Output of file : XLATE.CMD contained in archive : CA29-3.ZIP
; ----- COM-AND Edit transation tables
;
; This script opens a window and allows the editing of translation
; tables. COM-AND supports two transations: incoming and outgoing.
; The first 128 bytes of the incoming table are displayed on entry.
;
; The incoming table is 256 entries. The outgoing table is the same
; size. The 'n'th position represents the translation value for the
; character with value 'n'.
;
; Translation may be enabled here in this script - and in COM-AND's
; Alt-V emulations.
;
; R.McG, commenced 1/89
; ----- Usages -----------------
; S19 -----> COM-AND.XLT file name to be used
; S10-S17 -> The file loaded into memory
; N99 -----> Display page (0,1,2,3)
; FLAG(9) -> Hex/decimal switch
; FLAG(8) -> Modification to file
; ------------------------------
; Initialization
;
;* TRACE ON
ON ESCAPE GOSUB Exit ; SAVE is performed in Window
LEGEND " Edit translations"
SET TTHRU OFF ; Disallow typeahead
N99 = 0 ; Base of current window
SET FLAG(9) OFF ; Hex/decimal flag (true = hex)
SET FLAG(8) OFF ; Modification flag
;
; Initialize, and paint an initial window
;
GOSUB Set_Fname ; S19 -> target file
UPPER S19 ; .. make nice
GOSUB Load ; Load values
GOSUB Window ; Open the window
;
; Main-loop - look for keyentry
;
Main_Loop:
ATSAY 22,11 (default) " "
LOCATE 22,11
KEYGET S0 ; Get a keystroke
;
; Act upon the keystroke
;
SWITCH S0
CASE "4900" ; Pgup
GOTO PgUp
ENDCASE
CASE "5100" ; PgDn
GOTO PgDn
ENDCASE
CASE "4700" ; Home
GOTO Home
ENDCASE
CASE "4F00" ; End
GOTO End
ENDCASE
CASE "H" ; H)ex
SET FLAG(9) ON
GOSUB DISPPAGE
GOTO Main_Loop
ENDCASE
CASE "D" ; D)ecimal
SET FLAG(9) OFF
GOSUB DISPPAGE
GOTO Main_Loop
ENDCASE
CASE "S" ; S)ave
GOSUB Store
GOTO Main_Loop
ENDCASE
CASE "N" ; S)ave
IF FLAG(8)
GOSUB Store ; Save on disk
SET FLAG(8) OFF
ENDIF
SET TRAN ON
GOTO Main_Loop
ENDCASE
CASE "F" ; S)ave
SET TRAN OFF
GOTO Main_Loop
ENDCASE
ENDSWITCH
;
; Begin numeric entry
;
IF NOT NULL S0(1:3) ; Disallow other special keys
SOUND 100,100
GOTO Main_Loop
ENDIF
GOSUB Enter ; Enter #
GOTO Main_Loop ; And continue
;
; ----- Page up (cycle backwards through possible values)
;
PgUp:
DEC N99
IF LT N99 0
N99 = 3
ENDIF
GOSUB DispPage
GOTO Main_Loop
;
; ----- Page down (cycle forwards through possible values)
;
PgDn:
INC N99
IF GT N99 3
N99 = 0
ENDIF
GOSUB DispPage
GOTO Main_Loop
;
; ----- Home (move to first line)
;
Home:
N99 = 0
GOSUB DispPage
GOTO Main_Loop
;
; ----- End (Move to last line)
;
End:
N99 = 3
GOSUB DispPage
GOTO Main_Loop
;
; ----- Subroutine Exit - terminate the process
;
Exit:
IF FLAG(8) ; If table modified
GOSUB Ask_Save ; Ask if to save
ENDIF
DO ; CLose any open windows
WCLOSE
UNTIL FAILURE
EXIT
;
; ----- Subroutine: Enter a value
; .. on entry S0 -> The first keystroke
; .. S9 within this subroutine the field being constructed
; .. N6 within this subroutine is an index to field being constructed
;
Enter:
N6 = 0 ; Index to field being built
S9 = "" ; Clear field
UPPER S0 ; Make upper case
CTOI S0 N0 ; Easier comparison
IF NOT ((GE N0 48 and LE N0 57) or EQ N0 88) ; Allow 0-9 and 'x'
SOUND 100,100
RETURN
ENDIF
CURSOR N0,N1
INC N1
LOCATE N0,N1
GOTO Keyin
;
; Accept another keypress
;
Keypress:
KEYGET S0 ; Get more from keybd
;
; Catch backspace (and equivalent cursor left) here
;
Keyin:
IF STRCMP S0 "08" or STRCMP S0 "4B00"; Backspace or cursor left
IF GT N6 0
CURSOR N0,N1
ATSAY N0,N1 (default) "^H"
DEC N6
ENDIF
IF EQ N6 0
RETURN ; Nop at this pt
ENDIF
GOTO Keypress
ENDIF
;
; Catch carriage return (and equivalent space/tab) here
;
IF STRCMP S0 "0D" or STRCMP S0 " " or STRCMP S0 "09" ; cr, space, tab
IF EQ N6 0 ; Look for nothing done
RETURN ; Empty field
ENDIF
GOTO End_Entry ; Done - try to convert it
ENDIF
;
; Other control keys abort entry
;
IF NOT NULL S0(1:3) ; If a special key
GOTO Abort_Entry ; Exit on special key
ENDIF
;
; Filter only 0-9, a-f, and 'x' here
;
UPPER S0 ; Make upper case
CTOI S0 N0 ; Easier comparison
IF NOT ((GE N0 48 and LE N0 57) or (GE N0 65 and LE N0 70) or EQ N0 88)
SOUND 100,100
GOTO Keypress
ENDIF
;
; Add the character to the string being constructed
;
CURSOR N0,N1
ATSAY N0,N1 (default) S0
INC N1
LOCATE N0,N1
S9(N6:N6) = S0 ; Add the key
INC N6 ; Add to index
GOTO Keypress ; And continue
;
; Abort entry and return to main
;
Abort_Entry:
RETURN
;
; Error in entry
;
Entry_Error:
SOUND 400,100
RETURN
;
; End of entry - catch empty field
;
End_Entry:
IF EQ N6 0 ; EMpty field
RETURN
ENDIF
;
; Convert a leading 'x' into '0x'
;
IF STRCMP S9(0:0) "X" ; 'x' in col 0
S9 = "0"&S9 ; Add an initial 0
ENDIF
;
; Try to convert the char
;
ATOI S9 N0 ; Convert
IF ERROR or (LT N0 0 or GT N0 255)
GOTO Entry_Error ; .. indicate error
ENDIF
;
; Lookup the value obtained
;
GOSUB Get_Value ; Using N0, get its translation into N1
S0 = "Char %03d (x%02x) currently translates to %03d (x%02x)"
STRFMT S1 S0 N0,N0 N1,N1 ; Construct prompt
;
; Open a window for the entry of the translation
;
WOPEN 19,0, 22,78 (default) TenterXIT
ATSAY 20,2, (default) S1 ; D
ATSAY 21,2 (default) "New translation: "
ATSAY 22,28 (default) " Press ESC to cancel "
;
; Ask for the translation
;
Tenter:
ATGET 21,19 (default) 4 S0 ; Get new translation
;
; Catch empty response (Tenter_ESC also clears S0)
;
IF NULL S0 ; EMpty field
WCLOSE ; Drop window
RETURN
ENDIF
;
; Convert a leading 'x' into '0x'
;
IF STRCMP S0(0:0) "X" ; 'x' in col 0
S0 = "0"&S0 ; Add an initial 0
ENDIF
;
; Try to convert the char
;
ATOI S0 N1 ; Convert
IF ERROR or (LT N1 0 or GT N1 255)
SOUND 400,100
GOTO Tenter ; .. Try again
ENDIF
;
; We have a value (N0 translating into N1)
;
WCLOSE
SET FLAG(8) ON ; Mark updated
GOSUB Set_Value
;
; Redisplay the line or page modified
;
N3 = N0/128 ; N3 -> page #
IF GE N99 2 ; N99 -> incoming/outgoing
N3 = N3+2
ENDIF
IF NE N3 N99
N99 = N3 ; Set new page no
GOSUB DispPage ; Display the new page
ELSE
N98 = N0 & 15 ; Make N98 = 0-15
GOSUB DispLine ; Just redo the line (n98 = lineno)
ENDIF
RETURN
;
; ----- Escape during entry routine
;
TenterXit:
S0 = "" ; Null input field
RETURN
;
; ----- Get a translation value
; On entry N0 -> the char being translated
; On exit N1 <- the translation
;
Get_Value:
N3 = N0/64 ; Mask string # (0-3)
IF GE N99 2 ; Decide incoming/outgoing
N3 = N3+4 ; Sel within incoming/outgoing tables
ENDIF
SWITCH N3 ; Switch on string # (0-7)
CASE 0
S0 = S10
ENDCASE
CASE 1
S0 = S11
ENDCASE
CASE 2
S0 = S12
ENDCASE
CASE 3
S0 = S13
ENDCASE
CASE 4
S0 = S14
ENDCASE
CASE 5
S0 = S15
ENDCASE
CASE 6
S0 = S16
ENDCASE
CASE 7
S0 = S17
ENDCASE
ENDSWITCH
CTOI S0(N0&63) N1
RETURN
;
; ----- Store a translation value
; On entry N0 -> the char being translated
; N1 -> the translation
;
Set_Value:
N3 = N0/64 ; Mask string # (0-3)
IF GE N99 2 ; Decide incoming/outgoing
N3 = N3+4 ; Sel within incoming/outgoing tables
ENDIF
SWITCH N3 ; Switch on string # (0-7)
CASE 0
ITOC N1 S10(N0&63)
ENDCASE
CASE 1
ITOC N1 S11(N0&63)
ENDCASE
CASE 2
ITOC N1 S12(N0&63)
ENDCASE
CASE 3
ITOC N1 S13(N0&63)
ENDCASE
CASE 4
ITOC N1 S14(N0&63)
ENDCASE
CASE 5
ITOC N1 S15(N0&63)
ENDCASE
CASE 6
ITOC N1 S16(N0&63)
ENDCASE
CASE 7
ITOC N1 S17(N0&63)
ENDCASE
ENDSWITCH
RETURN
;
; ----- Construct the file name we'll use for COM-AND.XLT
;
Set_Fname:
S19 = "COM-AND.XLT" ; Default to current subdir
IF ISFILE S19 ; Look for file on default subdir
RETURN ; Exit here
ENDIF
;
; ----- Construct the file with the COM-AND= pathing (if provided)
;
ENVIRON S1 "COM-AND=" ; Look for COM-AND= environment var
IF FOUND ; If environment variable found
LENGTH S1 N0 ; Get its length
N0 = N0-1 ; Point to last char in string
IF not STRCMP S1(n0:n0) "\"
N0 = N0+1
CONCAT S1(n0) "\"
ENDIF
ENDIF
S19 = S1&"COM-AND.XLT" ; Concatenate path and name
RETURN
;
; ----- Subroutine: error
; .. Open a window, display, and and await keypress
; S0,S1 pass the message(s) to display
;
Error:
WOPEN 10,1, 13,77 (contrast) ErrEsc
ATSAY 11, 3 (contrast) S0(0:73)
ATSAY 12, 3 (contrast) S1(0:73)
ATSAY 13,26 (contrast) " Press any key to continue "
SOUND 880,100

KEYGET S0 ; Wait for any key
WCLOSE ; Restore screen under
RETURN ; And return to caller
;
; Escape during "Error" window
;
ErrEsc:
RETURN ; And return to KEYGET above
;
; ----- Load the current table
; .. first, dummy values
;
Load:
FOR N0=0,31
ITOC N0 S10(N0:N0)
ITOC (N0+64) S11(N0:N0)
ITOC (N0+128) S12(N0:N0)
ITOC (N0+192) S13(N0:N0)
ITOC N0+32 S10(N0+32)
ITOC (N0+96) S11(N0+32)
ITOC (N0+160) S12(N0+32)
ITOC (N0+224) S13(N0+32)
ENDFOR
S14 = S10
S15 = S11
S16 = S12
S17 = S13
;
; If the file doesn't exist, no error
;
IF NOT ISFILE S19
GOTO LOADXIT
ENDIF
;
; Open the file
;
FOPENI S19 BINARY ; Open as a binary file
IF FAILED ; If error openeing it...
S0 = "Error opening file for loading"
S1 = S19
GOSUB Error ; Display error message
RETURN
ENDIF
;
; Read the file into 8 string variables
; .. File is opened binary!
;
READ S10 64 N0 ; Read 64 bytes
READ S11 64 N0 ; Read 64 bytes
READ S12 64 N0 ; Read 64 bytes
READ S13 64 N0 ; Read 64 bytes
READ S14 64 N0 ; Read 64 bytes
READ S15 64 N0 ; Read 64 bytes
READ S16 64 N0 ; Read 64 bytes
READ S17 64 N0 ; Read 64 bytes
FCLOSEI ; Close the file
LoadXit:
RETURN ; And we're done
;
; ----- Subroutine: Ask if modifications are to be saved
; .. Open a window, display, and and await keypress
; S0,S1 pass the message(s) to display
;
Ask_Save:
WOPEN 10,1, 12,77 (contrast) AskEsc
ATSAY 11, 3 (contrast) "Do you wish to save changes? (y/n): "
ATSAY 12,29 (contrast) " Press ESC to exit "
SOUND 880,100
Ask_Again:
ATGET 11,40 (contrast) 1 S0
SWITCH S0
CASE "Y"
GOSUB Store ; Save current values
ENDCASE
CASE "N"
ENDCASE
DEFAULT
SOUND 100,100
GOTO Ask_Again ; None of the above
ENDCASE
ENDSWITCH

WCLOSE ; Restore screen under
RETURN ; And return to caller
;
; Escape during "Ask" window
;
AskEsc:
S0 = "N" ; Fake a 'n'
RETURN ; And return to KEYGET above
;
; ----- Store the table as composed.
; .. First, Open the file
;
Store:
FOPENO S19 BINARY ; Open the file name so constructed
IF FAILED ; If error openeing it...
S0 = "Error opening file for update"
S1 = S19
GOSUB Error ; Display error message
RETURN
ENDIF
;
; Write the file from the 8 string variables
; .. File is opened binary!
;
WRITE S10 64
WRITE S11 64
WRITE S12 64
WRITE S13 64
WRITE S14 64
WRITE S15 64
WRITE S16 64
WRITE S17 64
FCLOSEO ; Close the file
RETURN ; And we're done
;
; ----- Format the current page for display
; .. First, Display the Incoming/outgoing legend
;
DispPage:
SWITCH N99 ; Switch on current page
CASE 0
S0 = "Incoming translations"
ENDCASE
CASE 1
S0 = "Incoming translations"
ENDCASE
CASE 2
S0 = "Outgoing translations"
ENDCASE
CASE 3
S0 = "Outgoing translations"
ENDCASE
DEFAULT ; N99 buggerred
RETURN ; Leave display blank
ENDCASE
ENDSWITCH
ATSAY 1,2 (default) S0 & ", from file "*S19
;
; Now, build lines and display 'em
;
FOR N98 = 0,15 ; 16 rows of 8 columns
GOSUB DispLine
ENDFOR
RETURN ; And we're done
;
; ----- Display a single line
; N99 -> 0,1,2,3 display page
; N98 -> The line number (0-15)
;
DispLine:
SWITCH N99 ; Switch on current page
CASE 0
S0 = S10
S1 = S11
ENDCASE
CASE 1
S0 = S12
S1 = S13
ENDCASE
CASE 2
S0 = S14
S1 = S15
ENDCASE
CASE 3
S0 = S16
S1 = S17
ENDCASE
DEFAULT ; N99 buggerred
RETURN ; Leave display blank
ENDCASE
ENDSWITCH
;
; Now, build a line and display it
;
N10 = N98 ; Even page # 1st lnno
IF NOT ZERO (N99&1) ; Odd/even base page #
N10 = N98+128 ; Odd page # 1st line #
ENDIF
FOR N9=1,8
N10[N9] = N10[N9-1]+16 ; N11-N17
ENDFOR
CTOI S0(N98) N0
CTOI S0(N98+16) N1
CTOI S0(N98+32) N2
CTOI S0(N98+48) N3
CTOI S1(N98) N4
CTOI S1(N98+16) N5
CTOI S1(N98+32) N6
CTOI S1(N98+48) N7
IF FLAG(9) ; T -> Hex
S2 = "x%02x:x%02x x%02x:x%02x x%02x:x%02x x%02x:x%02x"
ELSE
S2 = "%03d:%03d %03d:%03d %03d:%03d %03d:%03d"
ENDIF
STRFMT S3 S2 N10,N0, N11,N1, N12,N2, N13,N3
ATSAY N98+2,3 (default) S3
STRFMT S3 S2 N14,N4, N15,N5, N16,N6, N17,N7
ATSAY N98+2,3+37 (default) S3
RETURN ; And we're done
;
; ----- Open a window with blank fields
;
Window:
WOPEN 0,0 23,78 (Default)
ATSAY 0,2 (default) " COM-AND Translates "

ATSAY 18,0 (default) "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´"
ATSAY 19,3 (default) "PgUp, PgDn, Home, End through table(s); H)ex, D)ecimal, S)ave, oN), oF)f;"
ATSAY 20,3 (default) "Or enter a value (decimal or hex) to modify."
ATSAY 21,0 (default) "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´"
ATSAY 22,3 (default) "Select: "
ATSAY 23,30 (default) " Press ESC to exit "

GOSUB DispPage
RETURN


  3 Responses to “Category : Communication (modem) tools and utilities
Archive   : CA29-3.ZIP
Filename : XLATE.CMD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/