Compare commits
2 Commits
5886da4a77
...
7154c9bfc8
Author | SHA1 | Date | |
---|---|---|---|
7154c9bfc8 | |||
55b456ec06 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -2,3 +2,7 @@
|
||||
*.tap
|
||||
*.sna
|
||||
*.sld
|
||||
*.tzx
|
||||
*.block
|
||||
*.zx0
|
||||
*.bin
|
26
Makefile
26
Makefile
@@ -1,10 +1,32 @@
|
||||
myprog.sna myprog.tap myprog.sld: main.asm loader.asm print.asm
|
||||
sjasmplus --sld=myprog.sld --fullpath main.asm
|
||||
speccydev.tzx: speccydev.tap
|
||||
tapeconv speccydev.tap speccydev.tzx
|
||||
|
||||
speccydev.tap: sjasm.tap loader.tap boriel.zx0.block
|
||||
cat loader.tap sjasm.tap boriel.zx0.block > speccydev.tap
|
||||
|
||||
myprog.sna sjasm.tap myprog.sld: speccydev.asm dzx0_standard.asm boriel.zx0
|
||||
sjasmplus --sld=myprog.sld --fullpath speccydev.asm
|
||||
|
||||
loader.tap: loader.bas
|
||||
zmakebas -a 30 -n SpeccyDev -o loader.tap loader.bas
|
||||
|
||||
boriel.bin: boriel.zxb
|
||||
zxbc -S 40000 -o boriel.bin boriel.zxb
|
||||
|
||||
boriel.zx0: boriel.bin
|
||||
zx0 -f boriel.bin boriel.zx0
|
||||
|
||||
boriel.zx0.block: boriel.zx0
|
||||
ttttt boriel.zx0 data
|
||||
|
||||
clean:
|
||||
rm -f *.tap
|
||||
rm -f *.sna
|
||||
rm -f *.sld
|
||||
rm -f *.block
|
||||
rm -f *.tzx
|
||||
rm -f *.bin
|
||||
rm -f *.zx0
|
||||
rm -rf .tmp/
|
||||
|
||||
start_new_project:
|
||||
|
5
boriel.zxb
Normal file
5
boriel.zxb
Normal file
@@ -0,0 +1,5 @@
|
||||
10 CLS
|
||||
20 FOR i = 0 TO 23
|
||||
30 PRINT "ZX Spectrum Rules OK!"
|
||||
40 NEXT i
|
||||
50 PAUSE 0
|
61
dzx0_standard.asm
Normal file
61
dzx0_standard.asm
Normal file
@@ -0,0 +1,61 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; ZX0 decoder by Einar Saukas & Urusergi
|
||||
; "Standard" version (68 bytes only)
|
||||
; -----------------------------------------------------------------------------
|
||||
; Parameters:
|
||||
; HL: source address (compressed data)
|
||||
; DE: destination address (decompressing)
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
dzx0_standard:
|
||||
ld bc, $ffff ; preserve default offset 1
|
||||
push bc
|
||||
inc bc
|
||||
ld a, $80
|
||||
dzx0s_literals:
|
||||
call dzx0s_elias ; obtain length
|
||||
ldir ; copy literals
|
||||
add a, a ; copy from last offset or new offset?
|
||||
jr c, dzx0s_new_offset
|
||||
call dzx0s_elias ; obtain length
|
||||
dzx0s_copy:
|
||||
ex (sp), hl ; preserve source, restore offset
|
||||
push hl ; preserve offset
|
||||
add hl, de ; calculate destination - offset
|
||||
ldir ; copy from offset
|
||||
pop hl ; restore offset
|
||||
ex (sp), hl ; preserve offset, restore source
|
||||
add a, a ; copy from literals or new offset?
|
||||
jr nc, dzx0s_literals
|
||||
dzx0s_new_offset:
|
||||
pop bc ; discard last offset
|
||||
ld c, $fe ; prepare negative offset
|
||||
call dzx0s_elias_loop ; obtain offset MSB
|
||||
inc c
|
||||
ret z ; check end marker
|
||||
ld b, c
|
||||
ld c, (hl) ; obtain offset LSB
|
||||
inc hl
|
||||
rr b ; last offset bit becomes first length bit
|
||||
rr c
|
||||
push bc ; preserve new offset
|
||||
ld bc, 1 ; obtain length
|
||||
call nc, dzx0s_elias_backtrack
|
||||
inc bc
|
||||
jr dzx0s_copy
|
||||
dzx0s_elias:
|
||||
inc c ; interlaced Elias gamma coding
|
||||
dzx0s_elias_loop:
|
||||
add a, a
|
||||
jr nz, dzx0s_elias_skip
|
||||
ld a, (hl) ; load another group of 8 bits
|
||||
inc hl
|
||||
rla
|
||||
dzx0s_elias_skip:
|
||||
ret c
|
||||
dzx0s_elias_backtrack:
|
||||
add a, a
|
||||
rl c
|
||||
rl b
|
||||
jr dzx0s_elias_loop
|
||||
; -----------------------------------------------------------------------------
|
25
loader.asm
25
loader.asm
@@ -1,25 +0,0 @@
|
||||
MODULE basic_loader
|
||||
ORG #5c00
|
||||
basic_start:
|
||||
db 0, 0 ; line number
|
||||
dw line_length
|
||||
line_start:
|
||||
db #fd, '0', #0e, 0, 0 ; CLEAR
|
||||
dw code_start_addr - 1
|
||||
db 0, ':'
|
||||
db #ef, '"' ; LOAD "
|
||||
db "code"
|
||||
db '"', #af, ':' ; name"CODE
|
||||
db #f5, #c0 ; PRINT USR
|
||||
db '0', #0e, 0, 0
|
||||
dw code_run_addr
|
||||
db 0, #0d
|
||||
|
||||
line_length EQU $ - line_start
|
||||
basic_length EQU $ - basic_start
|
||||
|
||||
EMPTYTAP "myprog.tap"
|
||||
SAVETAP "myprog.tap", BASIC, "myprog", basic_start, basic_length, 0
|
||||
SAVETAP "myprog.tap", CODE, "code", code_start_addr, code_length
|
||||
|
||||
ENDMODULE
|
5
loader.bas
Normal file
5
loader.bas
Normal file
@@ -0,0 +1,5 @@
|
||||
10 REM This file was created
|
||||
20 REM using zmakebas
|
||||
30 CLEAR 32767
|
||||
40 LOAD ""CODE
|
||||
50 RANDOMIZE USR 32768
|
22
main.asm
22
main.asm
@@ -1,22 +0,0 @@
|
||||
code_start_addr EQU #8000
|
||||
ORG code_start_addr
|
||||
|
||||
MODULE main
|
||||
@code_run_addr:
|
||||
ld a, 57
|
||||
ld bc, 64
|
||||
ld hl, 0
|
||||
call print_string
|
||||
db "Hello, world!", 0
|
||||
ret
|
||||
|
||||
ENDMODULE
|
||||
|
||||
INCLUDE print.asm
|
||||
|
||||
code_length EQU $ - code_start_addr
|
||||
|
||||
DEVICE ZXSPECTRUM48
|
||||
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
|
||||
SAVESNA "myprog.sna", code_run_addr
|
||||
INCLUDE loader.asm
|
180
print.asm
180
print.asm
@@ -1,180 +0,0 @@
|
||||
ink_black EQU 0
|
||||
ink_blue EQU 1
|
||||
ink_red EQU 2
|
||||
ink_magenta EQU 3
|
||||
ink_green EQU 4
|
||||
ink_cyan EQU 5
|
||||
ink_yellow EQU 6
|
||||
ink_white EQU 7
|
||||
black EQU ink_black
|
||||
blue EQU ink_blue
|
||||
red EQU ink_red
|
||||
magenta EQU ink_magenta
|
||||
green EQU ink_green
|
||||
cyan EQU ink_cyan
|
||||
yellow EQU ink_yellow
|
||||
white EQU ink_white
|
||||
paper_black EQU 0
|
||||
paper_blue EQU 8
|
||||
paper_red EQU 16
|
||||
paper_magenta EQU 24
|
||||
paper_green EQU 32
|
||||
paper_cyan EQU 40
|
||||
paper_yellow EQU 48
|
||||
paper_white EQU 56
|
||||
bright EQU 64
|
||||
flash EQU 128
|
||||
attr_list_end EQU flash | bright | ink_black | paper_black
|
||||
|
||||
MODULE print
|
||||
bm_start EQU #4000
|
||||
attr_area EQU #5800
|
||||
bm_len EQU 6144
|
||||
attr_len EQU 768
|
||||
CHARS EQU #5c36
|
||||
char_posn:
|
||||
dw #4000
|
||||
|
||||
MODULE print_string
|
||||
; Set HL to be row and column and follow the call with a null-terminated string
|
||||
; All registers preserved
|
||||
; char_posn will have been moved to after string, but HL will still have coordinates of string start
|
||||
@print_string:
|
||||
call set_char_posn
|
||||
ex (sp), hl
|
||||
push af
|
||||
loop:
|
||||
ld a, (hl)
|
||||
inc hl
|
||||
or a
|
||||
jr z, exit
|
||||
call print_char
|
||||
jr loop
|
||||
exit:
|
||||
pop af
|
||||
ex (sp), hl
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
MODULE print_char
|
||||
; Prints the single character from the A register
|
||||
; All registers preserved
|
||||
; char_posn will point to next square
|
||||
@print_char:
|
||||
push hl
|
||||
push de
|
||||
push af
|
||||
ld h, 0
|
||||
ld l, a
|
||||
add hl, hl
|
||||
add hl, hl
|
||||
add hl, hl
|
||||
ld d, h
|
||||
ld e, l
|
||||
ld hl, (print.CHARS)
|
||||
add hl, de
|
||||
ld d, h
|
||||
ld e, l
|
||||
ld hl, (print.char_posn)
|
||||
push bc
|
||||
ld b, 8
|
||||
loop:
|
||||
ld a, (de)
|
||||
ld (hl), a
|
||||
inc h
|
||||
inc de
|
||||
djnz loop
|
||||
ld hl, (print.char_posn)
|
||||
inc l
|
||||
jr nz, update_char_posn
|
||||
ld a, #50
|
||||
cp h
|
||||
jr nz, next_third
|
||||
ld hl, print.bm_start
|
||||
jr update_char_posn
|
||||
next_third:
|
||||
ld a, 8
|
||||
add a, h
|
||||
ld h, a
|
||||
update_char_posn:
|
||||
ld (print.char_posn), hl
|
||||
pop bc
|
||||
pop af
|
||||
pop de
|
||||
pop hl
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
MODULE set_char_posn
|
||||
; Pass row and column, in that order, in HL
|
||||
@set_char_posn:
|
||||
push hl
|
||||
push af
|
||||
ld a, h
|
||||
; check for top third
|
||||
ld h, %01000000
|
||||
sub 8
|
||||
jr c, set_column
|
||||
; check for middle third
|
||||
ld h, %01001000
|
||||
sub 8
|
||||
jr c, set_column
|
||||
; must be bottom third
|
||||
ld h, %01010000
|
||||
sub 8
|
||||
set_column:
|
||||
; restore the row offset of the third and shift it into upper 3 bits of L
|
||||
add a, 8
|
||||
sla a
|
||||
sla a
|
||||
sla a
|
||||
sla a
|
||||
sla a
|
||||
or l
|
||||
ld l, a
|
||||
ld (print.char_posn), hl
|
||||
pop af
|
||||
pop hl
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
MODULE set_attributes
|
||||
; Row and column in HL
|
||||
; db list of attributes follows call
|
||||
; terminate with attr_list_end byte (bright flashing black on black)
|
||||
@set_attributes:
|
||||
ex de, hl
|
||||
ex (sp), hl
|
||||
push de
|
||||
push hl
|
||||
ld h, 0
|
||||
ld l, d
|
||||
ld d, h
|
||||
add hl, hl
|
||||
add hl, hl
|
||||
add hl, hl
|
||||
add hl, hl
|
||||
add hl, hl
|
||||
add hl, de
|
||||
ld de, print.attr_area
|
||||
add hl, de
|
||||
pop de
|
||||
ex de, hl
|
||||
push af
|
||||
loop:
|
||||
ld a, (hl)
|
||||
inc hl
|
||||
cp attr_list_end
|
||||
jr z, exit
|
||||
ld (de), a
|
||||
inc de
|
||||
jr loop
|
||||
exit:
|
||||
pop af
|
||||
pop de
|
||||
ex (sp), hl
|
||||
ex de, hl
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
ENDMODULE
|
36
speccydev.asm
Normal file
36
speccydev.asm
Normal file
@@ -0,0 +1,36 @@
|
||||
code_start_addr EQU #8000
|
||||
org code_start_addr
|
||||
|
||||
; headerless load
|
||||
scf
|
||||
ld a, #ff
|
||||
ld de, boriel_size
|
||||
ld ix, compressed_boriel
|
||||
call #0556
|
||||
|
||||
decompress:
|
||||
ld hl, compressed_boriel
|
||||
ld de, uncompressed_boriel
|
||||
call dzx0.dzx0_standard
|
||||
|
||||
call uncompressed_boriel
|
||||
ret
|
||||
|
||||
MODULE dzx0
|
||||
INCLUDE "dzx0_standard.asm"
|
||||
ENDMODULE
|
||||
|
||||
code_length EQU $ - code_start_addr
|
||||
|
||||
compressed_boriel:
|
||||
INCBIN "boriel.zx0"
|
||||
boriel_size EQU $ - compressed_boriel
|
||||
|
||||
uncompressed_boriel EQU 40000
|
||||
|
||||
|
||||
DEVICE ZXSPECTRUM48
|
||||
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
|
||||
SAVESNA "myprog.sna", decompress
|
||||
EMPTYTAP "sjasm.tap"
|
||||
SAVETAP "sjasm.tap", CODE, "sjasm", code_start_addr, code_length
|
Reference in New Issue
Block a user