This page (revision-7) was last changed on 03-Feb-2023 15:21 by Eli Simpson 

This page was created on 07-Feb-2011 14:47 by Gromit

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
7 03-Feb-2023 15:21 28 KB Eli Simpson to previous removed extraneous "."
6 25-Nov-2021 11:39 28 KB Eli Simpson to previous | to last Changed 1 to I in keyword FI (probably a OCR error)
5 07-Feb-2011 15:31 28 KB Gromit to previous | to last
4 07-Feb-2011 15:21 21 KB Gromit to previous | to last
3 07-Feb-2011 14:59 14 KB Gromit to previous | to last
2 07-Feb-2011 14:48 14 KB Gromit to previous | to last
1 07-Feb-2011 14:47 14 KB Gromit to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 243 added 160 lines
!!Advice and admiration.
I'm sorry to report that the ''Action! Reference Manual'' doesn't do the language justice. In a commendable attempt to satisfy beginners and experts alike, the ''Manual'' suffers from lack of confidence, uncertain organization and a shortage of good, hard technical data. Thank goodness for the numerous sample programs, which communicate a lot more about the system than the text surrounding them.
Having once written the manual for a new (and mercifully obscure) programming language, I can appreciate the difficulties involved in deciding how much needs to be said, to whom, and in what order. Nevertheless, a new language can only be as good as its documentation. Until somebody sits down, rolls up his or her sleeves and writes an authoritative book about __Action!__, it will have a hard time attaining the wide acceptance it so obviously deserves. I conclude this diatribe by acknowledging that the latest edition of the ''Reference Manual'' (in the small yellow notebook) shows a marked improvement over the first release.
The __Action!__ cartridge itself has gone through a couple of changes since its first appearance in August 1983. You can tell which version you have by using the "?" (display memory) command in the monitor to examine cartridge address $B000. If this byte equals $31 hex, you have the original Version 3.1. A value of $33 indicates Version 3.3, in which a number of minor 3.1 bugs have been corrected. The final version is 3.6 ($36 at $B000), which should be ready soon after you read this. OSS has always been very good about maintaining their products, so you shouldn't have any trouble getting an upgrade if you need one. Consult OSS for prices and availability.
I hope my kvetching about the documentation doesn't scare you away. If sensible, structured code and edge-of-the-art speed are what you crave in a high-level language, __Action!__ is exactly what you need. OSS's hideous orange cartridge joins the ranks of __valFORTH__, __Omnimon!__, __ABC__ and __MAC/65__ as one of the most valuable development tools ever published for the Atari. Congratulations and thanks to Clint Parker and OSS for bringing us such an advanced product. You can expect to see plenty of support for this exciting new language in future issues of __ANALOG__.
{{{Listing 8.
0100 ; DISASSEMBLY OF COMPILED
0110 ; ACTION! SCREEN-FILL
0120 ; BENCHMARK (LISTING 7)
0130 ; -----------------------
0140 ;
0150 ; DEFINE ADDRESS CONSTANTS
0160 ; ------------------------
0170 RTCLOK = 20
0180 SAVMSCL = 88
0190 SAVMSCH = 89
0200 ;
0210 ; GLOBAL VARIABLE STORAGE
0220 ; -----------------------
0230 *= ORIGIN
0240 I *= *+1 ; reserve 1 byte for
0250 J *= *+1 ; each BYTE variable,
0260 TIME *= *+1
0270 SCREEN *= *+2 ; 2 bytes for CARDs
0280 ;
0290 ; PROC BENCH()
0300 ; ------------
0310 JMP START
0320 ;
0330 ; If our procedure used local variables,
0340 ; they would have been stored here.
0350 ; That's why the above JMP is included.
0360 ;
0370 ; GRAPHICS(24)
0380 ; ------------
0390 START
0400 LDA #24
0410 JSR GRAPHICS
0420 ;
0430 ; RTCLOK=0
0440 ; --------
0450 LDY #0
0460 STY RTCLOK
0470 ;
0480 ; SCREEN=SAVMSCL+256*SAVMSCH
0490 ; --------------------------
0500 LDA #0
0510 STA TEMP1+1
0520 LDA SAVMSCH ; move SAVMSCH into
0530 STA TEMP1 ; TEMP1
0540 LDA # >256 ; msb of multiplier
0550 TAX
0560 LDA # <256 ; lsb
0570 JSR MULTIPLY
0580 STA TEMP4
0590 TXA ; save (256*SAVMSCH)
0600 STA TEMP4+1 ; into TEMP4
0610 ;
0620 CLC
0630 LDA SAVMSCL ; add SAVMSCL to
0640 ADC TEMP4 ; (256*SAVMSCH) and
0650 STA SCREEN ; store in SCREEN
0660 LDA #0
0670 ADC TEMP4+1
0680 STA SCREEN+1
0690 ;
0700 ; FOR I=0 TO 31 DO
0710 ; ----------------
0720 LDY #0
0730 STY I ; init I-loop
0740 ILOOP
0750 LDA #31
0760 CMP I ; reached limit yet?
0770 BCS JINIT ; no - do another J-loop
0780 JMP GETIME ; else get timing
0790 ;
0800 ; FOR J=0 TO 239 DO
0810 ; -----------------
0820 JINIT
0830 LDY #0
0840 STY J ; init J-loop
0850 JLOOP
0860 LDA #239
0870 CMP J ; reached limit yet?
0880 BCS DOPOKE ; no - poke another byte
0890 JMP ADD240 ; else update screen
0900 ;
0910 ; POKE(SCREEN+J,255)
0920 ; ------------------
0930 DOPOKE
0940 CLC
0950 LDA SCREEN ; add SCREEN to
0960 ADC J ; J, and
0970 STA TEMP2 ; save in TEMP2
0980 LDA SCREEN+1
0990 ADC #0
1000 STA TEMP2+1
1010 ;
1020 LDY #255
1030 LDX TEMP2+1
1040 LDA TEMP2 ; poke (SCREEN+J) with
1050 JSR POKE ; a 255
1060 ;
1070 ; OD (for J loop)
1080 ; ---------------
1090 INC J
1100 JMP JLOOP
1110 ;
1120 ; SCREEN==+240
1130 ; ------------
1140 ADD240
1150 CLC
1160 LDA SCREEN ; add SCREEN and
1170 ADC #240 ; 240; store result
1180 STA SCREEN ; in SCREEN
1190 LDA SCREEN+1
1200 ADC #0
1210 STA SCREEN+1
1220 ;
1230 ; OD (for I loop)
1240 ; ---------------
1250 INC I
1260 JMP ILOOP
1270 ;
1280 ; TIME=RTCLOK
1290 ; -----------
1300 GETIME
1310 LDA RTCLOK
1320 STA TIME
1330 ;
1340 ; GRAPHICS(0)
1350 ; -----------
1360 LDA #0
1370 JSR GRAPHICS
1380 ;
1390 ; PRINTF("%E %U JIFFIES",TIME)
1400 ; ----------------------------
1410 JMP OVER ; skip over in-line string
1420 STRING
1430 .BYTE 13 ; length of string
1440 .BYTE "%E %U JIFFIES"
1450 OVER
1460 LDA #0 ; msb of TIME
1470 STA TEMP3 ; into TEMP3
1480 LDY TIME ; lsb into Y
1490 LDX # >STRING ; msb of string addr
1500 LDA # <STRING ; lsb
1510 JSR PRINTF
1520 ;
1530 ; RETURN
1540 ; ------
1550 RTS ; from procedure
1560 ;
1570 RTS ; back to Action! monitor
}}}