;29.12.2006 ;22:03 ;verze 102 ;(c)MTs MDOS 2.1 ;FDC: GM82C765B, Intel8272, ; wd37c65c ;IDE: Zilog's divIDE ;MAKE: ;1.assembly ;2.load mdos20 na 49152 ;3.randomize usr 23296 ;4.assembly ;5.load pack na 62932 ;6.save mdos21 49152,16384 ;A0FREE21 ukazuje volne misto! org 23296 ent $ DROM equ 49152 DFREE equ #279F DSYS equ 16124 LAST equ 14336 ;promenne MDOSu (uz davno dane) FATBUF equ #3C00 MOVEPAR equ #3E8A SYSFLAG equ #3EF7 SNAPMOD equ #3EF8 FYZST equ #3EF9 FYZSC equ #3EFA FYZSIDE equ #3EEB DEBUG equ #3E60 SAVESP equ #3FFE XRWSSO equ #3ED4 RWSSO equ #3EEB DOSIX equ #3EE7 KILFAT equ #217B FYZLOG equ #1DE9 FILBL equ #248E A0LOGO equ 13780 ;42 bytes buffery na kde co BUFF10 equ 16256 BUFF32 equ 16256+10 ;dodatky pro 100% write (6b) XERR equ #3ED5 XHL equ #3ED6 XDE equ #3ED8 XSP equ #3EDA ;konstatnty (IDE) ;R/W mozno i #21,#31 C_READ equ #20 C_WRITE equ #30 C_IDENT equ #EC ;porty REG_DATA equ 163 REG_STAT equ 191 REG_ERR equ 167 REG_SECN equ 171 REG_LBAL equ 175 REG_LBAH equ 179 REG_LBAD equ 183 REG_LBAE equ 187 ;nove syst promenne NMIEXIT equ #3E7D ;operace (#20 read, #30 write) OPER equ #3E68 ;HL-adresa cteni/zapisu ADR equ #3E69 ;format (0-ne, jinak ano) FORMAT equ #3EEA START nop ; call SHADE ; ld hl,0 ; ld de,49152 ; ld bc,16384 ; ldir ld hl,DROM+DFREE ld d,h ld e,l inc de ld bc,6240 ld (hl),255 ldir jp #1700 SHADE push af ei xor a ld h,a ld l,a or (hl) jr z,SHADE_E di ld a,79 ld de,SHADEBUF-#001A ld (SHADEBUF),hl ld hl,16119 ld (SHADEBUF+2),hl call #25AB rst 0 SHADE_E pop af ret SHADEBUF defb 0,0,0,0 ;** nejdrive opravime chyby ** ;a) prkotiny ;rst 0 ; put DROM+#0066 ; rst 0 ; jp (hl) ; put DROM+#2792 ; defb 0,0,0,0,0 ;drive, ne disketa! put DROM+#0894 ld a,(ix+6) ;bezpecnejsi je sla a srl put DROM+#1390 sla c put DROM+#1DE5 sla b put DROM+#24C6 srl b ;nepouzivane promenne ;pozije MDOS21 (oper, adr) put DROM+#1C94 defb 0,0,0,0,0,0 dec a defb 0,0,0 put DROM+#2188 defb 0,0,0,0,0,0 dec a defb 0,0,0 put DROM+#1990 defb 0,0,0 ;sjednotime to (ix,a,b) put DROM+#236F ld ix,#25EE ld a,0 ld b,2 ;fucking DAA !! put DROM+#15F3 ld bc,10*256+255 PCYKL inc c sub b jr nc,PCYKL add a,b push af ld a,c call #1609 pop af defb 0,0,0,0,0,0,0,0 ;zdravotni pauza put DROM+#223E call #2764 ;b) vazne chyby ;zjistovani cisla strany put DROM+#25A0 call GETID put DROM+#25A7 defb 0,0,0,0,0,0,0,0 defb 0,0,0 put DROM+#2770 ld a,0 ld (RWSSO),a defb 0,0,0 ret put DROM+#2480 ld (XRWSSO),a put DROM+#2779 jp ZCIS defb 0,0,0,0,0,0,0,0 defb 0,0,0,0,0,0,0 put DROM+#238E call XRWTRAN ;7,(ix+0) zadne RES po chybe! ;presmeruje se to na bit 6 put DROM+#24DA bit 6,(ix+0) ;jr nz defb #20 put DROM+#24EF defb 0,0,0,0,0,0,0 ld c,a defb 0,0,0,0 set 6,(ix+0) put DROM+#2504 res 6,(ix+0) put DROM+#2531 set 6,(ix+6) ;pouzivame 0,5,6,7 ;ostatni volne ;0 - drive pripojen (1) ;5 - strana 1 = 2 (1) ;6 - error, bude seek (1) ;7 - mechanika se toci (1) put DROM+#222E ld (ix+0),0 ld (ix+0),0 ;jr nc,DRWER1 put DROM+#23C2 defb 247 put DROM+#1DEA jp FYZLOGDE put DROM+#1DFA jp LOGFYZDE ; ** vylepseni ** ;treti nahodny byte + texty put DROM+#1404 call MYFORMAT ;debug shit put DROM+#00EB ld bc,32765 ld a,16 out (c),a defb 0,0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 ;snapy put DROM+#033A nop ld hl,16256 ;cislo se nikdy neprepise ;xx ano (snapu nemuze byt vic ;jak 99, foto ale ano!) put DROM+#1620 SNAP3 call #217B call #1C8F call #212B ret nz ld hl,#3E93 inc (hl) ld a,(hl) cp "9"+1 jr c,SNAP3 ld (hl),"0" dec hl inc (hl) ld a,(hl) cp "9"+1 jr c,SNAP3 ld (hl),"x" dec hl ld (hl),"x" ret ret ret ;adresa pro NMI (skok SNAP) put DROM+#01AC defw NMI ;stisk tlacitka SNAP put DROM+#70 jp SNAPTST defb 0 ;spusteni snapu put DROM+#0359 ld hl,195*256+0 jp RUNSNAP2 put DROM+#0376 ld hl,195*256+251 jp RUNSNAP2 ;savesnap (odchyt save obr only put DROM+#0344 call SAVESNAP ;ret na snap put DROM+#34A call SNPRET ;CAT (vypis i Hidden!) put DROM+#1190 defb 0,0 put DROM+#121B defb 0,0 ;CAT + put DROM+#11E0 jp MYCAT defb 0,0 ;LIST * put DROM+#0971 defb 128 defm "MDOS Release: " defm "2.1 (29.12.06) " defb 13 defm "(c) 93-06 " defm "Didaktik & MTs " put DROM+#089D ld a,"," rst 16 ld a," " rst 16 nop nop put DROM+#08CC ld a,"," rst 16 ld a," " rst 16 nop nop put DROM+#08EF ld a,13 rst 16 ld a,13 rst 16 defb 0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 defb 0,0,0,0,0 ;FORMAT put DROM+#1563 defb 13+128 put DROM+#1582 defb 13+128 put DROM+#15B0 ;bad defb 0,0,0 put DROM+#137E call #15C7 put DROM+#15C5 ;jr VTRACK defb 24,12 ld a,4 ld de,#14F1 call #01C8 ld a,(15979) ret ;protect (retry=stejny radek) put DROM+#0574 defm "Write " defm 'protected' defm "Internal (MDOS)" defm ' error!' put DROM+#16A9 ;88 bytes free ;IN: BC-kolik, HL-odkud zacit ; A-co hledame ;OUT: c,not found a vse jak IN ; nc,A+BC jako IN, DE-oblast SEARCH push hl pop ix ld d,b ld e,c SEARCH1 cp (hl) inc hl jr z,SEAYES ld b,d ld c,e SEAYESR inc h dec h jr nz,SEARCH1 push ix pop hl ld b,d ld c,e scf ret SEAYES dec bc inc c dec c jr nz,SEAYESR inc b dec b jr nz,SEAYESR ld b,d ld c,e sbc hl,bc ex de,hl or a ret B0SEARCH equ $-SEARCH ;** podpora divIDE ** ;chceme funkcni 4 mechaniky put DROM+#1106 cp 4 put DROM+#110B ret put DROM+#165C cp 4 put DROM+#130F ld hl,#3E80 put DROM+#1351 ld a,(ix+5) put DROM+#08AE cp "E" put DROM+#08DD cp "E" ;logo divide pri resetu put DROM+#0111 ld hl,16384 ld de,16385 ld bc,6912-1 ld (hl),0 ldir ld a,0 out (254),a ld sp,16384 call OBRAZEK ;ocmuchani diskety put DROM+#1ECB cp 15 ;reset put DROM+#2277 call IDE_INIT ;DSELECT (rozbehnuti mechanik) put DROM+#2564 call IDE_SEL ;9526 (vypnuti motoru) put DROM+#2613 call IDE_OFF ;CHRKS (test ready) put DROM+#2599 jp IDE_CHR ;HOME put DROM+#234B jp IDE_HOME ;SEEK put DROM+#2340 jp IDE_SEEK ;DREAD put DROM+#236F jp IDE_READ nop ;DWRITE put DROM+#23CE jp IDE_WRI nop ;DFORMA put DROM+#2410 jp IDE_FORM nop ;MOVE "drive:dN,nnnnn,w" put DROM+#131D jp IDE_MOVE ;LIST + put DROM+#0870 jp MYLIST defb 0,0 ;** nove podprogramy ** org DFREE put DROM+DFREE ;normalni (netucne) fonty FNT0 defb 0,60,70,74 defb 82,98,60,0 FNT1 defb 0,24,40,8 defb 8,8,62,0 FNT2 defb 0,60,66,02 defb 60,64,126,0 FNT3 defb 0,60,66,12 defb 2,66,60,0 FNT4 defb 0,8,24,40 defb 72,126,8,0 FNT5 defb 0,126,64,124 defb 2,66,60,0 FNT6 defb 0,60,64,124 defb 66,66,60,0 FNT7 defb 0,126,2,4 defb 8,16,16,0 FNT8 defb 0,60,66,60 defb 66,66,60,0 FNT9 defb 0,60,66,66 defb 62,2,60,0 FNTA defb 0,0,56,4 defb 60,68,60,0 FNTB defb 0,32,32,60 defb 34,34,60,0 FNTC defb 0,0,28,32 defb 32,32,28,0 FNTD defb 0,4,4,60 defb 68,68,60,0 FNTM defb 0,0,104,84 defb 84,84,84,0 FNTS defb 0,0,56,64 defb 56,4,120,0 FNTF defb 0,12,16,24 defb 16,16,16,0 FNTW defb 0,0,68,84 defb 84,84,40,0 FNTCARKA defb 0,0,0,0 defb 0,8,8,16 FNTDVOJT defb 0,0,0,16 defb 0,0,16,0 FNTPOMLC defb 0,0,0,0 defb 62,0,0,0 FNTSPACE defb 0,0,0,0 defb 0,0,0,0 T_DRIVE defm "a:fdd " defm "b:fdd " defm "c:fdd " defm "d:fdd " MYTEXT defm "Formated with " defm "MDOS_2 (MTs " defm "edition)." T_IDENT0 defm "IDENTIFY DEVICE" defm " (#EC)" defb 13,13,13 defm "master:" defb 13,13+128 T_IDENT1 defm 'sn: ' T_IDENT2 defm 'firmware: ' T_IDENT3 defb 13,13,13,13 defm "slave:" defb 13,13+128 ;identify, LIST + MYLIST cp "*" jp z,#0875 cp "!" jp nz,#06C6 rst #20 call #1057 ld a,13 rst #10 ld hl,T_IDENT0 call PRINTAT ld a,%01000000 call IDENTREA ld hl,T_IDENT3 call PRINTAT ld a,%01010000 call IDENTREA jp KILFAT IDENTERR ld hl,#3800 ld de,#3800+1 ld bc,511 ld (hl)," " ldir ret IDENTREA ld ix,#3C00 ld (ix+11),a ld hl,#3800 ld a,255 ld bc,0 ld de,0 call 14333 inc c dec c call nz,IDENTERR ld hl,#3800+54 ld b,20 call IDENTASC ld a,13 rst #10 ld hl,T_IDENT1 call PRINTAT ld hl,#3800+20 ld b,10 call IDENTASC ld a,13 rst #10 ld hl,T_IDENT2 call PRINTAT ld hl,#3800+46 ld b,4 IDENTASC push bc inc hl ld a,(hl) push hl rst #10 pop hl dec hl ld a,(hl) push hl rst #10 pop hl inc hl inc hl pop bc djnz IDENTASC ret PRINTAT ld a,(hl) and 127 push hl rst #10 pop hl bit 7,(hl) inc hl jr z,PRINTAT ret ;u tst ready se nacte strana 0 ;a porovna se jeji stopa s ix+4 ;6,ix+0 se zapne pri chybe GETID res 6,(ix+0) res 5,(ix+0) call #2469 ld c,a jr nz,GETID_NF ld a,b cp 64 jr nc,GETID_NF ld a,(ix+4) cp c ret z GETID_NF set 6,(ix+0) ret ;pokud nenajde ID pole ;pokusi se zjistit zda to neni ;cislem strany ;u strany 2 zapne set 5,ix+0 ;(vypina se rady testem) ;A=0 read,1 write, 2 format ;E=o ktere opakovani jde XRWTRAN push af push bc ld b,a ld a,(RWSSO) or a jp z,XRWTRAN3 ld a,e cp 3 jp nc,XRWTRAN3 ;u formatu bude vzdy strana 1 ld a,b cp 2 ld a,1 jr z,XRWTRAN2 call #2469 jp nz,XRWTRAN3 ld a,b cp 64 jp nc,XRWTRAN3 ld a,(XRWSSO) cp 2 jp nz,XRWTRAN3 ld bc,(DOSIX) ld a,(bc) set 5,a ld (bc),a ld a,2 XRWTRAN2 ld (RWSSO),a XRWTRAN3 pop bc pop af jp #2734 ;podpora strany 2 (mdos1) ZCIS ld (RWSSO),a or a ret z ld a,1 ld (RWSSO),a bit 7,d ret nz bit 5,(ix+0) ret z ld a,2 ld (RWSSO),a ;debug out (254),a ret ;prikaz CAT+ MYCAT cp "-" jp z,#115A cp "+" jp nz,#11E5 rst #20 call #0FC0 call #1043 call #107C call #1C8F ld a,2 rst #28 defw #1601 xor a ld de,#129E call #01C8 call #2199 call #128D ld a,23 rst 16 ld a,27 rst 16 xor a rst 16 push hl push de push bc ld hl,BUFF10 ld d,h ld e,l ld (hl)," " inc hl ld (hl)," " inc hl ld (hl),"f" inc hl ld (hl),"d" inc hl ld (hl),"d" bit 7,(ix+11) jr z,PRNTDISK inc hx ld h,(ix+9) ld l,(ix+8) dec hx call DEC5 PRNTDISK call RST16E5 pop bc pop de pop hl ld a,13 rst 16 ld a,13 rst 16 ld a,255 ld c,0 CATLOOP call #212D jp nz,#11A2 inc c push af push bc push hl ld a,(hl) inc hl rst 16 ld a,32 rst 16 call #128D pop hl push hl ld a,11 call #0FAD push ix ld ix,#3ED4 ld a,(hl) ld (ix+0),a inc hl ld a,(hl) ld (ix+1),a inc hl ld c,(hl) inc hl ld b,(hl) push bc ld a,9-2 call #0FAD ld a,(hl) ld (ix+2),a ld a,23 rst 16 ld a,12 rst 16 xor a rst 16 call #0F14 ld a," " rst 16 ld a,"<" rst 16 pop hl pop ix ld de,BUFF10 call DEC5 call RST16E5 ld a,">" rst 16 ld a," " rst 16 pop hl ld a,19 call #0FAD ld l,(hl) ld h,0 ld de,BUFF10 push de ld a,"-" ld (de),a inc de ld (de),a inc de ld (de),a dec de dec de inc l dec l call nz,DEC3 pop hl ld e,3 call RST16E ld a,13 rst 16 pop bc pop af jp CATLOOP RST16E5 ld e,5 ld hl,BUFF10 RST16E ld a,(hl) inc hl rst 16 dec e jr nz,RST16E ret ;prikaz MOVE (rozsireni) IDE_MOVE ldir NMIMOVE call #1118 ld (16042),a ld (16000),a sub "A" ld (15985),a ld (15982),a ld (15979),a xor a ld (16043),a ld (16001),a call KILFAT call IXAB ld hl,MOVEPAR ld a,(hl) or a ;klasika MOVE "drive:" ret z ;dN,nnnnn,w ;d - s=slave ; - f=zpet fdd jako po resetu ; jinak master ;N - 1,2,3,4=oddil (partition) ; 0=begin at sector SEC1USER ; jinak sector 2 ;nnnnn - 0-65535 (virt disketa) ;w - write protect ON,jinak OFF call #1118 cp "F" jp z,MOVEFDD set 0,(ix+0) res 2,(ix+5) set 4,(ix+5) res 5,(ix+5) ld (ix+6),80 ld (ix+7),9 ld (ix+11),128+64 cp "S" jr nz,MASTER set 4,(ix+11) MASTER inc hl ld a,(hl) sub "0" push af inc hl inc hl push hl ld b,6 HLEDEJ ld a,(hl) inc hl cp "," call z,WP djnz HLEDEJ pop de call GETNUMHL pop af push hl call PARTITIO pop hl push hl call IDESEC ld (ix+8),l ld (ix+9),h ld (ix+10),d ld a,e and %00001111 ld e,a ld a,(ix+11) and %11110000 or e ld (ix+11),a inc hx xor d xor h xor l ld (ix+11),a pop hl ld (ix+8),l ld (ix+9),h MOVEEND ld hl,MOVEPAR ld de,MOVEPAR+1 ld bc,9 ld (hl),b ldir ret WP ld a,(hl) call #1118 cp "W" ret nz set 5,(ix+11) ret MOVEFDD xor a ld e,lx ld d,hx ld h,d ld l,e inc h ld bc,12 ldir ld (ix+8),a ld (ix+9),a ld (ix+10),a ld (ix+11),a bit 0,(ix+0) jr z,MOVEEND call IXAB call 9547 call 9035 call 9526 jr MOVEEND ;IN: A-0,1,2,3,4 ;OUT:BCDE - LBA startsektor PARTITIO or a ld bc,(SEC1USER+2) ld de,(SEC1USER) ret z ld de,2 ld b,d ld c,d cp 5 ret nc ld (ix+8),a ld a,i push af pop bc di ld (ix+9),c GALBUG1 call IDE_BUSY jr z,ENDREAB0 ld a,C_READ ld (OPER),a ld a,(ix+11) and %00010000 or %10100000 ld hl,1 ld d,h call IDE_COMM jr z,ENDREAB0 ld hl,LOGSEC push hl ld c,REG_DATA ld de,454 CTI1 ini dec hl dec de ld a,d or e jr nz,CTI1 ld b,58-2 inir in a,(REG_STAT) ini ini bit 3,a ld b,(ix+8) pop hl jr z,GALBUG1 call RWF2 ld a,c or a jr nz,ENDREAB0 ld de,16 sbc hl,de FINDPART add hl,de djnz FINDPART ld e,(hl) inc hl ld d,(hl) inc hl ld c,(hl) inc hl ld b,(hl) jr ENDREAB ENDREAB0 ld de,2 ld b,d ld c,d ld a,e out (254),a ENDREAB ld l,(ix+9) push hl pop af ret po ei ret OBRAZEK call A0LOGO ld hl,1693 ld (SECMAX),hl ld hl,2 ld (SEC1USER),hl ld l,h ld (SEC1USER+2),hl ld a,255 ld (FORMAT),a ;A0XXX jp NMI jp #2216 MYFORMAT halt ld a,r ld (FATBUF+208),a ld de,FATBUF ld hl,MYTEXT ld bc,35 ldir ld de,FATBUF+#0C0 ret IDE_INIT call #2792 ld hl,15872 ld de,16128 ld bc,48 ldir ret IDE_SEL bit 7,(ix+11) ret nz jp #25BC IDE_OFF ld (BUFF10),ix call IXAB ld a,4 ld (FORMAT),a bit 7,(ix+11) ld ix,(BUFF10) ret nz jp #25BC IDE_CHR bit 7,(ix+11) jp nz,#25A3 call #2770 jp #259C IDE_HOME call IXAB bit 7,(ix+11) ld a,0 ret nz call #2618 jp #234E IDE_SEEK bit 7,(ix+11) jr z,IDE_SEE1 xor a ret IDE_SEE1 or a jp z,9035 jp #2343 IDE_READ bit 7,(ix+11) ld ix,#25EE jp z,#2373 push hl ld b,2 ld a,C_READ GO_RWF push bc call IDE_RWF END_RWF pop hl ld b,h ld d,c bit 7,c jr z,RWFE ld b,1 RWFE pop hl jp #2520 IDE_WRI bit 7,(ix+11) ld ix,#25FF jp z,#23D2 push hl ld b,3 ld a,C_WRITE jr GO_RWF IDE_FORM bit 7,(ix+11) ld ix,#25FF jp z,#2414 ld (BUFF10+4),hl ld a,(FORMAT) ld c,a or a jr z,FORME ld b,0 ld a,229 ld hl,14336 call FILBL call FILBL call IXAB ld hl,(SECMAX) F_DOIT dec hl push hl ld de,14336 ld a,C_WRITE ld (OPER),a ld (ADR),de ld a,h or l jr nz,NOINFO ld h,d ld l,e ld b,a call FILBL call FILBL ld hl,#0F10 ld c,4 ldir inc hx ld l,(ix+8) ld h,(ix+9) dec hx call DEC5 ld hl,0 NOINFO call INFORM pop hl inc c dec c jr nz,FORME ld a,h or l jr nz,F_DOIT ld (FORMAT),a FORME ld hl,(BUFF10+4) push hl ld b,3 push bc jp END_RWF ;in HL-kam, IX+11 info o IDE ;BCDE - LBA sektor ;A- 0=read,1=write, 2-254 n/a ; 255=identify ;out: c-kod chyby (0-ok) REWR_LBA ld (ADR),hl ld h,C_READ or a jr z,DOIT ld h,C_WRITE cp 1 jr z,DOIT ld h,C_IDENT inc a jr z,DOIT DOIT ld a,h ld (OPER),a ex de,hl ld e,b ld d,c res 7,(ix+11) jr FYZLBA ;pri zakmitu a volalo se 14333 GAL14333 ld hl,(XHL) ld de,(XDE) ld a,e jr FYZLBA ;fyzicke R/W IDE media IDE_RWF ld (OPER),a ld (ADR),hl call IXAB ld a,(FYZSC) ld c,a dec c ld a,(FYZST) ld b,a bit 4,(ix+1) jr z,SINGLE ld a,(FYZSIDE) rrca rl b SINGLE call FYZLOG ;inc kvuli Sweetovi inc hl INFORM bit 7,(ix+11) jr z,GAL14333 ld (LOGSEC),hl ld l,(ix+8) ld h,(ix+9) ld d,(ix+10) ld e,(ix+11) ld a,e xor d xor h xor l inc hx ld b,(ix+11) dec hx ;4=internal error ld c,4 cp b ret nz ld a,e ld bc,(LOGSEC) add hl,bc jr nc,RWF1 inc d jr nz,RWF1 and %00001111 inc a RWF1 and %00001111 ld e,a FYZLBA call IDE_BUSY ;128=not ready ld c,128 ret z ld a,(OPER) cp C_WRITE ld a,(ix+11) jr nz,WP_NO bit 5,a ;64=write protect ld c,64 ret nz WP_NO and %01010000 or %10100000 or e ld (XHL),hl ld e,a ld (XDE),de call IDE_COMM ld c,128 ret z ld a,(OPER) ld hl,(ADR) ld bc,REG_DATA cp C_WRITE jr z,WRITE inir dec b dec b inir in a,(REG_STAT) ini ini bit 3,a jp nz,RWF2 GALBUG2 ld hl,(LOGSEC) jr INFORM WRITE otir dec b dec b otir in a,(REG_STAT) outi outi bit 3,a jr z,GALBUG2 ;odtud se nesmi hnout s SP ;potrebujem 6 bytes pro SP ld (XSP),sp ld sp,XSP+8 call RWF2 inc c dec c jr nz,XRETCRC ld a,C_READ ld (OPER),a call XCRC ld a,C_WRITE ld (OPER),a ld hl,(ADR) inc h inc h XRETCRC ld sp,(XSP) ret XCRC call IDE_BUSY ld c,128 ret z ld hl,(XHL) ld de,(XDE) ld a,e call IDE_COMM ld c,128 ret z ld hl,(ADR) ld bc,REG_DATA ld e,b XCRCR1 in a,(c) cp (hl) call nz,XCRCR3 inc hl djnz XCRCR1 dec b dec b XCRCR2 in a,(c) cp (hl) call nz,XCRCR3 inc hl djnz XCRCR2 in a,(REG_STAT) ld d,a in a,(c) cp (hl) call nz,XCRCR3 inc hl in a,(c) cp (hl) call nz,XCRCR3 inc hl bit 3,d jr z,XCRC call RWF2 inc c dec c ret nz ;v E je verify error inc e dec e ld c,8 ret nz ld c,0 ret RWF2 in a,(REG_STAT) ld c,a ld a,(XERR) or c and 1 ;0=vse ok ld c,0 and 1 ret z in a,(REG_ERR) ;8=CRC error ld c,8 bit 6,a ret nz ;16=sector not found ld c,16 ret ;SRAM 15872-16383 musime ;odfiltrovat protoze se meni:-) ;(H je 62 a 63) XCRCR3 ld a,h cp 62 ret z cp 63 ret z ld e,1 ret IDE_BUSY ld bc,0 BUSY1 dec bc ld a,b or c ret z in a,(REG_STAT) bit 7,a jr nz,BUSY1 ld bc,0 DRQ11 dec bc ld a,b or c ret z in a,(REG_STAT) bit 3,a jr nz,DRQ11 or 255 ret IDE_COMM out (REG_LBAE),a ld a,1 out (REG_SECN),a ld a,l out (REG_LBAL),a ld a,h out (REG_LBAH),a ld a,d out (REG_LBAD),a ld a,(OPER) out (REG_STAT),a IDE_DRQ ld bc,0 DRQ1 dec bc ld a,b or c ret z in a,(REG_STAT) bit 3,a jr z,DRQ1 and 1 ld (XERR),a or 255 ret ;SNAP, NMI atd. SNAPTST ld (#3EEC),bc ld a,h or a jp nz,#74 ld a,l cp #67 jp nz,#74 ld hl,(#01AC) jp #00B0 SAVESNAP ld a,(SNAPMOD) or a ld a,0 ld (SNAPMOD),a jr nz,SFOTO ld hl,16256 ld de,49280 SAVSNE push de push hl call #1620 pop hl pop de ei ld (#3E74),hl jp #1A00 SFOTO ld a,"F" ld (#3E8A),a ld a,"O" ld (#3E8A+1),a ld (#3E8A+3),a ld a,"T" ld (#3E8A+2),a ld a,"B" ld (#3E8A+10),a ld hl,16384 ld de,6912 jr SAVSNE RUNSNAP2 push af pop bc ld i,a bit 1,c jr z,SNAOLD ld a,(#3FE7) ld (SYSFLAG),a SNAOLD ld de,#1700 ld (BUFF10),hl ld (BUFF10+2),de ;4 je navrat z nmi menu ;s prerusenim se nehlo bit 4,c jr nz,IM1 NROM ld a,254 in a,(254) rra jr nc,IM1 ld a,127 in a,(254) rra rra jr nc,IM2 ld a,i cp 63 jr z,IM1 IM2 im 2 IM1 pop iy pop ix pop hl pop de pop bc pop af ex af,af' exx pop hl pop de pop bc pop af ld sp,(SAVESP) ;tam je: ;EI, #1700 nebo NOP, #1700 jp BUFF10 ;snapret SNPRET call #2536 jp KILFAT ;NMI menu (tlacitko snap) NMI ld (SAVESP),sp ld sp,SAVESP push af push bc push de push hl exx ex af,af' push af push bc push de push hl push ix push iy ld bc,(#3EEC) set 1,c set 4,c push bc ld a,10 ld e,8 call AYHALT call IXAB call #2536 call PAUSE jr NMIKEY ;SS+CS - perfect non seek reset NONSEEK ld a,14 ld e,0 call AYHALT call PAUSE ld a,16 ld bc,32765 out (c),a call #217B ;rst 0 ld a,199 ld (#66),a xor a ld (DEBUG),a ld (#3E61),a ld (#3E62),a ld (#3E7C),a ld (#3EE2),a ld (#3EEE),a ld hl,#3EEF ld b,8 DOCRC ld a,h xor l ld (hl),a inc hl djnz DOCRC ld (hl),32 jp #0129 ;SS+Q - vzdy 100% funkcni reset HRKHRK ld a,14 ld e,0 call AYHALT call PAUSE ld sp,22528 ld a,32 ld (SYSFLAG),a ld hl,0 push hl jp (hl) KFOTOV2 ld a,23 ld bc,32765 out (c),a ld hl,49152 ld de,16384 ld bc,6912 ldir ld a,16 ld bc,32765 out (c),a jp KFOTO KVRAM2 ld a,16 ld bc,32765 out (c),a call PAUSE NMIKEY ld a,d and %00000001 ld e,a ld a,(#3EED) cp 63 ld a,e jr z,ASIIM1 rlca ASIIM1 out (254),a ld a,127 in a,(254) bit 1,a jr z,RESET bit 2,a jp z,KEYMNMI bit 4,a jr z,KBASIC ld a,253 in a,(254) bit 1,a jr z,KSNAP bit 3,a jr z,KFOTO bit 4,a jr z,KFOTOV2 bit 2,a jr z,KDEVAST ld a,251 in a,(254) bit 0,a jr z,KQUIT ld a,254 in a,(254) bit 4,a jr z,KVRAM2 nop nop ld e,137 DEC dec e jr nz,DEC inc d jr NMIKEY KQUIT pop bc ;nesmi se obnovit sysflag res 1,c push bc call BORDER jp #034E RESET ld a,251 in a,(254) rra jp nc,HRKHRK ld a,254 in a,(254) rra jp nc,NONSEEK jr NMIKEY KBASIC call BORDER im 1 ld iy,23610 ld a,63 ld i,a ld sp,(23613) ld hl,7030 push hl ei jp #1700 KSNAP xor a defb 33 KFOTO ld a,255 ld (SNAPMOD),a call BORDER ld a,(DEBUG) bit 7,a jr z,KFOTO2 ;SRAM to Screen (debug mode) ld hl,14336 ld de,16384 ld bc,2048 ldir res 7,a ld (DEBUG),a KFOTO2 pop bc res 4,c push bc ld a,(SYSFLAG) push af im 1 jp #0301 KDEVAST call BORDER pop bc ;bude DI a zahod sysflag res 1,c res 2,c push bc ld hl,KDLDI ld de,22528+512 push de ld bc,B0KDLDI ldir ret KDLDI ld sp,23296 ld hl,#3EEF ld b,8 DOCRC2 ld a,h xor l ld (hl),a inc hl djnz DOCRC2 ld (hl),79 call #1700 ex (sp),hl ex (sp),hl ld a,128 out (227),a ld hl,0 ld de,16384 ld bc,4096 ldir ld de,22528 ld b,2 ldir ;crc devastace ld a,(8191) push af xor a out (227),a ex (sp),hl ex (sp),hl rst 0 di ld hl,16384 ld bc,4096 xor a CRCDEV1 xor (hl) inc hl dec bc ld d,a ld a,b or c ld a,d jr nz,CRCDEV1 ld hl,22528 ld bc,512 CRCDEV2 xor (hl) inc hl dec bc ld d,a ld a,b or c ld a,d jr nz,CRCDEV2 pop af cp d ;reset pokud nesedi crc jp nz,NONSEEK ld a,(SAVESP+1) cp 91 ld hl,0 ld sp,18139 jr c,SP_BAD ld sp,(SAVESP) pop hl SP_BAD ld (19328),hl ld hl,16387 push hl ld (SAVESP),sp jp DEVCLS ;max je 256 bytes len B0KDLDI equ $-KDLDI DEVCLS ld hl,20480 ld de,23296-1 ld bc,8*7 CLS1 ld (hl),b inc hl ld a,h cp 88 jr c,CLS1 ex de,hl CLS2 ld (hl),c dec hl djnz CLS2 jp #034E ;klavesa M v nmi KEYMNMI xor a out (254),a ld (NMIEXIT),a ld hl,23296 ld bc,64*8+64 call #16A9 jr nc,IHAVEIT ld a,229 call #16A9 jr nc,IHAVEIT ld a,1 out (254),a jr KMENUIDE IHAVEIT ld i,a ld a,1 out (254),a push de pop iy ld hx,8 ld hl,20672 IQLDI1 push hl ld bc,64 ldir pop hl inc h dec hx jr nz,IQLDI1 ld hl,23296-64 ld c,64 ldir ld a,255 ld (NMIEXIT),a KMENUIDE ld a,8*1+7 ld b,32 ld hl,23264-32 call FILBL ld a,7 ld b,32 call FILBL ld hl,T_DRIVE ld de,BUFF32 push de ld c,32 ldir call LOGOCOL pop de ld ix,15872 VWDRIVE inc de inc de bit 0,(ix+0) jr nz,FDDHDD ld b,5 ld a,"-" FILL32 ld (de),a inc de djnz FILL32 jr NEXTDRIV FDDHDD bit 7,(ix+11) jr nz,VWHDD inc de inc de inc de inc de inc de jr NEXTDRIV VWHDD inc hx ld h,(ix+9) ld l,(ix+8) call DEC5 dec hx NEXTDRIV inc de ld a,lx add a,12 ld lx,a cp 48 jr nz,VWDRIVE ld hl,23264-32 ld a,(15979) and %00000011 rlca rlca rlca add a,l ld l,a ld (hl),8*7+64 ld hl,20672 ld b,32 call PRINTFNT xor a ld hl,BUFF32 push hl ld b,32 call FILBL pop hl ld e,12 jp PRINTCOM KMKEY ld a,127 in a,(254) bit 2,a ld d,"m" jr z,CHARS2 bit 3,a ld d,"," jr z,CHARS2 bit 4,a ld d,"b" jr z,CHARS2 ld a,254 in a,(254) rra jp nc,EDIT rra ld d,":" jr nc,CHARSAVE rra rra ld d,"c" jr nc,CHARSAVE ld a,253 in a,(254) rra ld d,"a" jr nc,CHARSAVE rra ld d,"s" jr nc,CHARSAVE rra ld d,"d" jr nc,CHARSAVE rra ld d,"f" jr nc,CHARSAVE ld a,251 in a,(254) bit 1,a ld d,"w" CHARS2 jr z,CHARSAVE ld a,247 in a,(254) rra ld d,"1" jr nc,CHARSAVE inc d rra jr nc,CHARSAVE inc d rra jr nc,CHARSAVE inc d rra jr nc,CHARSAVE inc d rra jr nc,CHARSAVE ld a,239 in a,(254) rra ld d,"0" jr nc,CHARSAVE rra ld d,"9" jr nc,CHARSAVE dec d rra jr nc,CHARSAVE dec d rra jr nc,CHARSAVE dec d rra jr nc,CHARSAVE ld a,191 in a,(254) rra jr nc,KMEND jp KMKEY CHARSAVE ld a,1 out (254),a inc e dec e jp z,KMKEY ld (hl),d inc hl dec e PRINTCOM push hl ld hl,20704 ld b,32-5 call PRINTFNT pop hl call PAUSE jp KMKEY KMEND ld a,e cp 12 jr z,KMEND2 ld hl,BUFF32 cp 3 call z,KPOKEOUT ld a,(hl) ld b,a sub "a" jr c,KMEND2 cp 4 jr nc,KMEND2 inc hl ld a,(hl) cp ":" jr nz,KMEND2 inc hl ld a,b ld de,MOVEPAR ld bc,10 ldir call NMIMOVE jr KMEND3 KMEND2 ld a,2 KMEND4 out (254),a KMEND3 jp KMENUIDE KPOKEOUT push hl pop ix ld a,(ix+0) sub "0" ret c cp 10 ret nc ld a,(ix+5) cp "," jr z,KPOKE cp ":" jr z,KOUT ret KPOKE pop hl call GETVAL ld (bc),a ld a,4 jr KMEND4 KOUT pop hl call GETVAL out (c),a ld a,4 jr KMEND4 GETVAL ld de,BUFF32 call GETNUMHL push hl ld de,BUFF32+6 call GETNUMHL pop bc ld a,l ret EDIT ld a,247 in a,(254) rra jp c,KMKEY xor a ld b,64 ld hl,23296-64 call FILBL ld a,(NMIEXIT) or a jp z,NMIKEY push iy pop hl ld hx,8 ld de,20672 IQLDI2 push de ld bc,64 ldir pop de inc d dec hx jr nz,IQLDI2 ld de,23296-64 ld c,64 ldir ld a,i push iy pop hl ld d,h ld e,l inc de ld bc,8*64+64-1 ld (hl),a ldir jp NMIKEY ;HL adresa na obr PRINTFNT ld c,e ld de,BUFF32 PRINTF2 push bc call FINDNUM push de push hl sla c sla c sla c ld b,0 ld hl,FNT0 add hl,bc ex de,hl pop hl push hl ld b,8 PRINTF1 ld a,(de) ld (hl),a inc de inc h djnz PRINTF1 pop hl inc hl pop de pop bc djnz PRINTF2 ld e,c ret FINDNUM ld a,(de) inc de ld c,20 cp "-" ret z dec c cp ":" ret z dec c cp "," ret z dec c cp "w" ret z dec c cp "f" ret z dec c cp "s" ret z dec c cp "m" ret z dec c cp "d" ret z dec c cp "c" ret z dec c cp "b" ret z dec c cp "a" ret z ld c,21 sub "0" ret c cp 10 ret nc ld c,a ret LOGOCOL ld hl,20731 ld de,LOG_BUF ld b,8 LOG0 push bc push hl ld b,5 LOG1 ld a,(de) ld (hl),a inc hl inc de djnz LOG1 pop hl inc h pop bc djnz LOG0 xor a ld h,d ld l,e ld de,23296-6 ld (de),a inc de ld c,5 ldir ret LOG_BUF defb 1,254,254,254,254 defb 3,252,252,252,252 defb 7,248,248,248,248 defb 15 defb 240,240,240,240 defb 31 defb 224,224,224,224 defb 63 defb 192,192,192,192 defb 127 defb 128,128,128,128 defb 255,0,0,0,0 defb 66,114,102,76,65 ;pomocne podprogramy IXAB ld a,(15979) or a ld ix,15872 ret z ld lx,12 cp 1 ret z ld lx,24 cp 2 ret z ld lx,36 ret LOGFYZDE push af xor a ld c,(ix+3) ld b,16 DIV1 add hl,hl rla cp c jr c,DIV2 sub c inc l DIV2 djnz DIV1 ld b,l ld c,a ld l,a ld h,0 pop af pop de ret FYZLOGDE ld e,b ld hl,0 ld b,h ld d,h inc e dec e jr z,FYZL2 ld b,(ix+3) FYZL1 add hl,de djnz FYZL1 FYZL2 add hl,bc pop de ret ;IN: HL - cislo virt diskety ; BCDE - LBA start oddilu ;OUT: EDHL - LBA sektor IDESEC ld (BUFF10),de ld (BUFF10+2),bc push ix ld ix,0 ex de,hl ld hl,0 ld bc,(SECMAX) IDESEC1 add hl,de jr nc,IDESEC2 inc ix IDESEC2 dec bc ld a,b or c jr nz,IDESEC1 ld bc,(BUFF10) add hl,bc ld bc,(BUFF10+2) jr nc,IDESEC3 inc ix IDESEC3 add ix,bc ld d,lx ld e,hx pop ix ret DEC5 ld bc,10000 call DIGIT ld bc,1000 call DIGIT DEC3 ld bc,100 call DIGIT ld bc,10 call DIGIT ld bc,1 DIGIT ld a,"0"-1 DIGIT2 inc a or a sbc hl,bc jr nc,DIGIT2 add hl,bc cp "9"+1 jr c,DIGIT3 ld a,"A"-"9"-1 DIGIT3 ld (de),a inc de ret ;IN: DE-kde lezi 5 ascii num ;OUT:HL-number GETNUMHL ld b,5 ld hl,"0"*256+"0" ld (BUFF10),hl ld (BUFF10+2),hl ld (BUFF10+4),hl ld hl,BUFF10+5 GETNUM1 ld a,(de) cp 48 jr c,GETNUM2 cp 58 jr nc,GETNUM2 ld (hl),a inc hl inc de djnz GETNUM1 GETNUM2 dec hl dec hl dec hl dec hl dec hl push ix call UNASC5 pop ix ret UNASC5 push hl pop ix ld hl,0 ld de,10000 call UNAS ld de,1000 call UNAS ld de,100 call UNAS ld de,10 call UNAS ld de,1 UNAS ld a,(ix+0) inc ix sub "0" ret z ld b,a UNB add hl,de djnz UNB ret BORDER ld a,(23624) rra rra rra and %00000111 out (254),a PAUSE ld bc,10000 P1 ex (sp),hl ex (sp),hl dec bc inc b dec b jr nz,P1 ret AYHALT ld d,0 inc a TICHO dec a ld bc,65533 out (c),a ld b,191 out (c),d cp e jr nz,TICHO ret A0END21 nop A0LEN21 equ $-FNTA A0LENOBR equ LAST-A0LOGO A0FREE21 equ A0LOGO-A0END21 put DROM+14331 di halt jp REWR_LBA ;nove syst promenne org DSYS put DROM+DSYS SEC1USER defs 4 ;parametry mechanik (16128!!) ;inc hx MECHALL defs 48 ;sec/virt disk (1693) SECMAX defs 2 ;log sec LOGSEC defs 2 ;promenne tedy konci na 16180 ;16256-16180=76 bytes na ;zasobnik u sapu (musi stacit) A0LENSYS equ $-SEC1USER ;IX+8,9,10 LBA sector ;ix+11 7 FDD(0), IDE(1) ; 6 LBA (1) ; 5 write protect (1) ; 4 master(0),slave(1) ; 3,2,1,0 LBA high ;inc hx (kopie sys po resetu) ;IX+8,9 - cislo virt diskety ;IX+10 - volno ;IX+11 - xor LBA sektoru ;pozn. k 8255 & MDOS 2: ;-Kompakt ma vlastni 8255 ; OUTovanim se nic nedosahne ;-D80 (MDOS 2) 8255 blokovan ; OUT 153,00/16 (16 odblokuje) ; OUT 151,00/32 (32 odbolkuje) ; 151,32 = povoleni OUTu 153 ; pokud MDOS 2 najde jiny 8255 ; OUT 151,32 vubec neprovede! ; (jinak ano - ale uziv. musi ; stejne pak na 153 IO povolit A0END21 13752 A0FREE21 00028 A0LEN21 03530 A0LENOBR 00556 A0LENSYS 00056 A0LOGO 13780 ADR 15977 ASIIM1 12404 AYHALT 13735 B0KDLDI 00122 B0SEARCH 00038 BORDER 13714 BUFF10 16256 BUFF32 16266 BUSY1 11994 CATLOOP 10815 CHARS2 13008 CHARSAVE 13071 CLS1 12721 CLS2 12729 CRCDEV1 12651 CRCDEV2 12666 CTI1 11247 C_IDENT 00236 C_READ 00032 C_WRITE 00048 DEBUG 15968 DEC 12463 DEC3 13591 DEC5 13579 DEVCLS 12712 DFREE 10143 DIGIT 13606 DIGIT2 13608 DIGIT3 13621 DIV1 13489 DIV2 13496 DOCRC 12319 DOCRC2 12598 DOIT 11637 DOSIX 16103 DROM 49152 DRQ1 12043 DRQ11 12007 DSYS 16124 EDIT 13209 ENDREAB 11305 ENDREAB0 11297 END_RWF 11472 FATBUF 15360 FDDHDD 12859 FILBL 09358 FILL32 12853 FINDNUM 13319 FINDPART 11285 FNT0 10143 FNT1 10151 FNT2 10159 FNT3 10167 FNT4 10175 FNT5 10183 FNT6 10191 FNT7 10199 FNT8 10207 FNT9 10215 FNTA 10223 FNTB 10231 FNTC 10239 FNTCARKA 10287 FNTD 10247 FNTDVOJT 10295 FNTF 10271 FNTM 10255 FNTPOMLC 10303 FNTS 10263 FNTSPACE 10311 FNTW 10279 FORMAT 16106 FORME 11608 FYZL1 13519 FYZL2 13522 FYZLBA 11747 FYZLOG 07657 FYZLOGDE 13506 FYZSC 16122 FYZSIDE 16107 FYZST 16121 F_DOIT 11543 GAL14333 11650 GALBUG1 11212 GALBUG2 11817 GETID 10595 GETID_NF 10619 GETNUM1 13641 GETNUM2 13655 GETNUMHL 13624 GETVAL 13193 GO_RWF 11468 HLEDEJ 11053 HRKHRK 12330 IDENTASC 10566 IDENTERR 10487 IDENTREA 10501 IDESEC 13525 IDESEC1 13547 IDESEC2 13552 IDESEC3 13570 IDE_BUSY 11991 IDE_CHR 11408 IDE_COMM 12020 IDE_DRQ 12040 IDE_FORM 11503 IDE_HOME 11421 IDE_INIT 11361 IDE_MOVE 10958 IDE_OFF 11384 IDE_READ 11452 IDE_RWF 11660 IDE_SEE1 11445 IDE_SEEK 11437 IDE_SEL 11376 IDE_WRI 11485 IHAVEIT 12766 IM1 12195 IM2 12193 INFORM 11694 IQLDI1 12781 IQLDI2 13242 IXAB 13457 KBASIC 12497 KDEVAST 12568 KDLDI 12590 KEYMNMI 12736 KFOTO 12524 KFOTO2 12555 KFOTOV2 12353 KILFAT 08571 KMEND 13099 KMEND2 13143 KMEND3 13147 KMEND4 13145 KMENUIDE 12805 KMKEY 12935 KOUT 13183 KPOKE 13174 KPOKEOUT 13150 KQUIT 12469 KSNAP 12522 KVRAM2 12381 LAST 14336 LOG0 13384 LOG1 13388 LOGFYZDE 13482 LOGOCOL 13376 LOGSEC 16178 LOG_BUF 13412 MASTER 11043 MECHALL 16128 MOVEEND 11113 MOVEFDD 11138 MOVEPAR 16010 MYCAT 10709 MYFORMAT 11340 MYLIST 10445 MYTEXT 10351 NEXTDRIV 12885 NMI 12222 NMIEXIT 15997 NMIKEY 12391 NMIMOVE 10960 NOINFO 11593 NONSEEK 12270 NROM 12172 OBRAZEK 11313 OPER 15976 P1 13727 PARTITIO 11183 PAUSE 13724 PCYKL 23389 PRINTAT 10583 PRINTCOM 13083 PRINTF1 13305 PRINTF2 13282 PRINTFNT 13278 PRNTDISK 10799 REG_DATA 00163 REG_ERR 00167 REG_LBAD 00183 REG_LBAE 00187 REG_LBAH 00179 REG_LBAL 00175 REG_SECN 00171 REG_STAT 00191 RESET 12479 REWR_LBA 11618 RST16E 10951 RST16E5 10946 RUNSNAP2 12144 RWF1 11744 RWF2 11957 RWFE 11481 RWSSO 16107 SAVESNAP 12082 SAVESP 16382 SAVSNE 12099 SEARCH 23773 SEARCH1 23778 SEAYES 23795 SEAYESR 23784 SEC1USER 16124 SECMAX 16176 SFOTO 12113 SHADE 23313 SHADEBUF 23342 SHADE_E 23340 SINGLE 11690 SNAOLD 12158 SNAP3 23531 SNAPMOD 16120 SNAPTST 12061 SNPRET 12216 SP_BAD 12698 START 23296 SYSFLAG 16119 TICHO 13738 T_DRIVE 10319 T_IDENT0 10386 T_IDENT1 10419 T_IDENT2 10423 T_IDENT3 10433 UNAS 13701 UNASC5 13668 UNB 13710 VWDRIVE 12841 VWHDD 12872 WP 11126 WP_NO 11768 WRITE 11822 XCRC 11875 XCRCR1 11902 XCRCR2 11913 XCRCR3 11981 XDE 16088 XERR 16085 XHL 16086 XRETCRC 11870 XRWSSO 16084 XRWTRAN 10624 XRWTRAN2 10677 XRWTRAN3 10680 XSP 16090 ZCIS 10685