2
0
Fork 0
original-dome/src/makelib/makelib.asm

412 lines
5.6 KiB
NASM
Raw Normal View History

2018-11-29 21:18:47 +00:00
; Maak een LIBrary aan van files
; org #0100
bdos .equ #05
setdta .equ 26 ; zet lees/schrijf-adres
open_file .equ 15 ; open file
close_file .equ 16 ; sluit file
create_file .equ 22 ; maak file aan
read_block .equ 39 ; laad van disk
write_block .equ 38 ; schrijf naar disk
term_error .equ 0x62
2018-11-29 21:18:47 +00:00
entry_length .equ 11 + 2 + 3
.area _CODE
call count_files ; tel aantal files
ld (files),bc
call calc_length ; bereken lengte
; directory
ld (dir_length),hl
call make_dir ; maak directory
call save_dir ; bewaar directory
call store_files ; bewaar files
ld de,#fcb2
ld c,#close_file
call bdos ; klaar!
ret
; Tel aantal files
; In: -
; Uit: BC: aantal files
; Verandert: AF,BC,DE,HL
count_files: ld hl,#file_names
ld bc,#0
ld de,#11
count_files1: ld a,(hl)
or a
ret z
inc bc
add hl,de
jr count_files1
; Bereken lengte directory
; In: BC: aantal files
; Uit: HL: lengte directory
; Verandert: AF, BC, DE, HL
calc_length: ld hl,#3
ld de,#entry_length
calc_length1: ld a,b
or c
ret z
add hl,de
dec bc
jr calc_length1
; Maak directory
; In: HL: lengte directory
; Uit: -
; Verandert: alles
make_dir: ld (getal1),hl
ld hl,#0
ld (getal1+2),hl
ld hl,#file_names
ld de,#directory
ld bc,(files)
make_dir1: push bc
push hl
push de
ld bc,#11
ld de,#fname1
ldir ; filenaam naar FCB
pop de
pop hl
ld bc,#11
ldir ; filenaam naar directory
push hl
push de
ld de,#fcb1
ld c,#open_file
call bdos
ld de,#fcb1
ld c,#close_file
call bdos
pop de
ld hl,(length1)
ld a,l
ld (de),a
inc de
ld a,h
ld (de),a
inc de
ld ix,#getal1 ; bewaar positie in file
ld a,(IX)
ld (de),a
inc de
ld a,(IX)
ld (de),a
inc de
ld a,(IX)
ld (de),a
inc de
push de
ld iy,#getal2
ld (IY),l
ld (IY),h
ld ix,#getal1
call add_32bit
pop de
pop hl
pop bc
dec bc
ld a,b
or c
jp nz,make_dir1
xor a
ld (de),a
ret
; Bewaar directory
; In: -
; Uit: -
; Verandert: alles
save_dir: ld hl,#lib_name
ld de,#fname2
ld bc,#11
ldir
ld de,#fcb2
ld c,#create_file
call bdos ; cre er file
call intfcb2
ld de,#files
ld c,#setdta
call bdos
ld de,#fcb2
ld c,#write_block
ld hl,(dir_length)
call bdos ; schrijf directory weg
ret
; Bewaar files in .LIB-file
; In: -
; Uit: -
; Verandert: AF, BC, DE, HL
store_files: ld bc,(files)
ld hl,#file_names
store_files1: push bc
ld bc,#11
ld de,#fname1
ldir
PUSH HL
LD HL,#fname1
LD B,#11
CALL PUT_TXT
POP HL
PUSH HL
call clrfcb1
ld c,#open_file
ld de,#fcb1
call bdos
cp #0
jr z,store_open_f
LD HL,#FILE_ERROR
LD B,#10
CALL PUT_TXT
store_open_f:
LD HL,#RETTXT
LD B,#2
CALL PUT_TXT
2018-11-29 21:18:47 +00:00
call intfcb1
ld hl,(length1)
call copy_file ; kopieer file
ld de,#fcb1
ld c,#close_file
call bdos
pop hl
pop bc
dec bc
ld a,b
or c
jp nz,store_files1
ret
; Copieer file naar .LIB-file
; In: HL: lengte file
; Uit: -
; Verandert: AF, BC, DE, HL
copy_file: push hl
ld c,#setdta
ld de,#directory
call bdos
pop hl
copy_file1: ld de,#32768
xor a
sbc hl,de ; file >32768 bytes?
jp c,copy_file2 ; Nee, copieer rest
push hl
ld hl,#32768
ld de,#fcb1
ld c,#read_block
call bdos
ld hl,#32768
ld de,#fcb2
ld c,#write_block
call bdos
pop hl
jp copy_file1
copy_file2: add hl,de
push hl
ld de,#fcb1
ld c,#read_block
call bdos
pop hl
ld de,#fcb2
ld c,#write_block
call bdos
ret
; Tel twee 32-bits getallen op
; In: IX: adres getal 1
; IY: adres getal 2
; Uit: getal 1 gevuld met resultaat
; Verandert: BC,DE,HL
add_32bit: ld l,(IX)
ld h,(IX)
ld e,(IY)
ld d,(IY)
ld c,(IX)
ld b,(IX)
add hl,de
jr nc,add_32bit1
inc bc
add_32bit1: ld (IX),l
ld (IX),h
ld l,(IY)
ld h,(IY)
add hl,bc
ld (IX),l
ld (IX),h
ret
; Maak FCB 1 schoon
; In: -
; Uit: -
; Verandert: AF, BC, DE, HL
clrfcb1: ld hl,#fcbdat1
ld bc,#25
xor a
ld (hl),a
ld de,#fcbdat1 + 1
ldir
ret
; Initialiseer FCB 1
; In: -
; Uit: -
; Verandert: AF, HL
intfcb1: ld hl,#0
ld (fcb1 + 12),hl
ld (fcb1 + 33),hl
ld (fcb1 + 35),hl
xor a
ld (fcb1 + 32),a
inc hl
ld (fcb1 + 14),hl
ret
; Initialiseer FCB 2
; In: -
; Uit: -
; Verandert: AF, HL
intfcb2: ld hl,#0
ld (fcb2 + 12),hl
ld (fcb2 + 33),hl
ld (fcb2 + 35),hl
xor a
ld (fcb2 + 32),a
inc hl
ld (fcb2 + 14),hl
ret
; HL=TXT
; B=LENGHTE
PUT_TXT:
LD A,(HL)
LD E,A
LD C,#2
PUSH HL
PUSH BC
CALL bdos
POP BC
POP HL
INC HL
DJNZ PUT_TXT
RET
RETTXT: .db 0x0A,0x0D
FILE_ERROR: .str " NOT FOUND" ; 10 len
2018-11-29 21:18:47 +00:00
getal1: .dw 0,0 ; opslagplaats voor de twee
getal2: .dw 0,0 ; 32-bits getallen
dir_length: .dw 0 ; lengte van directory
; Het eerste FCB
fcb1: .db 0 ; drive (0=default, 1 = A:)
fname1: .str " "
fcbdat1: .db 0,0,0,0
length1: .db 0,0,0,0,0,0,0,0,0,0,0
.db 0,0,0,0,0,0,0,0,0,0,0
; Het tweede FCB
fcb2: .db 0 ; drive (0=default, 2 = B:)
fname2: .str " "
.db 0,0,0,0,0,0,0,0,0,0,0,0,0
.db 0,0,0,0,0,0,0,0,0,0,0,0,0
; Naam van de te maken .LIB-file
lib_name: .str "DOME 000"
; Lijst met files die in de .LIB-file moeten
file_names:
.str "BIOS DAT"
.str "LOADER DAT"
.str "WAVEDRV COM"
.str "PARAGON ZOP"
.str "PRESENTSZOP"
.str "DOME ZOP"
.str "MMENU DAT"
.str "ST_MENU1ZOP" ; GFX START MENU
.str "ST_MENU2ZOP" ; GFX START MENU_ROOD
.str "UNITTOT ZOP" ; GFX UNITS
.str "PAGE5 ZOP" ; GFX BUILDINGS
.str "BALKEN4 ZOP" ; GFX ACHTERGROND
2018-11-29 21:18:47 +00:00
.str "DOME DAT" ; DOME ENGINE
.str "MENU DAT" ; DOME_MENU_CALL CODE
.str "MENU ZOP" ; DOME_MENU_CALL GFX
;DB "CHOOSE DAT" ; LEVEL CHOOSER CODE
;DB "CHOOSE1 ZOP" ; LEVEL CHOOSEE GFX1
;DB "CHOOSE2 ZOP" ; LEVEL CHOOSER GFX2
.str "BRIEF ZOP"
.str "VELD 001"
.str "TANKTAB 001"
.str "CODE 001" ; MAXIMAAL 999 VELDEN
.str "VELD 002"
.str "TANKTAB 002"
.str "CODE 002"
.db 0
2018-11-29 21:18:47 +00:00
; 0 = laatste gehad
files: .dw 0 ; bewaarplaats aantal files
directory: nop
.area _DATA