Spectrofon #22
20 июля 1997

System - program management of the "upper" memory.

<b>System</b> - program management of the
(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





Other articles:

Debut - there are not many games, for writing which would be needed for three years, Bloodwych one of them.

Review - New games: Mystery of Arkham Manor, Magic Stripes, Satan II.

Mirror - "Among the gods: Odin (Thor)" Interview with Steven Veterillom, the company's history.

Premiere - sensational game Doom, a new version of Commander SW-Commander.

Expertise - a detailed description of the game "Spooked".

Designer - description of a program for creating 3D games "3D-Construction Kit".

System - program management of the "upper" memory.

Storm - a proprietary instruction to the game "War in the Middle Earth" ("The war in Spedizeme).


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
Entry - the contents of rooms.
AMIGA vs PC - What can you say about the Amiga?
Fiction - double lamp performer desires.

В этот день...   28 April