aboutsummaryrefslogtreecommitdiff
path: root/CHANGELOG.md
blob: 5fa49db17ce928eea72d174f78f916c58820c2d1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956

# PSn00bSDK changelog

**NOTE**: this file is parsed by a script to generate release notes. When
contributing to PSn00bSDK, add a new block at the top following this template:

```
## <year>-<month>-<day>: [optional new version]

<contributor>:

- ...

- ...
```

You may run `.github/scripts/generate_release_notes.py CHANGELOG.md` afterwards
to ensure the changelog can be parsed correctly.

-------------------------------------------------------------------------------

## 2022-12-18: 0.22

spicyjpeg:

- libc: Fixed `assert()` macro and removed redundant type definitions. Added
  GTE-accelerated leading zero count intrinsics (`__builtin_clz()`).

- psxcd: Rewritten some parts of the library in pure C. Added `CdCommand()` and
  `CdCommandF()` for advanced usage of the CD-ROM, as well as `CdReadRetry()`,
  `CdReadBreak()` and `CdGetRegion()`.

- psxgpu: `PutDrawEnv()` and `DrawOTagEnv()` now properly apply the texture
  page and window attributes in the `DRAWENV` structure. RECTs passed to
  `LoadImage()` and `StoreImage()` are now copied into a private buffer. Added
  `setColor*()` macros.

- psxspu: Fixed setting of bus wait states when using `SpuRead()`.

- psxetc: Fixed several critical bugs in the dynamic linker. GOT relocation and
  linking of variables and objects are now handled properly.

- psxapi: Added `FastEnterCriticalSection()` and `FastExitCriticalSection()`
  inline macros for quick enabling and disabling of interrupts.

- Renamed some registers in `hwregs_c.h`, `hwregs_a.inc` and updated examples
  accordingly.

- All projects are now compiled with `-Og` in debug mode and `-O2` in release
  mode by default. CD images created using `psn00bsdk_add_cd_image()` are now
  only rebuilt if necessary (i.e. if any of their dependencies change).

## 2022-10-27

spicyjpeg:

- psxspu: Fixed bugs in `SpuInit()` and in `SpuWrite()` when using manual
  transfer mode (`SPU_TRANSFER_BY_IO`). Added `SpuWritePartly()`.

- psxetc: Added `IRQ_Channel` and `DMA_Channel` enums.

- examples: Refactored and bugfixed all sound examples. Renamed the old
  `spustream` example to `cdstream` and added a new `spustream` example
  demonstrating SPU audio streaming from main RAM. Both streaming examples now
  make use of the interleaved .VAG file format.

## 2022-10-21: 0.21

spicyjpeg:

- libpsn00b: Cleaned up the internal logging system.

- psxgpu: Added `MoveImage()` as well as `MoveImage2()`, `LoadImage2()` and
  `StoreImage2()`. `LoadImage()` and `StoreImage()` now make use of the
  library's internal drawing queue instead of blocking. Added `EnqueueDrawOp()`
  for more advanced control of the drawing queue. The `getTPage()` macro now
  supports extended Y coordinates (512-1023) on systems with 2 MB of VRAM.

- psxsio: Removed `_sio_control()` and replaced it with a completely new
  asynchronous buffered serial port driver. Rewritten the serial TTY driver to
  make use of the new API.

## 2022-10-16

spicyjpeg:

- psxetc: Fixed (another) critical bug in the IRQ callback dispatcher. This
  also fixed some examples that were broken ever since the library was
  rewritten in C. Made the dynamic linker less verbose, improving DLL loading
  speed in debug mode.

- psxcd: Added `CdDataSync()`. Renamed `CdlModeSize0` and `CdlModeSize1` to
  `CdlModeIgnore` and `CdlModeSize` respectively.

- psxpress: Fixed a bug in the Huffman decompression API that would make it
  crash if the bitstream header didn't contain a valid decompressed length,
  even if the bitstream was properly encoded. This fix makes the API fully
  usable for video playback (as demonstrated by the new example).

- examples: Added `mdec/strvideo` FMV playback example. Fixed
  `system/childexec` not properly uninstalling BIOS callbacks before launching
  the child executable. Added pause/resume code to `sound/spustream`.

## 2022-10-11

spicyjpeg:

- libpsn00b: Completely rewritten CMake scripts. Six copies of each library are
  now built and installed, one for each combination of configuration (debug and
  release) and target type (executable with/without $gp-relative addressing and
  DLL). Library debug logging is now completely disabled when a project is
  built in release mode (using `-DCMAKE_BUILD_TYPE=Release`).

- libc: Replaced `memset()` with a much faster optimized implementation that
  makes use of Duff's device. Added `GetHeapUsage()` and `TrackHeapUsage()`.
  Removed `_mem_init()`.

- psxetc: Fixed a critical bug in `DMACallback()` that would lead to the DMA
  interrupt handler being disabled entirely in some edge cases.

- psxgpu: Replaced the debug font with an improved one. No changes have been
  made to the API.

- psxcd: Added `CdGetSector2()` (asynchronous variant of `CdGetSector()`).
  `CdControl()` can now take a `CdlLOC` as second argument when issuing a seek
  command (previously the argument was ignored if the command was not `ReadN`
  or `ReadS`).

- Replaced the `DEBUG` macro with the standard C `NDEBUG` macro, which is only
  defined if the project is being built in release mode.

- Added `PSN00BSDK_*_LINK_LIBRARIES` CMake variables to control which SDK
  libraries are linked to newly created executables and DLLs. Updated
  `cmake_reference.md` to reflect the changes.

## 2022-09-22

spicyjpeg:

- libpsn00b: Changed the extension of `gtereg.h`, `hwregs_a.h` and `inline_s.h`
  to `.inc`. Cleaned up old leftover PSXSDK headers.

- Updated documentation and added detailed instructions on how to install
  prebuilt releases.

## 2022-08-21: 0.20

spicyjpeg:

- psxgpu: Added `VSyncHaltFunction()`.

- psxetc: Rewritten the library in C, making `RestartCallback()` behave more
  like its official SDK counterpart. Added `StopCallback()` and
  `ResetCallback()`.

- psxspu: `SpuInit()` now properly resets the starting address of all channels,
  preventing them from accidentally triggering the SPU IRQ.

- examples: Added an example audio file to `sound/spustream` and a texture to
  `graphics/gte`. Replaced `ball16c.h` in all examples that included it with a
  binary .TIM file embedded through CMake.

## 2022-07-31

spicyjpeg:

- libc: Replaced default memory allocator with Nicolas Noble's PSYQo
  implementation. Added `sbrk()` and `realloc()`.

- psxspu: Rewritten the library in C, removing a few redundant non-standard
  functions and improving SPU DMA reliability. Renamed `SpuWait()` to
  `SpuIsTransferCompleted()` (and tweaked its prototype) for compatibility with
  the official SDK. `SpuInit()` now loads a dummy block at the beginning of SPU
  RAM by default.

- psxmdec: Added experimental Huffman decoding API. Two implementations with
  different performance and memory usage tradeoffs are available.

- psxapi: Added `SwEnterCriticalSection()`, `SwExitCriticalSection()`,
  `SetConf()` and various thread- and event-related BIOS API wrappers that were
  previously missing.

- Deprecated `u_short`, `u_int` and `u_long` types and replaced them with
  standard library fixed-size types (`uint16_t` and `uint32_t` respectively) in
  all library code.

- Ninja is now bundled with binary releases of the SDK. A `BUNDLE_NINJA` option
  was added to the main CMake script to toggle bundling when building packages.

## 2022-06-26

spicyjpeg:

- psxgpu: Rewritten the entire library in C, fixing a few bugs (including one
  that made 384x240 and 384x256 modes unusable) and adding a drawing queue in
  the process. `DrawOTag()` can now be called while another OT is being drawn
  to enqueue up to 8 other OTs.

- psxgpu: Added missing `setXYWH()` macro and implemented `ClearOTag()`,
  `DrawOTag2()`, `DrawOTagEnv()` and `GsGetTimInfo()`.

- libpsn00b: Renamed `_start()` to `_start_inner()` and added a `_start()` stub
  that can be overridden to insert custom startup code. Modified the linker
  scripts to assume RAM is 8 MB by default, to make it easier to target arcade
  or development hardware.

- examples: Fixed some functions in `io/system573`.

- tools: `elf2x` now warns if the converted executable crosses the 2 MB RAM
  boundary.

- Debugging symbols in ELF files are now generated by default for all target
  types. This does not affect the size of built executables or DLLs, as those
  are always stripped.

## 2022-03-30

lameguy64:

- indev: psxmdec prototype is now functional through `psxpress`.

## 2022-03-25: 0.19

lameguy64:

- examples: Replaced sample image of `mdec/mdecimage` with different artwork.
  Original image [here](http://lameguy64.net/?page=drawings&post_id=9).

- examples: Updated readme file in examples directory to reference the new
  `mdec/mdecimage` example program.

- psxsio: Added dummy hooks to unsupported device functions for tty device.

- docs: Minor corrections on `dev_notes.md`.

- docs: Updated documentation for `CdGetSector()` and `CdReadCallback()`
  functions in `libn00bref.odt`.

## 2022-02-27

spicyjpeg:

- libpsn00b: Added `hwregs_c.h` header and renamed some registers in
  `hwregs_a.h`. Added `assert()` as a proper macro.

- libpsn00b: Added new MDEC library; `psxpress`.

- psxspu: Fixed critical bug in `SpuSetReverb()`.

- psxetc: Fixed minor typos and bugs in `dlfcn.h`. Replaced `DL_CALL()` macro
  with `DL_PRE_CALL()`.

- psxapi: Rewritten all BIOS API stubs using a Python script and a JSON list,
  both of which are included in the library's source directory.

- examples: Updated `io/system573` with bugfixed I/O board code and separated
  the APIs into a separate source file. Fixed timing bugs in `io/pads`.

- mkpsxiso: Switched back to the master repository. The `dumpsxiso` command is
  now included in PSn00bSDK installations.

- Added `psn00bsdk_target_incbin()` and `psn00bsdk_target_incbin_a()` CMake
  functions for quickly embedding binary files into executables and libraries.
  The examples have been modified to use this function where applicable.

- Added `LIBPSN00B_GENERATOR` CMake option to allow the host-side tools to be
  compiled with MSVC or Xcode while still using Ninja or `make` to build the
  libraries and examples. This is required as neither MSBuild nor Xcode support
  custom toolchains.

- Updated `LICENSE.md` with additional license information as well as a full
  copy of the GPLv2 and GPLv3 (under which `mkpsxiso` and GCC are licensed
  respectively).

## 2022-01-17

Lameguy64:

- docs: Removed old and incomplete `libn00bref.odt` document (a precursor of
  the LibPSn00b Library Reference document).

- examples: Improved description of `hdtv` example. Examples directory is now
  copied into `share/psn00bsdk` directory for both installation and package
  building. Build instructions for examples also included.

- docs: Removed documentation for `SetDrawTPageVal()` as the function was
  removed ages ago. Added documentation to `DR_AREA`, `DR_TWIN` and `DR_OFFSET`
  primitives and their associated macros.

- examples: Added `tilesasm` example.

- Updated readme file.

## 2021-12-23

spicyjpeg:

- psxcd: `CdGetSector()` now expects the sector size to be in 32-bit word units
  (rather than bytes) for consistency with the official CD-ROM library. The
  library's ISO9660 parser and helper functions have been updated accordingly.
  **This is a breaking change**.

- examples: Added `spustream` audio streaming example.

## 2021-11-28: 0.18

spicyjpeg:

- libc: Removed `STACK_MAX_SIZE` and added `_mem_init()` back. RAM and stack
  size can now be set by calling `_mem_init()` manually before allocating any
  memory (however this seems to be currently broken).

- libc: `sprintf()` now supports fixed padding when using the `%@` (binary
  integer) format specifier.

- psxcd: File paths with forward slashes instead of backslashes, as well as
  paths containing both slash types, are now accepted.

- psxapi: Added wrapper around BIOS function `GetSystemInfo()`.

- examples: Added `pads` and `system573` examples. Also added CMake build
  script to `cartrom`, which is now built alongside all other examples.

- Header files are now installed to `include/libpsn00b` instead of
  `lib/libpsn00b/include`.

- Deprecated `malloc.h` and removed all references to it (`stdlib.h` should be
  used instead). Moved `int*_t` and `uint*_t` types to `stdint.h`.

- Fixed file permission errors when attempting to install the SDK on macOS.

- Cleaned up, updated and moved all documentation to the `doc` folder.
  Rewritten this changelog and added a script to generate release notes.

## 2021-10-31

spicyjpeg:

- Added `tinyxml2` and `mkpsxiso` as git submodules and removed the (admittedly
  short-lived) `SKIP_*` options completely. CMake's `ExternalProject` is no
  longer used to download dependencies at build time.

- Added CMake presets file with presets for building installer packages.

## 2021-10-25

Lameguy64:

- Made a very tiny change in the readme file.

- Included some of the indev directory from the SVN repository.

## 2021-10-17: 0.17

spicyjpeg:

- Added `SKIP_TINYXML2` and `SKIP_MKPSXISO` build options in place of the old
  `SKIP_DOWNLOAD` option, and a new `BUNDLE_TOOLCHAIN` option for building
  packages. Updated `INSTALL.md` accordingly and fixed git branch error when
  downloading mkpsxiso during build.

- Rewritten `toolchain.txt` (which is now `TOOLCHAIN.md`) and added proper
  Windows toolchain build instructions.

- Added safety checks in CMake scripts to ensure `elf2x`/`mkpsxiso` are
  installed before attempting to build an executable or CD image.

- examples: Added CMake build script to (and removed makefile from) `vagsample`.

## 2021-06-10

Lameguy64:

- psxspu: Fixed register typo in `SpyKeyOn` causing unpredictable instability.

- psxspu: Fixed bug where `SpuKeyOn` does not set the key-on bits for voices 16
  to 23.

- examples: Added `vagsample` SPU example.

## 2021-09-27

spicyjpeg:

- liblzp, tools: Fixed tools not building on MSVC and cleaned up LZP API
  declarations (replaced meaningless `void*` pointers with proper types).

- libpsn00b: Added missing `PSN00BSDK_VERSION` CMake variable.

- examples: Fixed childexec (`parent.exe`) example crashing due to the child
  executable not being relocated in the new build script. Patched n00bdemo to
  suppress `liblzp` pointer type warnings.

- Fixed another MSVC linker error when building `tinyxml2` automatically, as
  well as various toolchain/compiler test errors sometimes thrown by CMake.
  Updated `INSTALL.md` with more details.

## 2021-09-13

spicyjpeg:

- Migrated libpsn00b, tools, examples and template to CMake, added a top-level
  `CMakeLists.txt` and the `libpsn00b/cmake` directory for CMake setup scripts,
  got rid of the old makefiles and installation method.

- Updated docs to match the new build system, moved installation instructions
  to `INSTALL.md` and added `doc/cmake_reference.md` describing the SDK's CMake
  API and variables.

- mkpsxiso: Added rules to automatically download, build and install mkpsxiso
  (as well as its dependencies) as part of the SDK.

- cpack: Added initial CPack support and created the cpack directory containing
  branding assets for installers built through CPack. A shell script is
  provided to regenerate the assets from their source SVGs.

- liblzp: Copied library headers to `libpsn00b/include/lzp`.

- psxetc: Fixed a random typo in a javadoc comment (those should be eventually
  rewritten into proper documentation anyway).

- Added CMake, VS Code and DLL related entries to `.gitignore`.

## 2021-08-16: 0.16

spicyjpeg:

- psxetc: Added dynamic linking APIs (`dl*`, `DL_*`), implemented in `dl.c` and
  `_dl_resolve_wrapper.s`. The APIs can be accessed by including `dlfcn.h`,
  while another header (`elf.h`) provides structs and enums to help with manual
  parsing of library headers.

- libc: Removed `_mem_init.s`, improved heap initialization code. Added support
  for setting how much RAM to use for the stack (by defining `STACK_MAX_SIZE`)
  and for overriding/replacing the default memory allocator.

- psxapi: Added wrapper around BIOS function `FlushCache()`.

- psxspu: Fixed wrong bounds check in `SpuSetTransferStartAddr()`.

- examples: Added an example showing how to compile dynamically-loaded
  libraries (DLLs) and load them at runtime using the new dynamic linker.

- libpsn00b: Added `libpsn00b/ldscripts` directory and linker scripts for both
  executables and DLLs. Also fixed several broken header files (`psxgpu.h` not
  including `sys/types.h`, missing `scanf()` declarations, ...).

- Rewritten most makefiles (both for libraries and examples) and centralized
  all compiler flags into a single `psn00bsdk-setup.mk` file for consistency
  and easier editing. Added flags to build libpsn00b without gp-relative
  addressing for compatibility with the dynamic linker. Also added `nm`
  commands to generate symbol maps required by the linker.

## 2021-07-01

Lameguy64:

- Libpsn00b: Added `int8_t`, `int16_t`, `int32_t`, `int64_t`, `uint8_t`,
  `uint16_t`, `uint32_t` and `uint64_t` variable types in `sys/types.h`.
  
- psxgte: Replaced unsigned int variable types with `u_long` to further improve
  compatibility with code written for the official Sony SDK and to make my
  tutorial examples easier to compile on PSn00bSDK. Example programs have been
  updated to account for this change.
  
- psxcd: Changed type of 2nd argument of `CdRead()` from `u_int` to `u_long`,
  as well as changing the type of the size element in `CdlFILE` from `u_int` to
  `u_long`.
  
## 2021-02-17

Lameguy64:

- Improved build instructions in readme file and fixed some typos.

- Improved `toolchain.txt` instructions.

- tools: Added experimental `elf2cpe` converter for executing PSn00bSDK
  programs in official development units. No debug symbols however.

- Fixed prefixes to allow SDK libraries and examples to be built
  with `mipsel-none-elf`.
  
- examples: Fixed typo in `plasma_tbl.h` causing multiple definitions when
  compiling with newer versions of GCC in `n00bdemo`.

- examples: `cartrom` example now marked as obsoleted, but still kept for
  reference purposes.
  
- Includes alextrevisan's GTE macros in `inline_c.h`.

- Added makefile template.

## 2021-01-05

Lameguy64:

- psxgpu: Added struct names to many primitives.

- psxgte: Defined `SquareRoot0()` and `SquareRoot12()`.

- psxgte: Added `gte_lddp()` C macro.

- examples: Added C++ demo.

- Updated readme a bit.

## 2020-11-29

Lameguy64:

- libpsn00b: Defined MDEC hardware and related DMA registers in `hwregs_a.h`
  file.

- psxgte: Fixed entry typo in table of `squareroot.s` (pointed out by
  SoapyMan).

- libc: `memmove` updated to account for forward-looped memory move (by
  ckosmic).

- examples: Removed redundant toolchain executable definitions in the
  makefiles.
  
- examples: Included HDTV example for Github repo.

## 2020-09-19

Lameguy64:

- Revised makefiles for building the libraries and examples in a way to make
  building with different toolchain versions easier with the `PSN00BSDK_TC`
  environment variable. Library installation and linking is also made easier
  with the `PSN00BSDK_LIBS` environment variable. See readme in the `libpsn00b`
  directory for details.
  
- examples: Fixed libgcc not found error when compiling some of the examples.

- libc: Added `strtok()`.

- libc: Added support for command line arguments. Pass arguments via
  `SYSTEM.CNF` `BOOT=` string or a string array with `Exec()`. Arguments can
  be read via `argc`/`argv[]` in `main()` or `__argc`/`__argv` anywhere else.
  
- libc: Added `SetHeapSize()`.

- psxgpu: Moved ISR and callback subsystem to `psxetc`. You'll have to link
  psxetc after `psxgpu` and `psxapi` after `psxetc` in your library string.

- psxetc: Moved debug font functions (`FntInit()`, `FntOpen()`, etc) to `psxgpu`.

- psxetc: Fixed stack management in `RestartCallback()`.

- examples: Added argument passing in `childexec` example.

- psxcd: Fixed crashing on PSIO and possibly some emulators by implementing
  a response buffer read limiter.
  
- psxgpu: Interrupts are now disabled before setting up ISR and callbacks in
  `ResetGraph()`, as `LoadExec()` still has interrupts enabled when jumping to
  the loaded PS-EXE's entrypoint. Fixes programs made with PSn00bSDK crashing
  at `ResetGraph()` on PSIO when loading from the Menu System and possibly some
  emulators.

## 2020-07-25

Lameguy64:

- psxgte: Added `ScaleMatrixL()`.

- doc: Corrected documentation for `CdReadSync()` function.

- psxcd: Added new define: `CdlIsoLidOpen`.

- psxcd: Updated media change detection logic, media change is checked
  by lid open status bit in all CD-ROM file functions. `CdControl()` calls will
  also trigger the media change status on lid open.
  
- psxcd: Fixed bug in `CdGetVolumeLabel()` where it constantly reparses the
  file system regardless of media change status.
  
- examples: Updated `cdrom/cdbrowse` example slightly.

- psxcd: Added `CdLoadSession()`.

- psxcd: Fixed bug where `CdReadDir()` locks up in an infinite loop when it
  encounters a NULL directory record, and the parser has not yet exceeded the
  length of the directory record.
  
- doc: Replaced library version numbers with SVN revision numbers in the
  introduced fields.
  
- doc: Started work on CD-ROM library overview.

## 2020-04-24

Lameguy64:

- Refined toolchain instructions a bit.

- psxcd: Added automatic read retry for `CdRead()` operations, as long as
  `CdReadSync()` is called until read completion.

- psxapi: Added BIOS `atoi()` and `atol()` calls. Temporary, may be replaced
  with a faster implementation.
  
- psxsio: Added `ioctl()` support for `FIOCSCAN` to probe for pending input in
  serial tty driver.
  
- examples: Reorganized examples, added new `tty` and `console` examples.

## 2020-03-11

Lameguy64:

- psxcd: Fixed `CdInit()` syntax (there should be no arguments).

- psxcd: Fixed `CdlFILE`, `loc` variable renamed to `pos`.

- documentation: Improved and updated toolchain instructions a bit.

## 2020-02-28

Lameguy64:

- documentation: Added docs for `CdOpenDir()`, `CdReadDir()` and
  `CdCloseDir()`.

- psxgpu: Added `GetODE()`.

- psxspu: Fixed `SpuKeyOn()` bug where only 16 of the 24 channels can be
  activated, due to channel bits being written as a 16-bit word.

- psxcd: Added `CdOpenDir()`, `CdReadDir()` and `CdCloseDir()` for parsing
  directories.

- psxcd: Issuing `CdlNop` (`GetStat`) commands now triggers the media change
  flag internal to the libraries when CD lid is opened, so file system
  functions can update the cached ISO descriptor when the disc has been
  changed.
  
- psxcd: Made internal variables and functions for iso9660 parsing static.

## 2020-02-25

thp:

- libc: Added `abs()` and `labs()` functions.

## 2020-01-06

Lameguy64:

- libpsn00b: Renamed `libpsxcd` directory to `psxcd` to match with other
  libraries.

- examples: Added obligatory hello world example.

- documentation: Added CD-ROM library documentation.

## 2019-11-22: 0.15b

Lameguy64:

- psxapi: Added root counter or timer functions and related definitions.

- examples: Added timer example.

- psxgpu: Added `DR_AREA`, `DR_OFFSET` and `DR_TWIN` primitives and
  accompanying `setDrawArea()`, `setDrawOffset()` and `setTexWindow()` macros.

- psxgpu: Added parenthesis to argument value in `setlen()`, `setaddr()` and
  `setcode()` macros, preventing `addPrims()` from being used in a more
  sensible manner (ie. `addPrims(ot, sub_ot+3, sub_ot)`).
  
- examples: Added render2tex render to texture example.

- psxspu: Fixed typo in `spuinit.s` on section specifier specifying a data
  section instead of text section, resulting to jump to
  non-instruction-aligned linker errors.
  
- psxgpu: Increased ISR stack size to 2048 bytes.

- psxsio: Added `kbhit()` to poll keyboard input asynchronously and stdin
  is now buffered with an IRQ handler.

- psxapi: Added `AddDummyTty()` (for psxsio `DelSIO()` fix).

- psxsio: `DelSIO()` now calls `AddDummyTty()`.

- libc: Fixed bug in `strncpy()` not placing a NULL byte at end of string.

- libc: Fixed `strchr()` and `strrchr()` declarations commented out in
  `string.h`.

- libpsn00b: Added the long awaited libpsxcd library with cdxa example.
  Documentation will come soon but existing libcd docs should be good
  enough for awhile.

- psxgpu: Fixed non functioning GPU DMA wait in `DrawSync()`.

- LibPSn00b run-time library is now officially 0.15b.

## 2019-10-11

Lameguy64:

- psxetc: Added `FntOpen()`, `FntPrint()` and `FntFlush()` functions.

- psxgpu: Fixed typo in `termPrim()` macro (value too long).

- examples: Added billboarding sprites example.

- psxapi: Transferred `putchar()` BIOS function to libc.

- libpsn00b: Updated makefiles adding `-fdata-sections` and
  `-ffunction-sections` so unused functions will be stripped out, which yields
  smaller executables.

- libc: Fixed negative integers not displaying properly in
  `vsprintf()`/`vsnprintf()`.
  
- libc: Fixed zero padding not working in `vsprintf()`/`vsnprintf()`.

- fpscam: Added debug text using `FntOpen()`, `FntPrint()` and `FntFlush()`.
  Also added `_boot()` call for returning to CD based serial loaders.

## 2019-09-23

Lameguy64:

- libc: Added `strcat()` function.

- Included PSn00bSDK logo vector.

- psxgte: Added `gte_stsz()` macro.

- psxgpu: Fixed typos in `setUVWH()` macro.

- Added `_boot()` BIOS function (`A(A0h)` aka Warmboot, useful for CD based
  serial loaders).

## 2019-08-17: 0.13b

Lameguy64:

- LibPSn00b run-time library is officially version 0.13b.

- examples: updated balls and n00bdemo examples for the `setDrawTPage()`
  correction.

- psxgpu: Fixed error on `setDrawTPage()` syntax and removed
  `setDrawTPageVal()` macro (not needed).

- psxapi: Added event handler definitions related to memory cards.

- psxapi: Added BIOS memory card functions.

- examples: Added childexec example demonstrating a parent executable
  transferring execution to a child executable and back.

- elf2x: `s_addr` no longer set on PS-EXE header, console BIOS already sets it
  by STACK value in `SYSTEM.CNF` and allows child executables to return to
  parent if left zero.

- psxapi: Renamed `_InitPad()`, `_StartPad()` and `_StopPad()` to `InitPAD()`,
  `StartPAD()` and `StopPAD()` respectively. Fpscam example updated to new
  syntax.

## 2019-07-18

Lameguy64:

- Added `fpscam` example.

- Gave examples small descriptions.

- Updated readme a little.

## 2019-07-17: 0.12b

Lameguy64:

- LibPSn00b run-time library is officially version 0.12b.

- libc: Added basic C++ support (many thanks to ijacquez).

- libc: Updated start function that should make it possible for a child
  executable to return to a parent executable, return logic automatically
  calls `EnterCriticalSection()`.

- libc: Updated build method which takes `libgcc` from the compiler and adds
  its own object files into it, eliminating linker problems caused by having
  to order `libc` and `libgcc` libraries in a specific manner.
  
- psxgpu: Added `RestartCallback()`.

- psxgpu: Added `StoreImage()` function.

- psxgpu: Fixed bugged `setRECT()` macro.

- libc: Added `assert.h`.

- examples: Balls example now has 166% more balls.

- psxgpu: Increased ISR stack size to 1024 bytes so printf can be used in
  callbacks safely.

- libc: Removed `int64` (long long) printing in `vsprintf()` for better
  performance, as the R3000 does not support 64-bit arithmetic natively
  so its emulated like floats. `int64` still used for processing floats and
  doubles and old `vsprintf.c` file is still included for those who really
  want `int64` support for whatever reason.
  
- libc: Removed `stdarg.h` which is part of GCC and not license compatible
  with MPL. The toolchain compiled with libgcc provides `stdarg.h` and other
  standard headers.
  
- examples: Updated `sdk-common.mk` variable convention for better flexibility.

- libpsn00b: Added `common.mk` file containing global values for all libraries.

- Updated library and toolchain build instructions.

- psxgpu: Fixed bug in DMACallback where the internal DMA handler would fail
  to install due to `GetInterruptCallback()` retrieving the callback value
  immediately in the branch delay slot of a `jr` instruction, which resuls to
  an inconsistent return value. This also broke `DrawSyncCallback()`.
  
- psxsio: Done fixes on `_sio_control()` from the aformentioned issues with
  load instructions in delay slots.
  
- psxgte: Added `DVECTOR` struct.

- psxgpu: Added `setLineF2()`, `setLineG2()`, `setLineF3()` and `setLineG3()`
  primitive macros.
  
- Added more functions in documentation.
  
## 2019-07-01

williamblair:

- Fixed `FntLoad()` Y coordinate not working properly for debug font (due to
  Y coordinate not being specified for the `getTPage()` macro.

## 2019-06-23: 0.10b

Lameguy64:

- LibPSn00b Run-time Library is officially version 0.10b.

- Reworked readme file with improved build instructions.

- libpsn00b: Added missing C extern groups for C++ compatibility in
  `psxapi.h`, `stdlib.h` and `string.h`.

- libpsn00b: Removed changelogs in the readmes of each libpsn00b library
  as its much easier to keep track of changes in a single changelog than
  scattering them across multiple changelogs.

- psxapi: Added `Exec()` function and EXEC struct.

- psxgpu: Added `DrawPrim()` function (uses direct I/O).

- psxgpu: `VSync()` function completely overhauled. Logic is now based on
  Sony's code but more efficient and can return total number of vblanks
  elapsed, number of hblanks since last call and wait up to n vblanks
  specified by an appropriate argument value. It will also generate a timeout
  when vblank interrupt stops working and would attempt to restart it.

- psxapi: Added `gets()` and `getc()` BIOS functions.

- psxapi: Corrected a `putc()`/`putchar()` discrepancy. `putc()` puts a
  character to a file stream, `putchar()` puts a character to stdout.

- Completely revised library reference manual with better formatting and
  more functions documented.

- psxgpu: Added `DrawSyncCallback()`.

- psxgpu: Implemented DMA interrupt callback system with `DMACallback()`
  allowing to handle DMA interrupts very easily.

- libpsn00b: Implemented Serial I/O library (`psxsio`) with serial tty device
  (installed using `AddSIO`) and serial callback support. Serial library
  is also fully documented.

- psxgpu: Implemented IRQ callback system with `InterruptCallback()` allowing
  to set interrupt callbacks very easily.
  
- psxgpu: Implemented proper IRQ handler installed using HookEntryInt or
  `SetCustomExitFromException()` for handling VSync and other interrupts.
  `ChangeClearPAD(0)` must now be called after `_InitPad()` or vsync timeout
  will occur.

- libpsn00b: Started making local labels prefixed with `.L` instead of `.`
  making them not appear in symbol lists resulting in a cleaner symbol dump.
  Still not possible to do function-scope local labels like in ASMPSX because
  GAS syntax is ASS (or ASS GAS which is farts, GAS is farts).
  
- psxgpu: `DrawSync()` function now waits for DMA completion and GPU transfer
  ready instead of simply waiting for GPU transfer ready which is the likely
  cause of subtle GPU related timing issues, it also sets GPU DMA transfer
  mode to off afterwards. It can also read number of words remaining in DMA
  transfer if `a0` is non-zero but it likely only returns the correct value on
  VRAM transfers. Exact way how `DrawSync()` returns the count in the official
  SDK is currently unknown.

## 2019-06-07

qbradq:

- lzpack: Swapped a buffer length litteral with sizeof operator, fixing a stack
  overflow bug in some instances.

## 2019-05-23

Lameguy64:

- Added `dev notes.txt` file in docs that includes notes about the many quirks
  quirks about the console discovered during the development of this SDK
  project.

- Updated `libn00bref.odf` a little.

- Added `cartrom` example.

- Added `rgb24` example.

- Got custom exit handler set using `SetCustomExitFromException()` (BIOS
  function `B(19h)`) working. Currently used to acknowledge VSync IRQ but
  actual VSync handling is still done with events and needs to be
  transferred to the custom exit handler. At least it lets BIOS
  controller functions to work now. See `doc/dev notes.txt` for details
  on how this handler behaves.

- Made stack usage in `ResetGraph()` less wasteful. You only need to
  allocate N words on stack based on N arguments of the function
  being called.

- VSync IRQ handling now done using a custom exit from exception handler.
  Actual VSync handling is yet to be moved to the custom exit handler
  though.

- Made stack usage in `start.s` of libc a lot less wasteful.

- Implemented controller support via BIOS functions (use `_InitPad()`,
  `_StartPad()` and `_StopPad()`). BIOS memory card functions may also
  work as well but its not tested yet.

- Removed duplicate `initpad.s` and `initcard.s` functions in psxapi.

- Added `_InitCd()` function to psxapi which is a safer version of `_96_init()`
  as it preserves other DMA channel settings. Use BIOS file functions such
  as `open()`, `read()` and `close()` with path names starting with `cdrom:/`
  to access files from CD after calling `_InitCd()`.