1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-08-08 09:25:19 +00:00

65 Commits
DP2 ... DP4

Author SHA1 Message Date
David Schmenk
8bdc1d6c56 DP4 release 2020-01-31 12:10:14 -08:00
David Schmenk
46000e7af1 Update images with latest editor 2020-01-31 12:06:49 -08:00
Dave Schmenk
447cde1692 Forth->PLASMA transpiler 2020-01-25 14:03:22 -08:00
David Schmenk
c74af19505 Improve indenting on mis-aligned lines 2020-01-21 08:39:26 -08:00
David Schmenk
5581bfb052 Update images 2020-01-20 12:09:09 -08:00
David Schmenk
1a208ef30a Make sure ternary op has lower precedence than AND and OR 2020-01-20 11:39:58 -08:00
Dave Schmenk
e0d688a45a SHR library 2020-01-19 13:11:09 -08:00
David Schmenk
642b4cbbb4 Forgot MATCHFILES for floppy image 2020-01-19 08:38:25 -08:00
David Schmenk
233e0299dc Update images 2020-01-17 13:24:23 -08:00
Dave Schmenk
ff023f65d2 Fix long standing bug in catalog code 2020-01-17 12:51:19 -08:00
Dave Schmenk
6045b260db Machine check for HGRLIB and slightly smaller catalog code 2020-01-17 12:22:18 -08:00
Dave Schmenk
b5f02ea7c5 Fiz ZIP chip utility to turn ANN3 off (fix hires colors) 2020-01-16 20:47:10 -08:00
David Schmenk
c9477238fa Clean up images 2020-01-15 13:33:46 -08:00
David Schmenk
59a35068bf Clean up the images 2020-01-15 13:24:05 -08:00
David Schmenk
348bc4eaf5 Update README.md 2020-01-11 12:27:41 -08:00
David Schmenk
05f5729adc Update Version 2.0.md 2020-01-10 22:34:47 -08:00
David Schmenk
06f12e5607 Update Version 2.0.md 2020-01-10 22:33:45 -08:00
David Schmenk
1aee6c4523 Update Version 2.0.md 2020-01-10 22:30:36 -08:00
David Schmenk
c8015091a5 Update SOS fix in images 2020-01-10 18:54:28 -08:00
Dave Schmenk
c83ed2c494 Fix another SOS-ism 2020-01-10 18:50:54 -08:00
David Schmenk
5c8fbfdcf4 Forgot to update editor version 2020-01-10 17:59:27 -08:00
David Schmenk
ea3c73ac15 2.0 DP3 release 2020-01-10 17:25:32 -08:00
Dave Schmenk
1f42523014 Fix some Apple /// differences 2020-01-10 13:55:05 -08:00
David Schmenk
6b1123a95b Update images 2020-01-10 11:57:39 -08:00
David Schmenk
fb3a4964c8 Match patterns with ending wildcard 2020-01-10 11:23:25 -08:00
David Schmenk
12f8cf8053 Tile blitter improvements from Brendan (BluRry) 2020-01-09 16:45:17 -08:00
David Schmenk
5e0053569e Formatting (which editor keeps messing up the tabs vs spaces?) 2020-01-08 17:27:08 -08:00
Dave Schmenk
d92d5dd6cd A wee'er bit faster 2020-01-08 14:33:49 -08:00
Dave Schmenk
206e7ae3f4 A wee bit faster and smaller 2020-01-08 14:30:37 -08:00
David Schmenk
8d9a0889a6 HGR tile and font libraries 2020-01-08 12:11:55 -08:00
David Schmenk
31f4fbfbec Slight API change 2020-01-08 05:51:19 -08:00
David Schmenk
6f620e194d Add JIT compiler to image 2020-01-08 05:43:26 -08:00
David Schmenk
4ee7c8c049 Auto-play Spiders from Mars 2020-01-07 18:51:06 -08:00
Dave Schmenk
9e31fbd1da Replay game 2020-01-07 18:18:18 -08:00
Dave Schmenk
1da0bdf610 Tweak 2020-01-07 17:22:44 -08:00
Dave Schmenk
360be4c709 Tweak sprite update and laser hit 2020-01-07 17:07:26 -08:00
David Schmenk
b13fb204a2 Spider sprite compiler 2020-01-07 16:12:40 -08:00
David Schmenk
0c57570d4a Pre-compile sprites and more animations and audio 2020-01-07 16:08:48 -08:00
David Schmenk
09d861e5a5 Quick updates 2020-01-06 22:15:59 -08:00
David Schmenk
f5416c2d82 Fix hgrHLin colors and tidy up game locations 2020-01-06 20:18:40 -08:00
Dave Schmenk
10cc631b0a More or less operational game 2020-01-06 16:09:25 -08:00
David Schmenk
e9a1311764 Shooting spiderwebs 2020-01-05 20:30:02 -08:00
David Schmenk
42888ed95a When spiders attack 2020-01-05 14:43:58 -08:00
David Schmenk
1fe6191343 More pixmaps 2020-01-04 19:51:39 -08:00
Dave Schmenk
b006e18d26 Fun with the graphics libraries 2020-01-04 16:58:51 -08:00
Dave Schmenk
69733fd37f Fix XORing of BLT with ORing. Better COPY message and add ZIP Chip
utility
2020-01-04 12:52:31 -08:00
Dave Schmenk
c1b6741cfd Fix commented out data and rect parameters 2020-01-04 09:36:54 -08:00
Dave Schmenk
41071de12f New HGR sprite shoot-em up demo 2020-01-04 08:45:23 -08:00
David Schmenk
b6a7b72fe1 Set inituial mask to WHITE(7) instead of WHITE(3) to reduce artifacting in blank areas 2020-01-04 07:45:39 -08:00
Dave Schmenk
426b662481 Lose examples from TFTP BLD 2020-01-03 14:24:41 -08:00
Dave Schmenk
18543c8363 Fix copy directory destination 2020-01-03 14:19:38 -08:00
David Schmenk
b2eaa867eb Add explicit undrawList calls 2020-01-03 07:57:26 -08:00
David Schmenk
d74ccc22fb Merge pull request #56 from peterferrie/master
notes on IIc VBL
2020-01-02 21:34:24 -08:00
Dave Schmenk
c4c3f4d9b3 Avoid infinite copy recursion 2020-01-02 20:49:32 -08:00
Dave Schmenk
ecb61ccddd Fix too many buffers allocated 2020-01-02 19:49:18 -08:00
David Schmenk
7c3dfe2b2e Wildcard names for file utilities 2020-01-01 13:50:57 -08:00
Dave Schmenk
438ab01254 Wildcard filename matching 2019-12-31 17:20:20 -08:00
Peter Ferrie
397dbdbb99 cut some bytes 2019-12-31 13:21:14 -08:00
Peter Ferrie
8b0a35e453 notes on IIc VBL 2019-12-31 13:19:42 -08:00
David Schmenk
81ad97e0bd Fix HGRTEST.PLA sample 2019-12-31 08:04:48 -08:00
David Schmenk
484aefb08c More error reporting when writing files 2019-12-31 07:53:41 -08:00
David Schmenk
c743ace42b Trying to track down file write corruption 2019-12-30 22:34:35 -08:00
David Schmenk
de29742841 Missed JIT16 dependency 2019-12-29 22:04:04 -08:00
David Schmenk
835b90e636 Update README.md 2019-12-29 08:44:32 -08:00
David Schmenk
c86d3349df Update Version 2.0.md 2019-12-29 08:43:24 -08:00
60 changed files with 6611 additions and 956 deletions

View File

@@ -1,7 +1,7 @@
# 12/28/2019 PLASMA 2.0 Developer Preview 2 Available!
[Download and read the Release Notes](https://github.com/dschmenk/PLASMA/blob/master/doc/Version%202.0.md)
# 1/31/2020 PLASMA 2.0 Developer Preview 4 Available!
[Download and read the Release Notes](https://github.com/dschmenk/PLASMA/releases)
[Change List](https://github.com/dschmenk/PLASMA/blob/master/doc/Version%202.0.md#changes-in-plasma-for-20-dp-2)
[Change List](https://github.com/dschmenk/PLASMA/blob/master/doc/Version%202.0.md#changes-in-plasma-for-20-dp-3)
# 4/29/2018 PLASMA 1.2 Available!
[Download and read the Release Notes](https://github.com/dschmenk/PLASMA/blob/master/doc/Version%201.2.md)

View File

@@ -1,18 +1,20 @@
# PLASMA Version 2.0 Developer Preview 2
# PLASMA Version 2.0 Developer Preview 4
Welcome to PLASMA: the Grand Unifying Platform for the Apple 1, ][, and ///.
Download the four disk images (three if you don't plan to boot an Apple ///):
Download the five disk images:
[PLASMA 2.0 DP 800K Full System](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2.2mg?raw=true)
[PLASMA 2.0 DP4 800K Full System](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2.2mg?raw=true)
[PLASMA 2.0 DP System and ProDOS Boot](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-SYS.PO?raw=true)
[PLASMA 2.0 DP4 System and ProDOS Boot](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-SYS.PO?raw=true)
[PLASMA 2.0 DP Build Tools](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-BLD.PO?raw=true)
[PLASMA 2.0 DP4 Build Tools](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-BLD.PO?raw=true)
[PLASMA 2.0 DP Demos](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-DEM.PO?raw=true)
[PLASMA 2.0 DP4 Demos](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-DEM.PO?raw=true)
[PLASMA 2.0 DP Apple /// SOS Boot and SANE floating point modules](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-FPSOS.PO?raw=true)
[PLASMA 2.0 DP4 TCP/IP network modules](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-INET.PO?raw=true)
[PLASMA 2.0 DP4 Apple /// SOS Boot and SANE floating point modules](https://github.com/dschmenk/PLASMA/blob/master/images/apple/PLASMA2-FPSOS.PO?raw=true)
PLASMA can be run from floppies, System in Drive 1, and Build or Demos in Drive 2. Mass storage is the recommended installation that looks like (replacing HARDISK with your volume name of choice):
@@ -24,6 +26,8 @@ Demo Files => /HARDISK/PLASMA/DEMOS/
SANE files => /HARDISK/PLASMA/SYS
INET files => /HARDDISK/PLASMA/SYS
Use the System Utilities to copy the floppy images into the above mentioned directories.
## Apple 1
@@ -71,6 +75,16 @@ PLASMA comes with many library modules used by the tools, demos and sample code.
```
+ED [TEXT FILE]
```
The file manipulation utilities to copy, delete, rename, create directories, and change file type and aux type remove the need for external programs to do the same. PLASMA can now be installed with the tools included on the PLASMA2-SYS boot floppy. They are:
```
+COPY [-R] <SRCPATH>+ <DSTPATH>
+DEL [-R] <FILEPATH>
+REN <FILENAME> <NEWNAME>
+NEWDIR <NEWDIRECTORY>
+TYPE <FILENAME> [NEWTYPE [NEWAUX]]
+CAT [-R] <FILEPATH]
```
The ```-R``` option will operate on the directories recursively. Wildcard filenames can be specified with ```'*'``` matching zero or more characters, and ```'?'``` matching any character.
## Compiler Modules
@@ -82,7 +96,7 @@ Compiler warnings are enabled with `-W`. The optional optimizer is enabled with
## Demos
There are some demo programs included for your perusal. Check out `ROGUE` for some diversion. You can find the documentation here: https://github.com/dschmenk/PLASMA/blob/master/doc/Rogue%20Instructions.md. A music sequencer to play through a MockingBoard if it is detected, or the built-in speaker if not. A minimal Web server if you have an Uthernet2 card (required). Bug reports appreciated.
There are some demo programs included for your perusal. Check out `ROGUE` for some diversion. You can find the documentation here: https://github.com/dschmenk/PLASMA/blob/master/doc/Rogue%20Instructions.md. A music sequencer to play through a MockingBoard if it is detected, or the built-in speaker if not. A minimal Web server if you have an Uthernet2 card (required). Try `SPIDERS`for some hires shoot'em-up action. Bug reports appreciated.
## Source Code
@@ -102,6 +116,22 @@ There is a [YouTube playlist](https://www.youtube.com/playlist?list=PLlPKgUMQbJ7
- The documentation is sparse and incomplete. Yep, could use your help...
# Changes in PLASMA for 2.0 DP 4
1. Improved editor auto-indenting
2. Compiler fix for terneray operator precedence
3. Machine check for HGR library
# Changes in PLASMA for 2.0 DP 3
1. File manipulation utilities fixed for Apple /// SOS vs ProDOS differences
2. More optimizations for HiRes graphics libraries
3. Spiders From Mars hires demo game
# Changes in PLASMA for 2.0 DP 2
1. Many file manipulaition utilities (COPY, REName, NEWDIRectory, DELete, CATalog, TYPE)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
images/apple/SFM.PO Normal file

Binary file not shown.

View File

@@ -7,8 +7,7 @@ import dgrlib
predef dgrTileStr(x, y, tilestr, strlen, tilebuff)#0
predef dgrFill(x, y, tile)#0
predef dgrClear(clr)#0
predef dgrMode#1
predef txtMode#0
predef dgrMode(mode)#1
predef dgrShow(page)#1
predef dgrSwap#0
predef dgrDrawBuf(page)#0

View File

@@ -33,7 +33,7 @@ import fileio
byte entry_minver
byte entry_access
word entry_aux
word entry_mod
word entry_mod[2]
word entry_headptr
end
//

View File

@@ -7,8 +7,7 @@ import grlib
predef grTileStr(x, y, tilestr, strlen, tilebuff)#0
predef grFill(x, y, tile)#0
predef grClear(clr)#0
predef grMode#1
predef txtMode#0
predef grMode(mode)#1
predef grShow(page)#1
predef grSwap#0
predef grDrawBuf(page)#0

3
src/inc/hgrfont.plh Normal file
View File

@@ -0,0 +1,3 @@
import hgrfont
predef hgrPutStr(x, y, strptr)#0
end

View File

@@ -1,18 +1,21 @@
import hgrlib
predef divmod7(x)#2
predef hgrPlot(x, y)#0
predef hgrOrPlot(x, y)#0
predef hgrXorPlot(x, y)#0
predef hgrHLin(x1, x2, y)#0
predef hgrVLin(y1, y2, x)#0
predef hgrRect(x1, x2, y1, y2)#0
predef hgrXorHLin(x1, x2, y)#0
predef hgrXorVLin(y1, y2, x)#0
predef hgrRect(x1, y1, x2, y2)#0
predef hgrXorRect(x1, y1, x2, y2)#0
predef hgrBLT(x, y, width, height, srcptr)#0
predef hgrCopySrc(ofst, y, w, h, srcptr)#0
predef hgrAndSrc(ofst, y, w, h, srcptr)#0
predef hgrXorSrc(ofst, y, w, h, srcptr)#0
predef hgrOrSrc(ofst, y, w, h, srcptr)#0
predef hgrCopyDst(ofst, y, w, h, dstptr)#0
predef hgrMode#1
predef txtMode#0
predef hgrMode(mode)#1
predef hgrClear#0
predef hgrShow(page)#1
predef hgrSwap#1

View File

@@ -9,9 +9,11 @@ import hgrsprite
predef spriteUnDrawXor(sprtptr)#0
predef spritePos(x, y, sprtptr)#0
predef spritePosIndex(x, y, i)#0
predef spriteUnDrawList#0
predef spriteUnDrawXorList#0
predef spriteDrawList#0
predef spriteDrawXorList#0
predef spriteAdd(i, sprtptr)#1
predef spriteDel(i)#1
predef spriteDrawBuf(page)#0
predef spriteDrawBuf(page)#1
end

13
src/inc/hgrtile.plh Normal file
View File

@@ -0,0 +1,13 @@
import hgrtile
predef tileDraw(x, y, tileptr)#0
predef tileXorDraw(x, y, tileptr)#0
predef tileOrDraw(x, y, tileptr)#0
predef tileAndDraw(x, y, tileptr)#0
predef tileDrawStr(x, y, strptr, strlen, tileset)#0
predef tileFromText(txtpage, tileset)#0
predef tileMode(mode)#1
predef tileClear#0
predef tileShow(page)#1
predef tileSwap#1
predef tileDrawBuf(page)#1
end

5
src/inc/matchfiles.plh Normal file
View File

@@ -0,0 +1,5 @@
import matchfiles
predef matchName(src, exp)#1
predef matchList(pathptr, exp)#2
predef isWildName(exp)#1
end

View File

@@ -196,9 +196,8 @@ export asm dgrBLT(x, y, width, height, src)#0
CLC
ADC ESTKL+2,X ; WIDTH
STA SRCL
LDA SRCH
ADC #$00
STA SRCH
BCC +++
INC SRCH
BNE +++
+ AND #$FE
TAY
@@ -356,9 +355,8 @@ export asm dgrTile(x, y, src)#0
LDA SRCL ; SKIP TO NEXT ROW
ADC #$07 ; CARRY = 1
STA SRCL
LDA SRCH
ADC #$00
STA SRCH
BCC +++
INC SRCH
BNE +++
+ AND #$FE
TAY
@@ -494,7 +492,7 @@ asm _dgrFillTile
RTS
end
//
// Wait for VLB - Shouldn't work on //c, but seems to.
// Wait for VLB - Only IIe/IIGS.
//
asm vlbWait#0
- LDA $C019
@@ -503,6 +501,30 @@ asm vlbWait#0
BPL -
RTS
end
// Wait for VBL on IIc is entirely different from others.
// Setup, one-time *only* if polling will be used exclusively.
// Otherwise requires restoring the mode on exit,
// and setting up per-use instead.
// [php]
// sei ; otherwise interrupt is still raised
// sta $C07F ; enable access to VBL register
// sta $C05B ; enable VBL polling
// sta $C07E ; disable access to VBL register
//
// wait for VBL:
// - bit $C019
// bpl -
// lda $C070 ; $c019 bit 7 is sticky, reset it
//
// To allow other methods of VBL, restore access:
// - bit $C019
// bpl -
// lda $C070 ; $c019 bit 7 is sticky, reset it
// sta $C07F ; enable access to VBL register
// sta $C05A ; disable VBL polling
// sta $C07E ; disable access to VBL register
// [plp]
//
// Clear the buffer
//
@@ -513,25 +535,25 @@ export def dgrClear(clr)#0
memset(@clrtile, clr, 32)
dgrFill(0, 0, @clrtile)
end
//
// Set double lores graphics, return draw buffer
//
export def dgrMode#1
^showlores
^showfull
^showgraphics
^showpage1
^ena80 = 0
^show80 = 0
^an3on
drawpage = 1
drawbuff = dgrbuff[1]
return 1
end
//
// Set text mode
//
export def txtMode#0
export def dgrMode(mode)#1
if mode
//
// Set double lores graphics, return draw buffer
//
^showlores
^showfull
^showgraphics
^showpage1
^ena80 = 0
^show80 = 0
^an3on
drawpage = 1
drawbuff = dgrbuff[1]
return 1
fin
//
// Set text mode
//
^showtext
^showpage1
^ena80 = 0
@@ -539,6 +561,7 @@ export def txtMode#0
^mapmain = 0
^an3off
call($FC58, 0, 0, 0, 0) // home()
return 0
end
//
// Set display page, return other page

View File

@@ -298,7 +298,7 @@ def a3write(refnum, buff, len)
params:2 = buff
params:4 = len
perr = syscall($CB, @params)
return perr
return perr ?? 0 :: len
end
def a1create(path, type, aux)
return perr

View File

@@ -420,23 +420,26 @@ end
//
// Set lores graphics, return draw buffer
//
export def grMode#1
^showlores
^showfull
^showgraphics
^showpage1
^ena80 = 0
^show40 = 0
^mapmain = 0
^an3off
drawpage = 1
drawbuff = grbuff[1]
return 1
end
//
// Set text mode
//
export def txtMode#0
export def grMode(mode)#1
if mode
//
// Set GR mode
//
^showlores
^showfull
^showgraphics
^showpage1
^ena80 = 0
^show40 = 0
^mapmain = 0
^an3off
drawpage = 1
drawbuff = grbuff[1]
return 1
fin
//
// Set text mode
//
^showtext
^showpage1
^ena80 = 0
@@ -444,6 +447,7 @@ export def txtMode#0
^mapmain = 0
^an3off
call($FC58, 0, 0, 0, 0) // home()
return 0
end
//
// Set display page, return other page

View File

@@ -0,0 +1,140 @@
include "inc/hgrtile.plh"
//
// Apple //e hires character font
//
byte hgrFont[]
byte = $1C,$22,$2A,$3A,$1A,$02,$3C,$00,$08,$14,$22,$22,$3E,$22,$22,$00
byte = $1E,$22,$22,$1E,$22,$22,$1E,$00,$1C,$22,$02,$02,$02,$22,$1C,$00
byte = $1E,$22,$22,$22,$22,$22,$1E,$00,$3E,$02,$02,$1E,$02,$02,$3E,$00
byte = $3E,$02,$02,$1E,$02,$02,$02,$00,$3C,$02,$02,$02,$32,$22,$3C,$00
byte = $22,$22,$22,$3E,$22,$22,$22,$00,$1C,$08,$08,$08,$08,$08,$1C,$00
byte = $20,$20,$20,$20,$20,$22,$1C,$00,$22,$12,$0A,$06,$0A,$12,$22,$00
byte = $02,$02,$02,$02,$02,$02,$3E,$00,$22,$36,$2A,$2A,$22,$22,$22,$00
byte = $22,$22,$26,$2A,$32,$22,$22,$00,$1C,$22,$22,$22,$22,$22,$1C,$00
byte = $1E,$22,$22,$1E,$02,$02,$02,$00,$1C,$22,$22,$22,$2A,$12,$2C,$00
byte = $1E,$22,$22,$1E,$0A,$12,$22,$00,$1C,$22,$02,$1C,$20,$22,$1C,$00
byte = $3E,$08,$08,$08,$08,$08,$08,$00,$22,$22,$22,$22,$22,$22,$1C,$00
byte = $22,$22,$22,$22,$22,$14,$08,$00,$22,$22,$22,$2A,$2A,$36,$22,$00
byte = $22,$22,$14,$08,$14,$22,$22,$00,$22,$22,$14,$08,$08,$08,$08,$00
byte = $3E,$20,$10,$08,$04,$02,$3E,$00,$3E,$06,$06,$06,$06,$06,$3E,$00
byte = $00,$02,$04,$08,$10,$20,$00,$00,$3E,$30,$30,$30,$30,$30,$3E,$00
byte = $00,$00,$08,$14,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7F
byte = $00,$00,$00,$00,$00,$00,$00,$00,$08,$08,$08,$08,$08,$00,$08,$00
byte = $14,$14,$14,$00,$00,$00,$00,$00,$14,$14,$3E,$14,$3E,$14,$14,$00
byte = $08,$3C,$0A,$1C,$28,$1E,$08,$00,$06,$26,$10,$08,$04,$32,$30,$00
byte = $04,$0A,$0A,$04,$2A,$12,$2C,$00,$08,$08,$08,$00,$00,$00,$00,$00
byte = $08,$04,$02,$02,$02,$04,$08,$00,$08,$10,$20,$20,$20,$10,$08,$00
byte = $08,$2A,$1C,$08,$1C,$2A,$08,$00,$00,$08,$08,$3E,$08,$08,$00,$00
byte = $00,$00,$00,$00,$08,$08,$04,$00,$00,$00,$00,$3E,$00,$00,$00,$00
byte = $00,$00,$00,$00,$00,$00,$08,$00,$00,$20,$10,$08,$04,$02,$00,$00
byte = $1C,$22,$32,$2A,$26,$22,$1C,$00,$08,$0C,$08,$08,$08,$08,$1C,$00
byte = $1C,$22,$20,$18,$04,$02,$3E,$00,$3E,$20,$10,$18,$20,$22,$1C,$00
byte = $10,$18,$14,$12,$3E,$10,$10,$00,$3E,$02,$1E,$20,$20,$22,$1C,$00
byte = $38,$04,$02,$1E,$22,$22,$1C,$00,$3E,$20,$10,$08,$04,$04,$04,$00
byte = $1C,$22,$22,$1C,$22,$22,$1C,$00,$1C,$22,$22,$3C,$20,$10,$0E,$00
byte = $00,$00,$08,$00,$08,$00,$00,$00,$00,$00,$08,$00,$08,$08,$04,$00
byte = $10,$08,$04,$02,$04,$08,$10,$00,$00,$00,$3E,$00,$3E,$00,$00,$00
byte = $04,$08,$10,$20,$10,$08,$04,$00,$1C,$22,$10,$08,$08,$00,$08,$00
byte = $1C,$22,$2A,$3A,$1A,$02,$3C,$00,$08,$14,$22,$22,$3E,$22,$22,$00
byte = $1E,$22,$22,$1E,$22,$22,$1E,$00,$1C,$22,$02,$02,$02,$22,$1C,$00
byte = $1E,$22,$22,$22,$22,$22,$1E,$00,$3E,$02,$02,$1E,$02,$02,$3E,$00
byte = $3E,$02,$02,$1E,$02,$02,$02,$00,$3C,$02,$02,$02,$32,$22,$3C,$00
byte = $22,$22,$22,$3E,$22,$22,$22,$00,$1C,$08,$08,$08,$08,$08,$1C,$00
byte = $20,$20,$20,$20,$20,$22,$1C,$00,$22,$12,$0A,$06,$0A,$12,$22,$00
byte = $02,$02,$02,$02,$02,$02,$3E,$00,$22,$36,$2A,$2A,$22,$22,$22,$00
byte = $22,$22,$26,$2A,$32,$22,$22,$00,$1C,$22,$22,$22,$22,$22,$1C,$00
byte = $1E,$22,$22,$1E,$02,$02,$02,$00,$1C,$22,$22,$22,$2A,$12,$2C,$00
byte = $1E,$22,$22,$1E,$0A,$12,$22,$00,$1C,$22,$02,$1C,$20,$22,$1C,$00
byte = $3E,$08,$08,$08,$08,$08,$08,$00,$22,$22,$22,$22,$22,$22,$1C,$00
byte = $22,$22,$22,$22,$22,$14,$08,$00,$22,$22,$22,$2A,$2A,$36,$22,$00
byte = $22,$22,$14,$08,$14,$22,$22,$00,$22,$22,$14,$08,$08,$08,$08,$00
byte = $3E,$20,$10,$08,$04,$02,$3E,$00,$3E,$06,$06,$06,$06,$06,$3E,$00
byte = $00,$02,$04,$08,$10,$20,$00,$00,$3E,$30,$30,$30,$30,$30,$3E,$00
byte = $00,$00,$08,$14,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7F
byte = $00,$00,$00,$00,$00,$00,$00,$00,$08,$08,$08,$08,$08,$00,$08,$00
byte = $14,$14,$14,$00,$00,$00,$00,$00,$14,$14,$3E,$14,$3E,$14,$14,$00
byte = $08,$3C,$0A,$1C,$28,$1E,$08,$00,$06,$26,$10,$08,$04,$32,$30,$00
byte = $04,$0A,$0A,$04,$2A,$12,$2C,$00,$08,$08,$08,$00,$00,$00,$00,$00
byte = $08,$04,$02,$02,$02,$04,$08,$00,$08,$10,$20,$20,$20,$10,$08,$00
byte = $08,$2A,$1C,$08,$1C,$2A,$08,$00,$00,$08,$08,$3E,$08,$08,$00,$00
byte = $00,$00,$00,$00,$08,$08,$04,$00,$00,$00,$00,$3E,$00,$00,$00,$00
byte = $00,$00,$00,$00,$00,$00,$08,$00,$00,$20,$10,$08,$04,$02,$00,$00
byte = $1C,$22,$32,$2A,$26,$22,$1C,$00,$08,$0C,$08,$08,$08,$08,$1C,$00
byte = $1C,$22,$20,$18,$04,$02,$3E,$00,$3E,$20,$10,$18,$20,$22,$1C,$00
byte = $10,$18,$14,$12,$3E,$10,$10,$00,$3E,$02,$1E,$20,$20,$22,$1C,$00
byte = $38,$04,$02,$1E,$22,$22,$1C,$00,$3E,$20,$10,$08,$04,$04,$04,$00
byte = $1C,$22,$22,$1C,$22,$22,$1C,$00,$1C,$22,$22,$3C,$20,$10,$0E,$00
byte = $00,$00,$08,$00,$08,$00,$00,$00,$00,$00,$08,$00,$08,$08,$04,$00
byte = $10,$08,$04,$02,$04,$08,$10,$00,$00,$00,$3E,$00,$3E,$00,$00,$00
byte = $04,$08,$10,$20,$10,$08,$04,$00,$1C,$22,$10,$08,$08,$00,$08,$00
byte = $1C,$22,$2A,$3A,$1A,$02,$3C,$00,$08,$14,$22,$22,$3E,$22,$22,$00
byte = $1E,$22,$22,$1E,$22,$22,$1E,$00,$1C,$22,$02,$02,$02,$22,$1C,$00
byte = $1E,$22,$22,$22,$22,$22,$1E,$00,$3E,$02,$02,$1E,$02,$02,$3E,$00
byte = $3E,$02,$02,$1E,$02,$02,$02,$00,$3C,$02,$02,$02,$32,$22,$3C,$00
byte = $22,$22,$22,$3E,$22,$22,$22,$00,$1C,$08,$08,$08,$08,$08,$1C,$00
byte = $20,$20,$20,$20,$20,$22,$1C,$00,$22,$12,$0A,$06,$0A,$12,$22,$00
byte = $02,$02,$02,$02,$02,$02,$3E,$00,$22,$36,$2A,$2A,$22,$22,$22,$00
byte = $22,$22,$26,$2A,$32,$22,$22,$00,$1C,$22,$22,$22,$22,$22,$1C,$00
byte = $1E,$22,$22,$1E,$02,$02,$02,$00,$1C,$22,$22,$22,$2A,$12,$2C,$00
byte = $1E,$22,$22,$1E,$0A,$12,$22,$00,$1C,$22,$02,$1C,$20,$22,$1C,$00
byte = $3E,$08,$08,$08,$08,$08,$08,$00,$22,$22,$22,$22,$22,$22,$1C,$00
byte = $22,$22,$22,$22,$22,$14,$08,$00,$22,$22,$22,$2A,$2A,$36,$22,$00
byte = $22,$22,$14,$08,$14,$22,$22,$00,$22,$22,$14,$08,$08,$08,$08,$00
byte = $3E,$20,$10,$08,$04,$02,$3E,$00,$3E,$06,$06,$06,$06,$06,$3E,$00
byte = $00,$02,$04,$08,$10,$20,$00,$00,$3E,$30,$30,$30,$30,$30,$3E,$00
byte = $00,$00,$08,$14,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7F
byte = $00,$00,$00,$00,$00,$00,$00,$00,$08,$08,$08,$08,$08,$00,$08,$00
byte = $14,$14,$14,$00,$00,$00,$00,$00,$14,$14,$3E,$14,$3E,$14,$14,$00
byte = $08,$3C,$0A,$1C,$28,$1E,$08,$00,$06,$26,$10,$08,$04,$32,$30,$00
byte = $04,$0A,$0A,$04,$2A,$12,$2C,$00,$08,$08,$08,$00,$00,$00,$00,$00
byte = $08,$04,$02,$02,$02,$04,$08,$00,$08,$10,$20,$20,$20,$10,$08,$00
byte = $08,$2A,$1C,$08,$1C,$2A,$08,$00,$00,$08,$08,$3E,$08,$08,$00,$00
byte = $00,$00,$00,$00,$08,$08,$04,$00,$00,$00,$00,$3E,$00,$00,$00,$00
byte = $00,$00,$00,$00,$00,$00,$08,$00,$00,$20,$10,$08,$04,$02,$00,$00
byte = $1C,$22,$32,$2A,$26,$22,$1C,$00,$08,$0C,$08,$08,$08,$08,$1C,$00
byte = $1C,$22,$20,$18,$04,$02,$3E,$00,$3E,$20,$10,$18,$20,$22,$1C,$00
byte = $10,$18,$14,$12,$3E,$10,$10,$00,$3E,$02,$1E,$20,$20,$22,$1C,$00
byte = $38,$04,$02,$1E,$22,$22,$1C,$00,$3E,$20,$10,$08,$04,$04,$04,$00
byte = $1C,$22,$22,$1C,$22,$22,$1C,$00,$1C,$22,$22,$3C,$20,$10,$0E,$00
byte = $00,$00,$08,$00,$08,$00,$00,$00,$00,$00,$08,$00,$08,$08,$04,$00
byte = $10,$08,$04,$02,$04,$08,$10,$00,$00,$00,$3E,$00,$3E,$00,$00,$00
byte = $04,$08,$10,$20,$10,$08,$04,$00,$1C,$22,$10,$08,$08,$00,$08,$00
byte = $1C,$22,$2A,$3A,$1A,$02,$3C,$00,$08,$14,$22,$22,$3E,$22,$22,$00
byte = $1E,$22,$22,$1E,$22,$22,$1E,$00,$1C,$22,$02,$02,$02,$22,$1C,$00
byte = $1E,$22,$22,$22,$22,$22,$1E,$00,$3E,$02,$02,$1E,$02,$02,$3E,$00
byte = $3E,$02,$02,$1E,$02,$02,$02,$00,$3C,$02,$02,$02,$32,$22,$3C,$00
byte = $22,$22,$22,$3E,$22,$22,$22,$00,$1C,$08,$08,$08,$08,$08,$1C,$00
byte = $20,$20,$20,$20,$20,$22,$1C,$00,$22,$12,$0A,$06,$0A,$12,$22,$00
byte = $02,$02,$02,$02,$02,$02,$3E,$00,$22,$36,$2A,$2A,$22,$22,$22,$00
byte = $22,$22,$26,$2A,$32,$22,$22,$00,$1C,$22,$22,$22,$22,$22,$1C,$00
byte = $1E,$22,$22,$1E,$02,$02,$02,$00,$1C,$22,$22,$22,$2A,$12,$2C,$00
byte = $1E,$22,$22,$1E,$0A,$12,$22,$00,$1C,$22,$02,$1C,$20,$22,$1C,$00
byte = $3E,$08,$08,$08,$08,$08,$08,$00,$22,$22,$22,$22,$22,$22,$1C,$00
byte = $22,$22,$22,$22,$22,$14,$08,$00,$22,$22,$22,$2A,$2A,$36,$22,$00
byte = $22,$22,$14,$08,$14,$22,$22,$00,$22,$22,$14,$08,$08,$08,$08,$00
byte = $3E,$20,$10,$08,$04,$02,$3E,$00,$3E,$06,$06,$06,$06,$06,$3E,$00
byte = $00,$02,$04,$08,$10,$20,$00,$00,$3E,$30,$30,$30,$30,$30,$3E,$00
byte = $00,$00,$08,$14,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7F
byte = $04,$08,$10,$00,$00,$00,$00,$00,$00,$00,$1C,$20,$3C,$22,$3C,$00
byte = $02,$02,$1E,$22,$22,$22,$1E,$00,$00,$00,$3C,$02,$02,$02,$3C,$00
byte = $20,$20,$3C,$22,$22,$22,$3C,$00,$00,$00,$1C,$22,$3E,$02,$3C,$00
byte = $18,$24,$04,$1E,$04,$04,$04,$00,$00,$00,$1C,$22,$22,$3C,$20,$1C
byte = $02,$02,$1E,$22,$22,$22,$22,$00,$08,$00,$0C,$08,$08,$08,$1C,$00
byte = $10,$00,$18,$10,$10,$10,$12,$0C,$02,$02,$22,$12,$0E,$12,$22,$00
byte = $0C,$08,$08,$08,$08,$08,$1C,$00,$00,$00,$36,$2A,$2A,$22,$22,$00
byte = $00,$00,$1E,$22,$22,$22,$22,$00,$00,$00,$1C,$22,$22,$22,$1C,$00
byte = $00,$00,$1E,$22,$22,$1E,$02,$02,$00,$00,$3C,$22,$22,$3C,$20,$20
byte = $00,$00,$3A,$06,$02,$02,$02,$00,$00,$00,$3C,$02,$1C,$20,$1E,$00
byte = $04,$04,$1E,$04,$04,$24,$18,$00,$00,$00,$22,$22,$22,$32,$2C,$00
byte = $00,$00,$22,$22,$22,$14,$08,$00,$00,$00,$22,$22,$2A,$2A,$36,$00
byte = $00,$00,$22,$14,$08,$14,$22,$00,$00,$00,$22,$22,$22,$3C,$20,$1C
byte = $00,$00,$3E,$10,$08,$04,$3E,$00,$38,$0C,$0C,$06,$0C,$0C,$38,$00
byte = $08,$08,$08,$08,$08,$08,$08,$08,$0E,$18,$18,$30,$18,$18,$0E,$00
byte = $00,$2C,$1A,$00,$00,$00,$00,$00,$00,$2A,$14,$2A,$14,$2A,$00,$00
//
// Print string with HGR tile library
//
export def hgrPutStr(x, y, strptr)#0
tileDrawStr(x, y, strptr + 1, ^strptr, @hgrFont + 1024) // Offset into regular char
end
done

View File

@@ -16,7 +16,40 @@ const hgr1 = $2000
const hgr2 = $4000
const page1 = 0
const page2 = 1
//
// Apple III hardware constants.
//
const ENV_REG = $FFDF
//
// Screen addresses
//
word hgrbuff[] = hgr1, hgr2
//word hgrscan[] = $0000,$0400,$0800,$0C00,$1000,$1400,$1800,$1C00
//word = $0080,$0480,$0880,$0C80,$1080,$1480,$1880,$1C80
//word = $0100,$0500,$0900,$0D00,$1100,$1500,$1900,$1D00
//word = $0180,$0580,$0980,$0D80,$1180,$1580,$1980,$1D80
//word = $0200,$0600,$0A00,$0E00,$1200,$1600,$1A00,$1E00
//word = $0280,$0680,$0A80,$0E80,$1280,$1680,$1A80,$1E80
//word = $0300,$0700,$0B00,$0F00,$1300,$1700,$1B00,$1F00
//word = $0380,$0780,$0B80,$0F80,$1380,$1780,$1B80,$1F80
//word = $0028,$0428,$0828,$0C28,$1028,$1428,$1828,$1C28
//word = $00A8,$04A8,$08A8,$0CA8,$10A8,$14A8,$18A8,$1CA8
//word = $0128,$0528,$0928,$0D28,$1128,$1528,$1928,$1D28
//word = $01A8,$05A8,$09A8,$0DA8,$11A8,$15A8,$19A8,$1DA8
//word = $0228,$0628,$0A28,$0E28,$1228,$1628,$1A28,$1E28
//word = $02A8,$06A8,$0AA8,$0EA8,$12A8,$16A8,$1AA8,$1EA8
//word = $0328,$0728,$0B28,$0F28,$1328,$1728,$1B28,$1F28
//word = $03A8,$07A8,$0BA8,$0FA8,$13A8,$17A8,$1BA8,$1FA8
//word = $0050,$0450,$0850,$0C50,$1050,$1450,$1850,$1C50
//word = $00D0,$04D0,$08D0,$0CD0,$10D0,$14D0,$18D0,$1CD0
//word = $0150,$0550,$0950,$0D50,$1150,$1550,$1950,$1D50
//word = $01D0,$05D0,$09D0,$0DD0,$11D0,$15D0,$19D0,$1DD0
//word = $0250,$0650,$0A50,$0E50,$1250,$1650,$1A50,$1E50
//word = $02D0,$06D0,$0AD0,$0ED0,$12D0,$16D0,$1AD0,$1ED0
//word = $0350,$0750,$0B50,$0F50,$1350,$1750,$1B50,$1F50
//word = $03D0,$07D0,$0BD0,$0FD0,$13D0,$17D0,$1BD0,$1FD0
//word hmask = $8081,$8082,$8084,$8088,$8090,$80A0,$80C0
//word = $8180,$8280,$8480,$8880,$9080,$A080,$C080
byte hgrscanl[]= $00,$00,$00,$00,$00,$00,$00,$00
byte = $80,$80,$80,$80,$80,$80,$80,$80
byte = $00,$00,$00,$00,$00,$00,$00,$00
@@ -65,36 +98,10 @@ byte = $02,$06,$0A,$0E,$12,$16,$1A,$1E
byte = $02,$06,$0A,$0E,$12,$16,$1A,$1E
byte = $03,$07,$0B,$0F,$13,$17,$1B,$1F
byte = $03,$07,$0B,$0F,$13,$17,$1B,$1F
word //hgrscan[] = $0000,$0400,$0800,$0C00,$1000,$1400,$1800,$1C00
word // = $0080,$0480,$0880,$0C80,$1080,$1480,$1880,$1C80
word // = $0100,$0500,$0900,$0D00,$1100,$1500,$1900,$1D00
word // = $0180,$0580,$0980,$0D80,$1180,$1580,$1980,$1D80
word // = $0200,$0600,$0A00,$0E00,$1200,$1600,$1A00,$1E00
word // = $0280,$0680,$0A80,$0E80,$1280,$1680,$1A80,$1E80
word // = $0300,$0700,$0B00,$0F00,$1300,$1700,$1B00,$1F00
word // = $0380,$0780,$0B80,$0F80,$1380,$1780,$1B80,$1F80
word // = $0028,$0428,$0828,$0C28,$1028,$1428,$1828,$1C28
word // = $00A8,$04A8,$08A8,$0CA8,$10A8,$14A8,$18A8,$1CA8
word // = $0128,$0528,$0928,$0D28,$1128,$1528,$1928,$1D28
word // = $01A8,$05A8,$09A8,$0DA8,$11A8,$15A8,$19A8,$1DA8
word // = $0228,$0628,$0A28,$0E28,$1228,$1628,$1A28,$1E28
word // = $02A8,$06A8,$0AA8,$0EA8,$12A8,$16A8,$1AA8,$1EA8
word // = $0328,$0728,$0B28,$0F28,$1328,$1728,$1B28,$1F28
word // = $03A8,$07A8,$0BA8,$0FA8,$13A8,$17A8,$1BA8,$1FA8
word // = $0050,$0450,$0850,$0C50,$1050,$1450,$1850,$1C50
word // = $00D0,$04D0,$08D0,$0CD0,$10D0,$14D0,$18D0,$1CD0
word // = $0150,$0550,$0950,$0D50,$1150,$1550,$1950,$1D50
word // = $01D0,$05D0,$09D0,$0DD0,$11D0,$15D0,$19D0,$1DD0
word // = $0250,$0650,$0A50,$0E50,$1250,$1650,$1A50,$1E50
word // = $02D0,$06D0,$0AD0,$0ED0,$12D0,$16D0,$1AD0,$1ED0
word // = $0350,$0750,$0B50,$0F50,$1350,$1750,$1B50,$1F50
word // = $03D0,$07D0,$0BD0,$0FD0,$13D0,$17D0,$1BD0,$1FD0
word hcolor[] = $0000,$552A,$2A55,$7F7F,$8080,$D5AA,$AAD5,$FFFF
word hmask = $8081,$8082,$8084,$8088,$8090,$80A0,$80C0
word = $8180,$8280,$8480,$8880,$9080,$A080,$C080
byte hbmask = $81,$82,$84,$88,$90,$A0,$C0
byte hlmask = $FF,$FE,$FC,$F8,$F0,$E0,$C0
byte hrmask = $81,$83,$87,$8F,$9F,$BF,$FF
word hcolor[] = $0000,$552A,$2A55,$7F7F,$8080,$D5AA,$AAD5,$FFFF
word curhclr
byte drawpage = 1
word drawbuff = hgr2
@@ -543,8 +550,6 @@ end
asm _hgrPlotC
LDA $1000,Y ; HBMASK
STA TMPL
EOR #$FF
STA TMPH
LDA ESTKL+1,X ; HORIZ OFFSET
CMP #40
BCS +
@@ -553,12 +558,10 @@ asm _hgrPlotC
end
asm _hgrPlotD
LDA $2000,Y ; CURHCLR
AND TMPL
STA TMPL
LDY ESTKL+1,X ; HORIZ OFFSET
LDA (DST),Y
AND TMPH
ORA TMPL
EOR (DST),Y
AND TMPL
EOR (DST),Y
STA (DST),Y
+ INX
INX
@@ -601,14 +604,59 @@ asm _hgrXorPlotC
end
asm _hgrXorPlotD
LDA $2000,Y ; CURHCLR
AND TMPL
LDY ESTKL+1,X ; HORIZ OFFSET
AND TMPL
EOR (DST),Y
STA (DST),Y
+ INX
INX
RTS
end
//export def hgrOrPlot(x, y)#0
// word pixptr
// byte ofst, pixofst, pmask
//
// ofst, pixofst = divmod7(x)
// pixptr = hgrscan[y] + drawbuff + ofst
// pmask = hbmask[pixofst]
// ^pixptr = ^pixptr | (curhclr.[ofst & 1] & pmask)
//end
export asm hgrOrPlot(x, y)#0
LDY ESTKL+0,X ; Y COORD
CPY #192
BCS +
end
asm _hgrOrPlotA
LDA $8000,Y ; HGRSCANL
STA DSTL
LDA $1000 ; DRAWBUFFH
ORA $9000,Y ; HGRSCANH
STA DSTH
INX
end
asm _hgrOrPlotB
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; PIXEL OFFSET
end
asm _hgrOrPlotC
LDA $1000,Y ; HBMASK
STA TMPL
LDA ESTKL+1,X ; HORIZ OFFSET
CMP #40
BCS +
AND #$01
TAY
end
asm _hgrOrPlotD
LDA $2000,Y ; CURHCLR
LDY ESTKL+1,X ; HORIZ OFFSET
AND TMPL
ORA (DST),Y
STA (DST),Y
+ INX
INX
RTS
end
//export def hgrHLin(x1, x2, y)#0
// word pixptr, x
// byte lofst, lpixofst, lpmask
@@ -668,6 +716,8 @@ end
asm _hgrHLinD
LDA $1000,Y ; HRMASK
STA TMPH
LDY ESTKL+1,X ; RIGHT HORIZ OFFSET
STY IPY ; STEAL THIS ZP FOR A MOMENT
INX
INX
INX
@@ -679,62 +729,163 @@ end
asm _hgrHLinF
LDA $1000,Y ; HLMASK
STA TMPL
LDA ESTKL+1,X ; LEFT HORIZ OFFSET
TAY
LDY ESTKL+1,X ; LEFT HORIZ OFFSET
TYA
LSR
BCS +
end
asm _hgrHLinG
LDA $2000 ; CURHCLRL
STA SRCL
LDA $2001 ; CURHCLRH
STA SRCH
LDA $2000 ; CURHCLRL
STA SRCL
BCC ++
+ LDA $2000 ; CURHCLRL
STA SRCH
LDA $2001 ; CURHCLRH
STA SRCL
++ TYA
CMP ESTKL-1,X ; RIGHT HORIZ OFFSET
++ CPY IPY ; RIGHT HORIZ OFFSET
BNE +
LDA TMPL
EOR (DST),Y
AND TMPL
AND TMPH
STA TMPL
AND SRCL
STA TMPH
LDA TMPL
EOR #$FF
AND (DST),Y
ORA TMPH
EOR (DST),Y
STA (DST),Y
INX
INX
RTS
+ LDA SRCL ; CURHCLR
+ EOR (DST),Y
AND TMPL
STA ESTKL+0,X
LDA TMPL
EOR #$FF
AND (DST),Y
ORA ESTKL+0,X
EOR (DST),Y
- STA (DST),Y
INY
TYA
CMP ESTKL-1,X ; RIGHT HORIZ OFFSET
LDA SRCH
INY
CPY IPY ; RIGHT HORIZ OFFSET
BCS +
STA (DST),Y
INY
TYA
CMP ESTKL-1,X ; RIGHT HORIZ OFFSET
LDA SRCL
INY
CPY IPY ; RIGHT HORIZ OFFSET
BCC -
+ EOR (DST),Y
AND TMPH
EOR (DST),Y
STA (DST),Y
INX
INX
RTS
end
//export def hgrXorHLin(x1, x2, y)#0
// word pixptr, x
// byte lofst, lpixofst, lpmask
// byte rofst, rpixofst, rpmask
//
// if x1 == x2
// hgrPlot(x1, y)
// else
// lofst, lpixofst = divmod7(x1)
// pixptr = hgrscan[y] + drawbuff + lofst
// rofst, rpixofst = divmod7(x2)
// lpmask = hlmask[lpixofst]
// rpmask = hrmask[rpixofst]
// if lofst == rofst
// lpmask = lpmask & rpmask
// ^pixptr = ^pixptr ^ (curhclr.[pixptr.0 & 1] & lpmask)
// else
// ^pixptr = ^pixptr ^ (curhclr.[pixptr.0 & 1] & lpmask)
// pixptr++
// for x = lofst + 1 to rofst - 1
// ^pixptr = ^pixptr ^ curhclr.[pixptr.0 & 1]
// pixptr++
// next
// ^pixptr = ^pixptr ^ (curhclr.[pixptr.0 & 1] & rpmask)
// fin
// fin
//end
export asm hgrXorHLin(x1, x2, y)#0
LDA ESTKL+1
CMP ESTKL+2
BNE +
LDA ESTKH+1
CMP ESTKH+2
BNE +
end
asm _hgrXHLinA
JSR $F000
INX
RTS
+ LDY ESTKL+0,X ; Y COORD
end
asm _hgrXHLinB
LDA $8000,Y ; HGRSCANL
STA DSTL
LDA $1000 ; DRAWBUFFH
ORA $9000,Y ; HGRSCANH
STA DSTH
LDA ESTKL+1,X
STA ESTKL+0,X
LDA ESTKH+1,X
STA ESTKH+0,X
end
asm _hgrXHLinC
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; RIGHT PIXEL OFFSET
end
asm _hgrXHLinD
LDA $1000,Y ; HRMASK
STA TMPH
LDY ESTKL+1,X ; RIGHT HORIZ OFFSET
STY IPY ; STEAL THIS ZP FOR A MOMENT
INX
INX
INX
end
asm _hgrXHLinE
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; LEFT PIXEL OFFSET
end
asm _hgrXHLinF
LDA $1000,Y ; HLMASK
STA TMPL
LDY ESTKL+1,X ; LEFT HORIZ OFFSET
TYA
LSR
BCS +
end
asm _hgrXHLinG
LDA $2001 ; CURHCLRH
STA SRCH
LDA $2000 ; CURHCLRH
STA SRCL
BCC ++
+ LDA $2000 ; CURHCLRL
STA SRCH
LDA $2001 ; CURHCLRH
STA SRCL
++ CPY IPY ; RIGHT HORIZ OFFSET
BNE +
AND TMPL
AND TMPH
EOR (DST),Y
STA (DST),Y
INX
INX
RTS
+ AND TMPL
- EOR (DST),Y
STA (DST),Y
LDA SRCH
INY
CPY IPY ; RIGHT HORIZ OFFSET
BCS +
EOR (DST),Y
STA (DST),Y
LDA SRCL
INY
CPY IPY ; RIGHT HORIZ OFFSET
BCC -
+ AND TMPH
STA ESTKL+0,X
LDA TMPH
EOR #$FF
AND (DST),Y
ORA ESTKL+0,X
EOR (DST),Y
STA (DST),Y
INX
INX
@@ -800,8 +951,67 @@ asm _hgrVLinC
INX
RTS
end
//export def hgrXVlin(y1, y2, x)#0
// word pixptr, y, ofst
// byte pixofst, pmask, cmask
//
// if y1 == y2
// hgrXorPlot(x, y1)
// else
// ofst, pixofst = divmod7(x)
// ofst = ofst + drawbuff
// pmask = hbmask[pixofst]
// cmask = curhclr.[ofst & 1] & pmask
// pmask = ~pmask
// for y = y1 to y2
// pixptr = hgrscan[y] + ofst
// ^pixptr = ^pixptr ^ cmask
// next
// fin
//end
export asm hgrXorVlin(y1, y2, x)#0
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; PIXEL OFFSET
end
asm _hgrXVLinA
LDA $1000,Y ; HBMASK
STA TMPL
EOR #$FF
STA TMPH
LDA ESTKL+1,X ; HORIZ OFFSET
AND #$01
TAY
end
asm _hgrXVLinB
LDA $2000,Y ; CURHCLR
AND TMPL
STA TMPL
LDY ESTKL+3,X ; Y1 COORD
end
asm _hgrXVLinC
- LDA $8000,Y ; HGRSCANL
STA DSTL
LDA $1000 ; DRAWBUFFH
ORA $9000,Y ; HGRSCANH
STA DSTH
LDY ESTKL+1,X ; HORIZ OFFSET
LDA TMPL
EOR (DST),Y
STA (DST),Y
LDY ESTKL+3,X ; Y1 COORD
TYA
INY
STY ESTKL+3,X ; Y1 COORD
CMP ESTKL+2,X ; Y2 COORD
BNE -
INX
INX
INX
INX
RTS
end
//
// BLT scanline of pixmap
// Masked BLT scanline of pixmap
//
asm scanBLT(x, y, w, srcptr)#0
LDA ESTKL+0,X ; SRC PTR
@@ -841,7 +1051,7 @@ asm _scanBLTB
JSR $D000 ; HPLOT
BEQ ++
BNE ++
+ JSR $E000 ; HPLOTX
+ JSR $E000 ; HPLOTOR
++ INC ESTKL+3,X ; X COORDL
BNE +
INC ESTKH+3,X ; X COORDH
@@ -878,7 +1088,7 @@ asm _scanBLTD
JSR $D000 ; HPLOT
BEQ ++
BNE ++
+ JSR $E000 ; HPLOTX
+ JSR $E000 ; HPLOTOR
++ INC ESTKL+3,X ; X COORDL
BNE +
INC ESTKH+3,X ; X COORDH
@@ -893,7 +1103,7 @@ BLTDONE INX
INX
RTS
end
export def hgrRect(x1, x2, y1, y2)#0
export def hgrRect(x1, y1, x2, y2)#0
word y
if x1 == x2
@@ -904,6 +1114,17 @@ export def hgrRect(x1, x2, y1, y2)#0
next
fin
end
export def hgrXorRect(x1, y1, x2, y2)#0
word y
if x1 == x2
hgrXorVLin(y1, y2, x1)
else
for y = y1 to y2
hgrXorHLin(x1, x2, y)
next
fin
end
export def hgrBLT(x, y, w, h, srcptr)#0
word i, j
word saveclr
@@ -917,7 +1138,7 @@ export def hgrBLT(x, y, w, h, srcptr)#0
// if i & 1
// hgrColor(c)
// if c & $08
// hgrXorPlot(x + i, j)
// hgrOrPlot(x + i, j)
// else
// hgrPlot(x + i, j)
// fin
@@ -934,22 +1155,29 @@ export def hgrBLT(x, y, w, h, srcptr)#0
next
curhclr = saveclr
end
export def hgrMode#1
memset(hgr1, 0, $2000) // Clear HGR page 1
^showpage1
^showfull
^showhires
^showgraphics
drawpage = 1
drawbuff = hgrbuff[1]
return 1
end
export def txtMode#0
export def hgrMode(mode)#1
if mode
//
// Set HGR mode
//
memset(hgr1, 0, $2000) // Clear HGR page 1
^showpage1
^showfull
^showhires
^showgraphics
drawpage = 1
drawbuff = hgrbuff[1]
return 1
fin
//
// Show text mode
//
^showpage1
^showtext
return 0
end
export def hgrClear#0
memset(drawbuff, curhclr, $2000) // Clear HGR page 1
memset(drawbuff, curhclr, drawbuff) // Clear current HGR page
end
//
// Set display page, return other page
@@ -971,6 +1199,13 @@ export def hgrDrawBuf(page)#1
return drawpage
end
//
// Machine compatibility check
//
if MACHID & MACHID_MODEL == MACHID_III or MACHID & MACHID_MODEL == MACHID_I
puts("Apple II compatible only.\n")
return -1
fin
//
// Assembly fixups
//
hgrCopyDst:1 = @clipsrc
@@ -1005,6 +1240,12 @@ _hgrXorPlotA:9 = @hgrscanh
_hgrXorPlotB:1 = @divmod7
_hgrXorPlotC:1 = @hbmask
_hgrXorPlotD:1 = @curhclr
_hgrOrPlotA:1 = @hgrscanl
_hgrOrPlotA:6 = @drawbuff.1
_hgrOrPlotA:9 = @hgrscanh
_hgrOrPlotB:1 = @divmod7
_hgrOrPlotC:1 = @hbmask
_hgrOrPlotD:1 = @curhclr
_hgrHLinA:1 = @hgrPlot
_hgrHLinB:1 = @hgrscanl
_hgrHLinB:6 = @drawbuff.1
@@ -1013,24 +1254,42 @@ _hgrHLinC:1 = @divmod7
_hgrHLinD:1 = @hrmask
_hgrHLinE:1 = @divmod7
_hgrHLinF:1 = @hlmask
_hgrHLinG:1 = @curhclr
_hgrHLinG:6 = @curhclr.1
_hgrHLinG:13 = @curhclr.1
_hgrHLinG:18 = @curhclr
_hgrHLinG:1 = @curhclr.1
_hgrHLinG:6 = @curhclr
_hgrHLinG:13 = @curhclr
_hgrHLinG:18 = @curhclr.1
_hgrXHLinA:1 = @hgrXorPlot
_hgrXHLinB:1 = @hgrscanl
_hgrXHLinB:6 = @drawbuff.1
_hgrXHLinB:9 = @hgrscanh
_hgrXHLinC:1 = @divmod7
_hgrXHLinD:1 = @hrmask
_hgrXHLinE:1 = @divmod7
_hgrXHLinF:1 = @hlmask
_hgrXHLinG:1 = @curhclr.1
_hgrXHLinG:6 = @curhclr
_hgrXHLinG:13 = @curhclr
_hgrXHLinG:18 = @curhclr.1
hgrVLin:1 = @divmod7
_hgrVLinA:1 = @hbmask
_hgrVLinB:1 = @curhclr
_hgrVLinC:1 = @hgrscanl
_hgrVLinC:6 = @drawbuff.1
_hgrVLinC:9 = @hgrscanh
hgrXorVLin:1 = @divmod7
_hgrXVLinA:1 = @hbmask
_hgrXVLinB:1 = @curhclr
_hgrXVLinC:1 = @hgrscanl
_hgrXVLinC:6 = @drawbuff.1
_hgrXVLinC:9 = @hgrscanh
hgrColor:7 = @hcolor
hgrColor:10 = @curhclr
hgrColor:13 = @hcolor.1
hgrColor:16 = @curhclr.1
_scanBLTA:1 = @hgrColor
_scanBLTB:1 = @hgrPlot
_scanBLTB:8 = @hgrXorPlot
_scanBLTB:8 = @hgrOrPlot
_scanBLTC:1 = @hgrColor
_scanBLTD:1 = @hgrPlot
_scanBLTD:8 = @hgrXorPlot
_scanBLTD:8 = @hgrOrPlot
done

View File

@@ -107,8 +107,10 @@ BLTDONE INX
end
def spriteBLTMask(x, y, w, h, srcptr)#0
word i, j
byte pitch
byte c
pitch = (w + 1) / 2
for j = y to y + h - 1
scanMask(x, j, w, srcptr)
// for i = 0 to w - 1
@@ -120,71 +122,72 @@ def spriteBLTMask(x, y, w, h, srcptr)#0
// fin
// hgrPlot(x + i, j)
// next
srcptr = srcptr + (w + 1) / 2
srcptr = srcptr + pitch
next
end
export def spriteCompile(w, h, xcenter, ycenter, srcptr)#1
var sprtptr, bytewidth, spritesize, i
sprtptr = heapalloc(t_sprite)
bytewidth = (w + 7) / 7 + 1
if not sprtptr; return 0; fin
bytewidth = (w + 13) / 7
sprtptr->s_pitch = bytewidth
spritesize = bytewidth * h
sprtptr=>s_size = spritesize
sprtptr->s_height = h
sprtptr->s_xcenter = xcenter
sprtptr->s_ycenter = ycenter
sprtptr=>s_under[0] = heapalloc(spritesize)
sprtptr=>s_under[1] = heapalloc(spritesize)
sprtptr=>s_under[0] = 0
sprtptr=>s_under[1] = 0
for i = 0 to 13
sprtptr=>s_map[i] = heapalloc(spritesize)
sprtptr=>s_mask[i] = heapalloc(spritesize)
if not sprtptr=>s_map[i] or not sprtptr=>s_mask[i]
heaprelease(sprtptr)
return 0
fin
hgrColor(7)
hgrRect(0, 0, w + 21, h - 1)
spriteBLTMask(i, 0, w, h, srcptr)
hgrCopyDst(i > 6 ?? 1 :: 0, 0, bytewidth, h, sprtptr=>s_mask[i])
hgrColor(0)
hgrRect(0, w + 21, 0, h - 1)
hgrBLT(i, 0, w, h, srcptr)
hgrCopyDst(i > 6 ?? 1 :: 0, 0, bytewidth, h, sprtptr=>s_map[i])
hgrColor(3)
hgrRect(0, w + 21, h, h * 2 - 1)
spriteBLTMask(i, h, w, h, srcptr)
hgrCopyDst(i > 6 ?? 1 :: 0, h, bytewidth, h, sprtptr=>s_mask[i])
hgrRect(0, h, w + 21, h * 2 - 1)
hgrBLT(i, h, w, h, srcptr)
hgrCopyDst(i > 6 ?? 1 :: 0, h, bytewidth, h, sprtptr=>s_map[i])
next
return sprtptr
end
export def spriteDup(sprtsrc)#1
var sprtdup, spritesize
var sprtdup
byte i
sprtdup = heapalloc(t_sprite)
spritesize = sprtsrc=>s_size
sprtdup=>s_size = spritesize
sprtdup->s_pitch = sprtsrc->s_pitch
sprtdup->s_height = sprtsrc->s_height
sprtdup->s_height = sprtsrc->s_height
sprtdup->s_xcenter = sprtsrc->s_xcenter
sprtdup->s_ycenter = sprtsrc->s_ycenter
sprtdup=>s_under[0] = heapalloc(spritesize)
sprtdup=>s_under[1] = heapalloc(spritesize)
for i = 0 to 13
sprtdup=>s_map[i] = sprtsrc=>s_map[i]
sprtdup=>s_mask[i] = sprtsrc=>s_mask[i]
next
sprtdup = heapalloc(t_sprite)
if not sprtdup; return 0; fin
memcpy(sprtdup, sprtsrc, t_sprite)
sprtdup=>s_under[0] = 0
sprtdup=>s_under[1] = 0
return sprtdup
end
export def spriteRead(filestr)#1
var sprtptr, spritesize
byte refnum, i
sprtptr = 0
refnum = fileio:open(@filestr)
sprtptr = heapalloc(t_sprite)
if not sprtptr; return 0; fin
refnum = fileio:open(filestr)
if refnum
sprtptr = heapalloc(t_sprite)
if fileio:read(refnum, sprtptr, t_sprite) == t_sprite
spritesize = sprtptr=>s_size
sprtptr=>s_under[0] = heapalloc(spritesize)
sprtptr=>s_under[1] = heapalloc(spritesize)
sprtptr=>s_under[0] = 0
sprtptr=>s_under[1] = 0
for i = 0 to 13
sprtptr=>s_map[i] = heapalloc(spritesize)
sprtptr=>s_mask[i] = heapalloc(spritesize)
if not sprtptr=>s_map[i] or not sprtptr=>s_mask[i]
heaprelease(sprtptr)
fileio:close(refnum)
return 0
fin
fileio:read(refnum, sprtptr=>s_map[i], spritesize)
fileio:read(refnum, sprtptr=>s_mask[i], spritesize)
next
@@ -193,6 +196,9 @@ export def spriteRead(filestr)#1
sprtptr = 0
fin
fileio:close(refnum)
else
heaprelease(sprtptr)
sprtptr = 0
fin
return sprtptr
end
@@ -200,9 +206,9 @@ export def spriteSave(filestr, sprtptr)#1
var spritesize
byte refnum, i
fileio:destroy(@filestr)
if fileio:create(@filestr, $06, $0000) == FILE_ERR_OK
refnum = fileio:open(@filestr)
fileio:destroy(filestr)
if fileio:create(filestr, $06, $0000) == FILE_ERR_OK
refnum = fileio:open(filestr)
if refnum
if fileio:write(refnum, sprtptr, t_sprite) == t_sprite
spritesize = sprtptr=>s_size
@@ -230,12 +236,18 @@ export def spriteDraw(sprtptr)#0
sprtptr=>s_undery[drawpage] = y
pitch = sprtptr->s_pitch
height = sprtptr->s_height
if not sprtptr=>s_under[drawpage]
sprtptr=>s_under[drawpage] = heapalloc(sprtptr=>s_size)
if not sprtptr=>s_under[drawpage]; return; fin
fin
hgrCopyDst(ofst, y, pitch, height, sprtptr=>s_under[drawpage])
hgrAndSrc( ofst, y, pitch, height, sprtptr=>s_mask[map])
hgrXorSrc( ofst, y, pitch, height, sprtptr=>s_map[map])
end
export def spriteUnDraw(sprtptr)#0
hgrCopySrc(sprtptr=>s_underofst[drawpage], sprtptr=>s_undery[drawpage], sprtptr->s_pitch, sprtptr->s_height, sprtptr=>s_under[drawpage])
if sprtptr=>s_under[drawpage]
hgrCopySrc(sprtptr=>s_underofst[drawpage], sprtptr=>s_undery[drawpage], sprtptr->s_pitch, sprtptr->s_height, sprtptr=>s_under[drawpage])
fin
end
export def spriteDrawXor(sprtptr)#0
byte map, pitch, height
@@ -267,6 +279,18 @@ export def spritePosIndex(x, y, i)#0
drawList[i]=>s_xpos = x - drawList[i]->s_xcenter
fin
end
export def spriteUnDrawList#0
byte i
var undrawptr
undrawptr = undrawList[drawpage]
for i = 15 downto 0
if undrawptr=>[i]
spriteUnDraw(undrawptr=>[i])
undrawptr=>[i] = 0
fin
next
end
export def spriteDrawList#0
byte i
var undrawptr
@@ -284,6 +308,18 @@ export def spriteDrawList#0
next
memcpy(undrawptr, @drawList, 16*2)
end
export def spriteUnDrawXorList#0
byte i
var undrawptr
undrawptr = undrawList[drawpage]
for i = 0 to 15
if undrawptr=>[i]
spriteUnDrawXor(undrawptr=>[i])
undrawptr=>[i] = 0
fin
next
end
export def spriteDrawXorList#0
byte i
var undrawptr
@@ -315,8 +351,9 @@ export def spriteDel(i)#1
drawList[i] = 0
return sprtprev
end
export def spriteDrawBuf(page)#0
export def spriteDrawBuf(page)#1
drawpage = page & 1
return drawpage
end
//
// Assembly fixups

View File

@@ -0,0 +1,435 @@
include "inc/cmdsys.plh"
//
// Hardware addresses
//
const showgraphics = $C050
const showtext = $C051
const showfull = $C052
const showmix = $C053
const showpage1 = $C054
const showpage2 = $C055
const showlores = $C056
const showhires = $C057
const keyboard = $C000
const keystrobe = $C010
const txt1 = $0400
const txt2 = $0800
const hgr1 = $2000
const hgr2 = $4000
const page1 = 0
const page2 = 1
word txtbuff[] = txt1, txt2
word hgrbuff[] = hgr1, hgr2
//
// Screen tile scanline addresses.
//
word[] rowaddr = $0000,$0080,$0100,$0180,$0200,$0280,$0300,$0380
word = $0028,$00A8,$0128,$01A8,$0228,$02A8,$0328,$03A8
word = $0050,$00D0,$0150,$01D0,$0250,$02D0,$0350,$03D0
byte[] scanbttml = $00,$80,$00,$80,$00,$80,$00,$80
byte = $28,$A8,$28,$A8,$28,$A8,$28,$A8
byte = $50,$D0,$50,$D0,$50,$D0,$50,$D0
byte[] scanbttmh = $1C,$1C,$1D,$1D,$1E,$1E,$1F,$1F
byte = $1C,$1C,$1D,$1D,$1E,$1E,$1F,$1F
byte = $1C,$1C,$1D,$1D,$1E,$1E,$1F,$1F
byte hbmask = $81,$82,$84,$88,$90,$A0,$C0
word hcolor[] = $0000,$552A,$2A55,$7F7F,$8080,$D5AA,$AAD5,$FFFF
byte drawpage = 0
word drawbuff = hgr1
asm tileInc#0
!SOURCE "vmsrc/plvmzp.inc"
CURSH = $24
CURSV = $25
GBASL = $26
GBASH = $27
GBASE = GBASL
TBASL = $28
TBASH = $29
TBASE = TBASL
TBAS2L = $2A
TBAS2H = $2B
TBAS2E = TBAS2L
end
//export def tileDraw(x, y, tileptr)#0
// var scrnptr
//
// scrnptr = (scanaddr[y] | drawbuff) + x
// scrnptr->[$1C00] = tileptr->[7]
// scrnptr->[$1800] = tileptr->[6]
// scrnptr->[$1400] = tileptr->[5]
// scrnptr->[$1000] = tileptr->[4]
// scrnptr->[$0C00] = tileptr->[3]
// scrnptr->[$0800] = tileptr->[2]
// scrnptr->[$0400] = tileptr->[1]
// scrnptr->[$0000] = tileptr->[0]
//end
export asm tileDraw(x, y, tileptr)#0
LDA ESTKL+0,X ; TILEPTRL
STA SRCL
LDA ESTKH+0,X ; TILEPTRH
STA SRCH
LDY ESTKL+1,X ; Y COORD
LDA ESTKL+2,X ; X COORD
CLC
end
asm _tileDraw
ADC $1000,Y ; SCANBTTML
STA ESTKL+0,X ; USE ESTK AS POINTER
LDA $3001 ; DRAWBUFFH
ADC $2000,Y ; SCANBTTMH
STA ESTKL+1,X
LDY #$07 ; DRAW BOTTOM UP
SEC
- LDA (SRC),Y
STA (ESTKL,X)
LDA ESTKL+1,X
SBC #$04
STA ESTKL+1,X
DEY
BNE -
LDA (SRC),Y
STA (ESTKL,X)
INX
INX
INX
RTS
end
//export def tileXorDraw(x, y, tileptr)#0
// var scrnptr
//
// scrnptr = (scanaddr[y] | drawbuff) + x
// scrnptr->[$1C00] = tileptr->[7]
// scrnptr->[$1800] = tileptr->[6]
// scrnptr->[$1400] = tileptr->[5]
// scrnptr->[$1000] = tileptr->[4]
// scrnptr->[$0C00] = tileptr->[3]
// scrnptr->[$0800] = tileptr->[2]
// scrnptr->[$0400] = tileptr->[1]
// scrnptr->[$0000] = tileptr->[0]
//end
export asm tileXorDraw(x, y, tileptr)#0
LDA ESTKL+0,X ; TILEPTRL
STA SRCL
LDA ESTKH+0,X ; TILEPTRH
STA SRCH
LDY ESTKL+1,X ; Y COORD
LDA ESTKL+2,X ; X COORD
CLC
end
asm _tileXDraw
ADC $1000,Y ; SCANBTTML
STA ESTKL+0,X ; USE ESTK AS POINTER
LDA $3001 ; DRAWBUFFH
ADC $2000,Y ; SCANBTTMH
STA ESTKL+1,X
LDY #$07 ; DRAW BOTTOM UP
SEC
- LDA (SRC),Y
EOR (ESTKL,X)
STA (ESTKL,X)
LDA ESTKL+1,X
SBC #$04
STA ESTKL+1,X
DEY
BNE -
LDA (SRC),Y
EOR (ESTKL,X)
STA (ESTKL,X)
INX
INX
INX
RTS
end
//export def tileOrDraw(x, y, tileptr)#0
// var scrnptr
//
// scrnptr = (scanaddr[y] | drawbuff) + x
// scrnptr->[$1C00] = tileptr->[7]
// scrnptr->[$1800] = tileptr->[6]
// scrnptr->[$1400] = tileptr->[5]
// scrnptr->[$1000] = tileptr->[4]
// scrnptr->[$0C00] = tileptr->[3]
// scrnptr->[$0800] = tileptr->[2]
// scrnptr->[$0400] = tileptr->[1]
// scrnptr->[$0000] = tileptr->[0]
//end
export asm tileOrDraw(x, y, tileptr)#0
LDA ESTKL+0,X ; TILEPTRL
STA SRCL
LDA ESTKH+0,X ; TILEPTRH
STA SRCH
LDY ESTKL+1,X ; Y COORD
LDA ESTKL+2,X ; X COORD
CLC
end
asm _tileODraw
ADC $1000,Y ; SCANBTTML
STA ESTKL+0,X ; USE ESTK AS POINTER
LDA $3001 ; DRAWBUFFH
ADC $2000,Y ; SCANBTTMH
STA ESTKL+1,X
LDY #$07 ; DRAW BOTTOM UP
SEC
- LDA (SRC),Y
ORA (ESTKL,X)
STA (ESTKL,X)
LDA ESTKL+1,X
SBC #$04
STA ESTKL+1,X
DEY
BNE -
LDA (SRC),Y
ORA (ESTKL,X)
STA (ESTKL,X)
INX
INX
INX
RTS
end
//export def tileAndDraw(x, y, tileptr)#0
// var scrnptr
//
// scrnptr = (scanaddr[y] | drawbuff) + x
// scrnptr->[$1C00] = tileptr->[7]
// scrnptr->[$1800] = tileptr->[6]
// scrnptr->[$1400] = tileptr->[5]
// scrnptr->[$1000] = tileptr->[4]
// scrnptr->[$0C00] = tileptr->[3]
// scrnptr->[$0800] = tileptr->[2]
// scrnptr->[$0400] = tileptr->[1]
// scrnptr->[$0000] = tileptr->[0]
//end
export asm tileAndDraw(x, y, tileptr)#0
LDA ESTKL+0,X ; TILEPTRL
STA SRCL
LDA ESTKH+0,X ; TILEPTRH
STA SRCH
LDY ESTKL+1,X ; Y COORD
LDA ESTKL+2,X ; X COORD
CLC
end
asm _tileADraw
ADC $1000,Y ; SCANBTTML
STA ESTKL+0,X ; USE ESTK AS POINTER
LDA $3001 ; DRAWBUFFH
ADC $2000,Y ; SCANBTTMH
STA ESTKL+1,X
LDY #$07 ; DRAW BOTTOM UP
SEC
- LDA (SRC),Y
AND (ESTKL,X)
STA (ESTKL,X)
LDA ESTKL+1,X
SBC #$04
STA ESTKL+1,X
DEY
BNE -
LDA (SRC),Y
AND (ESTKL,X)
STA (ESTKL,X)
INX
INX
INX
RTS
end
//export def tileDrawStr(x, y, strptr, strlen, tileset)#0
// while strlen
// tileDraw(x, y, tileset + ^strptr * 8)
// x++
// strptr++
// strlen--
// loop
//end
export asm tileDrawStr(x, y, strptr, strlen, tileset)#0
LDA ESTKL+0,X ; TILESETPTRL
STA DSTL
LDA ESTKH+0,X ; TILESETPTRH
STA DSTH
LDA ESTKL+2,X ; STRPTRL
STA TMPL
LDA ESTKH+2,X ; STRPTRH
STA TMPH
LDY ESTKL+3,X ; Y COORD
LDA ESTKL+4,X ; X COORD
CLC
end
asm _tileDSa
ADC $1000,Y ; SCANBTTML
STA $D000 ; SELF MODIFY LOOP
STA $D001
STA $D002
STA $D003
STA $D004
STA $D005
STA $D006
STA $D007
end
asm _tileDSb
LDA $3001 ; DRAWBUFFH
ADC $2000,Y ; SCANBTTMH
STA $D008 ; SELF MODIFY LOOP
SEC
SBC #$04
STA $D009
SBC #$04
STA $D00A
SBC #$04
STA $D00B
SBC #$04
STA $D00C
SBC #$04
STA $D00D
SBC #$04
STA $D00E
SBC #$04
STA $D00F
LDA ESTKL+1,X ; STRLEN
STX IPY
TAX ; DRAW RIGHT TO LEFT
BEQ +
DEX
LDY #$00
- STY SRCH
TXA
TAY
LDA (TMP),Y ; TILE INDEX * 8
ASL
ROL SRCH
ASL
ROL SRCH
ASL
ROL SRCH
; CLC ; CARRY IS CLEAR FROM ABOVE
ADC DSTL ; ADD TO TILESETPTR
STA SRCL
LDA SRCH
ADC DSTH
STA SRCH
LDY #$07 ; DRAW BOTTOM UP
end
asm _tileDSc
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEY
LDA (SRC),Y
STA $4000,X
DEX
BPL -
LDX IPY
+ INX
INX
INX
INX
INX
RTS
end
export def tileFromText(txtpage, tileset)#0
byte y
word txtptr
txtptr = txtbuff[txtpage & 1]
for y = 0 to 23
tileDrawStr(0, y, rowaddr[y] | txtptr, 40, tileset)
next
end
export def tileMode(mode)#1
if mode
//
// Set HGR mode
//
memset(hgr1, 0, $2000) // Clear HGR page 1
^showpage1
^showfull
^showhires
^showgraphics
drawpage = 0
drawbuff = hgr1
return 0
fin
//
// Show text mode
//
^showpage1
^showtext
return 0
end
export def tileClear#0
memset(drawbuff, $0000, drawbuff) // Clear current HGR page
end
//
// Set display page, return other page
//
export def tileShow(page)#1
page = page & 1
^(showpage1 + page)
return page ^ 1
end
export def tileSwap#1
^(showpage1 + drawpage)
drawpage = drawpage ^ 1
drawbuff = hgrbuff[drawpage]
return drawpage
end
export def tileDrawBuf(page)#1
drawpage = page & 1
drawbuff = hgrbuff[drawpage]
return drawpage
end
//
// Assembly fixups
//
_tileDraw:1 = @scanbttml
_tileDraw:6 = @drawbuff.1
_tileDraw:9 = @scanbttmh
_tileXDraw:1 = @scanbttml
_tileXDraw:6 = @drawbuff.1
_tileXDraw:9 = @scanbttmh
_tileODraw:1 = @scanbttml
_tileODraw:6 = @drawbuff.1
_tileODraw:9 = @scanbttmh
_tileADraw:1 = @scanbttml
_tileADraw:6 = @drawbuff.1
_tileADraw:9 = @scanbttmh
_tileDSa:1 = @scanbttml
_tileDSa:4 = @_tileDSc.3
_tileDSa:7 = @_tileDSc.9
_tileDSa:10 = @_tileDSc.15
_tileDSa:13 = @_tileDSc.21
_tileDSa:16 = @_tileDSc.27
_tileDSa:19 = @_tileDSc.33
_tileDSa:22 = @_tileDSc.39
_tileDSa:25 = @_tileDSc.45
_tileDSa:28 = @_tileDSc.51
_tileDSb:1 = @drawbuff.1
_tileDSb:4 = @scanbttmh
_tileDSb:7 = @_tileDSc.4
_tileDSb:13 = @_tileDSc.10
_tileDSb:18 = @_tileDSc.16
_tileDSb:23 = @_tileDSc.22
_tileDSb:28 = @_tileDSc.28
_tileDSb:33 = @_tileDSc.34
_tileDSb:38 = @_tileDSc.40
_tileDSb:43 = @_tileDSc.46
done

View File

@@ -0,0 +1,117 @@
include "inc/cmdsys.plh"
include "inc/fileio.plh"
var dirbuf
//
// Match next section of source and expression
//
def matchNext(src, srcofst, exp, expofst)
if ^exp >= expofst
when exp->[expofst]
is '*' // Multi-char wildcard
if matchNext(src, srcofst, exp, expofst + 1) // Match zero wild chars
return TRUE
elsif ^src >= srcofst and matchNext(src, srcofst + 1, exp, expofst) // Match more wild chars
return TRUE
fin
is '?' // Single char wildcard
if ^src >= srcofst
return matchNext(src, srcofst + 1, exp, expofst + 1)
fin
return FALSE
otherwise // verbatim match
if ^src >= srcofst and src->[srcofst] == exp->[expofst]
return matchNext(src, srcofst + 1, exp, expofst + 1)
fin
return FALSE
wend
fin
return ^src < srcofst and ^exp < expofst // Return TRUE if at the end of both
end
//
// Start off matching process
//
export def matchName(src, exp)#1
//
// Match on empty wildcard name (same as '*')
//
if not ^exp
return TRUE
fin
return matchNext(src, 1, exp, 1)
end
export def matchList(pathstr, exp)#2
byte refnum
char[64] curpath
var firstblk, entrylen, entriesblk, i, entry, entrylist, entryptr, entrycnt
if not dirbuf
dirbuf = heapallocalign(512, 8, 0)
fin
if not ^pathstr
fileio:getpfx(@curpath)
pathstr = @curpath
fin
if pathstr->[^pathstr] <> '/' // Make sure path ends with a '/'
^pathstr++
pathstr->[^pathstr] = '/'
fin
entrylist = 0
entrycnt = 0
firstblk = 1
refnum = fileio:open(pathstr)
while fileio:read(refnum, dirbuf, 512) == 512
//
// Skip block pointers
//
entry = dirbuf + 4
if firstblk
//
// Pull out revelant details from the first block
//
entrylen = dirbuf->$23
entriesblk = dirbuf->$24 - 1
entry = entry + entrylen
fin
for i = firstblk to entriesblk
//
// Copy directory entry details
//
^entry = ^entry & $0F
if ^entry
//
// Match wildcard filename
//
if matchName(entry, exp)
entryptr = heapalloc(t_fileentry)
memcpy(entryptr, entry, t_fileentry)
entrycnt++
if not entrylist
entrylist = entryptr
fin
fin
fin
entry = entry + entrylen
next
firstblk = 0
loop
fileio:close(refnum)
return entrylist, entrycnt
end
//
// Is this a wildcard name?
//
export def isWildName(exp)#1
byte i
if ^exp
for i = 1 to ^exp
if exp->[i] == '*' or exp->[i] == '?'
return TRUE
fin
next
fin
return FALSE
end
done

View File

@@ -270,7 +270,7 @@ CHKSIG: LDY #$05
LDA (TMPTR),Y
CMP #$01
BNE :+
LDY #$0C
INY
TXA ; LOOK FOR MATCHING ID
CMP (TMPTR),Y
BNE :+
@@ -283,7 +283,6 @@ CHKSIG: LDY #$05
LDA TMPTR+1
CMP #$C8
BCC CHKSIG
SEC
RTS
;*

181
src/libsrc/apple/shrlib.pla Normal file
View File

@@ -0,0 +1,181 @@
include "inc/cmdsys.plh"
//
// Apple II hardware constants.
//
const store80dis = $C000
const store80en = $C001
const vidctl = $C029
const showgraphics = $C050
const showtext = $C051
const showfull = $C052
const showmix = $C053
const showpage1 = $C054
const showpage2 = $C055
const showlores = $C056
const showhires = $C057
const show40 = $C00C
const show80 = $C00D
const mapmain = $C000
const mapaux = $C001
const an3on = $C05E
const an3off = $C05F
const ena80 = $C07E
const dis80 = $C07F
const pixbuf = $2000
const scbbuf = $9D00
const palbuf = $9E00
const scb640 = $80 // 640 PIXEL SUPER-HIRES
const scb320 = $00 // 320 PIXEL SUPER-HIRES
word palette = $0000, $0007, $0070, $0077, $0700, $0707, $0770, $0
word = $0CCC, $000F, $00F0, $00FF, $0F00, $0F0F, $0FF0, $0FFF
asm shrInc(buff)
!SOURCE "vmsrc/plvmzp.inc"
GBASL = $26
GBASH = $27
GBASE = GBASL
GCLR = $30
STORE80DIS = $C000
STORE80EN = $C001
MAINWRT = $C004
AUXWRT = $C005
VIDCTL = $C029
SHADOW = $C035
end
//
// This gets copied to $0100!!!
//
asm auxRead
STA $C003 ; READ AUX MEM
LDA (GBASE),Y
STA $C002 ; READ MAIN MEM
RTS
end
//
// Peek byte from SHR memory
//
asm shrPeek(addr)
LDA ESTKL,X
STA GBASL
LDA ESTKH,X
STA GBASH
LDY #$00
STY ESTKH,X
PHP
SEI
LDA SHADOW
AND #$F7
STA SHADOW
JSR $0100
STA ESTKL,X
LDA SHADOW
ORA #$08
STA SHADOW
PLP
RTS
end
//
// Poke byte into SHR memory
//
asm shrPoke(addr, data)#0
LDA ESTKL+1,X
STA GBASL
LDA ESTKH+1,X
STA GBASH
LDY #$00
PHP
SEI
LDA SHADOW
AND #$F7
STA SHADOW
LDA ESTKL+0,X
STA AUXWRT
STA (GBASE),Y
STA MAINWRT
LDA SHADOW
ORA #$08
STA SHADOW
PLP
INX
INX
RTS
end
//
// Fill byte into SHR memory
//
asm shrFill(addr, data, len)#0
LDA ESTKL+2,X
STA GBASL
LDA ESTKH+2,X
STA GBASH
LDY #$00
PHP
SEI
LDA SHADOW
AND #$F7
STA SHADOW
LDA ESTKL+1,X
STA AUXWRT
- STA (GBASE),Y
INY
BNE +
INC GBASH
+ DEC ESTKL+0,X
BNE -
DEC ESTKH+0,X
BNE -
STA MAINWRT
LDA SHADOW
ORA #$08
STA SHADOW
PLP
INX
INX
RTS
end
export def shrPalette(pal, rgbptr)#0
word palptr
byte i
palptr = palbuf + pal * 32
for i = 0 to 31
shrPoke(palptr + i, ^(rgbptr + i))
next
end
export def shrMode(mode)#0
byte row, scb
if mode
//
// Set super hires graphics
//
if mode == 640
scb = scb640
else
scb = scb320
fin
for row = 0 to 199
shrPoke(scbbuf + row, scb)
shrRowPalette(row, palette)
next
^store80dis = 0 // Turn off 80 column mode
^vidctl = ^vidctl | $80 // Turn on SHR mode
return
fin
//
// Set text mode
//
^vidctl = ^vidctl & $7F
^showtext
^showpage1
^ena80 = 0
^show40 = 0
^mapmain = 0
^an3off
call($FC58, 0, 0, 0, 0) // home()
end
// Put read AUX mem routine in scary location
memcpy($0100, @auxRead, 9)
done

View File

@@ -305,7 +305,7 @@ TONELP SBC #$01 ; 2
;+4 = 11 (from BNE above)
+++ BIT $C000 ; 4
BMI TONEXIT ; 2
NOP ; 2
BPL TONELP ; 3
;---
;+9 = 20

View File

@@ -10,7 +10,7 @@ var err, shorterr, shortlen, longerr, longlen
//def nopLin(a, b, c)#0
//end
//def majorline(majorstart, major, majorend, minor, dir, majorspan)#0
//def majorspans(majorstart, major, majorend, minor, dir, majorspan)#0
// //
// // Initial half-span step
// //
@@ -32,7 +32,7 @@ var err, shorterr, shortlen, longerr, longlen
// //
// majorspan(majorstart, majorend, minor)#0
//end
asm majorline(majorstart, major, majorend, minor, dir, majorspan)#0
asm majorspans(majorstart, major, majorend, minor, dir, majorspan)#0
!SOURCE "vmsrc/plvmzp.inc"
LDA $1000 ; ERRL
CLC
@@ -48,7 +48,7 @@ asm majorline(majorstart, major, majorend, minor, dir, majorspan)#0
STA $A001
STA $B001
end
asm _majorlineA
asm _majorspansA
- DEX
DEX
DEX
@@ -82,11 +82,11 @@ asm _majorlineA
ADC #$00
STA ESTKH+5,X ; MAJORSTARTH
end
asm _majorlineB
asm _majorspansB
LDY $1001 ; ERRH
BMI +
end
asm _majorlineC
asm _majorspansC
LDA $1000 ; ERRL
CLC
ADC $2000 ; SHORTERRL
@@ -101,10 +101,14 @@ asm _majorlineC
LDA ESTKH+4,X ; MAJORH
ADC $3001 ; SHORTLENH
STA ESTKH+4,X
BCC ++
LDA ESTKL+4,X ; MAJORL
CMP ESTKL+3,X ; MAJORENDL
LDA ESTKH+4,X ; MAJORH
SBC ESTKH+3,X ; MAJORENDH
BCC -
BCS ++
end
asm _majorlineD
asm _majorspansD
+ LDA $1000 ; ERRL
CLC
ADC $4000 ; LONGERRL
@@ -119,16 +123,15 @@ asm _majorlineD
LDA ESTKH+4,X ; MAJORH
ADC $5001 ; LONGLENH
STA ESTKH+4,X
++ LDA ESTKL+4,X ; MAJORL
LDA ESTKL+4,X ; MAJORL
CMP ESTKL+3,X ; MAJORENDL
LDA ESTKH+4,X ; MAJORH
SBC ESTKH+3,X ; MAJORENDH
BCS +
BCS ++
end
asm _majorlineE
asm _majorspansE
JMP $6000
+ DEX
++ DEX
DEX
DEX
LDA ESTKL+8,X ; MAJORSTARTL
@@ -335,6 +338,52 @@ export def setlinespans(h, v)#0
hspan = h
vspan = v
end
def hmajorspans(x1, y1, x2, y2, dx, dy, sy)#0
var dy2, halflen, rem
//
// Half-span length and error
//
dy2 = dy * 2
halflen, rem = divmod(dx, dy2)
err = dy2 - rem
//
// Long-span length = half-span length * 2
//
longlen = (halflen + 1) * 2
longerr = err * 2
if longerr >= dy2
longerr = longerr - dy2
longlen--
fin
//
// Short-span length = long-span length - 1
//
shortlen = longlen - 1
shorterr = longerr - dy2
majorspans(x1, x1 + halflen, x2, y1, sy, hspan)
end
def vmajorspans(x1, y1, x2, y2, dx, dy, sx)#0
var dx2, halflen, rem
//
// Half-span length and error
//
dx2 = dx * 2
halflen, rem = divmod(dy, dx2)
err = dx2 - rem
//
// Long-span length = half-span length * 2
//
longlen = (halflen + 1) * 2
longerr = err * 2
if longerr >= dx2
longerr = longerr - dx2
longlen--
fin
shortlen = longlen - 1
shorterr = longerr - dx2
majorspans(y1, y1 + halflen, y2, x1, sx, vspan)
end
export def linespans(x1, y1, x2, y2)#0
var dx, dy, dx2, dy2, halflen, rem, sx, sy
@@ -358,29 +407,9 @@ export def linespans(x1, y1, x2, y2)#0
hspan(x1, x2, y1)#0; return
fin
//
// Half-span length and error
// JIT optimize setup
//
dy2 = dy * 2
halflen, rem = divmod(dx, dy2)
err = dy2 - rem
//
// Long-span length = half-span length * 2
//
longlen = (halflen + 1) * 2
longerr = err * 2
if longerr >= dy2
longerr = longerr - dy2
longlen--
fin
//
// Short-span length = long-span length - 1
//
shortlen = longlen - 1
shorterr = longerr - dy2
//
// JIT optimize inner loop
//
majorline(x1, x1 + halflen, x2, y1, sy, hspan)
hmajorspans(x1, y1, x2, y2, dx, dy, sy)
else
if sy < 0
x1, x2 = x2, x1
@@ -391,26 +420,9 @@ export def linespans(x1, y1, x2, y2)#0
vspan(y1, y2, x1)#0; return
fin
//
// Half-span length and error
// JIT optimize inner setup
//
dx2 = dx * 2
halflen, rem = divmod(dy, dx2)
err = dx2 - rem
//
// Long-span length = half-span length * 2
//
longlen = (halflen + 1) * 2
longerr = err * 2
if longerr >= dx2
longerr = longerr - dx2
longlen--
fin
shortlen = longlen - 1
shorterr = longerr - dx2
//
// JIT optimize inner loop
//
majorline(y1, y1 + halflen, y2, x1, sx, vspan)
vmajorspans(x1, y1, x2, y2, dx, dy, sx)
fin
end
export def setlineplot(p)#0
@@ -449,46 +461,46 @@ export def line(x1, y1, x2, y2)#0
//
// Assembly fixups
//
majorline:1 = @err
majorline:5 = @shorterr
majorline:8 = @err
majorline:11 = @err.1
majorline:14 = @shorterr.1
majorline:17 = @err.1
majorline:22 = @_majorlineA.28
majorline:25 = @_majorlineE.31
majorline:30 = @_majorlineA.29
majorline:33 = @_majorlineE.32
_majorlineB:1 = @err.1
_majorlineC:1 = @err
_majorlineC:5 = @shorterr
_majorlineC:8 = @err
_majorlineC:12 = @shorterr.1
_majorlineC:15 = @err.1
_majorlineC:21 = @shortlen
_majorlineC:28 = @shortlen.1
_majorlineD:1 = @err
_majorlineD:5 = @longerr
_majorlineD:8 = @err
_majorlineD:12 = @longerr.1
_majorlineD:15 = @err.1
_majorlineD:21 = @longlen
_majorlineD:28 = @longlen.1
_majorlineE:1 = @_majorlineA
hline:16 = @err
hline:23 = @err.1
_hlineA:1 = @jmpplot
_hlineA:4 = @err.1
_hlineB:6 = @err
_hlineB:9 = @err
_hlineB:13 = @err.1
_hlineB:16 = @err.1
vline:16 = @err
vline:23 = @err.1
_vlineA:1 = @jmpplot
_vlineA:4 = @err.1
_vlineB:6 = @err
_vlineB:9 = @err
_vlineB:13 = @err.1
_vlineB:16 = @err.1
majorspans:1 = @err
majorspans:5 = @shorterr
majorspans:8 = @err
majorspans:11 = @err.1
majorspans:14 = @shorterr.1
majorspans:17 = @err.1
majorspans:22 = @_majorspansA.28
majorspans:25 = @_majorspansE.31
majorspans:30 = @_majorspansA.29
majorspans:33 = @_majorspansE.32
_majorspansB:1 = @err.1
_majorspansC:1 = @err
_majorspansC:5 = @shorterr
_majorspansC:8 = @err
_majorspansC:12 = @shorterr.1
_majorspansC:15 = @err.1
_majorspansC:21 = @shortlen
_majorspansC:28 = @shortlen.1
_majorspansD:1 = @err
_majorspansD:5 = @longerr
_majorspansD:8 = @err
_majorspansD:12 = @longerr.1
_majorspansD:15 = @err.1
_majorspansD:21 = @longlen
_majorspansD:28 = @longlen.1
_majorspansE:1 = @_majorspansA
hline:16 = @err
hline:23 = @err.1
_hlineA:1 = @jmpplot
_hlineA:4 = @err.1
_hlineB:6 = @err
_hlineB:9 = @err
_hlineB:13 = @err.1
_hlineB:16 = @err.1
vline:16 = @err
vline:23 = @err.1
_vlineA:1 = @jmpplot
_vlineA:4 = @err.1
_vlineB:6 = @err
_vlineB:9 = @err
_vlineB:13 = @err.1
_vlineB:16 = @err.1
done

View File

@@ -15,6 +15,7 @@ CMDJIT = rel/apple/CMD128\#061000
PLVMZP_C64 = vmsrc/c64/plvmzp.inc
PLVMC64 = rel/c64/PLASMA
ED = rel/ED\#FE1000
ZIPCHIP = rel/apple/ZIPCHIP\#FE1000
JIT = rel/apple/JIT\#FE1000
JIT16 = rel/apple/JIT16\#FE1000
JITUNE = rel/apple/JITUNE\#FE1000
@@ -29,6 +30,7 @@ TYPE = rel/apple/TYPE\#FE1000
SIEVE = rel/SIEVE\#FE1000
PRIMEGAP = rel/PRIMEGAP\#FE1000
ARGS = rel/ARGS\#FE1000
MATCHFILES = rel/apple/MATCHFILES\#FE1000
SPIPORT = rel/apple/SPIPORT\#FE1000
SDFAT = rel/apple/SDFAT\#FE1000
FATCAT = rel/apple/FATCAT\#FE1000
@@ -61,8 +63,12 @@ HGRLIB = rel/apple/HGRLIB\#FE1000
GRLIB = rel/apple/GRLIB\#FE1000
DGRLIB = rel/apple/DGRLIB\#FE1000
HGRSPRITE = rel/apple/HGRSPRITE\#FE1000
HGRTILE = rel/apple/HGRTILE\#FE1000
HGRFONT = rel/apple/HGRFONT\#FE1000
LINES = rel/LINES\#FE1000
GRAFIX = rel/apple/GRAFIX\#FE1000
SFM = rel/apple/SFM\#FE1000
SFMSPRT = rel/apple/SFMSPRT\#FE1000
GFXDEMO = rel/apple/GFXDEMO\#FE1000
JOYBUZZ = rel/apple/JOYBUZZ\#FE1000
PORTIO = rel/apple/PORTIO\#FE1000
@@ -70,6 +76,7 @@ ROGUE = rel/ROGUE\#FE1000
ROGUEMAP = rel/ROGUEMAP\#FE1000
ROGUECOMBAT= rel/ROGUECOMBAT\#FE1000
MON = rel/apple/MON\#FE1000
TILETEST = rel/apple/TILETEST\#FE1000
HGRTEST = rel/apple/HGRTEST\#FE1000
GRTEST = rel/apple/GRTEST\#FE1000
DGRTEST = rel/apple/DGRTEST\#FE1000
@@ -102,7 +109,7 @@ TXTTYPE = .TXT
#SYSTYPE = \#FF2000
#TXTTYPE = \#040000
apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT17) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ)
apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ZIPCHIP) $(MATCHFILES) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ)
-rm vmsrc/plvmzp.inc
@@ -224,6 +231,10 @@ $(ED): toolsrc/ed.pla $(PLVM02) $(PLASM) toolsrc/ed.pla
./$(PLASM) -AMOW < toolsrc/ed.pla > toolsrc/ed.a
acme --setpc 4094 -o $(ED) toolsrc/ed.a
$(MATCHFILES): libsrc/apple/matchfiles.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/apple/matchfiles.pla > libsrc/apple/matchfiles.a
acme --setpc 4094 -o $(MATCHFILES) libsrc/apple/matchfiles.a
$(ARGS): libsrc/args.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/args.pla > libsrc/args.a
acme --setpc 4094 -o $(ARGS) libsrc/args.a
@@ -252,6 +263,14 @@ $(LONGJMP): libsrc/longjmp.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/longjmp.pla > libsrc/longjmp.a
acme --setpc 4094 -o $(LONGJMP) libsrc/longjmp.a
$(SFM): samplesrc/sfm.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/sfm.pla > samplesrc/sfm.a
acme --setpc 4094 -o $(SFM) samplesrc/sfm.a
$(SFMSPRT): samplesrc/sfmsprt.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/sfmsprt.pla > samplesrc/sfmsprt.a
acme --setpc 4094 -o $(SFMSPRT) samplesrc/sfmsprt.a
$(ROGUE): samplesrc/rogue.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/rogue.pla > samplesrc/rogue.a
acme --setpc 4094 -o $(ROGUE) samplesrc/rogue.a
@@ -428,47 +447,59 @@ $(DGRLIB): libsrc/apple/dgrlib.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/apple/dgrlib.pla > libsrc/apple/dgrlib.a
acme --setpc 4094 -o $(DGRLIB) libsrc/apple/dgrlib.a
$(TILETEST): samplesrc/tiletest.pla $(PLASM)
./$(PLASM) -AMOW < samplesrc/tiletest.pla > samplesrc/tiletest.a
acme --setpc 4094 -o $(TILETEST) samplesrc/tiletest.a
$(HGRTILE): libsrc/apple/hgrtile.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/apple/hgrtile.pla > libsrc/apple/hgrtile.a
acme --setpc 4094 -o $(HGRTILE) libsrc/apple/hgrtile.a
$(HGRFONT): libsrc/apple/hgrfont.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/apple/hgrfont.pla > libsrc/apple/hgrfont.a
acme --setpc 4094 -o $(HGRFONT) libsrc/apple/hgrfont.a
$(HGRSPRITE): libsrc/apple/hgrsprite.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < libsrc/apple/hgrsprite.pla > libsrc/apple/hgrsprite.a
acme --setpc 4094 -o $(HGRSPRITE) libsrc/apple/hgrsprite.a
$(HGRTEST): samplesrc/hgrtest.pla $(PLVM02) $(PLASM)
$(HGRTEST): samplesrc/hgrtest.pla $(HGRLIB) $(PLASM)
./$(PLASM) -AMOW < samplesrc/hgrtest.pla > samplesrc/hgrtest.a
acme --setpc 4094 -o $(HGRTEST) samplesrc/hgrtest.a
$(GRTEST): samplesrc/grtest.pla $(PLVM02) $(PLASM)
$(GRTEST): samplesrc/grtest.pla $(GRLIB) $(PLASM)
./$(PLASM) -AMOW < samplesrc/grtest.pla > samplesrc/grtest.a
acme --setpc 4094 -o $(GRTEST) samplesrc/grtest.a
$(DGRTEST): samplesrc/dgrtest.pla $(PLVM02) $(PLASM)
$(DGRTEST): samplesrc/dgrtest.pla $(DGRLIB) $(PLASM)
./$(PLASM) -AMOW < samplesrc/dgrtest.pla > samplesrc/dgrtest.a
acme --setpc 4094 -o $(DGRTEST) samplesrc/dgrtest.a
$(MON): utilsrc/apple/mon.pla $(PLVM02) $(PLASM)
$(MON): utilsrc/apple/mon.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/mon.pla > utilsrc/apple/mon.a
acme --setpc 4094 -o $(MON) utilsrc/apple/mon.a
$(COPY): utilsrc/apple/copy.pla $(PLVM03) $(PLASM)
$(COPY): utilsrc/apple/copy.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/copy.pla > utilsrc/apple/copy.a
acme --setpc 4094 -o $(COPY) utilsrc/apple/copy.a
$(DEL): utilsrc/apple/del.pla $(PLVM03) $(PLASM)
$(DEL): utilsrc/apple/del.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/del.pla > utilsrc/apple/del.a
acme --setpc 4094 -o $(DEL) utilsrc/apple/del.a
$(REN): utilsrc/apple/ren.pla $(PLVM03) $(PLASM)
$(REN): utilsrc/apple/ren.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/ren.pla > utilsrc/apple/ren.a
acme --setpc 4094 -o $(REN) utilsrc/apple/ren.a
$(CAT): utilsrc/apple/cat.pla $(PLVM03) $(PLASM)
$(CAT): utilsrc/apple/cat.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/cat.pla > utilsrc/apple/cat.a
acme --setpc 4094 -o $(CAT) utilsrc/apple/cat.a
$(NEWDIR): utilsrc/apple/newdir.pla $(PLVM03) $(PLASM)
$(NEWDIR): utilsrc/apple/newdir.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/newdir.pla > utilsrc/apple/newdir.a
acme --setpc 4094 -o $(NEWDIR) utilsrc/apple/newdir.a
$(TYPE): utilsrc/apple/type.pla $(PLVM03) $(PLASM)
$(TYPE): utilsrc/apple/type.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/type.pla > utilsrc/apple/type.a
acme --setpc 4094 -o $(TYPE) utilsrc/apple/type.a
@@ -476,6 +507,10 @@ $(SOS): utilsrc/apple/sos.pla $(PLVM03) $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/sos.pla > utilsrc/apple/sos.a
acme --setpc 4094 -o $(SOS) utilsrc/apple/sos.a
$(ZIPCHIP): utilsrc/apple/zipchip.pla $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/zipchip.pla > utilsrc/apple/zipchip.a
acme --setpc 4094 -o $(ZIPCHIP) utilsrc/apple/zipchip.a
$(JIT): libsrc/apple/jit.pla libsrc/jitcore.pla $(PLVMJIT) $(PLASM)
./$(PLASM) -AMOW < libsrc/apple/jit.pla > libsrc/apple/jit.a
acme --setpc 4094 -o $(JIT) libsrc/apple/jit.a

View File

@@ -10,6 +10,8 @@ mkdir prodos/sys
cp rel/apple/FILEIO#FE1000 prodos/sys/FILEIO.REL
cp rel/apple/CONIO#FE1000 prodos/sys/CONIO.REL
cp rel/LINES#FE1000 prodos/sys/LINES.REL
cp rel/apple/HGRFONT#FE1000 prodos/sys/HGRFONT.REL
cp rel/apple/HGRTILE#FE1000 prodos/sys/HGRTILE.REL
cp rel/apple/HGRSPRITE#FE1000 prodos/sys/HGRSPRITE.REL
cp rel/apple/HGRLIB#FE1000 prodos/sys/HGRLIB.REL
cp rel/apple/GRLIB#FE1000 prodos/sys/GRLIB.REL
@@ -20,6 +22,7 @@ cp rel/apple/REN#FE1000 prodos/sys/REN.REL
cp rel/apple/CAT#FE1000 prodos/sys/CAT.REL
cp rel/apple/NEWDIR#FE1000 prodos/sys/NEWDIR.REL
cp rel/apple/TYPE#FE1000 prodos/sys/TYPE.REL
cp rel/apple/MATCHFILES#FE1000 prodos/sys/MATCHFILES.REL
cp rel/ARGS#FE1000 prodos/sys/ARGS.REL
cp rel/ED#FE1000 prodos/sys/ED.REL
cp rel/FIBER#FE1000 prodos/sys/FIBER.REL
@@ -37,6 +40,7 @@ cp rel/apple/SNDSEQ#FE1000 prodos/sys/SNDSEQ.REL
cp rel/apple/JIT#FE1000 prodos/sys/JIT.REL
cp rel/apple/JIT16#FE1000 prodos/sys/JIT16.REL
cp rel/apple/JITUNE#FE1000 prodos/sys/JITUNE.REL
cp rel/apple/ZIPCHIP#FE1000 prodos/sys/ZIPCHIP.REL
cp rel/LZ4#FE1000 prodos/sys/LZ4.REL
cp rel/TFTPD#FE1000 prodos/sys/TFTPD.REL
cp rel/INT32#FE1000 prodos/sys/INT32.REL
@@ -69,10 +73,6 @@ cp ../sysfiles/ELEMS.CODE#060000 prodos/fpsos/sys/ELEMS.CODE.BIN
rm -rf prodos/demos
mkdir prodos/demos
cp rel/INT32TEST#FE1000 prodos/demos/INT32TEST.REL
cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL
cp rel/apple/GRTEST#FE1000 prodos/demos/GRTEST.REL
cp rel/apple/DGRTEST#FE1000 prodos/demos/DGRTEST.REL
cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL
cp rel/apple/ROD#FE1000 prodos/demos/ROD.REL
cp rel/RPNCALC#FE1000 prodos/demos/RPNCALC.REL
cp rel/LZ4CAT#FE1000 prodos/demos/LZ4CAT.REL
@@ -85,27 +85,37 @@ cp rel/ROGUEMAP#FE1000 prodos/demos/rogue/ROGUEMAP.REL
cp samplesrc/LEVEL0#040000 prodos/demos/rogue/LEVEL0.TXT
cp samplesrc/LEVEL1#040000 prodos/demos/rogue/LEVEL1.TXT
mkdir prodos/demos/sdutils
cp rel/apple/SPIPORT#FE1000 prodos/demos/sdutils/SPIPORT.REL
cp rel/apple/SDFAT#FE1000 prodos/demos/sdutils/SDFAT.REL
cp rel/apple/FATCAT#FE1000 prodos/demos/sdutils/FATCAT.REL
cp rel/apple/FATGET#FE1000 prodos/demos/sdutils/FATGET.REL
cp rel/apple/FATPUT#FE1000 prodos/demos/sdutils/FATPUT.REL
cp rel/apple/FATREADDSK#FE1000 prodos/demos/sdutils/FATREADDSK.REL
cp rel/apple/FATWRITEDSK#FE1000 prodos/demos/sdutils/FATWRITEDSK.REL
mkdir prodos/demos/apple3
cp rel/apple/GFXDEMO#FE1000 prodos/demos/apple3/GFXDEMO.REL
cp samplesrc/APPLE3.PIX#060000 prodos/demos/apple3/APPLE3.PIX.BIN
mkdir prodos/demos/music
cp rel/apple/PLAYSEQ#FE1000 prodos/demos/music/PLAYSEQ.REL
cp mockingboard/ultima3.seq prodos/demos/music/ULTIMA3.SEQ.BIN
cp mockingboard/startrek.seq prodos/demos/music/STARTREK.SEQ.BIN
mkdir prodos/demos/net
cp rel/HTTPD#FE1000 prodos/demos/net/HTTPD.REL
cp samplesrc/index.html prodos/demos/net/INDEX.HTML.TXT
mkdir prodos/demos/music
cp rel/apple/PLAYSEQ#FE1000 prodos/demos/music/PLAYSEQ.REL
cp mockingboard/ultima3.seq prodos/demos/music/ULTIMA3.SEQ.BIN
cp mockingboard/startrek.seq prodos/demos/music/STARTREK.SEQ.BIN
mkdir prodos/demos/apple2
cp rel/apple/TILETEST#FE1000 prodos/demos/apple2/TILETEST.REL
cp rel/apple/HGRTEST#FE1000 prodos/demos/apple2/HGRTEST.REL
cp rel/apple/GRTEST#FE1000 prodos/demos/apple2/GRTEST.REL
cp rel/apple/DGRTEST#FE1000 prodos/demos/apple2/DGRTEST.REL
mkdir prodos/demos/apple2/spiders
cp rel/apple/SFM#FE1000 prodos/demos/apple2/spiders/SFM.REL
cp rel/apple/SFMSPRT#FE1000 prodos/demos/apple2/spiders/SFMSPRT.REL
mkdir prodos/demos/apple2/sdutils
cp rel/apple/SPIPORT#FE1000 prodos/demos/apple2/sdutils/SPIPORT.REL
cp rel/apple/SDFAT#FE1000 prodos/demos/apple2/sdutils/SDFAT.REL
cp rel/apple/FATCAT#FE1000 prodos/demos/apple2/sdutils/FATCAT.REL
cp rel/apple/FATGET#FE1000 prodos/demos/apple2/sdutils/FATGET.REL
cp rel/apple/FATPUT#FE1000 prodos/demos/apple2/sdutils/FATPUT.REL
cp rel/apple/FATREADDSK#FE1000 prodos/demos/apple2/sdutils/FATREADDSK.REL
cp rel/apple/FATWRITEDSK#FE1000 prodos/demos/apple2/sdutils/FATWRITEDSK.REL
mkdir prodos/demos/apple3
cp rel/apple/GFXDEMO#FE1000 prodos/demos/apple3/GFXDEMO.REL
cp samplesrc/APPLE3.PIX#060000 prodos/demos/apple3/APPLE3.PIX.BIN
rm -rf prodos/bld
mkdir prodos/bld
@@ -118,6 +128,7 @@ cp samplesrc/int32test.pla prodos/bld/samples/INT32TEST.PLA.TXT
cp samplesrc/grtest.pla prodos/bld/samples/GRTEST.PLA.TXT
cp samplesrc/dgrtest.pla prodos/bld/samples/DGRTEST.PLA.TXT
cp samplesrc/hgrtest.pla prodos/bld/samples/HGRTEST.PLA.TXT
cp samplesrc/tiletest.pla prodos/bld/samples/TILETEST.PLA.TXT
cp samplesrc/fibertest.pla prodos/bld/samples/FIBERTEST.PLA.TXT
cp samplesrc/mousetest.pla prodos/bld/samples/MOUSETEST.PLA.TXT
cp samplesrc/memtest.pla prodos/bld/samples/MEMTEST.PLA.TXT
@@ -130,6 +141,10 @@ cp samplesrc/rpncalc.pla prodos/bld/samples/RPNCALC.PLA.TXT
cp samplesrc/fatcat.pla prodos/bld/samples/FATCAT.PLA.TXT
cp samplesrc/gfxdemo.pla prodos/bld/samples/GFXDEMO.PLA.TXT
cp samplesrc/lz4cat.pla prodos/bld/samples/Z4CAT.PLA.TXT
cp samplesrc/sfm.pla prodos/bld/samples/SFM.PLA.TXT
cp samplesrc/sfmsprt.pla prodos/bld/samples/SFMSPRT.PLA.TXT
cp utilsrc/apple/mon.pla prodos/bld/samples/MON.PLA.TXT
cp utilsrc/apple/zipchip.pla prodos/bld/samples/ZIPCHIP.PLA.TXT
#mkdir prodos/bld/examples
#cp samplesrc/examples/ex.1.pla prodos/bld/examples/EX.1.PLA.TXT
@@ -152,9 +167,12 @@ cp samplesrc/lz4cat.pla prodos/bld/samples/Z4CAT.PLA.TXT
mkdir prodos/bld/inc
cp inc/args.plh prodos/bld/inc/ARGS.PLH.TXT
cp inc/matchfiles.plh prodos/bld/inc/MATCHFILES.PLH.TXT
cp inc/cmdsys.plh prodos/bld/inc/CMDSYS.PLH.TXT
cp inc/conio.plh prodos/bld/inc/CONIO.PLH.TXT
cp inc/lines.plh prodos/bld/inc/LINES.PLH.TXT
cp inc/hgrfont.plh prodos/bld/inc/HGRFONT.PLH.TXT
cp inc/hgrtile.plh prodos/bld/inc/HGRTILE.PLH.TXT
cp inc/hgrsprite.plh prodos/bld/inc/HGRSPRITE.PLH.TXT
cp inc/hgrlib.plh prodos/bld/inc/HGRLIB.PLH.TXT
cp inc/grlib.plh prodos/bld/inc/GRLIB.PLH.TXT

View File

@@ -24,7 +24,7 @@ def dgrTest#0
byte b, l, k
word i, j, ii, ij
b = dgrMode()
b = dgrMode(TRUE)
dgrDrawBuf(0)
for k = 15 downto 0
dgrClear(k)
@@ -59,7 +59,7 @@ def dgrTest#0
fin
loop
^$C010
txtMode
dgrMode(FALSE)
end
dgrTest

View File

@@ -24,7 +24,7 @@ def grTest#0
byte b, l, k
word i, j, ii, ij
b = grMode()
b = grMode(TRUE)
grDrawBuf(0)
for k = 15 downto 0
grClear(k)
@@ -59,7 +59,7 @@ def grTest#0
fin
loop
^$C010
txtMode
grMode(FALSE)
end
grTest

View File

@@ -15,7 +15,6 @@ byte = $83, $31, $11, $13, $38
byte = $88, $33, $11, $33, $88
byte = $88, $83, $33, $38, $88
var sprtBall
def testline#0
var i
@@ -42,6 +41,7 @@ def testblt(sprtnum)#0
jj[0] = -1
if sprtnum
for k = 1 to sprtnum
spriteAdd(k, spriteDup(sprtBall))
i[k] = ((i[k - 1] ^ 37) + 97) % 270
ii[k] = -ii[k - 1]
j[k] = ((j[k - 1] ^ 29) + 53) % 180
@@ -65,7 +65,7 @@ def testblt(sprtnum)#0
loop
end
hgrMode
hgrMode(TRUE)
spriteDrawBuf(hgrDrawBuf(0)) // So we can see the compile process
sprtBall = spriteCompile(10, 10, 5, 5, @ball)
hgrColor(0)
@@ -74,22 +74,7 @@ testline
memcpy($4000, $2000, $2000) // Copy to both buffers
spriteDrawBuf(hgrDrawBuf(1))
spriteAdd(0, sprtBall)
spriteAdd(1, spriteDup(sprtBall))
spriteAdd(2, spriteDup(sprtBall))
spriteAdd(3, spriteDup(sprtBall))
spriteAdd(4, spriteDup(sprtBall))
spriteAdd(5, spriteDup(sprtBall))
spriteAdd(6, spriteDup(sprtBall))
spriteAdd(7, spriteDup(sprtBall))
spriteAdd(8, spriteDup(sprtBall))
spriteAdd(9, spriteDup(sprtBall))
spriteAdd(10, spriteDup(sprtBall))
spriteAdd(11, spriteDup(sprtBall))
spriteAdd(12, spriteDup(sprtBall))
spriteAdd(13, spriteDup(sprtBall))
spriteAdd(14, spriteDup(sprtBall))
spriteAdd(15, spriteDup(sprtBall))
testblt(16)
getc
txtMode
hgrMode(FALSE)
done

View File

@@ -402,7 +402,7 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
// Update distance
//
occluded = 1
dist = dist + 1
dist = dist + 1
fin
next
break
@@ -419,12 +419,12 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if adjtile & OPAQUE_TILE
^(viewmap + imap - mapcols) = adjtile | VIEWED_TILE
screen.[ycentr-xbeam[l]-1, xcentr+ybeam[l]] = adjtile
fin
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr-xbeam[l], xcentr+ybeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -437,24 +437,24 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
occluded = 0
fin
if tile & LIT_TILE
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr-xbeam[l], xcentr+ybeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
dist = dist + 1
fin
next
break
is 2
for l = 1 to dbeam[lightdist]
@@ -464,17 +464,17 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
adjtile = ^(map + imap + mapcols) & INV_TILE
vispix[l] = 1
adjtile = ^(map + imap + mapcols) & INV_TILE
if adjtile & OPAQUE_TILE
^(viewmap + imap + mapcols) = adjtile | VIEWED_TILE
screen.[ycentr+xbeam[l]+1, xcentr+ybeam[l]] = adjtile
fin
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr+xbeam[l], xcentr+ybeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -486,25 +486,25 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr+xbeam[l], xcentr+ybeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
dist = dist + 1
fin
next
break
is 3
for l = 1 to dbeam[lightdist]
@@ -514,17 +514,17 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
adjtile = ^(map + imap + 1) & INV_TILE
vispix[l] = 1
adjtile = ^(map + imap + 1) & INV_TILE
if adjtile & OPAQUE_TILE
^(viewmap + imap + 1) = adjtile | VIEWED_TILE
screen.[ycentr+ybeam[l], xcentr+xbeam[l]+1] = adjtile
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr+ybeam[l], xcentr+xbeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -536,25 +536,25 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr+ybeam[l], xcentr+xbeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
dist = dist + 1
fin
next
break
is 4
for l = 1 to dbeam[lightdist]
@@ -564,17 +564,17 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
adjtile = ^(map + imap - 1) & INV_TILE
vispix[l] = 1
adjtile = ^(map + imap - 1) & INV_TILE
if adjtile & OPAQUE_TILE
^(viewmap + imap - 1) = adjtile | VIEWED_TILE
screen.[ycentr+ybeam[l], xcentr-xbeam[l]-1] = adjtile
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr+ybeam[l], xcentr-xbeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -586,25 +586,25 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr+ybeam[l], xcentr-xbeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
dist = dist + 1
fin
next
break
is 5
for l = 1 to dbeam[lightdist]
@@ -614,17 +614,17 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
adjtile = ^(map + imap + mapcols) & INV_TILE
vispix[l] = 1
adjtile = ^(map + imap + mapcols) & INV_TILE
if adjtile & OPAQUE_TILE
^(viewmap + imap + mapcols) = adjtile | VIEWED_TILE
screen.[ycentr+xbeam[l]+1, xcentr-ybeam[l]] = adjtile
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr+xbeam[l], xcentr-ybeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -636,26 +636,26 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr+xbeam[l], xcentr-ybeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
break
dist = dist + 1
fin
next
break
is 6
for l = 1 to dbeam[lightdist]
if vispix[vbeam[l]]
@@ -664,17 +664,17 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
adjtile = ^(map + imap - mapcols) & INV_TILE
vispix[l] = 1
adjtile = ^(map + imap - mapcols) & INV_TILE
if adjtile & OPAQUE_TILE
^(viewmap + imap - mapcols) = adjtile | VIEWED_TILE
screen.[ycentr-xbeam[l]-1, xcentr-ybeam[l]] = adjtile
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr-xbeam[l], xcentr-ybeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -686,25 +686,25 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr-xbeam[l], xcentr-ybeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
dist = dist + 1
fin
next
break
is 7
for l = 1 to dbeam[lightdist]
@@ -714,17 +714,17 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
adjtile = ^(map + imap - 1) & INV_TILE
vispix[l] = 1
adjtile = ^(map + imap - 1) & INV_TILE
if adjtile & OPAQUE_TILE
^(viewmap + imap - 1) = adjtile | VIEWED_TILE
screen.[ycentr-ybeam[l], xcentr-xbeam[l]-1] = adjtile
fin
fin
^(viewmap + imap) = tile | VIEWED_TILE
if tile <> PIT_TILE
if tile <> PIT_TILE
screen.[ycentr-ybeam[l], xcentr-xbeam[l]] = tile & INV_TILE
fin
fin
else
vispix[l] = 0
fin
@@ -736,25 +736,25 @@ export def drawmap(xorg, yorg, viewfield, viewdir, lightdist, viewdist)
if tile & OPAQUE_TILE
vispix[l] = 0
else
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
vispix[l] = 1
occluded = 0
fin
if tile & LIT_TILE
^(viewmap + imap) = tile | VIEWED_TILE
screen.[ycentr-ybeam[l], xcentr-xbeam[l]] = tile & INV_TILE
darkness = 0
fin
fin
else
vispix[l] = 0
fin
if l == dbeam[dist]
if occluded
break
fin
if l == dbeam[dist]
if occluded
break
fin
occluded = 1
dist = dist + 1
fin
next
dist = dist + 1
fin
next
break
wend
next

View File

@@ -535,47 +535,47 @@ def play
is KEY_TILE
player.key = 1
updtmaptile(player.xpos, player.ypos, FLOOR_TILE)
gotit
break
gotit
break
is RAFT_TILE
player.raft = 1
updtmaptile(player.xpos, player.ypos, FLOOR_TILE)
gotit
break
gotit
break
is GOLD_TILE
player.gold = player.gold + 1
updtmaptile(player.xpos, player.ypos, FLOOR_TILE)
gotit
gotit
break
is TORCH_TILE
if player.oil < 1000
if player.oil < 1000
player:oil = player:oil + TORCH_OIL
if player:oil > 1000
player:oil = 1000
fin
if player:oil > 1000
player:oil = 1000
fin
setmaptile(player.xpos, player.ypos, FLOOR_TILE)
for yt = player.ypos - 1 to player.ypos + 1
for xt = player.xpos - 1 to player.xpos + 1
setmaptile(xt, yt, getmaptile(xt, yt) & MAP_TILE)
next
next
gotit
fin
for xt = player.xpos - 1 to player.xpos + 1
setmaptile(xt, yt, getmaptile(xt, yt) & MAP_TILE)
next
next
gotit
fin
break
is FOOD_TILE
if player.health < 100 or player.energy < 100
if player.health < 100 or player.energy < 100
player.health = player.health + MANA/2
if player.health > 100
player.health = 100
fin
if player.health > 100
player.health = 100
fin
player.energy = player.energy + MANA
if player.energy > 100
player.energy = 100
fin
updtmaptile(player.xpos, player.ypos, FLOOR_TILE)
player.fov = 1
gotit
fin
if player.energy > 100
player.energy = 100
fin
updtmaptile(player.xpos, player.ypos, FLOOR_TILE)
player.fov = 1
gotit
fin
break
wend
break

637
src/samplesrc/sfm.pla Normal file
View File

@@ -0,0 +1,637 @@
//
// Ziggy Stardust and the Spiders from Mars
//
include "inc/cmdsys.plh"
include "inc/hgrlib.plh"
include "inc/hgrsprite.plh"
include "inc/joybuzz.plh"
sysflags reshgr1 // Reserve HGR page 1
const NUMSTARS = 32
const SHIP_SPRTNUM = 0
const MISSLE_SPRTNUM = 1
const WEB_SPRTBASE = 2
const SPIDER_SPRTEBASE = 8
const LASER_RECHARGE = 20
const MISSLE_RELOAD = 10
const ATTACK_SPEED = 12
const SWARM_LIMIT = 52
const FASTMOVE_LIMIT = 120
const WEB_LIMIT = 152
const YSHIP = 180
const LASER_BUZZ = 20
const ATTACK_BUZZ = 5
const WEB1_BUZZ = 10
const WEB2_BUZZ = 12
const WEB3_BUZZ = 14
const SPLAT_BUZZ = 40
var sprtEgg1, sprtEgg2, sprtEgg3, sprtEgg
var sprtSpider1, sprtSpider2, sprtSpider3, sprtSpider
var sprtSplat1, sprtSplat2
var sprtWeb1, sprtWeb2, sprtWeb3
var sprtShip, sprtMissle, sprtDummy, heapstart
var[NUMSTARS] xstar
byte[NUMSTARS] ystar
byte curstar, buzz
//
// Apple II speaker tone generator routine
//
//asm spkrTone(pitch, duration)#0
byte _spkrTone[]
byte = $86, $E5 // STX ESP
byte = $B4, $C0 // LDY ESTKH,X
byte = $B5, $D0 // LDA ESTKL,X
byte = $F0, $01 // BEQ +1
byte = $C8 // INY
byte = $85, $08 // STA DSTL
byte = $84, $09 // STY DSTH
byte = $B4, $C1 // LDY ESTKL+1,X
byte = $B5, $D1 // LDA ESTKL+1,X
byte = $F0, $01 // BEQ +1
byte = $C8 // INY
byte = $85, $E7 // STA TMPL
byte = $84, $E8 // STY TMPH
byte = $AA // TAX
byte = $A9, $FF // LDA #$FF
byte = $08 // PHP
byte = $78 // SEI
byte = $EA // NOP
byte = $EA // NOP
byte = $B0, $00 // BCS +0
byte = $38 // SEC
byte = $CA // DEX
byte = $D0, $18 // BNE +18
byte = $88 // DEY
byte = $D0, $17 // BNE +17
byte = $2C, $30, $C0 // BIT $C030
byte = $A6, $E7 // LDX TMPL
byte = $A4, $E8 // LDY TMPH
byte = $E9, $01 // SBC #$01
byte = $B0, $EA // BCS -EA
byte = $C6, $08 // DEC DSTL
byte = $D0, $EA // BNE -EA
byte = $C6, $09 // DEC DSTH
byte = $D0, $E6 // BNE -E6
byte = $F0, $07 // BEQ +8
byte = $EA // NOP
byte = $EA // NOP
byte = $EA, $EA // BIT $C000 (nope)
byte = $EA // NOP
byte = $D0, $EB // BNE -EA
byte = $28 // PLP
byte = $A6, $E5 // LDX ESP
byte = $E8 // INX
byte = $E8 // INX
byte = $60 // RTS
def game(spdrcnt)#1
var[8] xspdr, yspdr, ixspdr, iyspdr, hatch
var xship, xmissle, leftxlaser, rightxlaser, attack
byte[8] life, death
byte lasercharging, missleloading, misslecnt, ymissle
byte leftylaser, rightylaser, lefthit, righthit, sprtnum[], width
byte spdrnum, k, xdelta, ydelta, btn0, btn1, webstate
xship = 140
ymissle = 255 // Not active value
misslecnt = 6
missleloading = FALSE
lasercharging = FALSE
//
// Initialize the spiders (first is special)
//
xspdr[0] = 100
ixspdr[0] = 1
yspdr[0] = 60
iyspdr[0] = -1
hatch[0] = 1
life[0] = 3
death[0] = 0
attack = -1
webstate = 0
//
// Initialize spiders
//
spdrnum = spdrcnt - 1
for k = 1 to spdrnum
spriteAdd(k + SPIDER_SPRTEBASE, spriteDup(sprtEgg3))
xspdr[k] = ((xspdr[k - 1] ^ 37) + 97) & 255
ixspdr[k] = -ixspdr[k - 1]
yspdr[k] = ((yspdr[k - 1] ^ 29) + 53) & 63
iyspdr[k] = -iyspdr[k - 1]
hatch[k] = k / 2 + 1//hatch[k - 1] + 1
life[k] = 3
death[k] = 0
next
//
// Initialize missle display
//
hgrColor(3)
hgrRect(0, YSHIP+3, 279, 191)
for k = 0 to misslecnt-1
spritePos(k * 16 + 160, 184, sprtMissle)
spriteDrawXor(sprtMissle)
next
hgrColor(1)
hgrRect(4, YSHIP+6, LASER_RECHARGE * 4 + 4, 188)
//
// Main game loop
//
repeat
//
// Move living spiders
//
for k = 0 to spdrnum
if life[k]
yspdr[k] = yspdr[k] + iyspdr[k]
if yspdr[k] < -5
//
// Above screen
//
iyspdr[k] = 1
if hatch[k]
hatch[k]--
if hatch[k] == 0
//
// Hatch this egg into a spider
//
life[k] = 3 // Reset life
spriteAdd(k + SPIDER_SPRTEBASE, spriteDup(sprtSpider3))
fin
fin
fin
if yspdr[k] > SWARM_LIMIT
//
// Attack or not?
//
if hatch[k] == 0 and attack < 0
attack = k
iyspdr[k] = ATTACK_SPEED
fin
if attack == k
//
// Attacking
//
if yspdr[k] > WEB_LIMIT
//
// Iterate through web sequence
//
when webstate
is 10
iyspdr[k] = -8 // Retreat
yspdr[k] = WEB_LIMIT
spriteDel(2)
spriteDel(3)
spriteDel(4)
webstate = 0
break
is 0
iyspdr[k] = 0
spriteAdd(2, sprtWeb1)
spritePosIndex(xspdr[k], WEB_LIMIT+7, 2)
buzz = WEB1_BUZZ
webstate = 1
break
is 1
spriteAdd(3, sprtWeb2)
spritePosIndex(xspdr[k], WEB_LIMIT+15, 3)
buzz = WEB2_BUZZ
webstate = 2
break
is 2
spriteAdd(4, sprtWeb3)
spritePosIndex(xspdr[k], WEB_LIMIT+22, 4)
webstate = 3
otherwise
//
// States 3..9 just repeat this
//
if xship >= xspdr[k] - 17 and xship <= xspdr[k] + 17
//
// Capture ship
//
return FALSE
fin
buzz = WEB3_BUZZ
webstate++
wend
else
if iyspdr[k] > 0
//
// Move towards player during attack, but not too fast
//
xdelta = yspdr[k] > FASTMOVE_LIMIT ?? 2 :: 4
xspdr[k] = xspdr[k] + (xship - xspdr[k]) / xdelta
buzz = ATTACK_BUZZ
else
//
// Retreat at a progressively faster rate
//
if ixspdr[k] > 0
xspdr[k] = xspdr[k] + (WEB_LIMIT - yspdr[k]) / 8
else
xspdr[k] = xspdr[k] - (WEB_LIMIT - yspdr[k]) / 8
fin
fin
fin
else
//
// Just reverse direction towards top of screen
//
iyspdr[k] = -1
fin
else
if attack == k
//
// Retreated back to swarm zone so stop attack
//
attack = -1
iyspdr[k] = -1
fin
//
// Swarm movement
//
if ixspdr[k] > 0
xspdr[k] = xspdr[k] + yspdr[k] / 8
else
xspdr[k] = xspdr[k] - yspdr[k] / 8
fin
if xspdr[k] < -5 or xspdr[k] > 284
if xspdr[k] < -5
xspdr[k] = -5
ixspdr[k] = 1
else
xspdr[k] = 284
ixspdr[k] = -1
fin
fin
fin
spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE)
elsif death[k]
//
// Splat sequence
//
death[k]--
if death[k]
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtSplat2))
spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE)
else
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtDummy))
spritePosIndex(0, 0, k+SPIDER_SPRTEBASE)
spdrcnt--
if not spdrcnt
return TRUE
fin
buzz = SPLAT_BUZZ
fin
fin
next
//
// Move ship
//
xdelta, ydelta, btn0, btn1 = joypos(buzz)
buzz = spdrcnt * 4
xship = xship + ((xdelta + 4) / 8 - 5)
if xship < 0; xship = 0; fin
if xship > 279; xship = 279; fin
spritePosIndex(xship, YSHIP, SHIP_SPRTNUM)
//
// Missle
//
if misslecnt and missleloading
missleloading--
fin
if btn1 and not missleloading and ymissle == 255
//
// Fire missle
//
xmissle = xship
ymissle = YSHIP-15
missleloading = MISSLE_RELOAD
misslecnt--
spritePos(misslecnt * 16 + 160, 184, sprtMissle) // Erase from armory
spriteDrawXor(sprtMissle)
spriteAdd(1, sprtMissle)
fin
if ymissle <> 255
if ymissle < 8
//
// Missle off top of screen
//
spriteDel(1)
ymissle = 255
else
ymissle = ymissle - 8
spritePosIndex(xmissle, ymissle, MISSLE_SPRTNUM)
for k = 0 to spdrnum
if life[k]
//
// Hit test will all living spiders
//
if ymissle >= yspdr[k] - 15 and ymissle <= yspdr[k] + 5
if hatch[k]
width = 7 // Egg width
else
width = 10 // Spider width
fin
if xmissle >= xspdr[k] - width and xmissle <= xspdr[k] + width
//
// Hit & kill spider
//
life[k] = 0
death[k] = 2
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtSplat1))
spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE)
if attack == k // Was it attacking?
attack = -1
spriteDel(2)
spriteDel(3)
spriteDel(4)
webstate = 0
fin
//
// Remove missle
//
spriteDel(MISSLE_SPRTNUM)
ymissle = 255
fin
fin
fin
next
buzz = ymissle/4
fin
fin
//
// Update sprites
//
spriteDrawXorList()
//
// Lasers
//
if lasercharging
lasercharging--
hgrColor(1)
hgrRect(81 - lasercharging*4, YSHIP+6, 84 - lasercharging*4, 188)
fin
if btn0 and not lasercharging
//
// Fire laser
//
hgrColor(0)
hgrRect(4, YSHIP+6, LASER_RECHARGE * 4 + 4, 188)
lasercharging = LASER_RECHARGE
leftxlaser = xship - 7
rightxlaser = xship + 7
leftylaser = 0
rightylaser = 0
lefthit = 255
righthit = 255
for k = 0 to spdrnum
if life[k]
//
// Hit test will all living spiders
//
if hatch[k]
width = 7 // Egg width
else
width = 10 // Spider width
fin
if leftxlaser >= xspdr[k]-width and leftxlaser <= xspdr[k]+width
if yspdr[k] + 5 > leftylaser
lefthit = k
leftylaser = yspdr[k] + 5
fin
fin
if rightxlaser >= xspdr[k]-width and rightxlaser <= xspdr[k]+width
if yspdr[k] + 5 > rightylaser
righthit = k
rightylaser = yspdr[k] + 5
fin
fin
fin
next
//
// Draw Laser beams
//
hgrColor(3)
if leftxlaser >= 0
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser)
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+1)
fin
if rightxlaser < 280
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser)
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-1)
fin
buzz = LASER_BUZZ
(@_spkrTone)(15, 1)#0
if lefthit <> 255
sprtnum = lefthit + SPIDER_SPRTEBASE
//
// Hit
//
life[lefthit]--
if not life[lefthit]
//
// Kill spider
//
death[lefthit] = 2
spriteAdd(sprtnum, spriteDup(sprtSplat1))
spritePosIndex(xspdr[lefthit], yspdr[lefthit], sprtnum)
if attack == lefthit // Was it attacking?
spriteDel(2)
spriteDel(3)
spriteDel(4)
webstate = 0
attack = -1
fin
else
//
// Dim color to show life status
//
if hatch[lefthit]
sprtEgg = life[lefthit] == 2 ?? sprtEgg2 :: sprtEgg1
spriteAdd(sprtnum, spriteDup(sprtEgg))
else
sprtSpider = life[lefthit] == 2 ?? sprtSpider2 :: sprtSpider1
spriteAdd(sprtnum, spriteDup(sprtSpider))
fin
spritePosIndex(xspdr[lefthit], yspdr[lefthit], sprtnum)
fin
fin
if righthit <> 255 and life[righthit]
sprtnum = righthit + SPIDER_SPRTEBASE
//
// Hit
//
life[righthit]--
if not life[righthit]
//
// Kill spider
//
death[righthit] = 2
spriteAdd(sprtnum, spriteDup(sprtSplat1))
spritePosIndex(xspdr[righthit], yspdr[righthit], sprtnum)
if attack == righthit // Was it attacking?
spriteDel(2)
spriteDel(3)
spriteDel(4)
webstate = 0
attack = -1
fin
else
//
// Dim color to show life status
//
if hatch[righthit]
sprtEgg = life[righthit] == 2 ?? sprtEgg2 :: sprtEgg1
spriteAdd(sprtnum, spriteDup(sprtEgg))
else
sprtSpider = life[righthit] == 2 ?? sprtSpider2 :: sprtSpider1
spriteAdd(sprtnum, spriteDup(sprtSpider))
fin
spritePosIndex(xspdr[righthit], yspdr[righthit], sprtnum)
fin
fin
//
// Undraw lasers
//
hgrColor(3)
if leftxlaser >= 0
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser)
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+1)
fin
if rightxlaser < 280
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser)
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-1)
fin
fin
//
// Update stars
//
hgrColor(3)
hgrXorPlot(xstar[curstar], ystar[curstar])
ystar[curstar]++
if ystar[curstar] > YSHIP
ystar[curstar] = 0
fin
hgrXorPlot(xstar[curstar], ystar[curstar])
curstar++
if curstar >= NUMSTARS; curstar = 0; fin
until ^$C000 == $9B // ESCape key pressed
getc
return FALSE
end
//
// Initialization
//
puts("Loading");
putc('.')
sprtShip = spriteRead("SHIP")
if not sprtShip
cmdsys:modexec("SFMSPRT")
sprtShip = spriteRead("SHIP")
if not sprtShip
puts("\nError: Unable to compile sprites.\n")
return -1
fin
fin
putc('.')
sprtMissle = spriteRead("MISSLE")
putc('.')
sprtEgg3 = spriteRead("EGG3")
putc('.')
sprtEgg2 = spriteRead("EGG2")
putc('.')
sprtEgg1 = spriteRead("EGG1")
putc('.')
sprtSpider3= spriteRead("SPIDER3")
putc('.')
sprtSpider2= spriteRead("SPIDER2")
putc('.')
sprtSpider1= spriteRead("SPIDER1")
putc('.')
sprtWeb1 = spriteRead("WEB1")
putc('.')
sprtWeb2 = spriteRead("WEB2")
putc('.')
sprtWeb3 = spriteRead("WEB3")
putc('.')
sprtSplat1 = spriteRead("SPLAT1")
putc('.')
sprtSplat2 = spriteRead("SPLAT2")
putc('.')
sprtDummy = spriteRead("DUMMY")
//
// Heat up JIT compiler
//
for curstar = 0 to 50
putc('.')
spriteAdd(0, sprtDummy)
spritePosIndex(0, 0, 0)
spriteDrawXorList()
next
heapstart = heapmark()
//puts("\nBeginning available memory: "); puti(heapavail()); putln
repeat
hgrMode(TRUE)
spriteDrawBuf(hgrDrawBuf(0)) // Single buffered
spriteAdd(SHIP_SPRTNUM, sprtShip)
spriteAdd(SPIDER_SPRTEBASE, sprtEgg3)
//
// Init stars
//
xstar[0] = 99
ystar[0] = 10
hgrColor(3)
hgrXorPlot(xstar[0], ystar[0])
for curstar = 1 to NUMSTARS-1
xstar[curstar] = (xstar[curstar - 1] + 97 - curstar) % 280
ystar[curstar] = (ystar[curstar - 1] + 19 + curstar) % YSHIP
hgrXorPlot(xstar[curstar], ystar[curstar])
next
curstar = 0
if game(8)
//
// Won
//
spriteDrawXorList()
(@_spkrTone)(100, 20)#0
(@_spkrTone)(75, 20)#0
(@_spkrTone)(15, 20)#0
(@_spkrTone)(25, 100)#0
puts("\nZiggy Stardust has saved Earth!\n")
else
//
// Lost
//
spriteDrawXorList()
(@_spkrTone)(100, 50)#0
spriteDrawXor(sprtShip)
(@_spkrTone)(150, 50)#0
spriteDrawXor(sprtShip)
(@_spkrTone)(100, 50)#0
spriteDrawXor(sprtShip)
(@_spkrTone)(150, 50)#0
puts("\nEarth has been overrun")
puts("\nby the Spiders from Mars\n")
fin
hgrMode(FALSE)
//
// Clear sprite lists
//
for curstar = 0 to 15
spriteDel(curstar)
next
spriteDrawXorList()
spriteDrawXorList()
//
// Reset heap
//
heaprelease(heapstart)
//puts("\nAvailable memory: "); puti(heapavail()); putln
puts("Play again (Y/N)?")
until toupper(getc) <> 'Y'
putln
done

203
src/samplesrc/sfmsprt.pla Normal file
View File

@@ -0,0 +1,203 @@
include "inc/cmdsys.plh"
include "inc/hgrlib.plh"
include "inc/hgrsprite.plh"
sysflags reshgr1 // Reserve HGR page 1
byte egg3 = $88,$88,$83,$33,$38,$88,$88
byte = $88,$83,$33,$11,$33,$38,$88
byte = $83,$31,$11,$11,$11,$13,$38
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $83,$31,$11,$11,$11,$13,$38
byte = $88,$83,$33,$11,$33,$38,$88
byte = $88,$88,$83,$33,$38,$88,$88
byte egg2 = $88,$88,$83,$33,$38,$88,$88
byte = $88,$83,$33,$11,$33,$38,$88
byte = $83,$30,$11,$00,$11,$13,$38
byte = $33,$11,$00,$11,$00,$11,$33
byte = $33,$00,$11,$00,$11,$00,$33
byte = $33,$11,$00,$11,$00,$11,$33
byte = $33,$00,$11,$00,$11,$00,$33
byte = $33,$11,$00,$11,$00,$11,$33
byte = $33,$00,$11,$00,$11,$00,$33
byte = $83,$31,$00,$11,$00,$13,$38
byte = $88,$83,$33,$00,$33,$38,$88
byte = $88,$88,$83,$33,$38,$88,$88
byte egg1 = $88,$88,$83,$33,$38,$88,$88
byte = $88,$83,$33,$00,$33,$38,$88
byte = $83,$30,$00,$00,$00,$03,$38
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $83,$30,$00,$00,$00,$03,$38
byte = $88,$83,$33,$11,$33,$38,$88
byte = $88,$88,$83,$33,$38,$88,$88
byte spider3 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33
byte = $33,$88,$83,$32,$22,$22,$23,$38,$88,$33
byte = $83,$38,$83,$32,$22,$22,$23,$38,$83,$38
byte = $88,$83,$33,$22,$22,$22,$22,$33,$38,$88
byte = $33,$88,$33,$22,$22,$22,$22,$33,$88,$33
byte = $88,$33,$38,$33,$22,$22,$33,$83,$33,$88
byte = $88,$88,$83,$33,$22,$22,$33,$38,$88,$88
byte = $88,$33,$33,$33,$22,$22,$33,$33,$33,$88
byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33
byte = $88,$88,$33,$33,$22,$22,$33,$33,$88,$88
byte = $88,$33,$88,$33,$22,$22,$33,$88,$33,$88
byte = $33,$88,$88,$83,$32,$23,$38,$88,$88,$33
byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88
byte spider2 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33
byte = $33,$88,$83,$30,$02,$20,$03,$38,$88,$33
byte = $83,$38,$83,$32,$20,$02,$23,$38,$83,$38
byte = $88,$83,$33,$20,$02,$20,$02,$33,$38,$88
byte = $33,$88,$33,$02,$20,$02,$20,$33,$88,$33
byte = $88,$33,$38,$30,$02,$20,$03,$83,$33,$88
byte = $88,$88,$83,$33,$20,$02,$33,$38,$88,$88
byte = $88,$33,$33,$30,$02,$20,$03,$33,$33,$88
byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33
byte = $88,$88,$33,$30,$02,$20,$03,$33,$88,$88
byte = $88,$33,$88,$33,$20,$02,$33,$88,$33,$88
byte = $33,$88,$88,$83,$32,$23,$38,$88,$88,$33
byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88
byte spider1 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33
byte = $33,$88,$83,$30,$00,$00,$03,$38,$88,$33
byte = $83,$38,$83,$30,$00,$00,$03,$38,$83,$38
byte = $88,$83,$33,$00,$00,$00,$00,$33,$38,$88
byte = $33,$88,$33,$00,$00,$00,$00,$33,$88,$33
byte = $88,$33,$38,$33,$00,$00,$33,$83,$33,$88
byte = $88,$88,$83,$33,$00,$00,$33,$38,$88,$88
byte = $88,$33,$33,$30,$00,$00,$03,$33,$33,$88
byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33
byte = $88,$88,$33,$30,$00,$00,$03,$33,$88,$88
byte = $88,$33,$88,$33,$00,$00,$33,$88,$33,$88
byte = $33,$88,$88,$83,$30,$03,$38,$88,$88,$33
byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88
byte web1 = $88,$83,$38,$88
byte = $88,$38,$83,$88
byte = $88,$38,$83,$88
byte = $88,$33,$33,$88
byte = $83,$38,$83,$38
byte = $83,$38,$83,$38
byte = $83,$38,$83,$38
byte = $33,$33,$33,$33
byte web2 = $88,$33,$83,$38,$33,$88
byte = $88,$38,$83,$38,$83,$88
byte = $83,$38,$83,$38,$83,$38
byte = $83,$33,$33,$33,$33,$38
byte = $83,$38,$83,$38,$83,$38
byte = $83,$38,$83,$38,$83,$38
byte = $33,$88,$83,$38,$88,$33
byte = $33,$33,$33,$33,$33,$33
byte web3 = $88,$83,$38,$83,$38,$83,$38,$83,$38,$88
byte = $88,$83,$38,$83,$38,$83,$38,$83,$38,$88
byte = $88,$33,$88,$33,$88,$88,$33,$88,$33,$88
byte = $88,$33,$33,$33,$33,$33,$33,$33,$33,$88
byte = $83,$38,$88,$33,$83,$38,$33,$88,$83,$38
byte = $83,$38,$83,$38,$83,$38,$83,$38,$83,$38
byte = $33,$88,$83,$38,$83,$38,$83,$38,$88,$33
byte = $33,$38,$33,$33,$33,$33,$33,$33,$33,$33
byte splat1 = $88,$88,$88,$22,$22,$22,$22,$88,$88,$88
byte = $88,$88,$88,$22,$11,$11,$22,$88,$88,$88
byte = $88,$88,$88,$22,$11,$11,$22,$88,$88,$88
byte = $88,$82,$22,$11,$11,$11,$11,$22,$28,$88
byte = $22,$22,$22,$11,$11,$11,$11,$22,$22,$22
byte = $88,$22,$28,$22,$11,$11,$22,$82,$22,$88
byte = $88,$88,$82,$22,$11,$11,$22,$28,$88,$88
byte = $88,$22,$22,$22,$11,$11,$22,$22,$22,$88
byte = $22,$22,$88,$88,$22,$22,$88,$88,$22,$22
byte = $88,$88,$22,$22,$11,$11,$22,$22,$88,$88
byte = $88,$22,$22,$22,$11,$11,$22,$22,$22,$88
byte = $22,$22,$88,$82,$21,$12,$28,$88,$22,$22
byte = $88,$88,$88,$88,$22,$22,$88,$88,$88,$88
byte splat2 = $88,$88,$88,$88,$22,$22,$22,$22,$88,$88,$88,$88
byte = $88,$88,$88,$88,$22,$11,$11,$22,$88,$88,$88,$88
byte = $88,$88,$88,$82,$22,$11,$11,$22,$88,$88,$88,$88
byte = $88,$88,$88,$22,$11,$11,$11,$11,$22,$88,$88,$88
byte = $88,$88,$82,$22,$11,$18,$81,$11,$22,$28,$88,$88
byte = $88,$22,$22,$22,$11,$88,$88,$11,$22,$22,$22,$88
byte = $22,$28,$82,$22,$11,$88,$88,$11,$22,$28,$82,$22
byte = $88,$88,$22,$28,$88,$88,$88,$88,$82,$22,$88,$88
byte = $88,$88,$88,$22,$88,$88,$88,$11,$22,$88,$88,$88
byte = $88,$88,$22,$22,$11,$88,$88,$11,$22,$22,$88,$88
byte = $88,$22,$22,$22,$11,$18,$81,$11,$22,$22,$22,$88
byte = $88,$88,$88,$22,$11,$18,$81,$11,$22,$88,$88,$88
byte = $88,$88,$22,$22,$11,$11,$11,$11,$22,$22,$88,$88
byte = $88,$22,$22,$88,$22,$11,$11,$22,$88,$22,$22,$88
byte = $22,$28,$88,$88,$88,$22,$22,$88,$88,$88,$82,$22
byte = $88,$88,$22,$22,$22,$11,$11,$22,$22,$22,$88,$88
byte = $88,$88,$22,$28,$22,$11,$11,$22,$82,$22,$88,$88
byte ship = $CC,$CC,$CC,$77,$CC,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $77,$CC,$77,$66,$77,$CC,$77
byte = $77,$CC,$77,$66,$77,$CC,$77
byte = $77,$CC,$77,$66,$77,$CC,$77
byte = $77,$CC,$77,$77,$77,$CC,$77
byte = $77,$CC,$77,$77,$77,$CC,$77
byte = $77,$CC,$77,$77,$77,$CC,$77
byte = $77,$C7,$77,$77,$77,$7C,$77
byte = $77,$77,$75,$55,$57,$77,$77
byte = $77,$77,$75,$55,$57,$77,$77
byte missle = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $C5,$55,$5C
byte = $55,$55,$55
byte dummy = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
var sprtEgg1, sprtEgg2, sprtEgg3
var sprtSpider1, sprtSpider2, sprtSpider3
var sprtSplat1, sprtSplat2
var sprtWeb1, sprtWeb2, sprtWeb3
var sprtShip, sprtMissle, sprtDummy
hgrMode(TRUE)
spriteDrawBuf(hgrDrawBuf(0)) // So we can see the compile process
sprtShip = spriteCompile(14, 14, 7, 13, @ship)
sprtMissle = spriteCompile( 6, 8, 3, 0, @missle)
sprtEgg3 = spriteCompile(14, 12, 7, 6, @egg3)
sprtEgg2 = spriteCompile(14, 12, 7, 6, @egg2)
sprtEgg1 = spriteCompile(14, 12, 7, 6, @egg1)
sprtSpider3= spriteCompile(20, 13, 10, 6, @spider3)
sprtSpider2= spriteCompile(20, 13, 10, 6, @spider2)
sprtSpider1= spriteCompile(20, 13, 10, 6, @spider1)
sprtWeb1 = spriteCompile( 8, 8, 4, 0, @web1)
sprtWeb2 = spriteCompile(12, 8, 6, 0, @web2)
sprtWeb3 = spriteCompile(20, 8, 10, 0, @web3)
sprtSplat1 = spriteCompile(20, 13, 10, 6, @splat1)
sprtSplat2 = spriteCompile(24, 17, 12, 8, @splat2)
sprtDummy = spriteCompile( 7, 8, 0, 0, @dummy)
hgrMode(FALSE)
spriteSave("SHIP", sprtShip)
spriteSave("MISSLE", sprtMissle)
spriteSave("EGG3", sprtEgg3)
spriteSave("EGG2", sprtEgg2)
spriteSave("EGG1", sprtEgg1)
spriteSave("SPIDER1", sprtSpider1)
spriteSave("SPIDER2", sprtSpider2)
spriteSave("SPIDER3", sprtSpider3)
spriteSave("WEB1", sprtWeb1)
spriteSave("WEB2", sprtWeb2)
spriteSave("WEB3", sprtWeb3)
spriteSave("SPLAT1", sprtSplat1)
spriteSave("SPLAT2", sprtSplat2)
spriteSave("DUMMY", sprtDummy)
done

View File

@@ -0,0 +1,13 @@
include "inc/cmdsys.plh"
include "inc/hgrtile.plh"
include "inc/hgrfont.plh"
sysflags reshgr1 // Reserve HGR page 1
tileMode(TRUE)
hgrPutStr(5, 1, "Hello HiRes Tile Demo")
getc
tileFromText(0, @hgrFont)
getc
tileMode(FALSE)
done

View File

@@ -6,9 +6,12 @@ echo "BLD/CODEOPT"; atftp $1 --put -l rel/CODEOPT#FE1000 -r $2/BLD/CODEOPT#FE10
#Build incs
echo "BLD/INC/ARGS.PLH"; atftp $1 --put -l inc/args.plh -r $2/BLD/INC/ARGS.PLH#040000
echo "BLD/INC/MATCHFILES.PLH"; atftp $1 --put -l inc/matchfiles.plh -r $2/BLD/INC/MATCHFILES.PLH#040000
echo "BLD/INC/CMDSYS.PLH"; atftp $1 --put -l inc/cmdsys.plh -r $2/BLD/INC/CMDSYS.PLH#040000
echo "BLD/INC/CONIO.PLH"; atftp $1 --put -l inc/conio.plh -r $2/BLD/INC/CONIO.PLH#040000
echo "BLD/INC/LINES.PLH"; atftp $1 --put -l inc/lines.plh -r $2/BLD/INC/LINES.PLH#040000
echo "BLD/INC/HGRTILE.PLH"; atftp $1 --put -l inc/hgrtile.plh -r $2/BLD/INC/HGRTILE.PLH#040000
echo "BLD/INC/HGRFONT.PLH";atftp $1 --put -l inc/hgrfont.plh -r $2/BLD/INC/HGRFONT.PLH#040000
echo "BLD/INC/HGRSPRITE.PLH";atftp $1 --put -l inc/hgrsprite.plh -r $2/BLD/INC/HGRSPRITE.PLH#040000
echo "BLD/INC/HGRLIB.PLH"; atftp $1 --put -l inc/hgrlib.plh -r $2/BLD/INC/HGRLIB.PLH#040000
echo "BLD/INC/GRLIB.PLH"; atftp $1 --put -l inc/grlib.plh -r $2/BLD/INC/GRLIB.PLH#040000
@@ -43,32 +46,16 @@ echo "BLD/SAMPLES/INT32TEST.PLA"; atftp $1 --put -l samplesrc/int32test.pla -r $
echo "BLD/SAMPLES/HGRTEST.PLA"; atftp $1 --put -l samplesrc/hgrtest.pla -r $2/BLD/SAMPLES/HGRTEST.PLA#040000
echo "BLD/SAMPLES/GRTEST.PLA"; atftp $1 --put -l samplesrc/grtest.pla -r $2/BLD/SAMPLES/GRTEST.PLA#040000
echo "BLD/SAMPLES/DGRTEST.PLA"; atftp $1 --put -l samplesrc/dgrtest.pla -r $2/BLD/SAMPLES/DGRTEST.PLA#040000
echo "BLD/SAMPLES/TILETEST.PLA"; atftp $1 --put -l samplesrc/tiletest.pla -r $2/BLD/SAMPLES/TILETEST.PLA#040000
echo "BLD/SAMPLES/HGRTEST.PLA"; atftp $1 --put -l samplesrc/hgrtest.pla -r $2/BLD/SAMPLES/HGRTEST.PLA#040000
echo "BLD/SAMPLES/PLAYSEQ.PLA"; atftp $1 --put -l samplesrc/playseq.pla -r $2/BLD/SAMPLES/PLAYSEQ.PLA#040000
echo "BLD/SAMPLES/RPNCALC.PLA"; atftp $1 --put -l samplesrc/rpncalc.pla -r $2/BLD/SAMPLES/RPNCALC.PLA#040000
echo "BLD/SAMPLES/SIEVE.PLA"; atftp $1 --put -l samplesrc/sieve.pla -r $2/BLD/SAMPLES/SIEVE.PLA#040000
echo "BLD/SAMPLES/MON.PLA"; atftp $1 --put -l utilsrc/apple/mon.pla -r $2/BLD/SAMPLES/MON.PLA#040000
echo "BLD/SAMPLES/MEMTEST.PLA"; atftp $1 --put -l samplesrc/memtest.pla -r $2/BLD/SAMPLES/MEMTEST.PLA#040000
echo "BLD/SAMPLES/FATCAT.PLA"; atftp $1 --put -l samplesrc/fatcat.pla -r $2/BLD/SAMPLES/FATCAT.PLA#040000
echo "BLD/SAMPLES/GFXDEMO.PLA"; atftp $1 --put -l samplesrc/gfxdemo.pla -r $2/BLD/SAMPLES/GFXDEMO.PLA#040000
echo "BLD/SAMPLES/LZ4CAT.PLA"; atftp $1 --put -l samplesrc/lz4cat.pla -r $2/BLD/SAMPLES/LZ4CAT.PLA#040000
# Examples from video series
echo "BLD/EXAMPLES/EX.1.PLA"; atftp $1 --put -l samplesrc/examples/ex.1.pla -r $2/BLD/EXAMPLES/EX.1.PLA#040000
echo "BLD/EXAMPLES/EX.2.PLA"; atftp $1 --put -l samplesrc/examples/ex.2.pla -r $2/BLD/EXAMPLES/EX.2.PLA#040000
echo "BLD/EXAMPLES/EX.3.PLA"; atftp $1 --put -l samplesrc/examples/ex.3.pla -r $2/BLD/EXAMPLES/EX.3.PLA#040000
echo "BLD/EXAMPLES/EX.4.PLA"; atftp $1 --put -l samplesrc/examples/ex.4.pla -r $2/BLD/EXAMPLES/EX.4.PLA#040000
echo "BLD/EXAMPLES/EX.5.PLA"; atftp $1 --put -l samplesrc/examples/ex.5.pla -r $2/BLD/EXAMPLES/EX.5.PLA#040000
echo "BLD/EXAMPLES/EX.6.PLA"; atftp $1 --put -l samplesrc/examples/ex.6.pla -r $2/BLD/EXAMPLES/EX.6.PLA#040000
echo "BLD/EXAMPLES/EX.7.PLA"; atftp $1 --put -l samplesrc/examples/ex.7.pla -r $2/BLD/EXAMPLES/EX.7.PLA#040000
echo "BLD/EXAMPLES/EX.8.PLA"; atftp $1 --put -l samplesrc/examples/ex.8.pla -r $2/BLD/EXAMPLES/EX.8.PLA#040000
echo "BLD/EXAMPLES/EX.9.PLA"; atftp $1 --put -l samplesrc/examples/ex.9.pla -r $2/BLD/EXAMPLES/EX.9.PLA#040000
echo "BLD/EXAMPLES/EX.10.PLA"; atftp $1 --put -l samplesrc/examples/ex.10.pla -r $2/BLD/EXAMPLES/EX.10.PLA#040000
echo "BLD/EXAMPLES/EX.11.PLA"; atftp $1 --put -l samplesrc/examples/ex.11.pla -r $2/BLD/EXAMPLES/EX.11.PLA#040000
echo "BLD/EXAMPLES/EX.12.PLA"; atftp $1 --put -l samplesrc/examples/ex.12.pla -r $2/BLD/EXAMPLES/EX.12.PLA#040000
echo "BLD/EXAMPLES/EX.13.PLA"; atftp $1 --put -l samplesrc/examples/ex.13.pla -r $2/BLD/EXAMPLES/EX.13.PLA#040000
echo "BLD/EXAMPLES/EX.14.PLA"; atftp $1 --put -l samplesrc/examples/ex.14.pla -r $2/BLD/EXAMPLES/EX.14.PLA#040000
echo "BLD/EXAMPLES/EX.15.PLA"; atftp $1 --put -l samplesrc/examples/ex.15.pla -r $2/BLD/EXAMPLES/EX.15.PLA#040000
echo "BLD/EXAMPLES/EX.16.PLA"; atftp $1 --put -l samplesrc/examples/ex.16.pla -r $2/BLD/EXAMPLES/EX.16.PLA#040000
echo "BLD/EXAMPLES/EX.17.PLA"; atftp $1 --put -l samplesrc/examples/ex.17.pla -r $2/BLD/EXAMPLES/EX.17.PLA#040000
echo "BLD/SAMPLES/SFM.PLA"; atftp $1 --put -l samplesrc/sfm.pla -r $2/BLD/SAMPLES/SFM.PLA#040000
echo "BLD/SAMPLES/SFMSPRT.PLA"; atftp $1 --put -l samplesrc/sfmsprt.pla -r $2/BLD/SAMPLES/SFMSPRT.PLA#040000
echo "BLD/SAMPLES/MON.PLA"; atftp $1 --put -l utilsrc/apple/mon.pla -r $2/BLD/SAMPLES/MON.PLA#040000

View File

@@ -5,15 +5,13 @@ echo "DEMOS/RPNCALC"; atftp $1 --put -l rel/RPNCALC#FE1000
echo "DEMOS/LZ4CAT"; atftp $1 --put -l rel/LZ4CAT#FE1000 -r $2/DEMOS/LZ4CAT#FE1000
echo "DEMOS/SIEVE"; atftp $1 --put -l rel/SIEVE#FE1000 -r $2/DEMOS/SIEVE#FE1000
echo "DEMOS/ROD"; atftp $1 --put -l rel/apple/ROD#FE1000 -r $2/DEMOS/ROD#FE1000
echo "DEMOS/HGRTEST"; atftp $1 --put -l rel/apple/HGRTEST#FE1000 -r $2/DEMOS/HGRTEST#FE1000
echo "DEMOS/GRTEST"; atftp $1 --put -l rel/apple/GRTEST#FE1000 -r $2/DEMOS/GRTEST#FE1000
echo "DEMOS/INT32TEST"; atftp $1 --put -l rel/INT32TEST#FE1000 -r $2/DEMOS/INT32TEST#FE1000
echo "DEMOS/DGRTEST"; atftp $1 --put -l rel/apple/DGRTEST#FE1000 -r $2/DEMOS/DGRTEST#FE1000
# Music demo
echo "DEMOS/MUSIC/PLAYSEQ"; atftp $1 --put -l rel/apple/PLAYSEQ#FE1000 -r $2/DEMOS/MUSIC/PLAYSEQ#FE1000
atftp $1 --put -l mockingboard/ultima3.seq -r $2/DEMOS/MUSIC/ULTIMA3.SEQ#060000
atftp $1 --put -l mockingboard/startrek.seq -r $2/DEMOS/MUSIC/STARTREK.SEQ#060000
# Rogue demo
echo "DEMOS/ROGUE/ROGUE"; atftp $1 --put -l rel/ROGUE#FE1000 -r $2/DEMOS/ROGUE/ROGUE#FE1000
echo "DEMOS/ROGUE/ROGUEMAP"; atftp $1 --put -l rel/ROGUEMAP#FE1000 -r $2/DEMOS/ROGUE/ROGUEMAP#FE1000
@@ -21,15 +19,26 @@ echo "DEMOS/ROGUE/ROGUECOMBAT"; atftp $1 --put -l rel/ROGUECOMBAT#FE1000
atftp $1 --put -l samplesrc/LEVEL0#040000 -r $2/DEMOS/ROGUE/LEVEL0#040000
atftp $1 --put -l samplesrc/LEVEL1#040000 -r $2/DEMOS/ROGUE/LEVEL1#040000
# Arduino+SD card demos
echo "DEMOS/SDUTILS/SPIPORT"; atftp $1 --put -l rel/apple/SPIPORT#FE1000 -r $2/DEMOS/SDUTILS/SPIPORT#FE1000
echo "DEMOS/SDUTILS/SDFAT"; atftp $1 --put -l rel/apple/SDFAT#FE1000 -r $2/DEMOS/SDUTILS/SDFAT#FE1000
echo "DEMOS/SDUTILS/FATCAT"; atftp $1 --put -l rel/apple/FATCAT#FE1000 -r $2/DEMOS/SDUTILS/FATCAT#FE1000
echo "DEMOS/SDUTILS/FATGET"; atftp $1 --put -l rel/apple/FATGET#FE1000 -r $2/DEMOS/SDUTILS/FATGET#FE1000
echo "DEMOS/SDUTILS/FATPUT"; atftp $1 --put -l rel/apple/FATPUT#FE1000 -r $2/DEMOS/SDUTILS/FATPUT#FE1000
echo "DEMOS/SDUTILS/FATREADDSK"; atftp $1 --put -l rel/apple/FATREADDSK#FE1000 -r $2/DEMOS/SDUTILS/FATREADDSK#FE1000
echo "DEMOS/SDUTILS/FATWRITEDSK"; atftp $1 --put -l rel/apple/FATWRITEDSK#FE1000 -r $2/DEMOS/SDUTILS/FATWRITEDSK#FE1000
# Net demos
echo "DEMOS/NET/HTTPD"; atftp $1 --put -l rel/HTTPD#FE1000 -r $2/DEMOS/NET/HTTPD#FE1000
atftp $1 --put -l samplesrc/index.html -r $2/DEMOS/NET/INDEX.HTML#040000
# Apple 2 demos
echo "DEMOS/APPLE2/TILETEST"; atftp $1 --put -l rel/apple/TILETEST#FE1000 -r $2/DEMOS/APPLE2/TILETEST#FE1000
echo "DEMOS/APPLE2/HGRTEST"; atftp $1 --put -l rel/apple/HGRTEST#FE1000 -r $2/DEMOS/APPLE2/HGRTEST#FE1000
echo "DEMOS/APPLE2/GRTEST"; atftp $1 --put -l rel/apple/GRTEST#FE1000 -r $2/DEMOS/APPLE2/GRTEST#FE1000
echo "DEMOS/APPLE2/DGRTEST"; atftp $1 --put -l rel/apple/DGRTEST#FE1000 -r $2/DEMOS/APPLE2/DGRTEST#FE1000
# Spiders from Mars
echo "DEMOS/APPLE2/SPIDERS/SFM"; atftp $1 --put -l rel/apple/SFM#FE1000 -r $2/DEMOS/APPLE2/SPIDERS/SFM#FE1000
echo "DEMOS/APPLE2/SPIDERS/SFMSPRT"; atftp $1 --put -l rel/apple/SFMSPRT#FE1000 -r $2/DEMOS/APPLE2/SPIDERS/SFMSPRT#FE1000
# Arduino+SD card demos
echo "DEMOS/APPLE2/SDUTILS/SPIPORT"; atftp $1 --put -l rel/apple/SPIPORT#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/SPIPORT#FE1000
echo "DEMOS/APPLE2/SDUTILS/SDFAT"; atftp $1 --put -l rel/apple/SDFAT#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/SDFAT#FE1000
echo "DEMOS/APPLE2/SDUTILS/FATCAT"; atftp $1 --put -l rel/apple/FATCAT#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/FATCAT#FE1000
echo "DEMOS/APPLE2/SDUTILS/FATGET"; atftp $1 --put -l rel/apple/FATGET#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/FATGET#FE1000
echo "DEMOS/APPLE2/SDUTILS/FATPUT"; atftp $1 --put -l rel/apple/FATPUT#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/FATPUT#FE1000
echo "DEMOS/APPLE2/SDUTILS/FATREADDSK"; atftp $1 --put -l rel/apple/FATREADDSK#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/FATREADDSK#FE1000
echo "DEMOS/APPLE2/SDUTILS/FATWRITEDSK"; atftp $1 --put -l rel/apple/FATWRITEDSK#FE1000 -r $2/DEMOS/APPLE2/SDUTILS/FATWRITEDSK#FE1000

View File

@@ -11,6 +11,7 @@ echo "SYS/JIT16"; atftp $1 --put -l rel/apple/JIT16#FE1000 -r $2/SYS/JIT16#F
echo "SYS/JITUNE"; atftp $1 --put -l rel/apple/JITUNE#FE1000 -r $2/SYS/JITUNE#FE1000
# Core libraries
echo "SYS/MATCHFILES"; atftp $1 --put -l rel/apple/MATCHFILES#FE1000 -r $2/SYS/MATCHFILES#FE1000
echo "SYS/ARGS"; atftp $1 --put -l rel/ARGS#FE1000 -r $2/SYS/ARGS#FE1000
echo "SYS/INT32"; atftp $1 --put -l rel/INT32#FE1000 -r $2/SYS/INT32#FE1000
echo "SYS/DHCP"; atftp $1 --put -l rel/DHCP#FE1000 -r $2/SYS/DHCP#FE1000
@@ -22,6 +23,8 @@ echo "SYS/LONGJUMP"; atftp $1 --put -l rel/LONGJMP#FE1000 -r $2/SYS/LONGJMP#FE10
echo "SYS/MEMMGR"; atftp $1 --put -l rel/MEMMGR#FE1000 -r $2/SYS/MEMMGR#FE1000
echo "SYS/LZ4"; atftp $1 --put -l rel/LZ4#FE1000 -r $2/SYS/LZ4#FE1000
echo "SYS/CONIO"; atftp $1 --put -l rel/apple/CONIO#FE1000 -r $2/SYS/CONIO#FE1000
echo "SYS/HGRTILE"; atftp $1 --put -l rel/apple/HGRTILE#FE1000 -r $2/SYS/HGRTILE#FE1000
echo "SYS/HGRFONT"; atftp $1 --put -l rel/apple/HGRFONT#FE1000 -r $2/SYS/HGRFONT#FE1000
echo "SYS/HGRSPRITE"; atftp $1 --put -l rel/apple/HGRSPRITE#FE1000 -r $2/SYS/HGRSPRITE#FE1000
echo "SYS/LINES"; atftp $1 --put -l rel/LINES#FE1000 -r $2/SYS/LINES#FE1000
echo "SYS/HGRLIB"; atftp $1 --put -l rel/apple/HGRLIB#FE1000 -r $2/SYS/HGRLIB#FE1000

View File

@@ -11,3 +11,4 @@ echo "SYS/NEWDIR"; atftp $1 --put -l rel/apple/NEWDIR#FE1000 -r $2/SYS/NEWDIR#
echo "SYS/TYPE"; atftp $1 --put -l rel/apple/TYPE#FE1000 -r $2/SYS/TYPE#FE1000
echo "SYS/MON"; atftp $1 --put -l rel/apple/MON#FE1000 -r $2/SYS/MON#FE1000
echo "SYS/SOS"; atftp $1 --put -l rel/apple/SOS#FE1000 -r $2/SYS/SOS#FE1000
echo "SYS/ZIPCHIP"; atftp $1 --put -l rel/apple/ZIPCHIP#FE1000 -r $2/SYS/ZIPCHIP#FE1000

View File

@@ -247,7 +247,7 @@ def strpoolalloc(size)
end
def striplead(strptr, chr)#0
byte striplen
for striplen = 1 to ^strptr
if ^(strptr + striplen) <> chr
break
@@ -391,7 +391,7 @@ end
def strtonum(strptr)
word num, i
byte c
num = 0
for i = 1 to ^strptr
c = ^(strptr + i) & $7F
@@ -438,29 +438,38 @@ def readtxt(filename, startline)#0
putln
end
def writetxt(filename)#0
word i, strptr
byte refnum, j, chr
byte txtbuf[MAXLNLEN+2]
word i
byte refnum, txtbuf[MAXLNLEN+2]
fileio:destroy(filename)
fileio:create(filename, $04, $00) // full access, TXT file
refnum = fileio:open(filename)
if refnum == 0
return
fin
//
// Remove blank lines at end of text.
//
while numlines > 1 and txtlinbuf=>[numlines - 1] == @nullstr; numlines--; loop
//
// Write all the text line to the file.
// Delete old file and re-create
//
fileio:destroy(filename)
fileio:create(filename, $04, $00) // full access, TXT file
refnum = fileio:open(filename)
if refnum == 0
puts("\nError $"); puth(perr); puts(" opening: "); puts(filename); putln
return
fin
//
// Write all the text lines to the file.
//
for i = 0 to numlines - 1
lncpy(@txtbuf, txtlinbuf=>[i])
fileio:write(refnum, @txtbuf + 1, txtbuf)
if fileio:write(refnum, @txtbuf + 1, txtbuf) <> txtbuf
puts("\nError $"); puth(perr); puts(" writing: "); puts(filename); putln
fileio:close(refnum)
return
fin
if !(i & $0F); putc('.'); fin
next
fileio:close(refnum)
if fileio:close(refnum) <> FILE_ERR_OK
puts("\nError $"); puth(perr); puts(" closing: "); puts(filename)
fin
putln
end
//
@@ -558,7 +567,7 @@ end
def drawscrn(toprow, ofst)#0
byte row, numchars, lofst
word strptr, scrnptr
lofst = flags & gutter
if lofst
drawgutter(toprow, ofst)
@@ -598,7 +607,7 @@ def drawscrn(toprow, ofst)#0
end
def cursoff#0
word scrnptr
if flags & showcurs
^cursptr = underchr
if flags & gutter
@@ -607,13 +616,13 @@ def cursoff#0
^(scrnptr+2) = ^(scrnptr+2) | $80
fin
flags = flags & ~showcurs
fin
end
def curson#0
byte lofst
word scrnptr
if !(flags & showcurs)
lofst = flags & gutter
if lofst
@@ -644,7 +653,7 @@ def redraw#0
end
def curshpos(hpos)#1
byte needredraw
needredraw = TRUE
if hpos < 0; hpos = 0; fin
if hpos > MAXLNLEN; hpos = MAXLNLEN; fin
@@ -777,7 +786,7 @@ def cursleft#0
end
def pgleft#0
word i, strptr
strptr = txtlinbuf=>[cursrow]
if curscol > ^strptr
i = ^strptr
@@ -818,7 +827,7 @@ def cursright#0
end
def pgright#0
word i, strptr
strptr = txtlinbuf=>[cursrow]
if curscol >= ^strptr
i = curscol + 8
@@ -849,7 +858,7 @@ end
//
def findline(strptr, start)#1
byte scan, i, upstr[MAXLNLEN+1]
if ^strptr >= findstr
lnupcpy(@upstr, strptr)
for scan = start to upstr - findstr + 1
@@ -1098,7 +1107,7 @@ def printtxt(slot)#0
end
def freesel#0
word i
for i = 0 to numcliplines - 1
if cliplinbuf=>[i] <> @nullstr
delstr(cliplinbuf=>[i])
@@ -1109,7 +1118,7 @@ def freesel#0
end
def selrange#2
word first, last
if flags & selection
if cursrow > selrow
first, last = selrow, cursrow
@@ -1129,7 +1138,7 @@ def beginsel#0
end
def copysel#0
word firstsel, lastsel
freesel
firstsel, lastsel = selrange
for numcliplines = 0 to lastsel - firstsel
@@ -1140,7 +1149,7 @@ def copysel#0
end
def cutsel#0
word firstsel, lastsel
freesel
firstsel, lastsel = selrange
if lastsel - firstsel < MAXCLIPLINES
@@ -1169,7 +1178,7 @@ def cutsel#0
end
def pastesel#0
word p
if numcliplines and numcliplines + numlines < MAXLINES
memcpy(@txtlinbuf=>[cursrow + numcliplines], @txtlinbuf=>[cursrow], (numlines - cursrow) * 2)
for p = 0 to numcliplines - 1
@@ -1183,9 +1192,9 @@ def pastesel#0
fin
end
def indentsel#0
byte indentstr[MAXLNLEN+1], l
byte indentstr[MAXLNLEN+1], j, l
word firstsel, lastsel, i
freesel
firstsel, lastsel = selrange
for i = firstsel to lastsel
@@ -1195,6 +1204,18 @@ def indentsel#0
indentstr[0] = l + 2
indentstr[1] = keyspace
indentstr[2] = keyspace
//
// Align indent
//
for j = 3 to indentstr[0]
if indentstr[j] <> keyspace
if j & 1 == 0
indentstr[0]--
memcpy(@indentstr + 1, @indentstr + 2, indentstr[0])
fin
break
fin
next
delstr(txtlinbuf=>[i])
txtlinbuf=>[i] = newstr(@indentstr)
flags = flags | changed
@@ -1205,7 +1226,7 @@ end
def undentsel#0
byte undentstr[MAXLNLEN+1], l
word firstsel, lastsel, i
freesel
firstsel, lastsel = selrange
for i = firstsel to lastsel
@@ -1230,12 +1251,12 @@ def undentsel#0
end
def autoindent(strptr)#0
byte i
for i = 1 to ^strptr
if ^(strptr + i) <> keyspace
break
fin
next
next
curshpos(i - 1)
end
def openline(row)
@@ -1289,7 +1310,7 @@ def splitline#0
memcpy(@splitstr + 2, @splitstr + 1, splitstr)
splitstr[1] = keyspace
splitstr++
next
next
txtlinbuf=>[cursrow + 1] = newstr(@splitstr)
splitstr = curscol
memcpy(@splitstr + 1, txtlinbuf=>[cursrow] + 1, splitstr)
@@ -1303,7 +1324,7 @@ def splitline#0
break
fin
next
curshpos(curscol - 1)
curshpos(curscol - 1)
fin
fin
else
@@ -1518,7 +1539,7 @@ def prfiles(optpath)
byte firstblk
byte entrylen, entriesblk
byte i, type, len
word databuff, entry, filecnt
word databuff, entry
if ^optpath
strstripcpy(@path, optpath)
@@ -1533,37 +1554,31 @@ def prfiles(optpath)
return perr
fin
firstblk = 1
repeat
if fileio:read(refnum, databuff, 512) == 512
entry = databuff + 4
if firstblk
entrylen = databuff->$23
entriesblk = databuff->$24
filecnt = databuff=>$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk
type = ^entry
if type <> 0
len = type & $0F
^entry = len
puts(entry)
if type & $F0 == $D0 // Is it a directory?
putc('/')
len++
fin
for len = 20 - len downto 1
putc(' ')
next
filecnt--
fin
entry = entry + entrylen
next
firstblk = 0
else
filecnt = 0
while fileio:read(refnum, databuff, 512) == 512
entry = databuff + 4
if firstblk
entrylen = databuff->$23
entriesblk = databuff->$24
entry = entry + entrylen
fin
until filecnt == 0
for i = firstblk to entriesblk
type = ^entry
if type <> 0
len = type & $0F
^entry = len
puts(entry)
if type & $F0 == $D0 // Is it a directory?
putc('/')
len++
fin
for len = 20 - len downto 1
putc(' ')
next
fin
entry = entry + entrylen
next
firstblk = 0
loop
fileio:close(refnum)
heaprelease(databuff)
putln
@@ -1600,7 +1615,7 @@ def cmdmode#0
word cmdptr, line
clrscrn
puts("PLASMA Editor, Version 2.0 DP2\n")
puts("PLASMA Editor, Version 2.0 DP4\n")
while not exit
puts(@filename)
cmdptr = gets($BA)

3173
src/toolsrc/forthtran.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -685,7 +685,7 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
}
return (cat_seq(codeseq, valseq));
}
t_opseq *parse_expr(t_opseq *codeseq, int *stackdepth)
t_opseq *parse_subexpr(t_opseq *codeseq, int *stackdepth)
{
int prevmatch;
int matchop = 0;
@@ -744,7 +744,7 @@ t_opseq *parse_expr(t_opseq *codeseq, int *stackdepth)
parse_error("AND must evaluate to single value");
tag_and = tag_new(BRANCH_TYPE);
codeseq = gen_brand(codeseq, tag_and);
codeseq = parse_expr(codeseq, &stackdepth1);
codeseq = parse_subexpr(codeseq, &stackdepth1);
if (stackdepth1 != *stackdepth)
parse_error("Inconsistent AND value counts");
codeseq = gen_codetag(codeseq, tag_and);
@@ -761,12 +761,24 @@ t_opseq *parse_expr(t_opseq *codeseq, int *stackdepth)
parse_error("OR must evaluate to single value");
tag_or = tag_new(BRANCH_TYPE);
codeseq = gen_bror(codeseq, tag_or);
codeseq = parse_expr(codeseq, &stackdepth1);
codeseq = parse_subexpr(codeseq, &stackdepth1);
if (stackdepth1 != *stackdepth)
parse_error("Inconsistent AND value counts");
codeseq = gen_codetag(codeseq, tag_or);
}
else if (scantoken == TERNARY_TOKEN)
return (codeseq);
}
t_opseq *parse_expr(t_opseq *codeseq, int *stackdepth)
{
int prevmatch;
int matchop = 0;
int optos = opsptr;
int i, valdepth;
int prevtype, type = 0;
t_opseq *valseq;
codeseq = parse_subexpr(codeseq, stackdepth);
if (scantoken == TERNARY_TOKEN)
{
int tag_else, tag_endtri;
int stackdepth1;
@@ -790,8 +802,7 @@ t_opseq *parse_expr(t_opseq *codeseq, int *stackdepth)
codeseq = gen_codetag(codeseq, tag_endtri);
}
return (codeseq);
}
t_opseq *parse_set(t_opseq *codeseq)
}t_opseq *parse_set(t_opseq *codeseq)
{
char *setptr = tokenstr;
int lparms = 0, rparms = 0;

View File

@@ -493,7 +493,7 @@ def parse_value(codeseq, r_val)#2
fin
return cat_seq(codeseq, valseq), stackdepth
end
def parse_expr(codeseq)#2
def parse_subexpr(codeseq)#2
byte stackdepth, matchdepth, stkdepth1, prevmatch, matchop, i
word optos
word tag_else, tag_endop
@@ -530,17 +530,25 @@ def parse_expr(codeseq)#2
if stackdepth <> 1; exit_err(ERR_OVER|ERR_SYNTAX); fin
tag_endop = new_tag(RELATIVE_FIXUP)
codeseq = gen_oprel(codeseq, BRAND_CODE, tag_endop)
codeseq, stkdepth1 = parse_expr(codeseq)
codeseq, stkdepth1 = parse_subexpr(codeseq)
if stkdepth1 <> stackdepth; exit_err(ERR_INVAL|ERR_CODE); fin
codeseq = gen_ctag(codeseq, tag_endop)
elsif token == LOGIC_OR_TKN
if stackdepth <> 1; exit_err(ERR_OVER|ERR_SYNTAX); fin
tag_endop = new_tag(RELATIVE_FIXUP)
codeseq = gen_oprel(codeseq, BROR_CODE, tag_endop)
codeseq, stkdepth1 = parse_expr(codeseq)
codeseq, stkdepth1 = parse_subexpr(codeseq)
if stkdepth1 <> stackdepth; exit_err(ERR_INVAL|ERR_CODE); fin
codeseq = gen_ctag(codeseq, tag_endop)
elsif token == TERNARY_TKN
fin
return codeseq, stackdepth
end
def parse_expr(codeseq)#2
byte stackdepth, stkdepth1
word tag_else, tag_endop
codeseq, stackdepth = parse_subexpr(codeseq)
if token == TERNARY_TKN
if stackdepth <> 1; exit_err(ERR_OVER|ERR_SYNTAX); fin
tag_else = new_tag(RELATIVE_FIXUP)
tag_endop = new_tag(RELATIVE_FIXUP)

View File

@@ -507,7 +507,7 @@ include "toolsrc/parse.pla"
//
// Look at command line arguments and compile module
//
puts("PLASMA Compiler, Version 2.0 DP2\n")
puts("PLASMA Compiler, Version 2.0 DP4\n")
arg = argNext(argFirst)
if ^arg and ^(arg + 1) == '-'
opt = arg + 2

View File

@@ -1,11 +1,14 @@
include "inc/cmdsys.plh"
include "inc/longjmp.plh"
include "inc/args.plh"
include "inc/matchfiles.plh"
include "inc/fileio.plh"
include "inc/int32.plh"
var arg, refnum, dirbuf
var page, firstblk, entrylen, entriesblk, i, entry, filecnt
char[64] path, filename
predef catalog(pathstr)#0
var arg, recurse, exit
char[64] path, wildname
res[t_fileinfo] fileinfo
res[t_fileentry] fileentry
//
@@ -25,17 +28,23 @@ def putb(b)#0
fin
putc(h)
end
def strupper(strptr)#0
//
// Copy string with upper case conversion
//
def struprcpy(dst, src)#0
byte i, chr
if ^strptr
for i = 1 to ^strptr
chr = strptr->[i]
if ^src
for i = 1 to ^src
chr = src->[i]
if chr >= 'a' and chr <= 'z'
strptr->[i] = chr - 'a' + 'A'
dst->[i] = chr - 'a' + 'A'
else
dst->[i] = chr
fin
next
fin
^dst = ^src
end
def filefrompath(filestr, pathstr)#0
byte i
@@ -82,91 +91,94 @@ def printentry(entryptr)#0
puts(@eofstr)
putln
end
//
// Check arguments and file types
//
arg = argNext(argFirst)
if ^arg
strcpy(@path, arg)
strupper(@path)
else
fileio:getpfx(@path)
fin
//
// Check if file exists
//
if fileio:getfileinfo(@path, @fileinfo) == FILE_ERR_OK
def printentries(pathstr, entries, num)#0
byte page
puts(pathstr); putln
puts("=NAME==========TYPE===AUX====LENGTH=\n")
//
// Check if cataloging a directory
//
if fileinfo.file_type == $0F
fileio:iobufalloc(2) // Reserve two I/O buffers
if path[path] <> '/' // Make sure path ends with a '/'
path++
path[path] = '/'
fin
page = 21
filecnt = 0
firstblk = 1
dirbuf = heapallocalign(512, 8, 0)
refnum = fileio:open(@path)
repeat
if fileio:read(refnum, dirbuf, 512) == 512
//
// Skip block pointers
//
entry = dirbuf + 4
if firstblk
//
// Pull out revelant details from the first block
//
entrylen = dirbuf->$23
entriesblk = dirbuf->$24
filecnt = dirbuf=>$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk
//
// Print directory entry details
//
^entry = ^entry & $0F
if ^entry
printentry(entry)
filecnt--
//
// Pause display every screenfull
//
if not page
getc
page = 22
else
page--
fin
fin
entry = entry + entrylen
next
firstblk = 0
page = 20
repeat
printentry(entries)
entries = entries + t_fileentry
//
// Pause display every screenfull
//
if not page
if toupper(getc()) == 'Q'
throw(exit, TRUE)
fin
until filecnt == 0
else
//
// Create file entry from file info
//
filefrompath(@fileentry, @path)
fileentry.entry_access = fileinfo.file_access
fileentry.entry_type = fileinfo.file_type
fileentry:entry_create:0 = fileinfo:create_date
fileentry:entry_create:2 = fileinfo:create_time
fileentry:entry_aux = fileinfo:aux_type
fileentry:entry_mod:0 = fileinfo:mod_date
fileentry:entry_mod:2 = fileinfo:mod_time
refnum = fileio:open(@path)
fileentry:entry_EOFL, fileentry.entry_EOFH = fileio:geteof(refnum)#2
printentry(@fileentry)
page = 22
else
page--
fin
num--
until not num
end
def catalog(pathstr)#0
char recursepath[64]
var entrylist, entryptr, entrycnt
entrylist, entrycnt = matchList(pathstr, @wildname)
if entrylist
printentries(pathstr, entrylist, entrycnt)
if recurse
entryptr = entrylist
repeat
if entryptr->entry_type == $0F
//
// A directory, so recurse
//
strcpy(@recursepath, pathstr)
strcat(@recursepath, entryptr)
recursepath++
recursepath[recursepath] = '/'
if toupper(getc()) == 'Q'
throw(exit, TRUE)
fin
catalog(@recursepath)
fin
entryptr = entryptr + t_fileentry
entrycnt--
until not entrycnt
fin
heaprelease(entrylist)
fin
end
//
// Install error exit
//
exit = heapalloc(t_except)
if not except(exit)
//
// Check arguments and file types
//
arg = argNext(argFirst)
if ^arg and arg->[1] == '-'
if ^arg > 1 and toupper(arg->[2]) == 'R'
recurse = TRUE
fin
arg = argNext(arg)
fin
if ^arg
struprcpy(@path, arg)
//
// Check if cataloging a directory or volume
//
if fileio:getfileinfo(@path, @fileinfo) <> FILE_ERR_OK or (fileinfo.storage_type & $0D <> $0D)
filefrompath(@wildname, @path)
fin
path = path - wildname
fin
if not path
fileio:getpfx(@path)
fin
//
// Check if directory exists
//
if fileio:getfileinfo(@path, @fileinfo) == FILE_ERR_OK
catalog(@path)
else
puts("Unable to open: "); puts(@path); putln
fin
fileio:close(0)
else
puts("Unable to open: "); puts(@path); putln
fin
done

View File

@@ -1,14 +1,72 @@
include "inc/cmdsys.plh"
include "inc/longjmp.plh"
include "inc/args.plh"
include "inc/fileio.plh"
include "inc/matchfiles.plh"
const MAXBUFSIZE = 16384
var arg, srcref, dstref, copybuff, copysize, copyxfer
char[64] srcfilename, dstfilename
var arg, exit, srcfilelist, srcfileptr, srccnt
var copybuff, copyrel, copysize
byte recurse, dstlen
char[64] curpath, dstpath
char[16] srcdir
res[t_fileinfo] srcfileinfo, dstfileinfo
//
// Handy string functions
// Copy path with upper case conversion
//
def pathcpy(dst, src)#0
byte i, chr
if ^src
for i = 1 to ^src
chr = src->[i]
if chr >= 'a' and chr <= 'z'
dst->[i] = chr - 'a' + 'A'
else
dst->[i] = chr
fin
next
fin
^dst = ^src
end
def abspath(abs, path)#0
if ^path == 0 or path->[1] <> '/'
//
// Append relative path to absolute path
//
strcpy(abs, @curpath)
else
//
// Absolute path
//
^abs = 0
fin
strcat(abs, path)
//
// Strip trailing path seperator
//
if abs->[^abs] == '/'
^abs--
fin
end
def pathdiff(path1, path2)#1
byte i, d
char[64] abs1, abs2
abspath(@abs1, path1)
abspath(@abs2, path2)
if abs1 <> abs2
return TRUE
fin
for i = 1 to abs1
d = abs1[i] - abs2[i]
if d
return d
fin
next
return FALSE
end
def filefrompath(filestr, pathstr)#0
byte i
@@ -21,126 +79,217 @@ def filefrompath(filestr, pathstr)#0
memcpy(filestr + 1, pathstr + 1 + i, ^filestr)
end
//
// Check destination filename
// Check destination path
//
def checkdst
char[17] basefile
def chkdstpath(dstfile)
//
// Check if destination exists
//
if fileio:getfileinfo(@dstfilename, @dstfileinfo) == FILE_ERR_OK
if fileio:getfileinfo(dstfile, @dstfileinfo) == FILE_ERR_OK
//
// Check if copying into a directory
//
if dstfileinfo.file_type == $0F
if dstfilename[dstfilename] <> '/'
if dstfileinfo.storage_type & $0D == $0D
if dstfile->[^dstfile] <> '/'
//
// Add path seperator
//
dstfilename++
dstfilename[dstfilename] = '/'
^dstfile++
dstfile->[^dstfile] = '/'
fin
filefrompath(@basefile, @srcfilename)
strcat(@dstfilename, @basefile)
if fileio:getfileinfo(@dstfilename, @dstfileinfo) == FILE_ERR_OK
return TRUE
fin
fin
return FALSE
end
def copyfiles(srcfile, dstfile)#0
var entrylist, entry, entrycnt, srcref, dstref, copyxfer
char[64] srcpath
char[64] srcfilepath
char[64] dstfilepath
char[16] wildname
//
// Check if copying a directory
//
strcpy(@srcpath, srcfile)
wildname = 0
if fileio:getfileinfo(@srcpath, @srcfileinfo) <> FILE_ERR_OK or (srcfileinfo.storage_type & $0D <> $0D)
filefrompath(@wildname, @srcpath)
srcpath = srcpath - wildname
fin
entrylist, entrycnt = matchList(@srcpath, @wildname)
if not entrylist
puts(srcfile); puts(" ???\n")
else
entry = entrylist
while entrycnt
strcpy(@srcfilepath, @srcpath)
strcat(@srcfilepath, entry)
strcpy(@dstfilepath, dstfile)
if chkdstpath(@dstfilepath)
strcat(@dstfilepath, entry)
fin
if entry->entry_type == $0F
//
// Check if *that* is a directory
// Source is a directory and not referencing the destination
//
if dstfileinfo.file_type == $0F
puts("Destination is a directory filename\n")
return FALSE
if pathdiff(@srcfilepath, dstfile)
fileio:create(@dstfilepath, $0F, $0000)
if not chkdstpath(@dstfilepath)
puts("Unable to create directory: "); puts(@dstfilepath); putln
throw(exit, TRUE)
fin
if recurse
copyfiles(@srcfilepath, @dstfilepath)
fin
fin
else
return TRUE
fin
fin
//
// Remove existing file
//
fileio:destroy(@dstfilename)
fin
return TRUE
end
//
// Check arguments and file types
//
arg = argNext(argFirst)
if ^arg
strcpy(@srcfilename, arg)
fileio:iobufalloc(2) // Reserve two I/O buffers
if fileio:getfileinfo(@srcfilename, @srcfileinfo) == FILE_ERR_OK
//
// Check that source isn't a directory - can't handle that yet
//
if srcfileinfo.file_type == $0F
puts("Can't copy directories (yet)\n")
return
fin
else
//
// File not found
//
puts("File not found: "); puts(@srcfilename); putln
return
fin
srcref = fileio:open(@srcfilename)
if srcref
arg = argNext(arg)
if ^arg
strcpy(@dstfilename, arg)
if checkdst()
puts(@srcfilepath)
//
// Check if destination file exists
//
if fileio:getfileinfo(@dstfilepath, @dstfileinfo) == FILE_ERR_OK
fileio:destroy(@dstfilepath)
fin
//
// Create the destination file and open for writing
//
if fileio:create(@dstfilename, srcfileinfo.file_type, srcfileinfo:aux_type) == FILE_ERR_OK
dstref = fileio:open(@dstfilename)
if dstref
if fileio:create(@dstfilepath, entry->entry_type, entry=>entry_aux) <> FILE_ERR_OK
puts("\nUnable to create file: "); puts(@dstfilepath); putln
throw(exit, TRUE)
fin
srcref = fileio:open(@srcfilepath)
if not srcref
puts("\nUnable to open file: "); puts(@srcfilepath); putln
throw(exit, TRUE)
fin
dstref = fileio:open(@dstfilepath)
if not dstref
puts("\nUnable to open file: "); puts(@dstfilepath); putln
throw(exit, TRUE)
fin
//
// Let the copying begin
//
repeat
copyxfer = fileio:read(srcref, copybuff, copysize)
if copyxfer
if fileio:write(dstref, copybuff, copyxfer) <> copyxfer
puts("\nError writing: "); puts(@dstfilepath); putln
throw(exit, TRUE)
fin
fin
until copyxfer == 0
fileio:close(dstref)
fileio:close(srcref)
puts(" ==> "); puts(@dstfilepath); putln
fin
entry = entry + t_fileentry
entrycnt--
loop
heaprelease(entrylist)
fin
end
//
// Install error exit
//
exit = heapalloc(t_except)
if not except(exit)
fileio:getpfx(@curpath)
//
// Check arguments and file types
//
arg = argNext(argFirst)
if ^arg and arg->[1] == '-'
if ^arg > 1 and toupper(arg->[2]) == 'R'
recurse = TRUE
fin
arg = argNext(arg)
fin
if ^arg
srcfilelist = heapalloc(^arg + 1)
pathcpy(srcfilelist, arg)
srccnt++
arg = argNext(arg)
if ^arg
pathcpy(@dstpath, arg)
arg = argNext(arg)
while ^arg
//
// Add to source list
//
srcfileptr = heapalloc(dstpath + 1)
strcpy(srcfileptr, @dstpath)
srccnt++
//
// Set new destination
//
pathcpy(@dstpath, arg)
arg = argNext(arg)
loop
if not chkdstpath(@dstpath) and (srccnt > 1 or isWildName(srcfilelist))
puts("Destination must be a directory: "); puts(@dstpath); putln
return
fin
fileio:iobufalloc(2) // Reserve two I/O buffers
copysize = MAXBUFSIZE
while isult(heapavail, copysize + 512)
copysize = copysize / 2
loop
copyrel = heapalloc(copysize)
if not copyrel
puts(" No available memory for copy buffer\n")
return
fin
//
// Round buffer to page boundary for faster transfers
//
copybuff = (copyrel + $FF) & $FF00
//
// Iterate through all sources
//
srcfileptr = srcfilelist
while srccnt
dstlen = dstpath
if fileio:getfileinfo(srcfileptr, @srcfileinfo) == FILE_ERR_OK and (srcfileinfo.storage_type & $0D == $0D)
if recurse
//
// Let the copying begin
// Copy directory
//
copysize = MAXBUFSIZE
while isult(heapavail, copysize + 512)
copysize = copysize / 2
loop
copybuff = heapalloc(copysize)
if copybuff
//
// Round buffer to page boundary for faster transfers
//
copybuff = (copybuff + $FF) & $FF00
copyxfer = fileio:read(srcref, copybuff, copysize)
while copyxfer
if fileio:write(dstref, copybuff, copyxfer) <> copyxfer
puts("Error writing: "); puts(@dstfilename); putln
break
fin
copyxfer = fileio:read(srcref, copybuff, copysize)
loop
else
puts("No memory available!\n")
if dstpath[dstpath] <> '/'
dstpath++
dstpath[dstpath] = '/'
fin
filefrompath(@srcdir, srcfileptr)
strcat(@dstpath, @srcdir)
if fileio:getfileinfo(@dstpath, @dstfileinfo) <> FILE_ERR_OK
fileio:create(@dstpath, $0F, $0000)
fin
if not chkdstpath(@dstpath)
puts("Destination must be a directory: "); puts(@dstpath); putln
return
fin
else
puts("Unable to open: "); puts(@dstfilename); putln
puts("Omitting directory without -r: "); puts(srcfileptr); putln
srcfileptr = srcfileptr + ^srcfileptr + 1
srccnt--
continue
fin
else
puts("Unable to create: "); puts(@dstfilename); putln
fin
fin
fileio:close(0)
//
// Copy files
//
copyfiles(srcfileptr, @dstpath)
dstpath = dstlen
srcfileptr = srcfileptr + ^srcfileptr + 1
srccnt--
loop
heaprelease(copyrel)
return
fin
else
//
// Unable to open source
//
puts("Unable to open: "); puts(@srcfilename); putln
return
fin
//
// Close all files
//
fileio:close(0)
return
puts("Usage: +COPY <SRCFILE>+ <DEST>\n")
fin
puts("Usage: +COPY SRCFILE DEST\n")
fileio:close(0)
done

View File

@@ -1,62 +1,168 @@
include "inc/cmdsys.plh"
include "inc/longjmp.plh"
include "inc/args.plh"
include "inc/fileio.plh"
include "inc/matchfiles.plh"
char[64] filename
var arg
var arg, recurse, exit, filelist, fileptr, filecnt
char[64] path
res[t_fileinfo] fileinfo
//
// Copy string with upper case conversion
//
def struprcpy(dst, src)#0
byte i, chr
if ^src
for i = 1 to ^src
chr = src->[i]
if chr >= 'a' and chr <= 'z'
dst->[i] = chr - 'a' + 'A'
else
dst->[i] = chr
fin
next
fin
^dst = ^src
end
def filefrompath(filestr, pathstr)#0
byte i
for i = ^pathstr downto 1
if pathstr->[i] == '/'
break
fin
next
^filestr = ^pathstr - i
memcpy(filestr + 1, pathstr + 1 + i, ^filestr)
end
//
// Check filename
//
def checkfile
var refnum, dirbuf
res[t_fileinfo] fileinfo
def chkfile(file)#1
var refnum, dirbuf, filecnt
//
// Check if file exists
//
if fileio:getfileinfo(@filename, @fileinfo) == FILE_ERR_OK
if fileio:getfileinfo(file, @fileinfo) == FILE_ERR_OK
//
// Check if deleting a directory
//
if fileinfo.file_type == $0F
refnum = fileio:open(@filename)
refnum = fileio:open(file)
if refnum
//
// Check for files inside directory
//
filecnt = 0
dirbuf = heapalloc(512)
if fileio:read(refnum, dirbuf, 512) == 512
fileio:close(refnum)
if dirbuf=>$25 // File count in directory
puts("Directory not empty: "); puts(@filename); putln
return FALSE
fin
filecnt = dirbuf=>$25 // File count in directory
fin
heaprelease(dirbuf)
if filecnt
puts("Directory not empty: "); puts(file); putln
return FALSE
fin
fin
fin
return TRUE
fin
puts("File not found: "); puts(@filename); putln
puts("File not found: "); puts(file); putln
return FALSE
end
//
// Check arguments and file types
//
arg = argNext(argFirst)
if ^arg
strcpy(@filename, arg)
if checkfile()
//
// Remove existing file
//
fileio:destroy(@filename)
def delfiles(delfile)#0
var entrylist, entry, entrycnt
char[64] delpath
char[64] delfilepath
char[16] wildname
strcpy(@delpath, delfile)
wildname = 0
//if fileio:getfileinfo(@delpath, @fileinfo) <> FILE_ERR_OK or fileinfo.file_type <> $0F
if delpath[delpath] <> '/'
filefrompath(@wildname, @delpath)
delpath = delpath - wildname
fin
//
// Close all files
// Check arguments and file types
//
fileio:close(0)
return
entrylist, entrycnt = matchList(@delpath, @wildname)
if entrylist
entry = entrylist
while entrycnt
strcpy(@delfilepath, @delpath)
strcat(@delfilepath, entry)
//
// Check if file is a directory
//
if entry->entry_type == $0F
if recurse
strcat(@delfilepath, "/")
strcat(@delfilepath, @wildname)
delfiles(@delfilepath)
fin
strcpy(@delfilepath, @delpath)
strcat(@delfilepath, entry)
if chkfile(@delfilepath)
puts("Removing: "); puts(@delfilepath); putln
fileio:destroy(@delfilepath)
fin
else
puts("Removing: "); puts(@delfilepath); putln
fileio:destroy(@delfilepath)
fin
entry = entry + t_fileentry
entrycnt--
loop
elsif not wildname
puts("Not found: "); puts(@delpath); puts("/"); puts(@wildname); putln
fin
end
//
// Install error exit
//
exit = heapalloc(t_except)
if not except(exit)
//
// Check arguments and file types
//
arg = argNext(argFirst)
if ^arg and arg->[1] == '-'
if ^arg > 1 and toupper(arg->[2]) == 'R'
recurse = TRUE
fin
arg = argNext(arg)
fin
if ^arg
filelist = heapmark()
while ^arg
//
// Add to file list
//
fileptr = heapalloc(^arg + 1)
struprcpy(fileptr, arg)
filecnt++
arg = argNext(arg)
loop
fileptr = filelist
while filecnt
//
// Delete files in list
//
if recurse and fileio:getfileinfo(fileptr, @fileinfo) == FILE_ERR_OK and (fileinfo.storage_type & $0D == $0D)
strcpy(@path,fileptr)
strcat(@path, "/")
delfiles(@path)
fin
delfiles(fileptr)
fileptr = fileptr + ^fileptr + 1
filecnt--
loop
else
puts("Usage: +DEL <FILE>+\n")
fin
fin
puts("Usage: +DEL FILE\n")
done

View File

@@ -0,0 +1,53 @@
include "inc/cmdsys.plh"
include "inc/args.plh"
//
// ZIP Chip control
//
var arg, status, slots, clock, state, cache
byte _unlock[]
byte = $A9, $5A // LDA #$5A
byte = $8D, $5A, $C0 // STA $C05A
byte = $8D, $5A, $C0 // STA $C05A
byte = $8D, $5A, $C0 // STA $C05A
byte = $8D, $5A, $C0 // STA $C05A
byte = $60 // RTS
def unlock#0
(@_unlock)()#0 // Unlock regs (has to be machine code)
end
def lock#0
^$C05A = $A5 // Lock regs
end
arg = argNext(argFirst)
if ^arg
when toupper(arg->[1])
is 'S' // Slow to 1 MHz
unlock
^$C05A = $00
lock
puts("Slow speed\n")
break
is 'F' // Enable acceleration
unlock
^$C05B = $FF
lock
puts("Fast speed\n")
break
wend
fin
unlock
status = ^$C05B
slots = ^$C05C
clock = ^$C05D
state = ^$C05E
cache = ^$C05F
lock
^$C05F // AN3 off
puts("Status: $"); puth(status); putln
puts("Slots: $"); puth(slots); putln
puts("Clock: $"); puth(clock); putln
puts("State: $"); puth(state); putln
puts("Cache: $"); puth(cache); putln
done

View File

@@ -369,7 +369,7 @@ def volumes#0
next
end
puts("TFTP Server Version 2.0 Dev\n")
puts("TFTP Server Version 2.0 DP4\n")
if !iNet:initIP()
return -1
fin

View File

@@ -52,7 +52,7 @@ byte perr, refauto
// String pool.
//
byte autorun[] = "AUTORUN"
byte verstr[] = "\nPLASMA DP2"
byte verstr[] = "\nPLASMA DP4"
byte freestr[] = "MEM FREE:$"
byte errorstr[] = "ERR:$"
byte prompt[] = "PLASMA"

View File

@@ -1172,7 +1172,7 @@ def catalog(path)#0
byte firstblk
byte entrylen, entriesblk
byte i, type, len
word entry, filecnt
word entry
if !^path
path = @prefix
@@ -1182,43 +1182,37 @@ def catalog(path)#0
return
fin
firstblk = 1
repeat
if read(refnum, heap, 512) == 512
entry = heap + 4
if firstblk
entrylen = heap->$23
entriesblk = heap->$24
filecnt = heap=>$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
prstr(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
cout(type)
for len = ^entry to 18
cout(' ')
next
filecnt--
fin
entry = entry + entrylen
next
firstblk = 0
else
filecnt = 0
while read(refnum, heap, 512) == 512
entry = heap + 4
if firstblk
entrylen = heap->$23
entriesblk = heap->$24 - 1
entry = entry + entrylen
fin
until !filecnt
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
prstr(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
cout(type)
for len = ^entry to 18
cout(' ')
next
fin
entry = entry + entrylen
next
firstblk = 0
loop
close(refnum)
crout()
end
@@ -1383,7 +1377,7 @@ heap = @lastdef
//
// Print PLASMA version
//
prstr("PLASMA 2.0 DP2 64K\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
prstr("PLASMA 2.0 DP4 64K\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
//
// Init symbol table.
//

View File

@@ -1237,7 +1237,7 @@ def catalog(path)#0
byte firstblk
byte entrylen, entriesblk
byte i, type, len
word entry, filecnt
word entry
if !^path
path = @prefix
@@ -1247,43 +1247,37 @@ def catalog(path)#0
return
fin
firstblk = 1
repeat
if read(refnum, heap, 512) == 512
entry = heap + 4
if firstblk
entrylen = heap->$23
entriesblk = heap->$24
filecnt = heap=>$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
prstr(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
cout(type)
for len = ^entry to 18
cout(' ')
next
filecnt--
fin
entry = entry + entrylen
next
firstblk = 0
else
filecnt = 0
while read(refnum, heap, 512) == 512
entry = heap + 4
if firstblk
entrylen = heap->$23
entriesblk = heap->$24 - 1
entry = entry + entrylen
fin
until !filecnt
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
prstr(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
cout(type)
for len = ^entry to 18
cout(' ')
next
fin
entry = entry + entrylen
next
firstblk = 0
loop
close(refnum)
crout()
end
@@ -1460,7 +1454,7 @@ heap = @lastdef
//
// Print PLASMA version
//
prstr("PLASMA 2.0 DP2 128K\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
prstr("PLASMA 2.0 DP4 128K\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
//
// Init symbol table.
//

View File

@@ -80,7 +80,7 @@ def catalog(path)#0
byte firstblk
byte entrylen, entriesblk
byte i, type, len
word entry, filecnt, catptr
word entry, catptr
if !^path
getpfx(path)
@@ -91,43 +91,37 @@ def catalog(path)#0
fin
catptr = heapmark
firstblk = 1
repeat
if cmdsys:sysread(refnum, catptr, 512) == 512
entry = catptr + 4
if firstblk
entrylen = catptr->$23
entriesblk = catptr->$24
filecnt = catptr=>$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
puts(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
putc(type)
for len = ^entry to 18
putc(' ')
next
filecnt--
fin
entry = entry + entrylen
next
firstblk = 0
else
filecnt = 0
while cmdsys:sysread(refnum, catptr, 512) == 512
entry = catptr + 4
if firstblk
entrylen = catptr->$23
entriesblk = catptr->$24 - 1
entry = entry + entrylen
fin
until filecnt == 0
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
puts(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
putc(type)
for len = ^entry to 18
putc(' ')
next
fin
entry = entry + entrylen
next
firstblk = 0
loop
cmdsys:sysclose(refnum)
putln()
end

View File

@@ -155,7 +155,7 @@ def catalog(path)#0
byte firstblk
byte entrylen, entriesblk
byte i, type, len
word entry, filecnt, catptr
word entry, catptr
if !^path
getpfx(path)
@@ -166,43 +166,37 @@ def catalog(path)#0
fin
catptr = heapmark
firstblk = 1
repeat
if cmdsys:sysread(refnum, catptr, 512) == 512
entry = catptr + 4
if firstblk
entrylen = catptr->$23
entriesblk = catptr->$24
filecnt = catptr=>$25
entry = entry + entrylen
fin
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
puts(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
putc(type)
for len = ^entry to 18
putc(' ')
next
filecnt--
fin
entry = entry + entrylen
next
firstblk = 0
else
filecnt = 0
while cmdsys:sysread(refnum, catptr, 512) == 512
entry = catptr + 4
if firstblk
entrylen = catptr->$23
entriesblk = catptr->$24 - 1
entry = entry + entrylen
fin
until filecnt == 0
for i = firstblk to entriesblk
if ^entry
^entry = ^entry & $0F
puts(entry)
type = ' '
when entry->$10
is $0F // Is it a directory?
type = '/'
break
is $FF // SYSTEM file
type = '-'
break
is $FE // REL file
type = '+'
wend
putc(type)
for len = ^entry to 18
putc(' ')
next
fin
entry = entry + entrylen
next
firstblk = 0
loop
cmdsys:sysclose(refnum)
putln()
end

View File

@@ -1263,7 +1263,7 @@ cmdlnptr = @cmdln
// Print PLASMA version
//
init_cons
prstr("PLASMA 2.0 DP2\n")//; putb(version.1); putc('.'); putb(version.0); putln
prstr("PLASMA 2.0 DP4\n")//; putb(version.1); putc('.'); putb(version.0); putln
prstr("MEM:$"); prword(availheap); crout
//
// Exec command line parser

View File

@@ -1286,7 +1286,7 @@ cmdlnptr = @cmdln
// Print PLASMA version
//
init_cons
prstr("PLASMA 2.0 DP2 JITC\n")//; putb(version.1); putc('.'); putb(version.0); putln
prstr("PLASMA 2.0 DP4 JITC\n")//; putb(version.1); putc('.'); putb(version.0); putln
prstr("MEM:$"); prword(availheap); crout
//
// Exec command line parser