device pentagon1024
MEM_SLOT0=#37f7
MEM_SLOT1=#77f7
MEM_SLOT2=#b7f7
MEM_SLOT3=#f7f7
SPBUF_PAGE0=8
SPBUF_PAGE1=9
SPBUF_PAGE2=10
SPBUF_PAGE3=11
SPTBL_PAGE=6
CC_PAGE0=12
CC_PAGE1=13
CC_PAGE2=14
SND_PAGE=0
PAL_PAGE=4
GFX_PAGE=16
SCR_PAGE1=1
SCR_PAGE3=3
SCR_PAGE5=5
SCR_PAGE7=7
AFX_INIT =#4000
AFX_PLAY =#4003
AFX_FRAME=#4006
PT3_INIT =#4009
PT3_FRAME=#400c
IMG_LIST =#1000
;ёьх∙хэш т SND_PAGE
MUS_COUNT=#49fe
SMP_COUNT=#49ff
SFX_COUNT=#5000
MUS_LIST =#4a00
SMP_LIST =#4d00
SFX_DATA =#5100
macro MDebug color
push af
ld a,color
out (#fe),a
pop af
endm
macro MSetShadowScreen
ld a,(_screenActive)
ld bc,MEM_SLOT1
ld (_memSlot1),a
out (c),a
ld b,high MEM_SLOT2
sub 4
ld (_memSlot2),a
out (c),a
endm
macro MRestoreMemMap012
ld bc,MEM_SLOT0
ld a,~CC_PAGE0
out (c),a
ld b,high MEM_SLOT1
ld a,~CC_PAGE1
ld (_memSlot1),a
out (c),a
ld b,high MEM_SLOT2
ld a,~CC_PAGE2
ld (_memSlot2),a
out (c),a
endm
macro MRestoreMemMap12
ld bc,MEM_SLOT1
ld a,~CC_PAGE1
ld (_memSlot1),a
out (c),a
ld b,high MEM_SLOT2
ld a,~CC_PAGE2
ld (_memSlot2),a
out (c),a
endm
org #e000
begin
di
ld sp,begin-1
;юяЁхфхыхэшх TS
ld bc,#fffd ;ўшя 0
out (c),b
xor a ;ЁхушёЄЁ 0
out (c),a
ld b,#bf ;чэрўхэшх #bf
out (c),b
ld b,#ff ;ўшя 1
ld a,#fe
out (c),a
xor a ;ЁхушёЄЁ 0
out (c),a
ld b,#bf ;чэрўхэшх 0
out (c),a
ld b,#ff ;ўшя 0
out (c),b
xor a ;ЁхушёЄЁ 0
out (c),a
in a,(c)
ld (turboSound),a
;шэшЎшрышчрЎш чтєъют√ї ¤ЇЇхъЄют, хёыш юэш хёЄ№
ld a,SND_PAGE
call setSlot1
ld a,(SFX_COUNT)
or a
jr z,.noSfx
ld hl,SFX_DATA
call AFX_INIT
.noSfx
xor a
call reset_ay
inc a
call reset_ay
;єёЄрэютър яхЁхьхээ√ї
ld a,~1
ld (_screenActive),a
call poll_mouse_delta
;єёЄрэютър юсЁрсюЄўшър яЁхЁ√трэшщ
ld a,im2vector/256
ld i,a
im 2
ei
;ур°хэшх ¤ъЁрэр
halt
LD A,%10101011 ;ЁрчЁх°хэшх ярышЄЁ√
ld bc,#bd77
out (c),a
ld a,2
.fade0
halt
halt
push af
call _pal_bright
pop af
dec a
cp 255
jr nz,.fade0
;юўшёЄър ¤ъЁрэр
ld a,1
call clearPage
ld a,3
call clearPage
ld a,5
call clearPage
ld a,7
call clearPage
;Ёхцшь EGA ё ярышЄЁющ
halt
LD A,%10101000
ld bc,#bd77
out (c),a
call _swap_screen
;єёЄрэютър эюЁьры№эющ ЁъюёЄш
ld hl,3<<6
ld (_palBright),hl
ld a,1
ld (_palChange),a
halt
;єёЄрэютър ърЁЄ√ ярь Єш фы т√яюыэхэш ъюфр
;ёЄЁрэшЎр т тхЁїэхь юъэх эх ьхэ хЄё , тёхуфр 11
ld a,CC_PAGE0
call setSlot0
ld a,CC_PAGE1
call setSlot1
ld a,CC_PAGE2
call setSlot2
jp 0
setActiveScreen
ld a,(_screenActive)
xor 2
ld bc,MEM_SLOT1
ld (_memSlot1),a
out (c),a
ld b,high MEM_SLOT2
sub 4
ld (_memSlot2),a
out (c),a
ret
setShadowScreen
MSetShadowScreen
ret
;сюыхх с√ёЄЁр тхЁёш ldir, ¤ЇЇхъЄштэр яЁш bc>12
;шч ёЄрЄ№ш эр MSX Assembly Page
;т юЄышўшх юЄ эюЁьры№эюую ldir яюЁЄшЄ A ш Їыруш
_fast_ldir
xor a
sub c
and 63
add a,a
ld (.jump),a
.jump=$+1
jr nz,.loop
.loop
dup 64
ldi
edup
jp pe,.loop
ret
_clear_screen
and 15
ld l,a
ld h,high colorMaskTable
ld e,(hl)
call setShadowScreen
ld hl,#4000
ld (hl),e
ld de,#4001
ld bc,#7fff
call _fast_ldir
MRestoreMemMap12
ret
_swap_screen
push ix
push iy
ld a,(spritesActive)
or a
push af
jr z,.noSpr0
call setShadowScreen
call updateTilesToBuffer
call prspr
.noSpr0
halt
ld a,(_screenActive)
xor 2
ld (_screenActive),a
ld e,a
ld bc,#0bbe
in a,(c)
bit 1,e
ld d,0
jr z,$+4
ld d,8
and ~8
or d
ld bc,#7ffd
out (c),a
pop af
jr z,.noSpr1
call setShadowScreen
call respr
call updateTilesFromBuffer
MRestoreMemMap012
.noSpr1
pop iy
pop ix
ret
pal_get_address
ld h,0
ld l,a
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ld bc,MEM_SLOT0
ld a,~PAL_PAGE
out (c),a
ret
_pal_select
call pal_get_address
ld de,_palette
ld bc,16
ldir
ld a,d
ld (_palChange),a
ld bc,MEM_SLOT0
ld a,~CC_PAGE0
out (c),a
ret
_pal_bright
cp 7
jr c,.l1
ld a,6
.l1
ld h,a
ld l,0
srl h
rr l
srl h
rr l
ld (_palBright),hl
ld a,1
ld (_palChange),a
ret
_pal_copy
push de
call pal_get_address
ld de,palTemp
ld bc,16
ldir
ld bc,MEM_SLOT0
ld a,~CC_PAGE0
out (c),a
pop de
ld hl,palTemp
ld bc,16
ldir
ret
include "lib_input.asm"
include "lib_sound.asm"
include "lib_tiles.asm"
include "lib_sprites.asm"
im2handler
push af
push bc
push de
push hl
push ix
push iy
exa
exx
push af
push bc
push de
push hl
ld a,(_palChange)
or a
jp z,.noPalette
;шчьхэхэшх ярышЄЁ√
ld de,(_palBright)
ld a,d
add a,high palBrightTable
ld b,a
ld hl,_palette
.colId=0
dup 8
ld a,.colId
out (#fe),a
ld a,(hl)
add a,e
ld c,a
ld a,(bc)
out (#ff),a
inc l
.colId=.colId+1
edup
.colId=0
dup 8
ld a,.colId
out (#f6),a
ld a,(hl)
add a,e
ld c,a
ld a,(bc)
out (#ff),a
inc l
.colId=.colId+1
edup
;тюёёЄрэютыхэшх ЎтхЄр сюЁф■Ёр
ld a,(_borderCol)
ld c,a
and 7
bit 3,c
jr nz,.bright
out (#fe),a
jr .palSet
.bright
out (#f6),a
.palSet
xor a
ld (_palChange),a
.noPalette
ld a,~SND_PAGE
ld bc,MEM_SLOT1
out (c),a
ld a,(musicPage)
or a
jr z,.noMusic
ld bc,MEM_SLOT2
out (c),a
ld bc,#fffd ;тЄюЁющ ўшя Turbo Sound
ld a,#fe ;хёыш Turbo Sound эхЄ, чтєъш ш ьєч√ър
out (c),a ;шуЁр■Є эр юфэюь ўшях, шэрўх эр Ёрчэ√ї
call PT3_FRAME
ld a,(turboSound)
or a
jr z,.sfx
.noMusic
ld a,1
call reset_ay
.sfx
ld bc,#fffd ;яхЁт√щ ўшя
out (c),b
call AFX_FRAME
poll_mouse
ld a,(_memSlot1)
ld bc,MEM_SLOT1
out (c),a
ld a,(_memSlot2)
ld bc,MEM_SLOT2
out (c),a
;ёў╕Єўшъ ърфЁют
ld hl,_time
ld b,4
.time1
inc (hl)
jr nz,.time2
inc hl
djnz .time1
.time2
pop hl
pop de
pop bc
pop af
exx
exa
pop iy
pop ix
pop hl
pop de
pop bc
pop af
ei
ret
;ЄрсышЎ√
align 256
palBrightTable
db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff ;bright 0
db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f ;bright 1
db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
db #df,#df,#df,#9f,#df,#df,#df,#9f,#df,#df,#df,#9f,#5f,#5f,#5f,#1f
db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed ;bright 2
db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed
db #df,#df,#9f,#dd,#df,#df,#9f,#dd,#5f,#5f,#1f,#5d,#cf,#cf,#8f,#cd
db #fe,#fe,#be,#fc,#fe,#fe,#be,#fc,#7e,#7e,#3e,#7c,#ee,#ee,#ae,#ec
db #ff,#bf,#fd,#bd,#7f,#3f,#7d,#3d,#ef,#af,#ed,#ad,#6f,#2f,#6d,#2d ;bright 3
db #df,#9f,#dd,#9d,#5f,#1f,#5d,#1d,#cf,#8f,#cd,#8d,#4f,#0f,#4d,#0d
db #fe,#be,#fc,#bc,#7e,#3e,#7c,#3c,#ee,#ae,#ec,#ac,#6e,#2e,#6c,#2c
db #de,#9e,#dc,#9c,#5e,#1e,#5c,#1c,#ce,#8e,#cc,#8c,#4e,#0e,#4c,#0c
db #1f,#5d,#1d,#1d,#8f,#cd,#8d,#8d,#0f,#4d,#0d,#0d,#0f,#4d,#0d,#0d ;bright 4
db #3e,#7c,#3c,#3c,#ae,#ec,#ac,#ac,#2e,#6c,#2c,#2c,#2e,#6c,#2c,#2c
db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
db #ec,#ac,#ac,#ac,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c ;bright 5
db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c ;bright 6
db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
align 256 ;#nn00
scrTable
adr=#4000
dup 25
db low adr
adr=adr+(40*8)
edup
align 32 ;#nn20
adr=#4000
dup 25
db high adr
adr=adr+(40*8)
edup
setSlot0
cpl
ld (_memSlot0),a
ld bc,MEM_SLOT0
out (c),a
ret
setSlot1
cpl
ld (_memSlot1),a
ld bc,MEM_SLOT1
out (c),a
ret
setSlot2
cpl
ld (_memSlot2),a
ld bc,MEM_SLOT2
out (c),a
ret
clearPage
call setSlot1
ld hl,#4000
ld de,#4001
ld bc,#3fff
ld (hl),l
jp _fast_ldir
align 256 ;#nn00
tileUpdateXTable
dup 8
db #01,#02,#04,#08,#10,#20,#40,#80
edup
.x=0
dup 64
db .x>>3
.x=.x+1
edup
align 256 ;#nn00
colorMaskTable
db #00,#09,#12,#1b,#24,#2d,#36,#3f ;фы фтєї яшъёхыхщ
db #c0,#c9,#d2,#db,#e4,#ed,#f6,#ff
db #00,#01,#02,#03,#04,#05,#06,#07 ;фы ink
db #40,#41,#42,#43,#44,#45,#46,#47
ds 16,0
db #00,#08,#10,#18,#20,#28,#30,#38 ;фы paper
db #80,#88,#90,#98,#a0,#a8,#b0,#b8
align 256
_sprqueue
_sprqueue0 ;ЇюЁьрЄ 4 срщЄр эр ёяЁрщЄ, idh,idl,y,x (idh=255 ъюэхЎ ёяшёър)
ds 256,255
_sprqueue1
ds 256,255
display "Top ",/h,$," (should be <=0xFD00)"
org #fd00
tileUpdateMap ;сшЄютр ърЁЄр юсэютшт°шїё чэръюьхёЄ, 64x25 сшЄ
ds 8*25,0
org #fdfd
jp im2handler
org #fe00
im2vector
ds 257,#fd
;яхЁхьхээ√х
musicPage db 0
tileOffset dw 0
spritesActive db 0 ;1 хёыш т√тюф ёяЁрщЄют ЁрчЁх°╕э
tileUpdate db 0 ;1 хёыш т√тюфшышё№ Єрщы√, фы ёшёЄхь√ юсэютыхэш Їюэр яюф ёяЁрщЄрьш
palTemp ds 16,0
keysPrevState ds 40,0
turboSound db 0 ;1 хёыш хёЄ№ TS
;¤ъёяюЁЄшЁєхь√х яхЁхьхээ√х
macro rgb222 b2,g2,r2
db (((r2&3)<<4)|((g2&3)<<2)|(b2&3))
endm
align 16
_palette
rgb222(0,0,0)
rgb222(0,0,2)
rgb222(2,0,0)
rgb222(2,0,2)
rgb222(0,2,0)
rgb222(0,2,2)
rgb222(2,2,0)
rgb222(2,2,2)
rgb222(0,0,0)
rgb222(0,0,3)
rgb222(3,0,0)
rgb222(3,0,3)
rgb222(0,3,0)
rgb222(0,3,3)
rgb222(3,3,0)
rgb222(3,3,3)
_memSlot0 db 0
_memSlot1 db 0
_memSlot2 db 0
_borderCol db 0
_palBright dw 3<<6
_palChange db 1
_screenActive db 0 ;~1 шыш ~3
_mouse_dx db 0
_mouse_dy db 0
_mouse_x db 80
_mouse_y db 100
_mouse_cx1 db 0
_mouse_cx2 db 160
_mouse_cy1 db 0
_mouse_cy2 db 200
_mouse_btn db 0
_mouse_prev_dx db 0
_mouse_prev_dy db 0
_time dd 0
export _palette
export _memSlot0
export _memSlot1
export _memSlot2
export _borderCol
export _palBright
export _palChange
export _sprqueue
export _screenActive
export _mouse_dx
export _mouse_dy
export _mouse_x
export _mouse_y
export _mouse_cx1
export _mouse_cx2
export _mouse_cy1
export _mouse_cy2
export _mouse_btn
export _time
;¤ъёяюЁЄшЁєхь√х ЇєэъЎшш
export _pal_select
export _pal_copy
export _pal_bright
export _swap_screen
export _clear_screen
export _fast_ldir
end
display "Size ",/d,end-begin," bytes"
savebin "startup.bin",begin,end-begin