* File loader by MADMAN/MADTEAM
* 31.01.96

* wersja dla MAD-Assembler 14.02.2005

   org $600

ad	equ $80
dlg	equ 176		;przesuniecie
buf	equ buf_adr+dlg	;bufor na katalog
obr	equ $bc40	;adres obrazu

source	equ $2000	;zrodlo
destin	equ $0700	;cel

main
   pla
   pla

   ldx <go
   ldy >go
   stx $a
   sty $a+1

   ldy #0
   ldx #4
mv lda source,y
mv_ sta destin,y
   dey
   bne mv
   inc mv+2
   inc mv_+2
   dex
   bne mv

   jmp destin  ;odpalamy !


; asemblujemy pod adres DESTIN, umieszczamy
; w pamieci pod adresem SOURCE

  org destin,source

* Init
go ldx <go     ;ustaw wektor RESET'a
   ldy >go
   stx $c
   sty $c+1

   lda #'}'    ;wyczysc ekran
   jsr $f2b0

   lda #$31    ;nr stacji+$30
   sta $300
   lda #1      ;nr stacji
   sta $301

   ldx <go     ;ustaw ($2e0) na 'go'
   ldy >go
   stx $2e0
   sty $2e0+1
   lda #7
   sta $306    ;timeout
   ldx <buf-dlg
   ldy >buf-dlg
   stx bf+1
   sty bf+2

   ldx #0
   stx file    ;liczba plikow=0
   stx up+1    ;wskaznik pliku=0
   stx eof+1   ;znacznik konca=0
   stx fl+1    ;flaga fl=0
   stx $2e2
   stx $2e2+1
   lda #32     ;wyczysc
cl jsr bf
   dex
   bne cl

* Density
   lda #$53    ;odczyt statusu stacji
   sta $302
   jsr $e453
   ldx <256    ;256 bajtow
   ldy >256    ;w sektorze
   lda $2ea
   and #%00100000
   bne rd
   ldx <128    ;128 bajtow
   ldy >128    ;w sektorze

* Read directory
rd lda #$52    ;$52 odczyt sektora
   jsr set
   ldx <$169   ;pierwszy nr sektora
   ldy >$169   ;z katalogiem dysku
   stx $30a
   sty $30b
   ldx <buf
   ldy >buf
   stx ad
   sty ad+1
   stx bf+1
   sty bf+2
   lda #8
   sta lic
l_ jsr sio
   clc
   lda $304
   adc lng+1
   sta $304
   tax
   lda $305
   adc lng+6
   sta $305
   tay
   inc $30a
   dec lic
   bne l_

* Create directory
   lda #8
   sta lic
a_ ldy #0
b_ lda (ad),y
   cmp #$42    ;pliki odbezpieczone
   beq _a
   cmp #$62    ;pliki zabezpieczone
   beq _a
*   cmp #$80    ;pliki skasowane
*   beq _a

   tya
   clc
   adc #16
   tay
   bne sk

_a ldx #0
c_ lda (ad),y
   jsr bf
   iny
   inx
   cpx #16
   bne c_
   inc file
   lda bf+1
   clc
   adc #16
   sta bf+1
   bcc sk
   inc bf+2
sk cpy #$80
   bne b_
   lda ad
   clc
   adc lng+1
   sta ad
   lda ad+1
   adc lng+6
   sta ad+1
   dec lic
   bne a_

   ldy #8
   ldx #0
   lda #32
cr jsr bf
   dex
   bne cr
   inc bf+2
   dey
   bne cr
   dec file

* Change file
cre jsr mul
   sta md+1

   lda <buf-dlg
   clc
md adc #0
   sta bu+1
   lda >buf-dlg
sd adc #0
   sta bu+2

   ldx <obr+9
   ldy >obr+9
   stx ek+1
   sty ek+2

   ldx #0
_b ldy #5
bu lda $ffff,y
   sec
   sbc #32
ek sta obr+9,y
   iny
   cpy #16
   bne bu
   lda bu+1
   clc
   adc #16
   sta bu+1
   bcc sp
   inc bu+2
sp lda ek+1
   clc
   adc #40
   sta ek+1
   bcc si
   inc ek+2
si inx
   cpx #24
   bne _b

is ldy #0
in lda obr+454,y
   ora #128
   sta obr+454,y
   iny
   cpy #11
   bne in

key lda #$ff
   sta 764
ee lda 764
   cmp #255
   beq ee
   cmp #15
   beq up
   cmp #14
   beq do
   cmp #33
   beq new
   cmp #28
   beq esc
   cmp #12
   beq loa
   jmp key

esc jmp $c8fc  ;Self Test
new jmp go
up lda #0
   cmp file
   beq u_q
   inc up+1
u_q jmp cre

do lda up+1
   beq d_q
   dec up+1
d_q jmp cre

* Load file
loa jsr mul
   sta low+1
   lda <buf
   clc
low adc #0
   sta ad
   lda >buf
   adc sd+1
   sta ad+1

   lda lng+1
   sec
   sbc #3
   sta rx+1    ;dlugosc sektora-3

   ldy #3      ;pierwszy sektor
   lda (ad),y
   sta link
   iny
   lda (ad),y
   sta link+1

   jsr r_sec

p3 ldy i
   lda mem,y
   sta adr
   jsr inc_i
   lda mem,y
   sta adr+1
   jsr inc_i

   lda adr
   and adr+1
   cmp #$ff
   beq ok
fl lda #0      ;if fl=0 then go
   bne p4      ;naglowek pliku<>ffff
   jmp go
ok inc fl+1    ;fl=fl+1
   jmp p3

p4 ldy i
   lda mem,y
   sta end
   jsr inc_i
   lda mem,y
   sta end+1

   lda end     ;end-adr=len
   sec         ;len-dlugosc bloku
   sbc adr
   sta len
   lda end+1
   sbc adr+1
   sta len+1

ki ldx adr     ;adres ladowania
   ldy adr+1   ;bloku
   stx des+1
   sty des+2

* Tutaj mozna sprawdzic czy adres
* ladowania nie koliduje z Loaderem
* lub z innym obszarem pamieci.

p1 jsr inc_i   ;laduje len+1 bajtow
   lda mem,y
des sta $ffff
   inc des+1
   bne om
   inc des+2

om lda len     ;len=len-1
   sec
   sbc #1
   sta len
   lda len+1
   sbc #0
   sta len+1
   bcs p1      ;if len>=0 then p1

   lda $2e2    ;if ($2e2)<>0 then ini
   ora $2e2+1
   bne ini
no and #0
   sta $2e2
   sta $2e2+1
   jsr inc_i
   jmp p3

ini lda >no-1  ;wloz na stos adres
   pha         ;powrotu
   lda <no-1
   pha
   jmp ($2e2)  ;wywolaj blok

r_sec lda link ;czytanie sektora
   sta $30a    ;< nr sektora
   lda link+1
   sta $30b    ;> nr sektora
   ldx <mem
   ldy >mem
   jsr sio     ;wczytaj
rx ldx #0
   lda mem,x
   and #%00000011
   sta link+1  ;link nastepny sektor
   lda mem+1,x
   sta link
   lda mem+2,x
   sta max+1   ;max bajtow w sektorze

   lda link    ;czy ostatni sektor
   ora link+1
   bne con
   inc eof+1   ;ustaw eof
con and #0
   sta i
   rts

inc_i inc i    ;i=i+1
   lda i
max cmp #0     ;if i>=max then r_sec
   bcc out
eof lda #0
   bne run
   jsr r_sec
out ldy i
   rts

run pla        ;zdejm adres powrotu
   pla
   lda >go-1   ;wloz adres powrotu
   pha
   lda <go-1
   pha
   jmp ($2e0)  ;uruchom glowny blok

mul lda #0     ;oblicz adres nazwy
   sta sd+1    ;pliku
   ldy #4
   lda up+1
rr asl @
   rol sd+1
   dey
   bne rr
rt_ rts

bf sta $ffff,x
   rts

set sta cod+1 ;kod operacji
   stx lng+1  ;< dlugosc sektora
   sty lng+6  ;> dlugosc sektora
   rts

sio stx $304    ;< adres bufora
   sty $305     ;> adres bufora
cod lda #$4e    ;$4e konifguracja
   sta $302
   lda #$40     ;$40 odczyt
   sta $303
lng lda <12     ;< dlugosc bufora
   sta $308
   lda >12      ;> dlugosc bufora
   sta $309
   jsr $e459    ;wywolanie procedury
   rts

lic  org *+1
file org *+1
i    org *+1
link org *+2
adr  org *+2
end  org *+2
len  org *+2

mem  org *+256	;bufor na sektor

buf_adr		;bufor dla katalogu dyskietki

   run main
