Browse Source

ScreenSaver v1.0

Tomek Wójcik 1 year ago
parent
commit
137cc90c03

+ 19 - 0
ScreenSaver/LICENSE

@@ -0,0 +1,19 @@
+Copyright (c) 2020-present BTHLabs <contact@bthlabs.pl> (https://bthlabs.pl)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 52 - 0
ScreenSaver/README.md

@@ -0,0 +1,52 @@
+# ScreenSaver
+
+This is a "screensaver" program written in AMOS Pro 2.0.
+
+## Description
+
+Years ago (around 2006) I got an extra winter break assignment for my
+programming classes - write a DOS graphics mode screensaver in Turbo Pascal.
+That code has since been lost, unfortunately.
+
+During Christmas break 2020, I was working on putting my Amiga 1200 back
+together and needed a way to put her through her paces to ensure her stability.
+I settled for an AMOS Pro 2.0 programming recreating that lost program to the
+best of my recollection.
+
+It took me around 8h to write the program on my Amiga. I last touched AMOS
+Pro 2.0 over 20o years ago, so I needed some time get used to it again. Also,
+programming graphics on Amiga (or any other system for that matter) isn't my
+usual glass of beer, so I had to experiment to make things work (kinda) like I
+wanted them to. It's not like you can find an answer to _Why the hell double
+buffering doesn't work in AMOS?_ on Stack Overflow in 2020 ;). I got it
+working, had some fun with it and gave my Miggy a good shakedown.
+
+I tested the program on my machine (AGA, 68030 @ 25MHz, 128MB Fast RAM) and on
+emulated bare Amiga 500 (OCS, 68000 @ 7MHz, 0.5MB Chip RAM). It works, so I
+declare it done.
+
+## Live Demo
+
+You can see the program running on an emulated Amiga 500
+[here](https://www.youtube.com/watch?v=0UcZrYuE1-g).
+
+## Contents of this repository:
+
+* `ScreenSaver.adf` - a bootable ADF that launches the program from the
+  startup-sequence. Ready for writing to a floppy (or a Gotek flash drive) or
+  using in an emulator.
+* `ScreenSaver.AMOS` - AMOS Pro 2.0 source file.
+* `ScreenSaver.AMOS.txt` - TXT printout AMOS Pro 2.0 source file.
+
+## Contributing
+
+If you think you found a bug or want to send a patch, feel free to contact
+me through e-mail.
+
+## Author
+
+ScreenSaver is developed by [Tomek Wójcik](https://www.bthlabs.pl/).
+
+## License
+
+ScreenSaver is licensed under the MIT License.

BIN
ScreenSaver/ScreenSaver.AMOS


+ 258 - 0
ScreenSaver/ScreenSaver.AMOS.txt

@@ -0,0 +1,258 @@
+' Screen Saver v1.0
+' Created By Tomek Wojcik <tomek@bthlabs.pl> 
+' Copyright 2020-present by BTHLabs (https://bthlabs.pl) 
+' Licensed under terms of MIT License
+
+
+' *** Globals
+WIDTH=320
+HEIGHT=200
+PADDING=10
+XMIN=PADDING
+XMAX=WIDTH-PADDING
+YMIN=PADDING
+YMAX=HEIGHT-PADDING
+PAL_MIN=4
+PAL_MAX=15
+
+Global WIDTH,HEIGHT,PADDING,XMIN,YMIN,XMAX,YMAX
+
+' *** Setup
+Degree 
+
+Auto View Off 
+Default Palette $0,$FFF,$0,$0,$BA6,$B30,$625,$FC0,$690,$CB6,$373,$F0,$8EE,$AAA,$737,$A26
+Screen Open 0,WIDTH,HEIGHT,16,Lowres : Screen Show 0
+Screen Open 1,WIDTH,HEIGHT,16,Lowres : Screen Hide 1
+Screen Open 2,WIDTH,HEIGHT,16,Lowres : Screen Hide 2
+
+Hide : Flash Off 
+Screen 0 : Curs Off 
+Screen 1 : Curs Off 
+Screen 2 : Curs Off 
+
+' *** Main Stuff 
+
+Procedure MAIN_DRAW_BORDER
+   Cls 0
+   Ink 1,0
+   Box 4,4 To 316,196
+   Pen 1 : Paper 0
+   Locate 0,0
+   Centre "Screen Saver"
+   Locate 0,24
+   Centre "By BTHLabs. For teh lulz."
+   Locate 35,0 : Pen 13 : Paper 0
+   Print "v1.0";
+End Proc
+
+Screen 0
+MAIN_DRAW_BORDER
+View 
+
+' *** The Rect Module
+RECT_PEN_MIN=4
+RECT_PEN_MAX=15
+RECT_MIN_SIZE=8
+
+Global RECT_PEN_MIN,RECT_PEN_MAX,RECT_MIN_SIZE
+
+Procedure RECT_TICK
+   If Timer mod 3=0
+      Randomize Timer
+
+      RECT_PEN=RECT_PEN_MIN+Rnd(RECT_PEN_MAX-RECT_PEN_MIN)
+      RECT_WIDTH=RECT_MIN_SIZE+Rnd(XMAX-PADDING-RECT_MIN_SIZE)
+      RECT_HEIGHT=RECT_MIN_SIZE+Rnd(YMAX-PADDING-RECT_MIN_SIZE)
+
+      If RECT_WIDTH=XMAX-PADDING
+         RECT_X=0
+      Else 
+         RECT_X=Rnd(XMAX-PADDING-RECT_WIDTH)
+      End If 
+
+      If RECT_HEIGHT=YMAX-PADDING
+         RECT_Y=0
+      Else 
+         RECT_Y=Rnd(YMAX-PADDING-RECT_HEIGHT)
+      End If 
+
+      Ink RECT_PEN,RECT_PEN
+      RECT_FX=XMIN+RECT_X
+      RECT_FY=YMIN+RECT_Y
+      RECT_TX=RECT_FX+RECT_WIDTH
+      RECT_TY=RECT_FY+RECT_HEIGHT
+      Bar RECT_FX,RECT_FY To RECT_TX,RECT_TY
+   End If 
+End Proc
+
+' *** The Radar Module 
+RADAR_CX=WIDTH/2
+RADAR_CY=HEIGHT/2
+RADAR_RADIUS=64
+RADAR_STEP=0
+RADAR_MAX_STEP=35
+Dim RADAR_POINTS(36,2)
+
+Global RADAR_CX,RADAR_CY,RADAR_RADIUS,RADAR_STEP,RADAR_MAX_STEP,RADAR_POINTS()
+
+Procedure RADAR_INIT
+   MAIN_DRAW_BORDER
+
+   RADAR_STEP=0
+
+   For I=0 To RADAR_MAX_STEP
+      RADAR_POINTS(I,0)=0
+      RADAR_POINTS(I,1)=0
+   Next I
+
+   Ink 1,0
+   Circle RADAR_CX,RADAR_CY,RADAR_RADIUS
+   Ink 10,0
+   Paint RADAR_CX,RADAR_CY
+   Ink 1,0
+   Circle RADAR_CX,RADAR_CY,1
+   Ink 11,0
+   Circle RADAR_CX,RADAR_CY,48
+   Circle RADAR_CX,RADAR_CY,32
+   Circle RADAR_CX,RADAR_CY,16
+End Proc
+
+Procedure RADAR_TICK
+   Screen Copy 2 To 1
+
+   Randomize Timer
+   RADAR_ANGLE=10*RADAR_STEP
+   RADAR_POINT_DIST=8+Rnd(RADAR_RADIUS-10)
+   RADAR_POINT_X=RADAR_POINT_DIST*Cos(RADAR_ANGLE)
+   RADAR_POINT_Y=RADAR_POINT_DIST*Sin(RADAR_ANGLE)
+   RADAR_POINTS(RADAR_STEP,0)=RADAR_POINT_X
+   RADAR_POINTS(RADAR_STEP,1)=RADAR_POINT_Y
+
+   Ink 7,0
+   For I=0 To RADAR_MAX_STEP
+      If RADAR_POINTS(I,0)<>0 and RADAR_POINTS(I,1)<>0
+         Plot RADAR_CX-RADAR_POINTS(I,0),RADAR_CY-RADAR_POINTS(I,1)
+      End If 
+   Next I
+
+   If RADAR_STEP=RADAR_MAX_STEP
+      RADAR_STEP=0
+   Else 
+      RADAR_STEP=RADAR_STEP+1
+   End If 
+
+   RADAR_ANGLE=10*RADAR_STEP
+   RADAR_HAND_X=(RADAR_RADIUS)*Cos(RADAR_ANGLE)
+   RADAR_HAND_Y=(RADAR_RADIUS)*Sin(RADAR_ANGLE)
+   Ink 1,0
+   Draw RADAR_CX,RADAR_CY To RADAR_CX-RADAR_HAND_X,RADAR_CY-RADAR_HAND_Y
+End Proc
+
+' *** The Text Module
+TXT_PEN_BASE=13
+TXT_PEN_SPECIAL=1
+
+Dim TXT_SPECIAL_STRINGS$(3)
+TXT_SPECIAL_STRINGS$(0)="Basia"
+TXT_SPECIAL_STRINGS$(1)="Ziomek"
+TXT_SPECIAL_STRINGS$(2)="Tomek"
+
+Dim TXT_SPECIAL_STRING_COORDS(3,2)
+
+Global TXT_PEN_BASE,TXT_PEN_SPECIAL,TXT_SPECIAL_STRINGS$(),TXT_SPECIAL_STRING_COORDS()
+
+Procedure TXT_INIT
+   Randomize Timer
+   For Y=1 To 23
+      For X=1 To 38
+         Pen TXT_PEN_BASE
+         Locate X,Y : Print Chr$(32+Rnd(64));
+      Next X
+   Next Y
+
+   For I=0 To 2
+      TXT_SPECIAL_STRING$=TXT_SPECIAL_STRINGS$(I)
+      TXT_SPECIAL_STRING_COORDS(I,0)=1+Rnd(37-Len(TXT_SPECIAL_STRING$))
+      TXT_SPECIAL_STRING_COORDS(I,1)=1+Rnd(23)
+   Next I
+End Proc
+
+Procedure TXT_TICK
+   Randomize Timer
+   TXT_HIGHLIGHT_COUNT=Rnd(50)
+
+   For I=0 To TXT_HIGHLIGHT_COUNT
+      TXT_HIGHLIGHT_X=1+Rnd(37)
+      TXT_HIGHLIGHT_Y=1+Rnd(22)
+      TXT_HIGHLIGHT_PEN=4+Rnd(11)
+      Locate TXT_HIGHLIGHT_X,TXT_HIGHLIGHT_Y
+      Pen TXT_HIGHLIGHT_PEN : Paper 0
+      Print Chr$(32+Rnd(64));
+   Next I
+
+   For I=0 To 2
+      Pen TXT_PEN_SPECIAL : Paper 0
+      Locate TXT_SPECIAL_STRING_COORDS(I,0),TXT_SPECIAL_STRING_COORDS(I,1)
+      Print TXT_SPECIAL_STRINGS$(I);
+   Next I
+End Proc
+
+' *** The Main Loop  
+
+CURRENT_MOD=0
+CURRENT_MOD_MAX_TIME=250
+LOCK_CURRENT_MOD=False
+
+Global CURRENT_MOD
+
+Procedure CURRENT_MOD_INIT
+   Screen 2
+
+   MAIN_DRAW_BORDER
+
+   If CURRENT_MOD=1
+      RADAR_INIT
+   Else If CURRENT_MOD=2
+      TXT_INIT
+   End If 
+
+   Screen Copy 2 To 1
+End Proc
+
+CURRENT_MOD_INIT
+
+CURRENT_MOD_START=Timer
+Do 
+   CURRENT_MOD_TIME=Timer-CURRENT_MOD_START
+   If LOCK_CURRENT_MOD=False and CURRENT_MOD_TIME>=CURRENT_MOD_MAX_TIME
+      CURRENT_MOD=CURRENT_MOD+1
+      If CURRENT_MOD>2
+         CURRENT_MOD=0
+      End If 
+
+      CURRENT_MOD_START=Timer
+
+      CURRENT_MOD_INIT
+   End If 
+
+   Screen 1
+
+   If CURRENT_MOD=0
+      RECT_TICK
+   Else If CURRENT_MOD=1
+      RADAR_TICK
+   Else If CURRENT_MOD=2
+      TXT_TICK
+   End If 
+
+   Screen Copy 1 To 0
+
+   View 
+
+   Wait Vbl 
+
+   If Mouse Click<>0 or Key State(69)=True
+      Exit 
+   End If 
+Loop 

BIN
ScreenSaver/ScreenSaver.adf


BIN
ScreenSaver/ScreenSaver.exe