Dynamiczna alokacja w DOS'ie i RM

0

Jakoś tak wyszło, że dopiero niedawno miałem pierwszy raz potrzebę ort! tego dobrodziejstwa w DOS'ie i... coś kiepsko mi idzie ;P
Zastanawiam się, czy to <ort>w ogóle</ort> możliwe przy pomocy przerwania 31h w RM [???]
Udało mi się wprawdzie zaalokować tak 3000h bajtów i nawet zapisać/odczytać coś (paletę kolorów) z pierwszych 768 bajtów, ale kiedy ort! zapisać tam 3000h bajtów system (cały Windows) się zwiesza i nic - łącznie z zwiększeniem alokowanej pamięci, i sprawdzaniem, czy ES się nie przekręcił. [sciana]

Jeżeli komuś się chce to czytać to tu zamieszczam kod:

MOV AX, 13h
INT 10h

MOV		AX, 0501h
XOR		BX, BX
MOV		CX, 05000h
INT		31h
JNC		ok1
  JMP		koniec
ok1:

MOV		hkolkoSI, SI
MOV		hkolkoDI, DI

MOV		ES, BX
MOV		DI, CX

CLD
XOR		AX, AX
MOV		CX, 192
REP		STOSW

SUB		DI, 384
MOV		CX, 3F3Fh
MOV		BX, 3

pp:
MOV		ES:[DI+BX], CX
ADD		BX, 3
SUB		CX, 0101h
JNZ		pp




MOV		AX, 1012h
XOR		BX, BX
MOV		CX, 100h
MOV		DX, DI
INT		10h


  k:
	FILD		pktk.x
	FILD		kpoz.x
	FSUBP
	FLD		ST
	FMULP

	FILD		pktk.y
	FILD		kpoz.y
	FSUBP
	FLD		ST
	FMULP

	FADDP
	FSQRT
	FISTP		kolor
	
	MOV		AX, kolor
	INC		AL
	MOV		byte ptr ES:[DI], AL

	INC		DI
	TEST		DI, DI
	JNZ		dalej
	MOV		AX, ES
	INC		AX
	MOV		ES, AX
	dalej:

	INC		pktk.x
	CMP		pktk.x, 129
	JB		k

  MOV		pktk.x, 0
  INC		pktk.y
  CMP		pktk.y, 129
  JB		k

MOV		SI, hkolkoSI
MOV		DI, hkolkoDI
MOV		AX, 0502h
INT		31h

koniec:
MOV AX,4C00h
INT 21h

PUNKT		STRUC
  x		DW	?
  y		DW	?
PUNKT		ENDS

pktk		PUNKT		<0,0>
kpoz		PUNKT		<64,64>

kolor		DW	?

hkolkoSI	DW	?
hkolkoDI	DW	?

Kompiluję to TASM'em jako *.com

PS Tylko nie dorzucajcie uwag o optymalizacji, bo to tylko wersja do sprawdzenia tej pamięci ;)

PPS Kto zgadnie, co z tego dalej będzie? ;)

0

hmm bedzie problem
w dosie dla programu com przeznaczone jest max 64kb czyli caly segment, uzywajac funkcji 4ah 48h i 49h mozesz uzywac alkoowania pamieci ale z tego co wiem maxymalnie nie moze ona wraz z programem przekroczyc 64kb co wie w sumie mija z celem, hmm zamiast alokowac to wrzuc dane w segmenty ponad kodem progza i wyjdzie na to samo

0

No dobra, ale mi jest potrzebne tylko 3000h bajtów -> 128*128. :/

PS Mogę przecieŻ przejść na PM, albo do exe'ców, ale po prostu urzeka mnie piękno plików *.com - kawał napisanego przeze mnie kodu maszynowego, który bez zbędnych ceregiewli (przynajmniej pod czystym DOS'em) dostaje komputer w swoje łapska... :d

PS Zaraz sprawdzę twój sposób, ale już czuję, że zadziała... dzięki :d

0

Jeżeli dobrze pamiętam to w *.com można pobrać więcej pamięci niż 64KB, tylko że sam program zapisany na dysku nie może przekroczyć tego rozmiaru(ponieważ jest na żywca przekopiowany w pamięć) :] Ale należy pamiętać że nim zaczniemy przydzielać pamięć, należy ją zwolnić, bo kom zżera ją cała na starcie :)

0

Dzięki wszystkim za rady!
Na szczęście w sukurs przyszło mi niezawodne przerwanie 21h i funkcje 48h, 49h i 4Ah, które to serdecznie pozdrawiam! ;P

1 użytkowników online, w tym zalogowanych: 0, gości: 1