Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Isäntä ja asiakas *QB*

juhaz [22.04.2006 15:13:53]

#

Tein erään ohjeen mukaan eräänlaisen ohjelman tai kaksi oikeastaan.
Siinä on isäntä ja asiakas-ohjelmat, joista isäntä on tälläinen:

DECLARE SUB SetOSFlags ()
DECLARE SUB StuffBuffer (batch$)
DECLARE SUB RunEXEfile (filename$)


INPUT m$
SetOSFlags
RunEXEfile m$

SUB RunEXEfile (filename$)
 'a% = FREEFILE
 OPEN "_.bat" FOR OUTPUT AS #1
 PRINT #1, "@echo off"
 PRINT #1, filename$
 PRINT #1, path$ + "stuffbuf kernel"
 CLOSE #1
 StuffBuffer "_.bat"
 SYSTEM
END SUB

SUB SetOSFlags

DEF SEG = 0
IF PEEK(&H463) = &HB4 THEN
  DEF SEG = &HB000
ELSE
  DEF SEG = &HB800
END IF
osint$ = "OS*1"
FOR a% = 4001 TO 4004
 POKE (a%), ASC(MID$(osint$, a% - 4000, 1))
NEXT

END SUB

SUB StuffBuffer (batch$)
 Stuf$ = LEFT$(batch$, 14) + CHR$(13)
 Length = LEN(Stuf$)
 DEF SEG = 0
 POKE 1050, 30
 POKE 1052, 30 + Length * 2
 FOR a% = 1 TO Length
  POKE 1052 + a% * 2, ASC(MID$(Stuf$, a%))
 NEXT
 SYSTEM
END SUB

ja asiakas tälläinen:

DECLARE FUNCTION DetectOS% ()

a% = DetectOS%
PRINT a%
IF a% THEN
PRINT "je"
ELSE
PRINT "no"
END IF

PRINT "ACID"
DO
a$ = INKEY$
LOOP UNTIL a$ = "q"

FUNCTION DetectOS%
OSint$ = "    "
FOR a% = 4001 TO 4004
 MID$(OSint$, a% - 4000) = CHR$(PEEK(a%))
NEXT
IF LEFT$(OSint$, 3) = "OS*" THEN
 DetectOS% = 1
ELSE
 DetectOS% = 0
END IF
END FUNCTION

Ohjeen mukaan tuon pitäisi tallentaa jonnekkin OS*1 tekstin isännästä ja sitten lukea se asiakkas-ohjelmassa, mutta minulla se joko ei tallenna tai sitten se ei osaa lukea sitä, koska a% on 0 ja se sanoo "no", kun isännän kautta käynnistää asiakkaan. Sama myös vaikka käynnistää asiakas-ohjelman ihan muuten vain... eli siis ei mitään eroa...

EDIT: Tosin suoritan ohjelmaa dosboxin kautta Mac OS X:ssä :/

neau33 [23.04.2006 20:21:33]

#

Moikka juhaz!

NEXT
'Kokeile sanooko tässä
PRINT OSint$ '***
'välissä yhtään mitään
IF LEFT$(OSint$, 3) = "OS*" THEN

juhaz [23.04.2006 21:22:37]

#

Se sanoo:
u$³

eli mitä ilmeisemmin väärin jos sen kuuluisi sanoa "OS*1"?

neau33 [23.04.2006 21:57:23]

#

Moikka juhaz!

Aivan oikea päätelmä...

 Length = LEN(Stuf$)
'Tee sama jutska tässä
Print Stuf$ , Length '***
'välissä
DEF SEG = 0)

Metabolix [23.04.2006 22:02:53]

#

Eikö ohjeissa kielletä vastaukset tyyliin "siinä on varmaankin jotain vikaa" jne?

Tarkistapa vielä isäntäohjelmassa juuri ennen sen toisen ajoa ja ajon jälkeen, mitä muistista löytyy. Nyt siis ensimmäinen vaihe olisi tutkia, mistä lähtien sisältö on väärä. Vai tekeekö DosBox ehkä jokaiselle ohjelmalle oman muistipalan? Mitään ei voi sulkea pois.

juhaz [24.04.2006 08:44:15]

#

Tuohon neau33:n juttuun se sanoo _.bat/tyhjää ja 6.

Metabolixin ehdotukselle taas se sanoo aivan oikein eli OS*1 jos käyttää DetectOS% funktiota myös pääohjelmassa.

neau33 [24.04.2006 09:12:25]

#

Moikka juhaz!

Tietysti sanoo, koska muuttujalle annetaan arvo:
END IF
osint$ = "OS*1" '***
FOR a% = 4001 TO 4004

FOR a% = 1 TO Length
  POKE 1052 + a% * 2, ASC(MID$(Stuf$, a%))
  'Lisää tähän...
   hlp$ = hlp$ + Str$(Asc(Mid$(Stuf$, a%)))'***
  '...väliin
NEXT
  PRINT hlp$ '*** ja tsekkaa
  Do While Inkey$ = "": Loop '*** täälä...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta