From 74dcc4a98a85721c91195defe91f0e0f98ab7ee2 Mon Sep 17 00:00:00 2001 From: z00m128 Date: Tue, 28 Jan 2020 11:55:27 +0100 Subject: [PATCH] FB: separated builds. CFD:finalization for release. Boot: bootdisk updated. --- boot/MB02BootDiskDMAfix.zip | Bin 70486 -> 0 bytes cf-driver/cf-driver-mb02.a80 | 2106 +++++++++++++++++ cf-driver/makecfd-mb02.sh | 14 + flashboot/cfd-dron.hru | Bin 0 -> 3252 bytes flashboot/cfd-pvl.hru | Bin 0 -> 3252 bytes flashboot/easyhdd-dron.hru | Bin 0 -> 5610 bytes flashboot/easyhdd-pvl.hru | Bin 0 -> 5611 bytes .../{flashboot.a80 => flashboot-cfd-dron.a80} | 27 +- flashboot/flashboot-cfd-pvl.a80 | 557 +++++ flashboot/flashboot-e105-dron.a80 | 556 +++++ flashboot/flashboot-e105-pvl.a80 | 556 +++++ flashboot/hdpc.hru | Bin 1103 -> 0 bytes flashboot/vdt.hru | Bin 347 -> 0 bytes samtracker2mb/makesmt2mb.sh | 1 + 14 files changed, 3801 insertions(+), 16 deletions(-) delete mode 100644 boot/MB02BootDiskDMAfix.zip create mode 100644 cf-driver/cf-driver-mb02.a80 create mode 100755 cf-driver/makecfd-mb02.sh create mode 100644 flashboot/cfd-dron.hru create mode 100644 flashboot/cfd-pvl.hru create mode 100644 flashboot/easyhdd-dron.hru create mode 100644 flashboot/easyhdd-pvl.hru rename flashboot/{flashboot.a80 => flashboot-cfd-dron.a80} (96%) create mode 100644 flashboot/flashboot-cfd-pvl.a80 create mode 100644 flashboot/flashboot-e105-dron.a80 create mode 100644 flashboot/flashboot-e105-pvl.a80 delete mode 100644 flashboot/hdpc.hru delete mode 100644 flashboot/vdt.hru diff --git a/boot/MB02BootDiskDMAfix.zip b/boot/MB02BootDiskDMAfix.zip deleted file mode 100644 index a4718733fad5f4c203ae1fdf7d172703160ae301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70486 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 z 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 master device + ld (hl),a + ld hl,v_mas_sectors + + ld a,(ix+#0c) ; device geometry: sec + ld (hl),a + inc hl + ld a,(ix+#06) ; device geometry: hea + ld (hl),a + inc hl + ld a,(ix+#02) ; device geometry: cyl low + ld (hl),a + inc hl + ld a,(ix+#03) ; device geometry: cyl high + ld (hl),a + ld a,(ix+#63) + bit 1,a ; is LBA supported? + jr nz,dev_mode_chs + +dev_mode_lba: ld e,%01000100 ; bit6=1 - LBA mode, bit3-bit1=010 - LBA + ld hl,device_mode + ld a,(hl) + or e + ld (hl),a + jr make_vdt_1 + +dev_mode_chs: ld e,%00000000 ; bit6=0 - CHS mode, bit3-bit1=000 - CHS mode 0 + ld hl,device_mode + ld a,(hl) + or e + ld (hl),a + +make_vdt_1: pop ix ; restore buffer with MBR, pointer is set to corresponding partition entry already + ld a,(ix+#08) ; LBA 0 + ld (lba0),a + ld a,(ix+#09) ; LBA 1 + ld (lba1),a + ld a,(ix+#0a) ; LBA 2 + ld (lba2),a + + ld hl,vdt_lba ; LBA table in VDT + + ld a,(lba0) ; first entry for first virtual drive + ld (hl),a + inc hl + ld a,(lba1) + ld (hl),a + inc hl + ld a,(lba2) + ld (hl),a + inc hl + ld a,(device_mode) + ld (hl),a + inc hl + + ld e,#10 ; LBA1+LBA2 will be increased with 4096 sectors + ld d,#01 + + ld a,(num_of_drives) + dec a + ld b,a ; loop counter set to number of drives-1 + +lba_loop: ld a,(lba0) ; now we will generates entries 2 to end + ld (hl),a + inc hl + + ld a,(lba1) + add a,e ; add 4096 sectors + jr nc,lba_std ; if LBA1 max was not exceeded, continue to LBA2 + ld (lba1),a + ld (hl),a + inc hl + + or a ; reset carry + ld a,(lba2) ; if LBA1 max was exceeded + add a,d ; increase LBA2 and if the LBA2 max was not exceeded + jr c,lba_end + jr lba_inc ; continue to next virtual drive, else end loop + +lba_std: ld (lba1),a + ld (hl),a + inc hl + + ld a,(lba2) +lba_inc: ld (lba2),a + ld (hl),a + inc hl + + ld a,(device_mode) + ld (hl),a + inc hl + + djnz lba_loop +lba_end: or a ; reset carry + ret + +; Reads Identify block +; input: HL = buffer for identify block +get_identify: ld a,(master_slave) + or %10100000 + out (p_device_head),a ; select master/slave + + ld a,c_identify ; send identify command + out (p_command),a + call wait_ata_drq ; check for device ready and drq + jp c,device_error ; quit to error handling if not + + ld bc,p_data ; load identify data + inir + inir + call wait_ata_ready ; check for device ready + jp c,device_error ; quit to error handling if not + + ret + +; Reads MBR +; input: HL = buffer for MBR +get_mbr: ld a,(master_slave) + or %10100000 + out (p_device_head),a ; select master/slave + + ld de,#0000 ; cyl = 0 + ld bc,#0001 ; hea = 0, sec = 1 + ld a,#01 ; num of secs = 1 + out (p_sec_count),a ; set sector count + ld a,c + out (p_sec_number),a ; set sector number + ld a,e + out (p_cyl_low),a ; set cyl low value + ld a,d + out (p_cyl_high),a ; set cyl high value + ld a,c_readsector ; read sector command + out (p_command),a + call wait_ata_drq ; wait if device is ready and drq + jp c,device_error ; quit to error handling if not + + ld bc,p_data ; load sector data + inir + inir + call wait_ata_ready ; wait if device is ready + jp c,device_error ; quit to error handling if not + + ret + +; Wait for device status: +; busy = 0 and ready = 1 +; with timeout +; output: c = timeout +; nc = drive ready +wait_ata_ready: ld de,ata_timeout +w_a_rd1: in a,(p_status) ; read device status + and %11000000 ; busy (#80) + ready (#40) + cp s_ata_ready ; #40 = ready + ret z + dec de + nop ; some delay + ld a,d + or e + jr nz,w_a_rd1 + scf ; timeout occured + ret + +; Wait for device status: +; busy = 0 and data request = 1 +; with timeout +; output: c = timeout +; nc = drive ready +wait_ata_drq: ld de,ata_timeout +w_a_drq1: in a,(p_status) ; read device status + and %10001000 ; busy (#80) + (drq) #08 + cp s_ata_drq ; #08 = data request + ret z + dec de + nop ; some delay + ld a,d + or e + jr nz,w_a_drq1 + scf ; timeout occured + ret + +;-------------------------------------- +;CF driver body starts here + +cfdriver: di + + ld hl,font_addr ;copy font to memory + ld de,font_buffer + ld bc,font_size + ldir + + ld hl,vdt ;move VDT into patch body + ld de,tab + ld bc,vdt_end-vdt + ldir + + ld a,dos_bank ;dos_bank page in + out (mem_port),a + + ld hl,dos_14h ;write byte in dos_bank and jump to patch_bank + ld de,#14 + ld bc,dos_14h_end-dos_14h + ldir + + ld hl,dos_23h ;start DMA transfer + ld de,#23 + ld bc,dos_23h_end-dos_23h + ldir + + ld hl,dos_2bh ;get byte from dos_bank and jump to patch_bank + ld de,#2b + ld bc,dos_2bh_end-dos_2bh + ldir + + ld hl,dos_3eh ;no verify for drives @5 and higher + ld de,#3e + ld bc,dos_3eh_end-dos_3eh + ldir + + ld hl,noverify ;no verify for drives @5 and higher + ld (#13cb),hl + + ld hl,dos_90h ;hdd patch driver + ld de,#90 + ld bc,dos_90h_end-dos_90h + ldir + + ld a,patch_bank ;patch_bank page in + out (mem_port),a + + ld hl,patch_00h ;routes from patch_bank to dos_bank + ld de,0 + ld bc,patch_00h_end-patch_00h + ldir + + ld hl,patch_90h ;hdd patch body + ld de,#90 + ld bc,patch_90h_end-patch_90h + ldir + + ld hl,#c9fb ; ei:ret to address #38 in patch_bank + ld (#38),hl + + ld hl,font_buffer ;copy font to patch_bank + ld de,font_addr + ld bc,font_size + ldir + + ld a,rom_bank_ro ;rom_bank page in + out (mem_port),a + ei + ret + +;------------------------------------ +;mod at #14 in dos_bank +;input: a=dos_bank + +dos_14h: + disp #14 + + ld (hl),b ;write byte in dos_bank + inc a + out (mem_port),a ;patch_bank page in + jp adr144d + +dos_1bh: ld a,patch_bank ;route to patch_bank + out (mem_port),a + ret + + ent +dos_14h_end: + +;------------------------------------ +;mod at #23 in dos_bank +;input: a=dos_bank + +dos_23h: + disp #23 + + out (c),b ;start DMA transfer +dos_25h: inc a + out (mem_port),a ;patch_bank page in + + ent +dos_23h_end: + +;------------------------------------ +;mod at #2b in dos_bank +;input: HL=address in dos_bank + +dos_2bh: + disp #2b + + ld b,(hl) ;gets byte from dos_bank, and pages out back to patch_bank + jr dos_25h + + ent +dos_2bh_end: + +;----------------------------------- +;mod at #3e in dos_bank + +lssecs: equ #1463 + +dos_3eh: + disp #3e + +noverify: ld c,a ;is verify needed? + ld a,(#03ef) + cp 5 ;verify for drives @1, @2, @3 & @4 + ld a,c + ret nc + jp lssecs + + ent +dos_3eh_end: + +;------------------------------------ +;mod at #90 in dos_bank + +dos_90h: + disp #90 + +adr144d: push hl + ld hl,255 + ld (hl),a + dec hl + ex (sp),hl + + cp 12 + jr c,skip1 + cp 15 + jr c,sluz1214 + +skip1: cp 16 + jr z,setmlt + or a + ret z + cp 15 + ret nc +act: ret + + inc sp + inc sp + +aaa: cp 4 + jr c,loop12 + cp 6 + jr c,rdwrsec +loop12: cp 7 + jr z,rdwrsec + xor a + ret + +rdwrsec: push hl + push de + ld b,a + ld (sp_st+1),sp + ld sp,128 + call dos_1bh +sp_st: ld sp,0 + push bc +rut: call nic + pop af + pop de + pop hl +nic: ret + +setmlt: ld a,h + or l + jr nz,loop14 + ld hl,nic +loop14: ld (rut+1),hl + ret + +sluz1214: push de + push hl + ld b,a + ld (sp_st+1),sp + ld sp,128 + call dos_1bh + ld sp,(sp_st+1) + ld a,b + pop hl + or a + jr nz,no_nfo + inc sp + inc sp + push de +no_nfo: pop de + cp 255 + ret z ;nz=ret immediately, z=pass +pryc: inc sp + inc sp + ret + + nop + nop + +a1_254: ld a,#55 + +;address #100 should be here + if $>#100 + display "!!!! Address #100 overflow in dos_bank by ",/D,$-#100," bytes !!!!" + endif + + ent +dos_90h_end: + +;------------------------------------ +;hooks at #0 in patch_bank + +patch_00h: + disp 0 + + di + xor a + ld de,65535 +patch_05h: jp patch_05h +patch_08h: db "CFDriver" + +patch_10h: ld a,dos_bank + out (mem_port),a +patch_14h: ld (hl),b + inc a + out (mem_port),a + ret + nop + nop +patch_1bh: ld a,dos_bank ;#1b - route to dos_bank + out (mem_port),a + jr adr144p + +dma_start: out (mem_port),a ;#21 - route to dma_start, input must be: a=dos_bank, bc=dma_port + out (c),b + inc a + out (mem_port),a + ret + +patch_29h: out (mem_port),a ;#29 - second route to dos_bank +read_byte: ld a,dos_bank + jr patch_29h + + ent +patch_00h_end: + +;------------------------------------ +;patch body at #90 in patch_bank + +patch_90h: + disp #90 + +adr144p: jp preskoc + + ent + +tab: + disp #93 +;primary +m_sec1: db 0 +m_hea1: db 0 +m_cyl1: dw 0 + +;secondary +m_sec2: db 0 +m_hea2: db 0 +m_cyl2: dw 0 + + +tab_drv: ds 1026 + +preskoc: push hl + ld hl,rett + ex (sp),hl + + ld a,b + + cp 12 + jr z,aktive1 + cp 13 + jr z,pasive1 + cp 14 + jr z,info1 + + cp 4 +set_rdm: jp z,rd_sec0 + cp 5 +set_wrm1: jp z,wr_sec0 + cp 7 + jp z,wr_trk + xor a + ret + +rett: ld b,a + jp patch_1bh + +info1: ld a,e + call tst_drv + ld a,255 + ret z + ld de,#ff09 ;#ff = num of trk, #09=ATA,HD + xor a + ret + +pasive1: ld a,201 + ld hl,act + ld b,a + rst 16 + ld a,255 + ret + +aktive1: call pasive1 + ld a,e + call tst_drv + ld a,255 + ret z + xor a + ld hl,act + ld b,a + rst 16 + ld a,2 + ret + +wr_trk: ld a,e + and 128 + ld e,a + xor a +wtrk1: + inc e + push de + push hl + push af +set_wrm2: call wr_sec0 + pop af + pop hl + ld de,1024 + add hl,de + pop de + inc a + cp 9 ;num of sectors -1 + jr nz,wtrk1 + ret + +;------------------------------------ +;counts logical number of sector +;HL is preserved, result is passed directly to prepoc +;input: DE=physical sector number from BSDOS + +numsec: equ #2306 + +sect_num: push hl + ld hl,numsec ;reads numsec variable from dos_bank + call read_byte + ld a,b + ld (sctrk+1),a + xor a + ld b,a + ld c,d + ld l,b + ld h,b + ld d,b + ld a,e + add a,e + rl c + rl b ;BC=2*track+side +sctrk: ld a,#55 ;A=sectrk +nasob: add hl,bc + dec a + jr nz,nasob ;hl=sectrk*(2*track+side) + res 7,e + dec e ;e=sector-1 + add hl,de ;hl=sectrk*(2*track+side)+(sector-1) + add hl,hl ;hl=2*(sectrk*(2*track+side)+(sector-1)) + ld (prepoc+1),hl + ld a,h + pop hl + and %11110000 + ret z + + ld a,%00010000 ;seek error + or a + ret + + +;------------------------------------ +;counts logical number of sector of +;disk image to corresponding physical +;cyl,sec,hea on HDD/CF + +;hl = logical number of sector + +prepoc: ld hl,0 + +low24: ld de,0 + add hl,de +hig24: ld de,0 + jr nc,prep1 + inc de +prep1: +m_sec: ld a,0 + call div248 + ld e,d + ld d,0 + push de ;de -> sec +m_hea: ld a,0 + ld e,a + ld d,0 + call div + push de ;de -> heads +m_cyl: ld de,0 + call div ;de -> cyl + pop hl + ld b,l + pop hl + ld c,l + inc c + ret + +prep_lba: ld hl,(prepoc+1) + ld de,(low24+1) + add hl,de + ld de,(hig24+1) + jr nc,prep2 + inc de + +;b - head (p_device_head) +;c - sector (p_sec_number) +;de - cylinder (e - p_cyl_low, d - p_cyl_high) + +prep2: ld b,d + ld d,e + ld e,h + ld c,l + ret + + +;------------------------------------ +;---------- generic 000 ------------- +;------------------------------------ + +rd_sec0: call sect_num + ret nz + + call rdd + ret nz + ld de,(prepoc+1) + inc de + ld (prepoc+1),de + call rdd + ret ;if ok, zero flag is returned + +rdd: push hl + call prepoc + pop hl + call read0 + ret + +wr_sec0: +wr_prot: ld a,0 + or a + ret nz + + call sect_num + ret nz + + call wrr + ret nz + ld de,(prepoc+1) + inc de + ld (prepoc+1),de + call wrr + ret ;if ok, zero flag is returned + +wrr: push hl + call prepoc + pop hl + call write0 + ret + +read0: call tst_bsy + jp nz,error + + ld a,b +hea_rd0: or %10100000 + out (p_device_head),a ;number of head + + ld a,1 + out (p_sec_count),a ;number of sectors + + ld a,c + out (p_sec_number),a ;number of sector (starts from 1) + + ld a,e + out (p_cyl_low),a + ld a,d + out (p_cyl_high),a ;number of cylinder + + ld a,#20 ;ATA command, read sector(s) + out (p_command),a + + call tst_bsy + jp nz,error + + call rd_512 ;works as inir (hl+512) + + call tst_err + jp nz,error + + xor a + ret + +write0: call tst_bsy + jp nz,error + + ld a,b +hea_wr0: or %10100000 + out (p_device_head),a ;number of head + + ld a,1 + out (p_sec_count),a ;number of sectors + ld a,c + out (p_sec_number),a ;number of sector (starts from 1) + ld a,e + out (p_cyl_low),a + ld a,d + out (p_cyl_high),a ;number of cylinder + + ld a,#30 ;ATA command, write sector(s) + out (p_command),a + + call tst_bsy + jp nz,error + + call wr_512 + + call tst_bsy + jp nz,error + call tst_err + jp nz,error + + xor a + ret + +;------------------------------------ +;----- end of generic 000 ----------- +;------------------------------------ + + + +;------------------------------------ +;--------- generic+ 001 ------------- +;------------------------------------ + +rd_sec1: call sect_num + ret nz + push hl + call prepoc + pop hl + call read1 + ret + +wr_sec1: ld a,(wr_prot+1) + or a + ret nz + + call sect_num + ret nz + push hl + call prepoc + pop hl + call write1 + ret + +read1: call tst_bsy + jp nz,error + + ld a,b +hea_rd1: or %10100000 + out (p_device_head),a ;number of head + + ld a,2 + out (p_sec_count),a ;number of sectors + + ld a,c + out (p_sec_number),a ;number of sector (starts from 1) + + ld a,e + out (p_cyl_low),a + ld a,d + out (p_cyl_high),a ;number of cylinder + + ld a,#20 ;ATA command, read sector(s) + out (p_command),a + + call tst_bsy + jr nz,error + + call rd_512 + + call tst_err + jr nz,error + + call tst_bsy + jr nz,error + + call rd_512 + + call tst_err + jr nz,error + + xor a + ret + +write1: call tst_bsy + jr nz,error + + ld a,b +hea_wr1: or %10100000 + out (p_device_head),a ;number of head + + ld a,2 + out (p_sec_count),a ;number of sectors + ld a,c + out (p_sec_number),a ;number of sector (starts from 1) + ld a,e + out (p_cyl_low),a + ld a,d + out (p_cyl_high),a ;number of cylinder + + ld a,#30 ;ATA command, write sector(s) + out (p_command),a + + call tst_bsy + jr nz,error + + call wr_512 + + call tst_bsy + jr nz,error + call tst_err + jr nz,error + + call wr_512 + + call tst_bsy + jr nz,error + call tst_err + jr nz,error + + xor a + ret + +;------------------------------------ +;----- end of generic+ 001 ---------- +;------------------------------------ + + +;------------------------------------ +;-------- LBA mode 010 -------------- +;------------------------------------ + +rd_sec2: call sect_num + ret nz + + push hl + call prep_lba + pop hl + + call read1 + ret + +wr_sec2: ld a,(wr_prot+1) + or a + ret nz + + call sect_num + ret nz + + push hl + call prep_lba + pop hl + + call write1 + ret + +;------------------------------------ +;---- end of LBA mode 010 ----------- +;------------------------------------ + + +;------------------------------------ +;------ rest of patch code ---------- +;------------------------------------ + +error: cp 255 + jr nz,err1 + ld a,1 + ret + +err1: and %01010011 + jr z,err2 + ld a,8 + ret + +err2: ld a,128 + ret + + +tst_bsy: push hl + push bc + ld hl,0 + +tst1: dec hl + ld a,l + or h + jr z,tout1 +p84: in a,(p_command) + inc a + jr z,p84 + dec a + bit 7,a + jr nz,tst1 + pop bc + pop hl + ret + +tout1: ld a,255 + or a + pop bc + pop hl + ret + +tst_err: in a,(p_command) + inc a + jr z,tst_err + dec a + and 1 + ret z + in a,(p_error) + ret + +rd_512: ld (dma_adr1),hl + push hl + ld hl,dma_in + ld bc,((dma_in_end-dma_in)*256)+dma_port + otir + ld a,dos_bank + ld b,#87 + call dma_start ;start DMA transfer + pop hl + ld bc,512 + add hl,bc + ret + +dma_in: db #c3 ;WR6-reset + db %01111101 ;WR0 PA->PB, transfer + dw p_data ;source port + dw 511 ;block size + db %00101100 ;WR1 PA-port, fixed + db %00010000 ;WR2 PB-memory, increment + db %10101101 ;WR4 continuous +dma_adr1: dw 0 ;destination memory + db %10010010 ;WR5 ready low,CE/WAIT,stop on end of block + db #cf ;WR6 load + db #b3 ;WR6 force ready +dma_in_end: + +wr_512: ld (dma_adr2),hl + push hl + ld hl,dma_out + ld bc,((dma_out_end-dma_out)*256)+dma_port + ld a,dos_bank + otir + ld a,dos_bank + ld b,#87 + call dma_start + pop hl + ld bc,512 + add hl,bc + ret + +dma_out: db #c3 ;WR6-reset + db %00000001 ;WR0-Temporarily declare Port B as source in WR0 (bit 2 = 0) + db %00010100 ;WR1-PA memory,increment + db %00101000 ;WR2-PB io, fixed + db %10000000 ;WR3 + db %10101101 ;WR4-Write Port B (fixed destination) address to WR4. + dw p_data ;port + db #cf ;WR6-load + db %01111101 ;WR0-transfer,portA,block length +dma_adr2: dw 0 ;memory + dw 511 ;block size + db %10010010 ;WR5-stop on end,/CE/WAIT,Ready low + db #cf ;WR6-load + db #b3 ;WR6-force ready +dma_out_end: + +tst_drv: ld l,a + ld h,0 + add hl,hl + add hl,hl + ld de,tab_drv + add hl,de + + ld e,(hl) + inc hl + ld d,(hl) + inc hl + push de + ld e,(hl) + inc hl + ld d,(hl) + pop hl + + ld a,d + rrca + rrca + and %01000000 + ld (wr_prot+1),a + + ld a,d + rrca + and %00000111 + jr z,mode0 + dec a + jr z,mode1 + dec a + jr z,mode2 + jr mode3 + +mode0: ld a,d + or %10100000 + and %10110000 ;LBA no way + ld (hea_wr0+1),a + ld (hea_rd0+1),a + + ld bc,rd_sec0 + ld (set_rdm+1),bc + ld bc,wr_sec0 + ld (set_wrm1+1),bc + ld (set_wrm2+1),bc + + jr mst_slv ;hl & de contains data! + +mode1: ld a,d + or %10100000 + and %10110000 ;LBA no way + ld (hea_wr1+1),a + ld (hea_rd1+1),a + + ld bc,rd_sec1 + ld (set_rdm+1),bc + ld bc,wr_sec1 + ld (set_wrm1+1),bc + ld (set_wrm2+1),bc + + jr mst_slv ;hl & de contains data! + +mode2: ld a,d + or %11100000 ;100% LBA + and %11110000 + ld (hea_wr1+1),a + ld (hea_rd1+1),a + + ld bc,rd_sec2 + ld (set_rdm+1),bc + ld bc,wr_sec2 + ld (set_wrm1+1),bc + ld (set_wrm2+1),bc + + jr lba_mod ;hl & de contains data! + +mode3: +mst_slv: and %00010000 + jr z,prim + ld a,(m_sec2) + ld (m_sec+1),a + ld a,(m_hea2) + ld (m_hea+1),a + ld bc,(m_cyl2) + ld (m_cyl+1),bc + jr slave + +prim: ld a,(m_sec1) + ld (m_sec+1),a + ld a,(m_hea1) + ld (m_hea+1),a + ld bc,(m_cyl1) + ld (m_cyl+1),bc +slave: +lba_mod: ld d,0 + ld (low24+1),hl + ld (hig24+1),de + + ld a,e + or h + or l + ret + +div: ld a,h + ld c,l + ld hl,0 + ld b,16 +div2: sll c + rla + adc hl,hl + sbc hl,de + jr nc,div3 + add hl,de + dec c +div3: djnz div2 + ex de,hl + ld h,a + ld l,c + ret + +div248: push ix + ld bc,0 + ld d,0 + ld lx,a + ld hx,24 +div2481: sll l + rl h + rl e + rl d + rl c + rl b + + ld a,d ;adc bcd,bcd + sbc a,lx + ld d,a + jp nc,divok1 + dec c + jp p,divok1 + dec b +divok1: jp p,divok3 ;sbc bcd,lx + + add a,lx + ld d,a + jp nc,divok2 + inc c + jp nz,divok2 + inc b +divok2: dec l +divok3: dec hx ;add bcd,lx + jp nz,div2481 + + pop ix + ret + + ent +patch_90h_end: +cfdriver_end: + +; Includes + + include "xy42.a80" ; 42 char print routine by Busy + include "draw.a80" ; draw routine by Busy + +; Data +msg_title_lbl: db " CF D" + db "river v1.2 for " + db "MB-02+" + db #00 + +msg_device_err: db " " + db "Device not" + db " present o" + db "r error!" + db #00 + +msg_mbr_err: db " " + db "Bad MBR or error!" + db #00 + +msg_part_miss: db " " + db "Dedicated " + db "partition " + db "not found!" + db #00 + +msg_drv_not_i: db " Unknown Error. CF Driver not installed!" + db #00 + +msg_drv_instld: db " CF Driver installed sucessfully." + db #00 + +msg_copyright: db " " + db #7f + db "2020 z00m^" + db "SinDiKAT" + db #00 + +msg_any_key: db " " + db "Press any key." + db #00 + +msg_device_inf: db "CF card: " +msg_device_nam: ds #4b,#20 + db "C/H/S: " +msg_device_cyl: ds #05,#20 + db "/" +msg_device_hea: ds #03,#20 + db "/" +msg_device_sec: ds #03,#20 + ds #16,#20 + db "LBA: " +msg_device_lba: ds #03,#20 + ds #22,#20 + db "Capacity: " +msg_device_cap: ds #05,#20 + db " MB" + db #00 + +msg_part_inf: db "Partitions: " + ds #1e,#20 + db "1:" +msg_part_1 ds #07,#20 + db " 2:" +msg_part_2 ds #07,#20 + db " 3:" +msg_part_3 ds #07,#20 + db " 4:" +msg_part_4 ds #07,#20 + db #00 + +msg_part_mb03: db "Dedicated " + db "partition " + db "found. " + ds #0c,#20 + db "Size: " +msg_pmb03_size: ds #0B,#20 + db "sectors." + ds #11,#20 + db "Possible n" + db "umber of d" + db "rives: " +msg_pmb03_dnum: ds #03,#20 + db "." + ds #0b,#20 + db "Occupied drives:" + db " @003 - @" +msg_pmb03_odrv: ds #03,#20 + db #0 + +p_m_other: db "other " +p_m_fat16: db "FAT16 " +p_m_fat32: db "FAT32 " +p_m_ntfs: db "NTFS " +p_m_mb02: db "MB-02+ " +p_m_sfs: db "SFS " +p_m_linux: db "Linux " +p_m_swap: db "swap " +p_m_bsd: db "BSD " +p_m_extended: db "extend " +p_m_none: db "none " + +; Variables +sp_store: dw #ffff +master_slave: db #00 +num_of_drives: db #00 +device_mode: db %00000000 ; bit7=0, bit6=CHS(0)/LBA(1), bit5=0, bit4=master(0)/slave(1) + ; bit3-bit1= LBA(010)/CHS2(001)/CHS1(000), bit0=write allowed(0)/write protect(1) +lba0: db 0 +lba1: db 0 +lba2: db 0 + +; Buffers +mas_id_buffer: ds #200 ; buffer for master device identify block +mas_mbr_buffr: ds #200 ; buffer for master MBR +font_buffer: ds #310 ; buffer for font + +;-------------------------------------- +; Virtual disk table + +vdt: + +v_mas_sectors: db 0 ;master: sectors +v_mas_heads: db 0 ;master: heads +v_mas_cyl_low: db 0 ;master: cylinders low +v_mas_cyl_high: db 0 ;master: cylinders high + +v_sla_sectors: db 0 ;slave: sectors +v_sla_heads: db 0 ;slave: heads +v_sla_cyl_low: db 0 ;slave: cylinders low +v_sla_cyl_high db 0 ;slave: cylinders high + + db 0, 0, 0 ,0 ;@0 - tape, don't change + + db 0, 0, 0, 0 ;@1 - floppy 1, don't change for MB-02+ + db 0, 0, 0, 0 ;@2 - floppy 2, don't change if two fdds are connected + +vdt_lba: ds 1012 ;table of virtual drives @3-@255 + ;the format is: lba0,lba1,lba2,device_mode +vdt_end: + savebin "cf-driver-mb02.bin",start,$-start + diff --git a/cf-driver/makecfd-mb02.sh b/cf-driver/makecfd-mb02.sh new file mode 100755 index 0000000..2725a7f --- /dev/null +++ b/cf-driver/makecfd-mb02.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# CF Driver builder +# Requirements: +# sjasmplus +# bin2tap +# dirtap + +ASM="sjasmplus" +FILE="cf-driver-mb02" + +${ASM} --syntax=fm --lst=${FILE}.lst ${FILE}.a80 +bin2tap -o ${FILE}.tap -a 32768 -b -c 32767 -r 32768 ${FILE}.bin +dirtap ${FILE}.tap diff --git a/flashboot/cfd-dron.hru b/flashboot/cfd-dron.hru new file mode 100644 index 0000000000000000000000000000000000000000..eae55d031969bb6086627a39448c13a041fa7b08 GIT binary patch literal 3252 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 S$Y}(`?47E+jeU9JEbxDS3aLi` literal 0 HcmV?d00001 diff --git a/flashboot/cfd-pvl.hru b/flashboot/cfd-pvl.hru new file mode 100644 index 0000000000000000000000000000000000000000..cf3c8b172602bfe246b93e376def77cf93253989 GIT binary patch literal 3252 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 Qj}b@mYd4}^+(`uf3+E4=T>t<8 literal 0 HcmV?d00001 diff --git a/flashboot/easyhdd-dron.hru b/flashboot/easyhdd-dron.hru new file mode 100644 index 0000000000000000000000000000000000000000..5dd5ce89f273c4fddb10ef574a3b6ae6c1673851 GIT binary patch literal 5610 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 literal 0 HcmV?d00001 diff --git a/flashboot/easyhdd-pvl.hru b/flashboot/easyhdd-pvl.hru new file mode 100644 index 0000000000000000000000000000000000000000..f5b7b9a4774818b45c424ba1d9036bcb8acb0103 GIT binary patch literal 5611 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 literal 0 HcmV?d00001 diff --git a/flashboot/flashboot.a80 b/flashboot/flashboot-cfd-dron.a80 similarity index 96% rename from flashboot/flashboot.a80 rename to flashboot/flashboot-cfd-dron.a80 index 97b806a..5d221f8 100644 --- a/flashboot/flashboot.a80 +++ b/flashboot/flashboot-cfd-dron.a80 @@ -1,7 +1,8 @@ -;Flashboot v01 for MB-02+ -;(c) 11/2019 z00m^SinDiKAT +;Flashboot v02 for MB-02+ +;(c) 20/2019 z00m^SinDiKAT +;CF Driver 1.2, Ports: Dron - output "flashboot.bin" + output "fb-cfd-dron.bin" ula: equ #fe dma: equ #0b @@ -197,12 +198,12 @@ dummyloop: dec hl jr nz,dummyloop ret -MsgStartup0: dc " ------------------" +MsgStartup0: dc " --------------------------" MsgStartup1: dc " MB-02+ FlashBoot" -MsgStartup2: dc " version: 01" -MsgStartup3: dc " ------------------" -MsgStartup4: dc " Press space to boot from floppy!" -MsgStartup5: dc " (c)2019 z00m / TCG / SinDiKAT" +MsgStartup2: dc " version: 02 CFD 1.2 Dron" +MsgStartup3: dc " --------------------------" +MsgStartup4: dc " Press space to boot from floppy!" +MsgStartup5: dc " (c)2020 z00m / TCG / SinDiKAT" MsgBootEnd0: dc "Booting from floppy... " MsgBootEnd1: dc "Booting from flash ROM... " @@ -491,14 +492,10 @@ RAMcode: ld a,flash_bank0 ;FlashROM BANK0 out (mem_port),a - ld hl,HDDpatchBin ;move HDD patch to RAM + ld hl,CFDBin ;move HDD patch to RAM ld de,#8000 call dehrust - ld hl,VDT ;move VDT to its place - ld de,#8003 - call dehrust - ld a,rom_bank_ro ;ROM BANK read only out (mem_port),a @@ -543,9 +540,7 @@ roll: db #55 RAMcode_end: -HDDpatchBin: incbin "hdpc.hru" - -VDT: incbin "vdt.hru" +CFDBin: incbin "cfd-dron.hru" BSDOSBin: incbin "bsdos.hru" diff --git a/flashboot/flashboot-cfd-pvl.a80 b/flashboot/flashboot-cfd-pvl.a80 new file mode 100644 index 0000000..a210e90 --- /dev/null +++ b/flashboot/flashboot-cfd-pvl.a80 @@ -0,0 +1,557 @@ +;Flashboot v02 for MB-02+ +;(c) 20/2019 z00m^SinDiKAT +;CF Driver 1.2, Ports: Dron + + output "fb-cfd-pvl.bin" + +ula: equ #fe +dma: equ #0b +fdc: equ #0f +mot: equ #13 +fdt: equ #2f +rez: equ #33 +fds: equ #4f +fdd: equ #6f + +mem_port: equ #17 +flash_bank0 equ #80 +flash_bank1 equ #81 +rom_bank: equ #60 +dos_bank: equ #61 +rom_bank_ro: equ #40 +dos_ena: equ #3c9e +killx: equ #1e +setdrv: equ #13 +startdos: equ #30 + +BootSector: equ #8000 +VideoRAM: equ #4000 + + org #0000 + +begin: di + + ld sp,#5fff ;stack to RAM + + ld hl,#ffff ;pause after reset + call dummyloop + + ld a,#d0 ;FDC - ForceInterrupt + out (fdc),a ;reset FDC + ld a,#c3 ;DMA - R6: Reset + out (dma),a ;reset DMA + + xor a ;interrupt and border + ld i,a + ld (ula),a + out (mot),a ;stop motors + + ld hl,#4000 ;clear screen + ld de,#4001 + ld bc,#1aff + ld (hl),a + ldir + + ld hl,#5800 + ld de,#5801 + ld bc,#2ff + ld (hl),#07 + ldir + +StartupMessage: ld hl,MsgStartup0 ;print informations + ld de,VideoRAM + call Print + + ld hl,MsgStartup1 + ld de,VideoRAM+#20 + call Print + + ld hl,MsgStartup2 + ld de,VideoRAM+#40 + call Print + + ld hl,MsgStartup3 + ld de,VideoRAM+#60 + call Print + + ld hl,MsgStartup4 + ld de,VideoRAM+#8*#100+#40 + call Print + + ld hl,MsgStartup5 + ld de,VideoRAM+#10*#100+#E0 + call Print + + ld a,#01 ;blue border while waiting for space + out (ula),a + +testspace: ld hl,#ffff ;timeout for fdd boot +tst_spc_lp: ld a,#7f ;test for space + in a,(ula) + and %00011111 + cp %00011110 + jr z,FDDBoot ;if space was pressed, boot from fdd + dec hl + ld a,h + or l + jr nz,tst_spc_lp ;waits for space about one sec + + xor a ;if space was not pressed + out (ula),a ;black border + + jp FlashBoot ;and boot from flashrom + +FDDBoot: ld hl,MsgBootEnd0 ;print "Booting from floppy..." message + ld de,VideoRAM+#8*#100+#40 + call Print + ld hl,#ffff + call dummyloop +FDDBoot1: ld e,%00000100 + ld a,#d0 ;FDC command - ForceInterrupt + out (fdc),a ;reset FDC + ld (BootSector),a ;clear BSDOS boot sector ID byte + ld a,#c3 ;DMA command - R6: Reset + out (dma),a ;reset DMA + +HDorDD: ld a,0 ;default if HD + xor 1 ;toggle HDD/DD + ld (HDorDD+1),a + out (rez),a ;set HD or DD + ld a,3 ;select drive0 and start motor0 + out (mot),a + out (fdc),a ;FDC command - track0 + +FloppyReady: in a,(mot) ;is floppy drive ready? + and e + jr z,FloppyReady + in a,(fdc) ;FDC command - read byte + and e + jr z,FDDBoot1 ;if head head is not on Track0 try again + ld a,1 + out (fds),a ;FDC set sector reg to 1 + + ld bc,DMASeqLen+dma ;DMA sequence - b:length, c:DMA port address + ld hl,DMASequence + otir ;initialise DMA + + ld a,#88 + out (fdc),a ; FDC command - read sector + +FloppyReady2: in a,(mot) ; is floppy drive ready? + and e + jr z,FloppyReady2 + in a,(fdc) ; FDC command - read byte + and #1c + jr nz,FDDBoot1 ; try again if some read error occured + ld a,(BootSector) + cp #18 ; check BSDOS boot sector ID byte + jr nz,FDDBoot1 ; try again if it's wrong + + +BootEnd: di + ld a,#d0 ; FDC command - ForceInterrupt + out (fdc),a ; reset FDC + ld a,#c3 ; DMA command - WR6: Reset + out (dma),a ; reset DMA + xor a + out (mot),a ; stop all motors and unselect any floppy drive + + ld a,#3f ; im1 + ld i,a + im 1 + ei + + jp BootSector ; Jump to the boot sector + +DMASequence: db #C3 ; R6: reset DMA + db #79 ; R0: DMA transfer PortB->PortA + dw BootSector ; destination address + dw #3FF ; size of data buffer + db #14 ; R1: PortA - memory, incremented, default timing + db #28 ; R2: PortB - I/O, fixed, default timing + db #80 ; R3: disable DMA, no interrupt + db #8D ; R4: byte mode, no interrupt, no pulse control + dw fdd ; source port address (FDD) + db #92 ; R5: ready active LOW, CE/WAIT, stop on end of block + db #CF ; R6: load + db #01 ; R0: DMA transfer rd:PortB->PortA, wr:PortA->PortB + db #CF ; R6: load + db #87 ; R6: enable DMA + +DMASeqCount: equ $-DMASequence +DMASeqLen: equ DMASeqCount*#100 + +FlashBoot: ld hl,MsgBootEnd1 ;print "Booting from flash ROM..." message + ld de,VideoRAM+#8*#100+#40 + call Print + + ld hl,RAMcode ;move main code to RAM + ld de,#6000 + ld bc,RAMcode_end-RAMcode + ldir + + jp #6000 + +dummyloop: dec hl + ld a,h + or l + jr nz,dummyloop + ret + +MsgStartup0: dc " --------------------------" +MsgStartup1: dc " MB-02+ FlashBoot" +MsgStartup2: dc " version: 02 CFD 1.2 PVL" +MsgStartup3: dc " --------------------------" +MsgStartup4: dc " Press space to boot from floppy!" +MsgStartup5: dc " (c)2020 z00m / TCG / SinDiKAT" + +MsgBootEnd0: dc "Booting from floppy... " +MsgBootEnd1: dc "Booting from flash ROM... " + +;--------------------------------------------------------- +;6-bit text print (42 columns) by MTB (c)1994 @ ZXM 5/1994 +;simplification, bugfix and sjasmplus formatting by z00m/SinDiKAT (c)2016 +;input: hl=text address, de=print position + +Print: ld (pos),de + xor a + ld (roll),a + +print1: push hl + ld a,(hl) + and 127 + call ascii + ld a,(roll) + inc a + cp 1 + call z,print2 + cp 2 + call z,print2 + cp 4 + jr nz,print3 + ld a,0 + call print2 +print3: ld (roll),a + pop hl + bit 7,(hl) + inc hl + ret nz + jr print1 + +print2: ld hl,(pos) + inc hl + ld (pos),hl + ret + +ascii: ld bc,MsgFont + push bc + sub 32 + ld e,a + ld d,0 + ld b,8 + ld hl,0 +x8: add hl,de + djnz x8 + pop bc + add hl,bc + ld de,(pos) + ex de,hl +asci0: ld a,(roll) + cp 3 + jr z,roll3 + cp 2 + jr z,roll2 + cp 1 + jr z,roll1 +roll0: call asci1 + ret + +roll1: ld b,8 +rol1_1: ld a,(de) + sla a + ld c,0 + rl c + sla a + rl c + push bc + call asci2 + pop bc + inc de + djnz rol1_1 + ret + +roll2: ld b,8 +rol2_1: ld a,(de) + sla a + ld c,0 + rl c + sla a + rl c + sla a + rl c + sla a + rl c + push bc + call asci2 + pop bc + inc de + djnz rol2_1 + ret + +roll3: ld b,8 +rol3_1: ld a,(de) + srl a + srl a + push bc + call asci3 + pop bc + inc de + djnz rol3_1 + ret + +asci1: ld b,8 +asc1: ld a,(de) + ld (hl),a + inc de + call downhl + djnz asc1 + ret + +asci2: ld (hl),a + ld a,c + dec hl + or (hl) + ld (hl),a + inc hl + call downhl + ret + +asci3: or (hl) + ld (hl),a + +downhl: inc h + ld a,h + and 7 + ret nz + ld a,l + add a,32 + ld l,a + ld a,h + jr c,down2 + sub 8 + ld h,a +down2: cp 88 + ret c + ld hl,64 + ret + +;5-bit font for messages +MsgFont: db #00, #00, #00, #00, #00, #00, #00, #00 + db #00, #20, #20, #20, #20, #00, #20, #00 + db #00, #50, #50, #00, #00, #00, #00, #00 + db #00, #50, #F8, #50, #50, #F8, #50, #00 + db #00, #20, #F8, #A0, #F8, #28, #F8, #20 + db #00, #40, #A8, #50, #20, #50, #A8, #10 + db #00, #20, #50, #20, #68, #90, #68, #00 + db #00, #10, #20, #00, #00, #00, #00, #00 + db #00, #08, #10, #10, #10, #10, #08, #00 + db #00, #40, #20, #20, #20, #20, #40, #00 + db #00, #00, #50, #20, #F8, #20, #50, #00 + db #00, #00, #20, #20, #F8, #20, #20, #00 + db #00, #00, #00, #00, #00, #10, #10, #20 + db #00, #00, #00, #00, #78, #00, #00, #00 + db #00, #00, #00, #00, #00, #30, #30, #00 + db #00, #00, #08, #10, #20, #40, #80, #00 + db #00, #70, #98, #A8, #A8, #C8, #70, #00 + db #00, #60, #A0, #20, #20, #20, #F8, #00 + db #00, #70, #88, #08, #70, #80, #F8, #00 + db #00, #70, #88, #30, #08, #88, #70, #00 + db #00, #10, #30, #50, #90, #F8, #10, #00 + db #00, #F8, #80, #F0, #08, #88, #70, #00 + db #00, #70, #80, #F0, #88, #88, #70, #00 + db #00, #F8, #08, #10, #20, #40, #40, #00 + db #00, #70, #88, #70, #88, #88, #70, #00 + db #00, #70, #88, #88, #78, #08, #70, #00 + db #00, #00, #00, #20, #00, #00, #20, #00 + db #00, #00, #20, #00, #00, #20, #20, #40 + db #00, #00, #08, #10, #20, #10, #08, #00 + db #00, #00, #00, #78, #00, #78, #00, #00 + db #00, #00, #20, #10, #08, #10, #20, #00 + db #00, #70, #88, #10, #20, #00, #20, #00 + db #00, #70, #08, #68, #A8, #A8, #70, #00 + db #00, #70, #88, #88, #F8, #88, #88, #00 + db #00, #F0, #88, #F0, #88, #88, #F0, #00 + db #00, #70, #88, #80, #80, #88, #70, #00 + db #00, #E0, #90, #88, #88, #90, #E0, #00 + db #00, #F8, #80, #F0, #80, #80, #F8, #00 + db #00, #F8, #80, #F0, #80, #80, #80, #00 + db #00, #70, #88, #80, #B8, #88, #70, #00 + db #00, #88, #88, #F8, #88, #88, #88, #00 + db #00, #F8, #20, #20, #20, #20, #F8, #00 + db #00, #08, #08, #08, #88, #88, #70, #00 + db #00, #90, #A0, #C0, #A0, #90, #88, #00 + db #00, #80, #80, #80, #80, #80, #F8, #00 + db #00, #88, #D8, #A8, #88, #88, #88, #00 + db #00, #88, #C8, #A8, #98, #88, #88, #00 + db #00, #70, #88, #88, #88, #88, #70, #00 + db #00, #F0, #88, #88, #F0, #80, #80, #00 + db #00, #70, #88, #88, #A8, #98, #70, #00 + db #00, #F0, #88, #88, #F0, #90, #88, #00 + db #00, #70, #80, #70, #08, #88, #70, #00 + db #00, #F8, #20, #20, #20, #20, #20, #00 + db #00, #88, #88, #88, #88, #88, #70, #00 + db #00, #88, #88, #88, #88, #50, #20, #00 + db #00, #88, #88, #88, #88, #A8, #50, #00 + db #00, #88, #50, #20, #20, #50, #88, #00 + db #00, #88, #50, #20, #20, #20, #20, #00 + db #00, #F8, #08, #30, #40, #80, #F8, #00 + db #00, #38, #20, #20, #20, #20, #38, #00 + db #00, #00, #80, #40, #20, #10, #08, #00 + db #00, #70, #10, #10, #10, #10, #70, #00 + db #00, #20, #70, #A8, #20, #20, #20, #00 + db #00, #00, #00, #00, #00, #00, #00, #FC + db #00, #30, #48, #E0, #40, #40, #F8, #00 + db #00, #00, #70, #08, #78, #88, #78, #00 + db #00, #80, #80, #F0, #88, #88, #F0, #00 + db #00, #00, #38, #40, #40, #40, #38, #00 + db #00, #08, #08, #78, #88, #88, #78, #00 + db #00, #00, #70, #88, #F0, #80, #78, #00 + db #00, #30, #40, #60, #40, #40, #40, #00 + db #00, #00, #78, #88, #88, #78, #08, #70 + db #00, #80, #80, #F0, #88, #88, #88, #00 + db #00, #20, #00, #60, #20, #20, #70, #00 + db #00, #08, #00, #08, #08, #08, #48, #30 + db #00, #40, #50, #60, #60, #50, #48, #00 + db #00, #40, #40, #40, #40, #40, #30, #00 + db #00, #00, #D0, #A8, #A8, #A8, #A8, #00 + db #00, #00, #F0, #88, #88, #88, #88, #00 + db #00, #00, #70, #88, #88, #88, #70, #00 + db #00, #00, #F0, #88, #88, #F0, #80, #80 + db #00, #00, #78, #88, #88, #78, #08, #08 + db #00, #00, #38, #40, #40, #40, #40, #00 + db #00, #00, #70, #80, #70, #08, #F0, #00 + db #00, #20, #70, #20, #20, #20, #18, #00 + db #00, #00, #88, #88, #88, #88, #70, #00 + db #00, #00, #88, #88, #50, #50, #20, #00 + db #00, #00, #88, #A8, #A8, #A8, #50, #00 + db #00, #00, #88, #50, #20, #50, #88, #00 + db #00, #00, #88, #88, #88, #78, #08, #70 + db #00, #00, #F8, #10, #20, #40, #F8, #00 + db #00, #38, #20, #C0, #20, #20, #38, #00 + db #00, #10, #10, #10, #10, #10, #10, #00 + db #00, #E0, #20, #18, #20, #20, #E0, #00 + db #00, #28, #50, #00, #00, #00, #00, #00 + db #00, #78, #84, #B4, #B4, #84, #78, #00 + +RAMcode: + disp #6000 + + ld a,flash_bank1 ;FlashROM BANK1 + out (mem_port),a + + ld hl,BSROMBin ;move BSROM to RAM + ld de,#8000 + call dehrust + + ld a,flash_bank0 ;FlashROM BANK0 + out (mem_port),a + + ld hl,BSDOSBin ;move BSDOS to RAM + ld de,#c000 + call dehrust + + + ld a,dos_bank ;SRAM DOS BANK + out (mem_port),a + + ld hl,#c000 ;move BSDOS to SRAM + ld de,#0000 + ld bc,#4000 + ldir + + ld hl,fddsetup ;move floppies setup to BSDOS + ld de,#80 + ld bc,#10 + ldir + + ld a,#c3 ;start FDC bios + ld hl,#0100 + ld (#18),a + ld (#19),hl + ld a,#0d ;pasive + rst #18 + + ld a,rom_bank ;SRAM ROM BANK + out (mem_port),a + + ld hl,#8000 ;move BSROM to SRAM + ld de,#0000 + ld bc,#4000 + ldir + + ld a,flash_bank0 ;FlashROM BANK0 + out (mem_port),a + + ld hl,CFDBin ;move HDD patch to RAM + ld de,#8000 + call dehrust + + ld a,rom_bank_ro ;ROM BANK read only + out (mem_port),a + + call #8000 ;run HDD patch + + call dos_ena ;DOS BANK + + ld a,killx ;clear cache + rst #20 + ld e,#03 ;drive @3 active + ld a,setdrv + rst #20 + ld a,startdos ;start operating system + rst #20 + rst #28 ;jump to ROM BIOS + dw #3906 ;with BSROM 128k reset + rst #00 ;if not, jump to 0 + ld a,#02 ;still here? + out (ula),a ;red border +dihalt: di ;and neverending loop + halt + jr dihalt + + include "dehrust.a80" + +fddsetup: db #03 ;drive @1: DD,HD (e.g. standard floppy) + db 80 ;80 tracks + db #00 ;3ms stepping + db #80 ;positive disk change + + db #03 ;drive @2: DD,HD (e.g. gotek) + db 80 ;80 tracks + db #00 ;3ms stepping + db #01 ;negative ready + + dw 0,0,0,0 ;drives @3 & @4 not connected + +pos: dw #5555 +roll: db #55 + + ent + +RAMcode_end: + +CFDBin: incbin "cfd-pvl.hru" + +BSDOSBin: incbin "bsdos.hru" + + dup #4000-$ + db #ff + edup + + disp #0000 +BSROMBin: incbin "bsrom.hru" + ent + + dup #8000-$ + db #ff + edup diff --git a/flashboot/flashboot-e105-dron.a80 b/flashboot/flashboot-e105-dron.a80 new file mode 100644 index 0000000..905d83a --- /dev/null +++ b/flashboot/flashboot-e105-dron.a80 @@ -0,0 +1,556 @@ +;Flashboot v02 for MB-02+ +;(c) 01/2020 z00m^SinDiKAT +;EasyHDD 105, Ports: Dron + + output "fb-e-dron.bin" + +ula: equ #fe +dma: equ #0b +fdc: equ #0f +mot: equ #13 +fdt: equ #2f +rez: equ #33 +fds: equ #4f +fdd: equ #6f + +mem_port: equ #17 +flash_bank0 equ #80 +flash_bank1 equ #81 +rom_bank: equ #60 +dos_bank: equ #61 +rom_bank_ro: equ #40 +dos_ena: equ #3c9e +killx: equ #1e +setdrv: equ #13 +startdos: equ #30 + +BootSector: equ #8000 +VideoRAM: equ #4000 + + org #0000 + +begin: di + + ld sp,#5fff ;stack to RAM + + ld hl,#ffff ;pause after reset + call dummyloop + + ld a,#d0 ;FDC - ForceInterrupt + out (fdc),a ;reset FDC + ld a,#c3 ;DMA - R6: Reset + out (dma),a ;reset DMA + + xor a ;interrupt and border + ld i,a + ld (ula),a + out (mot),a ;stop motors + + ld hl,#4000 ;clear screen + ld de,#4001 + ld bc,#1aff + ld (hl),a + ldir + + ld hl,#5800 + ld de,#5801 + ld bc,#2ff + ld (hl),#07 + ldir + +StartupMessage: ld hl,MsgStartup0 ;print informations + ld de,VideoRAM + call Print + + ld hl,MsgStartup1 + ld de,VideoRAM+#20 + call Print + + ld hl,MsgStartup2 + ld de,VideoRAM+#40 + call Print + + ld hl,MsgStartup3 + ld de,VideoRAM+#60 + call Print + + ld hl,MsgStartup4 + ld de,VideoRAM+#8*#100+#40 + call Print + + ld hl,MsgStartup5 + ld de,VideoRAM+#10*#100+#E0 + call Print + + ld a,#01 ;blue border while waiting for space + out (ula),a + +testspace: ld hl,#ffff ;timeout for fdd boot +tst_spc_lp: ld a,#7f ;test for space + in a,(ula) + and %00011111 + cp %00011110 + jr z,FDDBoot ;if space was pressed, boot from fdd + dec hl + ld a,h + or l + jr nz,tst_spc_lp ;waits for space about one sec + + xor a ;if space was not pressed + out (ula),a ;black border + + jp FlashBoot ;and boot from flashrom + +FDDBoot: ld hl,MsgBootEnd0 ;print "Booting from floppy..." message + ld de,VideoRAM+#8*#100+#40 + call Print + ld hl,#ffff + call dummyloop +FDDBoot1: ld e,%00000100 + ld a,#d0 ;FDC command - ForceInterrupt + out (fdc),a ;reset FDC + ld (BootSector),a ;clear BSDOS boot sector ID byte + ld a,#c3 ;DMA command - R6: Reset + out (dma),a ;reset DMA + +HDorDD: ld a,0 ;default if HD + xor 1 ;toggle HDD/DD + ld (HDorDD+1),a + out (rez),a ;set HD or DD + ld a,3 ;select drive0 and start motor0 + out (mot),a + out (fdc),a ;FDC command - track0 + +FloppyReady: in a,(mot) ;is floppy drive ready? + and e + jr z,FloppyReady + in a,(fdc) ;FDC command - read byte + and e + jr z,FDDBoot1 ;if head head is not on Track0 try again + ld a,1 + out (fds),a ;FDC set sector reg to 1 + + ld bc,DMASeqLen+dma ;DMA sequence - b:length, c:DMA port address + ld hl,DMASequence + otir ;initialise DMA + + ld a,#88 + out (fdc),a ; FDC command - read sector + +FloppyReady2: in a,(mot) ; is floppy drive ready? + and e + jr z,FloppyReady2 + in a,(fdc) ; FDC command - read byte + and #1c + jr nz,FDDBoot1 ; try again if some read error occured + ld a,(BootSector) + cp #18 ; check BSDOS boot sector ID byte + jr nz,FDDBoot1 ; try again if it's wrong + + +BootEnd: di + ld a,#d0 ; FDC command - ForceInterrupt + out (fdc),a ; reset FDC + ld a,#c3 ; DMA command - WR6: Reset + out (dma),a ; reset DMA + xor a + out (mot),a ; stop all motors and unselect any floppy drive + + ld a,#3f ; im1 + ld i,a + im 1 + ei + + jp BootSector ; Jump to the boot sector + +DMASequence: db #C3 ; R6: reset DMA + db #79 ; R0: DMA transfer PortB->PortA + dw BootSector ; destination address + dw #3FF ; size of data buffer + db #14 ; R1: PortA - memory, incremented, default timing + db #28 ; R2: PortB - I/O, fixed, default timing + db #80 ; R3: disable DMA, no interrupt + db #8D ; R4: byte mode, no interrupt, no pulse control + dw fdd ; source port address (FDD) + db #92 ; R5: ready active LOW, CE/WAIT, stop on end of block + db #CF ; R6: load + db #01 ; R0: DMA transfer rd:PortB->PortA, wr:PortA->PortB + db #CF ; R6: load + db #87 ; R6: enable DMA + +DMASeqCount: equ $-DMASequence +DMASeqLen: equ DMASeqCount*#100 + +FlashBoot: ld hl,MsgBootEnd1 ;print "Booting from flash ROM..." message + ld de,VideoRAM+#8*#100+#40 + call Print + + ld hl,RAMcode ;move main code to RAM + ld de,#6000 + ld bc,RAMcode_end-RAMcode + ldir + + jp #6000 + +dummyloop: dec hl + ld a,h + or l + jr nz,dummyloop + ret + +MsgStartup0: dc " --------------------------" +MsgStartup1: dc " MB-02+ FlashBoot" +MsgStartup2: dc " version: 02 EHDD 105 Dron" +MsgStartup3: dc " --------------------------" +MsgStartup4: dc " Press space to boot from floppy!" +MsgStartup5: dc " (c)2020 z00m / TCG / SinDiKAT" + +MsgBootEnd0: dc "Booting from floppy... " +MsgBootEnd1: dc "Booting from flash ROM... " + +;--------------------------------------------------------- +;6-bit text print (42 columns) by MTB (c)1994 @ ZXM 5/1994 +;simplification, bugfix and sjasmplus formatting by z00m/SinDiKAT (c)2016 +;input: hl=text address, de=print position + +Print: ld (pos),de + xor a + ld (roll),a + +print1: push hl + ld a,(hl) + and 127 + call ascii + ld a,(roll) + inc a + cp 1 + call z,print2 + cp 2 + call z,print2 + cp 4 + jr nz,print3 + ld a,0 + call print2 +print3: ld (roll),a + pop hl + bit 7,(hl) + inc hl + ret nz + jr print1 + +print2: ld hl,(pos) + inc hl + ld (pos),hl + ret + +ascii: ld bc,MsgFont + push bc + sub 32 + ld e,a + ld d,0 + ld b,8 + ld hl,0 +x8: add hl,de + djnz x8 + pop bc + add hl,bc + ld de,(pos) + ex de,hl +asci0: ld a,(roll) + cp 3 + jr z,roll3 + cp 2 + jr z,roll2 + cp 1 + jr z,roll1 +roll0: call asci1 + ret + +roll1: ld b,8 +rol1_1: ld a,(de) + sla a + ld c,0 + rl c + sla a + rl c + push bc + call asci2 + pop bc + inc de + djnz rol1_1 + ret + +roll2: ld b,8 +rol2_1: ld a,(de) + sla a + ld c,0 + rl c + sla a + rl c + sla a + rl c + sla a + rl c + push bc + call asci2 + pop bc + inc de + djnz rol2_1 + ret + +roll3: ld b,8 +rol3_1: ld a,(de) + srl a + srl a + push bc + call asci3 + pop bc + inc de + djnz rol3_1 + ret + +asci1: ld b,8 +asc1: ld a,(de) + ld (hl),a + inc de + call downhl + djnz asc1 + ret + +asci2: ld (hl),a + ld a,c + dec hl + or (hl) + ld (hl),a + inc hl + call downhl + ret + +asci3: or (hl) + ld (hl),a + +downhl: inc h + ld a,h + and 7 + ret nz + ld a,l + add a,32 + ld l,a + ld a,h + jr c,down2 + sub 8 + ld h,a +down2: cp 88 + ret c + ld hl,64 + ret + +;5-bit font for messages +MsgFont: db #00, #00, #00, #00, #00, #00, #00, #00 + db #00, #20, #20, #20, #20, #00, #20, #00 + db #00, #50, #50, #00, #00, #00, #00, #00 + db #00, #50, #F8, #50, #50, #F8, #50, #00 + db #00, #20, #F8, #A0, #F8, #28, #F8, #20 + db #00, #40, #A8, #50, #20, #50, #A8, #10 + db #00, #20, #50, #20, #68, #90, #68, #00 + db #00, #10, #20, #00, #00, #00, #00, #00 + db #00, #08, #10, #10, #10, #10, #08, #00 + db #00, #40, #20, #20, #20, #20, #40, #00 + db #00, #00, #50, #20, #F8, #20, #50, #00 + db #00, #00, #20, #20, #F8, #20, #20, #00 + db #00, #00, #00, #00, #00, #10, #10, #20 + db #00, #00, #00, #00, #78, #00, #00, #00 + db #00, #00, #00, #00, #00, #30, #30, #00 + db #00, #00, #08, #10, #20, #40, #80, #00 + db #00, #70, #98, #A8, #A8, #C8, #70, #00 + db #00, #60, #A0, #20, #20, #20, #F8, #00 + db #00, #70, #88, #08, #70, #80, #F8, #00 + db #00, #70, #88, #30, #08, #88, #70, #00 + db #00, #10, #30, #50, #90, #F8, #10, #00 + db #00, #F8, #80, #F0, #08, #88, #70, #00 + db #00, #70, #80, #F0, #88, #88, #70, #00 + db #00, #F8, #08, #10, #20, #40, #40, #00 + db #00, #70, #88, #70, #88, #88, #70, #00 + db #00, #70, #88, #88, #78, #08, #70, #00 + db #00, #00, #00, #20, #00, #00, #20, #00 + db #00, #00, #20, #00, #00, #20, #20, #40 + db #00, #00, #08, #10, #20, #10, #08, #00 + db #00, #00, #00, #78, #00, #78, #00, #00 + db #00, #00, #20, #10, #08, #10, #20, #00 + db #00, #70, #88, #10, #20, #00, #20, #00 + db #00, #70, #08, #68, #A8, #A8, #70, #00 + db #00, #70, #88, #88, #F8, #88, #88, #00 + db #00, #F0, #88, #F0, #88, #88, #F0, #00 + db #00, #70, #88, #80, #80, #88, #70, #00 + db #00, #E0, #90, #88, #88, #90, #E0, #00 + db #00, #F8, #80, #F0, #80, #80, #F8, #00 + db #00, #F8, #80, #F0, #80, #80, #80, #00 + db #00, #70, #88, #80, #B8, #88, #70, #00 + db #00, #88, #88, #F8, #88, #88, #88, #00 + db #00, #F8, #20, #20, #20, #20, #F8, #00 + db #00, #08, #08, #08, #88, #88, #70, #00 + db #00, #90, #A0, #C0, #A0, #90, #88, #00 + db #00, #80, #80, #80, #80, #80, #F8, #00 + db #00, #88, #D8, #A8, #88, #88, #88, #00 + db #00, #88, #C8, #A8, #98, #88, #88, #00 + db #00, #70, #88, #88, #88, #88, #70, #00 + db #00, #F0, #88, #88, #F0, #80, #80, #00 + db #00, #70, #88, #88, #A8, #98, #70, #00 + db #00, #F0, #88, #88, #F0, #90, #88, #00 + db #00, #70, #80, #70, #08, #88, #70, #00 + db #00, #F8, #20, #20, #20, #20, #20, #00 + db #00, #88, #88, #88, #88, #88, #70, #00 + db #00, #88, #88, #88, #88, #50, #20, #00 + db #00, #88, #88, #88, #88, #A8, #50, #00 + db #00, #88, #50, #20, #20, #50, #88, #00 + db #00, #88, #50, #20, #20, #20, #20, #00 + db #00, #F8, #08, #30, #40, #80, #F8, #00 + db #00, #38, #20, #20, #20, #20, #38, #00 + db #00, #00, #80, #40, #20, #10, #08, #00 + db #00, #70, #10, #10, #10, #10, #70, #00 + db #00, #20, #70, #A8, #20, #20, #20, #00 + db #00, #00, #00, #00, #00, #00, #00, #FC + db #00, #30, #48, #E0, #40, #40, #F8, #00 + db #00, #00, #70, #08, #78, #88, #78, #00 + db #00, #80, #80, #F0, #88, #88, #F0, #00 + db #00, #00, #38, #40, #40, #40, #38, #00 + db #00, #08, #08, #78, #88, #88, #78, #00 + db #00, #00, #70, #88, #F0, #80, #78, #00 + db #00, #30, #40, #60, #40, #40, #40, #00 + db #00, #00, #78, #88, #88, #78, #08, #70 + db #00, #80, #80, #F0, #88, #88, #88, #00 + db #00, #20, #00, #60, #20, #20, #70, #00 + db #00, #08, #00, #08, #08, #08, #48, #30 + db #00, #40, #50, #60, #60, #50, #48, #00 + db #00, #40, #40, #40, #40, #40, #30, #00 + db #00, #00, #D0, #A8, #A8, #A8, #A8, #00 + db #00, #00, #F0, #88, #88, #88, #88, #00 + db #00, #00, #70, #88, #88, #88, #70, #00 + db #00, #00, #F0, #88, #88, #F0, #80, #80 + db #00, #00, #78, #88, #88, #78, #08, #08 + db #00, #00, #38, #40, #40, #40, #40, #00 + db #00, #00, #70, #80, #70, #08, #F0, #00 + db #00, #20, #70, #20, #20, #20, #18, #00 + db #00, #00, #88, #88, #88, #88, #70, #00 + db #00, #00, #88, #88, #50, #50, #20, #00 + db #00, #00, #88, #A8, #A8, #A8, #50, #00 + db #00, #00, #88, #50, #20, #50, #88, #00 + db #00, #00, #88, #88, #88, #78, #08, #70 + db #00, #00, #F8, #10, #20, #40, #F8, #00 + db #00, #38, #20, #C0, #20, #20, #38, #00 + db #00, #10, #10, #10, #10, #10, #10, #00 + db #00, #E0, #20, #18, #20, #20, #E0, #00 + db #00, #28, #50, #00, #00, #00, #00, #00 + db #00, #78, #84, #B4, #B4, #84, #78, #00 + +RAMcode: + disp #6000 + + ld a,flash_bank1 ;FlashROM BANK1 + out (mem_port),a + + ld hl,BSROMBin ;move BSROM to RAM + ld de,#8000 + call dehrust + + ld a,flash_bank0 ;FlashROM BANK0 + out (mem_port),a + + ld hl,BSDOSBin ;move BSDOS to RAM + ld de,#c000 + call dehrust + + ld a,dos_bank ;SRAM DOS BANK + out (mem_port),a + + ld hl,#c000 ;move BSDOS to SRAM + ld de,#0000 + ld bc,#4000 + ldir + + ld hl,fddsetup ;move floppies setup to BSDOS + ld de,#80 + ld bc,#10 + ldir + + ld a,#c3 ;start FDC bios + ld hl,#0100 + ld (#18),a + ld (#19),hl + ld a,#0d ;pasive + rst #18 + + ld a,rom_bank ;SRAM ROM BANK + out (mem_port),a + + ld hl,#8000 ;move BSROM to SRAM + ld de,#0000 + ld bc,#4000 + ldir + + ld a,flash_bank0 ;FlashROM BANK0 + out (mem_port),a + + ld hl,EasyHDDBin ;move HDD patch to RAM + ld de,#8000 + call dehrust + + ld a,rom_bank_ro ;ROM BANK read only + out (mem_port),a + + call #8000 ;run HDD patch + + call dos_ena ;DOS BANK + + ld a,killx ;clear cache + rst #20 + ld e,#03 ;drive @3 active + ld a,setdrv + rst #20 + ld a,startdos ;start operating system + rst #20 + rst #28 ;jump to ROM BIOS + dw #3906 ;with BSROM 128k reset + rst #00 ;if not, jump to 0 + ld a,#02 ;still here? + out (ula),a ;red border +dihalt: di ;and neverending loop + halt + jr dihalt + + include "dehrust.a80" + +fddsetup: db #03 ;drive @1: DD,HD (e.g. standard floppy) + db 80 ;80 tracks + db #00 ;3ms stepping + db #80 ;positive disk change + + db #03 ;drive @2: DD,HD (e.g. gotek) + db 80 ;80 tracks + db #00 ;3ms stepping + db #01 ;negative ready + + dw 0,0,0,0 ;drives @3 & @4 not connected + +pos: dw #5555 +roll: db #55 + + ent + +RAMcode_end: + +EasyHDDBin: incbin "easyhdd-dron.hru" + +BSDOSBin: incbin "bsdos.hru" + + dup #4000-$ + db #ff + edup + + disp #0000 +BSROMBin: incbin "bsrom.hru" + ent + + dup #8000-$ + db #ff + edup diff --git a/flashboot/flashboot-e105-pvl.a80 b/flashboot/flashboot-e105-pvl.a80 new file mode 100644 index 0000000..0060a12 --- /dev/null +++ b/flashboot/flashboot-e105-pvl.a80 @@ -0,0 +1,556 @@ +;Flashboot v02 for MB-02+ +;(c) 01/2020 z00m^SinDiKAT +;EasyHDD 105, Ports: PVL + + output "fb-e-pvl.bin" + +ula: equ #fe +dma: equ #0b +fdc: equ #0f +mot: equ #13 +fdt: equ #2f +rez: equ #33 +fds: equ #4f +fdd: equ #6f + +mem_port: equ #17 +flash_bank0 equ #80 +flash_bank1 equ #81 +rom_bank: equ #60 +dos_bank: equ #61 +rom_bank_ro: equ #40 +dos_ena: equ #3c9e +killx: equ #1e +setdrv: equ #13 +startdos: equ #30 + +BootSector: equ #8000 +VideoRAM: equ #4000 + + org #0000 + +begin: di + + ld sp,#5fff ;stack to RAM + + ld hl,#ffff ;pause after reset + call dummyloop + + ld a,#d0 ;FDC - ForceInterrupt + out (fdc),a ;reset FDC + ld a,#c3 ;DMA - R6: Reset + out (dma),a ;reset DMA + + xor a ;interrupt and border + ld i,a + ld (ula),a + out (mot),a ;stop motors + + ld hl,#4000 ;clear screen + ld de,#4001 + ld bc,#1aff + ld (hl),a + ldir + + ld hl,#5800 + ld de,#5801 + ld bc,#2ff + ld (hl),#07 + ldir + +StartupMessage: ld hl,MsgStartup0 ;print informations + ld de,VideoRAM + call Print + + ld hl,MsgStartup1 + ld de,VideoRAM+#20 + call Print + + ld hl,MsgStartup2 + ld de,VideoRAM+#40 + call Print + + ld hl,MsgStartup3 + ld de,VideoRAM+#60 + call Print + + ld hl,MsgStartup4 + ld de,VideoRAM+#8*#100+#40 + call Print + + ld hl,MsgStartup5 + ld de,VideoRAM+#10*#100+#E0 + call Print + + ld a,#01 ;blue border while waiting for space + out (ula),a + +testspace: ld hl,#ffff ;timeout for fdd boot +tst_spc_lp: ld a,#7f ;test for space + in a,(ula) + and %00011111 + cp %00011110 + jr z,FDDBoot ;if space was pressed, boot from fdd + dec hl + ld a,h + or l + jr nz,tst_spc_lp ;waits for space about one sec + + xor a ;if space was not pressed + out (ula),a ;black border + + jp FlashBoot ;and boot from flashrom + +FDDBoot: ld hl,MsgBootEnd0 ;print "Booting from floppy..." message + ld de,VideoRAM+#8*#100+#40 + call Print + ld hl,#ffff + call dummyloop +FDDBoot1: ld e,%00000100 + ld a,#d0 ;FDC command - ForceInterrupt + out (fdc),a ;reset FDC + ld (BootSector),a ;clear BSDOS boot sector ID byte + ld a,#c3 ;DMA command - R6: Reset + out (dma),a ;reset DMA + +HDorDD: ld a,0 ;default if HD + xor 1 ;toggle HDD/DD + ld (HDorDD+1),a + out (rez),a ;set HD or DD + ld a,3 ;select drive0 and start motor0 + out (mot),a + out (fdc),a ;FDC command - track0 + +FloppyReady: in a,(mot) ;is floppy drive ready? + and e + jr z,FloppyReady + in a,(fdc) ;FDC command - read byte + and e + jr z,FDDBoot1 ;if head head is not on Track0 try again + ld a,1 + out (fds),a ;FDC set sector reg to 1 + + ld bc,DMASeqLen+dma ;DMA sequence - b:length, c:DMA port address + ld hl,DMASequence + otir ;initialise DMA + + ld a,#88 + out (fdc),a ; FDC command - read sector + +FloppyReady2: in a,(mot) ; is floppy drive ready? + and e + jr z,FloppyReady2 + in a,(fdc) ; FDC command - read byte + and #1c + jr nz,FDDBoot1 ; try again if some read error occured + ld a,(BootSector) + cp #18 ; check BSDOS boot sector ID byte + jr nz,FDDBoot1 ; try again if it's wrong + + +BootEnd: di + ld a,#d0 ; FDC command - ForceInterrupt + out (fdc),a ; reset FDC + ld a,#c3 ; DMA command - WR6: Reset + out (dma),a ; reset DMA + xor a + out (mot),a ; stop all motors and unselect any floppy drive + + ld a,#3f ; im1 + ld i,a + im 1 + ei + + jp BootSector ; Jump to the boot sector + +DMASequence: db #C3 ; R6: reset DMA + db #79 ; R0: DMA transfer PortB->PortA + dw BootSector ; destination address + dw #3FF ; size of data buffer + db #14 ; R1: PortA - memory, incremented, default timing + db #28 ; R2: PortB - I/O, fixed, default timing + db #80 ; R3: disable DMA, no interrupt + db #8D ; R4: byte mode, no interrupt, no pulse control + dw fdd ; source port address (FDD) + db #92 ; R5: ready active LOW, CE/WAIT, stop on end of block + db #CF ; R6: load + db #01 ; R0: DMA transfer rd:PortB->PortA, wr:PortA->PortB + db #CF ; R6: load + db #87 ; R6: enable DMA + +DMASeqCount: equ $-DMASequence +DMASeqLen: equ DMASeqCount*#100 + +FlashBoot: ld hl,MsgBootEnd1 ;print "Booting from flash ROM..." message + ld de,VideoRAM+#8*#100+#40 + call Print + + ld hl,RAMcode ;move main code to RAM + ld de,#6000 + ld bc,RAMcode_end-RAMcode + ldir + + jp #6000 + +dummyloop: dec hl + ld a,h + or l + jr nz,dummyloop + ret + +MsgStartup0: dc " --------------------------" +MsgStartup1: dc " MB-02+ FlashBoot" +MsgStartup2: dc " version: 02 EHDD 105 PVL" +MsgStartup3: dc " --------------------------" +MsgStartup4: dc " Press space to boot from floppy!" +MsgStartup5: dc " (c)2020 z00m / TCG / SinDiKAT" + +MsgBootEnd0: dc "Booting from floppy... " +MsgBootEnd1: dc "Booting from flash ROM... " + +;--------------------------------------------------------- +;6-bit text print (42 columns) by MTB (c)1994 @ ZXM 5/1994 +;simplification, bugfix and sjasmplus formatting by z00m/SinDiKAT (c)2016 +;input: hl=text address, de=print position + +Print: ld (pos),de + xor a + ld (roll),a + +print1: push hl + ld a,(hl) + and 127 + call ascii + ld a,(roll) + inc a + cp 1 + call z,print2 + cp 2 + call z,print2 + cp 4 + jr nz,print3 + ld a,0 + call print2 +print3: ld (roll),a + pop hl + bit 7,(hl) + inc hl + ret nz + jr print1 + +print2: ld hl,(pos) + inc hl + ld (pos),hl + ret + +ascii: ld bc,MsgFont + push bc + sub 32 + ld e,a + ld d,0 + ld b,8 + ld hl,0 +x8: add hl,de + djnz x8 + pop bc + add hl,bc + ld de,(pos) + ex de,hl +asci0: ld a,(roll) + cp 3 + jr z,roll3 + cp 2 + jr z,roll2 + cp 1 + jr z,roll1 +roll0: call asci1 + ret + +roll1: ld b,8 +rol1_1: ld a,(de) + sla a + ld c,0 + rl c + sla a + rl c + push bc + call asci2 + pop bc + inc de + djnz rol1_1 + ret + +roll2: ld b,8 +rol2_1: ld a,(de) + sla a + ld c,0 + rl c + sla a + rl c + sla a + rl c + sla a + rl c + push bc + call asci2 + pop bc + inc de + djnz rol2_1 + ret + +roll3: ld b,8 +rol3_1: ld a,(de) + srl a + srl a + push bc + call asci3 + pop bc + inc de + djnz rol3_1 + ret + +asci1: ld b,8 +asc1: ld a,(de) + ld (hl),a + inc de + call downhl + djnz asc1 + ret + +asci2: ld (hl),a + ld a,c + dec hl + or (hl) + ld (hl),a + inc hl + call downhl + ret + +asci3: or (hl) + ld (hl),a + +downhl: inc h + ld a,h + and 7 + ret nz + ld a,l + add a,32 + ld l,a + ld a,h + jr c,down2 + sub 8 + ld h,a +down2: cp 88 + ret c + ld hl,64 + ret + +;5-bit font for messages +MsgFont: db #00, #00, #00, #00, #00, #00, #00, #00 + db #00, #20, #20, #20, #20, #00, #20, #00 + db #00, #50, #50, #00, #00, #00, #00, #00 + db #00, #50, #F8, #50, #50, #F8, #50, #00 + db #00, #20, #F8, #A0, #F8, #28, #F8, #20 + db #00, #40, #A8, #50, #20, #50, #A8, #10 + db #00, #20, #50, #20, #68, #90, #68, #00 + db #00, #10, #20, #00, #00, #00, #00, #00 + db #00, #08, #10, #10, #10, #10, #08, #00 + db #00, #40, #20, #20, #20, #20, #40, #00 + db #00, #00, #50, #20, #F8, #20, #50, #00 + db #00, #00, #20, #20, #F8, #20, #20, #00 + db #00, #00, #00, #00, #00, #10, #10, #20 + db #00, #00, #00, #00, #78, #00, #00, #00 + db #00, #00, #00, #00, #00, #30, #30, #00 + db #00, #00, #08, #10, #20, #40, #80, #00 + db #00, #70, #98, #A8, #A8, #C8, #70, #00 + db #00, #60, #A0, #20, #20, #20, #F8, #00 + db #00, #70, #88, #08, #70, #80, #F8, #00 + db #00, #70, #88, #30, #08, #88, #70, #00 + db #00, #10, #30, #50, #90, #F8, #10, #00 + db #00, #F8, #80, #F0, #08, #88, #70, #00 + db #00, #70, #80, #F0, #88, #88, #70, #00 + db #00, #F8, #08, #10, #20, #40, #40, #00 + db #00, #70, #88, #70, #88, #88, #70, #00 + db #00, #70, #88, #88, #78, #08, #70, #00 + db #00, #00, #00, #20, #00, #00, #20, #00 + db #00, #00, #20, #00, #00, #20, #20, #40 + db #00, #00, #08, #10, #20, #10, #08, #00 + db #00, #00, #00, #78, #00, #78, #00, #00 + db #00, #00, #20, #10, #08, #10, #20, #00 + db #00, #70, #88, #10, #20, #00, #20, #00 + db #00, #70, #08, #68, #A8, #A8, #70, #00 + db #00, #70, #88, #88, #F8, #88, #88, #00 + db #00, #F0, #88, #F0, #88, #88, #F0, #00 + db #00, #70, #88, #80, #80, #88, #70, #00 + db #00, #E0, #90, #88, #88, #90, #E0, #00 + db #00, #F8, #80, #F0, #80, #80, #F8, #00 + db #00, #F8, #80, #F0, #80, #80, #80, #00 + db #00, #70, #88, #80, #B8, #88, #70, #00 + db #00, #88, #88, #F8, #88, #88, #88, #00 + db #00, #F8, #20, #20, #20, #20, #F8, #00 + db #00, #08, #08, #08, #88, #88, #70, #00 + db #00, #90, #A0, #C0, #A0, #90, #88, #00 + db #00, #80, #80, #80, #80, #80, #F8, #00 + db #00, #88, #D8, #A8, #88, #88, #88, #00 + db #00, #88, #C8, #A8, #98, #88, #88, #00 + db #00, #70, #88, #88, #88, #88, #70, #00 + db #00, #F0, #88, #88, #F0, #80, #80, #00 + db #00, #70, #88, #88, #A8, #98, #70, #00 + db #00, #F0, #88, #88, #F0, #90, #88, #00 + db #00, #70, #80, #70, #08, #88, #70, #00 + db #00, #F8, #20, #20, #20, #20, #20, #00 + db #00, #88, #88, #88, #88, #88, #70, #00 + db #00, #88, #88, #88, #88, #50, #20, #00 + db #00, #88, #88, #88, #88, #A8, #50, #00 + db #00, #88, #50, #20, #20, #50, #88, #00 + db #00, #88, #50, #20, #20, #20, #20, #00 + db #00, #F8, #08, #30, #40, #80, #F8, #00 + db #00, #38, #20, #20, #20, #20, #38, #00 + db #00, #00, #80, #40, #20, #10, #08, #00 + db #00, #70, #10, #10, #10, #10, #70, #00 + db #00, #20, #70, #A8, #20, #20, #20, #00 + db #00, #00, #00, #00, #00, #00, #00, #FC + db #00, #30, #48, #E0, #40, #40, #F8, #00 + db #00, #00, #70, #08, #78, #88, #78, #00 + db #00, #80, #80, #F0, #88, #88, #F0, #00 + db #00, #00, #38, #40, #40, #40, #38, #00 + db #00, #08, #08, #78, #88, #88, #78, #00 + db #00, #00, #70, #88, #F0, #80, #78, #00 + db #00, #30, #40, #60, #40, #40, #40, #00 + db #00, #00, #78, #88, #88, #78, #08, #70 + db #00, #80, #80, #F0, #88, #88, #88, #00 + db #00, #20, #00, #60, #20, #20, #70, #00 + db #00, #08, #00, #08, #08, #08, #48, #30 + db #00, #40, #50, #60, #60, #50, #48, #00 + db #00, #40, #40, #40, #40, #40, #30, #00 + db #00, #00, #D0, #A8, #A8, #A8, #A8, #00 + db #00, #00, #F0, #88, #88, #88, #88, #00 + db #00, #00, #70, #88, #88, #88, #70, #00 + db #00, #00, #F0, #88, #88, #F0, #80, #80 + db #00, #00, #78, #88, #88, #78, #08, #08 + db #00, #00, #38, #40, #40, #40, #40, #00 + db #00, #00, #70, #80, #70, #08, #F0, #00 + db #00, #20, #70, #20, #20, #20, #18, #00 + db #00, #00, #88, #88, #88, #88, #70, #00 + db #00, #00, #88, #88, #50, #50, #20, #00 + db #00, #00, #88, #A8, #A8, #A8, #50, #00 + db #00, #00, #88, #50, #20, #50, #88, #00 + db #00, #00, #88, #88, #88, #78, #08, #70 + db #00, #00, #F8, #10, #20, #40, #F8, #00 + db #00, #38, #20, #C0, #20, #20, #38, #00 + db #00, #10, #10, #10, #10, #10, #10, #00 + db #00, #E0, #20, #18, #20, #20, #E0, #00 + db #00, #28, #50, #00, #00, #00, #00, #00 + db #00, #78, #84, #B4, #B4, #84, #78, #00 + +RAMcode: + disp #6000 + + ld a,flash_bank1 ;FlashROM BANK1 + out (mem_port),a + + ld hl,BSROMBin ;move BSROM to RAM + ld de,#8000 + call dehrust + + ld a,flash_bank0 ;FlashROM BANK0 + out (mem_port),a + + ld hl,BSDOSBin ;move BSDOS to RAM + ld de,#c000 + call dehrust + + ld a,dos_bank ;SRAM DOS BANK + out (mem_port),a + + ld hl,#c000 ;move BSDOS to SRAM + ld de,#0000 + ld bc,#4000 + ldir + + ld hl,fddsetup ;move floppies setup to BSDOS + ld de,#80 + ld bc,#10 + ldir + + ld a,#c3 ;start FDC bios + ld hl,#0100 + ld (#18),a + ld (#19),hl + ld a,#0d ;pasive + rst #18 + + ld a,rom_bank ;SRAM ROM BANK + out (mem_port),a + + ld hl,#8000 ;move BSROM to SRAM + ld de,#0000 + ld bc,#4000 + ldir + + ld a,flash_bank0 ;FlashROM BANK0 + out (mem_port),a + + ld hl,EasyHDDBin ;move HDD patch to RAM + ld de,#8000 + call dehrust + + ld a,rom_bank_ro ;ROM BANK read only + out (mem_port),a + + call #8000 ;run HDD patch + + call dos_ena ;DOS BANK + + ld a,killx ;clear cache + rst #20 + ld e,#03 ;drive @3 active + ld a,setdrv + rst #20 + ld a,startdos ;start operating system + rst #20 + rst #28 ;jump to ROM BIOS + dw #3906 ;with BSROM 128k reset + rst #00 ;if not, jump to 0 + ld a,#02 ;still here? + out (ula),a ;red border +dihalt: di ;and neverending loop + halt + jr dihalt + + include "dehrust.a80" + +fddsetup: db #03 ;drive @1: DD,HD (e.g. standard floppy) + db 80 ;80 tracks + db #00 ;3ms stepping + db #80 ;positive disk change + + db #03 ;drive @2: DD,HD (e.g. gotek) + db 80 ;80 tracks + db #00 ;3ms stepping + db #01 ;negative ready + + dw 0,0,0,0 ;drives @3 & @4 not connected + +pos: dw #5555 +roll: db #55 + + ent + +RAMcode_end: + +EasyHDDBin: incbin "easyhdd-pvl.hru" + +BSDOSBin: incbin "bsdos.hru" + + dup #4000-$ + db #ff + edup + + disp #0000 +BSROMBin: incbin "bsrom.hru" + ent + + dup #8000-$ + db #ff + edup diff --git a/flashboot/hdpc.hru b/flashboot/hdpc.hru deleted file mode 100644 index 0b3a91896a91486d36a9e6f27fcf1134e5a783ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1103 zcmV-V1hD&PaxyWV4MzmRHVEC}$;0dugaFtC2mgtqr>n2Cx4XadA@DpAK%4;(1MRRO z1Ar0Cg#icz^Jm=G6!F`~S%zH~=~egfhh%2a88KoDBE<1}P2t z#lZ!f?)^XpS$FZ74)MhFneqKY@tJz@5Am7D^z{9iM)7^|nGo^H^qKelN%5J0@e%Qv zz4Yq+nLP1x@tG3w&h(l4{Y~+ig#F?Di}WEf9T6Aq8a_ZyW_@rxW%|QzzFEobL9Fv! zMi}=`I`0Gi1$ofJV-)2f{{VL@_Rz^Q!mI@B20?^iqz5Ph zugT@rN9}XR05O07%^Ui`62*zo@&D1`$$YgS10gu|BFnwW)#d%&&+U8mc;UAv*onWc@^PX?A69o_07P5@!=5w1R2ph{s|!MmdTes z1|!WY0C+MU1+Pa+Xkbu#gUb=i5I$82Js|wcyB!%RA~gkk;pXtjJ`lG`o@Pw~8GQUO z0TVty%_<05g%;H__h0(W>JkXm=(zdeMcz#e$trls?OQmL8T&j9eA7ZxTut$31_i(* zi2RuB;}ddI`=s-JI5ctLB(wL+xwqnX-m3ZDFY|KV;P)ri2EvQQc>MOD(*QmJ%=~%% zd)EDW^B`XQLgbtO{quJBuXh^LFz3@I2YdH@%~yh-lQIU$I)IY$aP#hJFYfcM0%j6{ z6>{W)3u<@sWxMlTpmy0-6THdqcOW|;cv~~ky)K0F-SZ*#ZC}k1ZME)g^8WuI10oOR zQz$U`2t|v4<)_75{40I5C=J^fJb(K=%YPu}@xkHd|F>8Ap6%uV$bR?9A|VImEErD# z3l8o4vp!)4ht1;1;Q{;t3CY8K{J;MJED){z`I67GB1>!8LD>;3+rkjn>l7$}+Rt^* zaMW)mBPrn#oA?=CBUaVb`{Uty5Axe1{PzA=G05U=a3YcX2OQ=|xCgxNJ7!*3Ylj@Xt>bsTd77HRcIP+6HpL?{m$$Y0x#Qp{l z%P|-2YBK>+FajA35cBJ2Y02H?BM^|*V{dpS7|S)$6r&Sb62IGe-JMtY(oP5s^8ASf VT@&4fF!Efp48r^b>@D3TfB<0)IPd@f diff --git a/flashboot/vdt.hru b/flashboot/vdt.hru deleted file mode 100644 index 203ee46bd767fefd9c70161900406b7bb6088ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmc~OGBV^~31(yf1A}k;+nE>&1^#m^b_tXCqp|gm#h