Po rychlém a úspěšném vyřešení optimalizace toho barevného loga ZXS mám něco obtížnějšího
Rád bych lepší test paměti počítače:
1. detekce velikosti
2. test na vadnou buňku
Současný MFC má detekci 48 versus 128, vše navíc (256/512/1024) jsem trošku odbyl (o5 problém s místem) a uživatel si musí povolit ručně v setupu. Test na vadnou paměť měla pouze verze 0 a ačkoliv se mi hodně líbil, jak jsem ho vymyslel, musel jsem ho z důvodu potřeby volného místa úplně odstranit.
Stránkování paměti probíhá pouze na portu 32765. Stránkovací tabulku pro ruské modely (pentagon, scorpion) jsem dal dohromady společně s Velesoftem (tedy alespoň myslím, že to byl on...
Rád bych, aby detekce spočívala v otestovaní (pro jistotu) všech stránek. Přeci jen jsem člověk paranoidní a kvůli nepřesné detekci mašiny jsou následně zkopírovaná data chybná raz dva... A dále, abych si mohl spustit v případě pochybností i nějaký memtest. Myslím ale, že to není reálné. Zřejmě nemůžeme jen tak libovolně (tj. bez nežádoucích následků) outovat na všech bitech portu 32765. Např. takový OUT 32765,48 nám na ZXS 128 uřízne větev definitivně. Nějaký rozumný kompromis se ale jistě najít dá.
Přikládám kódy, které jsem použil. Než je však přepsat bych raději chtěl vyvolat diskuzi o tom, jak bezpečně velikost paměti rozeznat.
Kód:
************MFC v 3.x***************
;stránkování přes out 32765,x
;zde jsou všechny možné x
;nula znamená konec paměti a vkládá se
;dle mašiny na onu pozici - viz. SET_PG
PAGES defb 16
defb 17,19,20,22,23
PAGES2 defb 80,81,82,83
defb 84,85,86,87
PAGES3 defb 144,145,146,147
defb 148,149,150,151
defb 208,209,210,211
defb 212,213,214,215
PAGES4 defb 48,49,50,51
defb 52,53,54,55
defb 176,177,178,179
defb 180,181,182,183
defb 112,113,114,115
defb 116,117,118,119
defb 240,241,242,243
defb 244,245,246,247
defb 0
;otestování velikosti paměti
;hodnota na 49152 pouze v základní
;stránce 16 se nesmí testem změnit!
TESTMM ld hl,49152
ld bc,32765
ld a,(hl)
ld de,16*256+17
ld (hl),d
out (c),e
ld (hl),e
out (c),d
ld d,(hl)
ld (hl),a
ld a,d
cp e
;v L je 0 (HL = 49152)
;XOR A by mi zrušilo Z/NZ k CP e...
ld a,l
ld bc,DEFAU+5
ld de,SETUPVAR+5
ld (de),a
ld (bc),a
ret z
inc a
ld (de),a
ld (bc),a
ret
AX6LDIR add a,a
ld b,a
add a,a
add a,b
ld hl,TMM
ld b,0
ld c,a
add hl,bc
ld c,4
ldir
ret
;volá se po ukončení setupu
;k nakopírovaní textu s velikostí paměti
;a přidání zarážky (nuly) na konec
;stránkovací tabulky
;A = 0 až 4
;0-48,1-128,2-256,3-512,4-1024
SET_PG ld a,(SETUPVAR+5)
cp 4
ret z
ld de,T_128
call AX6LDIR
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (hl),c
ret
;po otestování velikosti paměti
;se přenese text do T_SETM
....
ld a,(SETUPVAR+5)
ld de,T_SETM
call AX6LDIR
....
T_SETM defs 4
;defm značí adresu kde je stránkovací tabulka
;ukazuje přesně na místo kde je třeba vložit
;nulu, která znamená konec paměti
;defm je obyč text, který je třeba dostat do
;T_128 kde je text pro volbu info (SS+I)
TMM defm "048K"
defw PAGES+1
defm "128K"
defw PAGES2
defm "256K"
defw PAGES3
defm "512K"
defw PAGES4
defm "1024"
T_SSI defb 22,1,0
defb 16,7,17,0,19,1
T_MDOS defm "v . "
defm "D80A D80B "
defm "D80C D80D "
defb 18,1," "
T_128 defm "1024 "
defb 18,0,19,0+128
************MFC v 0.87b*************
R_MEM defw 0
R_PAGE defw 0
;ještě prehistoricka stránkovací tabulka
PAGES defb 16
defb 17,19,20,22,23
defb 0,0,0,0,0,0,0,0
defb 0
defb 0
;C_FIRST je nějaká adresa >49152
;je to začátek volné oblasti pro data
;při kopírování v základní stránce (16)
MEM_SYS ld hl,C_FIRST
ld (R_MEM),hl
ld hl,PAGES
ld a,(hl)
inc hl
ld (R_PAGE),hl
ld bc,32765
out (c),a
ret
MEMTEST ld hl,T_MEMO0
call PMESAGE ;vypíše hlašení, že probíhá memtest
;1. test - testujem hodnotu %01010101
ld hx,%01010101
call MEM_DEL
call MEM_TST
jp nz,MEMEROR
call MEM_SYS
;2. test - do každé stránky dáme kus ROM
;přičemž ale žádné dvě stránky nebudou mít
;pokaždé ty stejné hodnoty (posouváme začátek
;dat z ROM o hodnotu čísla stránky :)
call MEM_LDI
call MEM_SYS
;jakmile jsou všechny stránky zaplněné
;testovací sadou, teprve pak provedeme
;porovnání, zda mají správně zapsaná data
call MEM_CP
jp nz,MEMEROR
MEM_DEL0 ld hx,0
MEM_DEL call MEM_SYS
ld hl,(R_MEM)
ld d,h
ld e,l
inc de
xor a
ld c,a
ld b,h
sub b
ld b,a
dec bc
ld a,hx
ld (hl),a
ldir
ld hl,(R_PAGE)
MEM_D0 ld a,(hl)
or a
jr z,MEM_SYS
exx
ld bc,32765
out (c),a
ld hl,49152
ld de,49153
ld bc,16383
ld a,hx
ld (hl),a
ldir
exx
inc hl
jr MEM_D0
MEM_TST ld hl,(R_MEM)
xor a
ld c,a
ld b,h
sub b
ld b,a
MEM_T1 ld a,hx
cpi
ret nz
ld a,b
or c
jr nz,MEM_T1
ld hl,(R_PAGE)
MEM_T0 ld a,(hl)
or a
jp z,MEM_SYS
exx
ld bc,32765
out (c),a
ld hl,49152
ld bc,16384
MEM_T2 ld a,hx
cpi
ret nz
ld a,b
or c
jr nz,MEM_T2
exx
inc hl
jr MEM_T0
MEM_LDI call TST_L1
ldir
ld bc,284
TST_L3 ld a,h
cp 64
jr nz,TST_L4
ld h,l
TST_L4 ldi
jp pe,TST_L3
jr MEM_LDI
MEM_CP call TST_L1
ld bc,16384
TST_C3 ld a,h
cp 64
jr nz,TST_C4
ld h,l
TST_C4 ld a,(de)
cpi
jr z,TST_C5
ret
TST_C5 inc de
jp pe,TST_C3
jr MEM_CP
TST_L1 ld hl,(R_PAGE)
ld a,(hl)
or a
jr z,TST_L2
inc hl
ld (R_PAGE),hl
ld bc,32765
out (c),a
ld de,49152
ld b,a
ld a,255
sub b
ld bc,16100
ld h,0
ld l,a
ret
TST_L2 pop hl
xor a
ret