At line 15 changed one line |
AND Fl OR UNTIL = ( |
AND FI OR UNTIL = ( |
At line 69 changed one line |
Other noteworthy capabilities of the __Action!__ editor include global search and replace, instant access to the beginning or end of a file and the ability to delete, move and copy, selected blocks of text. The block move and copy functions are implemented so nicely that I have to tell you about them. When you hit the SHIFT/DELETE keys, the line you're working on disappears, just as with the Atari screen editor. But the line isn't gone forever. It's being held in a buffer, waiting to be moved or copied to anywhere else in your text window(s). Simply move the cursor to a likely spot and hit CTRL/SHIFT/"P" (for paste) to dump the contents of the buffer. Several adjacent lines of text can be sent to the buffer by repeatedly "deleting" them with SHIFT/DELETE. __Action!__'s method of picking up and dropping blocks of text feels very natural if you're used to the Atari screen editor, and it also eliminates the annoyance of losing a line of work by accidentally hitting SHIFT/DELETE. Incidentally, you can automatically undo any changes you have made to a line of text by hitting CTRL/SHIFT/"U".before leaving the fine. Luxurious. |
Other noteworthy capabilities of the __Action!__ editor include global search and replace, instant access to the beginning or end of a file and the ability to delete, move and copy, selected blocks of text. The block move and copy functions are implemented so nicely that I have to tell you about them. When you hit the SHIFT/DELETE keys, the line you're working on disappears, just as with the Atari screen editor. But the line isn't gone forever. It's being held in a buffer, waiting to be moved or copied to anywhere else in your text window(s). Simply move the cursor to a likely spot and hit CTRL/SHIFT/"P" (for paste) to dump the contents of the buffer. Several adjacent lines of text can be sent to the buffer by repeatedly "deleting" them with SHIFT/DELETE. __Action!__'s method of picking up and dropping blocks of text feels very natural if you're used to the Atari screen editor, and it also eliminates the annoyance of losing a line of work by accidentally hitting SHIFT/DELETE. Incidentally, you can automatically undo any changes you have made to a line of text by hitting CTRL/SHIFT/"U" before leaving the fine. Luxurious. |
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 |
}}} |