'===========================================================================
' Subject: MEMORY VIEW                        Date: 02-25-96 (22:04)       
'  Author: Tyler Barnes                       Code: QB, PDS                
'  Origin: FidoNet QUIK_BAS Echo            Packet: MEMORY.ABC
'===========================================================================
DECLARE SUB TLOAD (File$, StartPos&)
DECLARE SUB TSAVE (File$, StartPos&, EndPos&)
DECLARE FUNCTION FileExist% (T$)
DECLARE FUNCTION GETINPUT$ (CHARS%)
DECLARE FUNCTION GETDEC$ (CHARS%)
DECLARE FUNCTION ProgramName$ ()
DECLARE SUB Box (topRow%, topCol%, lowRow%, lowCol%, Frg%, Bkg%)
DECLARE FUNCTION GETHEX$ (CHARS%)
DECLARE SUB FPRINT (NAT$, FL%)
CONST yes = 1, No = 0
'$INCLUDE: 'qb.bi'
SCREEN 0
DEFINT A-Z
StartLoc& = 0
StartSeg& = &H40
BorderColour% = 9
MemColour% = 7
InfoColour% = 15
Mode$ = "H"
LiveBytes% = yes
Lines% = 25
DIM Mods%(0 TO ((Lines% / 25) * 1439))
WIDTH , Lines%
Max& = 65535 - ((Lines% / 25) * 1439)
Main:
Invalid% = No
CurEdit% = 0
COLOR MemColour%, 0
DIM Regs AS RegType
LOCATE , , 0
CLS
COLOR BorderColour%, 0
LOCATE Lines% - CINT((Lines% / 25) * 6.5), 1: PRINT STRING$(80, 196)
COLOR 0, MemColour%
FOR I% = (Lines% - 2) TO Lines%
LOCATE I%, 1
FPRINT STRING$(80, " "), No
NEXT I%
LOCATE Lines% - 2, 1
FPRINT "   F1=Edit  F2=Goto Addr  F3=Config  F4=Load file into memory  F5=Memory Dump", No
LOCATE Lines% - 1, 1
FPRINT "       F6=Compare  F7=About MemoryView  F8=Mode  F9=Mem Search  ESC=Exit", No
LOCATE Lines%, 1
FPRINT "   Use Pgup, Pgdn, Home, End, and arrow keys to move inside selected segment", No
Update% = yes
DO
K$ = INKEY$
IF LEN(K$) THEN GOSUB Move
IF Update% = yes THEN
Regs.ax = &HB00
Regs.bx = BorderColour%
CALL INTERRUPT(&H10, Regs, Regs)
COLOR MemColour%, 0
COLOR InfoColour%, 0
IF LiveBytes% = yes THEN Update% = No
LOCATE Lines% - 5, 1: FPRINT "Segment: " + HEX$(StartSeg&) + "h     ", No
LOCATE Lines% - 4, 1: FPRINT "Offset: " + HEX$(StartLoc&) + "h to ", No
FPRINT HEX$(StartLoc& + ((Lines% / 25) * 1439)) + "h          ", No
LOCATE Lines% - 3, 1
PRINT "Mode: ";
IF Mode$ = "H" THEN PRINT "Hex" ELSE PRINT "Dec"
END IF
SL% = -2
IF LiveBytes% = yes OR (LiveBytes% = No AND Update% = yes) THEN
Update% = No
FOR I& = StartLoc& TO StartLoc& + INT(Lines% / 25) * 1439
SL% = SL% + 2
DEF SEG = StartSeg&
Char% = PEEK(I&)
DEF SEG = &HB800
POKE SL%, Char%
NEXT I&
END IF
LOOP
Move:
SELECT CASE K$
CASE CHR$(0) + "M", "6": StartLoc& = StartLoc& + 1
IF StartLoc& > Max& THEN StartLoc& = Max&
CASE CHR$(0) + "K", "4": StartLoc& = StartLoc& - 1
IF StartLoc& < 0 THEN StartLoc& = 0
CASE CHR$(0) + "H", "8": StartLoc& = StartLoc& - 80
IF StartLoc& < 0 THEN StartLoc& = StartLoc& + 80
CASE CHR$(0) + "P", "2": StartLoc& = StartLoc& + 80
IF StartLoc& > Max& THEN StartLoc& = StartLoc& - 80
CASE CHR$(0) + "Q", "3": StartLoc& = StartLoc& + 1440
IF StartLoc& > Max& THEN StartLoc& = StartLoc& - 1440
CASE CHR$(0) + "I", "9": StartLoc& = StartLoc& - 1440
IF StartLoc& < 0 THEN StartLoc& = StartLoc& + 1440
CASE CHR$(0) + "G", "7": StartLoc& = 0
CASE CHR$(0) + "O", "1": StartLoc& = Max&
CASE CHR$(0) + "A"
IT% = InfoColour%: BT% = BorderColour%
Box 5, 26, 12, 52, InfoColour%, BorderColour%
COLOR InfoColour%, BorderColour%
LOCATE 6, 28
SOUND 50, 1
FPRINT "  MemView Version 0.3", No
LOCATE 8, 28
FPRINT "By D. Tyler Barnes,1996", No
LOCATE 10, 28
FPRINT "       FREEWARE!", No
LOCATE 11, 28
FPRINT " Tested on a 486dx2 80", No
InfoColour% = IT%: BorderColour% = BT%
DO: Junk$ = INKEY$: LOOP UNTIL LEN(Junk$)
DEF SEG = &HB800
FOR C% = 691 TO 2027 STEP 2
POKE C%, MemColour%
NEXT C%
CASE "", "", CHR$(0) + "", "Q", "q", "X", "x"
COLOR 7, 0
Regs.ax = &HB00
Regs.bx = 0
CALL INTERRUPT(&H10, Regs, Regs)
CLS
END
CASE CHR$(0) + "<"
LOCATE Lines% - 5, 40, 1
COLOR InfoColour%, 0: FPRINT "Segment:Offset = ", No
LastKey$ = ""
Seg$ = GETHEX$(4)
IF Seg$ = "" THEN GOTO NoMatter
LOCATE Lines% - 5, 62
FPRINT ": ", No
Off$ = GETHEX$(4)
IF Off$ = "" THEN Off$ = "0000"
StartLoc& = VAL("&H" + Off$)
IF StartLoc& < 0 THEN StartLoc& = StartLoc& + 65536
IF StartLoc& > Max& THEN StartLoc& = Max&
StartSeg& = VAL("&H" + Seg$)
IF StartSeg& < 0 THEN StartSeg& = StartSeg& + 65536
NoMatter:
LOCATE Lines% - 5, 40, 0
2 FPRINT SPACE$(29), No
CASE CHR$(0) + ";": GOSUB ByteEditor: GOTO Main
CASE CHR$(0) + "?"
TryAgain:
FOR R% = (Lines% - 5) TO (Lines% - 3)
LOCATE R%, 30, 0
FPRINT SPACE$(40), No
NEXT R%
LOCATE Lines% - 5, 30, 1
FPRINT "Save memory dump as:", No
F$ = GETINPUT$(12)
IF F$ = "" THEN GOTO Finished
FE% = FileExist(F$)
IF FE% = yes THEN
FOR R% = Lines% - 5 TO Lines% - 3
LOCATE R%, 30, 0
FPRINT SPACE$(40), No
NEXT R%
BEEP
LOCATE Lines% - 5, 30: PRINT "File Exists!"
LOCATE Lines% - 4, 30: PRINT "Hit any key..."
DO: A$ = INKEY$: LOOP UNTIL LEN(A$)
GOTO TryAgain
END IF
ON ERROR GOTO InvalidFilename
OPEN F$ FOR BINARY AS 1
ON ERROR GOTO EH
CLOSE 1
IF Invalid% = yes THEN Invalid% = No: GOTO TryAgain
LOCATE Lines% - 4, 30: FPRINT "Offset ____h to ____h", No
LastKey$ = ""
LOCATE Lines% - 4, 37: FO$ = GETHEX$(4)
LOCATE Lines% - 4, 46: SO$ = GETHEX$(4)
DEF SEG = StartSeg&
LOCATE Lines% - 3, 29
TSAVE F$, VAL("&H" + FO$), VAL("&H" + SO$)
Finished:
COLOR MemColour%, 0
FOR R% = Lines% - 5 TO Lines% - 3
LOCATE R%, 30, 0
FPRINT SPACE$(40), No
NEXT R%
CASE CHR$(0) + ">"
LOCATE Lines% - 5, 30, 1
FPRINT "Load File:", No
F$ = GETINPUT$(12)
LOCATE , , 0
IF FileExist(F$) = No THEN
BEEP
LOCATE Lines% - 5, 30
FPRINT "File Not Found!", No
LOCATE Lines% - 4, 30
FPRINT "Hit Any Key...", No
DO: A$ = INKEY$: LOOP UNTIL LEN(A$)
GOTO FinishedLoad
END IF
LOCATE Lines% - 4, 30
FPRINT "Offset:____h", No
LOCATE Lines% - 4, 37, 1
LastKey$ = ""
O$ = GETHEX$(4)
DEF SEG = StartSeg&
LOCATE Lines% - 3, 30, 0
TLOAD F$, VAL("&H" + O$)
FinishedLoad:
FOR L% = Lines% - 5 TO Lines% - 3
LOCATE L%, 30, 0
FPRINT SPACE$(20), No
NEXT L%
CASE "[", "<", ",": StartSeg& = StartSeg& - 1
IF StartSeg& < 0 THEN StartSeg& = 0
CASE "]", ".", ">": StartSeg& = StartSeg& + 1
IF StartSeg& > 65535 THEN StartSeg& = 65535
END SELECT
EndSelect:
LOCATE , , 0
Update% = yes
RETURN
ByteEditor:
COLOR 0, MemColour%
FOR I% = Lines% - 2 TO Lines%
LOCATE I%, 1
FPRINT SPACE$(80), No
NEXT I%
LOCATE Lines% - 2, 1
FPRINT "F1 = Enter Hex Value   F2 = Enter Decimal Value   F3 = Quit   F4 = Save and Quit", No
LOCATE Lines% - 1, 1
LOCATE Lines%, 1
FPRINT "        Use Pgup, Pgdn, Home, End, and arrow keys to move within window", No
COLOR InfoColour%, 0
U2% = yes: Typed% = No: SaveIt% = No
LOCATE , , 1
CurCol% = CurEdit%
FOR I% = 0 TO ((Lines% / 25) * 1439)
DEF SEG = StartSeg&
Mods%(I%) = PEEK(StartLoc& + I%)
DEF SEG = &HB800
POKE I% * 2, Mods%(I%)
NEXT I%
DO
K$ = INKEY$
NewVal:
IF LEN(K$) THEN U2% = yes
SELECT CASE K$
CASE CHR$(0) + "M", "6": CurCol% = CurCol% + 2
IF CurCol% > 2879 THEN CurCol% = CurCol% - 2
CASE CHR$(0) + "K", "4": CurCol% = CurCol% - 2
IF CurCol% < 0 THEN CurCol% = CurCol% + 2
CASE CHR$(0) + "H", "8": CurCol% = CurCol% - 160
IF CurCol% < 0 THEN CurCol% = CurCol% + 160
CASE CHR$(0) + "P", "2": CurCol% = CurCol% + 160
IF CurCol% > 2879 THEN CurCol% = CurCol% - 160
CASE CHR$(0) + "G": CurCol% = 0
CASE CHR$(0) + "O": CurCol% = (Lines% / 25) * 2878
CASE CHR$(0) + "I": CurCol% = CurCol% - ((Y% - 1) * 160)
CASE CHR$(0) + "Q": CurCol% = CurCol% + ((17 * 160) - ((Y% - 1) * 160))
CASE CHR$(0) + ";"
LOCATE Lines% - 5, 20, 1
FPRINT "Hex:", No
LastKey$ = ""
H$ = GETHEX$(2)
K$ = CHR$(VAL("&H" + H$))
LOCATE Lines% - 5, 20, 0: PRINT "       ";
GOTO NewVal
CASE CHR$(0) + "<"
ReEnter:
LOCATE Lines% - 5, 20, 0
PRINT SPACE$(30);
LOCATE Lines% - 5, 20, 1
FPRINT "Dec:", No
LastKey$ = ""
H$ = GETDEC$(3)
IF VAL(H$) > 255 THEN GOTO ReEnter
K$ = CHR$(VAL(H$))
LOCATE Lines% - 5, 20, 0: PRINT "       ";
GOTO NewVal
CASE ""
CASE CHR$(0) + "=": SaveIt% = No: EXIT DO
CASE CHR$(0) + ">": SaveIt% = yes: EXIT DO
CASE ELSE
Typed% = yes
Mods%(INT(CurCol% / 2)) = ASC(K$)
CurCol% = CurCol% + 2
IF CurCol% > ((Lines% / 25) * 2878) THEN CurCol% = ((Lines% / 25) * 2878)
END SELECT
IF U2% = yes THEN
Y% = INT(CurCol% / 160) + 1
X% = (INT(CurCol% / 2) + 1) - (80 * (INT(CurCol% / 160)))
MemPos& = INT(CurCol% / 2) + StartLoc&
DEF SEG = StartSeg&
CurByte% = Mods%(INT(CurCol% / 2))
FOR C% = Lines% - 5 TO Lines% - 3
LOCATE C%, 1: PRINT SPACE$(80);
NEXT C%
LOCATE Lines% - 5, 1: PRINT "Segment: "; HEX$(StartSeg&) + "h"
LOCATE Lines% - 4, 1: PRINT "Offset: "; HEX$(MemPos&) + "h"
LOCATE Lines% - 3, 1: PRINT "Char:"; HEX$(CurByte%) + "h (" + LTRIM$(STR$(CurByte%)) + "d)"
DEF SEG = &HB800
LOCATE Y%, X%, 1: POKE CurCol%, CurByte%
IF Typed% = yes THEN POKE CurCol% - 2, Mods%(INT((CurCol% - 2) / 2)): Typed% = No
U2% = No
END IF
LOOP
IF SaveIt% = yes THEN
DEF SEG = StartSeg&
FOR I% = 0 TO (Lines% / 25) * 1439
POKE StartLoc& + I%, Mods%(I%)
NEXT I%
END IF
LOCATE , , 0
RETURN
EH:
CLS
COLOR 7, 0
PRINT "FATAL ERROR; PROGRAM HALTED."
PRINT "Error#"; ERR
END
InvalidFilename:
Invalid% = yes
RESUME NEXT

SUB Box (topRow%, topCol%, lowRow%, lowCol%, Frg%, Bkg%)
COLOR Bkg%, Bkg%
IF Bkg% >= 8 THEN Bkg% = Bkg% - 8
FOR I% = topRow% TO lowRow%
LOCATE I% + 1, topCol% + 2
PRINT STRING$(lowCol% - topCol% + 1, 176)
NEXT I%
COLOR Bkg%, Frg%
FOR I% = topRow% TO lowRow%
LOCATE I%, topCol%
PRINT STRING$(lowCol% - topCol% + 1, 219)
NEXT I%
COLOR Frg%, Bkg%
LOCATE topRow%, topCol%
PRINT "Ú" + STRING$(lowCol% - topCol% - 1, 196) + "¿"
FOR I% = (topRow% + 1) TO (lowRow% - 1)
LOCATE I%, topCol%
PRINT "³"
LOCATE I%, lowCol%
PRINT "³"
NEXT
LOCATE lowRow%, topCol%
PRINT "À" + STRING$(lowCol% - topCol% - 1, 196) + "Ù"
COLOR 7, 0
END SUB

DEFSNG A-Z
FUNCTION FileExist% (T$)
DEFINT A-Z
DIM F AS STRING * 64
DIM Inx AS RegTypeX
DIM Outx AS RegTypeX
Inx.ax = &H2F00
CALL INTERRUPTX(&H21, Inx, Outx)
DTASeg = Outx.es
DTAAddr = Outx.bx
F$ = LTRIM$(RTRIM$(UCASE$(T$))) + CHR$(0)
Inx.ds = VARSEG(F$)
Inx.dx = VARPTR(F$)
Inx.ax = &H4E00
Inx.cx = -1
CALL INTERRUPTX(&H21, Inx, Outx)
IF Outx.flags AND 1 THEN
FileExist% = 0
ELSE
FileExist% = 1
END IF
END FUNCTION

SUB FPRINT (NAT$, FL%)
YT = (80 - POS(0)) + 1
BS = INSTR(LEFT$(NAT$, YT), "")
IF BS < 1 THEN
PRINT LEFT$(NAT$, YT);
ELSE
BST$ = LEFT$(NAT$, YT): GOSUB PrintWithBackspaces
END IF
IF LEN(NAT$) - YT > 0 THEN
BS = INSTR(RIGHT$(NAT$, LEN(NAT$) - YT), "")
ELSE
BS = 0
END IF
IF BS < 1 THEN
IF LEN(NAT$) - YT > 0 THEN PRINT RIGHT$(NAT$, LEN(NAT$) - YT);
ELSE
BST$ = RIGHT$(NAT$, LEN(NAT$) - YT): GOSUB PrintWithBackspaces
END IF
IF FL = yes THEN PRINT
EXIT SUB
PrintWithBackspaces:
DO UNTIL INSTR(BST$, "") < 1
TBP = INSTR(BST$, "")
PRINT LEFT$(BST$, TBP - 1);
IF POS(0) > 1 THEN
LOCATE CSRLIN, POS(0) - 1: PRINT " "; : LOCATE CSRLIN, POS(0) - 1
END IF
BST$ = RIGHT$(BST$, LEN(BST$) - TBP)
LOOP
PRINT BST$;
RETURN
END SUB

FUNCTION GETDEC$ (CHARS)
SHARED LastKey$
LOCATE , , 1
DO
IF LEN(LastKey$) THEN
A$ = LastKey$
LastKey$ = ""
ELSE
A$ = UCASE$(INKEY$)
END IF
SELECT CASE A$
CASE ""
IF Counter > 0 THEN
Counter = Counter - 1
PRINT " ";
Total$ = LEFT$(Total$, LEN(Total$) - 1)
END IF
CASE ""
CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
IF Counter < CHARS THEN
Counter = Counter + 1
PRINT A$;
Total$ = Total$ + A$
ELSE
LastKey$ = A$
EXIT DO
END IF
END SELECT
LOOP UNTIL A$ = CHR$(13)
DO UNTIL LEN(Total$) = CHARS
Total$ = "0" + Total$
LOOP
PRINT
GETDEC$ = Total$
END FUNCTION

FUNCTION GETHEX$ (CHARS)
SHARED LastKey$
LOCATE , , 1
DO
IF LEN(LastKey$) THEN
A$ = LastKey$
LastKey$ = ""
ELSE
A$ = UCASE$(INKEY$)
END IF
SELECT CASE A$
CASE ""
IF Counter > 0 THEN
Counter = Counter - 1
PRINT " ";
Total$ = LEFT$(Total$, LEN(Total$) - 1)
END IF
CASE ""
CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
IF Counter < CHARS THEN
Counter = Counter + 1
PRINT A$;
Total$ = Total$ + A$
ELSE
LastKey$ = A$
EXIT DO
END IF
END SELECT
LOOP UNTIL A$ = CHR$(13)
IF LEN(Total$) THEN
DO UNTIL LEN(Total$) = CHARS
Total$ = "0" + Total$
LOOP
END IF
PRINT
GETHEX$ = Total$
END FUNCTION

FUNCTION GETINPUT$ (CHARS)
LOCATE , , 1
DO
A$ = UCASE$(INKEY$)
SELECT CASE A$
CASE ""
IF Counter > 0 THEN
Counter = Counter - 1
PRINT " ";
Total$ = LEFT$(Total$, LEN(Total$) - 1)
END IF
CASE "", ";", "*", "?", "/", "\", ":", ""
CASE CHR$(13): EXIT DO
CASE ELSE
IF Counter < CHARS THEN
Counter = Counter + 1
PRINT A$;
Total$ = Total$ + A$
END IF
END SELECT
LOOP UNTIL A$ = CHR$(13)
PRINT
GETINPUT$ = Total$
END FUNCTION

FUNCTION ProgramName$ STATIC
DIM Regs AS RegType
Regs.ax = &H5100
INTERRUPT &H21, Regs, Regs
DEF SEG = Regs.bx
EnvSeg% = PEEK(&H2C) + PEEK(&H2D) * 256
DEF SEG = EnvSeg%
DO
Byte% = PEEK(Offset%)
IF Byte% = 0 THEN
Count% = Count% + 1
IF Count% AND EXEFlag% THEN
EXIT DO
ELSEIF Count% = 2 THEN
EXEFlag% = -1
Offset% = Offset% + 2
END IF
ELSE
Count% = 0
IF EXEFlag% THEN
Temp$ = Temp$ + CHR$(Byte%)
END IF
END IF
Offset% = Offset% + 1
LOOP
DEF SEG
ProgramName$ = Temp$
Temp$ = ""
END FUNCTION

SUB TLOAD (File$, StartPos&)
L = CSRLIN: C = POS(0)
IF StartPos& < 0 THEN StartPos& = StartPos& + 65536
IF EndPos& < 0 THEN EndPos& = EndPos& + 65536
Z% = FREEFILE
OPEN File$ FOR BINARY AS Z%
FLength& = LOF(Z%)
DO UNTIL EOF(Z%)
Data$ = INPUT$(1, Z%)
IF LEN(Data$) THEN POKE StartPos&, ASC(Data$)
LOCATE L, C, 0
PRINT INT((LOC(Z%) / FLength&) * 100); "%";
StartPos& = StartPos& + 1
LOOP
CLOSE Z%
END SUB

SUB TSAVE (File$, StartPos&, EndPos&)
L = CSRLIN: C = POS(0)
IF StartPos& < 0 THEN StartPos& = StartPos& + 65536
IF EndPos& < 0 THEN EndPos& = EndPos& + 65536
Z% = FREEFILE
OPEN File$ FOR OUTPUT AS Z%
FOR C& = StartPos& TO EndPos& STEP 1
PRINT #Z%, CHR$(PEEK(C&));
LOCATE L, C, 0
PRINT INT((C& / EndPos&) * 100); "%";
NEXT C&
CLOSE Z%
END SUB

