1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2026-04-20 16:16:34 +00:00

Another attempt at workable VBL measurement

This commit is contained in:
David Schmenk
2025-03-02 22:01:53 -08:00
parent 279123fd68
commit 9425c69b39
4 changed files with 41 additions and 76 deletions
-2
View File
@@ -1,5 +1,3 @@
import vblank
const VBLUNIMPL = $AAAA
predef waitVBL#1
predef statusVBL#1
end
+18 -16
View File
@@ -714,27 +714,29 @@ def a2textmode(columns)
columns = (cmdsys:_sysflags_ & vid80col) ?? 80 :: 40
fin
if columns > 40 and MACHID & MACHID_80COL
cswsave = *CSW
kswsave = *KSW
call($C300, 0, 0, 0, 0)
if MACHID & $C0 == MACHID_IIE
conio:clear = @a2clear80e
conio:gotoxy = @a2gotoxy80e
conio:textctrl = @a2ctrl80e
else // MACHID_II
^$C059 // 80 column output softswitch
conio:clear = @a2clear80v
conio:gotoxy = @a2gotoxy80v
conio:textctrl = @a2ctrl80v
conio:putchars = @a2putchars
if not (flags & txt80)
cswsave = *CSW
kswsave = *KSW
call($C300, 0, 0, 0, 0)
if MACHID & $C0 == MACHID_IIE
conio:clear = @a2clear80e
conio:gotoxy = @a2gotoxy80e
conio:textctrl = @a2ctrl80e
else // MACHID_II
^$C059 // 80 column output softswitch
conio:clear = @a2clear80v
conio:gotoxy = @a2gotoxy80v
conio:textctrl = @a2ctrl80v
conio:putchars = @a2putchars
fin
flags = flags | txt80
fin
flags = flags | txt80
else
if flags & txt80
if MACHID & $C0 == MACHID_IIE
cout(21)
else // Videx disable
^$C058 // 80 column output softswitch
^$C058 // 40 column output softswitch
*CSW = cswsave
*KSW = kswsave
a2viewport(0, 0, 40, 24)
@@ -980,4 +982,4 @@ if cmdsys:_sysflags_ & vid80col; conio:textmode(80); fin
// Keep module in memory
//
return modkeep
done
done
+19 -49
View File
@@ -4,38 +4,52 @@ include "inc/cmdsys.plh"
//
export asm waitVBL#1
!SOURCE "vmsrc/plvmzp.inc"
LDA #$00
STA TMPH
STA TMPL
PHP ; //c version first because its largest
SEI
STA $C07F ; Enable IOU access and reset VBL int on //c
LDA $C041 ; Save VBL int state MSB = BVL int enebaled
STA $C05B ; Enable VBL int
STA $C070 ; Reset VBL int on //c
- BIT $C019
- INC TMPL
BNE +
INC TMPH
+ BIT $C019
BPL - ; Wait for VBL
ASL
BCS +
STA $C05A ; Disable VBL int on //c
+ STA $C07E ; Disable IOU access on //c
PLP
LDA #$FF ; Return TRUE
DEX
LDA TMPL ; Return count
STA ESTKL,X
LDA TMPH
STA ESTKH,X
RTS
end
asm _vbl2e#1
LDA #$00
STA TMPH
STA TMPL
- LDA $C019 ; //e version
BPL -
- LDA $C019 ; Wait during active video
- INC TMPL
BNE +
INC TMPH
+ LDA $C019 ; Wait during active video
BMI -
LDA #$FF ; Return TRUE
DEX
LDA TMPL ; Return count
STA ESTKL,X
LDA TMPH
STA ESTKH,X
RTS
end
asm _vblnop#1
LDA #$AA ; NOP version
LDA #$00 ; NOP version
DEX ; return FALSE
STA ESTKL,X
STA ESTKH,X
@@ -43,57 +57,13 @@ asm _vblnop#1
end
asm _vblend#1
end
export asm statusVBL#1
PHP ; //c version first because its largest
SEI
STA $C07F ; Enable IOU access and reset VBL int on //c
LDA $C041 ; Save VBL int state MSB = VBL int enebaled
STA $C05B ; Enable VBL int
LDY #$00
BIT $C019
BPL + ; Check for VBL
DEY
STA $C070 ; Reset VBL int on //c
+ ASL
BCS +
STA $C05A ; Disable VBL int on //c
+ STA $C07E ; Disable IOU access on //c
PLP
TYA
DEX
STA ESTKL,X
STA ESTKH,X
RTS
end
asm _stat2e#1
LDA #$00 ; //e version
BIT $C019 ; Check for VBL
BPL +
LDA #$FF
+ DEX
STA ESTKL,X
STA ESTKH,X
RTS
end
asm _statnop#1
LDA #$AA ; NOP version
DEX ; return UNIMPL
STA ESTKL,X
STA ESTKH,X
RTS
end
asm _statend#1
end
//
// Check for machine specific VLB handling
//
memcpy(@statusVBL, @_stat2e, @_statnop-@_stat2e)
if MACHID & MACHID_MODEL == MACHID_IIE
memcpy(@waitVBL, @_vbl2e, @_vblnop-@_vbl2e)
memcpy(@statusVBL, @_stat2e, @_statnop-@_stat2e)
elsif MACHID & MACHID_MODEL <> MACHID_IIC
memcpy(@waitVBL, @_vblnop, @_vblend-@_vblnop)
memcpy(@statusVBL, @_statnop, @_statend-@_statnop)
fin
//
// Keep module in memory
+4 -9
View File
@@ -1316,6 +1316,7 @@ def editmode#0
if not (flags & exit)
conio:textctrl(ctrlecho, OFF)
conio:textctrl(ctrlcursor, OFF)
conio:clear(cls)
drawscrn
fin
wend
@@ -1532,15 +1533,8 @@ if ^arg
cursrow = strtonum(arg)
fin
fin
if statusVBL <> VBLUNIMPL
cursflash = 0
while statusVBL
loop
while not statusVBL and cursflash < 1000
cursflash++
loop
cursflash = cursflash * 30 // Make it flash a little slower
fin
cursflash = waitVBL
if cursflash == 0; cursflash = 300; fin
flags = flags | insmode | gutter
scrnwidth = conio:textmode(scrnwidth)
inittxtbuf
@@ -1550,6 +1544,7 @@ if cursrow
curshpos(0)
cursvpos(cursrow - 1)
fin
conio:clear(cls)
drawscrn
editmode
conio:textmode(0) // Set default mode