;****************************************************
;
;           L O A D E R   P R O   C P / M
;
;****************************************************
;
;
;Program zavede na adresu 1200h modul BIOS,BDOS a CCP
;z disku, urceneho DR (zde B) a pote pretahne system
;do ramcard, kde vynuluje adresar. Na zdrojovem
;disku je BIOS a BDOS ulozen na 0. stope od 2. do 18.
;sektoru, CCP je umisten jako systemovy soubor na
;disku.
;
;
.z80
aseg
;
	org	100h
        .phase  0e44ah
;
;
;
bcurtr  equ     0fa0ah          ;pole akt. stop
pbios   equ     0ec00h          ;pocatek BIOS
bdos    equ     pbios-0dfah     ;pocatek BDOS
adres   equ     4280h           ;pocat. adresare
                                ;po natazeni
dladr   equ     800h            ;delka adresare
seldma  equ     0fa02h          ;adr. DMA pro ramc.
seltrk  equ     0f9fbh          ;dtto stopa
selsec  equ     0f9fch          ;dtto sektor
tradr   equ     6               ;prvni stopa adresare
strbio  equ     1fffh           ;startovaci adresa
strtsy	equ	1fefh		;start. adr. systemu
zzaz	equ	2059h		;zmena zavadece
                                ;zavadece do ramcard
uloz	equ	0fd40h		;zavedeni biosu do ramcard
zngen   equ     1152d           ;9 sektoru znak. gen.
                                ;zbyvajicich 50h byte
                                ;je na konci BDOSu
delbdo  equ     0e00h           ;delka BDOS
delbio  equ     strbio-1210h-2dh;delka BIOS
delccp  equ     800h            ;delka CCP
pccp    equ     1200h+0f00h     ;pocatek CCP po nat.
deladr  equ     16d             ;delka adres. v ramc.
                                ;v sekt. 128b.
synch1  equ     0ec48h          ;identif. verze (v biosu
                                ;oznacen jako identi:)
ramdsk  equ     0f809h          ;cteni/zapis do ramc.
modif   equ     0f8c5h          ;modif. BIOS-chybovy
                                ;navrat do loaderu
modif1	equ	0ec0dh		;dtto
bigsys  equ     1               ;1.sektor 512 b. sys.
secnas  equ     9               ;sekt. na stranu st.
delsys  equ     18d             ;delka sys. po 512 b.
;
;porty radice WD 2797:
comreg  equ     090h            ;ridici registr
secreg  equ     092h            ;registr sektoru
datreg  equ     093h            ;datovy registr
drselp  equ     094h            ;drive select port
;
;parametry mechaniky:
spseek  equ     0ch             ;rychlost krokovani
                                ;(primo bity r0, r1)
                                ;+prikaz restore
seldsk  equ     01              ;vybrany disk (udaj
                                ;se posila do drselp)
dr      equ     02              ;natahovat se bude
                                ;z disku b
;
;
;adresy monitoru MZ 800:
napis   equ     0ea55h          ;tisk napisu + n. rad.
clr     equ     0ea59h          ;smazani obrazovky
idnap   equ     0ee4dh          ;ident. nap. monitoru
st55    equ     073eh           ;nastaveni 8255
bufbl   equ     0e8e1h          ;cerny border
nsound  equ     2beh            ;vypnuti zvuku
stoptp  equ     700h            ;zastaveni tape
testpr  equ     0e8d5h          ;test pripojeni FD
;
;
rr55    equ     0e003h          ;ridici reg. 8255
bell    equ     119dh           ;promenna bellu
tempo   equ     119eh           ;tempo muziky (prom.)
;
;
fcb     equ     05ch            ;pole FCB
;
;
;
        call    testpr          ;FD pripojen?
        ret	nz	        ;pokud neni pripojen
        ld      hl,zac
        ld      de,strt
        ld      bc,prosp-strt
        ldir
        jp      strt
;
zac:
;
	.dephase
        .phase  5000h
;
strt:   ld      (prosp),sp
        ld      de,nap6         ;IPL is loading
        RST     18h
        ld      de,nap5         ;CP/M - wait please
        RST     18h
        call    stoptp
        ld      a,seldsk        ;rozbeh motoru
        out     (drselp),a
        ld      hl,0            ;ceka se na rozbeh
wtfr:   in      a,(comreg)      ;je disk ready?
        bit     7,a
        jr      z,strack        ;je-li ready
        dec     hl
        ld      a,h
        or      l
        jr      nz,wtfr         ;ceka se dal
        ld      de,nap1         ;disk neni ready
        jp      cerr            ;skok do monitoru
strack: di
        call    home
        ld      hl,1200h        ;sem se bude cist
        ld      a,bigsys        ;1. sektor systemu
        ld      c,datreg        ;datovy registr
        ld      d,0             ;prvni strana
        ld      e,secnas        ;sektoru na strane
dalsec: out     (secreg),a      ;nastaveni sektoru
        push    af              ;cteni sektoru
        ld      a,88h           ;read code
        or      d               ;urceni strany
        out     (comreg),a      ;vyslani prikazu
        ld      b,10
        djnz    $               ;timeout
nxtrd:  in      a,(comreg)
        cp      01              ;je busy?
        jr      z,nxtrd         ;ceka
        in      b,(c)           ;prevzeti byte
        bit     1,a             ;data platna?
        jr      z,rnbw          ;skok,pokud ne
        ld      (hl),b          ;ulozeni dat
        inc     hl
        jr      nxtrd           ;dalsi byte
rnbw:   bit     0,a             ;busy?
        jr      nz,nxtrd        ;dalsi byte
        and     09ch            ;nebyla chyba?
        jp      nz,err1         ;pri chybe
        pop     af
        cp      e               ;posledni?
        inc     a               ;dalsi sektor
        jr      c,dalsec        ;na dalsi
        ld      a,d             ;test na druh. str.
        and     a
        jr      nz,dbioen       ;vse je vycteno
        ld      d,2             ;druha strana
        ld      e,delsys+bigsys-secnas-1
        ld      a,(1200h+2eh+20);konst. off v DPH
        cp      2               ;vyhrazeny dve stopy?
        ld      a,1
        jr      nz,dalsec
        ld      d,5		;pocet pokusu
zkus1:  ld      a,5fh           ;step in
        out     (comreg),a
        ld      b,10
        djnz    $
wt1:    in      a,(comreg)
        and     81h             ;hotovo?
        jr      nz,wt1
        in      a,(comreg)
        bit     4,a
        jr      z,ok1
        call    home
        dec     d
        jr      nz,zkus1
        jp      err1
ok1:    ld      d,08h
        ld      a,1
        jr      dalsec
dbioen: ld      bc,9216-512
        ld      hl,1200h+512
        ld      de,1200h
        ldir
        ex      de,hl
        dec     hl              ;konec BDOS a znak. gen.
        ld      de,pbios+zngen  ;pocatek BIOS s offsetem
        dec     de              ;+znakoveho generatoru
        push    hl
        ld      bc,delbdo+zngen ;delka BDOS+znak. gen
        push    bc
        out     (0e0h),a        ;vsude RAM
        out     (0e1h),a
        lddr                    ;presun BDOS
        pop     bc              ;do pracovni polohy
        pop     hl
        ld      de,1200h+delbdo+delccp+0f00h+zngen-1h
                                ;konec zony
        lddr                    ;mezera pro CCP
;poznamka: prvnich 80h byte ve fyz. sektoru neni obsazeno
;biosem
        ld      de,pbios        ;BIOS dov prac. obl.
        ld      bc,delbio       ;delka BIOS
        ld      hl,1300h        ;pocatek po nataz.
        ldir                    ;bios do prac.obl.
        ex      de,hl
fzero:  ld      (hl),0          ;nastaveni promennych
        inc     hl
        ld      a,h             ;plni se po ffff
        cp      0ffh
        jr      nz,fzero        ;dalsi byte
        ld      a,l
        cp      0ffh
        jr      nz,fzero
        ld      a,0c3h
        ld      (modif),a
        ld      hl,err1         ;modifikace BIOS pro
                                ;chybovy navrat
        ld      (modif+1),hl
	ld	(modif1),hl
        ld      hl,1300h        ;presun bios,aby se mohl
        ld      de,1200h        ;svou rutinou zapsat do
        ld      bc,0f00h        ;ramcard
        ldir
        ld      hl,synch1       ;overeni souhl. verze
        ld      de,synch2
        ld      bc,7            ;delka porovnani
cpdehl: ld      a,(de)
        inc     de
        cpi
        jp      nz,err3         ;pri chybe
        jp      pe,cpdehl       ;dalsi byte
        ld      hl,adres        ;poc. adresare po nataz.
        push    hl              ;plneni adresare v ramc.
        ld      de,adres+1      ;byty e5h
        ld      bc,dladr-1      ;delka adresare v ramc.-1
        ld      (hl),0e5h       ;plneni sektoru b. e5h
        ldir
        pop     hl              ;nastaveni adresy dma
        ld      (seldma),hl     ;pouze pro ramcard!
        ld      hl,tradr        ;nast. stopy a sektoru
        ld      (seltrk),hl
        ld      b,deladr        ;delka adr. v sekt.
        ld      c,h             ;pocitadlo sekt.
        ld      iy,prom         ;pom. promenna
fillad: push    bc
        call    ramdsk          ;zapis sektoru do ramc.
        pop     bc
        inc     c               ;dalsi sektor
        ld      hl,selsec
        ld      (hl),c
        djnz    fillad          ;plni se cely adresar
        call    home
        ld      hl,bcurtr
        ld      b,5
fillff: ld      (hl),0ffh
        inc     hl
        djnz    fillff
        ld      c,0dh           ;iniciace systemu disku
        call    bdos
        ld      c,0eh           ;akt. disk b
        ld      e,1
        call    bdos
        ld      de,fcb          ;natazeni CCP
        push    de
        ld      hl,name         ;plneni FCB
        ld      bc,0fh
        ldir
        xor     a
        ld      (fcb+20h),a     ;nulovani CR
        ld      c,0fh           ;otevreni souboru
        pop     de
        call    bdos
        cp      0ffh            ;uspesne?
        jr      z,err3          ;pri chybe
        ld      a,seldsk        ;retrigr monofl.
        out     (drselp),a
        ld      c,23h           ;zjisteni del. soub.
        ld      de,fcb
        call    bdos
        ld      de,pccp         ;nastaveni DMA
        push    de
nxtse:  ld      c,1ah           ;nastaveni DMA
        call    bdos
        ld      c,14h           ;cteni vety
        ld      de,fcb
        call    bdos
        and     a               ;cteni uspesne?
        push    af
        ld      b,03h           ;soubor vycerpan?
        ld      hl,fcb+21h
        scf
nr:     ld      a,(hl)
        sbc     a,00
        ld      (hl),a          ;dekrement pocitadla
        inc     hl
        djnz    nr
        pop     af
        pop     de
        ld      hl,80h          ;dalsi DMA
        add     hl,de
        ex      de,hl           ;DMA v de
        push    de
        and     a               ;cteni uspesne?
        jr      z,nxtse         ;dalsi sektor
        ex      (sp),hl         ;posl. plat. adr.+1
        ld      b,03            ;byl vytazen cely s.?
        ld      hl,fcb+21h
        ld      de,nap2         ;chyba cteni z disku
zero:   ld      a,(hl)          ;kontr. proti delce
        cp      0ffh
        inc     hl
        jr      nz,err1         ;pri chybe
        djnz    zero
	ld	a,0c9h		;zmena zavadece
	ld	(zzaz),a
	call	strbio
	ld	de,nap3
	jr	nz,cerr		;pri chybe
	call	uloz
	jp	strtsy		;start, vse ok
err3:   ld      de,nap4         ;verze nenalezena
        jr      cerr
err1:   ld      de,nap2         ;loading error
;
;
;       prepne mod pocitace na MZ700
;-----------------------------------------
;
cerr:	di
        im      01
        ld      a,8
        out     (0ceh),a        ;zobrazeni mz700
        ld      a,1
        out     (0cch),a
        out     (0cdh),a        ;roviny zobrazeni
        out     (0e4h),a        ;nahore i dole epr.
	ld      sp,(prosp)
	push	de
        call    st55            ;nastaveni 8255
        ld      (rr55),a
        xor     a
        ld      (bell),a        ;pipat se bude
        call    nsound          ;vypnuti zvuku
        inc     a
        ld      (tempo),a       ;tempo rychle
        ld      (rr55),a        ;povol.prer.
        ld      hl,038dh
        ld      a,0c3h          ;nastaveni adresy
        ld      (1038h),a       ;preruseni
        ld      (1039h),hl
        in      a,(0e0h)        ;znak. gen
        ld      de,0c000h       ;sem se presouva
        ld      hl,1000h        ;odtud
        ld      bc,1000h        ;delka
        ldir                    ;presun znak. gen
        in      a,(0e1h)        ;zpet ram
        call    clr             ;vymaz obrazovky
        call    bufbl           ;cerny border
        pop     de
        ret
;
;
home:   push    de
        ld      d,5
krat&r: ld      a,seldsk        ;retrigr monofl.
        out     (drselp),a
        dec     d
        jp      z,err1
        ld      a,10
        out     (datreg),a
        ld      a,1fh
        out     (comreg),a
        ld      b,10
        djnz    $
pos&r:  in      a,(comreg)
        and     81h
        jr      nz,pos&r
        ld      a,spseek        ;restore
        out     (comreg),a
        ld      b,10            ;time out
        djnz    $
wfho&r: in      a,(comreg)      ;je stopa 0?
        bit     0,a
        jr      nz,wfho&r       ;ceka na not busy
        bit     2,a             ;je home?
        jr      z,krat&r        ;chyba
        pop     de
        ret
;
name:   defb    dr,"CCP     SYS",0,0,0
synch2: defb    "1990 v4"
prom:   db      0
prosp:  dw      0
;
	.dephase
	.phase 0fd00h
;
;napisy:
nap6    equ     0ed88h 		;IPL is loading
nap1    equ	0edb5h 		;Make ready FD    
nap2    equ	0ede5h		;Loading error
nap3:   defb    "SRAM:W",9dh,0a6h,96h,92h,20h,92h,9dh,9dh,0b7h
        defb    09dh,0dh	;SRAM:Write error
nap4    equ	0edf6h		;FD:Not master
nap5:   defb    "CP/M - ",0a3h,0a1h,0a6h,96h,20h
        defb    9eh,0b8h,92h,0a1h,0a4h,092h,0dh ;wait please
        .dephase
;
;
        end
