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 9aac8ae..cbaf2e1 100644 Binary files a/scorch.bin and b/scorch.bin differ diff --git a/scorch.xex b/scorch.xex index 2b8452e..7c11acc 100644 Binary files a/scorch.xex and b/scorch.xex differ 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