1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 | ;---------------------------------------------------------------------------
;
; SHard 1.8.0 - Schneller Boot von Floppy
; ===========
;
; (C) Copyright 1987, Michael Staubermann (ruc)
;
; Version 0.2, 22.01.87
;
;---------------------------------------------------------------------------
;
.6502
.RADIX 16
SUBTTL Floppyboot
slot equ 6
load_sec equ $C65C
p_data equ 27
sector equ 3D
ROM equ slot*100+0C000
vpoint EQU $10 ; Zeigt auf Volumetabelle
VOLTAB EQU $B800
DMA equ 50 ; 50..6F
sec_tble equ 70 ; 70..7F
task equ 80 ; 80
param equ 81
def_byte equ 82
disk_no equ 83
iob_trk equ 84
sec_cnt equ 85
iob_err equ 86
; work space
wait_Cnt equ 87
user_data equ 89
dest_phase equ 8B
chk_in_hdr equ 8C
sec_in_hdr equ 8D
trk_in_hdr equ 8E
vol_in_hdr equ 8F
slot10z equ 90 ; slot #: s0
iob_drv equ 91
phase equ 92
iob_sec equ 93
chk_sum equ 94
temp2 equ 95
head_pos equ 96
tktry_cnt equ 97
hdtry_cnt equ 98
recal_cnt equ 99
; Floppy Hardware
phase0 equ 0C080
phase1 equ 0C082
phase2 equ 0C084
phase3 equ 0C086
mtroff equ 0C088
mtron equ 0C089
drive0 equ 0C08A
Q6off equ 0C08C
Q6on equ 0C08D
Rstate equ 0C08E
Wstate equ 0C08F
bit_z equ 24
fast_step equ $0E ; etwas weniger als 3 ms Track-Wechselzeit
start180 EQU $C087 ; 64180 startet bei 0000
;----------------------------------------------------------------------------
pagerr macro adr
if high(*-start) ne high(adr-start)
.printx 'Page-Error'
endif
endm
.phase 0800
start:
nible1:
DB 0 ; Nur einen Sektor
cpx #60
beq slotok
jmp booterr
slotok:
lda sector
cmp #8 ; Alle Sektoren gewesen ?
beq loader
cmp #$0F
bne next_sec
lda #8
sta p_data
lda #0
sta sector ; Mit Sektor 1 nach 0900 weiter
next_sec:
inc p_data
inc sector
jmp load_sec ; Sector laden und --> 0801 springen
loader:
lda $03F3
sta $03F4 ; Reboot
lda def
sta def_byte
jmp load_shard
booterr:
jsr $FE84
jsr $FB2F
jsr $FE93
jsr $FE89
jsr $FC58 ; Init Video, KBD, CLRSCR...
ldy #0
err1: lda errtxt,y
eor #$80
jsr $FDED ; Auf Bildschirm ausgeben
iny
cmp #$8D ; RETURN als Abschluss
bne err1
jmp $FF65 ; Sprung in Monitor
errtxt: DB 'Boot error!', 0D
ds $FF-(*-start)
def: db $E0
include NIBLE.INC
write_data
SEC
LDA Q6on,X
LDA Rstate,X
BMI wrdat99
LDA nible2
STA temp2
LDA #0FF
STA Wstate,X ; 5
ORA Q6off,X ; 4
PHA ; 3
PLA ; 4 [sta..sta[
NOP ; 2
LDY #04 ; 2
wrdat1 PHA ; 3 3
PLA ; 4 4
JSR wrt_nibl1 ;+13 15 13
DEY ;--- 2
BNE wrdat1 ; 40 + 3
; --- ---
; 20+ 20 = 40
pagerr wrdat1
; -1
LDA #0D5 ; 2
JSR wrt_nibl ; 15 +15
LDA #0AA ; 2 ---
JSR wrt_nibl ;+15 36
LDA #0AD ;---
JSR wrt_nibl ; 32 15
TYA ; 2
LDY #56 ; 2
wrdat11 BNE wrdat3 ; 3
wrdat2 LDA nible2,Y ; 0 4
wrdat3 EOR nible2-1,Y ; 5 5
TAX ; 2 2
LDA to_nibble,X ; 4 4
LDX slot10z ; 3 3
; --- ---
; 36 18
STA Q6on,X ; 5
LDA Q6off,X ; 4
DEY ; 2
BNE wrdat2 ; 3
; ---
; 14 + 18 = 32
; -1
LDA temp2 ; 3
NOP ; 2
wrdat4 EOR nible1,Y ; 4 4
TAX ; 2 2
LDA to_nibble,X ; 4 4
LDX slot10 ; 4 4
; --- ---
; 32 14
STA Q6on,X ; 5
LDA Q6off,X ; 4
LDA nible1,Y ; 4
INY ; 2
BNE wrdat4 ; 3
; ---
; 18+ 14 = 32
pagerr wrdat11
TAX ; 2
LDA to_nibble,X ; 4
LDX slot10z ; 3
JSR wrt_nibl2 ; 6 15
LDA #0DE ; --- 2
JSR wrt_nibl ; 32 15
LDA #0AA ; ---
JSR wrt_nibl ; 32
LDA #0EB
JSR wrt_nibl
LDA #0FF
JSR wrt_nibl
LDA Rstate,X
wrdat99
LDA Q6off,X
wrdat999
dey
bne wrdat999 ; PostErase-Delay 1 ms
RTS
read_hdr
sei
LDY #0FC
STY temp2
rdhdr0
INY
BNE rdhdr1
INC temp2
BEQ fail
rdhdr1
LDA Q6off,X
BPL rdhdr1
rdhdr11 CMP #0D5
BNE rdhdr0
NOP
rdhdr2 LDA Q6off,X
BPL rdhdr2
CMP #0AA
BNE rdhdr11
LDY #03
rdhdr3 LDA Q6off,X
BPL rdhdr3
CMP #96
BNE rdhdr11
pagerr rdhdr1
LDA #00
nxthByte STA chk_sum
rdhdr4 LDA Q6off,X
BPL rdhdr4
ROL A
STA temp2
rdhdr5 LDA Q6off,X
BPL rdhdr5
AND temp2
STA chk_in_hdr,Y
EOR chk_sum
DEY
BPL nxthbyte
TAY
BNE fail
rdhdr6 LDA Q6off,X
bpl rdhdr6
cmp #0DE
BNE fail
NOP
rdhdr7 LDA Q6off,X
BPL rdhdr7
CMP #0AA
BNE fail
CLC
RTS
fail
SEC
RTS
moving
LDY #0
mov0 LDA Q6off,X
JSR mov1
PHA ; 3
PLA ; 4
CMP Q6off,X ; 4
BNE mov1 ;----
DEY ; 21 uS
BNE mov0
mov1 RTS
read_data
TXA
ORA #8C
STA ld1+1
STA ld2+1
STA ld3+1
STA ld4+1
STA ld5+1
LDA user_data
LDY user_data+1
STA st5+1
STY st5+2
SEC
SBC #54
BCS rddat1
DEY
SEC
rddat1
STA st3+1
STY st3+2
SBC #57
BCS rddat2
DEY
rddat2
STA st2+1
STY st2+2
LDY #20
nxt_begin
DEY
BEQ fail
wait_begin
waitb0 LDA Q6off,X
BPL waitb0
waitb00 EOR #0D5
BNE nxt_begin
NOP
waitb1 LDA Q6off,X
BPL waitb1
CMP #0AA
BNE waitb00
NOP
waitb2 LDA Q6off,X
BPL waitb2
CMP #0AD
BNE waitb00
LDY #0AA
LDA #0
rloop1 STA temp2
ld1 LDX Q6off+60 ; addr modified by read init !
BPL ld1
LDA to_bits-96,X
STA nible2-0AA,Y
EOR temp2
INY
BNE rloop1
;
; read nible from disk and convert to user data
;
LDY #0AA
BNE ld2
rloop2
st2 STA 1000,Y
ld2 LDX Q6off+60 ; modified by read init
BPL ld2
EOR to_bits-96,X
LDX nible2-0AA,Y
EOR to_bytes+0,X
INY
BNE rloop2
PHA
AND #0FC
LDY #0AA
ld3 LDX Q6off+60 ; modified by read init
BPL ld3
EOR to_bits-96,X
LDX nible2-0AA,Y
EOR to_bytes+1,X
st3 STA 1000,Y
INY
BNE ld3
ld4 LDX Q6off+60 ; modified by read init
BPL ld4
AND #0FC
LDY #0AC
rloop5 EOR to_bits-96,X
LDX nible2-0AC,Y
EOR to_bytes+2,X
st5 STA 1000,Y
ld5 LDX Q6off+60 ; modified by read init
BPL ld5
INY
BNE rloop5
AND #0FC
EOR to_bits-96,X
LDX slot10z
TAY
BNE chk_fail
rloop6 LDA Q6off,X
BPL rloop6
CMP #0DE
BEQ read_ok
pagerr wait_begin
chk_fail
SEC
db bit_z
read_ok
clc
PLA
LDY #55
STA (user_data),Y
RTS
seekT lda iob_trk
seekL
jsr trk_to_ph
cmp phase0,X
cmp phase1,X
cmp phase2,X
cmp phase3,X
LDY disk_no
LDA head_table,y ; da steht der Kopf jetzt
STA head_pos
lda dest_phase
sta head_table,y ; da soll er nachher stehen
seekH
cmp head_pos
BEQ seek_rts
LDA #0
STA temp2
seekh0 LDA head_pos
STA phase
SEC
SBC dest_phase
BEQ seekh5
BCS seekh1
EOR #0FF
INC head_pos
BCC seekh2
seekh1 ADC #0FE
DEC head_pos
seekh2 CMP temp2
BCC seekh3
LDA temp2
seekh3 CMP #8
BCS seekh4
TAY
seekh4 SEC
JSR step
LDA time0,Y
JSR step_wait
LDA phase
CLC
JSR step1
LDA time1,Y
JSR step_wait
INC temp2
BNE seekh0
seekh5 JSR step_wait
CLC
step LDA head_pos
step1 AND #3
ROL A
ORA slot10z
TAX
LDA phase0,X
LDX slot10z
seek_rts RTS
;-------------------------------;
make_nibl
LDY #56
LDA #0
maken0 STA nible2-1,Y
DEY
BNE maken0
maken1 LDX #55
maken2 LDA (user_data),Y
AND #0FC
STA nible1,Y
EOR (user_data),Y
INY
CMP #02
ORA nible2,X
ROR A
ROR A
STA nible2,X
DEX
BPL maken2
CPY #02
BNE maken1
RTS
; ds 10
Dsk_RW
ldx #0A9 ; LDA #xx
lda def_byte
and #$20 ; Bit 5 ?
bne rw_0 ; Fast Step - use abs. value
; Slow Step - use MotorOn/Off-Tables
ldx #0C9 ; CMP #xx
rw_0: stx step_wait
lda #fast_step ; Set Step Rate
bit def_byte
bmi rw_1 ; Bit7: Controller-Typ
; Bit7=0 => Ehring
lsr a ; bei Ehring 2-fache Phases => halbe Steprate
rw_1: sta step_wait+1 ; Steprate
lda disk_no
LSR A
TAY
LDA slotn,Y
STA slot10
sta slot10z
adc #0
STA iob_drv
include TRACK.INC
trk_to_ph: ; IN: A = track / OUT: A,dest_phase = phase
sta dest_phase
; Select Side 0
bit def_byte ; Bit7: 1=Erphi-Controller
; Bit6: 1=Erphi-Format
bvc ehring_format ; Bit6 = 0 => Ehring-Format
lsr dest_phase ; Erphi-Format
bcc side0
; Select Side 1
; Erphi: mtroff, Q6on, mtron
; Ehring: mtroff,mtron
side1: lda mtroff,x
bit def_byte
bpl side1_2
; Erphi-Side-1-Select
lda Q6on,x
side1_2:
lda mtron,x
jmp ph_mult
ehring_format:
cmp #$50 ; Track >= 80 ?
bcc side0 ; nein: Select Side 0
sbc #$50
sta dest_phase
jmp side1
; Select Side 0
; Ehring: lda cn00,x
; Erphi : mtroff, Q6off, mtron
side0: bit def_byte
bmi erphi_s0 ; Bit7 = 1 => Erphi-Controller
txa ; Ehring-Side-0-Select
lsr a
lsr a
lsr a
lsr a
ora #$C0
sta ehr_sel+2
ehr_sel:lda $C600
jmp ph_mult
erphi_s0: ; Erphi-Side-0-Select
cmp mtroff,x
cmp Q6off,x
cmp mtron,x
ph_mult:
lda def_byte ; Bit 0..1: 0 = 1 Step/Track
and #03 ; 1 = 2 Steps/Track
tay ; 2 = 4 Steps/Track
beq ph_mult2
ph_mult1:
asl dest_phase
dey
bne ph_mult1
ph_mult2:
lda dest_phase
rts
load_shard:
load_0: lda #$10
ldx #1 ; Track 1
jsr loadtrack
bne load_0
load_1: lda #$20
ldx #2 ; Track 2
jsr loadtrack
bne load_1
load_2: lda #$30
ldx #3 ; Track 3
jsr loadtrack
bne load_2
load_3: lda #$40
ldx #4 ; Track 4
jsr loadtrack
bne load_3
lda #HIGH VOLTAB
sta vpoint+1
lda #LOW VOLTAB
sta vpoint
ldx #8
loop2: lda eumel_vol,x
sta VOLTAB,x
dex
bpl loop2
lda #$C3
sta 0
lda #$00
sta 1
lda #$10
sta 2 ; JP $1000 - 64180
lda #0
sta task
sei
ldx #leng1-1
lp1:
lda codp,x
sta 8000,x
dex
bpl lp1
jmp 8000
codp:
ldx #$70 ; Karte in Slot 7
stx $04F8
lda start180,x ; Start 64180
loop:
lda task
cmp #4
bne loop ; Auf Adress-Task warten
jmp (1) ; Neue Taskloop anspringen
leng1 equ $-codp
loadtrack:
stx iob_trk
tax
dex
txa
ldx #0
ldy #0
boot31: pha
lda #0
sta sec_tble,y
sta DMA,x
pla
clc
adc #1
sta DMA+1,x
inx
inx
iny
cpy #10
bne boot31
;
; Steprate einstellen und andere Disk Voreinstellungen
;
sty sec_cnt ; := 10 read track, sector 0..F
ldx #0f
stx iob_err ; StepRate
ldx #0
stx disk_no ; := 0
dex
stx param ; := FF (read)
jsr dsk_rw
lda iob_err
rts
eumel_vol:
40H, 00H, 4AH, 60H, 00H, 00H, 0B3H, 00H, 0FFH
; Default, ggf. Aendern
END
|