print " *** RAMINIT .MAX ***" ; ; ******** Initialisierung der RAM-Disc ******** ; * * ; * Andreas Dobbertin 18.10.1988 * ; * * ; * Spezial-Version f}r PC International * ; * Andreas Dobbertin 13.02.1989 * ; * * ; ********************************************** ; ; ; ------ >>> Pr}fen, ob 63K TPA m|glich sind <<< --- ; raminit ld a,(#4000) ;Den Inhalt von #4000 der ld (old4000),a ; Original-Bank retten ; ld hl,banks_0 ;Sind die zweiten 64K call testmem ; vorhanden ? jr nc,endinit ;Ja, dann Springe ; ; ------ >>> Die zweite 64K Bank fehlt <<< --------- ; call prtext ; defm "This program" defm " will not ru" defm "n in this" defb #0a,#0d defm "environment." defm " Press any k" defm "ey $" ; clrinp call #bb09 jr c,clrinp call #bb06 ; rst 8 defw #0000 ; ; ------ >>> Ende der Initialisierung <<< ---------- ; endinit ld bc,#7fc7 ;Die COMMON-Bank ab out (c),c ; #4000 einblenden ld hl,#0d80 ;Den BIOS-Sprungvector ld de,#7d00 ; und die Banking- ld bc,#0180 ; Routinen in die ldir ; COMMON-Bank kopieren ld bc,#7fc0 ;Die ersten 64K out (c),c ; wieder einschalten ; ld hl,fastout-#4000 ld de,#4800 ; Die FAST-Routinen ld bc,#0280 ; nach #4800 kopieren ldir ret ; ; ------ >>> Testen ob RAM-Bank vorhanden <<< ------ ; ; Hier wird getestet, ob ein bestimmter Speicher- ; bereich vorhanden ist. 'HL' zeigt auf die Tabelle ; mit den zu pr}fenden Speicherb{nken. ; ; RET mit Carry-Flag = 0 => alle B{nke vorhanden ; RET mit Carry-Flag = 1 => B{nke sind nicht vorhanden ; testmem ld de,workmem ld bc,#7fc0 nxtbank ld a,(hl) and a jr z,fillmem out (c),a ld a,(#4000) ld (de),a inc hl inc de jr nxtbank ; fillmem dec hl dec de ld a,(hl) and a jr z,compare out (c),a ld (#4000),a jr fillmem ; compare and a cmploop inc hl inc de ld a,(hl) bit 7,a jr z,endtest out (c),a jr c,restore ld a,(#4000) cp (hl) scf jr nz,restore and a restore ld a,(de) ld (#4000),a jr cmploop ; endtest out (c),c ;Die ersten 64K wieder ld a,(old4000) ; einschalten und den ld (#4000),a ; Inhalt von Adr. &4000 ret ; wieder restaurieren ; ; ------ >>> Banknummern der 2. 64K-Bank <<< ------- ; defb #00 banks_0 defb #c4,#c5,#c6,#c7 defb #00 ; ; ------ >>> Systemvariablen <<< ----------------- ; old4000 defs 1 workmem defs 12 ; ; ------ >>> FAST-Routine einbinden <<< ------------ ; ; Der Indirection 'NEWMODE' ab #BDEB wird auf eine ; eigene Routine umgelenkt. Beim n{chsten MODE-Wechsel ; ( im BOOT-Sector ) wird die FAST-Routine aktiviert. ; fast_on call movechr ;Zeichensatz -> #4000 ld hl,newmode ;Neue MODE-Routine ld (#bdec),hl ; einh{ngen ld c,#ff ;#FF => BASIC-ROM call #b915 ;Rechner-Typ ermitteln ld a,h cp #01 ;Ist es ein CPC 464 ? ret c ;Ja, dann fertig ; ld hl,#91a3 ;CPC 664 Cursor-Validate jr z,cpc_664 ;Springe wenn CPC 664 ld l,#a7 ;CPC 6128 Cursor-Validate cpc_664 ld (chkcrsr+1),hl ; ld hl,ptchtbl ;Bei CPC 664/6128 erst die ld de,patch01 ; FAST-Routine angepassen ; patcher ld a,(hl) ;N{chsten Offset holen and a ;Ist schon alles gepatcht? ret m ;Ja, dann RET inc hl add a,e ld e,a adc a,d sub e ld d,a ld bc,#0002 ldir jr patcher ; ; ------ >>> Patch-Tabelle f}r CPC 664/6128 <<< ---- ; ptchtbl defb #01 defw #b758 defb patch02-patch01-2 defw #b72e defb patch03-patch02-3 defw #f8a7 ;AND A, RET M defb patch04-patch03-1 defw #b726 defb patch05-patch04-2 defw #b726 defb patch06-patch05-2 defw #b759 defb patch07-patch06-2 defw #b763 defb patch08-patch07-2 defw #b759 defb patch09-patch08-2 defw #b758 defb patch10-patch09-1 defw #b7c4 defb patch11-patch10-3 defw #b730 defb patch12-patch11-2 defw #b7c6 defb patch13-patch12-1 defw #b7c4 defb patch14-patch13-3 defw #b7c6 defb patch15-patch14-2 defw #b72f defb patch16-patch15-1 defw #b7c4 defb patch17-patch16-3 defw #b7c6 defb patch18-patch17-2 defw #b72f ; defb #ff ;Ende der Patch-Tabelle