;**************************************************** ; ; 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