;255-ös akciókód, RAMDISK létrehozás/törlés ld08e: CP B ;méret=0? JR Z,ld09a ;ha igen, akkor törlés CP L ;kezdőszegmens száma 0? LD A,9DH ;"RAM disk already exists" RET NZ ;hibával vissza ld09a: PUSH BC ;méret mentés LD BC,0 CALL LC329 ;memóriakezelő csatorna nyítása (FISH 23) POP BC ;méret vissza RET NZ ;visszatérés, ha hiba CP B ;méret=0? JR Z,ld108 ;ha, igen ugrás a törlésre LD DE,4101H ;szegmenslista kezdete+1 ld0ab: LD A,H ;memóriakezelő csatorna száma EXX ;registerek mentése LD B,0F0H ;szegmens igénylés kódja EXOS 0BH ; "Perform special function on channel" LD A,C ;kapott szegmens száma EXX ;registerek vissza JR NZ,LD113 ;ha hiba, akkor ugrás a törlésre, ;hogy az eddig lefoglalt szegmensek felszabaduljanak DEC E ;az első szegmens volt? JR NZ,ld0bd ;ugrás ha nem ;ha igen, akkor ez lesz a kezdőszegmens OUT (0B1H),A ;belapozása LD (IY+1DH),A ;letárolása ld0bd: LD (DE),A ;szegmensszám letárolása INC E ;lista mutató vissza LD L,E ;aktuális méret INC E ;lista mutató növelése DJNZ ld0ab LD (4080H),DE ;4080H-ra lista vége+2 kerül LD A,H ;memóriakezelő csatorna EXOS 03H ; "Close channel" LD A,L ;méret LD DE,400BH ;boot szektor adatterület LD HL,ld132 ;alapértékek LD BC,000BH LDIR ;másolás LD DE,4040H ;VOL_ID helye LD C,0BH LDIR ;átmásolás LD L,A ;méret SRL L ;méret/2 SRL L ;méret/4 INC L ;méret/4+1 INC L ;méret/4+2 LD H,B ;H=0 ADD HL,HL ;(méret/4+2)*2 ADD HL,HL ;(méret/4+2)*4 ADD HL,HL ;(méret/4+2)*8 ADD HL,HL ;(méret/4)*16+32, azaz a főkönyvtár ;legalább 32 bejegyzés méretű, plusz 4 szegmensenként 16 újabb bejegyzés LD (4011H),HL ;főkönyvtár mérete LD H,B ;0 LD L,A ;HL=méret ADD HL,HL ;*2 ADD HL,HL ;*4 ADD HL,HL ;*8 ADD HL,HL ;*16 ADD HL,HL ;*32 LD (4013H),HL ;szektorok száma LD E,L LD D,H ;LD DE,HL ADD HL,DE ;szektorok száma*2 ADD HL,DE ;szektorok száma*3 DEC HL ;szektorok száma*3-1 SRL H ;((szektorok száma*3-1)/256)/2 SRL H ;((szektorok száma*3-1)/256)/4 RLCA ;méret<128? JR NC,K2M ;ugrás ha igen LD A,2 ;2 szektor/cluster LD (400DH),A ;boot szektorban letárolás SRL H K2M LD L,H LD H,B ;0 INC HL ;(((szektorok száma*3-1)/256)/4)+1 ;ami ennek felel meg: szektorokszáma/(341+(1/3)) LD (4016H),HL ;FAT szektorok száma XOR A RET ld108: CP (IY+1DH) ;RAMDISK kezdőszegmense=0? JR Z,ld128 ;ha igen, akkor kilépés LD DE,(4080H) ;RAMDISK szegmenslista +2 XOR A ;nincs hiba DB 0C2H LD113: LD A,0F7H ;"Insufficient memory" hibakódja PUSH AF ;hibakód a verembe ld119: DEC E ;ciklusszámláló csökkentése JR Z,LD129 ;kilépés, ha vége LD B,0F1H ;szegmens felszabadítás kódja DEC E LD A,(DE) ;szegmensszám LD C,A ;C-be LD A,H ;a DISK:-hez megnyított csatorna száma PUSH DE ;szegmensmutató a verembe EXOS 0BH ; "Perform special function on channel" POP DE INC E JR ld119 ld128: PUSH AF ;hibakód a verembe LD129: LD A,H ;csatornaszám EXOS 03H ; "Close channel" POP AF ;hibakód LD (IY+1DH),00H ;kezdőszegmens számának törlése RET ;RAMDISK boot szektor alapértékek ld132: DW 200H ;512 bájt/szektor DB 01H ;1 szektor/cluster DW 01H ;1 boot szektor DB 02H ;2 FAT példány DW 00H ;főkönyvtár mérete, nincs kitöltve DW 00H ;szektorok száma, nincs kitöltve DB 2AH ;típusbájt ld13d: DB "VOL_ID" DB 00H ;UNDEL jelzőbájt DB 00H,00H,00H,00H ;lemezazonosító