Spectrofon #22
20 июля 1997 |
|
System - program management of the "upper" memory.
(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:
Similar articles:
В этот день... 21 November