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