aboutsummaryrefslogtreecommitdiff
path: root/gwfetch.bas
blob: b7b509d938ab3199ed1a22ca86f7df1d8b7a93b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
10 TMPFILE$ = "TEST.TMP"
19 REM Determine the OS and interpretter
20 REM CMD$ = "ver":GOSUB 5000:GOSUB 10000
30 PRINT "INTERPRETER: ";INTERP$
40 IF LEN(VERSION$) > 0 THEN PRINT "VERSION: ";VERSION$
100 REM Determine memory 
110 REM CMD$ = "chkdsk":GOSUB 5000:GOSUB 11000
120 PRINT "MEMORY: ";MEMFREE$;"/";MEMTOTAL$

130 GOSUB 12000
140 PRINT "CPUID: ";CPUID%
1000 END

5000 REM Run and pipe command
5010 REM TMPFILE$ contains the file for capture
5020 REM CMD$ contains the command to run
5030 SHELL CMD$ + " > " + TMPFILE$
5040 RETURN

10000 REM 'ver' output parser
10010 REM TMPFILE$ contains the file to open
10011 REM output: INTERP$ is the interpeter
10012 REM         VERSION$ is the version
10020 OPEN TMPFILE$ FOR INPUT AS #2
10025 REM ON ERROR GOTO 10040
10030 INPUT#2, VERLINE$
10035 IF LEN(G$) = 0 THEN GOTO 10030 ELSE GOTO 10050
10040 RESUME 10060
10060 CLOSE#2
10070 REM VERLINE$ now contains the first non-blank version
10080 REM output.  Technically it is just the command 
10090 REM interpreter version.
10100 IDX = INSTR(VERLINE$, "ersion")
10110 IF IDX = 0 THEN INTERP$ = VERLINE$:VERSION$="":RETURN
10120 IDX = IDX - 1
10130 INTERP$ = LEFT$(VERLINE$, IDX - 1)
10140 IDX = IDX + 7
10150 VERSION$ = RIGHT$(VERLINE$, LEN(VERLINE$) - IDX)
10160 FOR IDX = 1 TO LEN(VERSION$)
10170   IF MID$(VERSION$, IDX, 1) = " " THEN VERSION$ = LEFT$(VERSION$,IDX-1)
10180 NEXT IDX
10190 RETURN
11000 REM 'chkdsk' output parser
11010 REM TMPFILE$ contains the file to open
11011 REM output: MEMTOTAL$ is the total memory in bytes
11012 REM         MEMFREE$ is the available memory in bytes
11020 MEMTOTAL$ = "":MEMFREE$ = ""
11025 ON ERROR GOTO 11100
11030 OPEN TMPFILE$ FOR INPUT AS #2
11040 INPUT#2, MEMLINE$
11050 IDX = INSTR(MEMLINE$, "bytes total memory")
11060 IF IDX > 0 THEN MEMTOTAL$ = LEFT$(MEMLINE$, IDX-1):GOTO 11090
11070 IDX = INSTR(MEMLINE$, "bytes free")
11080 IF IDX > 0 THEN MEMFREE$ = LEFT$(MEMLINE$, IDX-1)
11090 IF LEN(MEMTOTAL$) = 0 OR LEN(MEMFREE$) = 0 THEN GOTO 11040 ELSE GOTO 11110
11100 RESUME 11110
11110 CLOSE#2
11120 TOTRIM$ = MEMTOTAL$:GOSUB 30000:MEMTOTAL$ = TOTRIM$
11130 TOTRIM$ = MEMFREE$:GOSUB 30000:MEMFREE$ = TOTRIM$
11140 RETURN

12000 REM CPU Identity
12001 DIM Q%(400)
12005 DEF SEG=VARSEG(Q%(0))
12006 OS%=VARPTR(Q%(0))
12010 FOR I = 1 TO 76
12020 READ JC:POKE I+OS%, JC
12025 print i, peek(i+OS%)
12030 NEXT I
12040 CPUQ = 1 + OS%
12041 print "Calling!"
12045 CALL CPUQ(CPUID%)
12047 DEF SEG

12048 REM CPUID% = PEEK(3)

12050 DATA &H55 : REM         push bp
12051 DATA &H89, &HE5 : REM         mov bp, sp
12052 REM         ; push zero onto the stack and pop it into flags.
12053 REM         ; some bits won't change
12054 DATA &H31, &HC0 : REM         xor ax,ax
12055 DATA &H50 : REM         push ax
12056 DATA &H9D : REM         popf
12057 DATA &H9C : REM         pushf
12058 DATA &H58 : REM         pop ax
12059 DATA &H25, &H00, &HF0 : REM         and ax, 0xf000 ;0f000h
12060 DATA &H3D, &H00, &HF0 : REM         cmp ax, 0xf000 ;0f000h
12061 DATA &H74, &H13 : REM         je lessthantwoeightsix
12062 REM         ; marked as 286 (2)
12063 DATA &HB2, &H02 : REM         mov dl, 2
12064 DATA &HB8, &H00, &H70 : REM         mov ax, 0x7000 ;7000h
12065 DATA &H50 : REM         push ax
12066 DATA &H9D : REM         popf
12067 DATA &H9C : REM         pushf
12068 DATA &H58 : REM         pop ax
12069 DATA &H25, &H00, &H70 : REM         and ax, 0x7000 ;7000h
12070 DATA &H74, &H22 : REM         jz alldone
12071 REM         ; mark as 386 (3)
12072 DATA &HFE, &HC2 : REM         inc dl
12073 DATA &HE9, &H1D, &H00 : REM         jmp alldone
12074 REM lessthantwoeightsix:
12075 DATA &HB2, &H01 : REM         mov dl, 1
12076 DATA &HB0, &HFF : REM         mov al, 0xff ;0ffh
12077 DATA &HB1, &H21 : REM         mov cl, 0x21 ;21h
12078 DATA &HD2, &HE8 : REM         shr al, cl
12079 REM         ; if the shift leaves zero, it's a 8088 class cpu, else 8018
12080 DATA &H75, &H13 : REM         jnz alldone
12081 REM         ; Lets see if we have a V2
12082 DATA &HB2, &H56 : REM         mov dl, 0x56 ;056h
12083 DATA &HFB : REM         sti
12084 DATA &H56 : REM         push si
12085 DATA &HBE, &H00, &H00 : REM         mov si, 0
12086 DATA &HB9, &HFF, &HFF : REM         mov cx, 0xffff ;0ffffh
12087 REM         ;rep lods [BYTE PTR es:si]
12088 DATA &HF2, &HAC : REM         rep lodsb
12089 DATA &H5E : REM         pop si
12090 DATA &H09, &HC9 : REM         or cx, cx
12091 DATA &H74, &H02 : REM         jz alldone
12092 REM         ; mark as a 808
12093 DATA &HB2, &H00 : REM         mov dl, 0
12094 REM alldone:
12095 REM         ; store in ax
12096 DATA &H30, &HF6 : REM         xor dh, dh
12097 DATA &H8B, &H7E, &H06 : REM         mov di, [bp]+6
12098 DATA &H89, &H15 : REM         mov [di], dx
12099 DATA &H5D : REM         pop bp
12100 DATA &HCA, &H02, &H00 : REM );          {        retf 2}
12101 REM Total Bytes in Data: 76




12200 RETURN


13000 REM CPU Identity via dim
13010 dim A%(37)
13030 FOR I = 0 TO 14-1
13040 READ JC:PRINT JC:POKE (VARPTR(A%(1))+I), JC
13045 PRINT I
13050 NEXT I
13060 CPUQ = VARPTR(A%(1))

13080 RETURN




30000 REM String Trim Function
30010 REM input/output: TOTRIM$
30020 FOR IDX = 1 TO LEN(TOTRIM$):IF MID$(TOTRIM$, IDX, 1) <> " " THEN GOTO 30030:NEXT IDX
30030 FOR RDX = LEN(TOTRIM$) TO IDX STEP -1:IF MID$(TOTRIM$, RDX, 1) <> " " THEN GOTO 30050:NEXT RDX
30040 TOTRIM$ = MID$(TOTRIM$, IDX, RDX - IDX)
30050 RETURN