(C) PAUL FALCON, 1997
I would like you to submit a program
to help "fight" with the upper memory. That is, run it on
different machines.
The program detects automatically when you start with
which computer it works. And exposes the variables in
accordance with the testing machine: a computer, and how his
"brain" that is, memory.
To work with the program enough treatment to three
procedures, regardless of a certain type of computer.
Basic system of 55-65% was writing my friend
Jura Kovalevsky. I rewrote, added
More vehicles to determine, wrote 45-35%
Well, now the technical information is, in fact, what and
how:
Data on some machines are in the variable (IY +118) (23,728)
and the location of its bits as follows:
0 = 1 is the port # 7FFD SPECTRUM 128K
1 = 1 is the port # 1FFD SCORPION or KAY
2 = 1 is the port # DFFD PROFI
3 = 1 is the port # FFF7 TURBO 2 +
4 = 1 is the port # FDFD ATM TURBO
5 = 1 are 6 and 7 bit # 7FFD
6
7 = 1 at 8 bytes # C3 (SCORPION)
Compliance by value, ie a
value will be variable (IY +118)
in determining whether a particular computer:
0 SPECTRUM 48K
1 SPECTRUM 128K
32 +1 SPECTRUM 256K - 512K
2 KAY 48K
2 +1 KAY 256K - 1024K
4 PROFI 48K
4 +1 PROFI 256K - 1024K
8 TURBO 2 + 48K
8 +1 TURBO 2 + 128K - 1024K
16 ATM TURBO 48K
16 +1 ATM TURBO 128K - 512K
128 SCORPION 48K
128 +1 SCORPION 128K
128 +2 SCORPION 256K - 1024K
Number of actual pages is stored in a variable (IY +119)
(23,729).
Management of the program is so simple
that it is necessary to know only three protsedurki:
If, in determining what a car
necessary to exclude a few pages here
help procedure DEBUG, in case C indicates the number of pages
being removed from the table. This should be done immediately
after the definition of the machine and then determine the
memory (After CALL VIRT).
Example: C0 ....
LD C, 8
CALL DEBUG
....
In this example, will remove the page number 8 of the
available for switching (For Scorp'a useful, not killed shadow
businesses).
If this procedure is not useful to you,
then you can safely cut it out of the program from
tags DEBUG to ONPAGE.
Also, the number of pages and their numbers
can be adjusted directly in the table itself
(At end), initially there are no 2 and 5 pages.
Scrolling pages in their logical number - a procedure ONPAGE.
Example: C0 ....
LD A, 8
CALL ONPAGE
....
This example will include a # C000 page
located but the rooms (in Reg. A) from the beginning of the
table (in our case will be included 10 pages, if any at all
there).
Paging in their physical number - a procedure EX_RAM.
Example: C0 ....
LD A, 8
CALL EX_RAM
....
C # C000 will turn on page numbered in the
Reg. A Ie actually 8 pages.
C0; @ @ @ @ @ @ @ @ @
; @ @ @ @ @ @ @
; @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
; @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
; @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
; @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
; @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
;
; VERSION 5.5. IMPROVED.
;
;
; AUTOCONFIG PAGEMAKER FOR MACHINES:
;
; TURBO 2 + (48K - 1024K) V6.00 - V7.1
; ATM TURBO (48K - 512K) V4.10 - V5.20
; SCORPION (48K - 1024K)
; PROFI (48K - 1024K)
; SPECTRUM (128K - 512K) 6 '7 BIT # 7FFD
;
; THE SHAREWARE PRODUCT FOR FREE USING!
; (Using the procedure in
; Their programs link to the authors
; Almost obligatory (but your case))
C0START; the starting point ...
XOR A
LD (IY +118), A; type of computer
INC A
LD (IY +119), A; the number of pages available
DI
; Check (.) 'RST 8' in the ROM 48 (if ZS-256, there # C3)
LD BC, # 7FFD
LD A, # 10
OUT (C), A
LD A, (# 0008)
CP # C3
JR NZ, ITURBO; not ZS-256
And this probably SCORPION
SET 7, (IY +118)
ITURBO
; Manager to check if RAM / ROM
; Take 2 bytes from the 0-th segment (there ROM48)
C0 LD HL, (1111)
; Duplicate ROM48 in 3-m segment (# C000-# FFFF)
LD BC, # FFF7
LD A,% 00011111
CALL OUTC_A
; Take 2 bytes of the third segment (if TURBO 2 +, there ROM48)
LD DE, (# C000 +1111)
AND A
SBC HL, DE; compare with bytes 0-th segment
; Restore manager
LD BC, # FFF7
LD A, # FF
CALL OUTC_A
JR NZ, IDFFD; it's not TURBO 2 +
; Detected Manager RAM / ROM (TURBO 2 +)
SET 3, (IY +118)
C0 JR I7FFD
; PROFI?
IDFFD LD HL, # 80
LD DE, # 1000
LD BC, # DFFD
; Check the port # DFFD bit 4
, (Check the connection RAM instead of ROM)
OUT (C), D; includes 0-th segment of RAM
And instead of ROM
; Try to disable ROM
NOP
LD A, (HL); read bytes
INC (HL); change it
CP (HL); compare with the read
LD (HL), A; restore bytes
OUT (C), E; restore ROM
JR Z, I1FFD; no port # DFFD
; A port # DFFD (PROFI)
C0 SET 2, (IY +118)
JR I7FFD
; Check the port # 1FFD bit 0
; (Check the connection RAM instead of ROM)
I1FFD LD DE, # 1110
LD B, # 1F
OUT (C), D; includes 8 segment RAM
NOP
LD A, (HL); read bytes
INC (HL); change it
CP (HL); compare with the read
LD (HL), A; restore bytes
OUT (C), E; ROM put in place
JR Z, IFDFD; no port # 1FFD
; A port # 1FFD (SCORPION or KAY)
XOR A
OUT (C), A
SET 1, (IY +118)
JP I7FFD
C0IFDFD
; Checking for port # FDFD (ATM-1)
LD B, C
LD HL, # FFFF
OUT (C), D
NOP
LD B, # 7F
OUT (C), D
NOP
LD (HL), D
LD B, C
OUT (C), E
NOP
LD B, # 7F
OUT (C), D
NOP
LD (HL), E
LD B, C
OUT (C), D
NOP
LD B, # 7F
OUT (C), D
NOP
C0 LD A, (HL)
CP D
JR NZ, I7FFD; there is no such word
, But has a port # FDFD
SET 4, (IY +118)
, A port (# 7FFD)
; (Test for switching ROM48 <-> ROM128)
I7FFD LD HL, # 80
LD DE, # 1000
LD BC, # 7FFD
OUT (C), D; ROM 1, unequivocally!
NOP
LD A, (HL); 48 bytes ROM
OUT (C), E; ROM 0
NOP
CP (HL); bytes of ROM 128
OUT (C), D; ROM 1
NOP
JR Z, SIZED; no port or blocked
C0; detected port # 7FFD
SET 0, (IY +118)
, To determine the amount of memory
SIZED
CALL VIRT; DE - end table (tag # FF)
LD A, (IY +119); SPECTRUN 256K-512K?
CP # 08
JR C, ENDING
LD A, (IY +118)
CP # 01
JR NZ, ENDING
SET 5, (IY +118); steep SPECCY 256K - 512K
ENDING
LD A, # 00; page after exiting the program
CALL EX_RAM; in port # 7FFD on SPECTRUM 128K.
EI; for a normal exit.
RET
, The definition of real (!) Pages for this vehicle
; Page "phantoms" be deleted from the logical table
; Output:
C0; DE - end table (tag # FF)
And the variable PAGE - available number of pages
VIRT LD IX, # C000
; Fill pages of their rooms with saving the contents of bytes
, The points test (# C000)
LD HL, DOOM +63
LD B, 64
V_R11 LD A, B
DEC A; NN p. 63,62,61,60 ... 1,0
CALL EX_RAM
LD C, (IX +0)
LD (HL), C; save the contents of the byte
LD (IX +0), A; Record back page number
DEC HL
DJNZ V_R11
And delete from a table not found pages
PUSH AF
LD A, 61
LD (IY +119), A
C0 POP AF
LD DE, TABL_PG
V_R20 LD A, (DE)
CP # FF
JR Z, V_R30; end of the table
CALL EX_RAM
CP (IX +0); comparison. number of pages with the
content of bytes
JR Z, V_R22; page actually exists
; This page on a life HET!!!
PUSH DE
LD HL, TABL_PG +62
AND A
SBC HL, DE
PUSH HL
POP BC; volume shift table
PUSH DE
POP HL
INC HL
LDIR
DEC (IY +119); -1 pages available
POP DE
DEC DE
C0V_R22 INC DE
JR V_R20
; Restore the contents of bytes (# C000) on pages
V_R30 LD B, 64
LD HL, DOOM
V_R31 LD A, 64
SUB B; NN pages 0,1,2,3,4 ... 62.63
CALL EX_RAM
LD A, (HL)
LD (IX +0), A; save the contents of the byte
INC HL
DJNZ V_R31
RET
, "Sampling" from a table of pages a given page
, At the entrance:
; C - N page
; DE - end table (tag # FF)
; Output:
; DE - end of the table (probably already new)
DEBUG PUSH DE
C0 POP HL
NO_PG1 DEC DE
LD A, (DE)
CP # FF
JR Z, NO_PG2; HE found delete pages!
CP C
JR NZ, NO_PG1
; DE - on the number of deleted pages
; HL - to mark the end of the table (# FF)
SBC HL, DE
PUSH HL
POP BC
PUSH DE
POP HL
INC HL
LDIR
DEC (IY +119); -1 pages available
DEC HL
DEC HL
NO_PG2 EX DE, HL
RET
C0; switching program pages for different types of machines
ONPAGE
PUSH BC; A - logical page number
PUSH HL
LD C, A
LD B, # 00
LD HL, TABL_PG
ADD HL, BC
LD A, (HL); physical page number
POP HL
POP BC
EX_RAM DI; A - physical page number
PUSH HL
PUSH AF
PUSH BC
BIT 1, (IY +118)
JR NZ, ZS256; SCORPION (# 1FFD)
BIT 2, (IY +118)
JR NZ, PROFI; PROFI (# DFFD)
BIT 3, (IY +118)
JR NZ, TURBO_2; TURBO 2 + (# FFF7)
BIT 4, (IY +118)
C0 JR NZ, ATM1; ATM TURBO (# FDFD)
BIT 0, (IY +118)
JR NZ, SPECCY; SPECTRUM 128K-512K (# 7FFD)
BIT 7, (IY +118)
JR NZ, SPECCY; SCORPION 128K (# 7FFD)
JR TDK
; For TURBO 2 + (supports 128K-1024K)
TURBO_2 PUSH AF
PUSH IX
AND% 00011000
CPL
LD BC, # FFF7
CALL OUTC_A
POP IX
POP AF
JP SPECCY
; ATM TURBO V4.10 - 5.20 (supports 256K - 512K)
ATM1 LD BC, # FDFD
PUSH AF
RRCA
C0 RRCA
RRCA
AND% 00000011
JR HOME
; For PROFI (supports 256K-1024K)
PROFI LD BC, # DFFD
PUSH AF
RRCA
RRCA
RRCA
AND% 00000111
JR HOME
; For SCORPION or KAY (supports 512K-1024K unconventionally)
ZS256 PUSH AF
LD B, A
AND% 00001000
RLCA
LD C, A
LD A, B
AND% 00110000
C0 RLCA
RLCA
ADD A, C
LD BC, # 1FFD
HOME OUT (C), A
NOP
POP AF
; For SPECTRUM 128K (256K-512K supports non-standard!)
SPECCY LD B, A
AND% 00011000
RLCA
RLCA
RLCA
LD C, A
LD A, B
AND% 00000111
ADD A, C
OR # 10; ROM 1948
LD BC, # 7FFD
OUT (C), A
NOP
C0TDK
POP BC
POP AF
POP HL
RET
OUTC_A LD IX, # 2A53
PUSH IX
JP # 3D2F
DEFB # FF
TABL_PG DEFB 00,01,03,04,06,07
DEFB 08,09,10,11,12,13,14,15
DEFB 16,17,18,19,20,21,22,23
DEFB 24,25,26,27,28,29,30,31
DEFB 32,33,34,35,36,37,38,39
DEFB 40,41,42,43,44,45,46,47
DEFB 48,49,50,51,52,53,54,55
DEFB 56,57,58,59,60,61,62,63
DEFB # FF
DOOM DEFS 64,0
Good luck. Paul Falcon
SPbZXNet: 812/03.00