device pentagon1024
include "target.asm"
ifdef EVO
display "EVO version"
MEM_SLOT0=#37f7
MEM_SLOT1=#77f7
MEM_SLOT2=#b7f7
MEM_SLOT3=#f7f7
INVMASK=#ff
else
display "ATM version"
MEM_SLOT0=#3ff7
MEM_SLOT1=#7ff7
MEM_SLOT2=#bff7
MEM_SLOT3=#fff7
INVMASK=#7f
endif
ifdef DOS
display "DOS support"
endif
SCR_PAGE1=(1^INVMASK)
SCR_PAGE3=(3^INVMASK)
SCR_PAGE5=(5^INVMASK)
SCR_PAGE7=(7^INVMASK)
SPBUF_PAGE0=(8^INVMASK)
SPBUF_PAGE1=(9^INVMASK)
SPBUF_PAGE2=(10^INVMASK)
SPBUF_PAGE3=(11^INVMASK)
SPTBL_PAGE=(6^INVMASK)
CC_PAGE0=(12^INVMASK)
CC_PAGE1=(13^INVMASK)
CC_PAGE2=(14^INVMASK)
SND_PAGE=(0^INVMASK)
PAL_PAGE=(4^INVMASK)
GFX_PAGE=(16^INVMASK)
IMG_LIST =#1000
;ёьх∙хэш т SND_PAGE
AFX_INIT =#4000
AFX_PLAY =#4003
AFX_FRAME=#4006
PT3_INIT =#4009
PT3_FRAME=#400c
PT3_MUTE =#400f ;NEW for TFM
TURBOFMON=#4012 ;NEW for TFM
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
ifdef DOS
call DOS_swapsys
endif ;DOS
ifdef TFM
;юўшёЄър ¤ъЁрэр
ld a,SCR_PAGE1
call clearPage
ld a,SCR_PAGE3
call clearPage
ld a,SCR_PAGE5
call clearPage
ld a,SCR_PAGE7
call clearPage
ld a,SND_PAGE
ld bc,MEM_SLOT1
out (c),a
;юяЁхфхыхэшх TFM
LD BC,#FFFD
LD A,%11111000
OUT (C),A
ld d,b
dec d
jr nz,$-1
XOR A
OUT (C),A
dec d
jr nz,$-1
LD B,#BF
OUT (C),B
dec d
jr nz,$-1
inc a
LD B,#FF
INF
JP P,tfmpresent ;a!=0
ld a,#c9 ;ret
ld (libstartup_waitstatus),a
xor a
tfmpresent
ld (TURBOFMON),a
else ;~tfm
;юяЁхфхыхэшх 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
endif
;шэшЎшрышчрЎш чтєъют√ї ¤ЇЇхъЄют, хёыш юэш хёЄ№
ld a,SND_PAGE
call setSlot1
;яюўхьє-Єю эх т√ёЄрты хЄё ъюышўхёЄтю ¤ЇЇхъЄют
;ld a,(SFX_COUNT)
;or a
;jr z,.noSfx
ld hl,SFX_DATA
call AFX_INIT
.noSfx
;ifndef TFM
xor a
call reset_ay_ay
inc a
call reset_ay_ay
;endif
;єёЄрэютър яхЁхьхээ√ї
ld a,SCR_PAGE1
ld (_screenActive),a
call poll_mouse_delta
;єёЄрэютър юсЁрсюЄўшър яЁхЁ√трэшщ
ld a,im2vector/256
ld i,a
im 2
ei
ifndef TFM
;ур°хэшх ¤ъЁрэр
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,SCR_PAGE1
call clearPage
ld a,SCR_PAGE3
call clearPage
ld a,SCR_PAGE5
call clearPage
ld a,SCR_PAGE7
call clearPage
endif
;Ёхцшь 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
_dos_3D13
ifdef DOS
DOS_3D13
;a,bc,de,hl=parameters for #3D13
;a'=page for slot 2
;----------------
ld a,(_memSlot2)
push af
;----------------
;a,bc,de,hl=parameters for #3D13
;a'=page for slot 2
push af
push bc
push de
push hl
ld bc,#bd77
ld a,%10101011 ;6912
out (c),a ;shadow ports on
ld a,#7f-#05
call setSlot1
call DOS_swapsys
di
im 1
ld a,#83 ;48K switchable to DOS
call setSlot0
ex af,af'
call setSlot2
ex af,af'
ld bc,#ff77
ld a,%10101011 ;6912
out (c),a ;shadow ports off
ei ;im 1
pop hl
pop de
pop bc
pop af
ld (dos_sp),sp
ld sp,#6000
ld iy,23610
call #3d13
dos_sp equ $+1
ld sp,0
push af
push bc
push de
push hl
ld bc,#bd77
ld a,%10101011 ;6912
call DOS_outshad ;shadow ports on
di
ld a,CC_PAGE0
call setSlot0
call DOS_swapsys
ld a,CC_PAGE2
call setSlot2
ld a,CC_PAGE1
call setSlot1
ld bc,#bd77
ld a,%10101000 ;EGA
out (c),a ;shadow ports on
im 2
ei
pop hl
pop de
pop bc
pop af
;----------------
pop af
ld (_memSlot2),a
ld bc,MEM_SLOT2
out (c),a
;----------------
ret
DOS_outshad
ld hl,#2a53
push hl
jp #3d2f
DOS_swapsys
ld bc,MEM_SLOT2
ld a,PAL_PAGE
out (c),a
ld hl,#5c00
ld de,#bc00
ld b,4
DOS_swap0
ld c,(hl)
ld a,(de)
ld (hl),a
ld a,c
ld (de),a
inc de
inc l
jr nz,DOS_swap0
inc h
djnz DOS_swap0
ret
endif ;DOS
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
ifdef DOS
ldir
ret
else
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
endif ;~TFM
_clear_screen
;-------------------------
ld e,a
ld a,(_memSlot2)
push af
ld a,e
;-------------------------
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
;----------------
pop af
ld (_memSlot2),a
ld bc,MEM_SLOT2
out (c),a
;----------------
ret
_swap_screen
push ix
push iy
ld a,(_memSlot2)
push af
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 a,#10
bit 1,e
jr z,$+4
or #08
ld bc,#7ffd
out (c),a
pop af
jr z,.noSpr1
call setShadowScreen
call respr
call updateTilesFromBuffer
MRestoreMemMap012
.noSpr1
pop af
ld (_memSlot2),a
ld bc,MEM_SLOT2
out (c),a
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
;-------------------------
ld e,a
ld a,(_memSlot2)
push af
ld a,e
;-------------------------
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
;----------------
pop af
ld (_memSlot2),a
ld bc,MEM_SLOT2
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
ifdef TFM
call turbo_off
endif
ld a,(musicPage)
or a
jr z,.noMusic
ld bc,MEM_SLOT2
out (c),a
ld bc,#fffd
ifdef TFM
ld a,%11111000 ;тЄюЁющ ўшя Turbo FM
else
ld a,#fe ;тЄюЁющ ўшя Turbo Sound
endif
;хёыш Turbo Sound эхЄ, чтєъш ш ьєч√ър
out (c),a ;шуЁр■Є эр юфэюь ўшях, шэрўх эр Ёрчэ√ї
ifdef TFM
ld a,(TURBOFMON)
or a
call nz,PT3_FRAME
else
call PT3_FRAME
endif
ifdef TFM
;jr .sfx ;wrong TS detection on TFM?
else
ld a,(turboSound)
or a
jr z,.sfx
endif
.noMusic
ifdef TFM
;ld a,(TURBOFMON)
;or a
;call nz,PT3_MUTE ;reset_ay
ld a,1
call reset_ay_ay
else
ld a,1
call reset_ay
endif
.sfx
ifdef TFM
ld bc,#fffd
ld a,%11111001 ;1-щ ўшя Turbo FM
;ld a,%11111011 ;1-щ ўшя Turbo FM, no wait sync
out (c),a
else
ld bc,#fffd ;яхЁт√щ ўшя
out (c),b
endif
call AFX_FRAME
ifdef TFM
call turbo_on
endif
poll_mouse
;call poll_joystick ;эхы№ч т яЁхЁ√трэшш, Є.ъ. эєцэю чэрЄ№ ёюфхЁцшьюх MEM_SLOT0
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
ifdef TFM
libstartup_waitstatus
;bc=#fffd
IN F,(C)
JP M,$-2
ret
endif
;ЄрсышЎ√
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
ld (_memSlot0),a
ld bc,MEM_SLOT0
out (c),a
ret
setSlot1
ld (_memSlot1),a
ld bc,MEM_SLOT1
out (c),a
ret
setSlot2
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
ifdef TFM
;turboFM db 0 ;!=0 хёыш хёЄ№ TFM
else
turboSound db 0 ;!=0 хёыш хёЄ№ TS
endif
;¤ъёяюЁЄшЁєхь√х яхЁхьхээ√х
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 _dos_3D13
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
export setTileUpdateMapF
export setTileUpdateMap
end
display "Size ",/d,end-begin," bytes"
savebin "startup.bin",begin,end-begin