Login

Subversion Repositories NedoOS

Rev

Rev 1916 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

        DEVICE ZXSPECTRUM128
        include "settings.asm"

NTEXPGS=5
NSPRPGS=2;1

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

addhlbc=1 ;можно scrhgt=200 и в одной странице
customscales=0;1

IMPOSSIBLECOLOR=0b01000111;0x01 ;(b+w)

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 0;OLDMUZ
        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 1;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 ;~TEXBMP
       
        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

        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 1;TEXBMP
        db "wolftex3.bmp",0
        else
        db "wolftex.0",0
texfilenamenum=$-2
        endif
sprfilename
        db "wolfspr3.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

        include "int.asm"

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 "pal.ast"

        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

        include "anims.asm"
        include "savestate.asm"

        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
       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",1