diff --git a/lib/stdlib.inc b/lib/stdlib.inc index 62eb8fc..e0b08a7 100644 --- a/lib/stdlib.inc +++ b/lib/stdlib.inc @@ -240,6 +240,7 @@ procedure freadreal(var v:real;var f:file); external; procedure openchannel(name:filenamestr; var f:file; mode:filemode; var error:integer); external; procedure open(var f:file; name:pathnamestr; mode: filemode); external; procedure noecho(var f:file; noecho:boolean; var old:boolean); external; +procedure nointr(var f:file; aBool:boolean; var old:boolean); external; procedure intstr(v:integer; fieldWith:integer; var rbuf:string); external; @@ -269,8 +270,8 @@ procedure TextDefault; external; procedure PTerm; external; (* from runtime.s *) procedure PExec(prgfile:pathnamestr; var args:PArgVec; argCount:integer;var error:integer); external; -procedure PExec2(prgfile:pathnamestr; arg1:string; var error:integer); external; -procedure PExec3(prgfile:pathnamestr; arg1, arg2:string; var error:integer); external; +procedure PExec1(prgfile:pathnamestr; arg1:string; var error:integer); external; +procedure PExec2(prgfile:pathnamestr; arg1, arg2:string; var error:integer); external; function ParamStr(i:integer):string; external; function ParamCount():integer; external; diff --git a/lib/stdlib.pas b/lib/stdlib.pas index 945ece9..a57ba1c 100644 --- a/lib/stdlib.pas +++ b/lib/stdlib.pas @@ -2563,6 +2563,16 @@ begin end; end; +procedure nointr(var f:file;aBool:boolean;var old:boolean); +begin + if f.typ <> IOChannel then + fileerror(f, IOInvalidOp) + else + begin + old := f.nointr; + f.nointr := nointr; + end; +end; (* implementation of Xorshift algorithm by George Marsaglia, see: Marsaglia, George (July 2003). @@ -2599,6 +2609,7 @@ begin if ord(aChar) <= ord('z') then upcase := chr(ord(aChar) - 32) else + upcase := aChar else upcase := aChar; end; @@ -2664,14 +2675,14 @@ begin end; end; -procedure PExec2(prgfile:pathnamestr; arg1:string; var error:integer); +procedure PExec1(prgfile:pathnamestr; arg1:string; var error:integer); var args:PArgVec; begin args[0] := arg1; PExec(prgfile, args, 1, error); end; -procedure PExec3(prgfile:pathnamestr; arg1, arg2:string; var error:integer); +procedure PExec2(prgfile:pathnamestr; arg1, arg2:string; var error:integer); var args:PArgVec; begin args[0] := arg1; diff --git a/pcomp/pcomp.pas b/pcomp/pcomp.pas index 8936f7a..a3e4986 100644 --- a/pcomp/pcomp.pas +++ b/pcomp/pcomp.pas @@ -1,5 +1,5 @@ (* Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details *) -{$H384} +{$H600} {$S64} program PascalCompiler; {$R+} diff --git a/progs/shell.pas b/progs/shell.pas index 610dcfe..6423b3f 100644 --- a/progs/shell.pas +++ b/progs/shell.pas @@ -324,7 +324,7 @@ begin PExec(EDITORPROG, args, 3, error); end else - PExec2(EDITORPROG, ShellWorkFile, error); + PExec1(EDITORPROG, ShellWorkFile, error); writeln('PExec error ', error); end; @@ -334,7 +334,7 @@ var filename:filenamestr; begin requireWorkfile; filename := replaceExtension(ShellWorkFile, '.s'); - PExec2(ASMPROG, filename, error); + PExec1(ASMPROG, filename, error); writeln('PExec error ', error); end; @@ -344,7 +344,7 @@ var filename:filenamestr; begin requireWorkfile; filename := replaceExtension(ShellWorkFile, '.pas'); - PExec3(COMPILERPROG, '-S', filename, error); + PExec2(COMPILERPROG, '-S', filename, error); writeln('PExec error ', error); end; @@ -354,7 +354,7 @@ var filename:filenamestr; begin requireWorkfile; filename := replaceExtension(ShellWorkFile, '.pas'); - PExec2(COMPILERPROG, filename, error); + PExec1(COMPILERPROG, filename, error); writeln('PExec error ', error); end; @@ -373,7 +373,7 @@ end; procedure krunch; var error:integer; begin - PExec2(RECLAIMPROG, DefaultVolume, error); + PExec1(RECLAIMPROG, DefaultVolume, error); writeln('PExec error ', error); end; diff --git a/tridoraemu/framebuffer.go b/tridoraemu/framebuffer.go index 4586287..189100a 100644 --- a/tridoraemu/framebuffer.go +++ b/tridoraemu/framebuffer.go @@ -32,6 +32,7 @@ type Framebuffer struct { paletteSlot word vmem [VmemWords]word readCount int + paletteChanged bool } func (f *Framebuffer) initialize() { @@ -104,6 +105,26 @@ func (f *Framebuffer) readPalette() word { return word(0) } +func (f *Framebuffer) startFrame() { + // when the palette changes, we + // need to redraw every pixel + // to get the new colors + if f.paletteChanged { + oldRAddr := f.readAddr + oldWAddr := f.writeAddr + f.readAddr = 0 + f.writeAddr = 0 + + for i := 0; i < VmemWords; i++ { + f.writeVmem(f.readVmem()) + } + + f.readAddr = oldRAddr + f.writeAddr = oldWAddr + f.paletteChanged = false + } +} + func (f *Framebuffer) writePalette(value word) { // 4 bits per color channel r := uint8((value & 0b111100000000) >> 8) @@ -116,6 +137,7 @@ func (f *Framebuffer) writePalette(value word) { b = b << 4 f.palette[f.paletteSlot] = color.RGBA{r,g,b,0} + f.paletteChanged = true } func (f *Framebuffer) readCtl() word { diff --git a/tridoraemu/tridoraemu.go b/tridoraemu/tridoraemu.go index 875c3c0..88804b4 100644 --- a/tridoraemu/tridoraemu.go +++ b/tridoraemu/tridoraemu.go @@ -43,6 +43,7 @@ type Game struct{ func (g *Game) Update() error { startTime := time.Now() + framebuffer.startFrame() for i := 0; i < g.stepsPerFrame; i++ { err := cpu.step() if err != nil {