mirror of
https://github.com/Pecusx/micro-sparta-dos.git
synced 2026-05-20 22:33:23 +02:00
archive drop
This commit is contained in:
Executable
+2120
File diff suppressed because it is too large
Load Diff
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
+465
@@ -0,0 +1,465 @@
|
||||
; Uwaga!!!
|
||||
; Zapis dotyczacy jednego pliku w pamieci trzymany jest inaczej niz w basicowych wersjach MSINI
|
||||
; a takze inaczej niz w pliku na dysku
|
||||
; Ma on o jeden bajt wiecej, czyli zajmuje 47 bajtow
|
||||
; 11b nazwa pliku i rozszerzenie
|
||||
; 35b dluga nazwa pliku
|
||||
; 1b znacznik ze to katalog - " " plik, ">" katalog
|
||||
|
||||
icl '../lib/atari.hea'
|
||||
icl '../lib/system.hea'
|
||||
|
||||
; stale systemowe
|
||||
;MEMTOP = $02e5
|
||||
;MEMLO = $02e7
|
||||
|
||||
; Symbole SDX uzyte w programie - skoki do nich loader SpartyX podmienia po wczytaniu
|
||||
comtab smb 'comtab'
|
||||
u_getpar smb 'u_getpar'
|
||||
u_gepath smb 'u_gepath'
|
||||
printf smb 'printf'
|
||||
getcwd smb 'getcwd'
|
||||
file_p smb 'file_p'
|
||||
ffirst smb 'ffirst'
|
||||
fnext smb 'fnext'
|
||||
fclose smb 'fclose'
|
||||
fopen smb 'fopen'
|
||||
fread smb 'fread'
|
||||
fwrite smb 'fwrite'
|
||||
|
||||
; offsety do comtab
|
||||
lbuf equ $3f
|
||||
bufoff equ $0a
|
||||
comfnam equ $21
|
||||
trails equ $1a
|
||||
|
||||
; Stale adresy SDX
|
||||
path equ $07a0
|
||||
device equ $0761
|
||||
fmode equ $0778
|
||||
fatr1 equ $0779
|
||||
fatr2 equ $077a
|
||||
faux1 equ $0782
|
||||
faux2 equ $0783
|
||||
faux3 equ $0784
|
||||
faux4 equ $0785
|
||||
faux5 equ $0786
|
||||
|
||||
; Stale adresy - pojedynczy zapis katalogu
|
||||
dirbuf equ $0789
|
||||
dirfatr equ dirbuf
|
||||
dirf1sec equ dirbuf+1
|
||||
dirflen equ dirbuf+3
|
||||
dirfname equ dirbuf+6
|
||||
dirfdate equ dirbuf+17
|
||||
dirftime equ dirbuf+20
|
||||
|
||||
; zmienne na stronie zerowej
|
||||
edited_file_addr equ $80 ;adres w pamieci RAM obecnie edytowanego zapisu, obliczony z buffer o edited_file
|
||||
print_addr equ edited_file_addr+2 ;adres w pamieci ekranu, do ktorego zapisujemy.
|
||||
tempA equ edited_file_addr+4
|
||||
tempB equ edited_file_addr+6
|
||||
|
||||
; Poczatek kodu relokowalnego
|
||||
blk reloc main
|
||||
; Tutaj kod relokowalny, Sparta zaladuje go powyzej swojego MEMLO
|
||||
; i po zaladowaniu oraz relokacji adresow, podniesie MEMLO za ten blok
|
||||
; czyli w programie mozna jako bufora roboczy zajac obszar od MEMLO do HIMEM
|
||||
|
||||
start
|
||||
jsr printf
|
||||
.BYTE 125,'MSINI Lite4 (c) 2010-08-31',$9b,0
|
||||
jsr u_getpar ; pobranie kolejnego parametru
|
||||
jsr getcwd ; jesli parametrem byl podkatalog to go obrobi a jesli go nie bylo to poda bierzacy
|
||||
; co wazne SPARWDZA czy ten katalog jest i jesli nie wychodzi z odpowiednim bledem !
|
||||
lda device
|
||||
tax
|
||||
and #%11110000 ; sprawdzamy czy podana (lub nie) sciezka dotyczy napedu dyskow
|
||||
bne not_disc_drive
|
||||
dex
|
||||
txa
|
||||
clc
|
||||
adc #'A'
|
||||
sta ourpath
|
||||
; robimy sciezke
|
||||
ldx #$00
|
||||
; przepisujemy z pobranej do naszej
|
||||
path_loop1
|
||||
lda path,x
|
||||
sta ourpath+2,x
|
||||
beq end_of_path
|
||||
inx
|
||||
bne path_loop1
|
||||
end_of_path
|
||||
; na koniec uzupelniamy o '\', znak konca linii o 0 (dla pewnosci dla printf)
|
||||
lda #'\'
|
||||
sta ourpath+2,x
|
||||
inx
|
||||
lda #$9b
|
||||
sta ourpath+2,x
|
||||
inx
|
||||
lda #$00
|
||||
sta ourpath+2,x
|
||||
inx
|
||||
stx ourpath_end ; zapamietajmy gdzie konczy sie sciezka - tu bedzie dopisywana nazwa pliku
|
||||
not_disc_drive
|
||||
; wyliczmy na ile zapisow mamy miejsce w pamieci
|
||||
; od memtopa odjac memlona
|
||||
sbw MEMTOP MEMLO buffer ; tymczasowo w max_flies, bo trzeba to podzielic przez dlugosc wpisu - 47
|
||||
; no i jak to podzielic.... ???
|
||||
; a wezmy poprostu poodejmujmy w petli .... :)
|
||||
mwa #0 max_files ; zerujmy licznik plikow
|
||||
count_free_files
|
||||
sbw buffer #47 buffer
|
||||
bcc end_memory
|
||||
inw max_files
|
||||
jmp count_free_files
|
||||
end_memory
|
||||
jsr printf
|
||||
.BYTE 'MEMLO: $%4x , MEMTOP: $%4x',$9b,'FREE MEMORY FOR $%4x FILES.',$9b,0
|
||||
.WORD MEMLO,MEMTOP,max_files
|
||||
jsr printf
|
||||
.BYTE 'Reading directory: '
|
||||
.BYTE '%s',$9b,0
|
||||
.WORD ourpath
|
||||
; parametry '*' na standardowe
|
||||
jsr set_default_params
|
||||
|
||||
; ----- czytamy katalog zliczajac pliki i umieszczajac ich nazwy w pamieci -----
|
||||
|
||||
; to przeczytajmy katalog procedurami SDX
|
||||
; najpierw dopiszmy maske
|
||||
ldx ourpath_end
|
||||
ldy #$00
|
||||
make_search_patch
|
||||
lda searchmask,y
|
||||
sta ourpath,x
|
||||
beq spath_ready
|
||||
inx
|
||||
iny
|
||||
bne make_search_patch
|
||||
spath_ready
|
||||
mwa Pourpath file_p
|
||||
; maska artybutów - tylko nieukryte ($20)
|
||||
lda #$20
|
||||
sta fatr1
|
||||
; licznik plikow na 00
|
||||
mwa #0 num_of_files
|
||||
; czytamy pierwszy wpis
|
||||
jsr ffirst
|
||||
bmi directory_end
|
||||
bpl dir_entry_in_buf ; od razu obrabiamy
|
||||
get_next_dir_entry
|
||||
; czytamy kolejne wpisy
|
||||
jsr fnext
|
||||
bmi directory_end
|
||||
dir_entry_in_buf
|
||||
; tu mamy w 'dirbuf' pojedynczy zapis - trzeba cos z nim zrobic
|
||||
; sprawdzmy czy to nie MSDOS
|
||||
ldx #$07
|
||||
check_next1
|
||||
lda dirfname,x
|
||||
cmp MSDOSname,x
|
||||
bne not_msdos
|
||||
dex
|
||||
bpl check_next1
|
||||
bmi get_next_dir_entry
|
||||
not_msdos
|
||||
; tu wiemy juz ze plik nie nazywa sie MSDOS.*
|
||||
; printujemy kropke....
|
||||
jsr printf
|
||||
.BYTE '.',0
|
||||
; wyznaczamy adres w buforze
|
||||
mwa num_of_files edited_file_nr
|
||||
jsr set_edit_addr
|
||||
; mamy adres przepisujemy wiec nazwe pliku
|
||||
ldy #0
|
||||
name_to_mem_loop
|
||||
lda dirfname,y
|
||||
sta (edited_file_addr),y
|
||||
iny
|
||||
cpy #11
|
||||
bne name_to_mem_loop
|
||||
; reszte dopelnamy spacjami
|
||||
lda #' '
|
||||
spaces_fill
|
||||
sta (edited_file_addr),y
|
||||
iny
|
||||
cpy #47
|
||||
bne spaces_fill
|
||||
; sprawdzmy czy to przypadkiem nie katalog i jesli tak dopiszmy na koncu <DIR>
|
||||
lda dirfatr
|
||||
and #$20
|
||||
beq not_DIR
|
||||
; dopisujemy <DIR> na koncu tekstu
|
||||
ldy #46
|
||||
ldx #5
|
||||
DIRmark_set
|
||||
lda DIRmark,x
|
||||
sta (edited_file_addr),y
|
||||
dey
|
||||
dex
|
||||
bpl DIRmark_set
|
||||
not_DIR
|
||||
inw num_of_files ; zwiekszamy licznik plikow
|
||||
jmp get_next_dir_entry
|
||||
directory_end
|
||||
jsr fclose
|
||||
jsr printf
|
||||
.BYTE $9b,'FILES IN DIR: $%4x.',$9b,0
|
||||
.WORD num_of_files
|
||||
|
||||
; ----- sprawdzamy czy jest plik MSDOS.DAT -----
|
||||
|
||||
; najpierw dopiszmy nazwe do sciezki
|
||||
ldx ourpath_end
|
||||
ldy #$00
|
||||
make_dat_patch
|
||||
lda datname,y
|
||||
sta ourpath,x
|
||||
beq dat_path_ready
|
||||
inx
|
||||
iny
|
||||
bne make_dat_patch
|
||||
dat_path_ready
|
||||
mwa Pourpath file_p
|
||||
; maska artybutów - tylko nieukryte ($20)
|
||||
lda #$20
|
||||
sta fatr1
|
||||
; czytamy pierwszy wpis
|
||||
jsr ffirst
|
||||
bpl dat_file_found
|
||||
jsr fclose
|
||||
jmp start_edit
|
||||
|
||||
; ----- jest plik MSDOS.DAT - czytamy go -----
|
||||
|
||||
dat_file_found
|
||||
jsr fclose ; zamykamy czytanie katalogu
|
||||
jsr printf
|
||||
.BYTE 'MSDOS.DAT found.',$9b,'Reading descriptions',$9b,$0
|
||||
; czyli przygotowujemy otwarcie pliku do odczytu
|
||||
mwa Pourpath file_p
|
||||
; tryb otwarcia - odczyt
|
||||
lda #$04
|
||||
sta fmode
|
||||
; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80)
|
||||
lda #$A0
|
||||
sta fatr1
|
||||
; i otwieramy plik
|
||||
jsr fopen
|
||||
|
||||
; plik otwarty - petla czytajaca dane tu sie zaczyna
|
||||
read_block
|
||||
mwa Pone_buffer faux1 ; adres bufora
|
||||
mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu)
|
||||
jsr fread
|
||||
bmi end_dat_file
|
||||
; printujemy kropke....
|
||||
jsr printf
|
||||
.BYTE '.',0
|
||||
; sprawdzmy czy nie gwiazdka
|
||||
lda one_buffer
|
||||
cmp #'*'
|
||||
beq asterix_found
|
||||
; jesli nie gwiazdka to rozpoczynamy petle szukania
|
||||
mwa #0 edited_file_nr
|
||||
search_names1
|
||||
jsr set_edit_addr
|
||||
; porownajmy filenama
|
||||
ldy #10
|
||||
compare_names1
|
||||
lda (edited_file_addr),y
|
||||
cmp one_buffer,y
|
||||
bne check_next_name1
|
||||
dey
|
||||
bpl compare_names1
|
||||
; nazwy takie same - przepiszmy calosc (poza znacznikiem katalogu, bo on juz jest)
|
||||
ldy #45
|
||||
long_name_from_DAT
|
||||
lda one_buffer,y
|
||||
sta (edited_file_addr),y
|
||||
dey
|
||||
bpl long_name_from_DAT
|
||||
check_next_name1
|
||||
inw edited_file_nr
|
||||
cpw num_of_files edited_file_nr
|
||||
bne search_names1 ; jesli edited jest mniejszy lub rowny num_files
|
||||
beq read_block
|
||||
asterix_found
|
||||
; jesli gwiazdka to przepisujemy 'opis' do specjalnego bufora
|
||||
ldy #34
|
||||
get_asterix_params
|
||||
lda one_buffer+11,y
|
||||
sta current_params,y
|
||||
dey
|
||||
bpl get_asterix_params
|
||||
bmi read_block ; i czytamy dalej...
|
||||
end_dat_file
|
||||
jsr fclose
|
||||
; ----- przygotowujemy ekran edycji -----
|
||||
|
||||
start_edit
|
||||
;jsr screenStart
|
||||
;jsr DAT_file_write
|
||||
stop
|
||||
jmp stop
|
||||
rts
|
||||
|
||||
; procedura zapisu pliku DAT
|
||||
DAT_file_write
|
||||
; przygotowujemy otwarcie pliku do zapisu
|
||||
mwa Pourpath file_p
|
||||
; tryb otwarcia - zapis
|
||||
lda #$08
|
||||
sta fmode
|
||||
; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80)
|
||||
lda #$A0
|
||||
sta fatr1
|
||||
lda #$00
|
||||
sta fatr2
|
||||
; i otwieramy plik
|
||||
jsr fopen
|
||||
; plik otwarty do zapisu
|
||||
; na poczatek sprawdzamy czy trzeba zapisac parametry kolorow itp....
|
||||
ldy#34
|
||||
check_standard_params
|
||||
lda current_params,y
|
||||
cmp standard_params,y
|
||||
bne asterix_write
|
||||
dey
|
||||
bpl check_standard_params
|
||||
bmi asterix_standard
|
||||
asterix_write
|
||||
mwa Pasterix_data faux1 ; adres bufora
|
||||
mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu - bo go nie zapisujemy)
|
||||
jsr fwrite
|
||||
asterix_standard
|
||||
mwa #0 edited_file_nr
|
||||
; petla zapisujaca dane tu sie zaczyna
|
||||
write_block
|
||||
; sprawdzmy czy nazwa nie jest pusta
|
||||
jsr set_edit_addr
|
||||
; porownajmy filenama ze spacjemi
|
||||
ldy #11
|
||||
compare_names2
|
||||
lda (edited_file_addr),y
|
||||
cmp #' '
|
||||
bne name_not_empty1
|
||||
iny
|
||||
cpy #46
|
||||
bne compare_names2
|
||||
beq next_name_to_write
|
||||
name_not_empty1
|
||||
; nazwa nie jest pusta wyprintowujemy ja wiec do pliku, ale nie tak latwo
|
||||
; najpierw przepiszmy do podrecznego bufora (bez znacznika katalogu)
|
||||
ldy #45
|
||||
name_to_buff
|
||||
lda (edited_file_addr),y
|
||||
sta one_buffer,y
|
||||
dey
|
||||
bpl name_to_buff
|
||||
; i zapisujemy tem buforek
|
||||
mwa Pone_buffer faux1 ; adres bufora
|
||||
mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu)
|
||||
jsr fwrite
|
||||
next_name_to_write
|
||||
inw edited_file_nr
|
||||
cpw num_of_files edited_file_nr
|
||||
bne write_block ; jesli edited jest mniejszy
|
||||
end_dat_write
|
||||
jsr fclose
|
||||
rts
|
||||
|
||||
|
||||
; procedura obliczajaca na podstawie numeru zapisu
|
||||
; jego adres w pamieci RAM
|
||||
set_edit_addr
|
||||
; trzeba pomnozyc edited_file_nr przez dlugosc zapisu (46) i dodac adres bufora
|
||||
; od razu robimy dodawanie, czyli do wyniku nie zero tylko adres bufora!!!
|
||||
mwa Pbuffer edited_file_addr
|
||||
mwa edited_file_nr word1 ; w word1 mnozna (2 bajty)
|
||||
lda #47
|
||||
sta word2 ; w word2 mnoznik (1 bajt)
|
||||
ldy #8 ; mnozymy przez 8 bitow - word2 (choc wlasciwie mniej mozna)
|
||||
clc
|
||||
mulloop1
|
||||
lsr word2
|
||||
bcc mull_no_c
|
||||
adw edited_file_addr word1
|
||||
mull_no_c
|
||||
asl word1
|
||||
rol word1+1
|
||||
dey
|
||||
bne mulloop1
|
||||
rts
|
||||
|
||||
; ustawienie parametrow dodatkowych folderu (gwiazdka) na standardowe
|
||||
set_default_params
|
||||
ldy #34
|
||||
setting_def_par
|
||||
lda standard_params,y
|
||||
sta current_params,y
|
||||
dey
|
||||
bpl setting_def_par
|
||||
rts
|
||||
|
||||
; procedura zmiany znaku w akumulatorze z ATASCII na EKRANOWY (uwzglednia inwers wiec jest dziwna)
|
||||
atascii2internal
|
||||
asl @
|
||||
php
|
||||
cmp #$c0
|
||||
bcs internal_OK
|
||||
sbc #$3f
|
||||
bcs internal_OK
|
||||
adc #$c0
|
||||
internal_OK
|
||||
plp
|
||||
ror @
|
||||
rts
|
||||
|
||||
; zmienne programu
|
||||
standard_params
|
||||
.BYTE 'CAC4C401 ' ; standardowe parametry dla '*'
|
||||
Pasterix_data DTA V(asterix_data)
|
||||
asterix_data
|
||||
.BYTE '* '
|
||||
current_params
|
||||
.BYTE ' ' ; miejsce na edytowane parametry
|
||||
DIRmark
|
||||
.BYTE '<DIR>>',$00 ; koncowka dlugiej nazwy i znacznik katalogu za nia (jesli to katalog)
|
||||
searchmask
|
||||
.BYTE '*.*',$9b,$00
|
||||
datname
|
||||
.BYTE 'MSDOS.DAT',$9b,$00
|
||||
MSDOSname
|
||||
.BYTE 'MSDOS ',$00
|
||||
Pourpath DTA V(ourpath) ; wskaznik na ourpath (potrzebne by wiedziec gdzie bedzie po relokacji)
|
||||
ourpath
|
||||
.BYTE 'A:\ '
|
||||
ourpath_end
|
||||
.BYTE $00 ; offset konca sciezki wskazuje na pierwszy znak po '\'
|
||||
edited_file_nr
|
||||
.WORD $0000 ; numer aktualnie edytowanego zapisu (do obliczenia offsetu)
|
||||
max_files
|
||||
.WORD $0000
|
||||
num_of_files
|
||||
.WORD $0000
|
||||
first_on_screen
|
||||
.WORD $0000 ; numer pierwszego zapisu wyswietlanego na ekranie (offset)
|
||||
word1
|
||||
.WORD $0000 ; zmienna pomocnicza do mnozenia itp...
|
||||
word2
|
||||
.WORD $0000 ; druga zmienna pomocnicza
|
||||
Pone_buffer DTA V(one_buffer)
|
||||
one_buffer
|
||||
.BYTE ' '
|
||||
Pbuffer DTA V(buffer)
|
||||
buffer
|
||||
.BYTE $0000 ; adres bufora
|
||||
|
||||
ICL "screen_proc.as8"
|
||||
|
||||
; na koncu automatyczne wygenerowanie bloku zawierajacego adresy do relokacji
|
||||
blk update address
|
||||
blk update symbol
|
||||
Executable
BIN
Binary file not shown.
Executable
+458
@@ -0,0 +1,458 @@
|
||||
; Uwaga!!!
|
||||
; Zapis dotyczacy jednego pliku w pamieci trzymany jest inaczej niz w basicowych wersjach MSINI
|
||||
; a takze inaczej niz w pliku na dysku
|
||||
; Ma on o jeden bajt wiecej, czyli zajmuje 47 bajtow
|
||||
; 11b nazwa pliku i rozszerzenie
|
||||
; 35b dluga nazwa pliku
|
||||
; 1b znacznik ze to katalog - " " plik, ">" katalog
|
||||
|
||||
; stale systemowe
|
||||
MEMTOP = $02e5
|
||||
MEMLO = $02e7
|
||||
|
||||
; Symbole SDX uzyte w programie - skoki do nich loader SpartyX podmienia po wczytaniu
|
||||
comtab smb 'comtab'
|
||||
u_getpar smb 'u_getpar'
|
||||
u_gepath smb 'u_gepath'
|
||||
printf smb 'printf'
|
||||
getcwd smb 'getcwd'
|
||||
file_p smb 'file_p'
|
||||
ffirst smb 'ffirst'
|
||||
fnext smb 'fnext'
|
||||
fclose smb 'fclose'
|
||||
fopen smb 'fopen'
|
||||
fread smb 'fread'
|
||||
fwrite smb 'fwrite'
|
||||
|
||||
; offsety do comtab
|
||||
lbuf equ $3f
|
||||
bufoff equ $0a
|
||||
comfnam equ $21
|
||||
trails equ $1a
|
||||
|
||||
; Stale adresy SDX
|
||||
path equ $07a0
|
||||
device equ $0761
|
||||
fmode equ $0778
|
||||
fatr1 equ $0779
|
||||
fatr2 equ $077a
|
||||
faux1 equ $0782
|
||||
faux2 equ $0783
|
||||
faux3 equ $0784
|
||||
faux4 equ $0785
|
||||
faux5 equ $0786
|
||||
|
||||
; Stale adresy - pojedynczy zapis katalogu
|
||||
dirbuf equ $0789
|
||||
dirfatr equ dirbuf
|
||||
dirf1sec equ dirbuf+1
|
||||
dirflen equ dirbuf+3
|
||||
dirfname equ dirbuf+6
|
||||
dirfdate equ dirbuf+17
|
||||
dirftime equ dirbuf+20
|
||||
|
||||
; zmienne na stronie zerowej
|
||||
edited_file_addr equ $80 ; adres w pamieci RAM obecnie edytowanego zapisu, obliczony z buffer o edited_file
|
||||
print_addr equ $82 ; adres w pamieci ekranu, do ktorego zapisujemy.
|
||||
|
||||
|
||||
; Poczatek kodu relokowalnego
|
||||
blk reloc main
|
||||
; Tutaj kod relokowalny, Sparta zaladuje go powyzej swojego MEMLO
|
||||
; i po zaladowaniu oraz relokacji adresow, podniesie MEMLO za ten blok
|
||||
; czyli w programie mozna jako bufora roboczy zajac obszar od MEMLO do HIMEM
|
||||
|
||||
start
|
||||
jsr printf
|
||||
.BYTE 125,'MSINI Lite4 (c) 2010-08-31',$9b,0
|
||||
jsr u_getpar ; pobranie kolejnego parametru
|
||||
jsr getcwd ; jesli parametrem byl podkatalog to go obrobi a jesli go nie bylo to poda bierzacy
|
||||
; co wazne SPARWDZA czy ten katalog jest i jesli nie wychodzi z odpowiednim bledem !
|
||||
lda device
|
||||
tax
|
||||
and #%11110000 ; sprawdzamy czy podana (lub nie) sciezka dotyczy napedu dyskow
|
||||
bne not_disc_drive
|
||||
dex
|
||||
txa
|
||||
clc
|
||||
adc #'A'
|
||||
sta ourpath
|
||||
; robimy sciezke
|
||||
ldx #$00
|
||||
; przepisujemy z pobranej do naszej
|
||||
path_loop1
|
||||
lda path,x
|
||||
sta ourpath+2,x
|
||||
beq end_of_path
|
||||
inx
|
||||
bne path_loop1
|
||||
end_of_path
|
||||
; na koniec uzupelniamy o '\', znak konca linii o 0 (dla pewnosci dla printf)
|
||||
lda #'\'
|
||||
sta ourpath+2,x
|
||||
inx
|
||||
lda #$9b
|
||||
sta ourpath+2,x
|
||||
inx
|
||||
lda #$00
|
||||
sta ourpath+2,x
|
||||
inx
|
||||
stx ourpath_end ; zapamietajmy gdzie konczy sie sciezka - tu bedzie dopisywana nazwa pliku
|
||||
not_disc_drive
|
||||
; wyliczmy na ile zapisow mamy miejsce w pamieci
|
||||
; od memtopa odjac memlona
|
||||
sbw MEMTOP MEMLO buffer ; tymczasowo w max_flies, bo trzeba to podzielic przez dlugosc wpisu - 47
|
||||
; no i jak to podzielic.... ???
|
||||
; a wezmy poprostu poodejmujmy w petli .... :)
|
||||
mwa #0 max_files ; zerujmy licznik plikow
|
||||
count_free_files
|
||||
sbw buffer #47 buffer
|
||||
bcc end_memory
|
||||
inw max_files
|
||||
jmp count_free_files
|
||||
end_memory
|
||||
jsr printf
|
||||
.BYTE 'MEMLO: $%4x , MEMTOP: $%4x',$9b,'FREE MEMORY FOR $%4x FILES.',$9b,0
|
||||
.WORD MEMLO,MEMTOP,max_files
|
||||
jsr printf
|
||||
.BYTE 'Reading directory: '
|
||||
.BYTE '%s',$9b,0
|
||||
.WORD ourpath
|
||||
; parametry '*' na standardowe
|
||||
jsr set_default_params
|
||||
|
||||
; ----- czytamy katalog zliczajac pliki i umieszczajac ich nazwy w pamieci -----
|
||||
|
||||
; to przeczytajmy katalog procedurami SDX
|
||||
; najpierw dopiszmy maske
|
||||
ldx ourpath_end
|
||||
ldy #$00
|
||||
make_search_patch
|
||||
lda searchmask,y
|
||||
sta ourpath,x
|
||||
beq spath_ready
|
||||
inx
|
||||
iny
|
||||
bne make_search_patch
|
||||
spath_ready
|
||||
mwa Pourpath file_p
|
||||
; maska artybutów - tylko nieukryte ($20)
|
||||
lda #$20
|
||||
sta fatr1
|
||||
; licznik plikow na 00
|
||||
mwa #0 num_of_files
|
||||
; czytamy pierwszy wpis
|
||||
jsr ffirst
|
||||
bmi directory_end
|
||||
bpl dir_entry_in_buf ; od razu obrabiamy
|
||||
get_next_dir_entry
|
||||
; czytamy kolejne wpisy
|
||||
jsr fnext
|
||||
bmi directory_end
|
||||
dir_entry_in_buf
|
||||
; tu mamy w 'dirbuf' pojedynczy zapis - trzeba cos z nim zrobic
|
||||
; sprawdzmy czy to nie MSDOS
|
||||
ldx #$07
|
||||
check_next1
|
||||
lda dirfname,x
|
||||
cmp MSDOSname,x
|
||||
bne not_msdos
|
||||
dex
|
||||
bpl check_next1
|
||||
bmi get_next_dir_entry
|
||||
not_msdos
|
||||
; tu wiemy juz ze plik nie nazywa sie MSDOS.*
|
||||
; printujemy kropke....
|
||||
jsr printf
|
||||
.BYTE '.',0
|
||||
; wyznaczamy adres w buforze
|
||||
mwa num_of_files edited_file_nr
|
||||
jsr set_edit_addr
|
||||
; mamy adres przepisujemy wiec nazwe pliku
|
||||
ldy #0
|
||||
name_to_mem_loop
|
||||
lda dirfname,y
|
||||
sta (edited_file_addr),y
|
||||
iny
|
||||
cpy #11
|
||||
bne name_to_mem_loop
|
||||
; reszte dopelnamy spacjami
|
||||
lda #' '
|
||||
spaces_fill
|
||||
sta (edited_file_addr),y
|
||||
iny
|
||||
cpy #47
|
||||
bne spaces_fill
|
||||
; sprawdzmy czy to przypadkiem nie katalog i jesli tak dopiszmy na koncu <DIR>
|
||||
lda dirfatr
|
||||
and #$20
|
||||
beq not_DIR
|
||||
; dopisujemy <DIR> na koncu tekstu
|
||||
ldy #46
|
||||
ldx #5
|
||||
DIRmark_set
|
||||
lda DIRmark,x
|
||||
sta (edited_file_addr),y
|
||||
dey
|
||||
dex
|
||||
bpl DIRmark_set
|
||||
not_DIR
|
||||
inw num_of_files ; zwiekszamy licznik plikow
|
||||
jmp get_next_dir_entry
|
||||
directory_end
|
||||
jsr fclose
|
||||
jsr printf
|
||||
.BYTE $9b,'FILES IN DIR: $%4x.',$9b,0
|
||||
.WORD num_of_files
|
||||
|
||||
; ----- sprawdzamy czy jest plik MSDOS.DAT -----
|
||||
|
||||
; najpierw dopiszmy nazwe do sciezki
|
||||
ldx ourpath_end
|
||||
ldy #$00
|
||||
make_dat_patch
|
||||
lda datname,y
|
||||
sta ourpath,x
|
||||
beq dat_path_ready
|
||||
inx
|
||||
iny
|
||||
bne make_dat_patch
|
||||
dat_path_ready
|
||||
mwa Pourpath file_p
|
||||
; maska artybutów - tylko nieukryte ($20)
|
||||
lda #$20
|
||||
sta fatr1
|
||||
; czytamy pierwszy wpis
|
||||
jsr ffirst
|
||||
bpl dat_file_found
|
||||
jsr fclose
|
||||
jmp start_edit
|
||||
|
||||
; ----- jest plik MSDOS.DAT - czytamy go -----
|
||||
|
||||
dat_file_found
|
||||
jsr fclose ; zamykamy czytanie katalogu
|
||||
jsr printf
|
||||
.BYTE 'MSDOS.DAT found.',$9b,'Reading descriptions',$9b,$0
|
||||
; czyli przygotowujemy otwarcie pliku do odczytu
|
||||
mwa Pourpath file_p
|
||||
; tryb otwarcia - odczyt
|
||||
lda #$04
|
||||
sta fmode
|
||||
; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80)
|
||||
lda #$A0
|
||||
sta fatr1
|
||||
; i otwieramy plik
|
||||
jsr fopen
|
||||
|
||||
; plik otwarty - petla czytajaca dane tu sie zaczyna
|
||||
read_block
|
||||
mwa Pone_buffer faux1 ; adres bufora
|
||||
mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu)
|
||||
jsr fread
|
||||
bmi end_dat_file
|
||||
; printujemy kropke....
|
||||
jsr printf
|
||||
.BYTE '.',0
|
||||
; sprawdzmy czy nie gwiazdka
|
||||
lda one_buffer
|
||||
cmp #'*'
|
||||
beq asterix_found
|
||||
; jesli nie gwiazdka to rozpoczynamy petle szukania
|
||||
mwa #0 edited_file_nr
|
||||
search_names1
|
||||
jsr set_edit_addr
|
||||
; porownajmy filenama
|
||||
ldy #10
|
||||
compare_names1
|
||||
lda (edited_file_addr),y
|
||||
cmp one_buffer,y
|
||||
bne check_next_name1
|
||||
dey
|
||||
bpl compare_names1
|
||||
; nazwy takie same - przepiszmy calosc (poza znacznikiem katalogu, bo on juz jest)
|
||||
ldy #45
|
||||
long_name_from_DAT
|
||||
lda one_buffer,y
|
||||
sta (edited_file_addr),y
|
||||
dey
|
||||
bpl long_name_from_DAT
|
||||
check_next_name1
|
||||
inw edited_file_nr
|
||||
cpw num_of_files edited_file_nr
|
||||
bne search_names1 ; jesli edited jest mniejszy lub rowny num_files
|
||||
beq read_block
|
||||
asterix_found
|
||||
; jesli gwiazdka to przepisujemy 'opis' do specjalnego bufora
|
||||
ldy #34
|
||||
get_asterix_params
|
||||
lda one_buffer+11,y
|
||||
sta current_params,y
|
||||
dey
|
||||
bpl get_asterix_params
|
||||
bmi read_block ; i czytamy dalej...
|
||||
end_dat_file
|
||||
jsr fclose
|
||||
; ----- przygotowujemy ekran edycji -----
|
||||
|
||||
start_edit
|
||||
jsr DAT_file_write
|
||||
stop
|
||||
jmp stop
|
||||
rts
|
||||
|
||||
; procedura zapisu pliku DAT
|
||||
DAT_file_write
|
||||
; przygotowujemy otwarcie pliku do zapisu
|
||||
mwa Pourpath file_p
|
||||
; tryb otwarcia - zapis
|
||||
lda #$08
|
||||
sta fmode
|
||||
; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80)
|
||||
lda #$A0
|
||||
sta fatr1
|
||||
lda #$00
|
||||
sta fatr2
|
||||
; i otwieramy plik
|
||||
jsr fopen
|
||||
; plik otwarty do zapisu
|
||||
; na poczatek sprawdzamy czy trzeba zapisac parametry kolorow itp....
|
||||
ldy#34
|
||||
check_standard_params
|
||||
lda current_params,y
|
||||
cmp standard_params,y
|
||||
bne asterix_write
|
||||
dey
|
||||
bpl check_standard_params
|
||||
bmi asterix_standard
|
||||
asterix_write
|
||||
mwa Pasterix_data faux1 ; adres bufora
|
||||
mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu - bo go nie zapisujemy)
|
||||
jsr fwrite
|
||||
asterix_standard
|
||||
mwa #0 edited_file_nr
|
||||
; petla zapisujaca dane tu sie zaczyna
|
||||
write_block
|
||||
; sprawdzmy czy nazwa nie jest pusta
|
||||
jsr set_edit_addr
|
||||
; porownajmy filenama ze spacjemi
|
||||
ldy #11
|
||||
compare_names2
|
||||
lda (edited_file_addr),y
|
||||
cmp #' '
|
||||
bne name_not_empty1
|
||||
iny
|
||||
cpy #46
|
||||
bne compare_names2
|
||||
beq next_name_to_write
|
||||
name_not_empty1
|
||||
; nazwa nie jest pusta wyprintowujemy ja wiec do pliku, ale nie tak latwo
|
||||
; najpierw przepiszmy do podrecznego bufora (bez znacznika katalogu)
|
||||
ldy #45
|
||||
name_to_buff
|
||||
lda (edited_file_addr),y
|
||||
sta one_buffer,y
|
||||
dey
|
||||
bpl name_to_buff
|
||||
; i zapisujemy tem buforek
|
||||
mwa Pone_buffer faux1 ; adres bufora
|
||||
mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu)
|
||||
jsr fwrite
|
||||
next_name_to_write
|
||||
inw edited_file_nr
|
||||
cpw num_of_files edited_file_nr
|
||||
bne write_block ; jesli edited jest mniejszy
|
||||
end_dat_write
|
||||
jsr fclose
|
||||
rts
|
||||
|
||||
|
||||
; procedura obliczajaca na podstawie numeru zapisu
|
||||
; jego adres w pamieci RAM
|
||||
set_edit_addr
|
||||
; trzeba pomnozyc edited_file_nr przez dlugosc zapisu (46) i dodac adres bufora
|
||||
; od razu robimy dodawanie, czyli do wyniku nie zero tylko adres bufora!!!
|
||||
mwa Pbuffer edited_file_addr
|
||||
mwa edited_file_nr word1 ; w word1 mnozna (2 bajty)
|
||||
lda #47
|
||||
sta word2 ; w word2 mnoznik (1 bajt)
|
||||
ldy #8 ; mnozymy przez 8 bitow - word2 (choc wlasciwie mniej mozna)
|
||||
clc
|
||||
mulloop1
|
||||
lsr word2
|
||||
bcc mull_no_c
|
||||
adw edited_file_addr word1
|
||||
mull_no_c
|
||||
asl word1
|
||||
rol word1+1
|
||||
dey
|
||||
bne mulloop1
|
||||
rts
|
||||
|
||||
; ustawienie parametrow dodatkowych folderu (gwiazdka) na standardowe
|
||||
set_default_params
|
||||
ldy #34
|
||||
setting_def_par
|
||||
lda standard_params,y
|
||||
sta current_params,y
|
||||
dey
|
||||
bpl setting_def_par
|
||||
rts
|
||||
|
||||
; procedura zmiany znaku w akumulatorze z ATASCII na EKRANOWY (uwzglednia inwers wiec jest dziwna)
|
||||
atascii2internal
|
||||
asl @
|
||||
php
|
||||
cmp #$c0
|
||||
bcs internal_OK
|
||||
sbc #$3f
|
||||
bcs internal_OK
|
||||
adc #$c0
|
||||
internal_OK
|
||||
plp
|
||||
ror @
|
||||
rts
|
||||
|
||||
; zmienne programu
|
||||
standard_params
|
||||
.BYTE 'CAC4C401 ' ; standardowe parametry dla '*'
|
||||
Pasterix_data DTA V(asterix_data)
|
||||
asterix_data
|
||||
.BYTE '* '
|
||||
current_params
|
||||
.BYTE ' ' ; miejsce na edytowane parametry
|
||||
DIRmark
|
||||
.BYTE '<DIR>>',$00 ; koncowka dlugiej nazwy i znacznik katalogu za nia (jesli to katalog)
|
||||
searchmask
|
||||
.BYTE '*.*',$9b,$00
|
||||
datname
|
||||
.BYTE 'MSDOS.DAT',$9b,$00
|
||||
MSDOSname
|
||||
.BYTE 'MSDOS ',$00
|
||||
Pourpath DTA V(ourpath) ; wskaznik na ourpath (potrzebne by wiedziec gdzie bedzie po relokacji)
|
||||
ourpath
|
||||
.BYTE 'A:\ '
|
||||
ourpath_end
|
||||
.BYTE $00 ; offset konca sciezki wskazuje na pierwszy znak po '\'
|
||||
edited_file_nr
|
||||
.WORD $0000 ; numer aktualnie edytowanego zapisu (do obliczenia offsetu)
|
||||
max_files
|
||||
.WORD $0000
|
||||
num_of_files
|
||||
.WORD $0000
|
||||
first_on_screen
|
||||
.WORD $0000 ; numer pierwszego zapisu wyswietlanego na ekranie (offset)
|
||||
word1
|
||||
.WORD $0000 ; zmienna pomocnicza do mnozenia itp...
|
||||
word2
|
||||
.WORD $0000 ; druga zmienna pomocnicza
|
||||
Pone_buffer DTA V(one_buffer)
|
||||
one_buffer
|
||||
.BYTE ' '
|
||||
Pbuffer DTA V(buffer)
|
||||
buffer
|
||||
.BYTE $0000 ; adres bufora
|
||||
|
||||
; na koncu automatyczne wygenerowanie bloku zawierajacego adresy do relokacji
|
||||
blk update address
|
||||
blk update symbol
|
||||
Executable
BIN
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Executable
+2059
File diff suppressed because it is too large
Load Diff
Executable
+2077
File diff suppressed because it is too large
Load Diff
Executable
+2115
File diff suppressed because it is too large
Load Diff
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
+80
@@ -0,0 +1,80 @@
|
||||
|
||||
|
||||
lines = 24
|
||||
screenSize = lines*40+dlend-dl+1
|
||||
|
||||
screenStart
|
||||
sbw MEMTOP #screenSize newDLaddress
|
||||
lda newDLAddress+1
|
||||
and #$F0
|
||||
sta newAddressTemp+1
|
||||
lda MEMTOP+1
|
||||
and #$F0
|
||||
cmp newAddressTemp+1
|
||||
beq screenFitsInSamePageAsMEMTOP
|
||||
mva #0 newAddressTemp
|
||||
lda MEMTOP+1
|
||||
and #$F0
|
||||
sta newAddressTemp+1
|
||||
sbw newAddressTemp #screenSize newDLaddress
|
||||
screenFitsInSamePageAsMEMTOP
|
||||
;now adjust the screen pointer in DL
|
||||
adw newDLaddress #dlend-dl newScreenAddress
|
||||
mwa newScreenAddress PdlScreenAddress
|
||||
mwa newDLaddress PdlJumpAddress
|
||||
|
||||
/* move dl to the new home */
|
||||
mwa Pdl tempA
|
||||
mwa newDLAddress tempB
|
||||
ldy #dlend-dl-1
|
||||
dlMoveLoop
|
||||
lda (tempA),y
|
||||
sta (tempB),y
|
||||
dey
|
||||
bpl dlMoveLoop ;CAUTION!!! dl Must be shorter than 128 bytes!!!
|
||||
mwa newDLaddress DLPTRS
|
||||
|
||||
vdli dli
|
||||
mva #$0e $2c8 ;COLBAKS
|
||||
rts
|
||||
|
||||
newDLaddress
|
||||
dta $00, $00
|
||||
newAddressTemp
|
||||
newScreenAddress
|
||||
dta $00, $00
|
||||
;---------------
|
||||
Pdli DTA V(dli)
|
||||
dli
|
||||
pha
|
||||
sta WSYNC
|
||||
mva VCOUNT COLBAK
|
||||
pla
|
||||
rti
|
||||
|
||||
Pdl
|
||||
DTA V(dl) ;this is spartaaaaa
|
||||
PdlScreenAddress
|
||||
DTA V(dlScreenAddress)
|
||||
PdlJumpAddress
|
||||
DTA V(dlJumpAddress)
|
||||
|
||||
dl
|
||||
dta $70,$70,$70+$80
|
||||
dta $42+$80
|
||||
dlScreenAddress
|
||||
dta a (screen)
|
||||
|
||||
:lines-1 dta $02+$80
|
||||
|
||||
dta $41
|
||||
dlJumpAddress
|
||||
dta a(dl)
|
||||
dlend
|
||||
.IF dlend-dl >127
|
||||
.ERROR "DL too long"
|
||||
.ENDIF
|
||||
screen
|
||||
dta d"aba"
|
||||
:40 dta $00
|
||||
;-----------------------------
|
||||
Reference in New Issue
Block a user