Login

Subversion Repositories NedoOS

Rev

Rev 882 | Rev 1965 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

        DEVICE ZXSPECTRUM128
        include "../../_sdk/sys_h.asm"

atm=1

OLDMUZ=0

TEXBMP=1
NTEXPGS=5
NSPRPGS=2;1

SPOIL6BSTACK=0x4000
STACK=SPOIL6BSTACK-6
INTSTACK=0x3e80
;scrbase=0x8000

addhlbc=1 ;ьюцэю scrhgt=200 ш т юфэющ ёЄЁрэшЎх
customscales=0;1

IMPOSSIBLECOLOR=0x01 ;(╫+┴)

muz=0x8000

        org PROGSTART
begin
        ld sp,STACK
        OS_HIDEFROMPARENT

        ld e,0;+0x80
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+0x80=keep screen ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
        ld e,0 ;color byte
        OS_CLS
        ld e,1
        OS_SETSCREEN
        ld e,0 ;color byte
        OS_CLS
               
                ld de,res_path
                OS_CHDIR

        OS_GETMAINPAGES
;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000
        ld a,e
        LD (pgmain4000),A
        ld a,h
        LD (pgmain8000),A
        ld a,l
        LD (pgscalersnum),A
       if 1==0 ; OLDMUZ
        ld a,h
        ld (pgmuznum),a
       endif

        ;OS_GETSCREENPAGES
;de=ёЄЁрэшЎ√ 0-ую ¤ъЁрэр (d=ёЄрЁ°р ), hl=ёЄЁрэшЎ√ 1-ую ¤ъЁрэр (h=ёЄрЁ°р )
        ;ld a,l
        ;ld (setpgs_scr_low),a
        ;xor e
        ;ld (setpgs_scr_xor),a
        ;ld a,d
        ;xor e
        ;ld (setpgs_scr_high_xor_low),a

       if OLDMUZ
        ;ld hl,muzfilename
        ;call loadpage
        ;ld (pgsfx),a
        ;call loadpage
        ;ld (pgmusic),a
        ;call setpgsmain40008000
        ;ld a,(pgscalersnum)
        ;SETPGC000
        ;OS_NEWPAGE
        ;ld a,e
        ;ld (pgmuznum),a
        ;SETPG8000
        ld hl,wasmuz
        ld de,muz
        ld bc,wasmuz_sz
        ldir
        call muz
       else
        ld hl,muzfilename
        call loadpage
        ld (pgsfx),a
        call loadpage
        ld (pgmusic),a
        SETPG4000
       
;¤Єю юЄэюёшЄё  ъ чруЁєчъх єЁютэ 
        push af
        call 0x4000 ;init
       
        ld a,(pgsfx)
        SETPG8000
        pop af
        ld hl,0x4005 ;play
        OS_SETMUSIC
        call setpgsmain40008000
        ld a,(pgscalersnum)
        SETPGC000
       endif
       
        ;pop af ;LD a,(pg8000)
        ;SETPG8000

        OS_NEWPAGE
        ld a,e
        ld (pgmapnum),a

        if TEXBMP
        ld de,texfilename
        call openfile_skipbmpheader
;b=handle
        ld hl,ttexpgs+NTEXPGS-1
        ld c,NTEXPGS
gettexpgs0
        push bc
        push hl
        call ldpgrecodebmp
       
        push de
       
;2. яЁюїюфшь яю hl яЁрт√щ тхЁїэшщ ЄЁхєуюы№эшъ ЄхъёЄєЁ√, р яю de - ыхт√щ эшцэшщ, ьхэ хь шї ьхёЄрьш
        ld hl,0x4000
gettexpgsrot0
        push hl    
        ld b,64
gettexpgsrot1
        push bc
        push hl
        ld d,h
        ld e,l
gettexpgsrot2
        ld c,(hl)
        ld a,(de)
        ld (hl),a
        ld a,c
        ld (de),a
        inc l
        inc d
        djnz gettexpgsrot2
        pop hl
        inc l
        inc h
        pop bc
        djnz gettexpgsrot1
        pop hl
        ld a,l
        add a,64
        ld l,a
        jr nz,gettexpgsrot0
       
        pop de
        pop hl
        ld (hl),e
        dec hl
        pop bc
        dec c
        jr nz,gettexpgs0

        OS_CLOSEHANDLE

        ld de,sprfilename
        call openfile_skipbmpheader
;b=handle
        ld hl,ttexpgs+NTEXPGS+NSPRPGS-1
        ld c,NSPRPGS
getsprpgs0
        push bc
        push hl
        call ldpgrecodebmp        
        pop hl
        ld (hl),e
        dec hl
        pop bc
        dec c
        jr nz,getsprpgs0

        OS_CLOSEHANDLE

        else
       
        ld hl,ttexpgs
        ld b,5
getttexpgs0
        push bc
        push hl
        OS_NEWPAGE
       
        push de
        ld a,e
        SETPG4000
        ld de,texfilename
        OS_OPENHANDLE
        push bc
        ld de,0x4000 ;addr
        ld hl,0x4000 ;size
        OS_READHANDLE
        pop bc
        OS_CLOSEHANDLE
       
        ld hl,texfilenamenum
        inc (hl)
        pop de
       
        pop hl
        ld (hl),e
        inc hl
        pop bc
        djnz getttexpgs0

        endif


        LD HL,tID
REtID0  LD A,(HL)
        add a,ttexpgs&0xff
        ld e,a
        adc a,ttexpgs/256
        sub e
        ld d,a
        ld a,(de)
;basepggfx=$+1
;        ADD A,0
        LD (HL),A
        INC L
        INC L
        jr NZ,REtID0
         ld hl,tID+128
         ld de,tID
         ld bc,128
         ldir ;ID_DOOR < 128

        ld ix,tscales
        ld hl,tscales_rev
        ld b,64
revscale0
        push bc
        push hl
        ld c,(ix)
        inc ix
        ld b,(ix)
        inc ix
        ld de,256
;фхыхэшх
;DE=+-7.8;BC=+7.8
;DE=DE/BC=+-8.7/2
    ;BC ёюїЁрэ хЄё !!!
        call MONDIV
        pop hl
        sla e
        rl d
        ld (hl),e
        inc hl
        ld (hl),d
        inc hl
        pop bc
        djnz revscale0

        ;YIELD ;шэрўх эх єёЄрэютшЄё  тшфхюЁхцшь ш ярышЄЁр?

        if 1==0 ;эхы№ч  яЁш шэЄхЁяюы Ўшш
        ld hl,tlogd2sca
retlogd2sca0
        sla (hl)
        sla (hl)
        inc l
        jr nz,retlogd2sca0
        endif

        call genscalers

        call swapimer

        call TEXCODEGO
       
        call swapimer
       
        ;call shutay        
pgmusic=$+1
        ld a,0
        SETPG4000
        halt
        ld hl,0x4000;0x4008+3 ;stop
        OS_SETMUSIC
        halt
        QUIT

setpgsmain40008000
pgmain4000=$+1
        ld a,0
        SETPG4000
pgmain8000=$+1
        ld a,0
        SETPG8000
        ret

        if 1==0
setpgsscr40008000_current
        call getuser_scr_low_cur
        SETPG4000
        call getuser_scr_high_cur
        SETPG8000
        ret

setpgsscr40008000
        call getuser_scr_low
        SETPG4000
        call getuser_scr_high
        SETPG8000
        ret

setpgscrlow4000
        call getuser_scr_low
        SETPG4000
        ret

setpgscrhigh4000
        call getuser_scr_high
        SETPG4000
        ret
        endif

getuser_scr_low
getuser_scr_low_patch=$+1
getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
        ld a,(user_scr1_low) ;ok
        ret

getuser_scr_high
getuser_scr_high_patch=$+1
getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
        ld a,(user_scr1_high) ;ok
        ret

getuser_scr_low_cur
getuser_scr_low_cur_patch=$+1
getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
        ld a,(user_scr0_low) ;ok
        ret

getuser_scr_high_cur
getuser_scr_high_cur_patch=$+1
getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
        ld a,(user_scr0_high) ;ok
        ret

changescrpg_current
;        ld a,(setpgs_scr_low)
;setpgs_scr_scrxor=$+1
;        xor 0
;        ld (setpgs_scr_low),a
        ld hl,getuser_scr_low_patch
        ld a,(hl)
        xor getuser_scr_low_patchN
        ld (hl),a
        ld hl,getuser_scr_high_patch
        ld a,(hl)
        xor getuser_scr_high_patchN
        ld (hl),a
        ld hl,getuser_scr_low_cur_patch
        ld a,(hl)
        xor getuser_scr_low_cur_patchN
        ld (hl),a
        ld hl,getuser_scr_high_cur_patch
        ld a,(hl)
        xor getuser_scr_high_cur_patchN
        ld (hl),a

        ld a,1
curscrnum=$+1
        xor 0
        ld ($-1),a
         ;add a,a
         ;add a,a
         ;add a,a
         ;ld (imer_curscreen_value),a
        ret
       
changescrpg
        ;jr $
        call changescrpg_current
        ;ld (curscrnum_physical),a
        ld e,a
        OS_SETSCREEN
        ret

openfile_skipbmpheader
        OS_OPENHANDLE
        push bc
        ld de,bmpbuf;0x4000 ;addr
        ld hl,14+2;0x0076 ;size
        OS_READHANDLE ;b=handle
        pop bc
        push bc
        ld de,bmpbuf;0x4000 ;addr
        ld hl,(bmpbuf+14)
        dec hl
        dec hl
        OS_READHANDLE ;b=handle
        pop bc
        push bc
        ld de,bmpbuf;0x4000 ;addr
        ld hl,4*16;0x0076 ;size
        OS_READHANDLE ;b=handle
        pop bc
        ret

ldpgrecodebmp
        push bc
        OS_NEWPAGE
        ld a,e
        SETPG4000
        pop bc ;b=handle
        push de
       
        ld de,0x4000 ;addr
        ld hl,0x4000 ;size
        OS_READHANDLE

        ld hl,0x4000
        ld d,trecolor/256
gettexpgsrecode0
        ld e,(hl)
        ld a,(de)
        ld (hl),a
        inc hl
        bit 7,h
        jr z,gettexpgsrecode0

;яютхЁэєЄ№ ЄхъёЄєЁ√ эр 90 уЁрфєёют (фы  ёЄхэ, р фы  ёяЁрщЄют яЁюёЄю яхЁхтхЁэєЄ№?)
;1. яхЁхтюЁюЄ ЄхъёЄєЁ
        ld hl,0x4000
        ld de,0x4000+0x3f00
        ld b,32
gettexpgsturn0
gettexpgsturn1
        ld c,(hl)
        ld a,(de)
        ld (hl),a
        ld a,c
        ld (de),a
        inc l
        inc e
        jr nz,gettexpgsturn1
        inc h
        dec d
        djnz gettexpgsturn0
       
        pop de ;e=pg
        ret

shutay
        ld de,0xe00
shutay0
        dec d
        ld bc,0xfffd
        out (c),d
        ld b,0xbf
        out (c),e
        jr nz,shutay0
        ret
       
texfilename
        if TEXBMP
        db "wolftex.bmp",0
        else
        db "wolftex.0",0
texfilenamenum=$-2
        endif
sprfilename
        db "wolfspr.bmp",0

        align 256
t1x
        db 255
        dup 255
        db (255*2/($&0xff)+1)/2
        edup
ttexpgs
        ds NTEXPGS+NSPRPGS

setpgmap4000
pgmapnum=$+1
        ld a,0
        SETPG4000
        ret

swapimer
        di
         ld hl,(0x0026) ;ok
         ld (on_int_0026),hl
        ld de,0x0038
        ld hl,oldimer
        ld bc,3
swapimer0
        ld a,(de)
        ldi ;[oldimer] -> [0x0038]
        dec hl
        ld (hl),a ;[0x0038] -> [oldimer]
        inc hl
        jp pe,swapimer0
        ei
        ret
oldimer
        jp on_int ;чрьхэшЄё  эр ъюф шч 0x0038
        jp 0x0038+3

on_int
;restore stack with de
        ld (on_int_hl),hl
        ld (on_int_sp),sp
        pop hl
        ld (on_int_sp2),sp
        ld (on_int_jp),hl
        ld sp,INTSTACK
        push af
        push bc
        push de

;imer_curscreen_value=$+1
;         ld a,0
;         ld bc,0x7ffd
;         out (c),a

        ex de,hl;ld hl,0
on_int_sp=$+1
        ld (0),hl ;тюёёЄрэютшыш чряюЁюЄ√щ ёЄхъ

on_int_0026=$+1
        ld hl,0
        ld (0x0026),hl ;тюёёЄрэютшыш чряюЁюЄ√щ ёЄхъ 0x0028 (=40)

        push ix
        push iy
        ex af,af' ;'
        exx
        push af
        push bc
        push de
        push hl
        ld a,(curscrnum)
        ld e,a
        OS_SETSCREEN ;т√ч√трхь чфхё№, р эх т Ёрэфюьэюь ьхёЄх, шэрўх фрцх ё юфэющ чрфрўхщ ьюцхь яюыєўшЄ№ эхяЁхфёърчєхьє■ чрфхЁцъє, ъюЄюЁє■ эх ЇшъёшЁєхЄ эр° ЄрщьхЁ? ё эхёъюы№ъшьш чрфрўрьш эрфю єўшЄ√трЄ№ ш ёшёЄхьэ√щ - TODO
       
        if atm
       
curpalette=$+1
        ld de,wolfpal
        OS_SETPAL
       
       if 1==0
        ld a,(curpg32klow) ;ok
        push af
pgmuznum=$+1
        ld a,0
        SETPG8000
        call muz+6
        ;TODO music + sound effects in OS_SETMUSIC
        pop af
        SETPG8000
       endif
       
        call oldimer ;ei
       
        GET_KEY
        or a
        jr z,$+5
        ld (curkey),a
       
        else
curpg=$+1
        ld a,0
        setpgafast
        endif
       
        pop hl
        pop de
        pop bc
        pop af
        exx
        ex af,af' ;'
        pop iy
        pop ix
       
        ld hl,(timer)
        inc hl
        ld (timer),hl

        pop de
        pop bc
        pop af
       
on_int_hl=$+1
        ld hl,0
on_int_sp2=$+1
        ld sp,0
        ;ei
on_int_jp=$+1
        jp 0

sfxplay
        push af
pgsfx=$+1
        ld a,0
        SETPG8000
        pop af
        jp 0x8000 ;SFXPLAY

loadpage
;чрърч√трхЄ ёЄЁрэшўъє ш уЁєчшЄ Єєфр Їрщы (шь  Їрщыр т hl)
;out: hl=яюёых шьхэш Їрщыр, a=pg
        push hl
        OS_NEWPAGE
        pop hl
        ld a,e
        push af ;pg
        SETPGC000
        push hl
        ex de,hl
        OS_OPENHANDLE
        push bc
        ld de,0xc000 ;addr
        ld hl,0x4000 ;size
        OS_READHANDLE
        pop bc
        OS_CLOSEHANDLE                
        pop hl
        ld b,1
        xor a
        cpir ;after 0
        pop af ;pg
        ret

muzfilename
        db "sfx.bin",0
        db "music.bin",0

wolfpal
        dw 0xffff,0x0c0c,0x3f3f,0xdede,0xfefe,0xdfdf,0x4c4c,0xaeae
        dw 0xbdbd,0xfdfd,0xbfbf,0xeded,0x8d8d,0x7d7d,0xecec,0x1f1f

        include "WATM2.asm"

scale2ytop
;bc=scale
;out: de=Y, lx=y
        XOR A
        LD L,A
        ld H,A
        SBC HL,BC ;-scale = -0x40..-0x410
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL ;*32 = -0x800..-0x8200
        EXD
        LD LX,E
        LD a,D
        LD D,-1
        ADD A,Ycenter ;0x64
        LD E,A
        ret nc ;jr NC,$+3
        INC D
        ret

YtoADDR
       PUSH HL
        LD H,D
        ld L,E
        ADD HL,HL
        ADD HL,HL
        ADD HL,DE ;*5
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL ;*40
        LD DE,scrbase
        ADD HL,DE
;genX=$+1
;        LD DE,0
;        ADD HL,DE
        EXD
       POP HL
        RET
        ;align 256;DS .(-$)
tscales
       IF customscales == 0
        INCBIN "scalesw3" ;ёэрўрыр ьхыъшх
       ELSE
        DS 8,5,0
        DS 7,6,0
        DS 6,7,0
        DS 5,8,0
        DS 4,9,0
        DS 3,10,0
        DS 2,11,0
        DS 1,12,0
        DS 1,13,0
        DS 1,14,0
        DS 1,15,0
        DS 1,16,0
        DS 1,17,0
        DS 1,18,0
        DS 1,19,0
        DS 1,20,0
        DS 1,21,0
        DS 1,22,0
        DS 1,23,0
        DS 1,24,0
        DS 1,25,0
        DS 1,26,0
        DS 1,27,0
        DS 1,28,0
        DS 1,29,0
        DS 1,30,0
        DS 1,31,0
        DS 1,32,0
        DS 1,33,0
        DS 1,34,0
        DS 1,35,0
        DS 1,36,0
        DS 1,38,0
        DS 1,40,0
        DS 1,42,0
        DS 1,44,0
        DISPLAY $-tscales,"=#80"
       ENDIF
tscales_rev
        ds 128

tsprites
;pg,xmid,xleft-1,xright-1
        macro TSPRITES pg,xleft,wid
xright=xleft+wid
xmid=(xleft+xright)/2
        db NTEXPGS+pg
        db xmid/2
        db xleft/2
        db xright/2
        endm
;TODO эрфю яЁртшы№эю ЎхэЄЁютрЄ№
        ;TSPRITES 0,0,0 ;ID 0 not used
        TSPRITES 0,0,44 ;ID 1
        TSPRITES 0,44,42
        TSPRITES 0,86,36
        TSPRITES 0,122,56
        TSPRITES 0,178,40
        TSPRITES 0,218,48
        TSPRITES 0,266,36
        TSPRITES 0,302,56
        TSPRITES 0,358,38
        TSPRITES 0,396,50 ;10
        TSPRITES 0,448,24
        TSPRITES 1,472,26

MONSTAB
;ZOMBIEMAN stay
        db 1
        db 2
        db 1
        db 2
        db 1
        db 2
        db 0,0
;ZOMBIEMAN go1
        db 3
        db 4
        db 5
        db 6
        db 3
        db 4
        db 0,0
;ZOMBIEMAN go2
        db 7
        db 8
        db 9
        db 10
        db 7
        db 8
        db 0,0
;AMMO
        db 12 ;G
        db 12 ;R
        db 12 ;MEGAHEALTH
        db 12 ;RL
        db 12 ;AMMO
        db 12
        db 0,0
;STOLB
        db 11
        db 11
        db 11
        db 11
        db 11
        db 11
        db 11
        db 11

        if 1==0
        DS ((-$)&7)&0xff
MONSTRS
;Xx,Yy,TYPEphase,TIMEenergy
        DW #0F80,#AF80,#000,-1;ENEMY
        DW #2680,#A080,#000,64
        DW #0380,#BA80,#000,64
        DW #0780,#B780,#000,64

        DW #0F80,#B080,#002,64
        DW #1380,#A080,#000,64
        DW #1380,#AA80,#000,64
        DW #1380,#B280,#000,64
        DW #1380,#B380,#000,64
        DW #1280,#B580,#002,64
        DW #1480,#AB80,#000,64
        DW #1480,#AE80,#002,64

        DW #1480,#B080,#002,64
        DW #1480,#B380,#000,64
        DW #1580,#A180,#002,80
        DW #1680,#AD80,#002,90
        DW #1680,#B180,#002,100
        DW #2180,#AD80,#002,10
        DW #2380,#A080,#000,50
        DW #2380,#A580,#002,50

        DW #2680,#A480,#003,50
        DW #2680,#B280,#004,50
        DW #2780,#A880,#005,50
        DW #2780,#B180,#003,64

        DW #2780,#A380,#100,150
        DW #2080,#A580,#101,100
        DW #2280,#A580,#102,100
        DW #2580,#A080,#103,20
        DW #2080,#A080,#104,40

        DW #1380,#A2C0,#200,0
        DW #1380,#A440,#200,0
        DW #1280,#A2C0,#200,0
        DW #1280,#A440,#200,0
        DW #1180,#A2C0,#200,0
        DW #1180,#A440,#200,0
        DW #1080,#A2C0,#200,0
        DW #1080,#A440,#200,0
        DW #0F80,#A2C0,#200,0
        DW #0F80,#A440,#200,0
        DW #0E80,#A2C0,#200,0
        DW #0E80,#A440,#200,0
        DW #0D80,#A2C0,#200,0
        DW #0D80,#A440,#200,0
        DW -1
eNDMONS
        endif

level
        DB "W"
gfxnr   DB "0"
muznr   DB "A"
pol     DB #E7
potolok DB #F3
color   DB 7
levname DS 23
        DB 0
monstrs DB 0
prizes  DW 0 ;$$$/10
EXITx   DB 23
EXITy   DB 15+0xA0
yx      DW 0x8080
YX      DW 0xBA08
angle   DW 64
endlev

        DS ((-$)&7)&0xff
MONSTRS
;Xx,Yy,TYPEphase,TIMEenergy
        ;DW -1

;ёхщўрё TYPE ъюфшЁєхЄё  Єръ (ўЄю тшфэю т ЁхфръЄюЁх: ўЄю т TYPE):
;31: тїюф
;29: т√їюф
;32..63: goods (58..63: gold 5,10,20,50,100,200)
;1..28: monsters

;        ds 64
;INTSTACK

        align 256
trecolor
;%00003210 => %.3...210
        dup 256
_3=$&8
_210=$&7
_3L=($>>4)&8
_210L=($>>4)&7
        db (_3L*0x08) + (_210L*0x01) + (_3*0x10) + (_210*0x08)
        edup

bmpbuf

        display "free before stack=",0x3e00-$

        ds 0x8000-$

       IF atm
        ;ORG #C000;,pgscalers
        ;ds 0xc000-$
        ;INCBIN "scalers"
wasmuz
        ;ds 9,201
        incbin "DOOM-MUS" ;TODO load
wasmuz_sz=$-wasmuz

        include "genscale.asm"

        display "WASMAP=",$
WASMAP
        INCBIN "mapatm.E" ;TODO load
szMAP=$-WASMAP

res_path
        defb "wolf3d",0
     

       else ;~atm
WASMAP
        INCBIN "map48.E"
szMAP=$-WASMAP
        ;ORG #C000,pgscale
        ds 0xc000-$
      IF 1
        INCBIN "48kblock" ;with 48K textures
      ELSE
       IF scale64
       IF scale64 == 3
        INCBIN "tscale3"
       ELSE
        INCBIN "tscale2"
       ENDIF
       ELSE
        INCBIN "tscale"
       ENDIF
      ENDIF
       ENDIF
end

        ;display "End=",end
        ;display "Free after end=",/d,#c000-end
        ;display "Size ",/d,end-begin," bytes"
       
        savebin "wolf3d.com",begin,end-begin
       
        LABELSLIST "../../../us/user.l"