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