Rev 1982 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
DEVICE ZXSPECTRUM128 include "settings.asm" music=doublescr NTEXPGS=0 ;curpg=0x5b5c pgtmp=#04 pgmusic=#06 texturesinpg=12 spritesinpg=8;4 ;tcos=#5B00 imer=#7F7F INTSTACK=imer imstackbegin=imer&0xff00 distbuf=#7C00 ;#300 ;ID,texx,dist page 0 ORG #6000;,0 begin jp init IF doublescr SETPGmusic_silent ld a,pgmusic jr SETPG_silent SETPG LD (curpg),A SETPG_silent curscr=$+1 OR 0 LD BC,#7FFD OUT (C),A RET ENDIF include "my_int.asm" INCLUDE "WCTRL.ASM" include "beeper.asm" include "beeper_sfxdata.asm" include "anims.asm" include "savestate.asm" ;переменные рендера (обновляются в начале рендера) curXx curx DB #80 curX DB #0 curYy cury DB #80 curY DB #0 curxy DW 0 curyx DW 0 curYX DW 0 curangle DW tsin if 0 demobegin IF demoplay INCBIN "demorec*" ELSE DB %00111111 ;all keys released ENDIF endif align 256 tlogd2sca
IF scale64 IF scale64 == 3 INCBIN "logd2sc3" ELSE INCBIN "logd2sc2" ENDIF ELSE INCBIN "logd2sc_" ENDIF tsqr2 INCBIN "sqr2int" tlogd INCBIN "logd" ;первые 128 байт (64 при antizalom) не используются - TODO tcorrlogd INCBIN "corlogd_" ORG $-256 DUP 256 DB {$+(scrtopx*8)}&0xff EDUP IF lores ORG $-256 _=$ DUP 128 DB {_}&0xff _=_+2 EDUP DS 128 ENDIF tcos DS 256 tlogcos INCBIN "pluslcos" tda INCBIN "da" ORG $-256 DUP 256 DB 0xff&({$}+128) EDUP ORG $-256 DUP 256 DB 0xff&({$+(scrtopx*8)}) EDUP IF lores ORG $-256 _=$ DUP 128 DB {_}&0xff _=_+2 EDUP DS 128 ENDIF tctg INCBIN "plusctg" tsin INCBIN "sin" cursprites DS 256 DISPLAY "tables end=",$ tscalesw3 incbin "scalesw3"
;DS #8000-$ ds imstackbegin-$ ds imer-$ include "int.asm" ;DS ((IMER/256+1)<<8)-$ ;ds (IMER&0xff00)-$ ds 0x8000-$ ;ORG #8000 imvec DS 257,imer&0xff INCLUDE "zxloop.asm" INCLUDE "WSCAN10.asm" INCLUDE "WREND.asm" badmonstexture db 0xc0,0xff align 256 t1x db 255 dup 255 db (255*2/($&0xff)+1)/2 edup DISPLAY "48K PROG END=",$ ORG distbuf include "recmap.asm" DS distbuf+#300-$ ;;;;; ORG scrbuf GO ;xor a ;out (0xfe),a DI LD HL,WAStcos LD DE,tcos PUSH DE LD BC,256 LDIR POP HL REtcos0 DUP 2;4 SRA (HL) EDUP INC L jr nz,REtcos0 LD HL,imvec LD DE,imvec+1 LD (HL),imer/256 LD B,E,C,L LD A,H LDIR LD I,A IM 2 EI HALT LD HL,-2 ADD HL,SP LD (clscrbufsp),HL LD (eorfills
p),HL ld hl,ZXLOOP push hl LD BC,#FBDF IN A,(C) LD (mouseoldx),A JP RECMAP ;->ZXLOOP display "ZXLOOP=",ZXLOOP WASMAP IF invmap;atm INCBIN "mapatm.E" ELSE INCBIN "map48.E" ENDIF szMAP=$-WASMAP WAStcos INCBIN "cos" init if mouse call initmouse endif ;prepare 48K block DI ;IY LD HL,#5800 LD DE,#5801 LD BC,767 LD (HL),L LDIR call gettexpg if doublescr LD A,0x10+pgtmp call SETPG call gettexpg endif IF music && !atm call SETPGmusic_silent CALL #c000 ;init mus ENDIF if doublescr LD A,0x10 call SETPG endif LD IY,23610 EI JP GO ;там recmap gettexpg ld hl,wasgoods ld de,0x4000 ld bc,0x1000 ldir ld de,0xb000 ld bc,0x1000 ldir ld hl,0xffff-0x2000 ld de,0xffff
ld bc,0x2000 lddr LD HL,0x2000+waswalls;#C000 call copyscrcolumns_2k LD DE,#C000+0x80;maxscale+1 LD HY,d;0xc0;#FE ;4 upper textures = #09A6 ;4 lower textures = #0AAC LD HL,0x5000 CALL GETTEX CALL GETTEX CALL GETTEX CALL GETTEX LD HL,0x2000+waswalls+0x800;#C000 call copyscrcolumns_2k LD HL,0x5000 CALL GETTEX CALL GETTEX CALL GETTEX CALL GETTEX LD HL,0x2000+waswalls+0x1000;#C000 call copyscrcolumns_2k LD HL,0x5000 CALL GETTEX CALL GETTEX CALL GETTEX CALL GETTEX ;walls: [e2b8] (e3b4 8spr, e274 4spr?), walls2: (eef6 8spr, ec88 4spr?) ;LD HL,wasgoods ;call copyscrcolumns_4k if sprites LD HL,0x4000 CALL GETSPR LD HL,0x4400 CALL GETSPR LD HL,0x4800 CALL GETSPR LD HL,0x4c00 CALL GETSPR ;LD HL,wasgoods+0x1000;#C000 ;call copyscrcolumns_4k ;jr $
if spritesinpg==8 LD HL,0xb000 CALL GETSPR LD HL,0xb400 CALL GETSPR LD HL,0xb800 CALL GETSPR LD HL,0xbc00 CALL GETSPR endif endif ;jr $ ;walls: с оптимизацией f699(f4c0) (12 шт+4 спрайта без оптимизации(с оптимизацией)), (fdbd 8spr, fb6f 4spr?) walls2: 00f4(febd), (0cc0 8spr, 07d6 4spr?) ;jr $ ;пак 7: с оптимизацией de=ec70[ebdf] (f4c8 12 шт) ;jr $ ;пак 3: с оптимизацией de=e1e4[de70] ;jr $ ;пак 2: с оптимизацией de=f070[f6cd] ;jr $ ;пак 1: с оптимизацией de=efdf[ef76, без оптимизации f256] if 1 ;исправляем переполнения адресов текстур (адреса в ПЗУ заменяем на 0xc080, а для спрайтов на badmonstexture) ld h,0xc0 fixtexoverflow0 ld l,0x40 fixtexoverflow1 ld e,(hl) inc h ld d,(hl) bit 7,d jr nz,$+5 ;не в ПЗУ badaddrpatch=$+1 ld de,0xc080 ld (hl),d dec h ld (hl),e inc l jp p,fixtexoverflow1 inc h inc h ld de,badmonstexture ld a,h cp 0xc0+(2*texturesinpg) jr c,$+6 ld (badaddrpatch),de cp 0xc0+(2*(texturesinpg+sprit
esinpg)) jr nz,fixtexoverflow0 endif ;составляем таблицу масштабирования ld hl,tscalesw3 ld c,0 ld b,64 initscales0 ld e,(hl) inc hl ld d,(hl) inc hl push hl ld l,c push bc ld b,d ld c,e ;adder 8.8 ;надо из 0040...0400 сделать 78..00 до начала(0x80 -08..-80) = 0x80 - adder*32 ;надо из 0040...0400 сделать 78..04 в начале (0x80 -08..-7c) = 0x80 - adder*31 ;... ;надо из 0040...0400 сделать 87..f4 (0x80 +07..+74) ;надо из 0040...0400 сделать 88..f8 в конце (0x80 +08..+78) dup 5 sla e rl d edup xor a sub e ld e,a ld a,0x80 sbc a,d ld d,a ;0x80 - adder*32 ld h,0xc0 ld (hl),0 ;зачем? при d виснет из-за спрайтов inc h initscales1 ex de,hl add hl,bc ex de,hl ld (hl),d ;Ys=(Y/32-1)*sc inc h jr nz,initscales1 pop bc inc c pop hl djnz initscales0 LD H,#C1 INIRETAB0 ; LD L,0 LD B,maxscale+1 INIRETAB1 ; LD A,(HL) CP 128-(scrhgtpix/2) jr nc,$+4 LD A,128-(scrhgtpix/2) CP 128+(scrhgtpix/2);-1 jr c,$+4
;LD A,128+(scrhgtpix/2)-1 ;видно линию внизу от переполн-й LD A,0xff&(dropline-(scrbuf+(scrhgtpix/2)-128)) ADD A,+(0xff&scrbuf)+(scrhgtpix/2)-128 LD (HL),A INC L DJNZ INIRETAB1 INC H LD A,H INC A ;#C0XX,#FFXX не трогаем jr nz,INIRETAB0 LD HL,#FF00 LD DE,#FF01 LD BC,maxscale LD (HL),1 LDIR ret if mouse initmouse ei halt ;задержка, чтобы мышка успевала опознаваться - min 2500 тактов для Evo (компа с 280к тактов быстродействия) LD B,75 prosirtime LD DE,(0) ;20 тактов DJNZ prosirtime ;13 тактов ld a, 0x90 out (0x7F), a out (0x5F), a ld bc, 0x0FFDF in h, (c) ld b, 0x0FB in l, (c) dec b in a, (c) cp l ret nz ;jr nz, @detected cp h ret nz ;jr z, @comeon LD A,0xaf ;xor a LD (mouseon),A ;ld hl,0x18+(256*readmousejr) ;"jr" ;ld (readmouse_patch),hl ret endif copyscrcolumns_2k push de l
d de,0x5000 ld bc,0x800 ldir pop de ret GETTEX IF scale64 LD LY,#40 ELSE LD LY,#80 ENDIF LD BC,#0880 ;B=width/8, C=#80(mask) GETTEX00 ; PUSH BC GETTEX0 push hl CALL GETTEXLINE pop hl INC LY IF scale64 == 0 INC LY ENDIF RRC C jr nc,GETTEX0 ;INC L ld bc,64 add hl,bc POP BC DJNZ GETTEX00 inc hy,hy;DEC HY,HY RET GETSPR ;jr $ IF scale64 LD LY,#40 ELSE LD LY,#80 ENDIF LD BC,#0880 ;B=width/8, C=#80(mask) GETSPR00 ; PUSH BC GETSPR0 push hl CALL GETSPRLINE pop hl INC LY IF scale64 == 0 INC LY ENDIF RRC C jr nc,GETSPR0 ;INC L ld bc,128;64 add hl,bc POP BC DJNZ GETSPR00 inc hy,hy;DEC HY,HY RET GETTEXincD call GETincD
JR GETTEXRETRY GETTEXLINE PUSH HL GETTEXRETRY ; LD (gettexDE),DE ;linelength addr POP HL PUSH HL LD (IY),E IF scale64 == 0 LD (IY+1),E ENDIF INC HY LD (IY),D IF scale64 == 0 LD (IY+1),D ENDIF DEC HY inc e dec e jr z,GETTEXincD INC E ;jr z,GETTEXincD LD LX,0;C ;bit LD HX,17 ;17-pixels LD B,62 ;62..1 -> 1..62 GETTEX1 ; inc hl;CALL DHL LD A,(HL) AND C CP LX LD LX,A jr z,GETTEXN LD A,HX OR A jr z,GETTEXN ;can't add more pixels inc e dec e jr z,GETTEXincD LD A,tscale/256+63 SUB B LD (DE),A DEC HX ;17-pixels INC E ;todo check before write ;jr z,GETTEXiD GETTEXN ; DJNZ GETTEX1 LD A,HX ;17-pixels ADD A,A ADD A,A ADD A,A SUB HX ;(17-pixels)*7 ADD A,DWJP&0xff ge
ttexDE=$+1 LD (0),A ld a,17+1 sub hx ;17+1-(17-pixels) ld (gettexB),a ;size=1+pixels (min=2 из-за линии пола) POP HL GETTEX_cmp ;сравнение с предыдущими столбцами push de push iy GETTEX_cmpnext ld hl,(gettexDE) ld a,ly cp 0x40 ;ниже этого tscales jr nz,GETTEX_cmpgo ld a,hy cp 0xc0 jr z,GETTEX_endcmp ld ly,0x80;7f dec hy,hy GETTEX_cmpgo dec ly ld e,(iy) inc hy ld d,(iy) dec hy ;ld a,17+1 ;sub hx ;17+1-(17-pixels) gettexB=$+1 ld b,0;a ;size=1+pixels (min=2 из-за линии пола) GETTEX_cmp1 ld a,(de) cp (hl) jr nz,GETTEX_cmpnext inc hl inc de djnz GETTEX_cmp1 ;поставить ссылку на прошлую копию ld e,(iy) inc hy ld d,(iy) pop iy pop af;de LD (IY),e INC HY LD (IY),d DEC HY ld de,(gettexDE) ;откатить DE ret GETTEX_endcmp pop iy pop de RET GETSPRincD call GETincD JR GETSPRRETRY GETSPRLINE PUSH HL GETSPRRETRY ; LD (gettexDE),DE ;linelength addr POP HL PUSH HL LD
(IY),E IF scale64 == 0 LD (IY+1),E ENDIF INC HY LD (IY),D IF scale64 == 0 LD (IY+1),D ENDIF DEC HY ld a,l add a,2*62 ld l,a ;line 62 LD HX,1 ld lx,2 ;size GETSPR1 ; CALL FIND10 jr nc,GETSPRQ ;end of column inc e dec e jr z,GETSPRincD LD A,HX CPL LD (DE),A ;Y inc lx INC E ;jr z,GETSPRiD CALL FIND1HEIGHT inc e dec e jr z,GETSPRincD LD A,HX CPL LD (DE),A ;Y2 inc lx INC E ;jr z,GETSPRiD CALL FIND0HEIGHT inc e dec e jr z,GETSPRincD LD A,HX CPL LD (DE),A ;Y3 inc lx INC E ;jr z,GETSPRiD JR GETSPR1 GETSPRQ inc e dec e jr z,GETSPRincD LD A,#C0 LD (DE),A INC E ;jr z,GETSPRiD inc e dec e jr z,GE
TSPRincD LD A,#FF LD (DE),A INC E ;jr nz,$+5 ; INC D ; LD E,maxscale+1 POP HL ld a,lx ld (gettexB),a jp GETTEX_cmp ;сравнение с предыдущими столбцами GETincD INC D LD E,0x80;maxscale+1 ld a,d cp 0xc0+(2*(texturesinpg+spritesinpg)) jr c,$+4;GETSPRRETRY ld e,0x40 ;дальше нет таблиц адресов ret maxVhgt=12;14;10 ;при максимальном увеличении (в 4 раза) должно отрисовывать не более maxlinehgt=59 пикселей! (TODO почему 13,14 глючат???) ;HX=V ;HL=mask FIND10 LD A,HX CP 63 RET Z ;CY=0: end of column CALL GETPIXEL RET C ;CY=1: pixel dec hl;CALL UHL dec hl INC HX ;V JR FIND10 FIND1HEIGHT ;LD LX,HX ;oldV LD B,0 F1H0 CALL GETPIXEL RET NC ;transparent RET Z ;0 dec hl;CALL UHL dec hl INC HX ;V INC B LD A,B CP maxVhgt jr c,F1
H0 RET FIND0HEIGHT ;LD LX,HX ;oldV LD B,0 F0H0 CALL GETPIXEL RET NC ;transparent RET NZ ;1 dec hl;CALL UHL dec hl INC HX ;V INC B LD A,B CP maxVhgt jr c,F0H0 RET GETPIXEL LD A,HX CP 63 RET Z ;CY=0: transparent inc l;set 1,h;SET 3,L LD A,(HL) dec l;res 1,h;RES 3,L AND C RET NZ ;CY=0: transparent LD A,(HL) AND C SCF ;CY=1: pixel (Z) RET if 0 UHL LD A,H DEC H AND 7 RET NZ LD A,L SUB #20 LD L,A RET C LD A,H ADD A,8 LD H,A RET endif ;endall display "end init=",$ DS 0xb000-$ DS #C000-$ if 0 ;ORG #C000 IF scale64 IF scale64 == 3 INCBIN "tscale3" ELSE INCBIN "tscale2" ENDIF ELSE INCBIN "tscale"
ENDIF endif ;hicode_begin ;ds 0x10000-0x1800-0x0800-$ ;0xс040..7f содержит таблицы адресов текстуры (16 текстур?) ds 0x10000-0x1800-0x2000-$ ;0xс040..7f содержит таблицы адресов текстуры (16 текстур?) waswalls incbin "walls.bin" wasgoods incbin "goods.bin" ;hicode_end end page pgtmp org 0xc000 hicode_begin ds 0x10000-0x1800-0x2000-$ ;waswalls incbin "walls2.bin" ;wasgoods incbin "goods2.bin" hicode_end page pgmusic org 0xc000 hicode2_begin include "../../_sdk/ptsplay.asm" MDLADDR incbin "testmusi.pt3" hicode2_end page 0 if doublescr savebin "code.c",begin,end-begin page pgtmp savebin "hicode.c",hicode_begin,hicode_end-hicode_begin page pgmusic savebin "hicode2.c",hicode2_begin,hicode2_end-hicode2_begin else savebin "code.c",begin,hicode_end-begin endif LABELSLIST "../../../us/user.l",1