Add full compiler toolchain, libc, examples and reference docs
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.
What's in here:
bin/sprinter-cc — driver script invoking SDCC + linker + mkexe
libc/ — Sprinter-specific libc layer over ESTEX/BIOS
(conio, gfx, io, mem, stdio + headers)
runtime/ — crt0 variants (default/small/banked/minimal)
+ heap + bank trampolines
toolchain/ — mkexe (SprintEXE packer, C + tests)
examples/ — 30 demo programs (gfx, file I/O, env, time, …)
lib/Makefile — builds the libc archive (sprinter.lib)
docs/ — converted Sprinter manuals + asm reference samples
third_party/ — solid-c reference compiler dump + sdcc setup script
release_docs/ — packaging / release notes
gitignore overhaul:
• Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
on macOS APFS). Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
• Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
INPUT fixtures, not build outputs.
• Collapse the duplicated SDCC/C/Sdcc sections into one section per
concern (build outputs / vendored / OS-junk).
• Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,515 @@
|
||||
;[]=======================================================================[]
|
||||
;
|
||||
; 256color.z80 -- mini demo for Sprinter
|
||||
;
|
||||
; Created by Anton Enin 14-July-1999
|
||||
;
|
||||
; Last update 20-July-2002
|
||||
;
|
||||
; Copyright (C) 2002 R-lab
|
||||
;
|
||||
; This program should be compiled using z80asm
|
||||
; http://www.zxasm.narod.ru/
|
||||
;
|
||||
; z80asm.exe -f bin 256color.z80 -o 256color.exe
|
||||
;
|
||||
;[]=======================================================================[]
|
||||
; sprinter constants -- see sprinter docs
|
||||
|
||||
VPAGE equ 0x50 ; video memory page
|
||||
YPORT equ 0x89 ; y pos for write to the vram
|
||||
PAGE0 equ 0x82 ; memory page ports
|
||||
PAGE1 equ 0xA2 ;
|
||||
PAGE2 equ 0xC2 ;
|
||||
PAGE3 equ 0xE2 ;
|
||||
|
||||
; os constants -- see os docs
|
||||
|
||||
struc HeaderStruct ; Estex Exe Header
|
||||
id: resb 3 ; exe file Id (must be 'EXE')
|
||||
version: resb 1 ; exe file version
|
||||
code_offeset: resd 1 ; offset to start code (header size)
|
||||
loader_size: resw 1 ; first loader size
|
||||
reserved1: resw 3 ; reserved
|
||||
start_address: resw 1 ; program org
|
||||
entry_point: resw 1 ; program entry point
|
||||
stack_point: resw 1 ; program stack point
|
||||
endstruc
|
||||
|
||||
; my constants -- see ...? :)
|
||||
|
||||
PALETTE_BASE equ 0x9000
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
section .text
|
||||
org 0x7FEA
|
||||
|
||||
;[]=======================================================================[]
|
||||
; EXE header
|
||||
|
||||
ExeHeader: istruc HeaderStruct ; initialized structure
|
||||
at id, db 'EXE'
|
||||
at version, db 0
|
||||
at code_offeset, dd CodeStart - ExeHeader
|
||||
at loader_size, dw 0
|
||||
at start_address, dw 0x8000
|
||||
at entry_point, dw EntryPoint
|
||||
at stack_point, dw 0xBFFF
|
||||
iend
|
||||
CodeStart: ; start address is 0x8000
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
EntryPoint: ; org = 0x8000
|
||||
ld hl, HelpString
|
||||
ld c, 0x5C ; print text
|
||||
rst 0x10
|
||||
|
||||
call SetVideoMode
|
||||
call SetPalettes
|
||||
call InitScreen
|
||||
.main_loop:
|
||||
halt ; v'sync, maybe :)
|
||||
|
||||
.pal_base: ld hl, PALETTE_BASE
|
||||
ld de, 0x0000
|
||||
ld bc, 0xFFA4
|
||||
sub a
|
||||
rst 0x08 ; load palette by BIOS
|
||||
|
||||
ld hl, (.pal_base + 1)
|
||||
ld de, 0x0010
|
||||
.col_count: ld bc, 0x0A00/4
|
||||
add hl, de
|
||||
dec bc
|
||||
ld a, b
|
||||
or c
|
||||
jr nz, .next
|
||||
ld hl, PALETTE_BASE + 0x800
|
||||
ld bc, 0x0800/4
|
||||
.next: ld (.pal_base + 1), hl
|
||||
ld (.col_count + 1), bc
|
||||
|
||||
ld c, 0x03 ; test mouse button
|
||||
rst 0x30
|
||||
bit 0, a ; left button is pressed?
|
||||
jr nz, .exit
|
||||
ld c, 0x31 ; test keypress
|
||||
rst 0x10
|
||||
jr z, .main_loop
|
||||
cp 0x1B ; ESC is pressed?
|
||||
jr nz, .main_loop
|
||||
.exit:
|
||||
call CrearVideoRam
|
||||
call ResVideoMode
|
||||
|
||||
ld bc, 0x0041
|
||||
rst 0x10 ; exit to OS...
|
||||
|
||||
;[]=======================================================================[]
|
||||
; set requist video mode 320x256x256
|
||||
SetVideoMode:
|
||||
ld c, 0x51 ; save previos vmode
|
||||
rst 0x10
|
||||
ld (vmode + 1), a
|
||||
ld a, b
|
||||
ld (vscrn + 1), a
|
||||
sub a
|
||||
call CrearVideoRam
|
||||
ld bc, 0x0050 ; set 320x256x256
|
||||
ld a, 0x81
|
||||
rst 0x10
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; restore previos video mode
|
||||
ResVideoMode:
|
||||
sub a
|
||||
call CrearVideoRam
|
||||
vscrn: ld b, 0x00
|
||||
vmode: ld a, 0x00
|
||||
ld c, 0x50
|
||||
rst 0x10 ; set previos vmode
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; generate palette
|
||||
SetPalettes:
|
||||
sub a
|
||||
ld hl, PALETTE_BASE
|
||||
ld de, PALETTE_BASE + 1
|
||||
ld bc, 0x03FF
|
||||
ld (hl), a
|
||||
ldir
|
||||
inc hl
|
||||
|
||||
ld de, 0x0000
|
||||
.loop0: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
inc d
|
||||
djnz .loop0
|
||||
ld de, 0xFF00
|
||||
ld bc, 0x0000
|
||||
.loop1: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
dec d
|
||||
inc c
|
||||
djnz .loop1
|
||||
|
||||
ld de, 0x0000
|
||||
ld bc, 0x00FF
|
||||
.loop2: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
inc d
|
||||
inc e
|
||||
dec c
|
||||
djnz .loop2
|
||||
|
||||
ld de, 0xFFFF
|
||||
ld bc, 0x0000
|
||||
.loop3: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
dec e
|
||||
inc c
|
||||
djnz .loop3
|
||||
|
||||
ld de, 0xFF00
|
||||
ld bc, 0x00FF
|
||||
.loop4: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
dec d
|
||||
inc e
|
||||
djnz .loop4
|
||||
|
||||
ld de, 0x00FF
|
||||
ld bc, 0x00FF
|
||||
.loop5: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
inc d
|
||||
dec e
|
||||
dec c
|
||||
djnz .loop5
|
||||
|
||||
ld de, 0xFF00
|
||||
ld bc, 0x0000
|
||||
.loop6: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
dec d
|
||||
inc e
|
||||
djnz .loop6
|
||||
|
||||
ld de, 0x00FF
|
||||
ld bc, 0x0000
|
||||
.loop7: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
dec e
|
||||
inc c
|
||||
djnz .loop7
|
||||
|
||||
ld de, 0x0000
|
||||
ld bc, 0x00FF
|
||||
.loop8: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
inc d
|
||||
dec c
|
||||
djnz .loop8
|
||||
|
||||
ld de, 0xFF00
|
||||
ld bc, 0x0000
|
||||
.loop9: ld (hl), d
|
||||
inc hl
|
||||
ld (hl), e
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
dec d
|
||||
inc c
|
||||
djnz .loop9
|
||||
; load fully black palette
|
||||
ld hl, PALETTE_BASE
|
||||
ld de, 0x0000
|
||||
ld bc, 0xFFA4
|
||||
sub a
|
||||
rst 0x08 ; load palette by BIOS
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
InitScreen:
|
||||
in a, (YPORT) ; save inflective ports
|
||||
ld c, a
|
||||
in a, (PAGE1)
|
||||
ld b, a
|
||||
push bc
|
||||
ld a, VPAGE ; set video page to 0x4000-0x7FFF
|
||||
out (PAGE1), a
|
||||
; now i'll generate 207 circuits
|
||||
; for first quadrange
|
||||
; |
|
||||
; -+-
|
||||
; |a
|
||||
ld hl, 207 ; start radius 207, start color 0
|
||||
.loop1: push hl
|
||||
ld a, h
|
||||
call QCircuit
|
||||
pop hl
|
||||
inc h
|
||||
dec l
|
||||
jr nz, .loop1
|
||||
ld e, l ; SetPixel(0, 0)
|
||||
ld c, e
|
||||
call SetPixel
|
||||
; now i'll duplicate quadrange
|
||||
; |
|
||||
; -+-
|
||||
; b|a
|
||||
ld c, 128
|
||||
.loop2: ld hl, 0x4000 + 160
|
||||
ld de, 0x4000 + 159
|
||||
ld a, c
|
||||
out (YPORT), a
|
||||
ld b, 160
|
||||
.loop3: ld a, (hl)
|
||||
ld (de), a
|
||||
inc hl
|
||||
dec de
|
||||
djnz .loop3
|
||||
inc c
|
||||
jr nz, .loop2
|
||||
; c|d
|
||||
; -+-
|
||||
; b|a
|
||||
ld hl, 0x4000
|
||||
ld e, 127
|
||||
ld d, 128
|
||||
di
|
||||
ld d, d ; set accel lenght to 160
|
||||
ld a, 160
|
||||
ld b, b
|
||||
.loop4: ld a, d
|
||||
out (YPORT), a
|
||||
ld l, l
|
||||
ld a, (hl)
|
||||
ld b, b
|
||||
ld a, e
|
||||
out (YPORT), a
|
||||
ld l, l
|
||||
ld (hl), a
|
||||
ld b, b
|
||||
dec e
|
||||
inc d
|
||||
jr nz, .loop4
|
||||
ld hl, 0x4000 + 160
|
||||
ld e, 127
|
||||
ld d, 128
|
||||
.loop5: ld a, d
|
||||
out (YPORT), a
|
||||
ld l, l
|
||||
ld a, (hl)
|
||||
ld b, b
|
||||
ld a, e
|
||||
out (YPORT), a
|
||||
ld l, l
|
||||
ld (hl), a
|
||||
ld b, b
|
||||
dec e
|
||||
inc d
|
||||
jr nz, .loop5
|
||||
ei
|
||||
|
||||
pop bc
|
||||
ld a, b
|
||||
out (PAGE1), a
|
||||
ld a, c
|
||||
out (YPORT), a ; restore ports
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; Fast circuit generator for first quadrange
|
||||
; Original implementation for z80 (c)2002, Enin Anton
|
||||
; Procedure based on Horn-Doros algorithm for circuits
|
||||
; Input:
|
||||
; l - radius
|
||||
; a - color
|
||||
; Output:
|
||||
; -
|
||||
|
||||
QCircuit:
|
||||
exx ; center 160, 128
|
||||
ld de, 0x4000 + 160 ; 'de - center screen on x-axis
|
||||
ld c, a ; 'c - color
|
||||
exx
|
||||
; x = radius; y = 0; s = -radius;
|
||||
ld e, l ; e - x
|
||||
ld d, 0x00
|
||||
ld c, d
|
||||
ld b, d ; c - y
|
||||
ld a, l
|
||||
neg
|
||||
ld l, a
|
||||
ld h, 0xFF ; hl - s
|
||||
.loop1:
|
||||
call SetPixel
|
||||
inc hl
|
||||
add hl, bc
|
||||
add hl, bc ; s = s + 2*y + 1
|
||||
bit 7, h
|
||||
jr nz, .nocorr1 ; s >= 0 ?
|
||||
inc hl
|
||||
inc hl
|
||||
or a
|
||||
sbc hl, de
|
||||
or a
|
||||
sbc hl, de ; s = s - 2*x + 2
|
||||
dec e ; x = x - 1
|
||||
.nocorr1: inc c ; y = y + 1
|
||||
ld a, e
|
||||
cp c
|
||||
jr nc, .loop1
|
||||
|
||||
add hl, de
|
||||
add hl, de ; s = s + 2*x
|
||||
ld a, c ; t = y
|
||||
ld c, e ; y = x
|
||||
ld e, a ; x = t
|
||||
.loop2:
|
||||
inc hl
|
||||
or a
|
||||
sbc hl, de
|
||||
or a
|
||||
sbc hl, de ; s = s - 2*x + 1
|
||||
jp p, .nocorr2 ; s < 0 ?
|
||||
inc hl
|
||||
inc hl
|
||||
add hl, bc
|
||||
add hl, bc ; s = s + 2*y + 2
|
||||
inc c ; y = y + 1
|
||||
.nocorr2: dec e ; x = x - 1
|
||||
call SetPixel
|
||||
ld a, e
|
||||
cp -1
|
||||
jr nz, .loop2
|
||||
ret
|
||||
|
||||
; SetPixel
|
||||
; e - x, c - y
|
||||
SetPixel:
|
||||
ld a, e ; clip pixel on x-axis
|
||||
cp 160
|
||||
ret nc
|
||||
ld a, c ; clip pixel on y-axis
|
||||
cp 128
|
||||
ret nc
|
||||
add a, 128 ; center screen on y-axis
|
||||
out (YPORT), a
|
||||
ld a, e
|
||||
exx
|
||||
ld l, a
|
||||
ld h, 0x00
|
||||
add hl, de
|
||||
ld (hl), c ; set 2 equal pixels
|
||||
inc hl ; for disappear holes
|
||||
ld (hl), c ; between circuits
|
||||
exx
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; Clear video memory (first screen)
|
||||
CrearVideoRam:
|
||||
ld hl, PALETTE_BASE ; load fully black palette
|
||||
ld de, 0x0000
|
||||
ld bc, 0xFFA4
|
||||
sub a
|
||||
rst 0x08 ; load palette by BIOS
|
||||
|
||||
in a, (YPORT) ; store modify ports
|
||||
ld c, a
|
||||
in a, (PAGE1)
|
||||
ld b, a
|
||||
push bc
|
||||
ld a, VPAGE
|
||||
out (PAGE1), a
|
||||
ld hl, 0x4000
|
||||
ld bc, 320 ; screen x size in bytes
|
||||
ld e, l
|
||||
di
|
||||
ld d, d
|
||||
ld a, 0x00 ; set accel lenght to 256 bytes
|
||||
.loop: ld e, e ; fill vertical lines
|
||||
ld (hl), e
|
||||
ld b, b
|
||||
inc hl
|
||||
dec bc
|
||||
ld a, b
|
||||
or c
|
||||
jr nz, .loop
|
||||
ei
|
||||
pop bc
|
||||
ld a, b
|
||||
out (PAGE1), a
|
||||
ld a, c
|
||||
out (YPORT), a ; restore modify ports
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
HelpString:
|
||||
db 0x0D, 0x0A
|
||||
db "The 256color! Mini demo for Sprinter.", 0x0D, 0x0A
|
||||
db "Created by Enin Anton.", 0x0D, 0x0A, 0x00
|
||||
|
||||
Executable
+921
@@ -0,0 +1,921 @@
|
||||
|
||||
;[BEGIN]
|
||||
;//MODULE: INTMOUSE
|
||||
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
|
||||
;//UPDATE: 24-10-1999 DNS Restore module
|
||||
|
||||
CMOUSE EQU #1B
|
||||
DMOUSE EQU #1A
|
||||
Y_PORT EQU #89
|
||||
VPAGE EQU #C9
|
||||
|
||||
; MOUSE SOFTWARE SPECIFICATION
|
||||
;---------------------------------------------
|
||||
; COMMAND 00h (INITIALIZATION)
|
||||
;
|
||||
; RETURN: NC - MOUSE PRESENT
|
||||
; C - MOUSE ABSENT
|
||||
;---------------------------------------------
|
||||
; COMMAND 01h (SHOW MOUSE CURSOR)
|
||||
;
|
||||
; RETURN: NC - DONE
|
||||
; C - MOUSE ON SCREEN
|
||||
;---------------------------------------------
|
||||
; COMMAND 02h (HIDE MOUSE CURSOR)
|
||||
;
|
||||
; RETURN: NC - DONE
|
||||
; C - NONE MOUSE
|
||||
;---------------------------------------------
|
||||
; COMMAND 03h (READ MOUSE STATE)
|
||||
;
|
||||
; RETURN: HL - X COORD
|
||||
; DE - Y COORD
|
||||
; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT)
|
||||
;---------------------------------------------
|
||||
; COMMAND 04h (GOTO MOUSE CURSOR)
|
||||
;
|
||||
; INPUT: HL - X COORD
|
||||
; DE - Y COORD
|
||||
;---------------------------------------------
|
||||
; COMMAND 05h (RESERVED)
|
||||
;---------------------------------------------
|
||||
; COMMAND 06h (RESERVED)
|
||||
;---------------------------------------------
|
||||
; COMMAND 07h (SET VERT. BOUNDS)
|
||||
;
|
||||
; INPUT: HL - Y MIN
|
||||
; DE - Y MAX
|
||||
;---------------------------------------------
|
||||
; COMMAND 08h (SET HORZ. BOUNDS)
|
||||
;
|
||||
; INPUT: HL - X MIN
|
||||
; DE - X MAX
|
||||
;---------------------------------------------
|
||||
; COMMAND 09h (LOAD CURSOR)
|
||||
;
|
||||
; INPUT: IX - CURSOR IMAGE
|
||||
; H - HEIGHT CURSOR
|
||||
; L - WIDTH CURSOR
|
||||
; D - Y HOT SPOT
|
||||
; E - X HOT SPOT
|
||||
; B = 0
|
||||
;---------------------------------------------
|
||||
; COMMAND 0Ah (SET CURSOR IN TEXT MODES)
|
||||
;
|
||||
; INPUT: H - AND SIMBOL MASK
|
||||
; L - XOR SIMBOL MASK
|
||||
; D - AND ATTRIBUT MASK
|
||||
; E - XOR ATTRIBUT MASK
|
||||
; B = 0
|
||||
;---------------------------------------------
|
||||
; COMMAND 0Bh (RETURN CURSOR)
|
||||
;
|
||||
; INPUT: IX - CURSOR IMAGE BUFFER
|
||||
; OUTPUT: H - HEIGHT CURSOR
|
||||
; L - WIDTH CURSOR
|
||||
; D - Y HOT SPOT
|
||||
; E - X HOT SPOT
|
||||
;---------------------------------------------
|
||||
; COMMAND 0Ch (RESERVED)
|
||||
;---------------------------------------------
|
||||
; COMMAND 0Dh (RESERVED)
|
||||
;---------------------------------------------
|
||||
; COMMAND 0Eh (GET SENSETIVE)
|
||||
; OUTPUT: H - VERTICAL SENSETIVE
|
||||
; L - HORIZONTAL SENSETIVE
|
||||
;---------------------------------------------
|
||||
; COMMAND 0Fh (SET SENSETIVE)
|
||||
; INPUT: H - VERTICAL SENSETIVE
|
||||
; L - HORIZONTAL SENSETIVE
|
||||
;---------------------------------------------
|
||||
; COMMAND 80h (MOUSE HARDWARE INTERRUPT)
|
||||
;---------------------------------------------
|
||||
; COMMAND 81h (CHANGE VIDEO MODE)
|
||||
; INPUT: A - MODE
|
||||
;---------------------------------------------
|
||||
; COMMAND 82h (RESERVED)
|
||||
;---------------------------------------------
|
||||
; COMMAND 83h (MOUSE REFRESH)
|
||||
;---------------------------------------------
|
||||
; ERRORS: 0 - NO ERROR
|
||||
; 1 - COMMAND NOT PRESENT
|
||||
; 2 - DEVICE ABSENT
|
||||
; 3 - CURSOR ON (UZHE)
|
||||
; 4 - CURSOR OFF (UZHE)
|
||||
; 5 - CURSOR IMAGE VERY BIG
|
||||
|
||||
INTMOUS BIT 7,C
|
||||
JP NZ,EMOUSE
|
||||
INC C
|
||||
DEC C
|
||||
JP Z,MS_INIT
|
||||
DEC C
|
||||
JP Z,MS_SHOW
|
||||
DEC C
|
||||
JP Z,MS_HIDD
|
||||
DEC C
|
||||
JP Z,MS_READ
|
||||
DEC C
|
||||
JP Z,MS_GOTO
|
||||
DEC C
|
||||
JP Z,MS_RESR
|
||||
DEC C
|
||||
JP Z,MS_RESR
|
||||
DEC C
|
||||
JP Z,MS_VERT
|
||||
DEC C
|
||||
JP Z,MS_HORZ
|
||||
DEC C
|
||||
JP Z,MS_CURS
|
||||
DEC C
|
||||
JP Z,MS_MASK
|
||||
DEC C
|
||||
JP Z,MS_BCUR
|
||||
DEC C
|
||||
JP Z,MS_RESR
|
||||
DEC C
|
||||
JP Z,MS_RESR
|
||||
DEC C
|
||||
JP Z,MS_GSEN
|
||||
DEC C
|
||||
JP Z,MS_SENT
|
||||
MS_RESR LD A,1
|
||||
SCF
|
||||
RET
|
||||
|
||||
EMOUSE RES 7,C
|
||||
INC C
|
||||
DEC C
|
||||
JP Z,M_INT
|
||||
DEC C
|
||||
JP Z,M_MODE
|
||||
DEC C
|
||||
JR Z,M_RESR
|
||||
DEC C
|
||||
JP Z,M_REFR
|
||||
M_RESR LD A,1
|
||||
SCF
|
||||
RET
|
||||
|
||||
MS_INIT DI
|
||||
LD A,85
|
||||
OUT (#10),A
|
||||
LD A,45
|
||||
OUT (#10),A
|
||||
LD A,0
|
||||
OUT (CMOUSE),A
|
||||
LD A,1
|
||||
OUT (CMOUSE),A
|
||||
LD A,0
|
||||
OUT (CMOUSE),A
|
||||
LD A,3
|
||||
OUT (CMOUSE),A
|
||||
LD A,#41
|
||||
OUT (CMOUSE),A
|
||||
LD A,4
|
||||
OUT (CMOUSE),A
|
||||
LD A,#47
|
||||
OUT (CMOUSE),A
|
||||
LD A,5
|
||||
OUT (CMOUSE),A
|
||||
LD A,#E0
|
||||
OUT (CMOUSE),A
|
||||
EI
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_SHOW PUSH IX
|
||||
PUSH HL
|
||||
PUSH DE
|
||||
EX AF,AF'
|
||||
PUSH AF
|
||||
LD HL,(PIX_X)
|
||||
LD DE,(PIX_Y)
|
||||
DI
|
||||
CALL MOUSE
|
||||
XOR A
|
||||
LD (REFRESH+1),A
|
||||
EI
|
||||
POP AF
|
||||
EX AF,AF'
|
||||
POP DE
|
||||
POP HL
|
||||
POP IX
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_HIDD PUSH IX
|
||||
PUSH HL
|
||||
PUSH DE
|
||||
EX AF,AF'
|
||||
PUSH AF
|
||||
DI
|
||||
LD A,1
|
||||
LD (REFRESH+1),A
|
||||
CALL RESTORE
|
||||
EI
|
||||
POP AF
|
||||
EX AF,AF'
|
||||
POP DE
|
||||
POP HL
|
||||
POP IX
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_READ LD HL,(PIX_X)
|
||||
LD DE,(PIX_Y)
|
||||
LD A,(MB)
|
||||
AND A
|
||||
RET
|
||||
|
||||
MS_GOTO PUSH IX
|
||||
PUSH HL
|
||||
PUSH DE
|
||||
LD (PIX_X),HL
|
||||
LD (PIX_Y),DE
|
||||
EX AF,AF'
|
||||
PUSH AF
|
||||
DI
|
||||
CALL REFRESH
|
||||
EI
|
||||
POP AF
|
||||
EX AF,AF'
|
||||
POP DE
|
||||
POP HL
|
||||
POP IX
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_CURS PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
PUSH IX
|
||||
LD A,L
|
||||
LD (M_XSIZE),A
|
||||
LD A,H
|
||||
LD (M_YSIZE),A
|
||||
LD C,E
|
||||
LD B,0
|
||||
LD (XHOT_SP),BC
|
||||
LD C,D
|
||||
LD B,0
|
||||
LD (YHOT_SP),BC
|
||||
EXX
|
||||
LD A,(M_XSIZE)
|
||||
LD C,A
|
||||
LD B,0
|
||||
LD A,(M_YSIZE)
|
||||
LD HL,0
|
||||
MSCURS1 ADD HL,BC
|
||||
DEC A
|
||||
JR NZ,MSCURS1
|
||||
PUSH HL
|
||||
LD BC,MAXSIZM+1
|
||||
AND A
|
||||
SBC HL,BC
|
||||
CCF
|
||||
EXX
|
||||
POP BC
|
||||
POP HL
|
||||
LD A,5
|
||||
JR C,NOLOADM
|
||||
LD DE,M_IMAGE
|
||||
DI
|
||||
LDIR
|
||||
XOR A
|
||||
NOLOADM POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
EI
|
||||
RET
|
||||
|
||||
MS_BCUR PUSH IX
|
||||
EXX
|
||||
LD A,(M_XSIZE)
|
||||
LD C,A
|
||||
LD B,0
|
||||
LD A,(M_YSIZE)
|
||||
LD HL,0
|
||||
MSBCUR1 ADD HL,BC
|
||||
DEC A
|
||||
JR NZ,MSBCUR1
|
||||
PUSH HL
|
||||
LD BC,MAXSIZM+1
|
||||
AND A
|
||||
SBC HL,BC
|
||||
CCF
|
||||
EXX
|
||||
POP BC
|
||||
POP HL
|
||||
LD A,5
|
||||
JR C,NOSAVEM
|
||||
LD DE,M_IMAGE
|
||||
EX DE,HL
|
||||
DI
|
||||
LDIR
|
||||
LD A,(M_XSIZE)
|
||||
LD L,A
|
||||
LD A,(M_YSIZE)
|
||||
LD H,A
|
||||
LD BC,(XHOT_SP)
|
||||
LD E,C
|
||||
LD BC,(YHOT_SP)
|
||||
LD D,C
|
||||
LD BC,0
|
||||
XOR A
|
||||
NOSAVEM EI
|
||||
RET
|
||||
|
||||
MS_HORZ
|
||||
LD (MIN_X),HL
|
||||
LD (MAX_X),DE
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_VERT
|
||||
LD (MIN_Y),HL
|
||||
LD (MAX_Y),DE
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_MASK
|
||||
LD (ANDXORS),HL
|
||||
LD (ANDXORA),DE
|
||||
XOR A
|
||||
RET
|
||||
|
||||
; H - VERTICAL SENSETIVE
|
||||
; L - HORIZONTAL SENSETIVE
|
||||
|
||||
MS_SENT
|
||||
LD (SENSEXY),HL
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MS_GSEN
|
||||
LD HL,(SENSEXY)
|
||||
XOR A
|
||||
RET
|
||||
|
||||
MOUSET LD (REST_XT+1),HL
|
||||
LD (REST_YT+1),DE
|
||||
;Y
|
||||
SRL D
|
||||
RR E
|
||||
SRL D
|
||||
RR E
|
||||
SRL D
|
||||
RR E
|
||||
LD D,E
|
||||
;X
|
||||
SRL H
|
||||
RR L
|
||||
SRL H
|
||||
RR L
|
||||
SRL H
|
||||
RR L
|
||||
LD E,L
|
||||
|
||||
IN A,(Y_PORT)
|
||||
LD XH,A
|
||||
IN A,(PAGE1)
|
||||
LD XL,A
|
||||
;
|
||||
DI
|
||||
;
|
||||
LD A,#54
|
||||
OUT (PAGE1),A
|
||||
;
|
||||
LD A,D
|
||||
ADD A,A
|
||||
ADD A,A ;Y * 4
|
||||
LD L,A
|
||||
LD H,#43 ;+ #4300
|
||||
;
|
||||
IN A,(VPAGE)
|
||||
RRCA
|
||||
AND #80
|
||||
OR #01
|
||||
ADD A,E
|
||||
OUT (Y_PORT),A
|
||||
INC L
|
||||
LD A,(HL) ;SIMBOL
|
||||
LD BC,(ANDXORS)
|
||||
AND B
|
||||
XOR C
|
||||
LD (HL),A
|
||||
INC L
|
||||
LD A,(HL) ;ATTRIBUT
|
||||
LD BC,(ANDXORA)
|
||||
AND B
|
||||
XOR C
|
||||
LD (HL),A
|
||||
;
|
||||
LD A,XL
|
||||
OUT (PAGE1),A
|
||||
LD A,XH
|
||||
OUT (Y_PORT),A
|
||||
RET
|
||||
|
||||
RESTORT
|
||||
REST_XT LD HL,#0000
|
||||
REST_YT LD DE,#0000
|
||||
;Y
|
||||
SRL D
|
||||
RR E
|
||||
SRL D
|
||||
RR E
|
||||
SRL D
|
||||
RR E
|
||||
LD D,E
|
||||
;X
|
||||
SRL H
|
||||
RR L
|
||||
SRL H
|
||||
RR L
|
||||
SRL H
|
||||
RR L
|
||||
LD E,L
|
||||
|
||||
IN A,(Y_PORT)
|
||||
LD XH,A
|
||||
IN A,(PAGE1)
|
||||
LD XL,A
|
||||
;
|
||||
DI
|
||||
;
|
||||
LD A,#50
|
||||
OUT (PAGE1),A
|
||||
;
|
||||
LD A,D
|
||||
ADD A,A
|
||||
ADD A,A ;Y * 4
|
||||
LD L,A
|
||||
LD H,#43 ;+ #4300
|
||||
;
|
||||
IN A,(VPAGE)
|
||||
RRCA
|
||||
AND #80
|
||||
OR #01
|
||||
ADD A,E
|
||||
OUT (Y_PORT),A
|
||||
INC L
|
||||
LD A,(HL) ;SIMBOL
|
||||
LD (HL),A
|
||||
INC L
|
||||
LD A,(HL) ;ATTRIBUT
|
||||
LD (HL),A
|
||||
;
|
||||
LD A,XL
|
||||
OUT (PAGE1),A
|
||||
LD A,XH
|
||||
OUT (Y_PORT),A
|
||||
RET
|
||||
|
||||
RESTORE LD A,#00
|
||||
BIT 7,A
|
||||
JP Z,RESTORT
|
||||
RESTORG IN A,(PAGE3)
|
||||
LD B,A
|
||||
IN A,(Y_PORT)
|
||||
LD C,A
|
||||
PUSH BC
|
||||
LD A,#50
|
||||
OUT (PAGE3),A
|
||||
REST_X LD HL,0
|
||||
REST_Y LD DE,0
|
||||
LD A,E
|
||||
EX AF,AF'
|
||||
REST_V LD A,#00
|
||||
AND 1
|
||||
LD DE,#C000 ;PAGE 0
|
||||
JR Z,AA2
|
||||
LD DE,#C000+320 ;PAGE 1
|
||||
AA2 ADD HL,DE
|
||||
REST_A LD A,0
|
||||
LD XH,A
|
||||
EX AF,AF'
|
||||
REST_H
|
||||
RS002 LD BC,10
|
||||
OUT (Y_PORT),A
|
||||
EX AF,AF'
|
||||
; PUSH HL
|
||||
LD (PUSH_HL+1),HL
|
||||
LD D,H
|
||||
LD E,L
|
||||
LDIR
|
||||
PUSH_HL LD HL,#0000
|
||||
; POP HL
|
||||
EX AF,AF'
|
||||
INC A
|
||||
JR Z,RS003
|
||||
DEC XH
|
||||
JR NZ,RS002
|
||||
RS003 POP BC
|
||||
LD A,B
|
||||
OUT (PAGE3),A
|
||||
LD A,C
|
||||
OUT (Y_PORT),A
|
||||
XOR A
|
||||
RET
|
||||
|
||||
;HL/DE - X/Y
|
||||
|
||||
MOUSE LD A,(MODE)
|
||||
LD (RESTORE+1),A
|
||||
BIT 7,A
|
||||
JP Z,MOUSET
|
||||
MOUSEG CP #82 ;640x256x16
|
||||
JR NZ,NOFX
|
||||
SRL H
|
||||
RR L
|
||||
NOFX LD IX,M_IMAGE
|
||||
LD A,(M_XSIZE)
|
||||
LD C,A
|
||||
LD B,0
|
||||
LD (REALXS),BC
|
||||
LD (REST_H+1),BC
|
||||
LD C,B
|
||||
LD (SKIPXF),BC
|
||||
LD A,(M_YSIZE)
|
||||
LD (REST_A+1),A
|
||||
LD C,A
|
||||
LD B,0
|
||||
LD (REALYS),BC
|
||||
LD BC,(YHOT_SP)
|
||||
LD A,E
|
||||
SUB C
|
||||
LD E,A
|
||||
JR NC,GOODY
|
||||
NEG
|
||||
LD E,A
|
||||
LD A,(M_XSIZE)
|
||||
LD C,A
|
||||
LD B,0
|
||||
LD A,(M_YSIZE)
|
||||
SUB E
|
||||
SKIPMY ADD IX,BC
|
||||
DEC E
|
||||
JR NZ,SKIPMY
|
||||
LD C,A
|
||||
LD (REALYS),BC
|
||||
GOODY LD BC,(XHOT_SP)
|
||||
AND A
|
||||
SBC HL,BC
|
||||
JR NC,GOODX
|
||||
LD B,H
|
||||
LD C,L
|
||||
LD HL,0
|
||||
AND A
|
||||
SBC HL,BC
|
||||
LD (SKIPXF),HL
|
||||
LD A,(M_XSIZE)
|
||||
SUB L
|
||||
LD L,A
|
||||
LD (REALXS),HL
|
||||
LD HL,0
|
||||
GOODX LD (REST_X+1),HL
|
||||
LD (REST_Y+1),DE
|
||||
|
||||
PUSH HL
|
||||
IN A,(PAGE3)
|
||||
LD H,A
|
||||
IN A,(Y_PORT)
|
||||
LD L,A
|
||||
EX (SP),HL
|
||||
LD A,#5C
|
||||
OUT (PAGE3),A
|
||||
LD A,E
|
||||
EX AF,AF'
|
||||
IN A,(VPAGE)
|
||||
LD (REST_V+1),A
|
||||
AND 1
|
||||
LD DE,#C000 ;PAGE 0
|
||||
JR Z,AA1
|
||||
LD DE,#C000+320 ;PAGE 1
|
||||
AA1 ADD HL,DE
|
||||
LD D,XH
|
||||
LD E,XL
|
||||
EX DE,HL ;HL - BITMAP
|
||||
LD BC,(REALYS)
|
||||
LD XH,C
|
||||
EX AF,AF'
|
||||
MS002 LD BC,(SKIPXF)
|
||||
ADD HL,BC
|
||||
LD BC,(REALXS)
|
||||
OUT (Y_PORT),A
|
||||
EX AF,AF'
|
||||
;USH DE
|
||||
LD (PUSH_DE+1),DE
|
||||
LDIR
|
||||
PUSH_DE LD DE,#0000
|
||||
; POP DE
|
||||
EX AF,AF'
|
||||
INC A
|
||||
JR Z,MS003
|
||||
DEC XH
|
||||
JR NZ,MS002
|
||||
MS003 POP BC
|
||||
LD A,B
|
||||
OUT (PAGE3),A
|
||||
LD A,C
|
||||
OUT (Y_PORT),A
|
||||
XOR A
|
||||
RET
|
||||
|
||||
READ_M IN A,(CMOUSE)
|
||||
RRCA
|
||||
RET NC
|
||||
IN A,(DMOUSE)
|
||||
LD L,A
|
||||
BIT 6,A
|
||||
CCF
|
||||
RET Z
|
||||
TST_01 IN A,(CMOUSE)
|
||||
RRCA
|
||||
JP NC,TST_01
|
||||
IN A,(DMOUSE)
|
||||
LD E,A
|
||||
BIT 6,A
|
||||
CCF
|
||||
RET NZ
|
||||
TST_02 IN A,(CMOUSE)
|
||||
RRCA
|
||||
JR NC,TST_02
|
||||
IN A,(DMOUSE)
|
||||
LD D,A
|
||||
BIT 6,A
|
||||
CCF
|
||||
RET NZ
|
||||
LD A,E
|
||||
AND #3F
|
||||
LD E,A
|
||||
LD A,L
|
||||
AND #03
|
||||
RRCA
|
||||
RRCA
|
||||
OR E
|
||||
LD E,A
|
||||
LD A,D
|
||||
AND #3F
|
||||
LD D,A
|
||||
LD A,L
|
||||
AND #0C
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
OR D
|
||||
LD D,A
|
||||
LD A,L
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
RES 6,A
|
||||
JR NC,STBU
|
||||
SET 6,A
|
||||
STBU RLCA
|
||||
RLCA
|
||||
AND #03
|
||||
LD (MB),A
|
||||
CALL SENSE
|
||||
LD A,E
|
||||
LD (MX),A
|
||||
LD A,D
|
||||
LD (MY),A
|
||||
SCF
|
||||
RET
|
||||
|
||||
MCORECT LD HL,(PIX_X)
|
||||
LD DE,(MX)
|
||||
LD D,0
|
||||
BIT 7,E
|
||||
JR NZ,DECX
|
||||
ADD HL,DE
|
||||
LD (PIX_X),HL
|
||||
EX DE,HL
|
||||
LD HL,(MAX_X)
|
||||
AND A
|
||||
SBC HL,DE
|
||||
JP NC,YCOO
|
||||
LD HL,(MAX_X)
|
||||
LD (PIX_X),HL
|
||||
JP YCOO
|
||||
DECX LD A,E
|
||||
NEG
|
||||
LD E,A
|
||||
AND A
|
||||
SBC HL,DE
|
||||
LD (PIX_X),HL
|
||||
JR C,YCOO2
|
||||
LD DE,(MIN_X)
|
||||
SBC HL,DE
|
||||
JR NC,YCOO
|
||||
YCOO2 LD HL,(MIN_X)
|
||||
LD (PIX_X),HL
|
||||
|
||||
YCOO LD HL,(PIX_Y)
|
||||
LD DE,(MY)
|
||||
LD D,0
|
||||
BIT 7,E
|
||||
JR NZ,DECY
|
||||
ADD HL,DE
|
||||
LD (PIX_Y),HL
|
||||
EX DE,HL
|
||||
|
||||
LD HL,(MAX_Y)
|
||||
AND A
|
||||
SBC HL,DE
|
||||
RET NC
|
||||
LD HL,(MAX_Y)
|
||||
LD (PIX_Y),HL
|
||||
RET
|
||||
|
||||
DECY LD A,E
|
||||
NEG
|
||||
LD E,A
|
||||
AND A
|
||||
SBC HL,DE
|
||||
LD (PIX_Y),HL
|
||||
JR C,XCOO
|
||||
LD DE,(MIN_Y)
|
||||
SBC HL,DE
|
||||
RET NC
|
||||
XCOO LD HL,(MIN_Y)
|
||||
LD (PIX_Y),HL
|
||||
RET
|
||||
|
||||
SENSE LD HL,(SENSEXY)
|
||||
LD A,L
|
||||
OR L
|
||||
RET Z
|
||||
DEC A
|
||||
RET Z
|
||||
LD A,E
|
||||
BIT 7,A
|
||||
LD B,#FF
|
||||
JR Z,SEN1
|
||||
LD B,#7F
|
||||
NEG
|
||||
SEN1 INC B
|
||||
SUB L
|
||||
JR NC,SEN1
|
||||
BIT 7,B
|
||||
JR Z,SEN2
|
||||
LD A,B
|
||||
RES 7,A
|
||||
NEG
|
||||
LD B,A
|
||||
SEN2 LD E,B
|
||||
LD A,D
|
||||
BIT 7,A
|
||||
LD B,#FF
|
||||
JR Z,SEN3
|
||||
LD B,#7F
|
||||
NEG
|
||||
SEN3 INC B
|
||||
SUB H
|
||||
JR NC,SEN3
|
||||
BIT 7,B
|
||||
JR Z,SEN4
|
||||
LD A,B
|
||||
RES 7,A
|
||||
NEG
|
||||
LD B,A
|
||||
SEN4 LD D,B
|
||||
RET
|
||||
|
||||
M_MODE LD (MODE),A
|
||||
OR A
|
||||
JR Z,UNKMODE
|
||||
CP 1
|
||||
JR Z,UNKMODE
|
||||
CP 2
|
||||
JR Z,S320256
|
||||
CP 3
|
||||
JR Z,S640256
|
||||
BIT 7,A
|
||||
JR Z,UNKMODE
|
||||
RES 7,A
|
||||
CP 1
|
||||
JR Z,S320256
|
||||
CP 2
|
||||
JR Z,S640256
|
||||
UNKMODE XOR A
|
||||
SCF
|
||||
RET
|
||||
|
||||
S320256
|
||||
LD HL,0 ;MIN X
|
||||
LD DE,319 ;MAX X
|
||||
CALL MS_HORZ
|
||||
LD HL,0 ;MIN X
|
||||
LD DE,255 ;MAX X
|
||||
CALL MS_VERT
|
||||
XOR A
|
||||
RET
|
||||
|
||||
S640256
|
||||
LD HL,0 ;MIN X
|
||||
LD DE,639 ;MAX X
|
||||
CALL MS_HORZ
|
||||
LD HL,0 ;MIN X
|
||||
LD DE,255 ;MAX X
|
||||
CALL MS_VERT
|
||||
XOR A
|
||||
RET
|
||||
|
||||
;Mouse Interrupt
|
||||
M_INT IN A,(PAGE3)
|
||||
LD B,A
|
||||
IN A,(Y_PORT)
|
||||
LD C,A
|
||||
PUSH BC
|
||||
CALL REFRESH ;Refresh mouse
|
||||
CALL CONTROL
|
||||
POP BC
|
||||
LD A,B
|
||||
OUT (PAGE3),A
|
||||
LD A,C
|
||||
OUT (Y_PORT),A
|
||||
RET
|
||||
|
||||
M_REFR CALL CONTROL
|
||||
AND A
|
||||
RET
|
||||
|
||||
CONTROL CALL READ_M
|
||||
RET NC
|
||||
CALL MCORECT
|
||||
LD A,#00
|
||||
LD (REDY+1),A
|
||||
RET
|
||||
|
||||
REFRESH LD A,#01
|
||||
OR A
|
||||
RET NZ
|
||||
REDY LD A,#00
|
||||
; OR A
|
||||
; RET NZ
|
||||
CALL RESTORE
|
||||
LD HL,(PIX_X)
|
||||
LD DE,(PIX_Y)
|
||||
CALL MOUSE
|
||||
LD A,#FF
|
||||
LD (REDY+1),A
|
||||
RET
|
||||
|
||||
MODE DB #03
|
||||
|
||||
PIX_X DW 160
|
||||
PIX_Y DW 128
|
||||
|
||||
MX DB #00
|
||||
MY DB #00
|
||||
MB DB #00
|
||||
MB_OLD DB #00
|
||||
MIN_X DW 0
|
||||
MAX_X DW 319
|
||||
MIN_Y DW 0
|
||||
MAX_Y DW 255
|
||||
SENSEXY
|
||||
SENSE_X DB 0
|
||||
SENSE_Y DB 0
|
||||
|
||||
XHOT_SP DW 0
|
||||
YHOT_SP DW 0
|
||||
|
||||
ANDXORS DW #FF00
|
||||
ANDXORA DW #FF77
|
||||
|
||||
M_XSIZE DB 10
|
||||
M_YSIZE DB 14
|
||||
SKIPXF DW 0
|
||||
REALXS DW 0
|
||||
REALYS DW 0
|
||||
|
||||
X EQU #00
|
||||
W EQU #FE
|
||||
N EQU #FF
|
||||
|
||||
M_IMAGE
|
||||
MS_BMP DB X,X,N,N,N,N,N,N,N,N
|
||||
DB X,W,X,N,N,N,N,N,N,N
|
||||
DB X,W,W,X,N,N,N,N,N,N
|
||||
DB X,W,W,W,X,N,N,N,N,N
|
||||
DB X,W,W,W,W,X,N,N,N,N
|
||||
DB X,W,W,W,W,W,X,N,N,N
|
||||
DB X,W,W,W,W,W,W,X,N,N
|
||||
DB X,W,W,W,W,X,X,X,X,N
|
||||
DB X,W,W,X,W,X,N,N,N,N
|
||||
DB X,W,X,X,W,W,X,N,N,N
|
||||
DB X,X,N,N,X,W,X,N,N,N
|
||||
DB X,N,N,N,X,W,W,X,N,N
|
||||
DB N,N,N,N,N,X,X,N,N,N
|
||||
DB N,N,N,N,N,N,N,N,N,N
|
||||
DS 116
|
||||
MAXSIZM EQU $-M_IMAGE
|
||||
|
||||
;//MODULE: INTMOUSE
|
||||
;[END]
|
||||
|
||||
Executable
+308
@@ -0,0 +1,308 @@
|
||||
|
||||
PAGE_0: equ 82h ; порт 0 окна = addr 0000h
|
||||
PAGE_1: equ 0A2h ; порт 1 окна = 4000h
|
||||
PAGE_2: equ 0C2h ; порт 2 окна = 8000h
|
||||
PAGE_3: equ 0E2h ; порт 3 окна = 0c000h
|
||||
|
||||
SIO_CONTROL_A: EQU 19h
|
||||
SIO_DATA_REG_A: EQU 18h
|
||||
SIO_CONTROL_B: EQU 1Bh
|
||||
SIO_DATA_REG_B: EQU 1Ah
|
||||
CTC_CH0: equ 10h
|
||||
CTC_CH1: equ 11h
|
||||
CTC_CH2: equ 12h
|
||||
CTC_CH3: equ 13h
|
||||
|
||||
RGMOD equ 0c9h
|
||||
|
||||
; ....
|
||||
|
||||
; Запомним текущий видео-режим
|
||||
LD C, DSS.GetVMod
|
||||
RST 10h
|
||||
LD HL, GetVMod_Error_Message
|
||||
;JR C, PutError
|
||||
LD C, A
|
||||
LD (.Current_VMod), BC
|
||||
|
||||
; Запрос памяти
|
||||
|
||||
; сохраним текущие значения страниц
|
||||
IN A, (PAGE_1)
|
||||
LD (SavePage1), A
|
||||
IN A, (PAGE_3)
|
||||
LD (SavePage3), A
|
||||
|
||||
; Настройка прерываний CTC и SIO
|
||||
LD HL, IM2_Empty : LD (0FDFFh), HL
|
||||
|
||||
LD (0FD10h), hl
|
||||
LD (0FD12h), hl
|
||||
LD (0FD14h), hl
|
||||
LD (0FD16h), hl
|
||||
LD (0FD18h), hl
|
||||
LD (0FD1Ah), hl
|
||||
LD (0FD1Ch), hl
|
||||
LD (0FD1Eh), hl
|
||||
|
||||
LD HL, IM2_VShandler : LD (0FD06h), HL
|
||||
|
||||
LD A, I
|
||||
LD (.SaveInterrupt), A
|
||||
LD A, 0FDh
|
||||
DI
|
||||
LD I, A
|
||||
IM 2
|
||||
|
||||
.Sync:
|
||||
EI
|
||||
HALT
|
||||
DI
|
||||
IN A, (SIO_CONTROL_A)
|
||||
BIT 0, A ; 0-bit, байт пришел ?
|
||||
JR Z, .EndSync ; да, это прерывание от клавиатуры
|
||||
CALL Keyboard.PS2_Scan
|
||||
JR .Sync
|
||||
.EndSync:
|
||||
|
||||
LD B, 5
|
||||
.loopSync:
|
||||
DJNZ .loopSync
|
||||
|
||||
; Настройка CTC
|
||||
LD A, 057h : OUT (CTC_CH2), A
|
||||
LD A, 112 : OUT (CTC_CH2), A
|
||||
LD A, 0d7h : OUT (CTC_CH3), A
|
||||
LD A, 160 : OUT (CTC_CH3), A
|
||||
LD A, 0 : OUT (CTC_CH0), A
|
||||
|
||||
; Настройка SIO
|
||||
LD A, 1 : OUT (SIO_CONTROL_A), A
|
||||
LD A, 18h : OUT (SIO_CONTROL_A), A
|
||||
LD A, 2 : OUT (SIO_CONTROL_B), A
|
||||
LD A, 10h : OUT (SIO_CONTROL_B), A
|
||||
|
||||
LD HL, IM2_Keyhandler
|
||||
LD (0FDFFh), HL
|
||||
|
||||
LD (0FD10h), hl
|
||||
LD (0FD12h), hl
|
||||
LD (0FD14h), hl
|
||||
LD (0FD16h), hl
|
||||
LD (0FD18h), hl
|
||||
LD (0FD1Ah), hl
|
||||
LD (0FD1Ch), hl
|
||||
LD (0FD1Eh), hl
|
||||
|
||||
|
||||
Loop:
|
||||
; основаной цикл
|
||||
; ................
|
||||
|
||||
LD A, (Keyboard.KeyFlags)
|
||||
BIT 7, A
|
||||
JR NZ, .Key_ESC
|
||||
|
||||
|
||||
JP Loop
|
||||
|
||||
.Key_ESC: ; Выход
|
||||
|
||||
DI
|
||||
; Восстановим прерывания и CTC
|
||||
LD A, 057h : OUT (CTC_CH3), A
|
||||
LD A, 160 : OUT (CTC_CH3), A
|
||||
|
||||
; Восстановим SIO
|
||||
LD A, 1 : OUT (SIO_CONTROL_A), A
|
||||
LD A, 0 : OUT (SIO_CONTROL_A), A
|
||||
LD A, 2 : OUT (SIO_CONTROL_B), A
|
||||
LD A, 10h : OUT (SIO_CONTROL_B), A
|
||||
|
||||
.SaveInterrupt+*: LD A, 0
|
||||
LD I, A
|
||||
IM 1
|
||||
EI
|
||||
|
||||
CALL Keyboard.PS2_Clear_Buf
|
||||
|
||||
; Восстанавливаем страницы памяти
|
||||
LD A,(SavePage1)
|
||||
OUT (PAGE_1), A
|
||||
LD A,(SavePage3)
|
||||
OUT (PAGE_3), A
|
||||
|
||||
; Освободим память запрошенную память
|
||||
|
||||
; возвращаем текстовый режим
|
||||
.Current_VMod+*: LD BC, 0
|
||||
LD A, C
|
||||
LD C, DSS.SetVMod
|
||||
RST 10h
|
||||
|
||||
.Exit:
|
||||
.ExitCode+*: LD B, 0
|
||||
LD C, DSS.Exit
|
||||
RST 10h
|
||||
JR $
|
||||
|
||||
UpdateMechanics:
|
||||
LD A, (Keyboard.KeyFlags)
|
||||
OR A
|
||||
RET Z
|
||||
BIT 3, A
|
||||
JR NZ, .Key_UP
|
||||
BIT 2, A
|
||||
JR NZ, .Key_DOWN
|
||||
RET
|
||||
|
||||
.Key_DOWN:
|
||||
; ...
|
||||
.Key_UP:
|
||||
; ...
|
||||
RET
|
||||
|
||||
|
||||
IM2_Empty:
|
||||
EI
|
||||
RETI
|
||||
|
||||
IM2_Keyhandler:
|
||||
PUSH AF, BC, DE, HL
|
||||
EXX
|
||||
EX AF, AF
|
||||
PUSH AF, BC, DE, HL, IX, IY
|
||||
IN A, (SIO_CONTROL_A)
|
||||
BIT 0, A ; 0-bit, байт пришел ?
|
||||
CALL NZ, Keyboard.PS2_Scan ; да, это прерывание от клавиатуры
|
||||
.SkipClearKeyFlags:
|
||||
POP IY, IX, HL, DE, BC, AF
|
||||
EX AF, AF
|
||||
EXX
|
||||
POP HL, DE, BC, AF
|
||||
EI
|
||||
RETI
|
||||
|
||||
IM2_VShandler:
|
||||
PUSH AF, BC, DE, HL
|
||||
EXX
|
||||
EX AF, AF
|
||||
PUSH AF, BC, DE, HL, IX, IY
|
||||
|
||||
.NeedChangePage+*: LD A, 0 ; 1 - нужно переключить экран
|
||||
OR A
|
||||
JR Z, .skip
|
||||
|
||||
.NumberScreen+*: LD B, 0 ; 0/1 - номер экрана, который в данный момент выводится
|
||||
; Переключаем экран
|
||||
IN A, (RGMOD)
|
||||
AND 0feh
|
||||
OR B
|
||||
XOR 1
|
||||
OUT (RGMOD), A
|
||||
AND 1
|
||||
LD (.NumberScreen), A
|
||||
|
||||
XOR A
|
||||
LD (.NeedChangePage), A
|
||||
.skip:
|
||||
CALL UpdateMechanics ; Возможно нужно перенести из прерывания
|
||||
|
||||
; Расчет FPS
|
||||
; ..........
|
||||
|
||||
POP IY, IX, HL, DE, BC, AF
|
||||
EX AF, AF
|
||||
EXX
|
||||
POP HL, DE, BC, AF
|
||||
EI
|
||||
RETI
|
||||
|
||||
; очистка буфера клавиатуры
|
||||
; Портит регистры AF
|
||||
Keyboard.PS2_Clear_Buf:
|
||||
IN a, (SIO_CONTROL_A)
|
||||
BIT 0, a
|
||||
RET Z
|
||||
IN A, (SIO_DATA_REG_A)
|
||||
JR PS2_Clear_Buf
|
||||
|
||||
; Из PS/2 возвращает в Keyboard.KeyFlags нажатые клавиши:
|
||||
; бит кнопка
|
||||
; 0 - RIGHT
|
||||
; 1 - LEFT
|
||||
; 2 - DOWN
|
||||
; 3 - UP
|
||||
; 4 - SPACE
|
||||
; 5 - none
|
||||
; 6 - ENTER
|
||||
; 7 - ESC
|
||||
; Портит регистры AF, BC, DE, HL
|
||||
Keyboard.PS2_Scan:
|
||||
LD HL, .KeyStatus
|
||||
LD DE, 0c686h ; D - код команды SET 0, (HL) / E - код команды RES 0, (HL)
|
||||
.Loop
|
||||
IN a, (SIO_CONTROL_A)
|
||||
BIT 0, a
|
||||
RET Z
|
||||
IN A, (SIO_DATA_REG_A)
|
||||
CP 0E0h
|
||||
JR NZ, .kh1
|
||||
SET 7, (HL) ; // двойной сканкод
|
||||
JR .Loop
|
||||
|
||||
.kh1:
|
||||
CP 0F0h
|
||||
JR NZ, .kh2
|
||||
SET 6, (HL) ; // отпускание клавиши
|
||||
JR .Loop
|
||||
|
||||
.kh2:
|
||||
BIT 7, A ; автоповтор?
|
||||
JR Z, .kh3
|
||||
LD (HL), 0
|
||||
JR .Loop
|
||||
|
||||
.kh3:
|
||||
LD B, 8
|
||||
BIT 6, (HL)
|
||||
LD C, D ; С - код команды SET 0, (HL)
|
||||
JR Z, .KeyPress
|
||||
.KeyRelease:
|
||||
LD C, E ; С - код команды RES 0, (HL)
|
||||
.KeyPress:
|
||||
LD (HL), 0
|
||||
PUSH HL
|
||||
INC HL
|
||||
.KeyPressLoop:
|
||||
CP (HL)
|
||||
JR Z, .SetKey
|
||||
INC HL
|
||||
DJNZ .KeyPressLoop
|
||||
POP HL
|
||||
JR .Loop
|
||||
.SetKey:
|
||||
LD A, B
|
||||
DEC A
|
||||
CPL
|
||||
RLA
|
||||
RLA
|
||||
RLA
|
||||
AND 00111000b
|
||||
OR C
|
||||
LD (.CodeSet + 1), A ; Изменяем команду по .CodeSet
|
||||
POP HL
|
||||
DEC HL
|
||||
.CodeSet: SET 0, (HL)
|
||||
INC HL
|
||||
JR .Loop
|
||||
|
||||
.KeyFlags: DB 0
|
||||
.KeyStatus: DB 0
|
||||
.KeysArray: DB 74h, 6bh, 72h, 75h, 29h, 00h, 5ah, 76h
|
||||
|
||||
Keyboard.KeyFlags: EQU .KeyFlags
|
||||
|
||||
SavePage1: DB 0
|
||||
SavePage3: DB 0
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
|
||||
ORG 0x7e00
|
||||
|
||||
;EXE-file header:
|
||||
DW 5845h ; EXE Signature
|
||||
DB 45h ; Reserved (EXE type)
|
||||
DB 00h ; Version of EXE file
|
||||
DW 0200h ; Code offset
|
||||
DW 0000h
|
||||
DW 0000h ; Primary loader size or 0 (no primary loader)
|
||||
DW 0000h ; Reserved
|
||||
DW 0000h ; Reserved
|
||||
DW 0000h ; Reserved
|
||||
DW start ; Loading address
|
||||
DW start ; Starting address (register PC)
|
||||
DW 0BFFFh ; Stack address (register SP)
|
||||
DS 490 ; Reserved
|
||||
|
||||
;code of program
|
||||
|
||||
start: LD A,81h ;используем режим 320х256
|
||||
LD BC,0050h ;B - номер видео страницы C - функция SETVMOD
|
||||
RST 10h ;установить видео режим
|
||||
JP C,VMError ;если ошибка флаг C установлен
|
||||
|
||||
IN A,(0e2h) ;читаем номер страницы установленной в 3 окно ЦП
|
||||
LD (OldPage),A ;сохраняем в ячейку памяти
|
||||
LD A,50h ;номер страницы видео памяти
|
||||
OUT (0e2h),A ;устанавливаем его в 3 окно ЦП
|
||||
|
||||
LD IX,rndSeed
|
||||
LD BC,0DFBDh
|
||||
LD A,0
|
||||
OUT (C),A
|
||||
getSec: LD BC,0FFBDh
|
||||
IN A,(C)
|
||||
AND A
|
||||
JR Z,getSec
|
||||
SLA A
|
||||
SLA A
|
||||
LD (IX),A
|
||||
|
||||
LD B,0FFh
|
||||
LD HL,buffStars
|
||||
initStLoop1: CALL rndNumber
|
||||
LD (HL),A
|
||||
INC HL
|
||||
DJNZ initStLoop1
|
||||
|
||||
LD IX,buffStars
|
||||
LD IY,scrollSin
|
||||
mainLoop: DI
|
||||
LD A,15
|
||||
LD (color),A
|
||||
CALL printStars
|
||||
|
||||
EI
|
||||
HALT
|
||||
|
||||
XOR A
|
||||
LD (color),A
|
||||
CALL printStars
|
||||
|
||||
CALL scrollStars
|
||||
|
||||
LD A,(IY)
|
||||
AND A
|
||||
CALL Z,initMove
|
||||
LD B,A
|
||||
moveLoop: PUSH BC
|
||||
CALL moveStarsUp
|
||||
initMoveStars: EQU $-2
|
||||
POP BC
|
||||
DJNZ moveLoop
|
||||
|
||||
INC IY
|
||||
|
||||
LD C,31h ; test keypress
|
||||
RST 10h
|
||||
JR Z,mainLoop
|
||||
CP 1Bh ; ESC is pressed?
|
||||
JR NZ,mainLoop
|
||||
|
||||
LD A,(OldPage) ;восстанавливаем предыдущую страницу
|
||||
OUT (0e2h),A ;устанавливаем ее в 3 окно ЦП
|
||||
|
||||
LD A,03h ;текстовый режим
|
||||
LD BC,0050h ;первая страница, функция SETVMOD
|
||||
RST 10h ;устанавливаем
|
||||
|
||||
exit: LD BC,0041h ;функция EXIT корректный выход в DOS
|
||||
RST 10h
|
||||
RET ;вызываем
|
||||
|
||||
VMError: LD HL,ErrMess ;сообщение об ошибки
|
||||
LD BC,005ch ;выводим
|
||||
RST 10h
|
||||
JR exit
|
||||
|
||||
printStars: PUSH IX
|
||||
XOR A
|
||||
LD B,0FFh
|
||||
printStLoop: LD HL,color
|
||||
LD D,0C0h
|
||||
LD E,(IX)
|
||||
OUT (89h),A
|
||||
PUSH BC
|
||||
LDI
|
||||
POP BC
|
||||
INC A
|
||||
INC IX
|
||||
DJNZ printStLoop
|
||||
POP IX
|
||||
RET
|
||||
|
||||
scrollStars: PUSH IX
|
||||
PUSH HL
|
||||
LD B,0FFh/3
|
||||
scrollStLoop: LD HL,initSpeed
|
||||
LD A,(IX)
|
||||
ADD A,(HL)
|
||||
LD (IX),A
|
||||
INC IX
|
||||
INC HL
|
||||
LD A,(IX)
|
||||
ADD A,(HL)
|
||||
LD (IX),A
|
||||
INC IX
|
||||
INC HL
|
||||
LD A,(IX)
|
||||
ADD A,(HL)
|
||||
LD (IX),A
|
||||
INC IX
|
||||
DJNZ scrollStLoop
|
||||
POP HL
|
||||
POP IX
|
||||
RET
|
||||
|
||||
moveStarsUp: LD HL,buffStars+1
|
||||
LD DE,buffStars
|
||||
LD A,(DE)
|
||||
LD BC,0FEh
|
||||
LDIR
|
||||
LD (DE),A
|
||||
|
||||
LD HL,initSpeed+1
|
||||
LD DE,initSpeed
|
||||
LD A,(DE)
|
||||
LD BC,2
|
||||
LDIR
|
||||
LD (DE),A
|
||||
RET
|
||||
|
||||
moveStarsDown: LD HL,buffStars+0FEh
|
||||
LD DE,buffStars+0FFh
|
||||
LD A,(buffStars+0FFh)
|
||||
LD BC,0FFh
|
||||
LDDR
|
||||
LD (buffStars),A
|
||||
|
||||
LD HL,initSpeed+1
|
||||
LD DE,initSpeed+2
|
||||
LD A,(initSpeed+2)
|
||||
LD BC,3
|
||||
LDDR
|
||||
LD (initSpeed),A
|
||||
RET
|
||||
|
||||
initMove: LD A,(flMove)
|
||||
AND A
|
||||
JR Z,moveUp
|
||||
|
||||
LD IY,moveStarsUp
|
||||
XOR A
|
||||
LD (flMove),A
|
||||
LD (initMoveStars),IY
|
||||
JR endInitMove
|
||||
moveUp: LD IY,moveStarsDown
|
||||
LD A,1
|
||||
LD (flMove),A
|
||||
LD (initMoveStars),IY
|
||||
endInitMove: LD IY,scrollSin
|
||||
LD A,(IY)
|
||||
RET
|
||||
|
||||
rndNumber: LD IX,rndSeed
|
||||
LD D,(IX)
|
||||
LD A,(IX+2)
|
||||
LD (IX+3),A
|
||||
LD A,(IX+1)
|
||||
LD (IX+2),A
|
||||
LD (IX+1),D
|
||||
LD A,(IX+3)
|
||||
LD E,A
|
||||
SLA A
|
||||
SLA A
|
||||
SLA A
|
||||
XOR E
|
||||
LD E,A
|
||||
SRL A
|
||||
SRL A
|
||||
SRL A
|
||||
SRL A
|
||||
SRL A
|
||||
XOR E
|
||||
LD E,A
|
||||
SRL D
|
||||
SRL D
|
||||
SRL D
|
||||
SRL D
|
||||
SRL D
|
||||
LD A,D
|
||||
XOR D
|
||||
XOR E
|
||||
LD (IX),A
|
||||
RET
|
||||
|
||||
ErrMess: DB "Error set video mode!",0dh,0ah,00h
|
||||
OldPage: DB 00h
|
||||
color: DB 15
|
||||
initSpeed: DB 1,2,3
|
||||
flMove DB 0
|
||||
rndSeed: DB 18,43,3,73
|
||||
scrollSin: DB 1,1,1,1,1,2,1,2,1,2,2,2,2,3,2,2,3,3,2,3,3,3,3,3,3,3,3,3,3
|
||||
DB 3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,3,2,2,2,2,1,2,1,2,1,1,1,1,1,0
|
||||
buffStars: DS 256
|
||||
Binary file not shown.
@@ -0,0 +1,194 @@
|
||||
;[]=======================================================================[]
|
||||
;
|
||||
; main.z80 -- stub file for TextOut procedures
|
||||
;
|
||||
; Created by Anton Enin 26-June-2002
|
||||
;
|
||||
; Last update 27-June-2002
|
||||
;
|
||||
; Copyright (C) 2002 R-lab
|
||||
;
|
||||
; This program should be compiled using z80asm
|
||||
; http://www.zxasm.narod.ru/
|
||||
;
|
||||
; z80asm.exe -f bin main.z80 -o a_print.exe
|
||||
;
|
||||
;[]=======================================================================[]
|
||||
; Sprinter constans -- see Sprinter docs
|
||||
|
||||
VPAGE equ 0x50 ; video memory page
|
||||
YPORT equ 0x89 ; y pos for write to the vram
|
||||
PAGE0 equ 0x82 ; memory page ports
|
||||
PAGE1 equ 0xA2 ;
|
||||
PAGE2 equ 0xC2 ;
|
||||
PAGE3 equ 0xE2 ;
|
||||
|
||||
struc HeaderStruct ; Estex Exe Header
|
||||
id: resb 3 ; exe file Id (must be 'EXE')
|
||||
version: resb 1 ; exe file version
|
||||
code_offeset: resd 1 ; offset to start code (header size)
|
||||
loader_size: resw 1 ; first loader size
|
||||
reserved1: resw 3 ; reserved
|
||||
start_address: resw 1 ; program org
|
||||
entry_point: resw 1 ; program entry point
|
||||
stack_point: resw 1 ; program stack point
|
||||
reserved2: resb 490 ; reserved
|
||||
endstruc
|
||||
|
||||
FONT_BASE equ 0x8000
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
section .text
|
||||
org 0x7E00
|
||||
|
||||
;[]=======================================================================[]
|
||||
; EXE header
|
||||
|
||||
ExeHeader: istruc HeaderStruct ; initialized structure
|
||||
at id, db 'EXE'
|
||||
at version, db 0
|
||||
at code_offeset, dd CodeStart - ExeHeader
|
||||
at loader_size, dw 0
|
||||
at start_address, dw 0x8000
|
||||
at entry_point, dw EntryPoint
|
||||
at stack_point, dw 0xBFFF
|
||||
iend
|
||||
CodeStart: ; start address is 0x8000
|
||||
;[]=======================================================================[]
|
||||
MyFont: ; characters images
|
||||
incbin "font.raw"
|
||||
|
||||
;[]=======================================================================[]
|
||||
; palette from Flex Navigator
|
||||
CustomPalette:
|
||||
db 0x00, 0x00, 0x00, 0x00 ; Black 00
|
||||
db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01
|
||||
db 0x00, 0x80, 0x00, 0x00 ; Green 02
|
||||
db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03
|
||||
db 0x80, 0x00, 0x00, 0x00 ; Blue 04
|
||||
db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05
|
||||
db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06
|
||||
db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07
|
||||
db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08
|
||||
db 0x80, 0x00, 0x00, 0x00 ; Panel 09
|
||||
db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A
|
||||
db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B
|
||||
db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C
|
||||
db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D
|
||||
db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E
|
||||
db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F
|
||||
|
||||
;[]=======================================================================[]
|
||||
; entry point
|
||||
align 16
|
||||
EntryPoint:
|
||||
call SetVideoMode ; set video mode
|
||||
|
||||
ld hl, TextStr1 ; text string
|
||||
ld de, 0x0020 ; x position
|
||||
ld bc, 0x0000 ; y position
|
||||
ld a, 0x02 ; background color = 0x00
|
||||
; foreground color = 0x02
|
||||
call TextOut
|
||||
|
||||
ld hl, TextStr2 ; text string
|
||||
ld de, 0x0020 ; x position
|
||||
ld bc, 0x0008 ; y position
|
||||
ld a, 0x1F ; background color = 0x01
|
||||
; foreground color = 0x0F
|
||||
call TextOut
|
||||
|
||||
ld c, 0x30 ; wait keypressed
|
||||
rst 0x10
|
||||
|
||||
call ResVideoMode ; restore video mode
|
||||
|
||||
ld bc, 0x0041
|
||||
rst 0x10 ; return to OS
|
||||
|
||||
;[]=======================================================================[]
|
||||
; set requist video mode 640x256x16
|
||||
SetVideoMode:
|
||||
ld c, 0x51 ; save previos vmode
|
||||
rst 0x10
|
||||
ld (vmode + 1), a
|
||||
ld a, b
|
||||
ld (vscrn + 1), a
|
||||
sub a
|
||||
call CrearVideoRam
|
||||
ld bc, 0x0050 ; set 640x256x16
|
||||
ld a, 0x82
|
||||
rst 0x10
|
||||
ld hl, CustomPalette
|
||||
ld de, 0x1000
|
||||
ld bc, 0xFFA4
|
||||
sub a
|
||||
rst 0x08 ; load palette
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; restore previos video mode
|
||||
ResVideoMode:
|
||||
sub a
|
||||
call CrearVideoRam
|
||||
vscrn: ld b, 0x00
|
||||
vmode: ld a, 0x00
|
||||
ld c, 0x50
|
||||
rst 0x10 ; set previos vmode
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; Clear video memory (first screen)
|
||||
; Input:
|
||||
; a - clear color (0-15)
|
||||
CrearVideoRam:
|
||||
and 0x0F
|
||||
ld e, a
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
or e
|
||||
ld e, a
|
||||
in a, (YPORT) ; store modify ports
|
||||
ld c, a
|
||||
in a, (PAGE1)
|
||||
ld b, a
|
||||
push bc
|
||||
ld a, VPAGE
|
||||
out (PAGE1), a
|
||||
ld hl, 0x4000
|
||||
ld bc, 320 ; screen x size in bytes
|
||||
di
|
||||
ld d, d
|
||||
ld a, 0x00 ; set accel lenght to 256 bytes
|
||||
.loop: ld e, e ; fill vertical lines
|
||||
ld (hl), e
|
||||
ld b, b
|
||||
inc hl
|
||||
dec bc
|
||||
ld a, b
|
||||
or c
|
||||
jr nz, .loop
|
||||
ei
|
||||
pop bc
|
||||
ld a, b
|
||||
out (PAGE1), a
|
||||
ld a, c
|
||||
out (YPORT), a ; restore modify ports
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
%include "print.z80"
|
||||
|
||||
;[]=======================================================================[]
|
||||
; some text
|
||||
TextStr1: db 'Color print with acceleration.', 0
|
||||
TextStr2: db 'Written by Enin Anton. (c) Copyright 2002 R-lab', 0
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
CodeEnd:
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
z80asm.exe -f bin main.z80 -o a_print.exe
|
||||
@@ -0,0 +1,180 @@
|
||||
;[]=======================================================================[]
|
||||
;
|
||||
; Draw text string to the screen 640x256 in 16colors
|
||||
; Input:
|
||||
; hl - pointer to the C string (0 - end string)
|
||||
; de - x position
|
||||
; bc - y position
|
||||
; a - background and foreground color
|
||||
; d7 - d4 background color (0-15)
|
||||
; d3 - d0 foreground color (0-15)
|
||||
;
|
||||
; Output:
|
||||
; hl - pointer to the next byte behind string
|
||||
;
|
||||
; Destroy registers:
|
||||
; 'hl, 'de, 'bc
|
||||
|
||||
TextOut:
|
||||
push iy
|
||||
ld yl, c ; y position
|
||||
ld b, a ; store colors
|
||||
in a, (YPORT) ; store Y_PORT
|
||||
push af
|
||||
in a, (PAGE1)
|
||||
ld yh, a ; store PAGE1
|
||||
call PreparePrintColors
|
||||
push de ; x position
|
||||
exx
|
||||
pop bc
|
||||
srl b
|
||||
rr c ; start address for x position
|
||||
set 6, b ; print address start from 0x4000
|
||||
ld hl, BackgroundBuffer ; background buffer
|
||||
ld de, ForegroundBuffer ; foreground buffer
|
||||
exx
|
||||
ld c, l ; pointer to the string
|
||||
ld b, h
|
||||
; now:
|
||||
; bc - pointer to the C string
|
||||
; 'hl - pointer to the background buffer
|
||||
; 'de - pointer to the foreground buffer
|
||||
; 'bc - x position
|
||||
; yl - y position
|
||||
|
||||
di ; disable interrupts
|
||||
ld d, d ; set acceleration work lenght
|
||||
ld a, 0x08
|
||||
ld b, b
|
||||
ld a, (bc) ; test on null string
|
||||
inc bc
|
||||
or a
|
||||
jr z, .exit
|
||||
.loop1:
|
||||
ld l, a ; font is always aligned to 256 bytes
|
||||
ld h, FONT_BASE/256 ; pointer to the specialy font
|
||||
push bc
|
||||
ld b, (hl) ; character size x
|
||||
inc h
|
||||
ld e, (hl)
|
||||
inc h
|
||||
ld a, (hl) ; offset to character image
|
||||
add a, FONT_BASE/256
|
||||
ld d, a
|
||||
ld hl, 0x0008 ; line lenght in character image
|
||||
ex de, hl
|
||||
ld a, VPAGE
|
||||
out (PAGE1), a ; set video memory to 0x4000-0x8000
|
||||
.loop2:
|
||||
ld l, l ; linear load
|
||||
ld a, (hl) ; read 8 bytes to accel memory
|
||||
ld b, b
|
||||
exx
|
||||
ld a, yl
|
||||
out (YPORT), a ; set y position out
|
||||
ld l, l ; linear or
|
||||
or (hl) ; with BackgroundBuffer
|
||||
ld b, b
|
||||
ex de, hl
|
||||
ld l, l ; linear exclusive or
|
||||
xor (hl) ; with ForegroundBuffer
|
||||
ld a, a ; vertical write
|
||||
ld (bc), a ; write 8 bytes from accel memory to vram
|
||||
ld b, b
|
||||
ex de, hl
|
||||
inc bc ; next vertical line in video ram
|
||||
exx
|
||||
add hl, de ; next line in character image
|
||||
djnz .loop2
|
||||
pop bc
|
||||
ld a, yh
|
||||
out (PAGE1), a
|
||||
ld a, (bc)
|
||||
inc bc
|
||||
or a
|
||||
jr nz, .loop1 ; end string ?
|
||||
.exit:
|
||||
ei ; enable interrupts
|
||||
ld l, c ; return pointer to the end string
|
||||
ld h, b
|
||||
pop af
|
||||
out (YPORT), a ; restore YPORT
|
||||
pop iy
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
;
|
||||
; Prepare text colors for accel text out
|
||||
; Input:
|
||||
; b - background and foreground color
|
||||
; d7 - d4 background color (0-15)
|
||||
; d3 - d0 foreground color (0-15)
|
||||
;
|
||||
; Destroy registers:
|
||||
; a, bc, 'hl
|
||||
|
||||
PreparePrintColors:
|
||||
ld a, b
|
||||
.prev_color: cp 0x00 ; color is prepared ?
|
||||
ret z
|
||||
ld (.prev_color + 1), a
|
||||
and 0x0F ; foreground color
|
||||
ld c, a
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
or c
|
||||
exx
|
||||
cpl
|
||||
ld hl, ForegroundBuffer ; foreground buffer
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
exx
|
||||
ld a, b
|
||||
and 0xF0 ; background color
|
||||
ld b, a
|
||||
rrca
|
||||
rrca
|
||||
rrca
|
||||
rrca
|
||||
or b
|
||||
exx
|
||||
xor (hl) ; exclusive or with foreground color
|
||||
ld hl, BackgroundBuffer ; background buffer
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
exx
|
||||
ret
|
||||
|
||||
ForegroundBuffer:
|
||||
times 8 db 0
|
||||
BackgroundBuffer:
|
||||
times 8 db 0
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
The tutorial procedure for colour printing at the graphic screen 640x256x16.
|
||||
|
||||
This procedure was used in the Flex Navigator v1.xx.
|
||||
Written for Estex v1.xx or high.
|
||||
|
||||
Files description:
|
||||
main.z80 - initial(main) file
|
||||
print.z80 - printing procedure
|
||||
|
||||
Font format description:
|
||||
In the font used 256 symbols with height 8 points and various width.
|
||||
|
||||
+000 [256] - width of a symbol on X (for each symbol) (in bytes)
|
||||
+256 [256] - low byte of symbol image offset (for each symbol)
|
||||
+512 [256] - high byte of symbol image offset (for each symbol)
|
||||
+768 ... - images of symbols (from 0 to 255 symbol)
|
||||
images stored as vertical lines, 8 bytes per line, 4 bits per point.
|
||||
number of lines (in bytes) calculate from size of X
|
||||
background colour = 0x00
|
||||
foreground colour = 0x0F
|
||||
|
||||
for instance, image of "A" symbol:
|
||||
width of symbol on X = 4 (bytes)
|
||||
00 00 00 00
|
||||
00 FF FF 00
|
||||
0F 00 00 F0
|
||||
0F 00 00 F0
|
||||
0F FF FF F0
|
||||
0F 00 00 F0
|
||||
0F 00 00 F0
|
||||
00 00 00 00
|
||||
|
||||
In the image of symbol it will stored as:
|
||||
|
||||
00 00 0F 0F 0F 0F 0F 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00 00 F0 F0 F0 F0 F0 00
|
||||
|
||||
Algorithm description:
|
||||
The main problem for the colour printing was fast transformation each point (background/foregraunf) to the necessary colour.
|
||||
Here, I will showed, how I could solve this a "hard" problem. ;) If somebody will think up faster variant, I will be glad to see it. :)
|
||||
|
||||
The printing on the screen realized by vertical lines with the help of accelerator at once till 8 bytes.
|
||||
We require 2 buffers, size in 8 bytes for the colors mixing (background and foreground). Because, to get mixed up we shall be at once till 1 vertical line. These buffers are initialized at each change of colour by function PreparePrintColors (It's made automatically and you don't need about it to care!).
|
||||
|
||||
Using print by function TextOut.
|
||||
|
||||
operation | - Logical Inclusive OR (in Z80 CPU instruction OR)
|
||||
operation ^ - Logical Exclusive OR (in Z80 CPU instruction XOR)
|
||||
|
||||
Function PreparePrintColors:
|
||||
|
||||
1. initialize ForegroundBuffer
|
||||
ForegroundBuffer = Foreground colour ^ 0xFF
|
||||
2. initialize BackgroundBuffer
|
||||
BackgroundBuffer = Background colour ^ ForegroundBuffer
|
||||
|
||||
Function TextOut (input parameters see in the source):
|
||||
actually, a image printing:
|
||||
Screen = (line_of_image | BackgroundBuffer) ^ ForegroundBuffer
|
||||
|
||||
Let's look at a point level:
|
||||
assume the colors for printing Background = 0, Foreground = 1
|
||||
|
||||
then ForegroundBuffer = 1 ^ 0xFF and result 0xFE
|
||||
also BackgroundBuffer = 0 ^ 0xFE and result 0xFE
|
||||
|
||||
for the background colour from a image (=0x00)
|
||||
Screen = (0x00 | 0xFE) ^ 0xFE result 0x00
|
||||
|
||||
for the foreground colour from a image (=0xFF)
|
||||
Screen = (0xFF | 0xFE) ^ 0xFE result 0x01
|
||||
|
||||
It's possible to do for any of colours...
|
||||
|
||||
This algorithm works slower when are printed of very small strings. It occurs because a lot of initialization are required. Also when made often change of colour (Though, I hadn't changing it in the Flex Navigator so often, only for necessary). ;)
|
||||
|
||||
27 june 2002
|
||||
Anton Enin (C) Copyright 2002 R-lab
|
||||
If you have the questions email me: r-lab@mail.ru or ask in the Sprinter's forum.
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
Пример процедур цветной печати на графический экран с разрешением 640x256x16 цветов.
|
||||
Такая процедура использовалась во Flex Navigator v1.xx.
|
||||
Написан под Estex v1.xx и выше.
|
||||
|
||||
Описание файлов:
|
||||
main.z80 - инициализирующий файл
|
||||
print.z80 - процедура печати
|
||||
|
||||
|
||||
Описание формата шрифта:
|
||||
в шрифте используется 256 символов, высотой 8 точек и различной длиной.
|
||||
|
||||
+000 [256] - длина символа по x (для каждого символа) (в байтах)
|
||||
+256 [256] - младший байт смешения на образ символа (для каждого символа)
|
||||
+512 [256] - старший байт смешения на образ символа (для каждого символа)
|
||||
+768 ... - образы символов (от 0 до 255 символа)
|
||||
образы храняться в виде вертикальных линий точек по 8 байт, по 4 бита на точку.
|
||||
кол-во линий (в байтах) определяется из размера по х
|
||||
цвет background = 0x00
|
||||
цвет foreground = 0x0F
|
||||
|
||||
например образ символа А:
|
||||
длина символа по x = 4 (байта)
|
||||
00 00 00 00
|
||||
00 FF FF 00
|
||||
0F 00 00 F0
|
||||
0F 00 00 F0
|
||||
0F FF FF F0
|
||||
0F 00 00 F0
|
||||
0F 00 00 F0
|
||||
00 00 00 00
|
||||
|
||||
в образе символа он будет лежать так:
|
||||
|
||||
00 00 0F 0F 0F 0F 0F 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00 00 F0 F0 F0 F0 F0 00
|
||||
|
||||
|
||||
|
||||
Описание алгоритма:
|
||||
Самая главная проблема цветной печати это быстрое преоброзование точки фона/символа в нужный цвет.
|
||||
Здесь показано, как я вышел из этого "нелегкого" положения ;) Если кто-нибудь придумает более быстрый
|
||||
вариант, то я буду рад его увидеть :)
|
||||
|
||||
Печать на экран осуществляется вертикальными линиями с испольэованием акселератора сразу по 8 байт.
|
||||
Для замешивания цветов нам требуется 2 буфера (цвет background и foreground) размером в 8 байт, т.к.
|
||||
замешивать будем сразу по 1 вертикальной линии. Эти 2 буфера инициализируются заново при каждой смене
|
||||
цвета функцией PreparePrintColors (это делается автоматически, вам не нужно об этом заботиться!).
|
||||
Печатаем функцией TextOut.
|
||||
|
||||
операция | - поразрядное логическое ИЛИ (на Z80 CPU команда or)
|
||||
операция ^ - поразрядное исключение ИЛИ (на Z80 CPU команда xor)
|
||||
|
||||
Функция PreparePrintColors:
|
||||
1. инициализируем ForegroundBuffer
|
||||
ForegroundBuffer = цвет Foreground ^ 0xFF
|
||||
2. инициализируем BackgroundBuffer
|
||||
BackgroundBuffer = цвет Background ^ ForegroundBuffer
|
||||
|
||||
Функция TextOut (входные параметры см. в исходнике):
|
||||
непосредственно печать образа:
|
||||
Screen = (линия_образа | BackgroundBuffer) ^ ForegroundBuffer
|
||||
|
||||
Рассмотрим это на уровне точки:
|
||||
цвет печати допустим Background = 0, Foreground = 1
|
||||
|
||||
получаем ForegroundBuffer = 1 ^ 0xFF получаем 0xFE
|
||||
получаем BackgroundBuffer = 0 ^ 0xFE получаем 0xFE
|
||||
|
||||
для цвета background из образа (=0x00)
|
||||
Screen = (0x00 | 0xFE) ^ 0xFE получаем 0x00
|
||||
|
||||
для цвета foreground из образа (=0xFF)
|
||||
Screen = (0xFF | 0xFE) ^ 0xFE получаем 0x01
|
||||
|
||||
можно всё это проделать для любого из цветов...
|
||||
|
||||
Этот алгоритм работает медленнее при печати очень маленьких строк, из-за большой инициализации, а также из-за
|
||||
частой смены цвета (хотя я во Flex Navigato'e его часто не менял, только по надобности). ;)
|
||||
|
||||
27 june 2002
|
||||
Anton Enin (C) Copyright 2002 R-lab
|
||||
если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме.
|
||||
@@ -0,0 +1,89 @@
|
||||
;[]=====================================[]
|
||||
; ‚뢮¤ ¢ ¤¥áïâ¨ç®¬ ä®à¬ ⥠(32-bit)
|
||||
; ¢ ¡ãä¥à áâப¨ (ॣ."de")
|
||||
; ¢å®¤:
|
||||
; hl = áâ.à §àï¤, hl'= ¬«.à §àï¤
|
||||
; de = ¡ãä¥à áâப¨
|
||||
IntToChar32:
|
||||
exx
|
||||
ld bc,0CA00h ; 1.000.000.000
|
||||
exx
|
||||
ld bc,3B9Ah
|
||||
exx
|
||||
ld ix,tmp1
|
||||
res 7,(ix+0)
|
||||
call GetLen32
|
||||
ld bc,0E100h ; 100.000.000
|
||||
exx
|
||||
ld bc,05F5h
|
||||
exx
|
||||
call GetLen32
|
||||
ld bc,9680h ; 10.000.000
|
||||
exx
|
||||
ld bc,98h
|
||||
exx
|
||||
call GetLen32
|
||||
ld bc,4240h ; 1.000.000...9.999.999
|
||||
exx
|
||||
ld bc,0Fh
|
||||
exx
|
||||
call GetLen32
|
||||
ld bc,86A0h ; 100.000...999.999
|
||||
exx
|
||||
ld bc,1
|
||||
exx
|
||||
call GetLen32
|
||||
; ¢ë¢®¤ 16-bit (hl'= 0)
|
||||
IntToChar16:
|
||||
ld bc,10000 ; 10.000...99.999
|
||||
exx
|
||||
ld bc,0
|
||||
exx
|
||||
call GetLen32
|
||||
ld bc,1000 ; 1.000..9.999
|
||||
call GetLen16
|
||||
DigitToChar:
|
||||
ld bc,100 ; 100..999
|
||||
call GetLen16
|
||||
ld bc,10 ; 10..99
|
||||
call GetLen16
|
||||
ld a,l
|
||||
add a,"0"
|
||||
ld (de),a
|
||||
ret
|
||||
|
||||
tmp1: db 0
|
||||
|
||||
GetLen32:
|
||||
ld a,2Fh
|
||||
or a
|
||||
glen32_loc1:
|
||||
inc a
|
||||
sbc hl,bc
|
||||
exx
|
||||
sbc hl,bc
|
||||
exx
|
||||
jr nc,glen32_loc1
|
||||
add hl,bc
|
||||
exx
|
||||
adc hl,bc
|
||||
exx
|
||||
glen32: cp "0"
|
||||
jr z,glen32_loc2
|
||||
set 7,(ix+0)
|
||||
glen32_loc2:
|
||||
bit 7,(ix+0)
|
||||
ret z
|
||||
ld (de),a
|
||||
inc de
|
||||
ret
|
||||
|
||||
GetLen16:
|
||||
ld a,2Fh
|
||||
or a
|
||||
glen16_loc1:
|
||||
inc a
|
||||
sbc hl,bc
|
||||
jr nc,glen16_loc1
|
||||
add hl,bc
|
||||
jr glen32
|
||||
Executable
+295
@@ -0,0 +1,295 @@
|
||||
DEVICE ZXSPECTRUM128
|
||||
Start_addr = 0x4200
|
||||
|
||||
use_emulator = 1
|
||||
|
||||
include "../../include/estex_h.asm"
|
||||
include "../../include/head_short2.inc"
|
||||
include "../../include/macro.s"
|
||||
|
||||
Counter = 0xfe5b
|
||||
|
||||
|
||||
LoaderStart:
|
||||
main: di
|
||||
ld sp,stack_buff
|
||||
jp begin
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
init0: SYS ESTEX_getvmode ;ïîëó÷èòü òåêóùèé ðåæèì ýêðàíà
|
||||
ld (vmode.mode),a ;ñîõðàíèòü ðåæèì
|
||||
ex af,af
|
||||
ld a,b
|
||||
ld (vmode.screen),a ;è ñòðàíèöó (ýêðàí) ðåæèìà
|
||||
ex af,af
|
||||
ld b,_VMODE._T80 ;òåêñòîâûé ðåæèì 80 ñèì.â ñòðîêå
|
||||
cp b ;òåêóùèé ðåæèì ñîâïàäàåò?
|
||||
; jr z,.next_init0 ;äà
|
||||
ret z
|
||||
ld a,b
|
||||
ld b,1 ;èíà÷å
|
||||
ld c,ESTEX_setvmode ;óñòàíîâèòü åãî
|
||||
rst 0x10
|
||||
ret
|
||||
|
||||
|
||||
WaitMsCallibration:
|
||||
di
|
||||
ld a,WaitMS_IntVector
|
||||
ld i,a
|
||||
im 2
|
||||
ei
|
||||
halt
|
||||
call WaitMS_LockCounter
|
||||
di
|
||||
im 1
|
||||
ld de,(WaitMS_LockHL)
|
||||
ld hl,20
|
||||
call WaitMS_DIV_DE_HL
|
||||
ld l,e
|
||||
ld h,d
|
||||
call WaitMS_NOT_HL
|
||||
ld (walcx0+1),hl
|
||||
ret
|
||||
|
||||
|
||||
;HL=-HL
|
||||
WaitMS_NOT_HL: ld a,l
|
||||
cpl
|
||||
ld l,a
|
||||
ld a,h
|
||||
cpl
|
||||
ld h,a
|
||||
inc hl
|
||||
ret
|
||||
|
||||
;DE = DE/HL
|
||||
WaitMS_DIV_DE_HL:
|
||||
push hl
|
||||
call WaitMS_NOT_HL
|
||||
ld c,l
|
||||
ld b,h
|
||||
ld hl,0
|
||||
ld a,e
|
||||
add a,a
|
||||
rl d
|
||||
call wmdi08
|
||||
call wmdi08
|
||||
ld e,a
|
||||
pop bc
|
||||
srl b
|
||||
rr c
|
||||
or a
|
||||
sbc hl,bc
|
||||
ret c
|
||||
inc de
|
||||
ret
|
||||
|
||||
wmdi08: call wmdi04
|
||||
wmdi04: call wmdi02
|
||||
wmdi02: call wmdi01
|
||||
wmdi01: adc hl,hl
|
||||
add hl,bc
|
||||
jr c,$+4
|
||||
sbc hl,bc
|
||||
rla
|
||||
rl d
|
||||
ret
|
||||
|
||||
|
||||
;One MS Delay
|
||||
WaitMS_LockCounter:
|
||||
push hl
|
||||
walcx0: ld hl,Counter
|
||||
walcx1: inc hl ;6 = 26
|
||||
ld a,l ;4
|
||||
or h ;4
|
||||
jr nz,walcx1 ;12.7
|
||||
pop hl
|
||||
ret
|
||||
|
||||
|
||||
;HL = Milliseconds Number
|
||||
DelayMS:
|
||||
DEMSCx1: ld a,l
|
||||
or h
|
||||
ret z
|
||||
push hl
|
||||
call WaitMS_LockCounter
|
||||
pop hl
|
||||
dec hl
|
||||
jr DEMSCx1
|
||||
|
||||
|
||||
SysPrint: ld a,(hl)
|
||||
inc hl
|
||||
or a
|
||||
ret z
|
||||
push hl
|
||||
call SysPrintChar
|
||||
pop hl
|
||||
jr SysPrint
|
||||
|
||||
SysPrintChar: push bc
|
||||
ld c,0x5b ; print char
|
||||
rst 0x10
|
||||
pop bc
|
||||
ret
|
||||
|
||||
|
||||
; IN:HL=VALUE
|
||||
SysPrintDEC: LD C,255
|
||||
LD DE,10000
|
||||
CALL SYPDCx0
|
||||
LD DE,1000
|
||||
CALL SYPDCx0
|
||||
LD DE,100
|
||||
CALL SYPDCx0
|
||||
LD DE,10
|
||||
CALL SYPDCx0
|
||||
LD A,L
|
||||
JR SYPDCx2
|
||||
SYPDCx0: XOR A
|
||||
DEC A
|
||||
SYPDCx1: INC A
|
||||
SBC HL,DE
|
||||
JR NC,SYPDCx1
|
||||
ADD HL,DE
|
||||
INC C
|
||||
JR NZ,SYPDCx2
|
||||
DEC C
|
||||
OR A
|
||||
RET Z
|
||||
SYPDCx2: INC C
|
||||
ADD A,48
|
||||
PUSH HL
|
||||
push DE
|
||||
push BC
|
||||
CALL SysPrintChar
|
||||
POP BC
|
||||
pop DE
|
||||
pop HL
|
||||
RET
|
||||
|
||||
SysPrint0D0A: LD A,10
|
||||
LD C,05BH ; Print Char
|
||||
RST 16
|
||||
LD A,13
|
||||
LD C,05BH ; Print Char
|
||||
RST 16
|
||||
RET
|
||||
;-------------------------------------------------------------------------------
|
||||
;errors handles
|
||||
quit: ld b,0
|
||||
.err: ld c,0x41
|
||||
rst 0x10
|
||||
jr $
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
begin: call init0
|
||||
|
||||
ld hl,SomeText
|
||||
call SysPrint
|
||||
|
||||
; CALL WaitMsCallibration
|
||||
|
||||
; ld hl,(walcx0+1)
|
||||
; call SysPrintDEC
|
||||
|
||||
ld bc,(10000/250)*256
|
||||
lomx1: push bc
|
||||
ld a,c
|
||||
and 3
|
||||
jr nz,lomx4
|
||||
ld a,b
|
||||
rra
|
||||
rrca
|
||||
dec a
|
||||
ld l,a
|
||||
ld h,0
|
||||
call SysPrintDEC
|
||||
ld a,' '
|
||||
call SysPrintChar
|
||||
lomx4: ld hl,250
|
||||
call SysPrintDEC
|
||||
ld hl,TextMS
|
||||
call SysPrint
|
||||
pop hl
|
||||
push hl
|
||||
ld h,0
|
||||
ld a,l
|
||||
and 3
|
||||
ld l,a
|
||||
call SysPrintDEC
|
||||
ld a,'.'
|
||||
call SysPrintChar
|
||||
ld hl,250
|
||||
call DelayMS
|
||||
pop bc
|
||||
inc c
|
||||
push bc
|
||||
ld a,c
|
||||
and 3
|
||||
ld a,' '
|
||||
ld hl,SysPrintChar
|
||||
jr nz,lomx2
|
||||
ld hl,SysPrint0D0A
|
||||
lomx2: ld (lomx3+1),hl
|
||||
lomx3: call SysPrintChar
|
||||
pop bc
|
||||
djnz lomx1
|
||||
|
||||
|
||||
ld a,(vmode.mode)
|
||||
cp _VMODE._T80
|
||||
jr z,.exit
|
||||
|
||||
ld a,(vmode.screen)
|
||||
ld b,a
|
||||
ld a,(vmode.mode)
|
||||
SYS ESTEX_setvmode
|
||||
.exit ld bc,0x0041
|
||||
rst 0x10
|
||||
jr $
|
||||
|
||||
;Interrupt For Callibration Delay
|
||||
align 256
|
||||
WaitMS_IntVector = $/256-1
|
||||
org $-1
|
||||
dw WaitMS_IntCallibration
|
||||
|
||||
WaitMS_LockHL dw 0
|
||||
WaitMS_IntCallibration:
|
||||
ld (WaitMS_LockHL),hl
|
||||
ld hl,65535
|
||||
ei
|
||||
ret
|
||||
|
||||
|
||||
;===============================================================================
|
||||
vmode:
|
||||
.mode: db 0
|
||||
.screen: db 0
|
||||
|
||||
align 256
|
||||
str_buff: ds 256
|
||||
|
||||
stack_buff = $+255
|
||||
stack_buff_size = 256
|
||||
|
||||
;===============================================================================
|
||||
|
||||
SomeText: db "Test For Wait Milliseconds ...",cr,lf,0
|
||||
TextMS: db "ms.",0
|
||||
|
||||
;===============================================================================
|
||||
|
||||
|
||||
Loader_End:
|
||||
|
||||
display "Loader start: ", LoaderStart
|
||||
display "Loader end: ", Loader_End
|
||||
display "Loader size: ", Loader_End-LoaderStart
|
||||
savebin "delayms.exe",EXEHeader,$-EXEHeader
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,521 @@
|
||||
;Part 2. Graphic samples. Subprograms of low level.
|
||||
|
||||
;Print string (text line) at the screen
|
||||
;IY- addr. of the text line
|
||||
;HL-x
|
||||
;b-y,c- colour
|
||||
pline
|
||||
ld (plinex),hl
|
||||
ld a,c
|
||||
cp #ff
|
||||
jr z,pline
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
or c
|
||||
ld (printcol),a
|
||||
pline1
|
||||
ld a,(IY)
|
||||
cp 0
|
||||
ret z
|
||||
cp #16
|
||||
jp z,plinecoor
|
||||
cp #0d
|
||||
jp z,pline_cr
|
||||
cp #0A
|
||||
jp z,pline_lf
|
||||
cp #17
|
||||
jp z,pline_tab
|
||||
call print
|
||||
inc hl
|
||||
inc hl
|
||||
inc hl
|
||||
inc hl
|
||||
|
||||
inc IY
|
||||
jp pline1
|
||||
|
||||
|
||||
|
||||
|
||||
pline_tab
|
||||
push bc
|
||||
ld b,24
|
||||
pline_tab1
|
||||
inc hl
|
||||
djnz pline_tab1
|
||||
pop bc
|
||||
jp pline1
|
||||
|
||||
pline_lf
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
|
||||
inc IY
|
||||
jp pline1
|
||||
|
||||
pline_cr
|
||||
ld hl,(plinex)
|
||||
inc IY
|
||||
jp pline1
|
||||
|
||||
plinecoor
|
||||
inc IY
|
||||
ld a,(IY)
|
||||
ld b,a
|
||||
ld a,(IY+1)
|
||||
ld l,a
|
||||
ld a,(IY+2)
|
||||
ld h,a
|
||||
inc IY
|
||||
inc IY
|
||||
inc IY
|
||||
jp pline1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
plinex defw 0
|
||||
|
||||
|
||||
|
||||
print_tab
|
||||
;Print to symbol positions
|
||||
;B-y. C - x
|
||||
;A - symbol
|
||||
;Colour - last
|
||||
|
||||
push af
|
||||
push bc
|
||||
ld b,c
|
||||
ld hl,0
|
||||
ld de,6
|
||||
print_tab1
|
||||
add hl,de
|
||||
djnz pline_tab1
|
||||
pop bc
|
||||
ld c,#ff
|
||||
pop af
|
||||
jp print
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;Print to the screen (Pixels coordinates).
|
||||
;6x8 pixels
|
||||
print
|
||||
;HL-x
|
||||
;B-y
|
||||
;C-colour, #FF - no change
|
||||
;A-symbol
|
||||
|
||||
push ix
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
ld ix,printchar
|
||||
ld (ix),a
|
||||
srl h
|
||||
rr l
|
||||
ld (ix+1),l
|
||||
ld (ix+2),h
|
||||
ld (ix+3),b
|
||||
bit 7,c
|
||||
call z,prncolor_change
|
||||
call open_video_mem
|
||||
ld a,(ix)
|
||||
ld h,0
|
||||
ld l,a
|
||||
add hl,hl
|
||||
add hl,hl
|
||||
add hl,hl
|
||||
ex de,hl
|
||||
ld hl,font
|
||||
add hl,de
|
||||
ld (ix+4),l
|
||||
ld (ix+5),h
|
||||
; Loop of 8 pixels at the screen
|
||||
ld a,8
|
||||
print_lines
|
||||
push af
|
||||
ld d,(ix+2)
|
||||
ld e,(ix+1)
|
||||
ld hl,#4000
|
||||
add hl,de
|
||||
ld (pcuradr),hl
|
||||
ld (pcuradr1),hl
|
||||
ld a,(ix+3)
|
||||
out (port_y),a
|
||||
ld l,(ix+4)
|
||||
ld h,(ix+5)
|
||||
ld a,(hl)
|
||||
ld c,a
|
||||
ld a,3
|
||||
print_point
|
||||
push af
|
||||
ld hl,(pcuradr1)
|
||||
ld a,(hl)
|
||||
sla c
|
||||
jr nc,ppoint1
|
||||
and %00001111
|
||||
ld b,(ix+6)
|
||||
push af
|
||||
ld a,b
|
||||
and %11110000
|
||||
ld b,a
|
||||
pop af
|
||||
or b
|
||||
ppoint1
|
||||
sla c
|
||||
jr nc,ppoint2
|
||||
and %11110000
|
||||
ld b,(ix+6)
|
||||
push af
|
||||
ld a,b
|
||||
and %00001111
|
||||
ld b,a
|
||||
pop af
|
||||
or b
|
||||
ppoint2
|
||||
ld (hl),a
|
||||
inc hl
|
||||
ld (pcuradr1),hl
|
||||
pop af
|
||||
dec a
|
||||
jp nz,print_point
|
||||
ld a,(ix+3)
|
||||
inc a
|
||||
ld (ix+3),a
|
||||
ld h,(ix+5)
|
||||
ld l,(ix+4)
|
||||
inc hl
|
||||
ld (ix+5),h
|
||||
ld (ix+4),l
|
||||
ld hl,(pcuradr)
|
||||
ld (pcuradr1),hl
|
||||
pop af
|
||||
dec a
|
||||
jp nz,print_lines
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
pop ix
|
||||
|
||||
ret
|
||||
|
||||
prncolor_change
|
||||
ld a,c
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
or c
|
||||
ld (ix+6),a
|
||||
ret
|
||||
|
||||
|
||||
|
||||
pcuradr defw 0
|
||||
pcuradr1 defw 0
|
||||
printchar defb 0
|
||||
printx defw 0
|
||||
printy defb 0
|
||||
printfnt defw 0
|
||||
printcol defb 0
|
||||
|
||||
|
||||
|
||||
|
||||
;Paint the point (dot).
|
||||
set_point
|
||||
;HL-x D-y, E-colour
|
||||
|
||||
push hl
|
||||
push de
|
||||
|
||||
push de
|
||||
ld a,e
|
||||
sla e
|
||||
sla e
|
||||
sla e
|
||||
sla e
|
||||
or e
|
||||
ld (modcolor),a
|
||||
pop de
|
||||
ld a,d
|
||||
ld (pointy),a
|
||||
push hl
|
||||
srl h
|
||||
rr l
|
||||
ld (movex),hl
|
||||
pop hl
|
||||
bit 0,l
|
||||
jp z,set_point_p
|
||||
jp set_point_np
|
||||
set_point_p
|
||||
ld a,%11110000
|
||||
ld (set_point_cm),a
|
||||
xor #ff
|
||||
ld (set_point_sm),a
|
||||
jp set_point_put
|
||||
|
||||
|
||||
set_point_np
|
||||
ld a,%00001111
|
||||
ld (set_point_cm),a
|
||||
xor #ff
|
||||
ld (set_point_sm),a
|
||||
jp set_point_put
|
||||
|
||||
|
||||
|
||||
set_point_put
|
||||
|
||||
call open_video_mem
|
||||
ld a,(pointy)
|
||||
out (port_y),a
|
||||
ld hl,(movex)
|
||||
ld d,h
|
||||
ld e,l
|
||||
ld hl,#4000
|
||||
add hl,de
|
||||
ld a,(hl)
|
||||
and 0
|
||||
set_point_sm equ $-1
|
||||
ld e,a
|
||||
ld a,(modcolor)
|
||||
and 0
|
||||
set_point_cm equ $-1
|
||||
or e
|
||||
ld (hl),a
|
||||
call close_video_mem
|
||||
pop de
|
||||
pop hl
|
||||
|
||||
ret
|
||||
|
||||
modcolor defb 0
|
||||
pointy defb 0
|
||||
movex defw 0
|
||||
|
||||
;Paint horizontal line
|
||||
horline
|
||||
call open_video_mem
|
||||
|
||||
push de
|
||||
ld d,h
|
||||
ld e,l
|
||||
ld hl,#4000
|
||||
srl d
|
||||
rr e
|
||||
add hl,de
|
||||
pop de
|
||||
ld a,d
|
||||
out (port_y),a
|
||||
ld a,e
|
||||
sla a
|
||||
sla a
|
||||
sla a
|
||||
sla a
|
||||
or e
|
||||
ld (hl),a
|
||||
ld d,h
|
||||
ld e,l
|
||||
inc de
|
||||
srl b
|
||||
rr c
|
||||
ldir
|
||||
|
||||
call close_video_mem
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
verline
|
||||
;HL-x, D-y, E-colour, B-length
|
||||
call set_point
|
||||
inc d
|
||||
djnz verline
|
||||
ret
|
||||
|
||||
|
||||
box
|
||||
;HL-x,D-y,E-colour, BC-length, A-height
|
||||
push af
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
call horline
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
pop af
|
||||
push af
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
add a,d
|
||||
ld d,a
|
||||
call horline
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
pop af
|
||||
push af
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
ld b,a
|
||||
call verline
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
pop af
|
||||
add hl,bc
|
||||
ld b,a
|
||||
call verline
|
||||
ret
|
||||
|
||||
|
||||
|
||||
fbox
|
||||
;HL-x,D-y,E-colour, BC-length, A-height
|
||||
push ix
|
||||
call open_video_mem
|
||||
ld ix,box_x
|
||||
;Loading of variables
|
||||
res 0,c
|
||||
srl b
|
||||
rr c
|
||||
ld (ix+3),c
|
||||
ld (ix+4),b
|
||||
res 0,l
|
||||
srl h
|
||||
rr l
|
||||
ld (ix+1),h
|
||||
ld (ix),l
|
||||
ld (ix+2),d
|
||||
ld (ix+5),a
|
||||
ld a,e
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
or e
|
||||
ld (ix+6),a
|
||||
|
||||
fbox1
|
||||
ld a,(ix+2)
|
||||
out (port_y),a
|
||||
inc a
|
||||
ld (ix+2),a
|
||||
ld d,(ix+1)
|
||||
ld e,(ix)
|
||||
ld hl,#4000
|
||||
add hl,de
|
||||
ld d,h
|
||||
ld e,l
|
||||
inc de
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
ld a,(ix+6)
|
||||
ld (hl),a
|
||||
ldir
|
||||
ld a,(ix+5)
|
||||
dec a
|
||||
jr z,fbox2
|
||||
ld (ix+5),a
|
||||
jp fbox1
|
||||
fbox2
|
||||
pop ix
|
||||
call close_video_mem
|
||||
ret
|
||||
|
||||
box_x defw 0 ;+0 +1
|
||||
box_y defb 0 ;+2
|
||||
box_l defw 0 ;+3 +4
|
||||
box_h defb 0 ;+5
|
||||
box_c defb 0 ;+6
|
||||
|
||||
|
||||
putspr
|
||||
;HL-x, D-y, E-empty, BC-length, A - height, iy - address
|
||||
call open_video_mem1
|
||||
ld (spr_adr),iy
|
||||
ld iy,spr_cox
|
||||
srl h
|
||||
rr l
|
||||
ld (iy),l
|
||||
ld (iy+1),h
|
||||
srl b
|
||||
rr c
|
||||
ld (iy+4),b
|
||||
ld (iy+3),c
|
||||
ld (iy+2),d
|
||||
ld (iy+5),a
|
||||
|
||||
putspr1
|
||||
ld a,(iy+2)
|
||||
out (port_y),a
|
||||
ld d,(iy+1)
|
||||
ld hl,#4000
|
||||
ld d,(iy+1)
|
||||
ld e,(iy)
|
||||
add hl,de
|
||||
ld d,h
|
||||
ld e,l
|
||||
ld hl,(spr_adr)
|
||||
ld b,(iy+4)
|
||||
ld c,(iy+3)
|
||||
|
||||
ldir
|
||||
ld (spr_adr),hl
|
||||
ld a,(spr_hei)
|
||||
dec a
|
||||
ret z
|
||||
ld (spr_hei),a
|
||||
ld a,(iy+2)
|
||||
inc a
|
||||
ld (iy+2),a
|
||||
jp putspr1
|
||||
call close_video_mem
|
||||
ret
|
||||
|
||||
|
||||
|
||||
spr_cox defw 0 ;+0 +1
|
||||
spr_coy defb 0 ;+2
|
||||
spr_len defw 0 ;+3 +4
|
||||
spr_hei defb 0 ;+5
|
||||
spr_adr defw 0 ;+6 +7
|
||||
|
||||
|
||||
|
||||
getspr
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
Sources of sample text editor for Sprinter computer.
|
||||
Free for usage.
|
||||
|
||||
This is example of programming for the 640x256 graphic mode of Sprinter computer.
|
||||
It need Asm80Win cross-assembler. You will found it in this archive.
|
||||
|
||||
Also, archive include already compiled program 'ed.exe' for Sprinter computer.
|
||||
|
||||
Compiling your variant of editor.
|
||||
Create directory 'C:\speccy\aedit\' and put archive contents in it.
|
||||
Execute Asm80Win.exe and input name of 'editor.a80' file.
|
||||
Then rename 'editor.bin' file to 'editor.exe' file and execute this new program on Sprinter computer.
|
||||
|
||||
If you have any questions, ask us at the webforum: www.forum.petersplus.ru
|
||||
|
||||
|
||||
---
|
||||
Sprinter Team.
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
;Subprograms
|
||||
|
||||
set_vmode
|
||||
ld a,#82
|
||||
ld bc,#50
|
||||
rst #10
|
||||
ret
|
||||
|
||||
|
||||
open_video_mem
|
||||
push af
|
||||
in a,(win1)
|
||||
ld (previous),a
|
||||
ld a,#50
|
||||
out (win1),a
|
||||
pop af
|
||||
ret
|
||||
|
||||
open_video_mem1
|
||||
push af
|
||||
in a,(win1)
|
||||
ld (previous),a
|
||||
ld a,#58
|
||||
out (win1),a
|
||||
pop af
|
||||
ret
|
||||
|
||||
close_video_mem
|
||||
push af
|
||||
ld a,(previous)
|
||||
out (win1),a
|
||||
pop af
|
||||
ret
|
||||
|
||||
|
||||
previous defb 0
|
||||
|
||||
clear_screen
|
||||
ld b,a
|
||||
and %00001111
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
or b
|
||||
ld (clear_color),a
|
||||
in a,(win1)
|
||||
push af
|
||||
ld a,#50
|
||||
out (win1),a
|
||||
ld b,0
|
||||
clear_screen1 push bc
|
||||
ld a,b
|
||||
out (port_y),a
|
||||
ld hl,#4000
|
||||
ld de,#4001
|
||||
ld bc,320
|
||||
ld a,0
|
||||
clear_color equ $-1
|
||||
ld (hl),a
|
||||
ldir
|
||||
pop bc
|
||||
djnz clear_screen1
|
||||
pop af
|
||||
out (win1),a
|
||||
ret
|
||||
|
||||
|
||||
wait_a_key
|
||||
ld c,#30
|
||||
rst #10
|
||||
ret
|
||||
|
||||
wait_q_key
|
||||
ld c,#31
|
||||
rst #10
|
||||
jr z,wait_q_key
|
||||
cp "Q"
|
||||
ret z
|
||||
cp "q"
|
||||
ret z
|
||||
jp wait_q_key
|
||||
|
||||
wait_a_click
|
||||
push af
|
||||
;waitclick1
|
||||
; ld a,(mouse_keys)
|
||||
; bit 0,a
|
||||
; jr z,waitclick1
|
||||
; pop af
|
||||
; ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
setpalette
|
||||
;Set your palette
|
||||
ld hl,palette ;Addr. of palette
|
||||
ld e,0 ;Start colour
|
||||
ld d,16 ;Quantity of colours (16 colours for 640x256 mode)
|
||||
ld b,#ff ;Palette mask
|
||||
ld a,0 ;Palette page
|
||||
ld c,#a4 ;System function
|
||||
rst #8 ;Call BIOS
|
||||
ret
|
||||
palette
|
||||
;b,g,r,0
|
||||
;16 colours of your palette
|
||||
; BBB GGG RRR
|
||||
defb #00,#00,#00,#00 ;0 -Black
|
||||
defb #BF,#00,#00,#00 ;1 -
|
||||
defb #00,#00,#FF,#00 ;2 -Red
|
||||
defb #FF,#00,#FF,#00 ;3 -
|
||||
defb #00,#BF,#00,#00 ;4 -Green
|
||||
defb #DF,#DF,#00,#00 ;5 -
|
||||
defb #00,#FF,#FF,#00 ;6 -
|
||||
defb #FF,#FF,#FF,#00 ;7 -White
|
||||
defb #7F,#7F,#7F,#00 ;8 -
|
||||
defb #BF,#BF,#BF,#00 ;9 -Gray
|
||||
defb #DF,#DF,#DF,#00 ;10-
|
||||
defb #97,#97,#97,#00 ;11-Dark gray
|
||||
defb #00,#00,#00,#00 ;12-
|
||||
defb #00,#00,#00,#00 ;13-
|
||||
defb #00,#00,#00,#00 ;14-
|
||||
defb #00,#00,#00,#00 ;15-
|
||||
|
||||
|
||||
font
|
||||
*B c:\speccy\aedit\6x8.fnt
|
||||
;*B 6x8.fnt
|
||||
|
||||
@@ -0,0 +1,550 @@
|
||||
;Window interface
|
||||
|
||||
|
||||
;Subprograms of high level.
|
||||
|
||||
mblock defb 0 ;# identification of memory block for pages
|
||||
mpage defb 0 ;# current free page
|
||||
opened defb 0 ;Quantity of opened windows
|
||||
numbers defs 10 ;Buffer of numbers of opened windows
|
||||
|
||||
|
||||
win_init
|
||||
ld c,#3d
|
||||
ld b,4
|
||||
rst #10
|
||||
ld (mblock),a
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
windraw
|
||||
;IX-win data
|
||||
;+
|
||||
;0,1 - x
|
||||
;2 - y
|
||||
;3,4 - Dx
|
||||
;5 - Dy
|
||||
;6,7 - Header line address; 0= no header
|
||||
;8 - SetUp, Don't touch it!!!
|
||||
; Bit 7 - Safe back screen
|
||||
; Bit 0 - 4 Number of buttons set for this window.
|
||||
;9,10 - Addr. of buffer of back screen
|
||||
;11 - number of memory block for windows buffer
|
||||
;12 - Number of page in the block (page which include buffer)
|
||||
;13,14 - Addr. of block of objects descriptions
|
||||
|
||||
call hide_cursor
|
||||
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
ld a,(ix+5)
|
||||
call sqrw
|
||||
|
||||
ld h,(ix+7)
|
||||
ld l,(ix+6)
|
||||
ld a,h
|
||||
or l
|
||||
jr z,windraw1
|
||||
push hl
|
||||
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
inc hl
|
||||
inc hl
|
||||
ld d,(ix+2)
|
||||
inc d
|
||||
inc d
|
||||
ld a,10
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
dec bc
|
||||
dec bc
|
||||
dec bc
|
||||
dec bc
|
||||
ld e,1
|
||||
call fbox
|
||||
pop iy
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
inc hl
|
||||
inc hl
|
||||
inc hl
|
||||
ld b,(ix+2)
|
||||
inc b
|
||||
inc b
|
||||
inc b
|
||||
ld c,7
|
||||
call pline
|
||||
|
||||
windraw1
|
||||
;Painting objects
|
||||
ld h,(ix+14)
|
||||
ld l,(ix+13)
|
||||
push ix
|
||||
push hl
|
||||
pop ix
|
||||
call windraw_objects
|
||||
pop ix
|
||||
; call v_mouse
|
||||
call unhide_cursor
|
||||
ret
|
||||
|
||||
|
||||
|
||||
windraw_objects
|
||||
;Loop. Calculating: what is the object?, then send it to the right subprogram
|
||||
;At the last, chack: is it all objects?
|
||||
ld a,(ix+0)
|
||||
cp #FF
|
||||
ret z
|
||||
cp 0
|
||||
jp z,wd_key
|
||||
cp 1
|
||||
jp z,wd_spr ;Sprite
|
||||
cp 2
|
||||
jp z,wd_inline ;Input text line
|
||||
; cp 3
|
||||
; jp z,wd_radio ;Trigger
|
||||
cp 4
|
||||
jp z,wd_flag ;Flag
|
||||
cp 5
|
||||
jp z,wd_grayarea ;Gray place
|
||||
cp 6
|
||||
jp z,wd_txtarea ;White place
|
||||
cp 7
|
||||
jp z,wd_txtline ;Text
|
||||
cp 11
|
||||
jp z,wd_hr ;Hor. line
|
||||
cp 12
|
||||
jp z,wd_vr ;Vert. line
|
||||
|
||||
|
||||
ret
|
||||
|
||||
wd_txtline
|
||||
inc ix
|
||||
ld h,(ix+4)
|
||||
ld l,(ix+3)
|
||||
push hl
|
||||
pop iy
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld b,(ix+2)
|
||||
ld c,0
|
||||
call pline
|
||||
inc ix
|
||||
inc ix
|
||||
; inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
|
||||
wd_flag
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld bc,16
|
||||
ld a,10
|
||||
ld iy,check_box
|
||||
push hl
|
||||
call putspr
|
||||
ld h,(ix+4)
|
||||
ld l,(ix+3)
|
||||
push hl
|
||||
pop iy
|
||||
pop hl
|
||||
ld de,18
|
||||
add hl,de
|
||||
ld b,(ix+2)
|
||||
ld c,0
|
||||
call pline
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
wd_inline
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
dec hl
|
||||
ld d,(ix+2)
|
||||
dec d
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
inc bc
|
||||
inc bc
|
||||
ld a,12
|
||||
call sqrtxt
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
wd_txtarea
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
ld a,(ix+5)
|
||||
call sqrtxt
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
|
||||
|
||||
|
||||
wd_grayarea
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
ld a,(ix+5)
|
||||
call sqrd
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
|
||||
|
||||
;wd_radio
|
||||
; inc ix
|
||||
; ld h,(ix+1)
|
||||
; ld l,(ix+0)
|
||||
; ld d,(ix+2)
|
||||
; ld bc,14
|
||||
; ld a,10
|
||||
; ld iy,radio_button
|
||||
; push hl
|
||||
; call putspr
|
||||
; ld h,(ix+4)
|
||||
; ld l,(ix+3)
|
||||
; push hl
|
||||
; pop iy
|
||||
; pop hl
|
||||
; ld de,18
|
||||
; add hl,de
|
||||
; ld b,(ix+2)
|
||||
; ld c,0
|
||||
; call pline
|
||||
; inc ix
|
||||
; inc ix
|
||||
; inc ix
|
||||
; inc ix
|
||||
; inc ix
|
||||
; jp windraw_objects
|
||||
|
||||
|
||||
|
||||
wd_hr
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
ld e,11
|
||||
call horline
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
inc d
|
||||
ld e,10
|
||||
call horline
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
|
||||
wd_vr
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld a,(ix+3)
|
||||
ld e,11
|
||||
call verline
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld a,(ix+3)
|
||||
inc a
|
||||
ld e,10
|
||||
call verline
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
|
||||
|
||||
wd_key
|
||||
inc ix
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld bc,52
|
||||
ld a,12
|
||||
call sqrw
|
||||
|
||||
ld h,(ix+4)
|
||||
ld l,(ix+3)
|
||||
ld (wd_key3),hl
|
||||
|
||||
ld b,0
|
||||
wd_key1
|
||||
ld a,(hl)
|
||||
or a
|
||||
jp z,wd_key2
|
||||
inc b
|
||||
inc hl
|
||||
jp wd_key1
|
||||
wd_key2
|
||||
ld de,24
|
||||
ld c,b
|
||||
ld b,0
|
||||
sla c
|
||||
rlc b
|
||||
sla c
|
||||
rlc b
|
||||
sla c
|
||||
rlc b
|
||||
|
||||
sub de,bc
|
||||
srl d
|
||||
rr e
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
inc hl
|
||||
inc hl
|
||||
add hl,de
|
||||
ld b,(ix+2)
|
||||
inc b
|
||||
inc b
|
||||
ld c,0
|
||||
ld iy,0
|
||||
wd_key3 equ $-2
|
||||
call pline
|
||||
ld bc,5
|
||||
add ix,bc
|
||||
jp windraw_objects
|
||||
|
||||
wd_spr
|
||||
inc ix
|
||||
ld h,(ix+7)
|
||||
ld l,(ix+6)
|
||||
push hl
|
||||
pop iy
|
||||
ld h,(ix+1)
|
||||
ld l,(ix+0)
|
||||
ld d,(ix+2)
|
||||
ld b,(ix+4)
|
||||
ld c,(ix+3)
|
||||
ld a,(ix+5)
|
||||
call putspr
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
inc ix
|
||||
jp windraw_objects
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wintable
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
defw 0
|
||||
|
||||
|
||||
|
||||
|
||||
sqrw
|
||||
;HL - X
|
||||
;D - Y
|
||||
;BC - DX
|
||||
;A - Dy
|
||||
ld e,9
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
call fbox
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
ld e,8
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
call box
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
dec bc
|
||||
ld e,7
|
||||
call horline
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
ld e,7
|
||||
ld b,a
|
||||
dec b
|
||||
call verline
|
||||
ret
|
||||
|
||||
sqrtxt
|
||||
;HL - X
|
||||
;D - Y
|
||||
;BC - DX
|
||||
;A - Dy
|
||||
ld e,7
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
call fbox
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
ld e,7
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
call box
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
dec bc
|
||||
ld e,11
|
||||
call horline
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
ld e,11
|
||||
ld b,a
|
||||
dec b
|
||||
call verline
|
||||
ret
|
||||
|
||||
|
||||
sqrd
|
||||
;HL - X
|
||||
;D - Y
|
||||
;BC - DX
|
||||
;A - Dy
|
||||
ld e,9
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
call fbox
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
ld e,7
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
call box
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
push hl
|
||||
push de
|
||||
push bc
|
||||
push af
|
||||
ld e,8
|
||||
call horline
|
||||
pop af
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
ld e,8
|
||||
ld b,a
|
||||
call verline
|
||||
ret
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
This program for Sprinter computer!
|
||||
@@ -0,0 +1,447 @@
|
||||
;[]=======================================================================[]
|
||||
;
|
||||
; flames.z80 -- mini demo for Sprinter
|
||||
;
|
||||
; Created by Anton Enin 21-April-1999
|
||||
;
|
||||
; Last update 18-July-2002
|
||||
;
|
||||
; Copyright (C) 2002 R-lab
|
||||
;
|
||||
; This program should be compiled using z80asm
|
||||
; http://www.zxasm.narod.ru/
|
||||
;
|
||||
; z80asm.exe -f bin flames.z80 -o flames.exe
|
||||
;
|
||||
;[]=======================================================================[]
|
||||
; sprinter constants -- see sprinter docs
|
||||
|
||||
VPAGE equ 0x50 ; video memory page
|
||||
YPORT equ 0x89 ; y pos for write to the vram
|
||||
PAGE0 equ 0x82 ; memory page ports
|
||||
PAGE1 equ 0xA2 ;
|
||||
PAGE2 equ 0xC2 ;
|
||||
PAGE3 equ 0xE2 ;
|
||||
|
||||
; os constants -- see os docs
|
||||
|
||||
struc HeaderStruct ; Estex Exe Header
|
||||
id: resb 3 ; exe file Id (must be 'EXE')
|
||||
version: resb 1 ; exe file version
|
||||
code_offeset: resd 1 ; offset to start code (header size)
|
||||
loader_size: resw 1 ; first loader size
|
||||
reserved1: resw 3 ; reserved
|
||||
start_address: resw 1 ; program org
|
||||
entry_point: resw 1 ; program entry point
|
||||
stack_point: resw 1 ; program stack point
|
||||
endstruc
|
||||
|
||||
; my constants -- see ...? :)
|
||||
|
||||
PALETTE_BASE equ 0x8000
|
||||
FLAMES_FRAME1 equ 0x8000
|
||||
FLAMES_FRAME2 equ 0x8800
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
section .text
|
||||
org 0x8FEA
|
||||
|
||||
;[]=======================================================================[]
|
||||
; EXE header
|
||||
|
||||
ExeHeader: istruc HeaderStruct ; initialized structure
|
||||
at id, db 'EXE'
|
||||
at version, db 0
|
||||
at code_offeset, dd CodeStart - ExeHeader
|
||||
at loader_size, dw 0
|
||||
at start_address, dw 0x9000
|
||||
at entry_point, dw EntryPoint
|
||||
at stack_point, dw 0xBFFF
|
||||
iend
|
||||
CodeStart: ; start address is 0x9000
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
EntryPoint: ; org = 0x9000
|
||||
ld hl, HelpString
|
||||
ld c, 0x5C ; print text
|
||||
rst 0x10
|
||||
|
||||
call SetVideoMode
|
||||
call SetPalette
|
||||
call CrearVideoRam
|
||||
|
||||
ld hl, FLAMES_FRAME1 ; clear 2 frame buffer
|
||||
ld de, FLAMES_FRAME1+1
|
||||
ld bc, 0x0FFF
|
||||
ld (hl), l
|
||||
ldir
|
||||
|
||||
in a, (YPORT) ; save inflective ports
|
||||
ld c, a
|
||||
in a, (PAGE1)
|
||||
ld b, a
|
||||
push bc
|
||||
ld a, VPAGE ; set video page to 0x4000-0x7FFF
|
||||
out (PAGE1), a
|
||||
.main_loop:
|
||||
; now scroll frame up to 1 line
|
||||
ld hl, FLAMES_FRAME1+0x40
|
||||
ld de, FLAMES_FRAME1+0x20
|
||||
ld bc, 62*0x20
|
||||
call AccelCopy
|
||||
; now add 4 new random pixel
|
||||
; to the bottom of the flame
|
||||
; hl - last line of frame + 3
|
||||
ex de, hl
|
||||
ld c, 0x06
|
||||
add hl, bc
|
||||
ld b, 0x04
|
||||
.next_pixel:
|
||||
push hl
|
||||
ld a, 24 ; random 0 - 23
|
||||
push hl ; for pixel x position
|
||||
call GetRandom
|
||||
pop hl
|
||||
add a, l
|
||||
ld l, a
|
||||
ld a, 180 ; pixel intensity 0 - 189
|
||||
push hl
|
||||
call GetRandom
|
||||
pop hl
|
||||
ld (hl), a ; pixel size 2x1
|
||||
inc l
|
||||
ld (hl), a
|
||||
pop hl
|
||||
djnz .next_pixel
|
||||
; now blur the frame
|
||||
; this is not optimized code ;)
|
||||
; better blur for each pixel
|
||||
; xxx
|
||||
; xox
|
||||
; x x
|
||||
ld ix, FLAMES_FRAME1+0x20
|
||||
ld de, FLAMES_FRAME2+0x20
|
||||
ld h, b
|
||||
ld yh, 0x3F
|
||||
.blur_line:
|
||||
ld yl, 0x1F
|
||||
inc ix
|
||||
inc de
|
||||
.blur_pixel:
|
||||
ld l, (ix-0x21)
|
||||
ld c, (ix-0x20)
|
||||
add hl, bc
|
||||
ld c, (ix-0x1F)
|
||||
add hl, bc
|
||||
ld c, (ix-0x01)
|
||||
add hl, bc
|
||||
ld c, (ix+0x01)
|
||||
add hl, bc
|
||||
ld c, (ix+0x1F)
|
||||
add hl, bc
|
||||
ld c, (ix+0x21)
|
||||
add hl, bc
|
||||
ld c, (ix+0x21) ; this equal two pixel deflect
|
||||
add hl, bc ; the flame to left
|
||||
ld a, l
|
||||
srl h
|
||||
rra
|
||||
srl h
|
||||
rra
|
||||
srl h
|
||||
rra
|
||||
ld (de), a
|
||||
inc de
|
||||
inc ix
|
||||
dec yl
|
||||
jr nz, .blur_pixel
|
||||
dec yh
|
||||
jr nz, .blur_line
|
||||
|
||||
halt ; v'sync, maybe :)
|
||||
|
||||
; now copy frame to
|
||||
; the vram
|
||||
; 60 lines from top
|
||||
ld hl, FLAMES_FRAME2
|
||||
ld de, 0x4080
|
||||
ld b, 62
|
||||
di
|
||||
ld d, d ; set accel count
|
||||
ld a, 0x20
|
||||
ld b, b
|
||||
|
||||
ld a, b
|
||||
.out_loop:
|
||||
out (YPORT), a
|
||||
ld l, l ; accel copy
|
||||
ld a, (hl)
|
||||
ld (de), a
|
||||
ld b, b
|
||||
ld a, l
|
||||
add a, 0x20
|
||||
ld l, a
|
||||
adc a, h
|
||||
sub l
|
||||
ld h, a ; next line in frame buffer
|
||||
inc b
|
||||
ld a, b ; next y line in vram
|
||||
cp 62+60
|
||||
jr nz, .out_loop
|
||||
ei
|
||||
|
||||
ld hl, FLAMES_FRAME2 ; duplicate frame buffers
|
||||
ld de, FLAMES_FRAME1
|
||||
ld bc, 0x0800
|
||||
call AccelCopy
|
||||
|
||||
ld c, 0x31 ; test keypress
|
||||
rst 0x10
|
||||
jp z, .main_loop
|
||||
sub 0x1B ; ESC is pressed?
|
||||
jp nz, .main_loop
|
||||
|
||||
pop bc
|
||||
ld a, b
|
||||
out (PAGE1), a
|
||||
ld a, c
|
||||
out (YPORT), a ; restore ports
|
||||
|
||||
call CrearVideoRam
|
||||
call ResVideoMode
|
||||
|
||||
ld bc, 0x0041
|
||||
rst 0x10 ; exit to OS...
|
||||
|
||||
|
||||
;[]=======================================================================[]
|
||||
; Simple random numbers generator
|
||||
; Input:
|
||||
; a - random number limit
|
||||
; Output:
|
||||
; a - random number
|
||||
GetRandom:
|
||||
ld c, a
|
||||
.seed: ld de, 0x4664
|
||||
ld h, e
|
||||
ld l, 0xFD
|
||||
ld a, d
|
||||
and a
|
||||
sbc hl, de
|
||||
and a
|
||||
sbc hl, de
|
||||
ld e, a
|
||||
ld d, 0x00
|
||||
and a
|
||||
sbc hl, de
|
||||
jr nc, .next
|
||||
inc hl
|
||||
.next: ld (.seed + 1), hl
|
||||
; now c - limit
|
||||
; l - random 0.0 - 1.0
|
||||
ld e, l
|
||||
ld d, 0x00
|
||||
ld l, d
|
||||
ld h, c ; random * limit = number 8.8
|
||||
%rep 8
|
||||
add hl, hl
|
||||
jr nc, $+3
|
||||
add hl, de
|
||||
%endrep
|
||||
ld a, h ; return rnd (0 < x < limit)
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; set requist video mode 640x256x16
|
||||
SetVideoMode:
|
||||
ld c, 0x51 ; save previos vmode
|
||||
rst 0x10
|
||||
ld (vmode + 1), a
|
||||
ld a, b
|
||||
ld (vscrn + 1), a
|
||||
sub a
|
||||
call CrearVideoRam
|
||||
ld bc, 0x0050 ; set 320x256x256
|
||||
ld a, 0x81
|
||||
rst 0x10
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; restore previos video mode
|
||||
ResVideoMode:
|
||||
sub a
|
||||
call CrearVideoRam
|
||||
vscrn: ld b, 0x00
|
||||
vmode: ld a, 0x00
|
||||
ld c, 0x50
|
||||
rst 0x10 ; set previos vmode
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
SetPalette:
|
||||
ld hl, PALETTE_BASE ; generate palette
|
||||
ld bc, 0x0800
|
||||
.loop1: ld a, 0x10 ; gradien of red color
|
||||
sub b
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
djnz .loop1
|
||||
ld b, 0x10
|
||||
|
||||
.loop2: ld (hl), c ; gradien of yellow color
|
||||
inc hl
|
||||
ld a, 0x10
|
||||
sub b
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), 240
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
djnz .loop2
|
||||
|
||||
ld b, 0x10
|
||||
.loop3: ld a, 0x10 ; gradien of white color
|
||||
sub b
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
add a, a
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), 240
|
||||
inc hl
|
||||
ld (hl), 240
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
djnz .loop3
|
||||
|
||||
ld b, 208
|
||||
ld a, 252
|
||||
InPal4 ld (hl), a ; gradien of :) super white color
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), a
|
||||
inc hl
|
||||
ld (hl), c
|
||||
inc hl
|
||||
djnz InPal4
|
||||
|
||||
ld hl, PALETTE_BASE
|
||||
ld de, 0x0000
|
||||
ld bc, 0xFFA4
|
||||
sub a
|
||||
rst 0x08 ; load palette by BIOS
|
||||
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; Clear video memory (first screen)
|
||||
CrearVideoRam:
|
||||
in a, (YPORT) ; store modify ports
|
||||
ld c, a
|
||||
in a, (PAGE1)
|
||||
ld b, a
|
||||
push bc
|
||||
ld a, VPAGE
|
||||
out (PAGE1), a
|
||||
ld hl, 0x4000
|
||||
ld bc, 320 ; screen x size in bytes
|
||||
ld e, l
|
||||
di
|
||||
ld d, d
|
||||
ld a, 0x00 ; set accel lenght to 256 bytes
|
||||
.loop: ld e, e ; fill vertical lines
|
||||
ld (hl), e
|
||||
ld b, b
|
||||
inc hl
|
||||
dec bc
|
||||
ld a, b
|
||||
or c
|
||||
jr nz, .loop
|
||||
ei
|
||||
pop bc
|
||||
ld a, b
|
||||
out (PAGE1), a
|
||||
ld a, c
|
||||
out (YPORT), a ; restore modify ports
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
; Copy memory with sprinter accel
|
||||
; Input:
|
||||
; hl - from
|
||||
; de - to
|
||||
; bc - size
|
||||
; Output:
|
||||
; hl - hl + size
|
||||
; de - de + size
|
||||
|
||||
AccelCopy:
|
||||
ld a, b
|
||||
or a
|
||||
jr z, .next
|
||||
di
|
||||
ld d, d ; set accel count to 256
|
||||
ld a, 0x00
|
||||
.loop1: ld l, l
|
||||
ld a, (hl)
|
||||
ld (de), a
|
||||
ld b, b
|
||||
inc h
|
||||
inc d
|
||||
djnz .loop1
|
||||
ei
|
||||
.next:
|
||||
ld a, c
|
||||
or a
|
||||
ret z
|
||||
ld (.count + 1), a
|
||||
di
|
||||
ld d, d
|
||||
.count: ld a, 0x00
|
||||
ld l, l
|
||||
ld a, (hl)
|
||||
ld (de), a
|
||||
ld b, b
|
||||
ei
|
||||
ld a, c
|
||||
add a, l
|
||||
ld l, a
|
||||
ld a, h
|
||||
adc a, l
|
||||
sub l
|
||||
ld h, a ; update hl
|
||||
ld a, c
|
||||
add a, e
|
||||
ld e, a
|
||||
ret nc
|
||||
inc d ; update de
|
||||
ret
|
||||
|
||||
;[]=======================================================================[]
|
||||
|
||||
HelpString:
|
||||
db 0x0D, 0x0A
|
||||
db "The Flames! Mini demo for Sprinter.", 0x0D, 0x0A
|
||||
db "Created by Enin Anton.", 0x0D, 0x0A, 0x00
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
;[]=======================================================================[]
|
||||
;
|
||||
; fn_load.z80 -- primary loader of Flex Navigator v1.10
|
||||
;
|
||||
; Copyright (C) 2000 Anton Enin
|
||||
;
|
||||
; This program should be compiled using z80asm
|
||||
; http://www.zxasm.narod.ru/
|
||||
;
|
||||
; z80asm.exe -f bin main.z80 -o a_print.exe
|
||||
;
|
||||
;[]=======================================================================[]
|
||||
|
||||
org 0x80EA
|
||||
section .text
|
||||
|
||||
EXEhead: db "EXE" ; exe header
|
||||
db 0 ; +3
|
||||
dw EntryExec-EXEhead
|
||||
dw 0x0000 ; +4
|
||||
dw EXEend-EntryExec ; +8
|
||||
dw 0, 0 ; +10
|
||||
dw 0 ; +14
|
||||
dw EntryExec ; +16
|
||||
dw EntryExec
|
||||
dw 0x80FF
|
||||
|
||||
;[]=======================================================================[]
|
||||
; input:
|
||||
; IX - pointer from DOS
|
||||
|
||||
EntryExec: DI
|
||||
LD A, (IX-0x03) ; current file handle
|
||||
LD (.hFile), A ; save
|
||||
LD HL, .copyright_str
|
||||
LD C, 0x5C ; print text
|
||||
RST 0x10
|
||||
LD C, 0x00
|
||||
RST 0x10
|
||||
LD A, D
|
||||
OR A
|
||||
JR NZ, .next1
|
||||
LD HL, .incor_dos_str
|
||||
LD C, 0x5C ; print text
|
||||
RST 0x10
|
||||
LD A, (.hFile)
|
||||
LD C, 0x12
|
||||
RST 0x10 ; close current file
|
||||
LD BC, 0xFF41
|
||||
RST 0x10 ; exit
|
||||
.next1
|
||||
LD BC, 0x063D
|
||||
RST 0x10 ; need 6 memory pages
|
||||
JR NC, .next2 ; CY - not enough memory
|
||||
LD HL, .no_memory_str
|
||||
LD C, 0x5C ; print text
|
||||
RST 0x10
|
||||
LD BC, 0xFF41
|
||||
RST 0x10 ; exit
|
||||
.next2
|
||||
LD (.hMem), A ; memory handle
|
||||
LD HL, .Buffer
|
||||
LD C, 0xC5
|
||||
RST 0x08 ; get memory pages list
|
||||
LD A, (.MPg) ; set pages from 0xC000
|
||||
OUT (0xE2), A
|
||||
LD HL, 0x8500 ;FNMAIN
|
||||
LD DE, end1-0x8500
|
||||
LD A, (.hFile)
|
||||
LD C, 0x13
|
||||
RST 0x10
|
||||
JP C, .disk_error
|
||||
LD A, (.FPg)
|
||||
OUT (0xE2), A
|
||||
LD HL, 0xC000 ;FNFUNCT
|
||||
LD DE, end2-0x4000
|
||||
LD A, (.hFile)
|
||||
LD C, 0x13
|
||||
RST 0x10
|
||||
JP C, .disk_error
|
||||
LD A, (.VPg) ;FNVIEW
|
||||
OUT (0xE2), A
|
||||
LD HL, 0xC000
|
||||
LD DE, 0x19A6
|
||||
LD A, (.hFile)
|
||||
LD C, 0x13
|
||||
RST 0x10
|
||||
JP C, .disk_error
|
||||
LD A, (.EPg) ;FNEDIT
|
||||
OUT (0xE2), A
|
||||
LD HL, 0xC000
|
||||
LD DE, 0x273B
|
||||
LD A, (.hFile)
|
||||
LD C, 0x13
|
||||
RST 0x10
|
||||
JP C, .disk_error
|
||||
LD A, (.HPg) ;FNHELP
|
||||
OUT (0xE2), A
|
||||
LD HL, 0xC000
|
||||
LD DE, end3-0x4000
|
||||
LD A, (.hFile)
|
||||
LD C, 0x13
|
||||
RST 0x10
|
||||
JP C, .disk_error
|
||||
LD A, (.FNPg) ;FNFONT
|
||||
OUT (0xE2), A
|
||||
LD HL, 0xC000
|
||||
LD DE, end4-0x4000
|
||||
LD A, (.hFile)
|
||||
LD C, 0x13
|
||||
RST 0x10
|
||||
JP C, .disk_error
|
||||
LD A, (.hFile)
|
||||
LD C, 0x12
|
||||
RST 0x10 ;close current file
|
||||
LD A, (.MPg)
|
||||
OUT (0xE2), A
|
||||
LD A, (.hMem)
|
||||
LD (.FNIndef), A
|
||||
LD HL, .FPg
|
||||
LD DE, .FunctPg
|
||||
LD BC, 0x0005
|
||||
LDIR
|
||||
JP EntryPoint
|
||||
.disk_error:
|
||||
LD A, (.hMem) ; free memory
|
||||
LD C, 0x3E
|
||||
RST 0x10
|
||||
LD A, (.hFile)
|
||||
LD C, 0x12
|
||||
RST 0x10 ; close current file
|
||||
LD HL, .load_err_str
|
||||
LD C, 0x5C ; print text
|
||||
RST 0x10
|
||||
LD BC, 0xFF41
|
||||
RST 10h ; exit
|
||||
|
||||
.hFile db 0x00
|
||||
.hMem db 0x00
|
||||
.Buffer
|
||||
.MPg db 0x00
|
||||
.FPg db 0x00
|
||||
.VPg db 0x00
|
||||
.EPg db 0x00
|
||||
.HPg db 0x00
|
||||
.FNPg db 0x00
|
||||
db 0x00
|
||||
|
||||
.copyright_str: db 0x0D, 0x0A
|
||||
db "The Flex Navigator, ver 1.10, Copyright (C) 1999 by Enin Anton, St-Petersburg.", 0x0D, 0x0A
|
||||
db "All rights reserved.", 0x0D, 0x0A, 0x00
|
||||
.incor_dos_str: db "Incorrect DOS version, need DOS 1.00 or high.", 0x0D, 0x0A, 0x00
|
||||
.no_memory_str: db "Not enough memory to load program.", 0x0D, 0x0A, 0x00
|
||||
.load_err_str: db "Disk loading error.", 0x0D, 0x0A, 0x00
|
||||
|
||||
EXEend:
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,822 @@
|
||||
|
||||
.Z80
|
||||
ASEG
|
||||
.RADIX 10
|
||||
ORG 100H
|
||||
|
||||
DB 'EX'
|
||||
DB 45H ; RESERV
|
||||
DB 0 ; MY VERSION
|
||||
DW 200H,0 ; START CODE IN FILE
|
||||
DW 0 ; LEN START LOAD DATA
|
||||
DW 0,0,0 ; RESERV
|
||||
DW 8100H ; ADRESS IN MEM
|
||||
DW 8100H ; START ADRESS
|
||||
DW 0BFFEH ; STACK ADRESS
|
||||
DS 490
|
||||
|
||||
.PHASE 8100h
|
||||
|
||||
INCLUDE SPRINT00.ASZ
|
||||
|
||||
START:
|
||||
|
||||
DI
|
||||
|
||||
LD A,CNF_0
|
||||
OUT (SYS_PORT_OFF),A
|
||||
|
||||
LD C,0A6h ; ãáâ ®¢ª ¯ «¨âàë
|
||||
LD A,1
|
||||
LD B,1
|
||||
RST 8h
|
||||
|
||||
LD C,0A6h
|
||||
LD A,0
|
||||
LD B,1
|
||||
RST 8h
|
||||
|
||||
LD C,0A6h
|
||||
LD A,2
|
||||
LD B,1
|
||||
RST 8h
|
||||
|
||||
LD C,0A6h
|
||||
LD A,3
|
||||
LD B,1
|
||||
RST 8h
|
||||
|
||||
LD A,CNF_3
|
||||
OUT (SYS_PORT_OFF),A
|
||||
|
||||
LD A,3 ; ãáâ ®¢ª ¢ãâà.¯®à⮢ Z84C15 ¤«ï ¯¥à¥§ £à㧪¨
|
||||
OUT (0EEh),A
|
||||
LD A,3
|
||||
OUT (0EFh),A ; CASH & ROM
|
||||
|
||||
; LD A,(IX+2) ; ä« £ (NOT USE!)
|
||||
; LD (FLAG),A
|
||||
|
||||
IN A,(PAGE1)
|
||||
LD (PG5+1),A
|
||||
|
||||
CALL READ_FROM_FILE ; ç¨â âì ¯à®è¨¢ªã ¨§ ä ©«
|
||||
; ¯ ¬ïâì §¢¥à᪨ ¥ ¢ë¤¥«¥ !
|
||||
; ç⥨¥ ¯àאַ ¢ áâà ¨æë 1C..1F
|
||||
LD DE,RELOAD_RET
|
||||
CALL SET_RETURN ; ãáâ ®¢ª ¤ ëå ¤«ï ¢®§¢à â
|
||||
|
||||
IN A,(0FBh) ; CASH_on
|
||||
|
||||
CALL SET_ACEX_DATA ; ¯¥à¥£à㧪 ¤ ëå ACEX ¢ FAST-RAM
|
||||
|
||||
IN A,(07Bh) ; CASH_off
|
||||
|
||||
PG5: LD A,5 ; ¢®§¢à â áâà ¨æë 1
|
||||
OUT (PAGE1),A
|
||||
|
||||
;************************************************
|
||||
|
||||
RESET:
|
||||
|
||||
DI
|
||||
|
||||
IN A,(PAGE1) ; ®âªàë⨥ ¯®àâ á¡à®á
|
||||
PUSH AF
|
||||
LD A,40h
|
||||
OUT (PAGE1),A ; set DCP page
|
||||
LD A,2Eh
|
||||
LD (04400h),A ; open for WR
|
||||
LD (04600h),A ; open for RD
|
||||
POP AF
|
||||
OUT (PAGE1),A ; Close PAGE1
|
||||
|
||||
RESET_LOOP: ; 横« á¡à®á
|
||||
LD BC,100h
|
||||
OUT (C),C
|
||||
LD BC,000h
|
||||
OUT (C),C
|
||||
JR RESET_LOOP ; ¯®«®áâìî § 横«¨âì!
|
||||
|
||||
DI ; ¯ë«¥ã«®¢¨â¥«ì
|
||||
HALT
|
||||
|
||||
;*************************************************
|
||||
SET_ACEX_DATA:
|
||||
|
||||
DI
|
||||
LD BC,1FFDh
|
||||
XOR A
|
||||
OUT (C),A ; ®âª«îç¨âì RAM-0
|
||||
|
||||
LD A,4
|
||||
OUT (SYS_PORT_ON),A ; DCP-PAGE 0
|
||||
|
||||
LD A,0
|
||||
OUT (5Ch),A
|
||||
|
||||
LD A,1Ch
|
||||
OUT (PAGE1),A ; áâà ¨æ á ¤ 묨 ä ©«
|
||||
|
||||
LD HL,04100h ; ¯¥à¥ª¨¤ë¢ ¨¥ ¤ ëå ¢ Š�˜
|
||||
LD DE,01000h
|
||||
LD BC,03000h
|
||||
LDIR
|
||||
|
||||
LD A,1
|
||||
OUT (5Ch),A
|
||||
|
||||
LD DE,00000h
|
||||
|
||||
LD BC,0F00h
|
||||
LDIR
|
||||
|
||||
IN A,(PAGE1)
|
||||
INC A
|
||||
OUT (PAGE1),A
|
||||
LD HL,4000h
|
||||
|
||||
LD BC,3100h
|
||||
LDIR
|
||||
|
||||
LD A,2
|
||||
OUT (5Ch),A ; ‘âà ¨æ Š�˜ = 2
|
||||
|
||||
LD DE,00000h
|
||||
|
||||
LD BC,0F00h
|
||||
LDIR
|
||||
|
||||
IN A,(PAGE1)
|
||||
INC A
|
||||
OUT (PAGE1),A
|
||||
LD HL,4000h
|
||||
|
||||
LD BC,3100h
|
||||
LDIR
|
||||
|
||||
LD A,3
|
||||
OUT (05Ch),A ; ‘âà ¨æ Š�˜ = 3
|
||||
|
||||
LD DE,00000h
|
||||
|
||||
LD BC,0F00h
|
||||
LDIR
|
||||
|
||||
IN A,(PAGE1)
|
||||
INC A
|
||||
OUT (PAGE1),A
|
||||
LD HL,4000h
|
||||
|
||||
LD BC,3100h
|
||||
LDIR
|
||||
|
||||
LD HL,STRING ; ä« £ ¯¥à¥§ £à㧪¨ ¨§ Š�˜-
|
||||
LD DE,03EF0h
|
||||
|
||||
LD BC,10h
|
||||
LDIR
|
||||
|
||||
LD A,0FFh
|
||||
LD (03EE0h),A ; no multiple ! ¯¥à¥§ £à㧪 ⮫쪮 ®¤
|
||||
|
||||
LD A,(FLAG) ; ¥á«¨ âãâ M
|
||||
CP "M" ; â® ¯¥à¥£à㦠âìáï ¡ã¤¥â ¤® ¯®â¥à¨ ¯ã«ìá
|
||||
; �… ˆ‘�Ž‹œ‡Ž‚€’œ!!!
|
||||
|
||||
RET NZ
|
||||
|
||||
LD (03EE0h),A ; multiple !
|
||||
|
||||
RET
|
||||
|
||||
;*******************************
|
||||
|
||||
FLAG: DB 0
|
||||
|
||||
STRING: DB "ACEX_30K_LOADING" ; ä« £ ¯¥à¥§ £à㧪¨
|
||||
|
||||
;*******************************
|
||||
|
||||
READ_FROM_FILE: ; ç¨â âì ä ©« ¯à®è¨¢ª¨ =64k
|
||||
|
||||
LD A,1
|
||||
LD HL,ROM_FILE
|
||||
LD C,11h
|
||||
RST 10h
|
||||
DI
|
||||
JP C,ERROR_FILE1
|
||||
LD (FILE_HANDLE),A
|
||||
|
||||
IN A,(PAGE3)
|
||||
PUSH AF
|
||||
LD A,1Ch
|
||||
OUT (PAGE3),A
|
||||
|
||||
LOOP_READ:
|
||||
LD A,(FILE_HANDLE)
|
||||
LD HL,0C000h
|
||||
LD DE,4000h
|
||||
LD C,13h
|
||||
RST 10h
|
||||
DI
|
||||
JP C,ERROR_FILE
|
||||
|
||||
AND A
|
||||
LD HL,4000h
|
||||
SBC HL,DE
|
||||
JP NZ,ERROR_FILE
|
||||
|
||||
IN A,(PAGE3)
|
||||
INC A
|
||||
OUT (PAGE3),A
|
||||
CP 20h
|
||||
JR NZ,LOOP_READ
|
||||
|
||||
LD A,(FILE_HANDLE)
|
||||
LD C,12h
|
||||
RST 10h
|
||||
DI
|
||||
JP C,ERROR_FILE
|
||||
POP AF
|
||||
OUT (PAGE3),A
|
||||
RET
|
||||
|
||||
ERROR_FILE:
|
||||
POP AF
|
||||
OUT (PAGE3),A
|
||||
ERROR_FILE1:
|
||||
|
||||
LD A,(FILE_HANDLE) ; § ªàëâì, ¥á«¨ ¡ë« ®âªàëâ
|
||||
AND A
|
||||
JR Z,NO_CLOSE
|
||||
LD C,12h
|
||||
RST 10h
|
||||
|
||||
NO_CLOSE:
|
||||
|
||||
LD HL,ERROR_MSG
|
||||
LD C,5Ch
|
||||
RST 10h
|
||||
DI
|
||||
|
||||
LD C,41h
|
||||
LD B,0
|
||||
RST 10h
|
||||
|
||||
RET
|
||||
|
||||
DI
|
||||
HALT
|
||||
|
||||
FILE_HANDLE: db 0
|
||||
|
||||
ERROR_MSG: db "File ERROR!",13,10,0
|
||||
|
||||
ROM_FILE: db "GAME_00.ACX",0,0,0,0,0
|
||||
|
||||
;*************************************************
|
||||
|
||||
SET_RETURN: ; ¯à®£à ¬¬ ¤«ï ãáâ ®¢ª¨
|
||||
; ¢®§¢à â ¯®á«¥ ¯¥à¥§ £à㧪¨
|
||||
; LD DE,RELOAD_RET ; €„�…‘ ‚އ‚�€’€
|
||||
|
||||
DI
|
||||
|
||||
IN A,(PAGE3)
|
||||
LD (APG3+1),A
|
||||
|
||||
LD A,41h
|
||||
OUT (PAGE3),A ; ®âªàëâì ᯥæ-áâà ¨æã
|
||||
|
||||
LD (0FFF4h),DE ; ¤à¥á ¯à®£à ¬¬ë ¯¥à¥§ ¯ãáª
|
||||
|
||||
LD A,"Z"
|
||||
LD (0FFFEh),A
|
||||
LD A,"X"
|
||||
LD (0FFFFh),A ; ä« £ ¯¥à¥§ ¯ãáª
|
||||
|
||||
|
||||
IN A,(PAGE0) ; á®åà ïâì áâà ¨æë
|
||||
LD (0FFF0h),A ; DOS-PAGE
|
||||
IN A,(PAGE1)
|
||||
LD (0FFF1h),A ;
|
||||
IN A,(PAGE2)
|
||||
LD (0FFF2h),A ; ¯à®£à ¬¬ë ¤«ï ¢®§¢à â ???
|
||||
IN A,(PAGE3)
|
||||
LD (0FFF3h),A ;
|
||||
|
||||
LD A,(APG3+1)
|
||||
OUT (PAGE3),A
|
||||
|
||||
RET
|
||||
|
||||
;**************************************************************
|
||||
|
||||
RELOAD_RET: ; ¬¥áâ®, ªã¤ ¯à®¨§¢¥¤¥ ¢®§¢à â ¯®á«¥ ¯¥à¥§ £à㧪¨
|
||||
; ®¢®© ¯à®è¨¢ª¨
|
||||
|
||||
DI
|
||||
LD SP,0BFF0h
|
||||
LD A,CNF_0 ; ª®ä¨£ãà æ¨ï ¨ ®âª«î票¥ �‡“
|
||||
OUT (SYS_PORT_OFF),A
|
||||
|
||||
LD A,(0FFF0h) ; SET PAGE DOS
|
||||
OUT (PAGE0),A
|
||||
|
||||
APG3: LD A,41h ; ¢®§¢à â áâ ன áâà ¨æë PAGE3
|
||||
OUT (PAGE3),A
|
||||
|
||||
;*****************************************************************
|
||||
; ¢ë§®¢ ®á®¢®© ¯à®£à ¬¬ë ¤«ï à ¡®âë á ®¢®© ¯à®è¨¢ª®©
|
||||
; à ¡®â î⠢ᥠäãæ¨¨ DOS/BIOS, ªà®¬¥ äãªæ¨© íªà
|
||||
|
||||
CALL MAIN_PROGRAMM
|
||||
|
||||
;*****************************************************************
|
||||
; ¢®§¢à â ¢ áâ àãî ¯à®£à ¬¬ã (RESET!)
|
||||
|
||||
LD DE,RELOAD_RET2
|
||||
CALL SET_RETURN ; ãáâ ®¢ª ¤ ëå ¤«ï ¢®§¢à â
|
||||
|
||||
JP RESET
|
||||
|
||||
RELOAD_RET2: ; áî¤ ¤®«¦® ¡ë ¢ë室¨âì ¯®á«¥ ¢®§¢à â ¯à®è¨¢ª¨,
|
||||
; ® ¯®ª ¥ ¢ë室¨â
|
||||
|
||||
DI
|
||||
LD SP,0BFF0h
|
||||
LD A,CNF_0 ; ª®ä¨£ãà æ¨ï ¨ ®âª«î票¥ �‡“
|
||||
OUT (SYS_PORT_OFF),A
|
||||
|
||||
LD A,(0FFF0h) ; SET PAGE DOS
|
||||
OUT (PAGE0),A
|
||||
|
||||
LD A,(APG3+1)
|
||||
OUT (PAGE3),A
|
||||
|
||||
LD C,41h ; RET TO DOS
|
||||
LD B,0
|
||||
RST 10h
|
||||
|
||||
RET
|
||||
|
||||
;*****************************************************************
|
||||
;
|
||||
; ”®à¬ â ०¨¬ § ª®¬¥áâ
|
||||
; €¤à¥á â®â ¦¥
|
||||
;
|
||||
; � ©â 0
|
||||
; bit 7..6 - ®¬¥à ¯ «¨âàë
|
||||
; bit 5 - £à 䨪 /⥪áâ, ¤®«¦® ¡ëâì 0 (⥪áâ ¥â)
|
||||
; bit 4 - ०¨¬ 640/320 â®ç¥ª ¢ «¨¨¨
|
||||
; bit 3 - १¥à¢ - ¤®«¦ë ¡ëâì 0
|
||||
; bit 2 - à §à¥è¥¨¥ ᬥ饨ï á¥âª¨
|
||||
; bit 1..0 - 2 áâ àè¨å ¡¨â ª®®à¤¨ âë X
|
||||
;
|
||||
; � ©â 1 8 ¬« ¤è¨å ¡¨â ª®®à¤¨ âë X
|
||||
;
|
||||
; � ©â 2 ª®®à¤¨ â Y
|
||||
;
|
||||
; � ©â 3 ᬥ饨¥ á¥âª¨ ª®®à¤¨ â
|
||||
; bit 3..0 - ᬥ饨¥ ¯® X
|
||||
; bit 7..4 - ᬥ饨¥ ¯® Y
|
||||
;
|
||||
; Š¢ ¤à ⨪ £à 䨪¨ 8x8 ¢ë¢®¤¨âáï ¨§ ¢¨àâ㠫쮣® íªà 1024x256
|
||||
; ¢ ᮮ⢥âá⢨¨ á ª®®à¤¨ â ¬¨ ¢¥à奣® «¥¢®£®
|
||||
; 㣫 § ª®¬¥áâ , § ¤ ®£® ¢ ¡ ©â å ०¨¬
|
||||
;
|
||||
; ‘¬¥é¥¨¥ á¥âª¨ § ¤ ¥âáï âà¥â쨬 ¡ ©â®¬ ०¨¬ íªà
|
||||
; „¥©áâ¢ã¥â ⮫쪮, ᮯ஢®¦¤ ¥¬ë© ¥¤¨¨æ¥©
|
||||
; ¢ ¡¨â¥ 2 ã«¥¢®£® ¡ ©â ०¨¬
|
||||
; …᫨ ¡¨â 2 ¥ ¡ë« ãáâ ®¢«¥, ⮠ᬥ饨¥
|
||||
; Ž‘’€…’‘Ÿ ’…Œ, —’Ž �›‹Ž “‘’€�Ž‚‹…�Ž �€�……
|
||||
; „¥©á⢨¥ ¡ ©â § ¤ ®£® ¢ § ª®¬¥á⥠¢ª«îç ¥âáï á«¥¤ãî饬
|
||||
; § ª®¬¥áâ¥
|
||||
;
|
||||
;
|
||||
;*****************************************************************
|
||||
|
||||
MAIN_PROGRAMM:
|
||||
|
||||
IN A,(PAGE3) ; á®åà ¨âì ¯®àâë
|
||||
PUSH AF
|
||||
IN A,(PORT_Y)
|
||||
PUSH AF
|
||||
|
||||
LD A,50h
|
||||
OUT (PAGE3),A ; íªà ¢ PAGE3
|
||||
|
||||
LD A,0 ; ª®®à¤¨ â Y
|
||||
LD DE,6180h ; ª®®à¤¨ â X ¯«îá ०¨¬
|
||||
|
||||
CALL CLEAR_SH ; ®ç¨á⪠4-£® ¡ ©â ०¨¬ íªà
|
||||
|
||||
CALL MAIN_SCROLL; § ¤ ¨¥ ®¢®£® £à ä.०¨¬
|
||||
|
||||
CALL PIC_SET ; ¯à®à¨á®¢ª ª à⨪¨ (á¥âª )
|
||||
|
||||
LD A,0 ; ª®®à¤¨ â Y
|
||||
LD DE,6180h ; ª®®à¤¨ â X ¯«îá ०¨¬
|
||||
LD BC,100 ; ç¨á«® ä३¬®¢ ¤® ¢ë室 C*256
|
||||
LOOP_SCR:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
|
||||
CALL MAIN_SCROLL2 ; ®¢ë© áªà®««¨£
|
||||
|
||||
POP BC
|
||||
POP DE
|
||||
|
||||
LD A,1 ; ¬¥ï¥¬ ª®®à¤¨ âã X
|
||||
ADD_PAR2 EQU $-1
|
||||
ADD A,E
|
||||
LD E,A
|
||||
|
||||
CP 0FFh
|
||||
JR NZ,NO_X1
|
||||
LD A,-1
|
||||
LD (ADD_PAR2),A
|
||||
NO_X1:
|
||||
CP 0
|
||||
JR NZ,NO_X2
|
||||
LD A,1
|
||||
LD (ADD_PAR2),A
|
||||
NO_X2:
|
||||
|
||||
|
||||
POP AF
|
||||
ADD A,1 ; ¬¥ï¥¬ ª®®à¤¨ âã Y
|
||||
ADD_PAR1 EQU $-1
|
||||
|
||||
PUSH AF
|
||||
|
||||
CP 0F0h
|
||||
JR NZ,NO_X3
|
||||
LD A,-1
|
||||
LD (ADD_PAR1),A
|
||||
NO_X3:
|
||||
CP 0
|
||||
JR NZ,NO_X4
|
||||
LD A,1
|
||||
LD (ADD_PAR1),A
|
||||
NO_X4:
|
||||
|
||||
LD A,7
|
||||
OUT (0FEh),A ; ¡®à¤¥à ï 㪠§ª
|
||||
|
||||
EI
|
||||
HALT
|
||||
|
||||
LD A,0
|
||||
OUT (0FEh),A
|
||||
|
||||
POP AF
|
||||
|
||||
DJNZ LOOP_SCR
|
||||
DEC C
|
||||
JR NZ,LOOP_SCR
|
||||
|
||||
POP AF ; ¢®ááâ ®¢¨âì ¯®àâë
|
||||
OUT (PORT_Y),A
|
||||
POP AF
|
||||
OUT (PAGE3),A
|
||||
|
||||
RET
|
||||
|
||||
;******************************************
|
||||
|
||||
MAIN_SCROLL2:
|
||||
DI
|
||||
|
||||
IN A,(PORT_Y)
|
||||
PUSH AF
|
||||
|
||||
|
||||
LD HL,0C310h ; ç¨ ï á 4-© áâப¨ ᢥàåã
|
||||
LOOP_SC1:
|
||||
LD A,5 ; ç¨ ¥¬ á N-£® § ª®¬¥áâ ०¨¬
|
||||
; LD A,N*2-1
|
||||
; ᬥ饨¥ ¢ ã«¥¢®¬ § ª®¬¥áâ¥
|
||||
; § ¤ ® ª ª ®«ì ¨ ¬®¦¥â ¡ëâì
|
||||
; ᬥ饮 ª ª 56-¥ § ª®¬¥áâ®,
|
||||
; ãáâ ®¢ª®© á¬¥é¥¨ï ¢ 55-¬
|
||||
;
|
||||
|
||||
OUT (PORT_Y),A
|
||||
|
||||
LD A,(HL)
|
||||
OR 04h
|
||||
LD (HL),A ; ãáâ ®¢ª ¡¨â 2 ¤«ï ¢ª«î票ï ᬥ饨ï
|
||||
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
LD A,(COUNT1)
|
||||
LD (HL),A ; ãáâ ®¢ª ᬥ饨ï
|
||||
|
||||
INC L
|
||||
|
||||
LD A,L
|
||||
CP 70h ; § ª 稢 ¥¬ 28-© áâப¥
|
||||
JR NZ,LOOP_SC1
|
||||
|
||||
|
||||
LD HL,0C310h ; ç¨ ï á 4-© áâப¨
|
||||
LOOP_SC2:
|
||||
|
||||
LD A,75 ; 38-¬ § ª®¬¥áâ¥
|
||||
OUT (PORT_Y),A
|
||||
|
||||
LD A,(HL)
|
||||
OR 04h
|
||||
LD (HL),A ; ãáâ ¢«¨¢ ¥¬ ®¢®¥ ᬥ饨¥
|
||||
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
LD (HL),88h ; á® § 票¥¬ 8 ¯¨ªá¥«¥© ¯® £®à-«¨
|
||||
; ¨ 8 ¯® ¢¥à⨪ «¨
|
||||
; ¯®áâ®ï®
|
||||
INC L
|
||||
|
||||
LD A,L
|
||||
CP 78h ; § ª 稢 ¥¬ 30-© áâப¥
|
||||
; (¤¢¥ «¨è¨å áâப¨, çâ® ¡ë
|
||||
; áà ¡®â «¨ ¡ ©âë ¢ ᬥ饮¬ ¯®
|
||||
; ¢¥à⨪ «¨ § ª®¬¥áâ¥)
|
||||
JR NZ,LOOP_SC2
|
||||
|
||||
POP AF
|
||||
OUT (PORT_Y),A
|
||||
|
||||
|
||||
LD A,(COUNT2) ; "¯« ¢®¥" ¨§¬¥¥¨¥ áç¥â稪 ¤«ï ¤¥¬®áâà æ¨¨
|
||||
ADD A,40h ; ᬥ饨ï
|
||||
LD (COUNT2),A
|
||||
JR NC,no_add1
|
||||
LD A,(COUNT1)
|
||||
ADD A,11h
|
||||
AND 77h
|
||||
LD (COUNT1),A
|
||||
no_add1:
|
||||
|
||||
RET
|
||||
|
||||
COUNT1: db 0
|
||||
COUNT2: db 0
|
||||
|
||||
;******************************************************
|
||||
|
||||
CLEAR_SH: ; § ¡¨¢ îâáï ã«ï¬¨ ¢á¥ 3-¨ ¡ ©âë ०¨¬
|
||||
IN A,(PORT_Y) ; ¢á¥¬ íªà ¥ (¢ ⮬ ç¨á«¥ ¡®à¤¥à¥ ¨ ¡« ª¥!)
|
||||
PUSH AF ; ªá¥«¥à â®à®¬
|
||||
|
||||
XOR A
|
||||
OUT (PORT_Y),A
|
||||
LD HL,0C303h
|
||||
|
||||
|
||||
CLEAR_LOOP:
|
||||
DI
|
||||
LD D,D
|
||||
LD A,0
|
||||
LD E,E
|
||||
LD (HL),A
|
||||
LD B,B
|
||||
EI
|
||||
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
|
||||
LD A,L
|
||||
CP 0B3h
|
||||
JR NZ,CLEAR_LOOP
|
||||
|
||||
POP AF
|
||||
OUT (PORT_Y),A
|
||||
RET
|
||||
|
||||
;*********************************************
|
||||
|
||||
PIC_SET: ; à¨áã¥âáï á¥âª
|
||||
; ¨ ª¢ ¤à ⨪¨
|
||||
IN A,(PORT_Y)
|
||||
PUSH AF
|
||||
|
||||
DI
|
||||
|
||||
LD D,D
|
||||
LD A,8
|
||||
LD B,B
|
||||
|
||||
LD HL,0C000h
|
||||
LD C,0
|
||||
LOOP_SC7:
|
||||
LD A,0
|
||||
LOOP_SC6:
|
||||
LD B,8
|
||||
LOOP_SC5:
|
||||
OUT (PORT_Y),A
|
||||
|
||||
LD C,C
|
||||
LD (HL),C
|
||||
LD B,B
|
||||
|
||||
INC A
|
||||
DJNZ LOOP_SC5
|
||||
|
||||
INC C
|
||||
AND A
|
||||
JR NZ,LOOP_SC6
|
||||
|
||||
LD A,L
|
||||
ADD A,8
|
||||
LD L,A
|
||||
LD A,H
|
||||
ADC A,0
|
||||
LD H,A
|
||||
CP 0C3h
|
||||
JR NZ,LOOP_SC7
|
||||
|
||||
LD HL,0C000h
|
||||
LD C,0FFh
|
||||
LD D,D
|
||||
LD A,0
|
||||
LD B,B
|
||||
LOOP_SC3:
|
||||
LD E,E
|
||||
LD (HL),C ; vertical lines
|
||||
LD B,B
|
||||
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
|
||||
LD E,E
|
||||
LD (HL),C ; vertical lines
|
||||
LD B,B
|
||||
|
||||
INC HL
|
||||
|
||||
LD A,H
|
||||
CP 0C3h
|
||||
JR NZ,LOOP_SC3
|
||||
|
||||
LD A,0
|
||||
OUT (PORT_Y),A
|
||||
LD HL,0C000h
|
||||
|
||||
LOOP_SC4:
|
||||
OUT (PORT_Y),A
|
||||
|
||||
LD C,C
|
||||
LD (HL),C ; horizontal line
|
||||
INC H
|
||||
LD (HL),C
|
||||
INC H
|
||||
LD (HL),C
|
||||
LD B,B
|
||||
|
||||
ADD A,7
|
||||
OUT (PORT_Y),A
|
||||
|
||||
LD C,C
|
||||
LD (HL),C ; horizontal line
|
||||
DEC H
|
||||
LD (HL),C
|
||||
DEC H
|
||||
LD (HL),C
|
||||
LD B,B
|
||||
|
||||
INC A
|
||||
JR NZ,LOOP_SC4
|
||||
|
||||
|
||||
POP AF
|
||||
OUT (PORT_Y),A
|
||||
|
||||
RET
|
||||
|
||||
;*********************************************
|
||||
; ãáâ ®¢ª ०¨¬ íªà
|
||||
|
||||
MAIN_SCROLL: ; A - ª®®à¤¨ â Y
|
||||
PUSH DE
|
||||
CALL Y_SET ; ãáâ ®¢¨âì ¤ ë¥ Y ª®®à¤¨ âë ¤«ï á⮫¡æ
|
||||
POP DE
|
||||
CALL X_SET
|
||||
|
||||
LD HL,0C302h ; ¤à¥á ०¨¬
|
||||
|
||||
LD BC,Y_DATA ; ¤à¥á ¯®«®¦¥¨© Y
|
||||
LD DE,X_DATA ; ¤à¥á ०¨¬®¢ ¨ ª®®à¤¨ â X ¢ áâப å
|
||||
|
||||
M_LOOP:
|
||||
PUSH HL
|
||||
|
||||
LD A,1
|
||||
OUT (PORT_Y),A
|
||||
|
||||
DI ; ªá¥«¥à â®à®¥ § ¯®«¥¨¥ ०¨¬ íªà
|
||||
; ¤«ï ®¤®© «¨¨¨ § ª®¬¥áâ
|
||||
LD D,D
|
||||
LD A,79 ; 40 § ª®¬¥áâ (® ç¥à¥§ 1!!!)
|
||||
LD B,B
|
||||
|
||||
LD A,(BC) ; ¢§ïâì § ¯®«¨â¥«ì ¤«ï Y ª®®à¤¨ âë
|
||||
|
||||
LD E,E ; § ¯®«ïâì ª®áâ ⮩, ¢¥à⨪ «ì®
|
||||
LD (HL),A
|
||||
LD B,B
|
||||
IN A,(PORT_Y) ; ¢®ááâ ®¢«¥¨¥ ¯®àâ
|
||||
OUT (PORT_Y),A
|
||||
|
||||
DEC L
|
||||
LD L,L
|
||||
LD A,(DE) ; ¢§ïâì «¨¨î ०¨¬®¢
|
||||
LD A,A
|
||||
LD (HL),A ; ãáâ ®¢¨âì ०¨¬, ¢¥à⨪ «ì®
|
||||
LD B,B
|
||||
INC DE
|
||||
|
||||
IN A,(PORT_Y) ; ¢®ááâ ®¢«¥¨¥ ¯®àâ
|
||||
OUT (PORT_Y),A
|
||||
|
||||
DEC L
|
||||
LD L,L
|
||||
LD A,(DE) ; ¢§ïâì ¢â®àãî «¨¨î ०¨¬®¢
|
||||
LD A,A
|
||||
LD (HL),A ; ãáâ ®¢¨âì ०¨¬
|
||||
LD B,B
|
||||
DEC DE
|
||||
|
||||
IN A,(PORT_Y) ; ¢®ááâ ®¢«¥¨¥ ¯®àâ
|
||||
OUT (PORT_Y),A
|
||||
|
||||
POP HL
|
||||
INC L
|
||||
INC L
|
||||
INC L
|
||||
INC L ; á«¥¤ãîé ï áâப
|
||||
INC BC ; á«¥¤ãî騩 Y
|
||||
LD A,L
|
||||
CP 82h
|
||||
JR NZ,M_LOOP ; ¯®¢â®àïâì § ¯®«¥¨¥ ०¨¬
|
||||
|
||||
EI
|
||||
RET
|
||||
|
||||
;******************************************
|
||||
|
||||
Y_SET: ; A - Y_coord
|
||||
LD HL,Y_DATA ; ¤à¥á ¤ ëå
|
||||
LD B,32
|
||||
M_LP1:
|
||||
LD (HL),A ; Y ª®®à¤¨ âë ¤«ï ¢á¥å ª¢ ¤à ⨪®¢ ®¤®© áâப¨
|
||||
INC HL
|
||||
ADD A,8 ; 㢥«¨ç¨âì 8 ¤«ï á«¥¤ãî饩 áâப¨
|
||||
DJNZ M_LP1
|
||||
RET
|
||||
|
||||
;******************************************
|
||||
|
||||
X_SET: ; DE - X_coord + MODE
|
||||
LD HL,X_DATA ; ¤à¥á ¤ ëå
|
||||
LD B,40
|
||||
M_LPX1:
|
||||
LD (HL),E ; § ¯®¬¨âì ª®®à¤¨ âã ¤«ï ª¢ ¤à ⨪
|
||||
INC HL
|
||||
LD (HL),D
|
||||
INC HL
|
||||
LD A,E
|
||||
ADD A,8 ; 㢥«¨ç¨âì 8 ¤«ï á«¥¤ãî饣®
|
||||
LD E,A
|
||||
LD A,D
|
||||
ADC A,0
|
||||
LD D,A
|
||||
DJNZ M_LPX1 ; ¯®¢â®àïâì 40 à §
|
||||
|
||||
RET
|
||||
|
||||
;******************************************
|
||||
|
||||
X_DATA: DS 80 ; ¡®à ०¨¬®¢ ®¤®© áâப¨
|
||||
Y_DATA: DS 32 ; ¤ ë¥ Y (à áç¥âë¥)
|
||||
|
||||
|
||||
;*****************************************************************
|
||||
|
||||
DSS 8700h,255
|
||||
|
||||
.DEPHASE
|
||||
END
|
||||
|
||||
|
||||
@@ -0,0 +1,591 @@
|
||||
.LION EQU 0
|
||||
.FLEX EQU 1
|
||||
.IBMK EQU 1
|
||||
.PROJ1 EQU 0
|
||||
.PROJ2 EQU 0
|
||||
.PROJ3 EQU 1
|
||||
.PROJ4 EQU 1
|
||||
.PAL EQU 1
|
||||
|
||||
|
||||
;ELCOM256 EQU 1 ; ०¨¬ ELCOM-256
|
||||
|
||||
;IF ELCOM256 EQ 1
|
||||
|
||||
D_TBON EQU 3 ; ¤ ë¥ ¤«ï ¢ª«î票ï TURBO
|
||||
D_TBOFF EQU 2 ; ¤ ë¥ ¤«ï ¢ª«î票ï TURBO
|
||||
D_ROM16ON EQU 1
|
||||
D_ROM16OFF EQU 0
|
||||
CNF_0 EQU 04h
|
||||
CNF_1 EQU 0Ch
|
||||
CNF_2 EQU 14h
|
||||
CNF_3 EQU 1Ch
|
||||
CNF_512 EQU 80h ; ¢ª«î票¥ Pentagon 128
|
||||
|
||||
CBL_DIR EQU 78 ; ¯®àâ ã¯à ¢«¥¨ï COVOX-Blaster
|
||||
; bit 7 - 1 ¢ª«îç¨âì CBL
|
||||
|
||||
;ELSE
|
||||
;D_TBON EQU 03h ; ¤ ë¥ ¤«ï ¢ª«î票ï TURBO
|
||||
;D_TBOFF EQU 02h ; ¤ ë¥ ¤«ï ¢ª«î票ï TURBO
|
||||
;D_ROM16ON EQU 40h
|
||||
;D_ROM16OFF EQU 00h
|
||||
;CNF_0 EQU 04h
|
||||
;CNF_1 EQU 0Ch
|
||||
;CNF_2 EQU 14h
|
||||
;CNF_3 EQU 1Ch
|
||||
;ENDIF
|
||||
|
||||
SPRINTER EQU 4 ; ‚…�‘ˆŸ !!!
|
||||
ISD_WARM EQU 3
|
||||
ISD_COLD EQU 0
|
||||
IS_KEY EQU 40h ; „€��›… „‹Ÿ ‚›‚Ž„€ ‚ �Ž�’ ��ˆ ‚Š‹ž—…�ˆˆ IS-DOS
|
||||
IS_RAM_ADR EQU 5BC0h ; €„�…‘ ‡€ƒ�“‡Šˆ ��Žƒ�€ŒŒ› �…�…•Ž„€ ‚ IS-DOS
|
||||
TB_WAITES EQU 00H ; WAITë ¤«ï TURBO-MODE
|
||||
NTB_WAITES EQU 00H ; WAITë ¤«ï neTURBO-MODE
|
||||
IS_WAITES EQU 00H ; WAITë ¤«ï IS-DOS
|
||||
;****************************************
|
||||
;SYS_PORT_ON EQU 07DH
|
||||
;SYS_PORT_OFF EQU 03DH
|
||||
SYS_PORT_ON EQU 07CH
|
||||
SYS_PORT_OFF EQU 03CH
|
||||
|
||||
PAL_V_PAGE EQU 09EH
|
||||
PAL_SCP EQU 01EH
|
||||
|
||||
CNF_PAGE EQU 040H
|
||||
SYS_PAGE EQU 0FEH
|
||||
MODE_PAGE EQU 0FCH
|
||||
;SCR_PAGE EQU 0FDH
|
||||
;PAL_PAGE EQU 0FDH
|
||||
|
||||
KBD_COM EQU 1Bh
|
||||
KBD_DAT EQU 1Ah
|
||||
|
||||
COM_B EQU 1Bh
|
||||
DAT_B EQU 1Ah
|
||||
COM_A EQU 19h
|
||||
DAT_A EQU 18h
|
||||
|
||||
LPT1_D EQU 1CH
|
||||
LPT1_C EQU 1DH
|
||||
LPT2_D EQU 1EH
|
||||
LPT2_C EQU 1FH
|
||||
|
||||
STC0_C EQU 10H
|
||||
STC1_C EQU 11H
|
||||
STC2_C EQU 12H
|
||||
STC3_C EQU 13H
|
||||
|
||||
RAMD_LET EQU ('R'-'A')
|
||||
|
||||
P_KBD_OUT EQU 0F8H
|
||||
P_KBD_IN EQU 0FEH
|
||||
;***************************************
|
||||
;HD_HEADS EQU 5
|
||||
HD_CS EQU 0A0H
|
||||
|
||||
;HD_S_P_T EQU 17
|
||||
;HD_S_X_H EQU (HD_S_P_T * HD_HEADS) ; ??? ç¨á«® ᥪâ®à®¥ 樫¨¤à¥
|
||||
|
||||
P_DATS EQU 050H ; READ/WRITE INIR/OTIR
|
||||
|
||||
P_ERR EQU 051H ; READ
|
||||
P_PREC EQU 151H ; WRITE
|
||||
|
||||
P_S_CNT EQU 152H ;
|
||||
P_S_NUM EQU 153H
|
||||
P_C_LOW EQU 154H
|
||||
P_C_HIG EQU 155H ;<-\
|
||||
P_HD_CS EQU 4152H ;<-/
|
||||
|
||||
P_HDST EQU 4053H ; READ
|
||||
P_CMD EQU 4153H ; WRITE
|
||||
|
||||
P_HD3F6 EQU 4154H ; WRITE 3F6
|
||||
P_HD3F7 EQU 4055H ; READ 3F7
|
||||
|
||||
;***************************************
|
||||
CMOS_DRD equ 0FFBDh
|
||||
CMOS_DWR equ 0BFBDh
|
||||
CMOS_AWR equ 0DFBDh
|
||||
ISA_PORT equ 09FBDh
|
||||
|
||||
;***************************************
|
||||
SEC_SIZE EQU 11
|
||||
CLAST_SIZE EQU 13
|
||||
RESERV_SECS EQU 14
|
||||
FATS_NUM EQU 16
|
||||
FLS_NUM EQU 17
|
||||
S_P_D EQU 19
|
||||
FORM_CODE EQU 21
|
||||
S_P_F EQU 22
|
||||
S_P_T EQU 24
|
||||
H_P_S EQU 26
|
||||
SPECIAL_SECS EQU 28
|
||||
FAT_ID EQU 36H
|
||||
;***************************************
|
||||
|
||||
SYSTEM_ID EQU 0C020H
|
||||
|
||||
SYS_SP EQU 0C0FEH ; „Ž�Ž‹�ˆ’…‹œ�›‰ ‘’…Š
|
||||
DISK_TYPE EQU 0C100H ; ¯¥à¥ ¤à¥á æ¨ï ¤¨áª®¢
|
||||
COPY_PAGE0 EQU 0C104H ; ª®¯¨¨ § 票© ¯®à⮢ áâà ¨æ
|
||||
COPY_PAGE1 EQU 0C105H
|
||||
COPY_PAGE2 EQU 0C106H
|
||||
COPY_PAGE3 EQU 0C107H
|
||||
RAMD_VARS EQU 0C108H ; ¯¥à¥¬¥ë¥ RAM-¤¨áª®¢
|
||||
A_RAMD_VARS EQU 0C118H ; ⥪ã騩 RAM-Disk
|
||||
SP_SAVE EQU 0C11AH ; ¬¥áâ® ¤«ï á®åà ¥¨ï ¤à¥á á⥪
|
||||
ERR_SAVE EQU 0C11CH
|
||||
COPY_RGADR EQU 0C11DH
|
||||
RAM_MSD EQU 0C11EH ; áâà ¨æ ¤«ï à ¡®âë ¢ MS-DOS
|
||||
MSD_SECS EQU 0C11FH ; —¨á«® ᥪâ®à®¢ ¢ MS-DOS
|
||||
MSD_NAME EQU 0C120H ; €¤à¥á ¨¬¥¨ ©¤¥®£® ä ©«
|
||||
;MSD_FAT_SEC EQU 0C122H ; ç «ìë© á¥ªâ®à FAT
|
||||
INT_ADRESS EQU 0C124H ; ç «ìë© á¥ªâ®à CAT
|
||||
INT_PAGE EQU 0C126H ; ç «ìë© á¥ªâ®à DAT
|
||||
DS_1440 EQU 0C128H ; ä« £¨ ¯¥à¥ª«î票ï 720/1440
|
||||
F_P_S EQU 0C129H ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
|
||||
S_P_C EQU 0C12AH ; ç¨á«® ᥪâ®à®¢ ª â «®£
|
||||
COUNT_FL EQU 0C12BH ; áç¥â稪 ä ©«®¢ ¢ ᥪâ®à¥
|
||||
COUNT_SEC EQU 0C12CH ; áç¥â稪 ᥪâ®à®¢ ¢ ª â «®£¥
|
||||
C_P_B EQU 0C12DH ; ç¨á«® ª« áâ¥à®¢ ¡«®ª އ“
|
||||
;CLASTER_LEN EQU 0C12EH ; ¤«¨ ª« áâ¥à ¢ ¡ ©â å
|
||||
FAT_FLAG EQU 0C130H ; FAT ä« £ + FAT sector
|
||||
MSD_CONT_SEC EQU 0C132H ; ⥪ã騩 ᥪâ®à ¤«ï MS-DOS
|
||||
MSD_CONT_SEC2 EQU 0C134H
|
||||
S_X_H EQU 0C136H ; ª®«¨ç¥á⢮ ᥪâ®à®¢ 樫¨¤à¥
|
||||
CONFIG_ALL EQU 0C138H ; ®¯¨á â¥«ì ª®ä¨£ãà æ¨¨
|
||||
CONFIG_DE EQU 0C13AH ; ®¯¨á â¥«ì ª®ä¨£ãà æ¨¨
|
||||
CONFIG_BYTE EQU 0C13EH ; ¡ ©â ª®ä¨£ãà æ¨¨
|
||||
|
||||
WIN_MAP_SC EQU 0C140H
|
||||
WIN_TAB_SC EQU 0C142H
|
||||
WIN_SAV_HL EQU 0C144H
|
||||
WIN_SAV_DE EQU 0C146H
|
||||
WIN_SAV_BC EQU 0C148H
|
||||
WIN_ZG EQU 0C14AH
|
||||
WIN_PLACE_WIN EQU 0C14CH
|
||||
WIN_GR_MAP EQU 0C14EH
|
||||
|
||||
SYS_WORK1 EQU 0C150H
|
||||
SYS_WORK2 EQU 0C152H
|
||||
SYS_WORK3 EQU 0C154H
|
||||
SYS_WORK4 EQU 0C156H
|
||||
|
||||
WIN_MAP_LAB1 EQU 0C158H
|
||||
WIN_MODE_SH EQU 0C15CH
|
||||
WIN_MODE_SC EQU 0C15EH
|
||||
|
||||
MSD_FAT_SEC EQU 0C160H ; ç «ìë© á¥ªâ®à FAT
|
||||
MSD_FAT_SEC2 EQU 0C162H ; ç «ìë© á¥ªâ®à FAT
|
||||
MSD_CAT_SEC EQU 0C164H ; ç «ìë© á¥ªâ®à CAT
|
||||
MSD_CAT_SEC2 EQU 0C166H ; ç «ìë© á¥ªâ®à CAT
|
||||
MSD_DAT_SEC EQU 0C168H ; ç «ìë© á¥ªâ®à DAT
|
||||
MSD_DAT_SEC2 EQU 0C16AH ; ç «ìë© á¥ªâ®à DAT
|
||||
CLASTER_LEN EQU 0C16CH ; ¤«¨ ª« áâ¥à ¢ ¡ ©â å
|
||||
CLASTER_LEN2 EQU 0C16EH ; ¤«¨ ª« áâ¥à ¢ ¡ ©â å
|
||||
|
||||
;CMOS_FLAG_1 EQU 0C170H
|
||||
|
||||
GR_BIT_END EQU 7
|
||||
|
||||
S_BIT_END EQU 7
|
||||
S_BIT_LIN EQU 6
|
||||
S_BIT_MOD EQU 5
|
||||
|
||||
BIT_1440 EQU 1
|
||||
BIT_MASK_1440 EQU 00000010B
|
||||
|
||||
RAMD_KEYS EQU 0C180H ; ª«îç¨ RAM-Disks
|
||||
RAMD_KEY_NUM EQU 16
|
||||
|
||||
LIB_TABLE EQU 0C1A0H ; â ¡«¨æë librares 32 ¡ ©â
|
||||
; +0 ¡¨¡«¨®â¥ª DOS
|
||||
|
||||
HDD_INI_TABLE EQU 0C1C0H ; â ¡«¨æë ¤«ï ide ãáâனá⢠32 ¡ ©â
|
||||
; 0 - ª®¯¨ï DRV_HEAD
|
||||
; 1 - ᥪâ®à®¢ ¤®à®¦ª¥
|
||||
; 2 - ç¨á«® £®«®¢®ª
|
||||
; 3 - ª®«¨ç¥á⢮ 樫¨¤à®¢ ¬«.
|
||||
; 4 - ª®«¨ç¥á⢮ 樫¨¤à®¢ áâ à訩.
|
||||
; 5 - ᥪâ®à®¢ 樫¨¤à ¬«.
|
||||
; 6 - ᥪâ®à®¢ 樫¨¤à áâ àè.
|
||||
; 7 - reserv - type
|
||||
|
||||
FDD_INI_TABLE EQU 0C1E0H ; â ¡«¨æë ¤«ï FDD ãáâனá⢠32 ¡ ©â
|
||||
|
||||
RAMD_FAT EQU 0C200H ; à ᯮ«®¦¥¨¥ ¡«®ª®¢ RAM-Disk-®¢
|
||||
|
||||
MS_BPB EQU 0C400H ; ¡ãä¥à BPB
|
||||
MS_DIR EQU 0C800H ; ¡ãä¥à DIR sector
|
||||
MS_FAT EQU 0CC00H ; ¡ãä¥à FAT sector
|
||||
MS_BUF EQU 0D000H ; ¡ãä¥à DAT sector
|
||||
HD_IDF_ADR EQU 0C600H
|
||||
|
||||
|
||||
WIN_MAP_IX EQU 0E000H ; ¤ ë¥ ª àâ ®ª®
|
||||
|
||||
TASK_DATA EQU 0EC00H ; ¤ ë¥ ¤«ï § ¤ ç
|
||||
|
||||
; ***** - Žª®ë¥ ¯¥à¥¬¥ë¥ - *****
|
||||
|
||||
WIN_SIZE_H EQU 0 ; £®à¨§®â «ìë© à §¬¥à ¢ § ª®¬¥áâ å
|
||||
WIN_SIZE_V EQU 1 ; ¢¥à⨪ «ìë© à §¬¥à ¢ § ª®¬¥áâ å
|
||||
WIN_PLACE_H EQU 2 ; ¯®«®¦¥¨¥ ¯® £®à¨§®à «¨, ¢ § ª®¬¥áâ å
|
||||
WIN_PLACE_V EQU 3 ; ¯®«®¦¥¨¥ ¯® ¢¥à⨪ «¨ ¢ § ª®¬¥áâ å
|
||||
WIN_MODE EQU 4 ; ०¨¬ § ª®¬¥áâ
|
||||
WIN_MODE_S EQU 5 ; ¤®¯®«¨â¥«ìë© à¥¦¨¬
|
||||
; ¡¨â 0 - Sp-SCR,
|
||||
WIN_GR_X EQU 6 ; ¯®«®¦¥¨¥ ¯® X ¢ ¯®«¥ £à 䨪¨ (¯® § ª®¬¥áâ)
|
||||
WIN_GR_Y EQU 7 ; ¯®«®¦¥¨¥ ¯® Y ¢ ¯®«¥ £à 䨪¨ (¯® § ª®¬¥áâ)
|
||||
|
||||
WIN_HL EQU 8 ; á®åà ¥¨¥ HL
|
||||
WIN_BC EQU 10 ; á®åà ¥¨¥ BC
|
||||
WIN_DE EQU 12 ; á®åà ¥¨¥ DE
|
||||
WIN_V_BEG EQU 14 ; ç «® ®ª ¯® ¢¥à⨪ «¨
|
||||
WIN_V_END EQU 15 ; ª®¥æ ®ª ¯® ¢¥à⨪ «¨
|
||||
WIN_H_BEG EQU 16 ; ç «® ®ª ¯® £®à¨§®â «¨
|
||||
WIN_H_END EQU 17 ; ª®¥æ ®ª ¯® £®à¨§®â «¨
|
||||
WIN_SIZE_REL EQU 18 ; ॠ«ìë© à §¬¥à ¢ ᨬ¢®« å
|
||||
WIN_MODE_E EQU 19 ; ¤®¯®«¨â¥«ìë© à¥¦¨¬ íªà
|
||||
WIN_WORK_1 EQU 20 ; à ¡®ç ï ¯¥à¥¬¥ ï 1
|
||||
WIN_WORK_2 EQU 21 ; à ¡®ç ï ¯¥à¥¬¥ ï 2
|
||||
WIN_GRAF_X EQU 24 ; ç «ì ï ª®®à¤¨ â ¯® X
|
||||
WIN_GRAF_Y EQU 26 ; ç «ì ï ª®®à¤¨ â ¯® Y
|
||||
|
||||
USER_VARS EQU 0F000h ; ¯¥à¥¬¥ë¥ ¯®«ì§®¢ ⥫¥©
|
||||
|
||||
;SW_ROM EQU 3CF9H
|
||||
|
||||
; IF .PROJ4
|
||||
;RGADR EQU 0D0H
|
||||
;RGSCR EQU 0D1H
|
||||
;RGMOD EQU 0D2H
|
||||
;RGACC EQU 0D3H
|
||||
;PGACC EQU 0FCH
|
||||
|
||||
;PAGE0 EQU 0C0H
|
||||
;PAGE1 EQU 0C5H
|
||||
;PAGE2 EQU 0C2H
|
||||
;PAGE3 EQU 0C0H
|
||||
|
||||
; ELSE
|
||||
|
||||
; ENDIF
|
||||
|
||||
PAGE0 EQU 082H
|
||||
PAGE1 EQU 0A2H
|
||||
PAGE2 EQU 0C2H
|
||||
PAGE3 EQU 0E2H
|
||||
|
||||
;RGADR EQU 089H
|
||||
;RGSCR EQU 0A9H
|
||||
;RGMOD EQU 099H
|
||||
;RGACC EQU 0B9H
|
||||
PORT_Y EQU 089H
|
||||
RGADR EQU 089H
|
||||
RGSCR EQU 0E9H
|
||||
RGMOD EQU 0C9H
|
||||
;RGACC EQU 0A9H
|
||||
;PGACC EQU 0FCH
|
||||
CNF_PORT EQU 7Ch
|
||||
|
||||
ALTERA EQU 1400H
|
||||
|
||||
WG_COM EQU 00FH
|
||||
WG_TRK EQU 03FH
|
||||
WG_SEC EQU 05FH
|
||||
WG_DATA EQU 07FH
|
||||
P_DOS_FF EQU 0FFH
|
||||
|
||||
BUFER_RD EQU 5D25H
|
||||
|
||||
PR_BUFER EQU 05B00H
|
||||
AUTO_5B08 EQU 05B08H
|
||||
AUTO_5B5C EQU 05B5CH
|
||||
COPY_P128 EQU 05B5CH
|
||||
AUTO_5BFF EQU 05BFFH
|
||||
K_STATE EQU 05C00H
|
||||
KEY_TIME EQU 05C09H
|
||||
REP_K_TYME EQU 05C10H
|
||||
ZG EQU 05C36H
|
||||
ERR_BEEP EQU 05C38H
|
||||
KEY_BEEP EQU 05C39H
|
||||
ERR_NR EQU 05C3AH
|
||||
FLAGS EQU 05C3BH
|
||||
TV_FLAG EQU 05C3CH
|
||||
ERR_SP EQU 05C3DH
|
||||
LIST_SP EQU 05C3FH
|
||||
MODE EQU 05C41H
|
||||
NEW_PPC EQU 05C42H
|
||||
NEW_S_PPC EQU 05C44H
|
||||
PPC EQU 05C45H
|
||||
SUB_PPC EQU 05C47H
|
||||
BORDER EQU 05C48H
|
||||
EDIT_PPC EQU 05C49H
|
||||
BAS_VARS EQU 05C4BH
|
||||
WORK_VAR EQU 05C4DH
|
||||
CHANS EQU 05C4FH
|
||||
CUR_CHL EQU 05C51H
|
||||
BAS_PROG EQU 05C53H
|
||||
NEXT_LINE EQU 05C55H
|
||||
DATA_ADR EQU 05C57H
|
||||
E_LINE EQU 05C59H
|
||||
K_CUR EQU 05C5BH
|
||||
CH_ADR EQU 05C5DH
|
||||
SINT_ER_AD EQU 05C5FH
|
||||
WORK_SP EQU 05C61H
|
||||
STK_BOT EQU 05C63H
|
||||
STK_END EQU 05C65H
|
||||
B_REG EQU 05C67H
|
||||
MEM_CALC EQU 05C68H
|
||||
FLAGS_2 EQU 05C6AH
|
||||
L_SCR_SIZE EQU 05C6BH
|
||||
AUTO_LST_L EQU 05C6CH
|
||||
OLD_PPC EQU 05C6EH
|
||||
OLD_S_PPC EQU 05C70H
|
||||
FLG_INPUT EQU 05C71H
|
||||
S_VAR_LEN EQU 05C72H
|
||||
SINT_TB_ADR EQU 05C74H
|
||||
RAND_SEED EQU 05C76H
|
||||
FRAMES EQU 05C78H
|
||||
UDG EQU 05C7BH
|
||||
X_Y_COORD EQU 05C7DH
|
||||
PRN_POS EQU 05C7FH
|
||||
ADR_PR_BUF EQU 05C80H
|
||||
ECHO_E EQU 05C82H
|
||||
SCR_PL_M EQU 05C84H
|
||||
SCR_PL_L EQU 05C86H
|
||||
SCR_POS_M EQU 05C88H
|
||||
SCR_POS_L EQU 05C8AH
|
||||
SCROLL_ST EQU 05C8CH
|
||||
ATTR_P EQU 05C8DH
|
||||
MASK_P EQU 05C8EH
|
||||
ATTR_T EQU 05C8FH
|
||||
MASK_E EQU 05C90H
|
||||
FLAGS_ATR EQU 05C91H
|
||||
MEM_BOT EQU 05C92H
|
||||
AUTO_5C9A EQU 05C9AH
|
||||
NMI_ADR EQU 05CB0H
|
||||
TOP_CLEAR EQU 05CB2H
|
||||
P_RAMTOP EQU 05CB4H
|
||||
BEG_ADRESS EQU 05CB6H
|
||||
RET_INS EQU 05CC2H
|
||||
AUTO_5CC3 EQU 05CC3H
|
||||
DISK_A EQU 05CC8H
|
||||
DISK_B EQU 05CC9H
|
||||
DISK_C EQU 05CCAH
|
||||
DISK_D EQU 05CCBH
|
||||
CAT_SEC EQU 05CCCH
|
||||
DRV_READY EQU 05CCDH
|
||||
RD_WR_COM EQU 05CCEH
|
||||
VAR_1 EQU 05CCFH
|
||||
AUTO_5CD1 EQU 05CD1H
|
||||
AUTO_5CD2 EQU 05CD2H
|
||||
AUTO_5CD3 EQU 05CD3H
|
||||
AUTO_5CD5 EQU 05CD5H
|
||||
DOS_ERROR EQU 05CD6H
|
||||
MED_START EQU 05CD7H
|
||||
DOS_CH_ADR EQU 05CD9H
|
||||
MED_LEN EQU 05CDBH
|
||||
FL_NAME EQU 05CDDH
|
||||
FL_N_2 EQU 05CDFH
|
||||
FL_N_4 EQU 05CE1H
|
||||
FL_N_6 EQU 05CE3H
|
||||
FL_N_7 EQU 05CE4H
|
||||
FL_TYPE EQU 05CE5H
|
||||
FL_START EQU 05CE6H
|
||||
|
||||
FL_LEN EQU 05CE8H
|
||||
START_CLASTER EQU FL_LEN
|
||||
|
||||
FL_SIZE EQU 05CEAH
|
||||
FL_PLACE EQU 05CEBH
|
||||
VAR_2 EQU 05CEDH
|
||||
INTERF_I EQU 05CEFH
|
||||
VAR_2_0 EQU 05CF1H
|
||||
VAR_2_1 EQU 05CF2H
|
||||
CONT_SEC EQU 05CF4H
|
||||
CONT_TRK EQU 05CF5H
|
||||
OPER_DISK EQU 05CF6H
|
||||
DOS_FLAG EQU 05CF7H
|
||||
DISK_1_FLG EQU 05CF8H
|
||||
DISK_2_FLG EQU 05CF9H
|
||||
TIME_A EQU 05CFAH
|
||||
TIME_B EQU 05CFBH
|
||||
TIME_C EQU 05CFCH
|
||||
TIME_D EQU 05CFDH
|
||||
COMAND_WG EQU 05CFEH
|
||||
SEC_NUM EQU 05CFFH
|
||||
CONT_BUF_ADR EQU 05D00H
|
||||
WORK_2 EQU 05D02H
|
||||
WORK_4 EQU 05D04H
|
||||
S_NAME_NUM EQU 05D06H
|
||||
N_DEL_FLS EQU 05D07H
|
||||
FST_SYM_NAME EQU 05D08H
|
||||
VAR_3 EQU 05D09H
|
||||
BUF_FLAG EQU 05D0CH
|
||||
BAS_DOS_FLG EQU 05D0EH
|
||||
DOS_ERR_2 EQU 05D0FH
|
||||
ERR_3D00 EQU 05D10H
|
||||
ADR_DOS_COM EQU 05D11H
|
||||
ERR_SP_COPY EQU 05D13H
|
||||
MSG_FLAG EQU 05D15H
|
||||
PDOS_COPY EQU 05D16H
|
||||
FLAG_BOOT EQU 05D17H
|
||||
INT_1_VAR EQU 05D18H
|
||||
CONT_DISK EQU 05D19H
|
||||
ADR_RET EQU 05D1AH
|
||||
DOS_SP EQU 05D1CH
|
||||
FL_NUMBER EQU 05D1EH
|
||||
COM_LN_COPY EQU 05D20H
|
||||
L_5D23 EQU 05D23H
|
||||
BUFER EQU 05D25H
|
||||
AUTO_5D33 EQU 05D33H
|
||||
CLEAR_SEC EQU 05E06H
|
||||
CLEAR_TRK EQU 05E07H
|
||||
TYPE_DISK EQU 05E08H
|
||||
N_FILES EQU 05E09H
|
||||
FREE_SEC EQU 05E0AH
|
||||
CODE_10H EQU 05E0CH
|
||||
DISK_MRK_1 EQU 05E0FH
|
||||
DISK_ALT_NM EQU 05E10H
|
||||
N_DEL_FL EQU 05E19H
|
||||
DISK_NAME EQU 05E1AH
|
||||
|
||||
|
||||
;RET_PAGE0 MACRO
|
||||
; LD A,0
|
||||
; OUT (PAGE0),A
|
||||
; ENDM
|
||||
;RET_PAGE1 MACRO
|
||||
; LD A,5
|
||||
; OUT (PAGE1),A
|
||||
; ENDM
|
||||
;RET_PAGE2 MACRO
|
||||
; LD A,2
|
||||
; OUT (PAGE2),A
|
||||
; ENDM
|
||||
;RET_PAGE3 MACRO
|
||||
; LD A,0
|
||||
; OUT (PAGE3),A
|
||||
; ENDM
|
||||
|
||||
DSS MACRO adr,dt
|
||||
IF ADR GE $
|
||||
REPT (adr-$)/16
|
||||
DB dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt
|
||||
ENDM
|
||||
REPT adr-$
|
||||
DB dt
|
||||
ENDM
|
||||
ELSE
|
||||
.PRINTX "Error memory relocation."
|
||||
ENDIF
|
||||
ENDM
|
||||
|
||||
CALL_48 MACRO adr
|
||||
LOCAL ADR_R
|
||||
|
||||
PUSH HL
|
||||
LD HL,ADR_R
|
||||
PUSH HL
|
||||
LD HL,SW_ROM
|
||||
PUSH HL
|
||||
LD HL,adr
|
||||
JP JP_HL_48
|
||||
ADR_R: POP HL
|
||||
|
||||
ENDM
|
||||
|
||||
CALL_48X MACRO adr
|
||||
LOCAL ADR_R
|
||||
|
||||
PUSH HL
|
||||
LD HL,ADR_R
|
||||
EX (SP),HL
|
||||
|
||||
PUSH HL
|
||||
LD HL,SW_ROM
|
||||
EX (SP),HL
|
||||
|
||||
PUSH HL
|
||||
LD HL,adr
|
||||
EX (SP),HL
|
||||
|
||||
JP SW_ROM
|
||||
ADR_R:
|
||||
ENDM
|
||||
|
||||
RAMD_KEY MACRO
|
||||
SUB 4
|
||||
DI
|
||||
LD B,SYS_PAGE
|
||||
LD C,PAGE3
|
||||
OUT (C),B
|
||||
LD HL,RAMD_KEYS
|
||||
ADD A,L
|
||||
LD L,A
|
||||
DEC L
|
||||
LD (A_RAMD_VARS),HL
|
||||
INC L
|
||||
LD L,(HL)
|
||||
RET_PAGE3
|
||||
EI
|
||||
LD A,L
|
||||
ENDM
|
||||
|
||||
|
||||
|
||||
|
||||
; �®pâë Sprinter. (¡ ©âë PORT_X)<<
|
||||
; 0 - port FF<<
|
||||
; 1 - port keyboard<<
|
||||
; 2 - port BORDER<<
|
||||
; 3 - port 1FFDh<<
|
||||
; 4 - port 7FFDh<<
|
||||
; 5 - port 3FFDh<<
|
||||
; 6 - port Start-ROM<<
|
||||
; 7 - port Start-ROM-ALT<<
|
||||
; 8 - port ROM-BASIC48<<
|
||||
; 9 - port ROM-BASIC128<<
|
||||
; 10 - port ROM-TR-DOS<<
|
||||
; 11 - port ROM-EXPANSION<<
|
||||
; 12 - port ROM-BASIC48-ALT<<
|
||||
; 13 - port ROM-BASIC128-ALT<<
|
||||
; 14 - port ROM-TR-DOS-ALT<<
|
||||
; 15 - port ROM-EXPANSION-ALT<<
|
||||
; 16 Ä¿<<
|
||||
; .. Ä´<<
|
||||
; 31 ÄÁÄports RAM-PAGES - ¯®pâë 㪠§ë¢ î騥, ª ª ï áâp ¨æ އ“<<
|
||||
;¯®¤ª«îç¥ ¢ ª ç¥á⢥ áâp ¨æë 0..F ¢ ª®ä¨£ãp 樨 Scorpion.<<
|
||||
; 33 - port RAM-0 áâp ¨æ އ“ ¯®¤ª«îç ¥¬ ï ¢ ã«¥¢®¥ ®ª® ¯p®æ¥áá®p <<
|
||||
; 34 - port RAM-5 áâp ¨æ އ“ ¯®¤ª«îç ¥¬ ï ¢ ¯¥p¢®¥ ®ª® ¯p®æ¥áá®p <<
|
||||
; 35 - port RAM-2 áâp ¨æ އ“ ¯®¤ª«îç ¥¬ ï ¢® ¢â®p®¥ ®ª® ¯p®æ¥áá®p <<
|
||||
; 36 - port CONFIG<<
|
||||
; 37 - port COVOX-1<<
|
||||
; 38 - port COVOX-2<<
|
||||
; 39 - port AY-3-8910-adr<<
|
||||
; 40 - port AY-3-8910-dat<<
|
||||
; 41 - port KEMPSTON<<
|
||||
; 42 - port ISA-interface<<
|
||||
; 43 Ŀreserv<<
|
||||
; .. Ä´<<
|
||||
; 47 ÄÙ<<
|
||||
; 48 - 51 ¯®pâë ‚ƒ93<<
|
||||
; 52 - ¯®pâ DOS-1<<
|
||||
; 53 - ¯®pâ DOS-2<<
|
||||
; 54 Ä¿ á«ã¦¥¡ë¥ ¯®pâë<<
|
||||
; .. Ä´<<
|
||||
; 63 ÄÙ<<
|
||||
; 64 Ä¿ ¯®pâë IDE interface<<
|
||||
; .. Ä´<<
|
||||
; 79 ÄÙ<<
|
||||
; 80..127 - p¥§¥p¢.<<
|
||||
; 128..143 - ¯®pâë ¨¤¥â¨ä¨ª â®p ¬ è¨ë ( ⮫쪮 ¤«ï ç⥨ï.)<<
|
||||
; 144..254 - p¥§¥p¢<<
|
||||
; 255 - ã«ì-¯®pâ - ®âª«î祮¥ á®áâ®ï¨¥.<<
|
||||
;
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
|
||||
define TRUE #37 ; scf
|
||||
define FALSE #a7 ; and a
|
||||
|
||||
SLOT0 equ #82
|
||||
SLOT1 equ #a2
|
||||
SLOT2 equ #c2
|
||||
SLOT3 equ #e2
|
||||
|
||||
define ENABLE_MUSIC
|
||||
define MUSIC_LENGTH 1245 ; bytes
|
||||
|
||||
|
||||
jp __start
|
||||
|
||||
|
||||
include "sprinter_libs/BIOS_equ.inc"
|
||||
include "sprinter_libs/DSS_equ.inc"
|
||||
|
||||
include "../../lib/im_lib.asm"
|
||||
include "../../lib/sound/sound_lib.asm"
|
||||
|
||||
include "sprinter_functions.asm"
|
||||
include "macro.asm"
|
||||
|
||||
include "delta.asm"
|
||||
include "im2_handler.asm"
|
||||
|
||||
|
||||
__start:
|
||||
di
|
||||
|
||||
; сохраним указатель стека
|
||||
ld (__saved_sp), sp
|
||||
ld sp, memory_map.stack_addr ; стек должен находиться в адресах #8000-#bfff
|
||||
|
||||
; сохраним дескриптор *.exe файла
|
||||
ld a, (ix-3)
|
||||
ld (exe_file_handle), a
|
||||
|
||||
; сохраним номер физ. страницы, которая подключена в SLOT3
|
||||
in a, (SLOT3)
|
||||
ld (__saved_page_in_slot3), a
|
||||
|
||||
; включим 21 МГц
|
||||
call turbo_on
|
||||
|
||||
; выделим страницу памяти под музыку
|
||||
call try_get_mem_page
|
||||
ld (music_page), a
|
||||
|
||||
; откроем страницу для музыки
|
||||
ld a, (music_page)
|
||||
out (SLOT3), a
|
||||
|
||||
; и загрузим музыку (байт в байт)
|
||||
ld a, (exe_file_handle)
|
||||
ld hl, #c000 ; куда загружаем
|
||||
ld de, MUSIC_LENGTH ; сколько байт пытаемся загрузить
|
||||
ld c, Dss.Read
|
||||
rst ToDSS
|
||||
|
||||
; закроем файл
|
||||
ld a, (exe_file_handle)
|
||||
ld c, Dss.Close
|
||||
rst ToDSS
|
||||
|
||||
; выведем надпись
|
||||
ld hl, s_press_any_key
|
||||
print_str
|
||||
|
||||
;
|
||||
; запускаем прерывания на таймере CTC (взамен кадрового)
|
||||
; музыка инициализируется там же
|
||||
;
|
||||
; включаем страницу с музыкой
|
||||
ld a, (music_page)
|
||||
out (SLOT3), a
|
||||
|
||||
; инициализация прерываний
|
||||
call initialize_interrupts
|
||||
|
||||
;
|
||||
; основной цикл
|
||||
;
|
||||
ei
|
||||
|
||||
; крутимся в дельта-цикле, пока не выставлен флаг delta_exit_flag = TRUE
|
||||
DELTA do_present, do_render, do_logic
|
||||
|
||||
; переход на выход из программы
|
||||
jr do_continue
|
||||
|
||||
|
||||
|
||||
do_present:
|
||||
; поменять экраны местами
|
||||
ret
|
||||
|
||||
|
||||
do_render:
|
||||
; процедура рендера одного кадра
|
||||
; может не помещаться во фрейм
|
||||
ret
|
||||
|
||||
|
||||
do_logic:
|
||||
; процедура обработки логики
|
||||
; гарантированно вызывается 50 раз в секунду,
|
||||
; даже если рендер не укладывается во фрейм
|
||||
|
||||
; проверка нажатия любой кнопки для выхода
|
||||
xor a
|
||||
in a, (#fe)
|
||||
or %11100000
|
||||
inc a
|
||||
ret z
|
||||
|
||||
; установка флага "на выход"
|
||||
ld a, TRUE
|
||||
ld (delta_exit_flag), a
|
||||
ret
|
||||
|
||||
|
||||
do_continue:
|
||||
di
|
||||
|
||||
; выключим CTC прерывания и отключим музыку
|
||||
ld a, (music_page)
|
||||
out (SLOT3), a
|
||||
call disable_interrupts
|
||||
|
||||
; освободим ранее занятые страницы памяти
|
||||
ld a, (music_page)
|
||||
call try_free_mem
|
||||
|
||||
; выведем текстовую строку
|
||||
ld hl, s_byebye
|
||||
print_str
|
||||
|
||||
; почистим буфер клавиатуры
|
||||
ld c, Dss.K_CLEAR
|
||||
ld b, 0
|
||||
rst ToDSS
|
||||
|
||||
; восстановим страницу в SLOT3, которая была там на момент запуска
|
||||
__saved_page_in_slot3: equ $+1
|
||||
ld a, 0
|
||||
out (SLOT3), a
|
||||
|
||||
; восстановим стек, где был
|
||||
__saved_sp: equ $+1
|
||||
ld sp, 0
|
||||
|
||||
jp exit_to_dos
|
||||
|
||||
|
||||
interrupts_count: dw -1
|
||||
|
||||
|
||||
exe_file_handle: db 0
|
||||
music_page: db 0
|
||||
|
||||
|
||||
s_press_any_key: db "Press any key to exit...\r\n",0
|
||||
s_byebye: db "Bye bye! :)\r\n",0
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
|
||||
|
||||
CTC:
|
||||
.Ch_0 equ #10
|
||||
.Ch_1 equ #11
|
||||
.Ch_2 equ #12
|
||||
.Ch_3 equ #13
|
||||
|
||||
|
||||
; процедура инициализации прерываний на CTC
|
||||
initialize_interrupts:
|
||||
ifdef ENABLE_MUSIC
|
||||
ld hl, memory_map.music_module_addr
|
||||
call sound_lib.init_psg
|
||||
endif
|
||||
|
||||
ld hl, im2_keyb_or_frame_handler
|
||||
ld (#beff), hl
|
||||
|
||||
ld hl, im2_ctc_handler
|
||||
ld (#be06), hl
|
||||
|
||||
ei
|
||||
halt
|
||||
di
|
||||
|
||||
; тут можно вставить код от Сергея,
|
||||
; который отличит клавиатурное прерывание от кадрового, и пропустит его
|
||||
|
||||
ld a, #57 : out (CTC.Ch_2),a
|
||||
ld a, 112 : out (CTC.Ch_2),a
|
||||
ld a, #d7 : out (CTC.Ch_3),a
|
||||
ld a, 160 : out (CTC.Ch_3),a
|
||||
ld a, 0 : out (CTC.Ch_0),a
|
||||
|
||||
ld a, #be
|
||||
ld i, a
|
||||
im 2
|
||||
ret
|
||||
|
||||
|
||||
; процедура отключения прерываний на CTC
|
||||
disable_interrupts:
|
||||
ld a, 1
|
||||
out (CTC.Ch_3), a
|
||||
|
||||
call im_lib.im2_off
|
||||
|
||||
ifdef ENABLE_MUSIC
|
||||
call sound_lib.init_psg
|
||||
call sound_lib.play_frame
|
||||
endif
|
||||
ret
|
||||
|
||||
|
||||
; пустой обработчик прерывания по вектору #FF
|
||||
im2_keyb_or_frame_handler:
|
||||
nop
|
||||
ei
|
||||
reti
|
||||
|
||||
|
||||
; обработчик CTC прерывания по вектору #06
|
||||
im2_ctc_handler:
|
||||
push af,bc,de,hl
|
||||
ex af, af
|
||||
push af
|
||||
|
||||
border 7
|
||||
|
||||
ifdef ENABLE_MUSIC
|
||||
in a, (SLOT3)
|
||||
push af
|
||||
|
||||
ld a, (music_page)
|
||||
out (SLOT3), a
|
||||
call sound_lib.play_frame
|
||||
endif
|
||||
|
||||
DELTA_INT_HANDLER
|
||||
|
||||
ld hl, (interrupts_count)
|
||||
inc hl
|
||||
ld (interrupts_count), hl
|
||||
|
||||
;
|
||||
; после 20 секунд (1000 прерываний) программа самозавершится
|
||||
;
|
||||
ld bc, -1000
|
||||
add hl, bc
|
||||
dec h
|
||||
jr nc, .exit
|
||||
|
||||
; установка флага "на выход"
|
||||
ld a, TRUE
|
||||
ld (delta_exit_flag), a
|
||||
|
||||
.exit:
|
||||
ifdef ENABLE_MUSIC
|
||||
pop af
|
||||
out (SLOT3), a
|
||||
endif
|
||||
|
||||
border 0
|
||||
|
||||
pop af
|
||||
ex af, af
|
||||
pop hl,de,bc,af
|
||||
|
||||
ei
|
||||
reti
|
||||
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
device ZXSPECTRUM128
|
||||
;---------------------------------------------------------------------------------
|
||||
PAGE0 equ #82
|
||||
PAGE1 equ #A2
|
||||
PAGE2 equ #C2
|
||||
PAGE3 equ #E2
|
||||
RGMOD equ #C9
|
||||
RGADR equ #89
|
||||
PORT_Y equ #89
|
||||
|
||||
ORG 8100h-512
|
||||
code_start
|
||||
|
||||
;--------EXE-file header:---------------------------------------------------------
|
||||
dw 5845h ; EXE Signature
|
||||
db 45h ; Reserved (EXE type)
|
||||
db 00h ; Version of EXE file
|
||||
dw 0200h ; Code offset
|
||||
dw 0000h
|
||||
dw 0000h ; Primary loader size or 0 (no primary loader)
|
||||
dw 0000h ; Reserved
|
||||
dw 0000h ; Reserved
|
||||
dw 0000h ; Reserved
|
||||
dw START ; Loading address
|
||||
dw START ; Starting address (register PC)
|
||||
dw 0C000h ; Stack address (register SP)
|
||||
ds 490 ; Reserved
|
||||
;-------------------------------------------------------------------------------
|
||||
START ld a,0x81
|
||||
ld bc,0x0050
|
||||
rst 0x10
|
||||
jp c,VMError
|
||||
|
||||
LD A,0x50
|
||||
OUT (PAGE3),A
|
||||
;-------- Draw plasma ----------------------------------------------------------
|
||||
ld bc,0 ;y
|
||||
loop_y push bc
|
||||
|
||||
ld de,320 ;x
|
||||
ld a,c
|
||||
out (PORT_Y),a
|
||||
|
||||
loop_x ld hl,plasm_tab
|
||||
add hl,de
|
||||
ld a,(hl)
|
||||
|
||||
ld hl,plasm_tab
|
||||
add hl,bc
|
||||
add a,(hl) ;color
|
||||
|
||||
ld hl,#c000-1
|
||||
add hl,de
|
||||
ld (hl),a ;draw
|
||||
|
||||
dec de
|
||||
ld a,d
|
||||
or e
|
||||
jr nz,loop_x
|
||||
|
||||
pop bc
|
||||
inc c
|
||||
jr nz,loop_y
|
||||
|
||||
;-------- Palette cycling------------------------------------------------------
|
||||
main_loop halt
|
||||
|
||||
ld b,0
|
||||
ld c,0
|
||||
ld de,pal_R_tab
|
||||
ld ix,pal_G_tab
|
||||
ld iy,pal_B_tab
|
||||
|
||||
loop_color ld a,c
|
||||
out (PORT_Y),a
|
||||
|
||||
ld hl,#c000+992
|
||||
ld a,(de)
|
||||
ld (hl),a
|
||||
inc hl
|
||||
ld a,(ix+0)
|
||||
ld (hl),a
|
||||
inc hl
|
||||
ld a,(iy+0)
|
||||
ld (hl),a
|
||||
|
||||
inc de,ix,iy
|
||||
inc c
|
||||
djnz loop_color
|
||||
;
|
||||
ld a,(pal_R_tab)
|
||||
ld hl,pal_R_tab+1
|
||||
ld de,pal_R_tab
|
||||
ld bc,255
|
||||
ldir
|
||||
ld (pal_R_tab+255),a
|
||||
;
|
||||
ld a,(pal_B_tab)
|
||||
ld hl,pal_B_tab+1
|
||||
ld de,pal_B_tab
|
||||
ld bc,255
|
||||
ldir
|
||||
ld (pal_B_tab+255),a
|
||||
;
|
||||
ld a,(pal_G_tab)
|
||||
ld hl,pal_G_tab+1
|
||||
ld de,pal_G_tab
|
||||
ld bc,255
|
||||
ldir
|
||||
ld (pal_G_tab+255),a
|
||||
;---------------------------------------------------------------------------------
|
||||
ld c,33h ; check keypress
|
||||
rst 10h
|
||||
or a
|
||||
jr z,main_loop
|
||||
;---------------------------------------------------------------------------------
|
||||
Exit ld bc,0x0041
|
||||
rst 0x10
|
||||
VMError ld hl,ErrorMessage
|
||||
ld bc,0x005c
|
||||
rst 0x10
|
||||
jr Exit
|
||||
ErrorMessage db "videomode error",0x0d,0x0a,0x00
|
||||
;------ precalculated data -------------------------------------------------------
|
||||
plasm_tab db 31,30,30,29,29,28,27,27,26,26,26,25,25,25,25,25
|
||||
db 25,25,25,25,25,25,25,25,25,26,26,26,27,27,28,28
|
||||
db 29,29,30,30,31,32,32,33,34,34,35,36,37,38,38,39
|
||||
db 40,41,42,43,44,44,45,46,47,48,49,50,50,51,52,53
|
||||
db 54,55,55,56,57,58,58,59,60,61,61,62,62,63,64,64
|
||||
db 65,65,66,66,67,67,67,68,68,68,68,69,69,69,69,69
|
||||
db 69,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68
|
||||
db 68,67,67,67,67,66,66,66,65,65,64,64,64,63,63,62
|
||||
db 62,62,61,61,60,60,60,59,59,59,58,58,58,57,57,57
|
||||
db 57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55
|
||||
db 55,56,56,56,56,56,57,57,57,58,58,58,59,59,60,60
|
||||
db 61,61,62,63,63,64,65,65,66,67,68,68,69,70,71,72
|
||||
db 73,73,74,75,76,77,78,79,80,81,82,82,83,84,85,86
|
||||
db 87,88,89,90,90,91,92,93,94,94,95,96,96,97,98,98
|
||||
db 99,99,100,100,101,101,102,102,102,102,103,103,103,103,103,103
|
||||
db 103,103,103,103,102,102,102,101,101,100,100,99,99,98,98,97
|
||||
db 96,95,94,93,92,92,90,89,88,87,86,85,84,82,81,80
|
||||
db 78,77,75,74,72,71,69,68,66,65,63,61,60,58,56,55
|
||||
db 53,51,50,48,46,45,43,42,40,38,37,35,33,32,30,29
|
||||
db 27,26,25,23,22,20,19,18,17,15,14,13,12,11,10,9
|
||||
db 8,8,7,6,5,5,4,4,3,3,3,2,2,2,2,2
|
||||
db 2,2,2,2,3,3,3,4,4,5,5,6,7,8,8,9
|
||||
db 10,11,12,14,15,16,17,19,20,21,23,24,26,27,29,31
|
||||
db 32,34,36,37,39,41,43,45,47,48,50,52,54,56,58,60
|
||||
db 62,64,66,68,70,72,74,75,77,79,81,83,85,86,88,90
|
||||
db 92,93,95,97,98,100,101,103,104,105,107,108,109,110,112,113
|
||||
db 114,115,116,116,117,118,119,119,120,120,121,121,122,122,122,122
|
||||
db 122,122,122,122,122,122,122,122,121,121,120,120,119,119,118,117
|
||||
db 116,116,115,114,113,112,111,110,109,107,106,105,104,102,101,100
|
||||
db 98,97,95,94,93,91,90,88,86,85,83,82,80,79,77,75
|
||||
db 74,72,71,69,68,66,65,63,62,60,59,57,56,54,53,52
|
||||
db 50,49,48,47,45,44,43,42,41,40,39,38,37,36,35,35
|
||||
;
|
||||
pal_R_tab db 0,0,0,1,2,3,5,7,9,12,14,17,21,24,28,32
|
||||
db 36,41,46,50,55,61,66,72,77,83,89,95,101,107,113,119
|
||||
db 125,131,138,144,150,156,162,167,173,179,184,190,195,200,205,209
|
||||
db 214,218,222,226,229,232,235,238,240,243,245,246,247,248,249,249
|
||||
db 249,249,249,248,247,245,244,242,239,237,234,231,227,224,220,216
|
||||
db 212,207,202,197,192,187,182,176,170,165,159,153,147,141,134,128
|
||||
db 122,116,110,104,98,92,86,80,74,69,63,58,53,48,43,39
|
||||
db 34,30,26,22,19,16,13,10,8,6,4,3,1,0,0,0
|
||||
db 0,0,0,1,3,4,6,8,10,13,16,19,22,26,30,34
|
||||
db 39,43,48,53,58,63,69,74,80,86,92,98,104,110,116,122
|
||||
db 128,134,141,147,153,159,165,170,176,182,187,192,197,202,207,212
|
||||
db 216,220,224,227,231,234,237,239,242,244,245,247,248,249,249,249
|
||||
db 249,249,248,247,246,245,243,240,238,235,232,229,226,222,218,214
|
||||
db 209,205,200,195,190,184,179,173,167,162,156,150,144,138,131,125
|
||||
db 119,113,107,101,95,89,83,77,72,66,61,55,50,46,41,36
|
||||
db 32,28,24,21,17,14,12,9,7,5,3,2,1,0,0,0
|
||||
;
|
||||
pal_G_tab db 125,118,112,106,100,94,88,82,76,71,65,60,55,50,45,40
|
||||
db 36,32,28,24,20,17,14,11,9,7,5,3,2,1,0,0
|
||||
db 0,0,0,1,2,3,5,7,9,12,15,18,21,25,29,33
|
||||
db 37,41,46,51,56,61,67,72,78,84,90,96,102,108,114,120
|
||||
db 126,132,138,144,150,156,162,168,174,180,185,190,195,200,205,210
|
||||
db 214,218,222,226,230,233,236,238,241,243,245,246,248,248,249,249
|
||||
db 249,249,249,248,247,245,243,241,239,236,234,230,227,223,219,215
|
||||
db 211,206,202,197,192,186,181,175,170,164,158,152,146,140,134,128
|
||||
db 121,115,109,103,97,91,85,79,74,68,63,57,52,47,43,38
|
||||
db 34,30,26,22,19,15,13,10,8,6,4,2,1,0,0,0
|
||||
db 0,0,1,1,3,4,6,8,11,13,16,19,23,27,31,35
|
||||
db 39,44,49,54,59,64,69,75,81,87,93,99,105,111,117,123
|
||||
db 129,135,141,147,153,159,165,171,177,182,188,193,198,203,208,212
|
||||
db 216,220,224,228,231,234,237,240,242,244,246,247,248,249,249,249
|
||||
db 249,249,248,247,246,244,242,240,238,235,232,229,225,221,217,213
|
||||
db 209,204,199,194,189,184,178,173,167,161,155,149,143,137,131,125
|
||||
;
|
||||
pal_B_tab db 0,0,1,3,5,8,12,16,21,27,33,39,46,54,62,70
|
||||
db 79,88,97,106,115,125,134,143,153,162,171,180,188,196,204,211
|
||||
db 218,224,230,235,240,244,248,250,252,254,254,254,254,252,250,248
|
||||
db 244,240,235,230,224,218,211,204,196,188,180,171,162,153,143,134
|
||||
db 125,115,106,97,88,79,70,62,54,46,39,33,27,21,16,12
|
||||
db 8,5,3,1,0,0,0,1,3,5,8,12,16,21,27,33
|
||||
db 39,46,54,62,70,79,88,97,106,115,125,134,143,153,162,171
|
||||
db 180,188,196,204,211,218,224,230,235,240,244,248,250,252,254,254
|
||||
db 254,254,252,250,248,244,240,235,230,224,218,211,204,196,188,180
|
||||
db 171,162,153,143,134,125,115,106,97,88,79,70,62,54,46,39
|
||||
db 33,27,21,16,12,8,5,3,1,0,0,0,1,3,5,8
|
||||
db 12,16,21,27,33,39,46,54,62,70,79,88,97,106,115,125
|
||||
db 134,143,153,162,171,180,188,196,204,211,218,224,230,235,240,244
|
||||
db 248,250,252,254,254,254,254,252,250,248,244,240,235,230,224,218
|
||||
db 211,204,196,188,180,171,162,153,143,134,125,115,106,97,88,79
|
||||
db 70,62,54,46,39,33,27,21,16,12,8,5,3,1,0,0
|
||||
|
||||
;-------------------------------------------------------------------------------------------------
|
||||
code_end nop
|
||||
SAVEBIN "plasma2.exe", code_start, code_end - code_start
|
||||
|
||||
Executable
+217
@@ -0,0 +1,217 @@
|
||||
intLibrary
|
||||
assert intLibrary >= #8000
|
||||
|
||||
INT_TABLE_HI equ #be
|
||||
INT_TABLE equ 256 * INT_TABLE_HI
|
||||
|
||||
; useLib: keybLibrary, memLibrary
|
||||
; useRam: INT_TABLE_HI
|
||||
|
||||
; export var:
|
||||
; intMode
|
||||
; intFlagPlayAyMus
|
||||
; intFlagPlayAyMusPageAdr
|
||||
|
||||
; export fn:
|
||||
; intLibInit
|
||||
; intSetGameInterrupt
|
||||
; intRestoreDefaultInterrupt
|
||||
; intWaitVsync
|
||||
|
||||
|
||||
; Векторы прерываний:
|
||||
; клавиатура - #ff
|
||||
; кадровое - #ff
|
||||
; CovoxBlaster - #ff (признак — порт #fe.bit7 = 1 и оно висит до захвата прерывания процом)
|
||||
; CTC - #06 (LSB) (висит до захвата прерывания процом)
|
||||
; возможно есть и другие - надо изучить
|
||||
|
||||
; СТС имеет 4 счётчика.
|
||||
; идея в том, что:
|
||||
; - счётчик №2 тактируется по знакоместам (1 тик = 1 знакоместо) с частотой 875 Кгц,
|
||||
; - счётчик №3 тактируется от №2.
|
||||
; эти два счётчика всегда работают в связке
|
||||
; если один счётчик заставить отсчитать 2 пиксельных линии экрана (112 знакомест),
|
||||
; а другой счётчик отсчитать 160 раз от первого, то получим одно срабатывание на 320 пиксельных линий — это полностью идентично кадровому прерыванию.
|
||||
|
||||
|
||||
; Режимы прерываний
|
||||
INT_MODE_SYS equ 0
|
||||
INT_MODE_GAME equ 1
|
||||
INT_MODE_VSYNC_HOOK equ 2
|
||||
|
||||
|
||||
; Здесь храним текущий режим прерываний
|
||||
intMode db INT_MODE_SYS
|
||||
|
||||
; Инициализация библиотеки
|
||||
; запоминаем текущее состояние регистра i
|
||||
; use: af
|
||||
intLibInit
|
||||
ld a,i
|
||||
ld (_intDefaultRegI),a
|
||||
ret
|
||||
|
||||
|
||||
; Установка прерываний игры
|
||||
; use: hl,af,i
|
||||
intSetGameInterrupt
|
||||
; Перед установкой CTC нам необходимо поймать кадровое прерывание
|
||||
; (это важно т.к. у нас некоторые циклы работают с одним экраном до прихода луча развертки)
|
||||
; Просто ei:halt не подойдет т.к. общий вектор для кадрового и клавиатурного прерываний
|
||||
; и если в данный момент будут нажаты кнопки мы поймаем прерывание от них и окажемся в случайном месте кадра
|
||||
; Делаем в несколько шагов:
|
||||
; 1. Отключаем системные прерывания чтобы не мешались
|
||||
; (т.к. они в том числе обрабатывают прерывания от клавиатуры и читают из неё данные)
|
||||
; и устанавливаем пустой обработчик прерываний
|
||||
; также сразу устанавливаем адрес обработки CTC
|
||||
di
|
||||
ld hl,_intHandlerCtc
|
||||
ld (INT_TABLE + #06),hl
|
||||
ld hl,_intHandlerNull
|
||||
ld (INT_TABLE + #ff),hl
|
||||
ld a,INT_TABLE_HI
|
||||
ld i,a
|
||||
im 2
|
||||
ld a,INT_MODE_VSYNC_HOOK
|
||||
ld (intMode),a
|
||||
; 2. Далее ждем прерываний - если есть данные от клавиатуры, то это не кадровое
|
||||
; если одновременно будет и кадровое и клавиатура - пропустим кадровое но тут нам это не страшно (дождемся следующего)
|
||||
_vSyncHookLoop
|
||||
ei
|
||||
halt
|
||||
di
|
||||
in a,(COM_A)
|
||||
bit 0,a ; проверить наличие данных от клавиатуры
|
||||
jr z,_vSyncHookSuccess ; если нет данных значит поймали кадровое
|
||||
in a,(DAT_A) ; считать байт
|
||||
jr _vSyncHookLoop
|
||||
; 3. Поймали кадровое прерывание
|
||||
; Настраиваем CTC и устанавливаем прерывания игры
|
||||
; Почему именно такие значения - надо читать доку по z84c15
|
||||
_vSyncHookSuccess
|
||||
ld a,#57 : out (CTC.Ch_2),a
|
||||
ld a,112 : out (CTC.Ch_2),a
|
||||
ld a,#d7 : out (CTC.Ch_3),a
|
||||
ld a,160 : out (CTC.Ch_3),a
|
||||
ld a,0 : out (CTC.Ch_0),a
|
||||
ld hl,_intHandlerKeybOrFrame
|
||||
ld (INT_TABLE + #ff),hl
|
||||
ld a,INT_MODE_GAME
|
||||
ld (intMode),a
|
||||
;-------
|
||||
; инициализируем CovoxBlaster
|
||||
jp soundDeviceCovoxBlasterLib.init
|
||||
|
||||
; Пустой обработчик прерываний - нужен для определения от кого прерывание (см. intSetGameInterrupt)
|
||||
; use: -
|
||||
_intHandlerNull
|
||||
di
|
||||
call _intReti
|
||||
ei: ret
|
||||
|
||||
_intReti
|
||||
ei
|
||||
reti
|
||||
|
||||
|
||||
; Восстановление прерываний
|
||||
; (обязательно делать перед использованием функций дос и биос)
|
||||
; use: af, i
|
||||
intRestoreDefaultInterrupt
|
||||
di
|
||||
ld a,1
|
||||
out (CTC.Ch_3),a
|
||||
ld a,INT_MODE_SYS
|
||||
ld (intMode),a
|
||||
ld a,#00
|
||||
_intDefaultRegI equ $-1
|
||||
ld i,a
|
||||
im 1
|
||||
ret
|
||||
|
||||
|
||||
; Обработчик "кадровых" прерываний от CTC
|
||||
; на выходе нужно именно reti если заменить на ret то прерывание от CTC больше не придет
|
||||
; use: save & restore all used regs to stack
|
||||
_intHandlerCtc
|
||||
di
|
||||
push hl,de,bc,af
|
||||
ex af,af
|
||||
push af
|
||||
;-
|
||||
ld a,1
|
||||
ld (_vsyncFlag),a ; Устанавливаем флаг что пришло кадровое прерывание
|
||||
;-
|
||||
in a,(EmmWin.P1)
|
||||
ld (_intEmmWinP1),a
|
||||
call soundLib.intHandler
|
||||
ld a,0
|
||||
_intEmmWinP1 equ $-1
|
||||
out (EmmWin.P1),a
|
||||
;---
|
||||
pop af
|
||||
ex af,af
|
||||
pop af,bc,de,hl
|
||||
call _intReti
|
||||
ei: ret
|
||||
|
||||
|
||||
; Обработчик прерываний от клавиатуры и кадровых
|
||||
; тут делаем только обработку прерываний от клавиатуры
|
||||
; use: save & restore all used regs to stack
|
||||
_intHandlerKeybOrFrame
|
||||
di
|
||||
push hl,de,bc,af
|
||||
;---
|
||||
call keybIntHandler
|
||||
;di
|
||||
;---
|
||||
call soundDeviceCovoxBlasterLib.intHandler
|
||||
;---
|
||||
pop af,bc,de,hl
|
||||
call _intReti
|
||||
ei: ret
|
||||
|
||||
; Ожидаем начало фрейма (прерывание от СТС)
|
||||
; Для этого сбрасываем (_vsyncFlag), делаем ei:halt и проверяем что дождались (_vsyncFlag)=1 - кадровое
|
||||
; use: af
|
||||
intWaitVsync
|
||||
ld a,(intMode)
|
||||
cp INT_MODE_SYS
|
||||
jr z,_intWaitVsyncSys
|
||||
;-
|
||||
xor a
|
||||
ld (_vsyncFlag),a
|
||||
;-
|
||||
if DEBUG_BORDER = 1
|
||||
xor a: out(#fe),a
|
||||
endif
|
||||
;-
|
||||
_intWaitVsyncLoop
|
||||
ei
|
||||
halt
|
||||
;-
|
||||
ld a,0
|
||||
_vsyncFlag equ $-1
|
||||
and a
|
||||
jr z,_intWaitVsyncLoop
|
||||
;-
|
||||
if DEBUG_BORDER = 1
|
||||
ld a,2: out(#fe),a
|
||||
endif
|
||||
;-
|
||||
ret
|
||||
; Ожидаем начало фрейма в режиме системных прерываний (ei:halt)
|
||||
; можем поймать прерывание от клавиатуры вместо кадрового
|
||||
; Наверное надо бы запретить вызывать intWaitVsync при системных прерываниях, например так:
|
||||
; if DEBUG_IS_ON = 1
|
||||
; ld hl,txtErrorIntWaitVsync
|
||||
; jp debugShowError
|
||||
; endif
|
||||
; txtErrorIntWaitVsync db "ERROR: Call IntWaitVsync with system int", #00
|
||||
_intWaitVsyncSys
|
||||
call memCacheOffTemporary ;временно выключаем fastRam
|
||||
ei
|
||||
halt
|
||||
jp memCacheRestoryState ;восстанавливаем состояние подключения fastRam
|
||||
Executable
+140
@@ -0,0 +1,140 @@
|
||||
; Библиотека работы с клавиатурой
|
||||
keybLibrary
|
||||
|
||||
COM_A EQU 19h
|
||||
DAT_A EQU 18h
|
||||
|
||||
;From z84c15 SIO instruction
|
||||
;COM_A Read
|
||||
;d0 - Rx Character available
|
||||
;d1 - Int panding (Ch.A only)
|
||||
;d2 - Tx buffer empty
|
||||
;d3 - DCD
|
||||
;d4 - Syan/Hunt
|
||||
;d5 - CTS
|
||||
;d6 - Tx Under.../ EOM
|
||||
;d7 - Break/Abort
|
||||
;Note: d3-d7 used with "External Status Interrupt" Modes
|
||||
|
||||
; Установка портов режима
|
||||
; в соответствии с описанием
|
||||
; последовательного порта z84c15
|
||||
; use: a
|
||||
keybLibInit
|
||||
ld a,#00
|
||||
out (COM_A),a
|
||||
ld a,#01
|
||||
out (COM_A),a
|
||||
ld a,#00
|
||||
out (COM_A),a
|
||||
ld a,#03
|
||||
out (COM_A),a
|
||||
ld a,#c1
|
||||
out (COM_A),a
|
||||
ld a,#04
|
||||
out (COM_A),a
|
||||
ld a,#05
|
||||
out (COM_A),a
|
||||
ld a,#05
|
||||
out (COM_A),a
|
||||
ld a,#62
|
||||
out (COM_A),a
|
||||
ret
|
||||
|
||||
|
||||
; Считывание с клавиатуры пр прерываниям
|
||||
; use: hl,de,af
|
||||
keybIntHandler
|
||||
ld hl,keybBufferSize
|
||||
ld de,(_keybBufferPosWrite)
|
||||
_keybIntHandlerLoop
|
||||
in a,(COM_A)
|
||||
bit 0,a ; проверить наличие байта
|
||||
ret z ; вернуться, если нет байта
|
||||
in a,(DAT_A) ; считать байт
|
||||
ld (de),a
|
||||
inc e
|
||||
ld (_keybBufferPosWrite),de
|
||||
inc (hl)
|
||||
jp _keybIntHandlerLoop
|
||||
|
||||
|
||||
; Очистка буфера
|
||||
; use: hl,af
|
||||
keybClearBuff
|
||||
di
|
||||
xor a
|
||||
ld (keybBufferSize),a
|
||||
ld hl,keybBuffer
|
||||
ld (keybBufferPosRead),hl
|
||||
ld (_keybBufferPosWrite),hl
|
||||
_keybClearBuffLoop
|
||||
in a,(COM_A)
|
||||
bit 0,a ; проверить наличие байта
|
||||
ret z ; вернуться, если нет байта
|
||||
in a,(DAT_A) ; считать байт
|
||||
jp _keybClearBuffLoop
|
||||
|
||||
|
||||
; Читаем и декодируем данные из буфера
|
||||
; use: hl,de,af
|
||||
; ret:
|
||||
; a - code (0 if no data)
|
||||
; carry=1 if release =0 if presseed
|
||||
keybGetKey
|
||||
ld hl,keybBufferSize
|
||||
ld de,(keybBufferPosRead)
|
||||
ld a,(hl)
|
||||
ld b,a
|
||||
or a
|
||||
ret z
|
||||
ld a,(de): inc e
|
||||
cp #f0
|
||||
jr z,keybGetKeyF0; release
|
||||
cp #e0
|
||||
jr z,keybGetKeyE0; prefix E0
|
||||
ld (keybBufferPosRead),de: dec (hl)
|
||||
keybGetKeyHasKeyPressed
|
||||
and a
|
||||
keybGetKeyHasKey
|
||||
ld h,#40
|
||||
ld l,a
|
||||
ld a,(hl)
|
||||
ret
|
||||
keybGetKeyF0; release
|
||||
dec (hl)
|
||||
jr z,keybGetKeyNoData
|
||||
ld a,(de): inc e
|
||||
ld (keybBufferPosRead),de: dec (hl)
|
||||
scf
|
||||
jr keybGetKeyHasKey
|
||||
keybGetKeyE0; prefix E0
|
||||
dec (hl)
|
||||
jr z,keybGetKeyNoData
|
||||
ld a,(de): inc e
|
||||
cp #f0
|
||||
jr z,keybGetKeyE0F0; prefix E0, release
|
||||
ld (keybBufferPosRead),de: dec (hl)
|
||||
add a,#80
|
||||
jr keybGetKeyHasKeyPressed
|
||||
keybGetKeyE0F0; prefix E0,release
|
||||
dec (hl)
|
||||
jr z,keybGetKeyNoData2
|
||||
ld a,(de): inc e
|
||||
ld (keybBufferPosRead),de: dec (hl)
|
||||
add a,#80
|
||||
scf
|
||||
jr keybGetKeyHasKey
|
||||
keybGetKeyNoData2
|
||||
inc (hl)
|
||||
keybGetKeyNoData
|
||||
inc (hl)
|
||||
xor a
|
||||
ret
|
||||
|
||||
keybBufferSize db 0
|
||||
keybBufferPosRead dw keybBuffer
|
||||
_keybBufferPosWrite dw keybBuffer
|
||||
|
||||
align 256
|
||||
keybBuffer ds 256,0
|
||||
Executable
+170
@@ -0,0 +1,170 @@
|
||||
Interrupt_Vector: EQU 0BE00h; Вектор прерываний
|
||||
|
||||
...
|
||||
|
||||
DI
|
||||
LD A, I
|
||||
LD (.SaveInterrupt), A
|
||||
LD A, HIGH Interrupt_Vector
|
||||
LD I, A
|
||||
IM 2
|
||||
|
||||
; Заполним буфер "тишины" для CBL
|
||||
LD A, 080h
|
||||
LD HL, BufNoSound
|
||||
LD DE, BufNoSound + 1
|
||||
LD BC, 128 ; для 16 бит 256
|
||||
LD (HL), A
|
||||
LDIR
|
||||
|
||||
; Прерывание от CBL
|
||||
LD HL, IM2_CBL
|
||||
LD (Interrupt_Vector OR 0FFh), HL
|
||||
|
||||
; Установим в CBL тишину
|
||||
LD A, 2
|
||||
LD (IM2_CBL.NumberPage), A
|
||||
|
||||
...
|
||||
|
||||
EI
|
||||
|
||||
; Включим CBL
|
||||
LD BC, 004Eh
|
||||
LD A, 10011000b ; COVOX-Blaster + Interrupt + 7.8125 KHz
|
||||
OUT (C), A
|
||||
|
||||
...
|
||||
|
||||
LD A, ...
|
||||
LD HL, ...
|
||||
LD BC, ...
|
||||
CALL PlaySound
|
||||
|
||||
...
|
||||
|
||||
; Ожидаем завершения воспроизведения CBL
|
||||
.LoopEndSound:
|
||||
HALT
|
||||
LD A, (IM2_CBL.NumberPage)
|
||||
OR A
|
||||
JR NZ, .LoopEndSound
|
||||
|
||||
; Выключим CBL
|
||||
LD BC, 004Eh
|
||||
XOR A
|
||||
OUT (C), A
|
||||
|
||||
...
|
||||
|
||||
DI
|
||||
|
||||
; Восстановим вектор прерывания
|
||||
.SaveInterrupt+*: LD A, 0
|
||||
LD I, A
|
||||
IM 1
|
||||
EI
|
||||
|
||||
.Exit:
|
||||
LD C, DSS.Exit
|
||||
RST 10h
|
||||
JR $
|
||||
|
||||
BufNoSound: DS 128
|
||||
|
||||
; Проиграть звук
|
||||
; A - Номер страницы с данными для воспроизведения
|
||||
; HL - Адрес начала данных для воспроизведения в 1й странице (4000h..7FFFh)
|
||||
; BC - Длина данных для воспроизведения, должна должны быть кратна 128 байтам
|
||||
PlaySound:
|
||||
PUSH AF, HL
|
||||
; Если нужно ожидать завершение предыдущего воспроизведения, то раскомментировать
|
||||
; LD A, (IM2_CBL.NumberPage)
|
||||
; OR A
|
||||
; JR NZ, .Exit
|
||||
LD (IM2_CBL.NumberPage), A
|
||||
LD (IM2_CBL.AddrSound), HL
|
||||
LD (IM2_CBL.Length), BC
|
||||
.Exit:
|
||||
POP HL, AF
|
||||
RET
|
||||
|
||||
|
||||
IM2_CBL:
|
||||
DI
|
||||
PUSH AF
|
||||
IN A, (0FEh)
|
||||
RLCA
|
||||
JR NC, .NoSound ; Если прерывание не от CBL
|
||||
.NumberPage+*: LD A, 0
|
||||
OR A
|
||||
JR Z, .NoSound ; Если нечего играть
|
||||
PUSH BC, DE, HL
|
||||
CP 3
|
||||
JR NC, .PlaySound
|
||||
DEC A
|
||||
LD (.NumberPage), A
|
||||
|
||||
;SaveAndSetPage1 .Save_Page_1, (Pages.Data)
|
||||
IN A, (PAGE_1)
|
||||
LD (.Save_Page_1), A
|
||||
LD A,(Pages.Data)
|
||||
OUT (PAGE_1), A
|
||||
|
||||
LD HL, BufNoSound
|
||||
JR .CopyData
|
||||
|
||||
.PlaySound:
|
||||
LD D, A
|
||||
;SaveAndSetPage1 .Save_Page_1, D
|
||||
IN A, (PAGE_1)
|
||||
LD (.Save_Page_1), A
|
||||
LD A, D
|
||||
OUT (PAGE_1), A
|
||||
.AddrSound+*: LD HL, 0
|
||||
.CopyData:
|
||||
IN A, (PAGE_3)
|
||||
LD (.Save_Page_3), A
|
||||
LD A, 0FDh
|
||||
OUT (PAGE_3), A
|
||||
|
||||
LD DE, 0C000h
|
||||
; Запись данных с помощью акселератора
|
||||
LD B, E
|
||||
LD D, D ; ACC_On_NoDI
|
||||
LD C, 128 ; BC = 128 байт
|
||||
LD L, L; ACC_CopyBlock_Horizontal
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
LD B, B; ACC_Off_NoEI
|
||||
|
||||
;; Запись данных через порт 4Fh
|
||||
; PUSH BC, HL
|
||||
; LD BC, 804Fh
|
||||
; OTIR
|
||||
; POP HL, BC
|
||||
|
||||
ADD HL, BC
|
||||
LD (.AddrSound), HL
|
||||
OR A
|
||||
.Length+*: LD HL, 0
|
||||
SBC HL, BC
|
||||
JR NZ, .NotEndSound
|
||||
LD A, 2
|
||||
LD (.NumberPage), A
|
||||
LD HL, 512 ; Такая длина, чтобы не было рекурсии
|
||||
.NotEndSound:
|
||||
LD (.Length), HL
|
||||
|
||||
.Exit:
|
||||
.Save_Page_1+*: LD A, 0
|
||||
OUT (PAGE_1), A
|
||||
.Save_Page_3+*: LD A, 0
|
||||
OUT (PAGE_3), A
|
||||
|
||||
POP HL, DE, BC
|
||||
.NoSound:
|
||||
POP AF
|
||||
EI
|
||||
RETI
|
||||
|
||||
Reference in New Issue
Block a user