diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 500ce24f..27634676 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -44,7 +44,8 @@ Project Page: https://github.com/a2stuff/a2d * Detect Pravetz 8A/C * Detect Passport MIDI card * Show duplicate SmartPort device names with counts. -* Screen Dump +* Print Screen + * Renamed from "Screen Dump" * Improve use of SSC and IW2. * Show alert on startup if no SSC found. * Don't corrupt "File" on menu bar. ([#810](https://github.com/a2stuff/a2d/issues/810)) @@ -53,6 +54,7 @@ Project Page: https://github.com/a2stuff/a2d * Show alert on startup if no printer card found. * Options: Add option to show invisible files. * Calendar: Allow modifiers when clicking, double-modifiers for decade. ([#693](https://github.com/a2stuff/a2d/issues/693)) +* New DA (in Extras): "Screenshot" - saves screenshot file to application directory. ### Misc diff --git a/desk.acc/README.md b/desk.acc/README.md index 7b4a32df..33b1c123 100644 --- a/desk.acc/README.md +++ b/desk.acc/README.md @@ -76,8 +76,10 @@ * [Darkness](darkness.s) * A debugging tool that paints the whole screen a dark pattern. -* [Screen Dump](screen.dump.s) - * Dumps a screenshot to an ImageWriter II attached to a Super Serial Card in Slot 1. +* [Print Screen](print.screen.s) + * Prints a screenshot to an ImageWriter II attached to a Super Serial Card in Slot 1. +* [Screenshot](screenshot.dump.s) + * Saves a screenshot to the application directory. * [Benchmark](benchmark.s) * Measures CPU speed using VBL. diff --git a/desk.acc/TARGETS b/desk.acc/TARGETS index 0f3786b1..5f220f4a 100644 --- a/desk.acc/TARGETS +++ b/desk.acc/TARGETS @@ -30,11 +30,11 @@ find.files Apple.Menu optional key.caps Apple.Menu optional run.basic.here Apple.Menu optional sort.directory Apple.Menu optional -cd.remote Extras extra benchmark Extras extra +cd.remote Extras extra darkness Extras extra -sci.calc Extras extra -screen.dump Extras extra print.catalog Extras extra +print.screen Extras extra round.corners Extras extra - +sci.calc Extras extra +screenshot Extras extra diff --git a/desk.acc/screen.dump.s b/desk.acc/print.screen.s similarity index 99% rename from desk.acc/screen.dump.s rename to desk.acc/print.screen.s index 688dcc9f..815f0392 100644 --- a/desk.acc/screen.dump.s +++ b/desk.acc/print.screen.s @@ -1,5 +1,5 @@ ;;; ============================================================ -;;; SCREEN.DUMP - Desk Accessory +;;; PRINT.SCREEN - Desk Accessory ;;; ;;; Dumps the contents of the graphics screen to an ImageWriter ;;; printer connected to a Super Serial Card in Slot 1. diff --git a/desk.acc/res/filenames.res.da b/desk.acc/res/filenames.res.da index a2f4fa8c..159101ad 100644 --- a/desk.acc/res/filenames.res.da +++ b/desk.acc/res/filenames.res.da @@ -3,7 +3,8 @@ .define res_filename_puzzle "Gade" .define res_filename_sort_directory "Sort.Mappe" .define res_filename_eyes "Ojne" -.define res_filename_screen_dump "Skaerm.Dump" +.define res_filename_print_screen "Print.Skaerm" +.define res_filename_screenshot "Skaermbillede" .define res_filename_run_basic_here "Kore.BASIC.Her" .define res_filename_key_caps "Noglehaetter" .define res_filename_find_files "Finde.Filer" diff --git a/desk.acc/res/filenames.res.de b/desk.acc/res/filenames.res.de index fa3f32e1..df3f163d 100644 --- a/desk.acc/res/filenames.res.de +++ b/desk.acc/res/filenames.res.de @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzle" .define res_filename_sort_directory "Dir.Sortieren" .define res_filename_eyes "Augen" -.define res_filename_screen_dump "Bildschirm.Drck" +.define res_filename_print_screen "Druckbildschirm" +.define res_filename_screenshot "Bildschirmfoto" .define res_filename_run_basic_here "BASIC.Hier" .define res_filename_key_caps "Tastenkappen" .define res_filename_find_files "Dateien.Suchen" diff --git a/desk.acc/res/filenames.res.en b/desk.acc/res/filenames.res.en index a571eaf3..a64659e6 100644 --- a/desk.acc/res/filenames.res.en +++ b/desk.acc/res/filenames.res.en @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzle" .define res_filename_sort_directory "Sort.Directory" .define res_filename_eyes "Eyes" -.define res_filename_screen_dump "Screen.Dump" +.define res_filename_print_screen "Print.Screen" +.define res_filename_screenshot "Screenshot" .define res_filename_run_basic_here "Run.BASIC.Here" .define res_filename_key_caps "Key.Caps" .define res_filename_find_files "Find.Files" diff --git a/desk.acc/res/filenames.res.es b/desk.acc/res/filenames.res.es index 95c766f8..61e7413c 100644 --- a/desk.acc/res/filenames.res.es +++ b/desk.acc/res/filenames.res.es @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzle" .define res_filename_sort_directory "Ordenar.Dir" .define res_filename_eyes "Ojos" -.define res_filename_screen_dump "Imprimir.Pantal" +.define res_filename_print_screen "Imprimir.Pantal" +.define res_filename_screenshot "Captura.Pantal" .define res_filename_run_basic_here "BASIC.Aqui" .define res_filename_key_caps "Mayusculas" .define res_filename_find_files "Buscar.Archivos" diff --git a/desk.acc/res/filenames.res.fr b/desk.acc/res/filenames.res.fr index 392f12eb..5c65924e 100644 --- a/desk.acc/res/filenames.res.fr +++ b/desk.acc/res/filenames.res.fr @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzle" .define res_filename_sort_directory "Repertoire.Tri" .define res_filename_eyes "Yeux" -.define res_filename_screen_dump "Imprimer.Ecran" +.define res_filename_print_screen "Imprimer.Ecran" +.define res_filename_screenshot "Capture.Ecran" .define res_filename_run_basic_here "Basic.Ici" .define res_filename_key_caps "Touches" .define res_filename_find_files "Recherche.Fich" diff --git a/desk.acc/res/filenames.res.it b/desk.acc/res/filenames.res.it index a95ade84..c68562f8 100644 --- a/desk.acc/res/filenames.res.it +++ b/desk.acc/res/filenames.res.it @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzle" .define res_filename_sort_directory "Ordina.Dir" .define res_filename_eyes "Occhi" -.define res_filename_screen_dump "Stampa.Schermo" +.define res_filename_print_screen "Stampa.Schermo" +.define res_filename_screenshot "Schermata" .define res_filename_run_basic_here "Apri.BASIC.Qui" .define res_filename_key_caps "Tastiera" .define res_filename_find_files "Cerca.File" diff --git a/desk.acc/res/filenames.res.nl b/desk.acc/res/filenames.res.nl index 66ae77ba..354d1d55 100644 --- a/desk.acc/res/filenames.res.nl +++ b/desk.acc/res/filenames.res.nl @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzel" .define res_filename_sort_directory "Sorteer.Map" .define res_filename_eyes "Ogen" -.define res_filename_screen_dump "Scherm.Dump" +.define res_filename_print_screen "Afdruk.Scherm" +.define res_filename_screenshot "Schermafdruk" .define res_filename_run_basic_here "BASIC.Hier" .define res_filename_key_caps "Toetsenbord" .define res_filename_find_files "Zoek.Bestanden" diff --git a/desk.acc/res/filenames.res.pt b/desk.acc/res/filenames.res.pt index 061b8e86..4d2492f1 100644 --- a/desk.acc/res/filenames.res.pt +++ b/desk.acc/res/filenames.res.pt @@ -3,7 +3,8 @@ .define res_filename_puzzle "Puzzle" .define res_filename_sort_directory "Ordenar.Dir" .define res_filename_eyes "Olhos" -.define res_filename_screen_dump "Imprimem.A.Tela" +.define res_filename_print_screen "Imprimem.A.Tela" +.define res_filename_screenshot "Captura.Tela" .define res_filename_run_basic_here "BASIC.Aqui" .define res_filename_key_caps "Letras.Teclado" .define res_filename_find_files "Procurar.Arquiv" diff --git a/desk.acc/res/filenames.res.sv b/desk.acc/res/filenames.res.sv index 36d856dc..f2ba576c 100644 --- a/desk.acc/res/filenames.res.sv +++ b/desk.acc/res/filenames.res.sv @@ -3,7 +3,8 @@ .define res_filename_puzzle "Pussel" .define res_filename_sort_directory "Sortera.Katalog" .define res_filename_eyes "Ogon" -.define res_filename_screen_dump "Skarmdump" +.define res_filename_print_screen "Utskrift.Skarm" +.define res_filename_screenshot "Skarmdump" .define res_filename_run_basic_here "Kor.BASIC.Har" .define res_filename_key_caps "Nyckellayout" .define res_filename_find_files "Hitta.Filer" diff --git a/desk.acc/screenshot.s b/desk.acc/screenshot.s new file mode 100644 index 00000000..865cac30 --- /dev/null +++ b/desk.acc/screenshot.s @@ -0,0 +1,118 @@ +;;; ============================================================ +;;; SCREENSHOT - Desk Accessory +;;; +;;; Saves the contents of the graphics screen to a file. +;;; ============================================================ + + .include "../config.inc" + + .include "apple2.inc" + .include "../inc/apple2.inc" + .include "../inc/macros.inc" + .include "../inc/prodos.inc" + .include "../mgtk/mgtk.inc" + .include "../common.inc" + .include "../desktop/desktop.inc" + +;;; ============================================================ + + DA_HEADER + DA_START_MAIN_SEGMENT + +;;; ============================================================ + + jmp start + +;;; ============================================================ + + kBlockSize = $200 + BLOCK_BUFFER := DA_IO_BUFFER - kBlockSize + .assert .lobyte(BLOCK_BUFFER) = 0, error, "page align" + + DEFINE_CREATE_PARAMS create_params, filename, ACCESS_DEFAULT, FT_GRAPHICS, $2000 + DEFINE_OPEN_PARAMS open_params, filename, DA_IO_BUFFER + DEFINE_WRITE_PARAMS write_block_params, BLOCK_BUFFER, kBlockSize + DEFINE_WRITE_PARAMS write_screen_params, $2000, $2000 + DEFINE_CLOSE_PARAMS close_params + + +filename: + PASCAL_STRING "Screenshot" + + +;;; ============================================================ + +start: JUMP_TABLE_MGTK_CALL MGTK::HideCursor + jsr JUMP_TABLE_HILITE_MENU + + JUMP_TABLE_MLI_CALL CREATE, create_params + bcc :+ + cmp #ERR_DUPLICATE_FILENAME + bne done +: + JUMP_TABLE_MLI_CALL OPEN, open_params + bcs done + lda open_params::ref_num + sta write_block_params::ref_num + sta write_screen_params::ref_num + sta close_params::ref_num + + ;; ---------------------------------------- + ;; Aux Segment + + ;; Mark Graphics file as "560 x 192 Black & White" + ;; See File Type Note $08 + sta SET80STORE + sta PAGE2ON + lda #2 + sta $2000+$78 + sta PAGE2OFF + sta CLR80STORE + + ;; Can't write it with 80STORE on since banking not guaranteed + ;; during ProDOS I/O (e.g. aux RAM disks), so do it block by + ;; block. + ptr := $06 + copy16 #$2000, ptr + ldy #$00 + +block_loop: + sta SET80STORE + sta PAGE2ON +: lda (ptr),y + sta BLOCK_BUFFER,y + iny + bne :- + inc ptr+1 +: lda (ptr),y + sta BLOCK_BUFFER+$100,y + iny + bne :- + inc ptr+1 + sta PAGE2OFF + sta CLR80STORE + + JUMP_TABLE_MLI_CALL WRITE, write_block_params + + lda ptr+1 + cmp #$40 + bne block_loop + + ;; ---------------------------------------- + ;; Write main segment + + ;; Just write directly + JUMP_TABLE_MLI_CALL WRITE, write_screen_params + +close: JUMP_TABLE_MLI_CALL CLOSE, close_params + +done: jsr JUMP_TABLE_HILITE_MENU + JUMP_TABLE_MGTK_CALL MGTK::ShowCursor + rts + + +;;; ============================================================ + + DA_END_MAIN_SEGMENT + +;;; ============================================================ diff --git a/inc/prodos.inc b/inc/prodos.inc index bd9052cd..c5aa709d 100644 --- a/inc/prodos.inc +++ b/inc/prodos.inc @@ -320,7 +320,7 @@ DRIVER_COMMAND_FORMAT = 3 .endmacro -.macro DEFINE_OPEN_PARAMS name, pn, io, rn +.macro DEFINE_OPEN_PARAMS name, pn, io .if .xmatch(.string(pn), "pathname") ;; If 'pathname' is passed then expansion yields a circular reference. .error "Can't pass 'pathname' label to DEFINE_*_PARAMS" diff --git a/res/notes/testplan.md b/res/notes/testplan.md index 52e375b8..5d6e1be4 100644 --- a/res/notes/testplan.md +++ b/res/notes/testplan.md @@ -1136,12 +1136,12 @@ With Sci.Calc: * Launch DeskTop. Open a window with at least two files. Apple Menu > Find Files. Type "*" and click Search. Press Down Arrow once. Type Return. Press Down Arrow again. Verify that only one entry in the list appears highlighted. -## Screen Dump +## Print Screen -* Configure a system with an SSC in Slot 1 and an ImageWriter II. Invoke the Screen Dump DA. Verify it prints a screenshot. -* Configure a system with a non-SSC in Slot 1. Invoke the Screen Dump DA. Verify nothing happens. -* Configure a system with an SSC in Slot 1 and an ImageWriter II. Invoke the Screen Dump DA. Invoke the Print Catalog DA. Verify that the catalog is printed on separate lines, not all overprinted on the same line onto one. -* Using MAME (e.g. via Ample), configure a system with an SSC in Slot 1 and a Serial Printer. Invoke the Screen Dump DA. Verify that the File menu is not corrupted. +* Configure a system with an SSC in Slot 1 and an ImageWriter II. Invoke the Print Screen DA. Verify it prints a screenshot. +* Configure a system with a non-SSC in Slot 1. Invoke the Print Screen DA. Verify nothing happens. +* Configure a system with an SSC in Slot 1 and an ImageWriter II. Invoke the Print Screen DA. Invoke the Print Catalog DA. Verify that the catalog is printed on separate lines, not all overprinted on the same line onto one. +* Using MAME (e.g. via Ample), configure a system with an SSC in Slot 1 and a Serial Printer. Invoke the Print Screen DA. Verify that the File menu is not corrupted. # Shortcuts (Module)