From e50bc8669ebdcac7da1c6c72b91cfb6ab9a42418 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 27 Jan 2023 09:30:27 +0100 Subject: [PATCH] Code cleanup. --- grafproc.asm | 305 ++++++++++++++++++++++++++++++++++++++++++++++++ interrupts.asm | 267 ++++++++++++++++++++++++++++++++++++++++++ scorch.asm | 306 +------------------------------------------------ scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 49340 -> 49340 bytes textproc.asm | 303 ------------------------------------------------ 6 files changed, 573 insertions(+), 608 deletions(-) create mode 100644 interrupts.asm diff --git a/grafproc.asm b/grafproc.asm index 877e1dd..6fbd46e 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -2032,6 +2032,311 @@ EndPut4x4 rts .endp +;-------------------------------------------------------- +.proc DisplayOffensiveTextNr ; + ldx TextNumberOff + lda talk.OffensiveTextTableL,x + sta LineAddress4x4 + lda talk.OffensiveTextTableH,x + sta LineAddress4x4+1 + inx ; the next text + lda talk.OffensiveTextTableH,x + sta temp+1 + lda talk.OffensiveTextTableL,x + sta temp ; opty possible + ; substract address of the next text from previous to get text length + sbw temp LineAddress4x4 temp2 + mva temp2 fx + + ;jsr Display4x4AboveTank + ;rts + ; POZOR !!! +.endp + +;-------------------------------------------------------- +.proc Display4x4AboveTank ; + ; Displays texts using PutChar4x4 above tank and mountains. + ; Pretty cool, eh! + ;parameters are: + ;Y - number of tank above which text is displayed + ;fx - length of text + ;LineAddress4x4 - address of the text + + ;lets calculate position of the text first! + ;that's easy because we have number of tank + ;and xtankstableL and H keep X position of a given tank + + lda xtankstableL,y + sta temp + lda xtankstableH,y + sta temp+1 + ;now we should substract length of the text-1 + ;temp2 = (fx-1)*2 + ldy fx + dey + tya + asl + sta temp2 + mva #0 temp2+1 + ;now we have HALF length in pixels + ;stored in temp2 + + ;here we assume max length of text + ;to display is 127 chars, but later it turns out it must be max 63! + + sbw temp temp2 ; here begin of the text is in TEMP !!!! + ;now we should check overflows + ;lda temp+1 ; opty + bpl DOTNnotLessThanZero + ;less than zero, so should be zero + mwa #0 temp + beq DOTNnoOverflow + +DOTNnotLessThanZero + ;so check if end larger than screenwidth + + + lda fx + asl + asl + ;length in pixels - + ;text length max 63 chars !!!!!!!! + + + clc + adc temp + sta temp2 + lda #0 + adc temp+1 + sta temp2+1 + ;now in temp2 is end of the text in pixels + ;so check if not greater than screenwitdth + cpw temp2 #screenwidth + bcc DOTNnoOverflow + + ;if end is greater than screenwidth + ;then screenwidth - length is fine + lda fx + asl + asl + sta temp + mva #0 temp+1 + + sec + lda #<(screenwidth-1) + sbc temp + sta temp + lda #>(screenwidth-1) + sbc temp+1 + sta temp+1 +DOTNnoOverflow + ;here in temp we have really good x position of text + + mwa temp LineXdraw + + ;now let's get y position + ;we will try to put text as low as possible + ;just above mountains (so mountaintable will be checked) + lda fx + asl + asl + tay + ;in temp there still is X position of text + ;if we add temp and Y we will get end of the text + ;so, lets go through mountaintable and look for + ;the lowest value within + ;Mountaitable+temp and Mountaitable+temp+Y + + adw temp #MountainTable + + mva #screenheight temp2 ;initialisation of the lowest value + +DOTLowestMountainValueLoop + lda (temp),y + cmp temp2 + bcs DOTOldLowestValue ;old lowest value + ;new lowest value + sta temp2 +DOTOldLowestValue + dey + cpy #$ff + bne DOTLowestMountainValueLoop + + sec + lda temp2 + sbc #(4+9) ;9 pixels above ground (and tanks...) + sta LineYdraw + + jmp TypeLine4x4.noLengthNoColor ; rts + +.endp + +;-------------------------------------------------------- +.proc DisplayTankNameAbove ; + lda tankNr + :3 asl ; *8 + clc + adc #Tanksnames + sta temp+1 ; TextAddress+1 + mwa temp LineAddress4x4 + + ;find length of the tank's name + ldy #7 +@ + lda (temp),y + bne end_found + dey + bne @- + +end_found + iny + sty fx + ldy tankNr + jsr Display4x4AboveTank + rts +.endp + +;------------------------------- +.proc TypeLine4x4 ; +;------------------------------- + ;this routine prints line of length `fx` + ;address in LineAddress4x4 + ;starting from LineXdraw, LineYdraw + + lda #14 ; default length of 4x4 texts + sta fx + +variableLength + lda #$ff ; $ff - visible characters, $00 - clearing + +staplot4x4color + sta plot4x4color +noLengthNoColor + + ldy #0 + sty LineCharNr + +TypeLine4x4Loop + ldy LineCharNr + + lda (LineAddress4x4),y + and #$3f ;always CAPITAL letters + sta CharCode4x4 + mwa LineXdraw dx + mva LineYdraw dy + mva #0 dy+1 ; dy is 2 bytes value + jsr PutChar4x4 ;type empty pixels as well! + adw LineXdraw #4 + inc:lda LineCharNr + cmp fx + bne TypeLine4x4Loop + +EndOfTypeLine4x4 + rts +.endp + + +;-------------------------------- +.proc AreYouSure +;using 4x4 font + + mva #4 ResultY ; where seppuku text starts Y-wise on the screen + + ;top frame + mva ResultY LineYdraw + jsr TL4x4_top + adb ResultY #4 ;next line + + ;sure? + mwa #areYouSureText LineAddress4x4 + jsr _sep_opty + ;bottom frame + mva ResultY LineYdraw + jsr TL4x4_bottom + + + jsr GetKey + cmp #@kbcode._Y ; $2b ; "Y" + bne @+ + mva #$80 escFlag + bne skip01 +@ mva #0 escFlag +skip01 + jsr WaitForKeyRelease + + ;clean + mva #3 di + mva #4 ResultY +@ + mva #$ff plot4x4color + mwa #lineClear LineAddress4x4 + jsr _sep_opty + dec di + bne @- + +quit_areyousure + rts +.endp + +.proc _sep_opty + mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering + mva ResultY LineYdraw + jsr TypeLine4x4 + adb ResultY #4 ;next line + rts +.endp + +;-------------------------------- +.proc DisplaySeppuku +;using 4x4 font + + + mva #20 fs ; temp, how many times blink the billboard +seppuku_loop + lda CONSOL ; turbo mode + and #%00000001 ; START KEY + sne:mva #1 fs ; finish it + + mva #4 ResultY ; where seppuku text starts Y-wise on the screen + + ;top frame + mva ResultY LineYdraw + jsr TL4x4_top + adb ResultY #4 ;next line + + ;seppuku + mwa #seppukuText LineAddress4x4 + jsr _sep_opty + + ;bottom frame + mva ResultY LineYdraw + jsr TL4x4_bottom ; just go + + ;clean seppuku + + mva #3 di + ;mva #4 ResultY + lda #4 + sta ResultY +loplop ;@ + mwa #lineClear LineAddress4x4 + jsr _sep_opty + + dec di + bne loplop ;@- + + dec fs + jne seppuku_loop + +quit_seppuku + rts + +.endp + +;-------------------------------------------------- .proc SetMainScreen ; mva #0 dmactls SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen diff --git a/interrupts.asm b/interrupts.asm new file mode 100644 index 0000000..175bdb1 --- /dev/null +++ b/interrupts.asm @@ -0,0 +1,267 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + + .IF *>0 ;this is a trick that prevents compiling this file alone + +;-------------------------------------------------- +.proc DLIinterruptGraph + pha + phy + ldy dliCounter + lda dliColorsBack,y + .IF TARGET = 800 + nop ; necessary on 800 because DLIs take less time, jitter visible without it + nop + nop + .ENDIF + nop + nop + sta COLPF1 + lda GradientNr + bne GoGradient + ldy #$ff ; one mauntain color +GoGradient + iny + lda (GradientColors),y ; mountains colors array + sta COLPF2 + inc dliCounter + ply + pla + rti +.endp +;-------------------------------------------------- +.proc DLIinterruptOptions + pha + phy + lda #0 ; background color + sta COLPF1 + ldy GradientNr + beq @+ + ldy #1 +@ lda (GradientColors),y ; mountains colors array + sta COLPF2 + ply + pla + rti +.endp +;-------------------------------------------------- +.proc DLIinterruptGameOver + pha + phy + lda dliCounter + bne EndofPMG + lda #%00100001 ; playfield after P/M - prior=1 + ;STA WSYNC + sta PRIOR + bne EndOfDLI_GO +EndofPMG + cmp #1 + bne ColoredLines + lda #%00100100 ; playfield before P/M + ;STA WSYNC + sta PRIOR + bne EndOfDLI_GO +ColoredLines + cmp #9 + beq CreditsScroll + tay + lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line) + ldy #$0a ; text colour (brightnes) + ;STA WSYNC + sta COLPF2 + sty COLPF1 + bne EndOfDLI_GO +CreditsScroll + lda #$00 + sta COLPF2 +EndOfDLI_GO + inc dliCounter + ply + pla + rti +.endp +;-------------------------------------------------- +.proc DLIinterruptText + pha + lda dliCounter + bne MoreBarsColorChange + lda #TextBackgroundColor + ;sta WSYNC + sta COLPF2 + mva #TextForegroundColor COLPF3 + bne EndOfDLI_Text +MoreBarsColorChange + and #%00000001 + rol + sta COLPF2 +EndOfDLI_Text + inc dliCounter + pla +DLIinterruptNone + rti + +.endp +;-------------------------------------------------- +.proc VBLinterrupt + mva #0 dliCounter + mva #$02 DliColorBack + + lda PAL + and #%00001110 + beq itsPAL + ;it is NTSC here + dec NTSCcounter + bne itsPAL + mva #6 NTSCcounter + bne SkippedIfNTSC ; skip doing VBL things each 6 frames in Amerika, Amerika + ; We're all living in Amerika, Coca Cola, Wonderbra + +itsPAL + ; pressTimer is trigger tick counter. always 50 ticks / s + bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s + +SkippedIfNTSC + + bit RMT_blocked + bmi SkipRMTVBL + ; ------- RMT ------- + lda sfx_effect + bmi lab2 + asl @ ; * 2 + tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) + ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module) + lda #0 ;A = 0 note (0..60) + bit noSfx + smi:jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) + + lda #$ff + sta sfx_effect ;reinit value +lab2 + jsr RASTERMUSICTRACKER+3 ;1 play + ; ------- RMT ------- +SkipRMTVBL + bit ScrollFlag + bpl EndOfCreditsVBI +CreditsVBI + inc CreditsVScrol + lda CreditsVScrol + cmp #32 ;not too fast + beq nextlinedisplay + :2 lsr ;not too fast + sta VSCROL + jmp EndOfCreditsVBI +nextlinedisplay + lda #0 + sta CreditsVScrol + sta VSCROL + clc + lda DLCreditsAddr + adc #40 + sta DLCreditsAddr + bcc @+ + inc DLCreditsAddr+1 +@ + cmp #CreditsLastLine + bne EndOfCreditsVBI +; adw DLCreditsAddr #40 +; cpw DLCreditsAddr #CreditsLastLine +; bne EndOfCreditsVBI + mwa #Credits DLCreditsAddr +EndOfCreditsVBI + .IF TARGET = 5200 + lda SkStatSimulator + bmi @+ + inc SkStatSimulator +@ + lda JoystickNumber ; select port + ora #%00000100 ; Speaker off, Pots enabled + sta CONSOL5200 + + center = 114 ;Read analog stick and make it look like a digital stick + threshold = 60 + + lda JoystickNumber + asl + tax + lda paddl0,x ;Read POT0 value (horizontal position) + cmp #center+threshold ;Compare with right threshold + rol stick0 ;Feed carry into digital stick value + cmp #center-threshold ;Compare with left threshold + rol stick0 ;Feed carry into digital stick value + + lda paddl1,x ;Read POT1 value (vertical position) + cmp #center+threshold ;Compare with down threshold + rol stick0 ;Feed carry into digital stick value + cmp #center-threshold ;Compare with down threshold + rol stick0 ;Feed carry into digital stick value + + lda stick0 ;0 indicates a press so the right/down values need to be inverted + eor #2+8 + and #$0f + sta stick0 + + ldx JoystickNumber + ; check shift key (5200 second fire button) + lda SKSTAT + :3 lsr ; third bit + and trig0,x ; and first button + ;lda trig0,x + sta strig0 ;Move hardware to shadow + + mva chbas chbase + + lda skstat ;Reset consol key shadow is no key is pressed anymore + and #4 + beq @+ + mva #consol_reset consol + mva #@kbcode._none kbcode +@ + + pla + tay + pla + tax + pla + rti + .ELSE + ; support for joysticks :) + ldx JoystickNumber + lda STICK0,x + sta STICK0 + lda STRIG0,x + sta STRIG0 + jmp XITVBV + .ENDIF +.endp + .IF TARGET = 5200 +.proc kb_continue + sta kbcode ;Store key code in shadow. + mva #0 SkStatSimulator +exit pla + tay + pla + tax + pla + rti +.endp + .ENDIF + +;-------------------------------------------------- +.macro SetDLI +; SetDLI #WORD +; Initialises Display List Interrupts + LDY # <:1 + LDX # >:1 + jsr _SetDLIproc +.endm +.proc _SetDLIproc + LDA #$C0 + STY VDSLST + STX VDSLST+1 + STA NMIEN + rts +.endp + + .ENDIF diff --git a/scorch.asm b/scorch.asm index cf6142f..72a1f95 100644 --- a/scorch.asm +++ b/scorch.asm @@ -1257,251 +1257,6 @@ MakeTanksVisible bpl @- rts .endp -;-------------------------------------------------- -.proc DLIinterruptGraph - pha - phy - ldy dliCounter - lda dliColorsBack,y - .IF TARGET = 800 - nop ; necessary on 800 because DLIs take less time, jitter visible without it - nop - nop - .ENDIF - nop - nop - sta COLPF1 - lda GradientNr - bne GoGradient - ldy #$ff ; one mauntain color -GoGradient - iny - lda (GradientColors),y ; mountains colors array - sta COLPF2 - inc dliCounter - ply - pla - rti -.endp -;-------------------------------------------------- -.proc DLIinterruptOptions - pha - phy - lda #0 ; background color - sta COLPF1 - ldy GradientNr - beq @+ - ldy #1 -@ lda (GradientColors),y ; mountains colors array - sta COLPF2 - ply - pla - rti -.endp -;-------------------------------------------------- -.proc DLIinterruptGameOver - pha - phy - lda dliCounter - bne EndofPMG - lda #%00100001 ; playfield after P/M - prior=1 - ;STA WSYNC - sta PRIOR - bne EndOfDLI_GO -EndofPMG - cmp #1 - bne ColoredLines - lda #%00100100 ; playfield before P/M - ;STA WSYNC - sta PRIOR - bne EndOfDLI_GO -ColoredLines - cmp #9 - beq CreditsScroll - tay - lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line) - ldy #$0a ; text colour (brightnes) - ;STA WSYNC - sta COLPF2 - sty COLPF1 - bne EndOfDLI_GO -CreditsScroll - lda #$00 - sta COLPF2 -EndOfDLI_GO - inc dliCounter - ply - pla - rti -.endp -;-------------------------------------------------- -.proc DLIinterruptText - pha - lda dliCounter - bne MoreBarsColorChange - lda #TextBackgroundColor - ;sta WSYNC - sta COLPF2 - mva #TextForegroundColor COLPF3 - bne EndOfDLI_Text -MoreBarsColorChange - and #%00000001 - rol - sta COLPF2 -EndOfDLI_Text - inc dliCounter - pla -DLIinterruptNone - rti - -.endp -;-------------------------------------------------- -.proc VBLinterrupt - mva #0 dliCounter - mva #$02 DliColorBack - - lda PAL - and #%00001110 - beq itsPAL - ;it is NTSC here - dec NTSCcounter - bne itsPAL - mva #6 NTSCcounter - bne SkippedIfNTSC ; skip doing VBL things each 6 frames in Amerika, Amerika - ; We're all living in Amerika, Coca Cola, Wonderbra - -itsPAL - ; pressTimer is trigger tick counter. always 50 ticks / s - bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s - -SkippedIfNTSC - - bit RMT_blocked - bmi SkipRMTVBL - ; ------- RMT ------- - lda sfx_effect - bmi lab2 - asl @ ; * 2 - tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) - ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module) - lda #0 ;A = 0 note (0..60) - bit noSfx - smi:jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) - - lda #$ff - sta sfx_effect ;reinit value -lab2 - jsr RASTERMUSICTRACKER+3 ;1 play - ; ------- RMT ------- -SkipRMTVBL - bit ScrollFlag - bpl EndOfCreditsVBI -CreditsVBI - inc CreditsVScrol - lda CreditsVScrol - cmp #32 ;not too fast - beq nextlinedisplay - :2 lsr ;not too fast - sta VSCROL - jmp EndOfCreditsVBI -nextlinedisplay - lda #0 - sta CreditsVScrol - sta VSCROL - clc - lda DLCreditsAddr - adc #40 - sta DLCreditsAddr - bcc @+ - inc DLCreditsAddr+1 -@ - cmp #CreditsLastLine - bne EndOfCreditsVBI -; adw DLCreditsAddr #40 -; cpw DLCreditsAddr #CreditsLastLine -; bne EndOfCreditsVBI - mwa #Credits DLCreditsAddr -EndOfCreditsVBI - .IF TARGET = 5200 - lda SkStatSimulator - bmi @+ - inc SkStatSimulator -@ - lda JoystickNumber ; select port - ora #%00000100 ; Speaker off, Pots enabled - sta CONSOL5200 - - center = 114 ;Read analog stick and make it look like a digital stick - threshold = 60 - - lda JoystickNumber - asl - tax - lda paddl0,x ;Read POT0 value (horizontal position) - cmp #center+threshold ;Compare with right threshold - rol stick0 ;Feed carry into digital stick value - cmp #center-threshold ;Compare with left threshold - rol stick0 ;Feed carry into digital stick value - - lda paddl1,x ;Read POT1 value (vertical position) - cmp #center+threshold ;Compare with down threshold - rol stick0 ;Feed carry into digital stick value - cmp #center-threshold ;Compare with down threshold - rol stick0 ;Feed carry into digital stick value - - lda stick0 ;0 indicates a press so the right/down values need to be inverted - eor #2+8 - and #$0f - sta stick0 - - ldx JoystickNumber - ; check shift key (5200 second fire button) - lda SKSTAT - :3 lsr ; third bit - and trig0,x ; and first button - ;lda trig0,x - sta strig0 ;Move hardware to shadow - - mva chbas chbase - - lda skstat ;Reset consol key shadow is no key is pressed anymore - and #4 - beq @+ - mva #consol_reset consol - mva #@kbcode._none kbcode -@ - - pla - tay - pla - tax - pla - rti - .ELSE - ; support for joysticks :) - ldx JoystickNumber - lda STICK0,x - sta STICK0 - lda STRIG0,x - sta STRIG0 - jmp XITVBV - .ENDIF -.endp - .IF TARGET = 5200 -.proc kb_continue - sta kbcode ;Store key code in shadow. - mva #0 SkStatSimulator -exit pla - tay - pla - tax - pla - rti -.endp - .ENDIF ;---------------------------------------------- .proc RandomizeSequence0 ldx #0 @@ -1973,66 +1728,7 @@ noingame rts .endp ;-------------------------------------------------- -.macro SetDLI -; SetDLI #WORD -; Initialises Display List Interrupts - LDY # <:1 - LDX # >:1 - jsr _SetDLIproc -.endm -.proc _SetDLIproc - LDA #$C0 - STY VDSLST - STX VDSLST+1 - STA NMIEN - rts -.endp -;-------------------------------------------------- -/* ;-------------------------------------------------- -.macro randomize floor ceiling -;-------------------------------------------------- - ;usage: randomize floor ceiling - ;returns (in A) a random .byte between "floor" and "ceiling" - jsr _randomizator - .byte :floor - .byte :ceiling -.endm - -.proc _randomizator -; private function that accompanies `randomize` macro -; trashes: magic, temp, Y - pla - sta magic - pla - sta magic+1 - ldy #1 ; add 1 to the value got from the stack to point to the input parameters - lda (magic),y - sta temp - iny - lda (magic),y - sta temp+1 - -?rand - lda random - cmp temp ;floor - bcc ?rand - cmp temp+1 ;ceiling - bcs ?rand - tay ; save the result - - ; point the PC to a byte after the parameters - clc - lda magic - adc #2 ; length of the parameters in bytes - sta magic - lda magic+1 - adc #0 - pha - lda magic - pha - tya ; retrieve the result - rts -.endp */ + icl 'interrupts.asm' ;---------------------------------------------- icl 'constants.asm' ;---------------------------------------------- diff --git a/scorch.bin b/scorch.bin index 9aac8ae191b9ebaf93297a1e9b94586a93e37914..cbaf2e1fcd9f59dfb8cce554154aad35d1a3221f 100644 GIT binary patch delta 3349 zcmZ`*4OG-s7H8hTpg1t2Olr!&Q&B{qnF$4y0$s$9;SVt%6p7gYVZaCsj0ooNVfmEY zrjTd09}!6X(MOGew1{_*f#Ez0qW$a@2SYNR(pwl^tFOhImE zfzGHitiu_CnAtfC)w2L+*g0p|71ykD-XGZq&OpRW&LG6rf|$VCm3)Srl5^k$7v?gA zl_pHKVzdne(IeVRIPIaSuM2p#0Vf;re{ylbHWonq3TN@B_uw}Kd{6dLQ18!`3MT~o zl>rp2LYY-|?yIrCvWWaKB6$(ibrQlTU38>VEpk#^y&EG7dD`ZsyzybMEozRIKY z;OIs?$A*7jixX`)q>e^~-X0cb!m$ll(}<7O;`27TA#?-!%t44?4Q;bQmbf-u8eRsot>r2lmys~cVAKIT#Ok2^%!m1+ldtSO%1y=TbRvcd= z+KCnBez)#0#khoSpK~lpT>~NpH)+S?HXOYJz8Jn}#8Yzdqx1Qyv9MOz&3u(`(s04| z3yL%&d?)HK(pSUR^5MtuH8PpWBIFrqswyD}%r6>gg({5(&He~wnd#@V54vAeeHPp_ z#|FDqv-PBgDT$q7vXfmWwQLdDg#mt}B#3P$GL}Yy@!Cd)Agr23<{_bAr0gu~GT|4^ zqHB}uL$h;--1UjsSs`aK;^Nu-IhBw-2om-udK@xYN?d@^K!sS~d@>m0XCAt; zmY_HjeKT^t^p!3X{XB9Z0*qXb+#8w)xKswijw3>c(S0Clxs>0qZ}A}*-0PPFOMC`7 z(Yp}%8H&z8b8zDh4hXnapV&t}#^zEwv0Rs^b&M_Yfs>_^lPr(8Su^b*zYxHbbEPydn|(tCV_Iw4k%4bW7Z# z2&Jhj2v3%IloMS+0L~MN;dQ;CJ`@2=o{5Wznk)mr479<^!KrqS@>Se#^qzz`bnt!k z<@9{q8MM8ecEs;T4_VzY2_HyMd9578%^&y=uBFv3FTPji9c<1vU8H zpFd{XLBb+QDI_BWu2cjT^hRQIdUSQC1j|eidj_8Tv!NF6h$Tg|T$U0`FB&QY%v8f| z#3C;mDjq5ts`h@%q&^XSaOJ!e5KIdMvk>Ip`{kpcI$As}zUuctJ6A?&e{nRm?u(n{ za_H1vFq;xjxqvCXwlV_25V{H@IJIWg5vSi(CC{_W)LJCO{DV{pom1NC)R0mR!!0uzSIs?R_Lk)+jh2mZG z&XiL1je4&dJRisJ*LMc=RgU~^7Pp4=Q)T&D*S@)4Tj?hi?J1r!Ad&UqN7@zf=v^Q3X-*+Oz&{4@ZhJ z?E;#prDJLL1x?gKuizHa-;e;V-12oFOXAeKnVh`r4PkTPH;_epdg-ll-E3TWuaT!>)#^~_j*mHc<67G15Q5gRu0p=87B%8SMq23;J^W5N4| zIDT~-i)KMP0UZWZXt>;S8LUOt>d*-6jOL4A1mx zd4n`bzQS+veu_6G(Bqu9ML&=$#gDc{Z&OOKrp?zMxtDEPC|RtoffCONXA%g;c7UCN zeu70?u7DPAP5?FN2e{g)UY}aPZ`Dq2E`-t`;Dc;3dx_k+L=KqYo&rc9`4fKL zNHzK>q~Akx_0i~AgL{|$s)PruM0iSm(J1`%g!rXbim%qSWiQ}y`9K>^HQ93hd3Ux) z;SXthvOlVGb5?}^kL)b*Ohwz2qXp-*Q6K4kKBrcKuGP^6x!IA|>P|#Li4c;Wg1@OJ z$<6`=a9#%$lAFXe2Xa?~rg)OmH7OKNaT+JZ(>)fnWK?CKGvjM~k%8Ry8s@6c+j!Gy zVRJ}(XTZL}uKE`Sv8v7EQC{bn`^sscvB}3{7fvWfYXKI%g%BTVd~3qBHoq3t znj%q>gXWqR@uy%nC8)V?+;4X&u0WcX4Udm47S*xoei+dKQ#vm~H%-ZWNH)jM0Mr3+ z;P_T^GixNY1fxDI=iN8rq1ex$&PE^qBBu$`j9n{;PcPS%dg@Vi(^d jJ89>Z`LuUSApPr>F4SajZ!LIA1r01`6!*7P3gv$R`xuZh delta 3372 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 diff --git a/scorch.xex b/scorch.xex index 2b8452e7ea875ea8560c1b2a70404c50e2e84804..7c11acc00b6be26bf8a9208ea0baf0e8e48d3b6d 100644 GIT binary patch delta 3202 zcmZ`*eOQy%6;Eye6(dQN3R;1Sf{Gslq#~W46+g!dk^oMJ&;Zp2!bd_3iGqrb3#d;N zxWd$yip&>z>99c1XLF+N>4+pxyC+&jS6A2SWYU!`tdB+ep*uH;w(9mra_&9%oOAE_ zcz@@d+bub_ThehM0bNkiKP5Eo8c{a=u{lK;g*W{}KxXk(d_jprlLdrFlsJA9wq^h$ ztUu}=9{r|!bqilf#t#(uOfnA16htJ`&Ax<>uEX0nJT4KW&n8Q_Tn?X5z`4fUhsY-E z&xDCtd0c!b^YCqJa%oE853gu}yJEu%?Xf zcZyZqpA&n|%HZ`zC3w<+byY4lteH9bSyJ?z5AtqB%W&Gh6B-wHWhsB&8I03*;`;_( zLw10hm71Onfjq^CU^g``@Vo-qlHPoX6l;gXc* z6#8z)To~X3k&9I0ULvHdig*|4@Pw+P< z`hifhTzG6gE^lgTPQj~EA)mq`a}*N%%+W{)HAf=hm9RTzhJ?8 zOpehC%~VMqghSB8pc`s>OH++5sHr+Xbjpab*&C1K+U4IidqW+blG$GG80RV?s1iPZ zM#xAm)Jsntd?q+nZ00NZ09t{H%q^Yxvva zLger*beZUO-J;3XLRbxyJJ7&xes^z`!;3HPt#nGb%LUY-OF#uhG^jWrXnm1&ZyZks zM-#$V$KBmC=oPq`kZLZZ2!n*8I6AV+6vubp-Al6h(}NJ4c0Y@@eqR< z0W5iT)@sK!RUEGxln_-1vStaRhz^|LvmMBqW6iee9K(Xd#iCk6z$}QR3SyZB{I5Oy z0T3O?dCDI0SfHJTkfC$IB>gjY?Fx3uH8|q<1$NV{5Eyah{+KImRqsi)FkTEk?c+#JhxU?!8o*UTO@+E z^l;l6^q!W+Z;wU4HPX`U3(yQB?cT0JohF)I7DQu8Baq%?$t?XFqH^_F6jMe&RL?+# zrS!f!0>y5pI5*^1t6Y!-0403m#s_=>5CF%nU4VL1LQ2(ISD~G*|^ir(jUI- z@94gP`jr3D`@R8Mz9qZ-ycmkbGIh^&M(KCI4j%hup{Jt0ETmx--?I!%CE2JupH`B! zj9exQCW27gKpWrI`+m*W&7#WIdzEb%C!5RvEulUZOs*G-_R15&muJYbi30^PX49c#M! z;H(Kh;awtjR}N^!!6>j!-`^i>xq8qbMqe0dLTw@=M{6fDa;7$xk*{iB3;x2$cQK?T zS$sD`V3PB6euBY?uB@YDrWd=S0H5jSbrXZGYu$+*Pa2y<6}`=-6TLX9&Tf}KWLfg3 zKSK`;bOnv^o?Z-}1TCZUyj=qxwa{06)Cv{8Xrx1Q&f3Vb7B;9E09$&G*Ti_P;0-qK z8a8dT;v^Rc-8v;3FhB{o4t!k|;yUA`)FVZIps&mnL^v7@#sT6$ufN>WDjO7$D}k`h z^(7y}HdjQhGKcs>bA#E{__V%Vb_Fs%!#3ia2GeH5Qcp=y=b_hGgNdnMz({`moY7E$ zP(b(r D0at-L delta 3231 zcmZ`5dsNfcIk}OD2qdjk!3tauMSOx*#i>}QtvY@n5^#2i4NxHvN*)k-R8TAz@ezew zVU~`G)F1NW3=71mb>iGP15J+I36_V`sZ%GyIojcRjIef(LY7k?ea{hk89W@jK^F5At1A~2luFOP@I6UX98Zc6?Y{ABBU>T z5W9ci{JM=FZo*zFd?pSDZWAPAn-hH**KWjx9QKL<>hp0jE|bGw#KXPTdLSvuXaQ8(>b`tLUT07Y(@7R&SaT%v`uON90Q#&4zc-GuAN zzKP<*<@DyJlS@W&;Z^_>>TtIa|L`Gv3HXi*JMnz)tt~#o-j(v_TYR{R_}k(?5Ylt; zdFY^u&R1<_pj@?HjuO<|92MlZg{!tW+PJcSkJa3pw}BajeeUVwx*L+&e);Ljr8`+k|%97sClc(AyS zJE*dzt7pmB^DEP;09dDg;31WPBpSZG0D;ct?dgdAYUg=0ltCvKhoX=Sx~ez~P2Nef ziUW7e%;MX8GslrO;VEes5{MO>G<+NB$CI+)!L~ULxv-n`ImR(%EYLDiDKKit8G!9V zqR7!z>3FOL!s|fxSCRd0hD)wm@F5i~fsQaK2$7Ns#w}8an%9b|2VYh_rsf3|Pr51` zXViFej;MX@m>e3ciFp5R#&D2WM8XZHw3nVENX?!K*PBHB%S6i&*mCuMGQ3Dj+cmkn z#*A_a_{%Pza1XvMatNewmQ02fT3-~#-OUghUPWDe1qD?P{&f}d{A?VY&9Y<-%Y$FA zJQyX%=!wi=*(fBQEprh%mqnjvR-j{9v?42LnrA|T8}8TImESkGK}nrb*jBfCiA4Ze z-kB8|*sq0r@326{!m} zs@hUSYjrE8HtOMPV7CJel=7vWdmZEW-JRvbGOkTWhjq~?#z0rt55@Yz$t@)>S<9hVf%7yg+DZE=f_EvXePqWM?J_u?KuItZt<0S=8=R>IXQlxD8y9{6 zNC(o!(2rdbXm@U4_)mhI_oCm_Ltai@aB`xZBA5=GHw^)Z%EJg=tPUZzL za5*nv&X0_OoEUgvgLIz9wJ;bWV*=rMgJ35^P^IZ-v$~D^$uKFT#bgsRzvX*{V=nk0 zwitZmn<*u!f;-sQUqp?jV6;4+)|jG@M?UQ{WrZ_Vo6I2xR%ptMQ^rYlbTlYH-Xvjn zy>#w(if~yIWc-n`YPg~L9sU!XYFMAI+3|DKTtsi|hbszbqe}b`%$N5{ z?987tcHKd}`Bc99mu|iJun$;McVCo(_pQNu`Wd9pJ`R|8Rqu+?RXq(U`+=DhOj6O2 z99m8`FwjkwP6ndpfo8tB^YhAY8YJaSgXPT_=mW}^Gm510*syMJL7hbb6SCXbsMQdy zJzU256SiQeh1W(X-V4e*suP_pEa1cA%eq*E z*HxrWgf#&+2bjQM*y)O8n}RejsICZalRhNgM02JuJc1u)gP+SH=B1`!XnjSNqRRWxjsE2Zf0k=3kaFREV3Kz8+9 zcgR3UA~3JMIwXMUsh5CAo5bM;3T#I!r4?ljq5;(=dars7V+*aB{YJNu`|^lgSp$Z8 zyHW{m(reyc3<90q(JgF)?iyTyxn@UrbmkW;%VE_ zDJUqO+K=vZ3yQ~y@ih9A?F`ZWNgo6IYdHq4*FI*~kO=lqyHH}h)$*H#KCqCoZeg{z H{!8&6rqquh diff --git a/textproc.asm b/textproc.asm index 52622fa..6ee2faa 100644 --- a/textproc.asm +++ b/textproc.asm @@ -1603,309 +1603,6 @@ displayloop1 rts .endp -;-------------------------------------------------------- -.proc DisplayOffensiveTextNr ; - ldx TextNumberOff - lda talk.OffensiveTextTableL,x - sta LineAddress4x4 - lda talk.OffensiveTextTableH,x - sta LineAddress4x4+1 - inx ; the next text - lda talk.OffensiveTextTableH,x - sta temp+1 - lda talk.OffensiveTextTableL,x - sta temp ; opty possible - ; substract address of the next text from previous to get text length - sbw temp LineAddress4x4 temp2 - mva temp2 fx - - ;jsr Display4x4AboveTank - ;rts - ; POZOR !!! -.endp - -;-------------------------------------------------------- -.proc Display4x4AboveTank ; - ; Displays texts using PutChar4x4 above tank and mountains. - ; Pretty cool, eh! - ;parameters are: - ;Y - number of tank above which text is displayed - ;fx - length of text - ;LineAddress4x4 - address of the text - - ;lets calculate position of the text first! - ;that's easy because we have number of tank - ;and xtankstableL and H keep X position of a given tank - - lda xtankstableL,y - sta temp - lda xtankstableH,y - sta temp+1 - ;now we should substract length of the text-1 - ;temp2 = (fx-1)*2 - ldy fx - dey - tya - asl - sta temp2 - mva #0 temp2+1 - ;now we have HALF length in pixels - ;stored in temp2 - - ;here we assume max length of text - ;to display is 127 chars, but later it turns out it must be max 63! - - sbw temp temp2 ; here begin of the text is in TEMP !!!! - ;now we should check overflows - ;lda temp+1 ; opty - bpl DOTNnotLessThanZero - ;less than zero, so should be zero - mwa #0 temp - beq DOTNnoOverflow - -DOTNnotLessThanZero - ;so check if end larger than screenwidth - - - lda fx - asl - asl - ;length in pixels - - ;text length max 63 chars !!!!!!!! - - - clc - adc temp - sta temp2 - lda #0 - adc temp+1 - sta temp2+1 - ;now in temp2 is end of the text in pixels - ;so check if not greater than screenwitdth - cpw temp2 #screenwidth - bcc DOTNnoOverflow - - ;if end is greater than screenwidth - ;then screenwidth - length is fine - lda fx - asl - asl - sta temp - mva #0 temp+1 - - sec - lda #<(screenwidth-1) - sbc temp - sta temp - lda #>(screenwidth-1) - sbc temp+1 - sta temp+1 -DOTNnoOverflow - ;here in temp we have really good x position of text - - mwa temp LineXdraw - - ;now let's get y position - ;we will try to put text as low as possible - ;just above mountains (so mountaintable will be checked) - lda fx - asl - asl - tay - ;in temp there still is X position of text - ;if we add temp and Y we will get end of the text - ;so, lets go through mountaintable and look for - ;the lowest value within - ;Mountaitable+temp and Mountaitable+temp+Y - - adw temp #MountainTable - - mva #screenheight temp2 ;initialisation of the lowest value - -DOTLowestMountainValueLoop - lda (temp),y - cmp temp2 - bcs DOTOldLowestValue ;old lowest value - ;new lowest value - sta temp2 -DOTOldLowestValue - dey - cpy #$ff - bne DOTLowestMountainValueLoop - - sec - lda temp2 - sbc #(4+9) ;9 pixels above ground (and tanks...) - sta LineYdraw - - jmp TypeLine4x4.noLengthNoColor ; rts - -.endp - -;-------------------------------------------------------- -.proc DisplayTankNameAbove ; - lda tankNr - :3 asl ; *8 - clc - adc #Tanksnames - sta temp+1 ; TextAddress+1 - mwa temp LineAddress4x4 - - ;find length of the tank's name - ldy #7 -@ - lda (temp),y - bne end_found - dey - bne @- - -end_found - iny - sty fx - ldy tankNr - jsr Display4x4AboveTank - rts -.endp - -;------------------------------- -.proc TypeLine4x4 ; -;------------------------------- - ;this routine prints line of length `fx` - ;address in LineAddress4x4 - ;starting from LineXdraw, LineYdraw - - lda #14 ; default length of 4x4 texts - sta fx - -variableLength - lda #$ff ; $ff - visible characters, $00 - clearing - -staplot4x4color - sta plot4x4color -noLengthNoColor - - ldy #0 - sty LineCharNr - -TypeLine4x4Loop - ldy LineCharNr - - lda (LineAddress4x4),y - and #$3f ;always CAPITAL letters - sta CharCode4x4 - mwa LineXdraw dx - mva LineYdraw dy - mva #0 dy+1 ; dy is 2 bytes value - jsr PutChar4x4 ;type empty pixels as well! - adw LineXdraw #4 - inc:lda LineCharNr - cmp fx - bne TypeLine4x4Loop - -EndOfTypeLine4x4 - rts -.endp - - -;-------------------------------- -.proc AreYouSure -;using 4x4 font - - mva #4 ResultY ; where seppuku text starts Y-wise on the screen - - ;top frame - mva ResultY LineYdraw - jsr TL4x4_top - adb ResultY #4 ;next line - - ;sure? - mwa #areYouSureText LineAddress4x4 - jsr _sep_opty - ;bottom frame - mva ResultY LineYdraw - jsr TL4x4_bottom - - - jsr GetKey - cmp #@kbcode._Y ; $2b ; "Y" - bne @+ - mva #$80 escFlag - bne skip01 -@ mva #0 escFlag -skip01 - jsr WaitForKeyRelease - - ;clean - mva #3 di - mva #4 ResultY -@ - mva #$ff plot4x4color - mwa #lineClear LineAddress4x4 - jsr _sep_opty - dec di - bne @- - -quit_areyousure - rts -.endp - -.proc _sep_opty - mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering - mva ResultY LineYdraw - jsr TypeLine4x4 - adb ResultY #4 ;next line - rts -.endp - -;-------------------------------- -.proc DisplaySeppuku -;using 4x4 font - - - mva #20 fs ; temp, how many times blink the billboard -seppuku_loop - lda CONSOL ; turbo mode - and #%00000001 ; START KEY - sne:mva #1 fs ; finish it - - mva #4 ResultY ; where seppuku text starts Y-wise on the screen - - ;top frame - mva ResultY LineYdraw - jsr TL4x4_top - adb ResultY #4 ;next line - - ;seppuku - mwa #seppukuText LineAddress4x4 - jsr _sep_opty - - ;bottom frame - mva ResultY LineYdraw - jsr TL4x4_bottom ; just go - - ;clean seppuku - - mva #3 di - ;mva #4 ResultY - lda #4 - sta ResultY -loplop ;@ - mwa #lineClear LineAddress4x4 - jsr _sep_opty - - dec di - bne loplop ;@- - - dec fs - jne seppuku_loop - -quit_seppuku - rts - -.endp ;-------------------------------- .proc DisplayResults ; ;displays results of the round