;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;:::::::::: F L O P P Y   G A M E  __ I N S T A L A T O R :::::::::::
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;::::::::::::::::::::::::::: (c) 1991,Svatopluk Svec ::::::::::::::::
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

; soubor slouzi jako setup pro spousteni vicedilnych her na floppy disku

; prenese sytemove parametry jednotky A: do souboru xxxxx.com

                         .Z80
                         ASEG
                        ORG 100h
BDOS    EQU 5
RAM     EQU 0D000H 
SYSD    EQU 0EA37H    ; drive No.0  A:  -  flag_byte
MOTR    EQU 0EA3BH    ; rozbeh motoru
SETL    EQU 0EA3DH    ; settling time
KROK    EQU 0EA3EH    ; step time
FDMMOTR EQU 075H
FDMSETL EQU 073H
FDMKROK EQU 072H
CHSUM EQU 5           ; poÃet menenÙch parametru

start:
     ld hl,MST
     ld de,RAMSTART
     ld bc,RAMEND - RAMSTART
                              ldir
          jp RAMSTART
MST:
.phase RAM
RAMSTART:
     ld de,uvod
     ld c,9
          call 5  ; tisk zpravy
     ld a,(80h)
               or a
          jr nz,action
     ld de,jeste
     ld c,9
          call 5
          jp 0
action:
     ld hl,100h
     ld de,101h
     ld bc,RAM - 100h
     ld (hl),l
                              ldir ; vymaz RAM
          call READ                ; nahraj soubor
          call NAJDIF3             ; najdi misto pro setup
          call SETUP               ; setup parametru
          call WRITE               ; uloz soubor
          jp 0

CHANGTAB:  DB 04Fh,069h,09Eh,0D9h,04Dh   ; _tabulka pointru na zmeny
CHANG80:   DB 0CBh,008h,056h,023h,0CBh   ; 80 stop
CHANG40:   DB 007h,010h,057h,000h,03Dh   ; 40 stop

ZEPTEJ: ; :::::::::::::: zepta se na delku overlayu,aby podle ni setup :::
     ld a,(SYSD)                 ; flag mechaniky A:
                    bit 0,a      ; 40 stop ?
          ret nz                 ; nic nemusim,je to 80 stopa
                              push ix
                              push iy
     ld de,ZEPTMES
     ld c,9
          call 5        ; zeptej se na velikost souboru
     ld c,1
          call 5        ; precti znak
               and 5Fh  ; toupper()
               cp "A"
                              pop iy
                              pop ix
          jr z,ZEPT5
          ret
ZEPT5:
     ld c,(iy+0)
     ld b,0
     ld hl,(ORIGIN)
               add hl,bc
     ld a,(ix+0)
     ld (hl),a
          ret
SETUP: ; ::::::::::::::: provede setup parametru ::::::::::: od HIER! :::::
     ld a,(SYSD)                 ; flag mechaniky A:
                    bit 0,a      ; 40 stop ?
          jr z,SETUP40           ; ano
SETUP80:
     ld ix,CHANG80
          jr SETUP0
SETUP40:
     ld ix,CHANG40
SETUP0:
     ld iy,CHANGTAB
     ld hl,(ORIGIN)
                              push hl
     ld b,CHSUM
SETUP22:
                              push bc
     ld a,(ix+0)
     ld b,0
     ld c,(iy+0)
     ld hl,(ORIGIN)
               add hl,bc
     ld (hl),a
     inc ix
     inc iy
                              pop bc
          djnz SETUP22   ; CHSUM zmen parametru
          call ZEPTEJ    ; zeptej se na velikost overlayu
                              pop hl
                              push hl
     ld a,(SETL)
     ld bc,FDMSETL
               or a
               sbc hl,bc
     ld (hl),a                     ; SET SETTLING TIME
                              pop hl
     ld a,(KROK)
     ld bc,FDMKROK
               or a
               sbc hl,bc
     ld (hl),a                     ; SET STEP TIME
     ld de,stred              ; tisk zpravy
     ld c,9
          call 5
          ret
NAJDIF3: ; ::::::::: najde sekvenci "O","V","R",F3
     ld hl,100h
     ld bc,0CE00H        ; zkoumam i oblast nul
NAJDI1:
     ld a,"O"
          cpir
     ld a,b
               or c
          jr nz,NAJDI2  ; zatim neni konec
     ld de,neznam
     ld c,9
          call 5
          jp 0
NAJDI2:
     ld a,(hl)           ; nasel "O"
               cp "V"
          jr nz,NAJDI1
     inc hl              ; nasel "OV"
     dec bc
     ld a,(hl)
               cp "R"
          jr nz,NAJDI1
     inc hl              ; nasel "OVR"
     dec bc
     ld a,(hl)
               cp 0F3h
          jr nz,NAJDI1
     ld (ORIGIN),hl      ; offset bran od  ---> F3 <---
          ret
NAJDI0:
     db "OVR",0F3h

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
READ:  ; ::::::::::::: nacte soubor .COM ::::::::::::::::::::::::::::::
     ld hl,82h
     ld de,FCB0 + 1
     ld bc,8
READ1: 
     ld a,(hl)
               cp "." + 1
          jr c,READ10 ; mensi nez jmeno : o.k.
                              ldi 
          jr nz,READ1
READ10:
     ld de,FCB0
     ld c,15
          call 5            ; otevri zdroj
               cp 0FFh      ; je tam vubec ten soubor ?
          jr nz,NACB0       ; je .. do roboty !
     ld de,chyba
     ld c,9
          call 5
          jp 0
; ::::::::::::::: nacist co nejvice bloku do memory ::::::::::::::::
; :: na adrese "fcb1" FCB souboru ze ktereho se ma nejvice nacist ::
; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUCK:
     ld de,zacatek
     ld c,9
          call 5
          ret
NACB0:
     ld bc,0           ; citac bloku na nulu
     ld de,100h        ; first DMA -> DE
NACB1: ; --loop nacitajici bloky,dokud neni all file nebo fullmem--
     ld a,(ALL)
               or a       ; doslo se minule na konec souboru ?
          jr nz,FUCK          ; ano    
                   push bc
                   push de  ;  uschovat DMA a citac bloku
     ld c,26
          call 5        ; nastav DMA pro prenos
     ld c,20
     ld de,FCB0
          call 5        ; nacteni bloku ze souboru 'FCB1'
                   pop de
                   pop bc ; znovuzrozeni ..
               or a     ; jsem uz na konci souboru ?
          jr z,NACB2    ; nejsem 
     ld a,1
     ld (ALL),a         ; jsem -> set 'nacten cely'     
          jr NACB1      ; a vratit se na zacatecni testy
NACB2:                  ; jeste cely nacten neni :                
     ld hl,80h
               add hl,de
               ex de,hl   ;  de /DMA/ += 80h               
     inc bc               ; ne,takze mohu v dalsim cyklu
     ld (BCHIER),bc       ; uschov ho
          jr NACB1        ; nacist zase jeden blok / 128 bytu /
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;:::::::::::::::::::::::::::::::- 3. put co nejvice na disk d: -:::::::::::
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
WRITE:
     ld bc,(BCHIER)
                              push bc
     ld hl,FCB0 + 12          ; nechci usera
     ld de,FCB0 + 13 
     ld bc,24                 ; 8 znaku
     ld (hl),0
                         ldir
     ld de,FCB0
     ld c,15
          call 5        ; takze open fire
                    pop bc ; koncime ...     
     ld de,100h
PUTB5:  ; --- loop uklada bloky na disk,dokud neni citac /bc/ = 0
                    push de
                    push bc ; ulozit citac a DMA
     ld c,26
          call 5         ; set DMA
     ld de,FCB0
     ld c,21
          call 5  ; sekvencne ulozit z DMA na d: 1 blok
                    pop bc
                    pop de
     ld hl,80h
               add hl,de
Š                    ex de,hl ; de += 80h
     dec bc                  ; blok --
     ld a,b
               or c     ; neni uz citac nulovy ?
          jr nz,PUTB5   ; neni,proto pokracuji dale :::::::::::::::::****
     ld de,konec
     ld c,9
          call 5
          ret
;----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ----
BCHIER:
  dw 0
ZEPTMES:
 db 10,13,"   >maji .OVR soubory velikost vetsi,nez 32kB {kazdy sam}"
 db 10,13,"   > { lze zjistit programy cpm{rovnou} nebo power{size}}"
 db 10,13,"   >jestlize ano , stiskni 'A' , jinak stiskni cokoli jineho",7
 db 36
uvod:
 db 10,13,"              xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 db 10,13,"              M  FLOPPY_GAME_INSTALATOR v.2.01    M" 
 db 10,13,"              M (c) 1992 Fucking brothers softwr. M"
 db 10,13,"              M unauthorised distributor  MZXsoft M"
 db 10,13,"              M  Unautorized copy se prikazuje !  M"
 db 10,13,"              MxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxM$"
jeste:
 db 10,13,10,13,¢ funkce : nastaveni optimalnich casu "
 db 10,13,"        :  setup fd_game_biosu na 40 nebo 80 stopou mechaniku." 
 db 10,13," syntax :       A0>gins [jmeno] , napr. A0>gins batman<CR>"
 db 10,13," users guide :"
 db 10,13,"        :  pracuje pouze se soubory .COM,obsahujicimi fd_g_bios !"
 db 10,13," reference manual :"
 db 10,13,"        : program sice nefunguje pro dvojity krok,ale rutina "
 db 10,13,"        : pro dvojity krok je na konci fdd_loaderu umistnena,takze"
 dâ 10,13,¢        º stacé presmerovaô dvå volané singlå stepõ ná volané double."
 db 10,13,"        : casy a stopy plati pro mechaniku A: ,proto pote",10,13
 db       "        : hru spoustej z teto mechaniky ! "
 dâ 10,13,¢ security call º vsechna autorska prava na tento program vlastni"
 db 10,13,"        : firma MZX-SOFTWARE , jakekoliv neopravnene rozsirovani"
 db 10,13,"        : bude proto prisne potrestano ! { budes si muset koupit"
 db 10,13,"        : jeden z jeho 'lidovych' programu za 'lidove' ceny... }"
 db 10,13,7,36
zacatek:
 db 10,13,10,13,"   >loading   o.k.$"
stred:
 db       10,13,"   >modifying o.k.$"
konec:
 db       10,13,"   >putting   o.k."
ending:
 db       10,13,"   >vse je o.k.,takze : ES LIEBE ADOLF GAMESIST !!",10,13,7,36
neznam:
 dâ       10,13,¢   >tentï prograí neobsahujå fd_game_bioó !...",7,7,10,13,36
chyba:
 db 10,13,10,13,"   >chybne zadane jmeno !...",7,7,10,13,36
ORIGIN:  dw 0
ALL:     db 0
FCB0:
 db 0,"        COM",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
RAMEND:
.dephase

 end   
