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:
2026-06-03 16:13:21 +03:00
parent f542608b3f
commit c71e249a4e
404 changed files with 75155 additions and 58 deletions
+515
View File
@@ -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
+921
View File
@@ -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]
+308
View File
@@ -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
+226
View File
@@ -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.
+194
View File
@@ -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:
+1
View File
@@ -0,0 +1 @@
z80asm.exe -f bin main.z80 -o a_print.exe
+180
View File
@@ -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
+79
View File
@@ -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.
+82
View File
@@ -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 или на спринтер форуме.
+89
View File
@@ -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
+295
View File
@@ -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
+521
View File
@@ -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
+19
View File
@@ -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.
+134
View File
@@ -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
+550
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
This program for Sprinter computer!
+447
View File
@@ -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
+156
View File
@@ -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.
+822
View File
@@ -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
+591
View File
@@ -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â - ®âª«î祭­®¥ á®áâ®ï­¨¥.<<
;
+169
View File
@@ -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
+113
View File
@@ -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
+212
View File
@@ -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
+217
View File
@@ -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
+140
View File
@@ -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
+170
View File
@@ -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