From feae688346d03cbd571fb945b43e5671ad3cda8a Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 16 Mar 2008 09:37:22 +0000 Subject: [PATCH] Oliver Schmidt updated the graphics drivers and part of the C library for the Apple machines. git-svn-id: svn://svn.cc65.org/cc65/trunk@3816 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- asminc/joy-kernel.inc | 1 + asminc/tgi-mode.inc | 5 +- doc/apple2.sgml | 97 ++- doc/apple2enh.sgml | 86 ++- doc/ld65.sgml | 6 +- include/apple2.h | 33 +- include/tgi/tgi-mode.h | 3 +- libsrc/Makefile | 10 +- libsrc/apple2/Makefile | 14 +- ...{apple2-280-192-6.s => apple2-280-192-8.s} | 516 +++++++------- .../{apple2-40-40-16.s => apple2-40-48-16.s} | 639 +++++++++--------- libsrc/apple2/apple2-stdjoy.s | 133 ++-- libsrc/apple2/apple2-stdmou.s | 23 +- libsrc/apple2/apple2.inc | 3 + libsrc/apple2/cout.s | 20 + libsrc/apple2/crt0.s | 98 ++- libsrc/apple2/filedes.s | 1 - libsrc/apple2/gotoxy.s | 1 - libsrc/apple2/gotoy.s | 1 - libsrc/apple2/home.s | 20 + libsrc/apple2/opendir.c | 4 +- libsrc/apple2/rcout.s | 10 - libsrc/apple2/rdkey.s | 20 + libsrc/apple2/readdir.c | 4 +- libsrc/apple2/rewinddir.c | 2 +- libsrc/apple2/rom.s | 53 -- libsrc/apple2/rpread.s | 10 - libsrc/apple2/rrdkey.s | 10 - libsrc/apple2/rvtabz.s | 9 - libsrc/apple2/tgi_mode_table.s | 14 +- libsrc/apple2/vtabz.s | 20 + libsrc/apple2enh/Makefile | 14 +- samples/Makefile | 4 +- samples/mandelbrot.c | 8 +- samples/tgidemo.c | 75 +- src/ld65/cfg/apple2.cfg | 48 +- 36 files changed, 1029 insertions(+), 986 deletions(-) rename libsrc/apple2/{apple2-280-192-6.s => apple2-280-192-8.s} (77%) rename libsrc/apple2/{apple2-40-40-16.s => apple2-40-48-16.s} (64%) create mode 100644 libsrc/apple2/cout.s create mode 100644 libsrc/apple2/home.s delete mode 100644 libsrc/apple2/rcout.s create mode 100644 libsrc/apple2/rdkey.s delete mode 100644 libsrc/apple2/rom.s delete mode 100644 libsrc/apple2/rpread.s delete mode 100644 libsrc/apple2/rrdkey.s delete mode 100644 libsrc/apple2/rvtabz.s create mode 100644 libsrc/apple2/vtabz.s diff --git a/asminc/joy-kernel.inc b/asminc/joy-kernel.inc index 048517a68..8f890f141 100644 --- a/asminc/joy-kernel.inc +++ b/asminc/joy-kernel.inc @@ -74,6 +74,7 @@ JOY_API_VERSION = $01 ;------------------------------------------------------------------------------ ; C callable functions + .global _joy_load_driver .global _joy_unload .global _joy_install .global _joy_uninstall diff --git a/asminc/tgi-mode.inc b/asminc/tgi-mode.inc index 60425873a..ac01b4acb 100644 --- a/asminc/tgi-mode.inc +++ b/asminc/tgi-mode.inc @@ -40,9 +40,8 @@ TGI_MODE_160_200_4 ; 160x200, 4 colors TGI_MODE_640_200_2 ; 640x200, 2 colors (b/w) TGI_MODE_640_480_2 ; 640x480, 2 colors (b/w) - TGI_MODE_280_192_6 ; 280x192, 6 colors - TGI_MODE_560_192_2 ; 560x192, 2 colors - TGI_MODE_40_40_16 ; 40x40, 16 colors + TGI_MODE_280_192_8 ; 280x192, 8 colors + TGI_MODE_40_48_16 ; 40x48, 16 colors .endenum diff --git a/doc/apple2.sgml b/doc/apple2.sgml index 5209c60af..9f7209408 100644 --- a/doc/apple2.sgml +++ b/doc/apple2.sgml @@ -35,25 +35,25 @@ more information. The standard binary output format generated by the linker for the Apple ][ target is a machine language program with a 4 byte DOS -3.3 header. The standard load address is $800. +3.3 header. The standard load address is $803. The DOS header is in its own segment named - HEADER: start = $0000, size = $4, file = %O; + HEADER: start = $0000, size = $0004, file = %O; to - HEADER: start = $0000, size = $4, file = ""; + HEADER: start = $0000, size = $0004, file = ""; in the linker configuration to have the linker remove it. -Please note that there is a "Apple ][ ProDOS 8 system program -for loading binary programs" available in the cc65 User Contributions section. +Please note that there is an 'Apple ][ ProDOS 8 system program +for loading binary programs' available in the cc65 User Contributions section. It adds all benefits of a ProDOS 8 system program to the standard binary program generated by the linker for the Apple ][ target. @@ -62,8 +62,9 @@ program generated by the linker for the Apple ][ target. Memory layout

In the standard setup, cc65 generated programs use the memory from -$800 to $95FF, so 35.5K of memory are available. ROM calls are -possible without further precautions. +$803 to $95FF, so 35.5KB of RAM are available. While running +

+Enabling the Language Card allows to use it as additional memory for executable +code. Actually doing so requires either to compile code with the option + + LC: start = $D400, size = $0C00, define = yes; + + +to + + + LC: start = $D000, size = $3000, define = yes; + + +in the linker configuration to define the whole 12KB Language Card address +space as memory area for executable code. + Platform specific header files

@@ -112,14 +139,19 @@ you cannot do it, it just means that there's no help. - This driver was written by Stefan Haubenthal. It features a resolution of - 40×40 with 16 colors. At the bottom of the screen, 4 additional text - lines are available. + This driver features a resolution of 40×48 with 16 colors. - This driver was written by Stefan Haubenthal. It features a resolution of - 280×192 with 6 colors. Note that programs using this driver will have - to be linked with

@@ -128,11 +160,12 @@ you cannot do it, it just means that there's no help. - - Gives access to 12KB RAM (48 pages of 256 bytes each) on the - Apple II Language Card. The driver was contributed by Stefan Haubenthal. - Note that this driver is incompatible with any DOS using the Language - Card memory! + + Gives access to 47,5 KB RAM (190 pages of 256 bytes each) on an Extended + 80-Column Text Card. + + Note that this driver doesn't check for the actual existence of the memory + and that it doesn't check for ProDOS 8 RAM disk content!

@@ -155,10 +188,13 @@ you cannot do it, it just means that there's no help. Driver for the AppleMouse II Card. Searches all Apple II slots for an AppleMouse II Card compatible firmware. The default bounding - box is [0..279,0..191]. Programs using this driver will have - to be linked with

@@ -199,7 +235,7 @@ Command line arguments can be passed to -]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 +]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 @@ -216,10 +252,11 @@ supported by BASIC, the following syntax was chosen: Interrupts

The runtime for the Apple ][ uses routines marked as . +type . @@ -235,7 +272,7 @@ name="uz@cc65.org">). License

This software is provided 'as-is', without any expressed or implied -warranty. In no event will the authors be held liable for any damages +warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, diff --git a/doc/apple2enh.sgml b/doc/apple2enh.sgml index a98a91e55..7fcae1523 100644 --- a/doc/apple2enh.sgml +++ b/doc/apple2enh.sgml @@ -35,25 +35,25 @@ more information. The standard binary output format generated by the linker for the enhanced Apple //e target is a machine language program with a 4 byte DOS -3.3 header. The standard load address is $800. +3.3 header. The standard load address is $803. The DOS header is in its own segment named - HEADER: start = $0000, size = $4, file = %O; + HEADER: start = $0000, size = $0004, file = %O; to - HEADER: start = $0000, size = $4, file = ""; + HEADER: start = $0000, size = $0004, file = ""; in the linker configuration to have the linker remove it. -Please note that there is a "Apple ][ ProDOS 8 system program -for loading binary programs" available in the cc65 User Contributions section. +Please note that there is an 'Apple ][ ProDOS 8 system program +for loading binary programs' available in the cc65 User Contributions section. It adds all benefits of a ProDOS 8 system program to the standard binary program generated by the linker for the enhanced Apple //e target. @@ -62,8 +62,9 @@ program generated by the linker for the enhanced Apple //e target. Memory layout

In the standard setup, cc65 generated programs use the memory from -$800 to $95FF, so 35.5K of memory are available. ROM calls are -possible without further precautions. +$803 to $95FF, so 35.5KB of RAM are available. While running +

+Enabling the Language Card allows to use it as additional memory for executable +code. Actually doing so requires either to compile code with the option + + LC: start = $D400, size = $0C00, define = yes; + + +to + + + LC: start = $D000, size = $3000, define = yes; + + +in the linker configuration to define the whole 12KB Language Card address +space as memory area for executable code. + Platform specific header files

@@ -114,14 +141,19 @@ you cannot do it, it just means that there's no help. - This driver was written by Stefan Haubenthal. It features a resolution of - 40×40 with 16 colors. At the bottom of the screen, 4 additional text - lines are available. + This driver features a resolution of 40×48 with 16 colors. - This driver was written by Stefan Haubenthal. It features a resolution of - 280×192 with 6 colors. Note that programs using this driver will have - to be linked with

@@ -130,11 +162,12 @@ you cannot do it, it just means that there's no help. - - Gives access to 12KB RAM (48 pages of 256 bytes each) on the - Apple II Language Card. The driver was contributed by Stefan Haubenthal. - Note that this driver is incompatible with any DOS using the Language - Card memory! + + Gives access to 47,5 KB RAM (190 pages of 256 bytes each) on an Extended + 80-Column Text Card. + + Note that this driver doesn't check for the actual existence of the memory + and that it doesn't check for ProDOS 8 RAM disk content!

@@ -177,8 +210,8 @@ you cannot do it, it just means that there's no help. flow control because of a full buffer. The driver defaults to slot 2. Call

@@ -198,7 +231,7 @@ Command line arguments can be passed to -]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 +]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 @@ -220,10 +253,11 @@ These are defined to be OpenApple + number key. Interrupts

The runtime for the enhanced Apple //e uses routines marked as . +type . @@ -239,7 +273,7 @@ name="uz@cc65.org">). License

This software is provided 'as-is', without any expressed or implied -warranty. In no event will the authors be held liable for any damages +warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, diff --git a/doc/ld65.sgml b/doc/ld65.sgml index 4605d4e24..71caa092f 100644 --- a/doc/ld65.sgml +++ b/doc/ld65.sgml @@ -231,8 +231,8 @@ Here is a description of all the command line options: Using -S you may define the default starting address. If and how this address is used depends on the config file in use. For the builtin - configurations, only the "none" system honors an explicit start address, - all other builtin config provide their own. + configurations, only the "none", "apple2" and "apple2enh" systems honor an + explicit start address, all other builtin config provide their own. -V, --version @@ -935,7 +935,7 @@ distributed together with the machine specific binary packages (usually in the doc directory) and don't have a special format. So if you need a special configuration, it's a good idea to start with the builtin configuration for your system. In a first step, just replace +; Oliver Schmidt ; Based on Maciej Witkowiak's circle routine ; @@ -15,11 +16,23 @@ .macpack generic ; ------------------------------------------------------------------------ -; ROM entry points + +; Zero page stuff + +HBASL := $26 +HMASK := $30 +PAGE := $E6 +SCALE := $E7 +ROT := $F9 + +; Graphics entry points, by cbmnut (applenut??) cbmnut@hushmail.com TEXT := $F399 ; Return to text screen +HGR2 := $F3D8 ; Initialize and clear hi-res page 2. HGR := $F3E2 ; Initialize and clear hi-res page 1. HCLR := $F3F2 ; Clear the current hi-res screen to black. +BKGND := $F3F6 ; Clear the current hi-res screen to the + ; last plotted color (from ($1C). HPOSN := $F411 ; Positions the hi-res cursor without ; plotting a point. ; Enter with (A) = Y-coordinate, and @@ -33,30 +46,60 @@ HLIN := $F53A ; Draws a line from the last plotted ; point or line destination to: ; (X,A) = X-coordinate, and ; (Y) = Y-coordinate. +HFIND := $F5CB ; Converts the hi-res coursor's position + ; back to X- and Y-coordinates; stores + ; X-coordinate at $E0,E1 and Y-coordinate + ; at $E2. DRAW := $F601 ; Draws a shape. Enter with (Y,X) = the ; address of the shape table, and (A) = ; the rotation factor. Uses the current ; color. +XDRAW := $F65D ; Draws a shape by inverting the existing + ; color of the dots the shape draws over. + ; Same entry parameters as DRAW. SETHCOL := $F6EC ; Set the hi-res color to (X), where (X) ; must be between 0 and 7. ; ------------------------------------------------------------------------ -; Header. Includes jump table and constants. -.segment "JUMPTABLE" +; Variables mapped to the zero page segment variables. Some of these are +; used for passing parameters to the driver. + +X1 := ptr1 +Y1 := ptr2 +X2 := ptr3 +Y2 := ptr4 +RADIUS := tmp1 + +ADDR := tmp1 ; (2) SETPIXELCLIP +TEMP := tmp3 ; icmp +TEMP2 := tmp4 ; icmp +XX := ptr3 ; (2) CIRCLE +YY := ptr4 ; (2) CIRCLE +TEMP3 := sreg ; CIRCLE +TEMP4 := sreg+1 ; CIRCLE +MaxO := sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway) +XS := regsave ; (2) CIRCLE +YS := regsave+2 ; (2) CIRCLE + +; ------------------------------------------------------------------------ + + .segment "JUMPTABLE" + +; Header. Includes jump table and constants. ; First part of the header is a structure that has a magic and defines the ; capabilities of the driver - .byte $74, $67, $69 ; "tgi" - .byte TGI_API_VERSION ; TGI API version number -xres: .word 280 ; X resolution -yres: .word 192 ; Y resolution - .byte 8 ; Number of drawing colors - .byte 2 ; Number of screens available - .byte 8 ; System font X size - .byte 8 ; System font Y size - .res 4, $00 ; Reserved for future extensions + .byte $74, $67, $69 ; "tgi" + .byte TGI_API_VERSION ; TGI API version number +xres: .word 280 ; X resolution +yres: .word 192 ; Y resolution + .byte 8 ; Number of drawing colors + .byte 2 ; Number of screens available + .byte 8 ; System font X size + .byte 8 ; System font Y size + .res 4, $00 ; Reserved for future extensions ; Next comes the jump table. Currently all entries must be valid and may point ; to an RTS for test versions (function not implemented). @@ -81,55 +124,33 @@ yres: .word 192 ; Y resolution .addr CIRCLE .addr TEXTSTYLE .addr OUTTEXT - .addr 0 ; IRQ entry is unused + .addr 0 ; IRQ entry is unused ; ------------------------------------------------------------------------ -; Data. - -; Variables mapped to the zero page segment variables. Some of these are -; used for passing parameters to the driver. - -X1 = ptr1 -Y1 = ptr2 -X2 = ptr3 -Y2 = ptr4 -RADIUS = tmp1 -ADDR = tmp1 -TEMP = tmp3 -TEMP2 = tmp4 -TEMP3 = sreg -TEMP4 = sreg+1 - -; Circle stuff -XX = ptr3 ; (2) CIRCLE -YY = ptr4 ; (2) CIRCLE -MaxO = sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway) -XS = regsave ; (2) CIRCLE -YS = regsave+2 ; (2) CIRCLE + .bss ; Absolute variables used in the code -.bss +ERROR: .res 1 ; Error code -ERROR: .res 1 ; Error code + .ifdef __APPLE2ENH__ +Set80: .res 1 ; Set 80 column store + .endif -; Line routine stuff (combined with CIRCLE to save space) +; Circle stuff -OGora: .res 2 -OUkos: .res 2 -Y3: .res 2 +OGora: .res 2 +OUkos: .res 2 +Y3: .res 2 -; Text output stuff -TEXTMAGX = $E7 -TEXTMAGY = $E7 -TEXTDIR = $F9 +; ------------------------------------------------------------------------ -; Constants and tables + .rodata -.rodata +; Constants and tables -DEFPALETTE: .byte $00, $05, $04, $01, $00, $08, $06, $01; 6 unique colors +DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07 SHAPE: .byte $64,$01,$D0,$00,$D5,$00,$DA,$00,$E0,$00,$EF,$00,$FE,$00,$0C,$01 .byte $19,$01,$1D,$01,$25,$01,$2D,$01,$3D,$01,$46,$01,$4B,$01,$52,$01 @@ -215,33 +236,11 @@ SHAPE: .byte $64,$01,$D0,$00,$D5,$00,$DA,$00,$E0,$00,$EF,$00,$FE,$00,$0C,$01 .byte $2D,$2D,$35,$3F,$3F,$37,$2D,$2D,$75,$00,$40,$C0,$40,$18,$00,$40 .byte $C0,$40,$43,$00,$40,$C0,$40,$08,$00,$19,$00,$00 -.code - -; ------------------------------------------------------------------------ -; INSTALL routine. Is called after the driver is loaded into memory. May -; initialize anything that has to be done just once. Is probably empty -; most of the time. -; -; Must set an error code: NO -; - -INSTALL: - - ; ------------------------------------------------------------------------ -; UNINSTALL routine. Is called before the driver is removed from memory. May -; clean up anything done by INSTALL but is probably empty most of the time. -; -; Must set an error code: NO -; - -UNINSTALL: - rts + .code -; ------------------------------------------------------------------------ -; INIT: Changes an already installed device from text mode to graphics -; mode. +; INIT: Changes an already installed device from text mode to graphics mode. ; Note that INIT/DONE may be called multiple times while the driver ; is loaded, while INSTALL is only called once, so any code that is needed ; to initializes variables and so on must go here. Setting palette and @@ -249,153 +248,152 @@ UNINSTALL: ; kernel later. ; The graphics kernel will never call INIT when a graphics mode is already ; active, so there is no need to protect against that. -; ; Must set an error code: YES -; - INIT: - -; Switch into graphics mode - - jsr HGR + .ifdef __APPLE2ENH__ + ; Save and clear 80 column store + lda RD80COL + sta Set80 + sta CLR80COL + .endif + + ; Switch into graphics mode + bit HIRES bit MIXCLR + bit TXTCLR -; Done, reset the error code - + ; Done, reset the error code lda #TGI_ERR_OK sta ERROR + + ; Fall through + +; INSTALL routine. Is called after the driver is loaded into memory. May +; initialize anything that has to be done just once. Is probably empty +; most of the time. +; Must set an error code: NO +INSTALL: + ; Fall through + +; UNINSTALL routine. Is called before the driver is removed from memory. May +; clean up anything done by INSTALL but is probably empty most of the time. +; Must set an error code: NO +UNINSTALL: rts -; ------------------------------------------------------------------------ ; DONE: Will be called to switch the graphics device back into text mode. ; The graphics kernel will never call DONE when no graphics mode is active, ; so there is no need to protect against that. -; ; Must set an error code: NO -; - -DONE = TEXT +DONE: + ; Switch into text mode + bit TXTSET + bit LOWSCR + + .ifdef __APPLE2ENH__ + ; Restore 80 column store + lda Set80 + bpl :+ + sta SET80COL +: bit LORES ; Limit SET80COL-HISCR to text + .endif + rts -; ------------------------------------------------------------------------ ; GETERROR: Return the error code in A and clear it. - GETERROR: - ldx #TGI_ERR_OK lda ERROR + ldx #TGI_ERR_OK stx ERROR rts -; ------------------------------------------------------------------------ -; CONTROL: Platform/driver specific entry point. -; -; Must set an error code: YES -; - -CONTROL: - lda #TGI_ERR_INV_FUNC - sta ERROR - rts - -; ------------------------------------------------------------------------ ; CLEAR: Clears the screen. -; ; Must set an error code: NO -; - -CLEAR = HCLR +CLEAR: + bit $C082 ; Switch in ROM + jsr HCLR + bit $C080 ; Switch in LC bank 2 for R/O + rts -; ------------------------------------------------------------------------ ; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n). ; The page number is already checked to be valid by the graphics kernel. -; ; Must set an error code: NO (will only be called if page ok) -; - SETVIEWPAGE: tax - beq @L1 - bit HISCR - rts -@L1: bit LOWSCR + .assert LOWSCR + 1 = HISCR, error + lda LOWSCR,x ; No BIT absolute,X available rts -; ------------------------------------------------------------------------ ; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n). ; The page number is already checked to be valid by the graphics kernel. -; ; Must set an error code: NO (will only be called if page ok) -; - SETDRAWPAGE: tax - beq @L1 - lda #>$4000 ; Page 2 - .byte $2C -@L1: lda #>$2000 ; Page 1 - sta $E6 + beq :+ + lda #>$4000 ; Page 2 + .byte $2C ; BIT absolute +: lda #>$2000 ; Page 1 + sta PAGE rts -; ------------------------------------------------------------------------ ; SETCOLOR: Set the drawing color (in A). The new color is already checked ; to be in a valid range (0..maxcolor-1). -; ; Must set an error code: NO (will only be called if color ok) -; - SETCOLOR: + bit $C082 ; Switch in ROM tax - jmp SETHCOL + jsr SETHCOL + bit $C080 ; Switch in LC bank 2 for R/O + rts + +; CONTROL: Platform/driver specific entry point. +; Must set an error code: YES +CONTROL: + ; Fall through -; ------------------------------------------------------------------------ ; SETPALETTE: Set the palette (not available with all drivers/hardware). ; A pointer to the palette is passed in ptr1. Must set an error if palettes ; are not supported -; ; Must set an error code: YES -; - SETPALETTE: lda #TGI_ERR_INV_FUNC sta ERROR rts -; ------------------------------------------------------------------------ ; GETPALETTE: Return the current palette in A/X. Even drivers that cannot ; set the palette should return the default palette here, so there's no ; way for this function to fail. -; ; Must set an error code: NO -; - GETPALETTE: + ; Fall through -; ------------------------------------------------------------------------ ; GETDEFPALETTE: Return the default palette for the driver in A/X. All ; drivers should return something reasonable here, even drivers that don't ; support palettes, otherwise the caller has no way to determine the colors ; of the (not changeable) palette. -; ; Must set an error code: NO (all drivers must have a default palette) -; - GETDEFPALETTE: lda #DEFPALETTE rts -; ------------------------------------------------------------------------ ; SETPIXEL: Draw one pixel at X1/Y1 = ptr1/ptr2 with the current drawing ; color. The coordinates passed to this function are never outside the ; visible screen area, so there is no need for clipping inside this function. -; ; Must set an error code: NO -; +SETPIXEL: + bit $C082 ; Switch in ROM + ldx X1 + ldy X1+1 + lda Y1 + jsr HPLOT + bit $C080 ; Switch in LC bank 2 for R/O + rts SETPIXELCLIP: lda Y1+1 - bmi @finito ; y<0 + bmi :+ ; y < 0 lda X1+1 - bmi @finito ; x<0 + bmi :+ ; x < 0 lda X1 ldx X1+1 sta ADDR @@ -404,7 +402,7 @@ SETPIXELCLIP: lda xres ldy xres+1 jsr icmp ; ( x < xres ) ... - bcs @finito + bcs :+ lda Y1 ldx Y1+1 sta ADDR @@ -414,64 +412,33 @@ SETPIXELCLIP: ldy yres+1 jsr icmp ; ... && ( y < yres ) bcc SETPIXEL -@finito:rts +: rts -SETPIXEL: - ldx X1 - ldy X1+1 - lda Y1 - jmp HPLOT - -; ------------------------------------------------------------------------ ; GETPIXEL: Read the color value of a pixel and return it in A/X. The ; coordinates passed to this function are never outside the visible screen ; area, so there is no need for clipping inside this function. - - GETPIXEL: + bit $C082 ; Switch in ROM ldx X1 ldy X1+1 lda Y1 - jsr HPOSN ; 1st pixel -HBASL = $26 -HMASK = $30 - ldx #$00 - lda (HBASL),y - and HMASK - beq @L1 - inx -@L1: stx tmp1 - - lda $E0 ; which neighbour - tax - and #$01 - bne @odd - asl tmp1 - inx - .byte $24 -@odd: dex - - ldy $E1 - lda $E2 - jsr HPOSN ; 2nd pixel - ldx #$00 + jsr HPOSN lda (HBASL),y and HMASK - beq @L2 - inx -@L2: txa - ora tmp1 - ldx #$00 + asl + beq :+ ; 0 (black) + lda #$03 ; 3 (white) +: bcc :+ + adc #$03 ; += 4 (black -> black2, white -> white2) +: ldx #$00 + bit $C080 ; Switch in LC bank 2 for R/O rts -; ------------------------------------------------------------------------ ; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and ; X2/Y2 = ptr3/ptr4 using the current drawing color. -; ; Must set an error code: NO -; - LINE: + bit $C082 ; Switch in ROM ldx X1 ldy X1+1 lda Y1 @@ -479,9 +446,10 @@ LINE: lda X2 ldx X2+1 ldy Y2 - jmp HLIN + jsr HLIN + bit $C080 ; Switch in LC bank 2 for R/O + rts -; ------------------------------------------------------------------------ ; BAR: Draw a filled rectangle with the corners X1/Y1, X2/Y2, where ; X1/Y1 = ptr1/ptr2 and X2/Y2 = ptr3/ptr4 using the current drawing color. ; Contrary to most other functions, the graphics kernel will sort and clip @@ -493,13 +461,10 @@ LINE: ; (X2 >= 0) && (X2 < XRES) ; (Y1 >= 0) && (Y1 < YRES) ; (Y2 >= 0) && (Y2 < YRES) -; ; Must set an error code: NO -; - BAR: inc Y2 -@L1: lda Y2 +: lda Y2 pha lda Y1 sta Y2 @@ -508,30 +473,27 @@ BAR: sta Y2 inc Y1 cmp Y1 - bne @L1 + bne :- rts -; ------------------------------------------------------------------------ ; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the ; radius in tmp1 and the current drawing color. -; ; Must set an error code: NO -; - CIRCLE: lda RADIUS - bne @L1 + bne :+ jmp SETPIXELCLIP ; Plot as a point +: sta XX -@L1: sta XX - ; x = r; + ; x = r lda #$00 sta XX+1 sta YY sta YY+1 sta MaxO sta MaxO+1 - ; y =0; mo=0; + + ; y = 0, mo = 0 lda X1 ldx X1+1 sta XS @@ -541,97 +503,98 @@ CIRCLE: sta YS stx YS+1 ; XS/YS to remember the center - ; while (y 90þ + stx SCALE + asl ; 16 <=> 90þ asl asl asl - sta TEXTDIR + sta ROT rts - -; ------------------------------------------------------------------------ ; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the ; current text style. The text to output is given as a zero terminated ; string with address in ptr3. -; ; Must set an error code: NO -; - OUTTEXT: + bit $C082 ; Switch in ROM ldx X1 ldy X1+1 lda Y1 @@ -742,10 +703,10 @@ OUTTEXT: sta tmp3+1 ldy #$00 -@L1: lda (ptr3),y - beq @end - sub #$1F ; no controls - asl ; offset*2 +: lda (ptr3),y + beq :+ + sub #$1F ; No controls + asl ; Offset * 2 tax lda SHAPE,x add # +; Oliver Schmidt ; Based on Maciej Witkowiak's line and circle routine ; @@ -15,40 +16,72 @@ .macpack generic ; ------------------------------------------------------------------------ -; Constants -H2 = $2C -PLOT = $F800 -HLINE = $F819 -CLRTOP = $F836 -SETCOL = $F864 -SCRN = $F871 -SETGR = $FB40 -VTABZ = $FC24 +; Zero page stuff + +H2 := $2C -; ------------------------------------------------------------------------ ; ROM entry points -COUT := $FDED ; Vector to user output routine -TEXT := $F399 ; Return to text screen +TEXT := $F399 +PLOT := $F800 +HLINE := $F819 +CLRSCR := $F832 +SETCOL := $F864 +SCRN := $F871 +SETGR := $FB40 +HOME := $FC58 + +; ------------------------------------------------------------------------ + +; Variables mapped to the zero page segment variables. Some of these are +; used for passing parameters to the driver. + +X1 := ptr1 +Y1 := ptr2 +X2 := ptr3 +Y2 := ptr4 +RADIUS := tmp1 + +ADDR := tmp1 +TEMP := tmp3 +TEMP2 := tmp4 +TEMP3 := sreg +TEMP4 := sreg+1 + +; Line routine stuff (must be on zpage) + +PB := ptr3 ; (2) LINE +UB := ptr4 ; (2) LINE +ERR := regsave ; (2) LINE +NX := regsave+2 ; (2) LINE + +; Circle routine stuff (must be on zpage) + +XX := ptr3 ; (2) CIRCLE +YY := ptr4 ; (2) CIRCLE +MaxO := sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway) +XS := regsave ; (2) CIRCLE +YS := regsave+2 ; (2) CIRCLE ; ------------------------------------------------------------------------ -; Header. Includes jump table and constants. -.segment "JUMPTABLE" + .segment "JUMPTABLE" + +; Header. Includes jump table and constants. ; First part of the header is a structure that has a magic and defines the ; capabilities of the driver - .byte $74, $67, $69 ; "tgi" - .byte TGI_API_VERSION ; TGI API version number -xres: .word 40 ; X resolution -yres: .word 40 ; Y resolution - .byte 16 ; Number of drawing colors - .byte 1 ; Number of screens available - .byte 8 ; System font X size - .byte 8 ; System font Y size - .res 4, $00 ; Reserved for future extensions + .byte $74, $67, $69 ; "tgi" + .byte TGI_API_VERSION ; TGI API version number +xres: .word 40 ; X resolution +yres: .word 48 ; Y resolution + .byte 16 ; Number of drawing colors + .byte 1 ; Number of screens available + .byte 8 ; System font X size + .byte 8 ; System font Y size + .res 4, $00 ; Reserved for future extensions ; Next comes the jump table. Currently all entries must be valid and may point ; to an RTS for test versions (function not implemented). @@ -73,89 +106,42 @@ yres: .word 40 ; Y resolution .addr CIRCLE .addr TEXTSTYLE .addr OUTTEXT - .addr 0 ; IRQ entry is unused + .addr 0 ; IRQ entry is unused ; ------------------------------------------------------------------------ -; Data. - -; Variables mapped to the zero page segment variables. Some of these are -; used for passing parameters to the driver. - -X1 = ptr1 -Y1 = ptr2 -X2 = ptr3 -Y2 = ptr4 -RADIUS = tmp1 -ADDR = tmp1 -TEMP = tmp3 -TEMP2 = tmp4 -TEMP3 = sreg -TEMP4 = sreg+1 - -; Line routine stuff (must be on zpage) -PB = ptr3 ; (2) LINE -UB = ptr4 ; (2) LINE -ERR = regsave ; (2) LINE -NX = regsave+2 ; (2) LINE -; Circle stuff -XX = ptr3 ; (2) CIRCLE -YY = ptr4 ; (2) CIRCLE -MaxO = sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway) -XS = regsave ; (2) CIRCLE -YS = regsave+2 ; (2) CIRCLE + .bss ; Absolute variables used in the code -.bss +ERROR: .res 1 ; Error code -ERROR: .res 1 ; Error code - -; Line routine stuff (combined with CIRCLE to save space) +; Line routine stuff (combined with circle routine stuff to save space) OGora: -COUNT: .res 2 +COUNT: .res 2 OUkos: -NY: .res 2 +NY: .res 2 Y3: -DX: .res 1 -DY: .res 1 -AY: .res 1 - -; Constants and tables - -.rodata - -DEFPALETTE: .byte $00, $0F, $01, $0E, $03, $04, $02, $0D - .byte $09, $08, $0B, $05, $0A, $0C, $06, $07 - -.code +DX: .res 1 +DY: .res 1 +AX: .res 1 +AY: .res 1 ; ------------------------------------------------------------------------ -; INSTALL routine. Is called after the driver is loaded into memory. May -; initialize anything that has to be done just once. Is probably empty -; most of the time. -; -; Must set an error code: NO -; -INSTALL: + .rodata +; Constants and tables -; ------------------------------------------------------------------------ -; UNINSTALL routine. Is called before the driver is removed from memory. May -; clean up anything done by INSTALL but is probably empty most of the time. -; -; Must set an error code: NO -; +DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07 + .byte $08, $09, $0A, $0B, $0C, $0D, $0E, $0F -UNINSTALL: - rts +; ------------------------------------------------------------------------ + .code -; ------------------------------------------------------------------------ -; INIT: Changes an already installed device from text mode to graphics -; mode. +; INIT: Changes an already installed device from text mode to graphics mode. ; Note that INIT/DONE may be called multiple times while the driver ; is loaded, while INSTALL is only called once, so any code that is needed ; to initializes variables and so on must go here. Setting palette and @@ -163,138 +149,141 @@ UNINSTALL: ; kernel later. ; The graphics kernel will never call INIT when a graphics mode is already ; active, so there is no need to protect against that. -; ; Must set an error code: YES -; - INIT: - -; Switch into graphics mode - + ; Switch into graphics mode + bit $C082 ; Switch in ROM jsr SETGR + bit MIXCLR + bit $C080 ; Switch in LC bank 2 for R/O -; Done, reset the error code - + ; Done, reset the error code lda #TGI_ERR_OK sta ERROR + + ; Fall through + +; INSTALL routine. Is called after the driver is loaded into memory. May +; initialize anything that has to be done just once. Is probably empty +; most of the time. +; Must set an error code: NO +INSTALL: + ; Fall through + +; UNINSTALL routine. Is called before the driver is removed from memory. May +; clean up anything done by INSTALL but is probably empty most of the time. +; Must set an error code: NO +UNINSTALL: + ; Fall through + +; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n). +; The page number is already checked to be valid by the graphics kernel. +; Must set an error code: NO (will only be called if page ok) +SETVIEWPAGE: + ; Fall through + +; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n). +; The page number is already checked to be valid by the graphics kernel. +; Must set an error code: NO (will only be called if page ok) +SETDRAWPAGE: + ; Fall through + +; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y +; direction is passend in X/Y, the text direction is passed in A. +; Must set an error code: NO +TEXTSTYLE: + ; Fall through + +; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the +; current text style. The text to output is given as a zero terminated +; string with address in ptr3. +; Must set an error code: NO +OUTTEXT: rts -; ------------------------------------------------------------------------ ; DONE: Will be called to switch the graphics device back into text mode. ; The graphics kernel will never call DONE when no graphics mode is active, ; so there is no need to protect against that. -; ; Must set an error code: NO -; - -DONE = TEXT +DONE: + bit $C082 ; Switch in ROM + jsr TEXT + jsr HOME + bit $C080 ; Switch in LC bank 2 for R/O + rts -; ------------------------------------------------------------------------ ; GETERROR: Return the error code in A and clear it. - GETERROR: - ldx #TGI_ERR_OK lda ERROR + ldx #TGI_ERR_OK stx ERROR rts -; ------------------------------------------------------------------------ -; CONTROL: Platform/driver specific entry point. -; -; Must set an error code: YES -; - -CONTROL: - lda #TGI_ERR_INV_FUNC - sta ERROR - rts - -; ------------------------------------------------------------------------ ; CLEAR: Clears the screen. -; ; Must set an error code: NO -; - -CLEAR = CLRTOP - -; ------------------------------------------------------------------------ -; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n). -; The page number is already checked to be valid by the graphics kernel. -; -; Must set an error code: NO (will only be called if page ok) -; - -SETVIEWPAGE: - -; ------------------------------------------------------------------------ -; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n). -; The page number is already checked to be valid by the graphics kernel. -; -; Must set an error code: NO (will only be called if page ok) -; - -SETDRAWPAGE: +CLEAR: + bit $C082 ; Switch in ROM + jsr CLRSCR + bit $C080 ; Switch in LC bank 2 for R/O rts -; ------------------------------------------------------------------------ ; SETCOLOR: Set the drawing color (in A). The new color is already checked ; to be in a valid range (0..maxcolor-1). -; ; Must set an error code: NO (will only be called if color ok) -; +SETCOLOR: + bit $C082 ; Switch in ROM + jsr SETCOL + bit $C080 ; Switch in LC bank 2 for R/O + rts -SETCOLOR = SETCOL +; CONTROL: Platform/driver specific entry point. +; Must set an error code: YES +CONTROL: + ; Fall through -; ------------------------------------------------------------------------ ; SETPALETTE: Set the palette (not available with all drivers/hardware). ; A pointer to the palette is passed in ptr1. Must set an error if palettes ; are not supported -; ; Must set an error code: YES -; - SETPALETTE: lda #TGI_ERR_INV_FUNC sta ERROR rts -; ------------------------------------------------------------------------ ; GETPALETTE: Return the current palette in A/X. Even drivers that cannot ; set the palette should return the default palette here, so there's no ; way for this function to fail. -; ; Must set an error code: NO -; - GETPALETTE: + ; Fall through -; ------------------------------------------------------------------------ ; GETDEFPALETTE: Return the default palette for the driver in A/X. All ; drivers should return something reasonable here, even drivers that don't ; support palettes, otherwise the caller has no way to determine the colors ; of the (not changeable) palette. -; ; Must set an error code: NO (all drivers must have a default palette) -; - GETDEFPALETTE: lda #DEFPALETTE rts -; ------------------------------------------------------------------------ ; SETPIXEL: Draw one pixel at X1/Y1 = ptr1/ptr2 with the current drawing ; color. The coordinates passed to this function are never outside the ; visible screen area, so there is no need for clipping inside this function. -; ; Must set an error code: NO -; +SETPIXEL: + bit $C082 ; Switch in ROM + ldy X1 + lda Y1 + jsr PLOT + bit $C080 ; Switch in LC bank 2 for R/O + rts SETPIXELCLIP: lda Y1+1 - bmi @finito ; y<0 + bmi :+ ; y < 0 lda X1+1 - bmi @finito ; x<0 + bmi :+ ; x < 0 lda X1 ldx X1+1 sta ADDR @@ -303,7 +292,7 @@ SETPIXELCLIP: lda xres ldy xres+1 jsr icmp ; ( x < xres ) ... - bcs @finito + bcs :+ lda Y1 ldx Y1+1 sta ADDR @@ -313,35 +302,25 @@ SETPIXELCLIP: ldy yres+1 jsr icmp ; ... && ( y < yres ) bcc SETPIXEL -@finito:rts - -SETPIXEL: - lda X1 - ldy Y1 - jmp PLOT +: rts -; ------------------------------------------------------------------------ ; GETPIXEL: Read the color value of a pixel and return it in A/X. The ; coordinates passed to this function are never outside the visible screen ; area, so there is no need for clipping inside this function. - - GETPIXEL: - lda X1 - ldy Y1 + bit $C082 ; Switch in ROM + ldy X1 + lda Y1 jsr SCRN ldx #$00 + bit $C080 ; Switch in LC bank 2 for R/O rts -; ------------------------------------------------------------------------ ; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and ; X2/Y2 = ptr3/ptr4 using the current drawing color. -; ; Must set an error code: NO -; - LINE: - ; nx = abs(x2 - x1) + ; nx = abs (x2 - x1) lda X2 sub X1 sta NX @@ -352,7 +331,8 @@ LINE: jsr abs sta NX sty NX+1 - ; ny = abs(y2 - y1) + + ; ny = abs (y2 - y1) lda Y2 sub Y1 sta NY @@ -363,47 +343,54 @@ LINE: jsr abs sta NY sty NY+1 - ; if (x2>x1) + + ; if (x2 >= x1) ldx #X2 lda X1 ldy X1+1 jsr icmp - bcc @L0243 - beq @L0243 - ; dx = 1; + bcc :+ + + ; dx = 1 lda #$01 - bne @L0244 + bne :++ + ; else - ; dx = -1; -@L0243: lda #$FF -@L0244: sta DX - ; if (y2>y1) + ; dx = -1 +: lda #$FF +: sta DX + + ; if (y2 >= y1) ldx #Y2 lda Y1 ldy Y1+1 jsr icmp - bcc @L024A - beq @L024A - ; dy = 1; + bcc :+ + + ; dy = 1 lda #$01 - bne @L024B + bne :++ + ; else - ; dy = -1; -@L024A: lda #$FF -@L024B: sta DY - ; err = ay = 0; + ; dy = -1 +: lda #$FF +: sta DY + + ; err = ax = ay = 0 lda #$00 sta ERR sta ERR+1 + sta AX sta AY - ; if (nx ny + bcs :+ + + ; nx <-> ny lda NX ldx NY sta NY @@ -412,30 +399,40 @@ LINE: ldx NY+1 sta NY+1 stx NX+1 - ; ay = dx + + ; ax = dx lda DX + sta AX + + ; ay = dy + lda DY sta AY - ; dx = dy = 0; + + ; dx = dy = 0 } lda #$00 sta DX sta DY - ; ny = - ny; -@L0255: lda NY + + ; ny = - ny +: lda NY ldy NY+1 jsr neg sta NY sty NY+1 - ; for (count=nx;count>0;--count) { + + ; for (count = nx; count > 0; --count) { lda NX ldx NX+1 sta COUNT stx COUNT+1 -@L0166: lda COUNT ; count>0 +for: lda COUNT ; count > 0 ora COUNT+1 - bne @L0167 + bne :+ rts - ; setpixel(X1,Y1) -@L0167: jsr SETPIXELCLIP + + ; setpixel (X1, Y1) +: jsr SETPIXELCLIP + ; pb = err + ny lda ERR add NY @@ -444,6 +441,7 @@ LINE: adc NY+1 sta PB+1 tax + ; ub = pb + nx lda PB add NX @@ -451,27 +449,30 @@ LINE: txa adc NX+1 sta UB+1 + ; x1 = x1 + dx ldx #$00 lda DX - bpl @L027B + bpl :+ dex -@L027B: add X1 +: add X1 sta X1 txa adc X1+1 sta X1+1 - ; y1 = y1 + ay + + ; y1 = y1 + ay ldx #$00 lda AY - bpl @L027E + bpl :+ dex -@L027E: add Y1 +: add Y1 sta Y1 txa adc Y1+1 sta Y1+1 - ; if (abs(pb)= 0) && (X2 < XRES) ; (Y1 >= 0) && (Y1 < YRES) ; (Y2 >= 0) && (Y2 < YRES) -; ; Must set an error code: NO -; - BAR: + bit $C082 ; Switch in ROM inc Y2 ldx X2 stx H2 -@L1: ldy X1 +: ldy X1 lda Y1 jsr HLINE inc Y1 lda Y2 cmp Y1 - bne @L1 + bne :- + bit $C080 ; Switch in LC bank 2 for R/O rts -; ------------------------------------------------------------------------ ; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the ; radius in tmp1 and the current drawing color. -; ; Must set an error code: NO -; - CIRCLE: lda RADIUS - bne @L1 + bne :+ jmp SETPIXELCLIP ; Plot as a point +: sta XX -@L1: sta XX - ; x = r; + ; x = r lda #$00 sta XX+1 sta YY sta YY+1 sta MaxO sta MaxO+1 - ; y =0; mo=0; + + ; y = 0, mo = 0 lda X1 ldx X1+1 sta XS @@ -583,97 +581,98 @@ CIRCLE: sta YS stx YS+1 ; XS/YS to remember the center - ; while (yJOY_ERR_OK -; rts ; Run into UNINSTALL instead + ; Fall through -; ------------------------------------------------------------------------ ; UNINSTALL routine. Is called before the driver is removed from memory. ; Can do cleanup or whatever. Must not return anything. -; - UNINSTALL: rts - -; ------------------------------------------------------------------------ ; COUNT: Return the total number of available joysticks in a/x. -; - COUNT: - lda #JOY_COUNT + lda #$02 ; Number of joysticks we support + ldx #$00 rts -; ------------------------------------------------------------------------ ; READ: Read a particular joystick passed in A. -; - READJOY: - and #$01 ; Fix joystick number - asl a ; - tax ; Joystick number (0,2) into X - -; Read joystick - - lda BUTN0,x ; Check fire button - and #$80 ; BTN 0 0 0 0 0 0 0 - + bit $C082 ; Switch in ROM + and #$01 ; Restrict joystick number + + ; Read horizontal paddle + asl ; Joystick number -> paddle number + tax ; Set paddle number (0, 2) + jsr PREAD ; Read paddle value + lda #$00 ; 0 0 0 0 0 0 0 0 + cpy #127 - THRESHOLD + ror ; !LEFT 0 0 0 0 0 0 0 + cpy #127 + THRESHOLD + ror ; RIGHT !LEFT 0 0 0 0 0 0 + + ; Read vertical paddle pha - jsr PREAD ; Read first paddle value + inx ; Set paddle number (1, 3) + jsr PREAD ; Read paddle value pla - cpy #127-OFFS - ror a ; /LEFT BTN 0 0 0 0 0 0 - cpy #127+OFFS - ror a ; RIGHT /LEFT BTN 0 0 0 0 0 - - inx - pha - jsr PREAD ; Read second paddle - pla - cpy #127-OFFS - ror a ; /UP RIGHT /LEFT BTN 0 0 0 0 - cpy #127+OFFS - ror a ; DOWN /UP RIGHT /LEFT BTN 0 0 0 - eor #%01010000 ; DOWN UP RIGHT LEFT BTN 0 0 0 - - ldx #$00 ; fix X + cpy #127 - THRESHOLD + ror ; !UP RIGHT !LEFT 0 0 0 0 0 + cpy #127 + THRESHOLD + ror ; DOWN !UP RIGHT !LEFT 0 0 0 0 + + ; Read primary button + tay + lda BUTN0-1,x ; Check button (1, 3) + asl + tya + ror ; FIRE DOWN !UP RIGHT !LEFT 0 0 0 + + ; Read secondary button + tay + inx + txa + and #$03 ; IIgs has fourth button at TAPEIN + tax + lda BUTN0-1,x ; Check button (2, 0) + asl + tya + ror ; FIRE2 FIRE DOWN !UP RIGHT !LEFT 0 0 + + ; Finalize + eor #%00010100 ; FIRE2 FIRE DOWN UP RIGHT LEFT 0 0 + ldx #$00 + bit $C080 ; Switch in LC bank 2 for R/O rts - - diff --git a/libsrc/apple2/apple2-stdmou.s b/libsrc/apple2/apple2-stdmou.s index 13b6c3ee3..0cedfcac4 100644 --- a/libsrc/apple2/apple2-stdmou.s +++ b/libsrc/apple2/apple2-stdmou.s @@ -147,31 +147,16 @@ next: inc ptr1+1 asl sta yparam+1 - .ifdef __APPLE2ENH__ - ; Save LC read state - ldx #127 if 80 column store enabled RD80VID := $C01F ; >127 if 80 column video enabled ; Character set switches @@ -49,6 +50,8 @@ LCBANK2 := $C083 ; Swap in LC bank 2 LCBANK1 := $C08B ; Swap in LC bank 1 ; Video mode switches +TXTCLR := $C050 ; Display graphics +TXTSET := $C051 ; Display text MIXCLR := $C052 ; Disable 4 lines of text MIXSET := $C053 ; Enable 4 lines of text LOWSCR := $C054 ; Page 1 diff --git a/libsrc/apple2/cout.s b/libsrc/apple2/cout.s new file mode 100644 index 000000000..62d2a08f0 --- /dev/null +++ b/libsrc/apple2/cout.s @@ -0,0 +1,20 @@ +; +; Oliver Schmidt, 03.03.2007 +; +; COUT routine +; + + .export COUT + + .include "apple2.inc" + + .segment "LOWCODE" + +COUT: + ; Switch in ROM and call COUT + bit $C082 + jsr $FDED ; Vector to user output routine + + ; Switch in LC bank 2 for R/O and return + bit $C080 + rts diff --git a/libsrc/apple2/crt0.s b/libsrc/apple2/crt0.s index 4be1d0eb7..bc3771832 100644 --- a/libsrc/apple2/crt0.s +++ b/libsrc/apple2/crt0.s @@ -8,20 +8,24 @@ .import zerobss .import initlib, donelib .import callmain, callirq - .import COUT - .import __STARTUP_LOAD__, __BSS_LOAD__ ; Linker generated + .import __RAM_START__ , __RAM_LAST__ ; Linker generated + .import __MOVE_START__, __MOVE_LAST__ ; Linker generated + .import __LC_START__ , __LC_LAST__ ; Linker generated + .import __BSS_RUN__ , __INIT_SIZE__ ; Linker generated .import __INTERRUPTOR_COUNT__ ; Linker generated .include "zeropage.inc" .include "apple2.inc" - .include "mli.inc" + + .linecont + ; ------------------------------------------------------------------------ .segment "EXEHDR" - .addr __STARTUP_LOAD__ ; Start address - .word __BSS_LOAD__ - __STARTUP_LOAD__ ; Size + .addr __RAM_START__ ; Start address + .word __BSS_RUN__ - __RAM_START__ + \ + __MOVE_LAST__ - __MOVE_START__ ; Size ; ------------------------------------------------------------------------ @@ -33,13 +37,64 @@ ldx #$FF txs ; Init stack pointer - ; Delegate all further processing to keep STARTUP small + ; Switch in LC bank 2 for W/O + bit $C081 + bit $C081 + + ; Set source start address + lda #<(__BSS_RUN__ + __INIT_SIZE__) + ldy #>(__BSS_RUN__ + __INIT_SIZE__) + sta $9B + sty $9C + + ; Set source last address + lda #<(__BSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) + ldy #>(__BSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__) + sta $96 + sty $97 + + ; Set destination last address + lda #<__LC_LAST__ + ldy #>__LC_LAST__ + sta $94 + sty $95 + + ; Call into Applesoft Block Transfer Utility - which handles zero + ; sized blocks well - to move content of the LC memory area + jsr $D396 ; BLTU + 3 + + ; Set source start address + lda #<__BSS_RUN__ + ldy #>__BSS_RUN__ + sta $9B + sty $9C + + ; Set source last address + lda #<(__BSS_RUN__ + __INIT_SIZE__) + ldy #>(__BSS_RUN__ + __INIT_SIZE__) + sta $96 + sty $97 + + ; Set destination last address + lda #<__RAM_LAST__ + ldy #>__RAM_LAST__ + sta $94 + sty $95 + + ; Call into Applesoft Block Transfer Utility - which handles moving + ; overlapping blocks upwards well - to move the INIT segment + jsr $D396 ; BLTU + 3 + + ; Delegate all further processing to keep the STARTUP segment small jsr init ; Avoid re-entrance of donelib. This is also the _exit entry _exit: ldx #exit jsr reset ; Setup RESET vector + + ; Switch in ROM in case it wasn't already switched in by a RESET + bit $C082 ; Call module destructors jsr donelib @@ -50,7 +105,7 @@ _exit: ldx #_exit jsr reset ; Setup RESET vector - ; Clear the BSS data - jsr zerobss - ; Setup the stack lda HIMEM sta sp @@ -116,12 +171,12 @@ init: ldx #zpspace-1 beq :+ ; Check for ProDOS - lda ENTRY + lda $BF00 ; MLI call entry point cmp #$4C ; Is MLI present? (JMP opcode) bne prterr ; Allocate interrupt vector table entry - jsr ENTRY + jsr $BF00 ; MLI call entry point .byte $40 ; Alloc interrupt .addr params bcs prterr @@ -133,13 +188,16 @@ init: ldx #zpspace-1 ; Call module constructors : jsr initlib + ; Switch in LC bank 2 for R/O + bit $C080 + ; Push arguments and call main() jmp callmain ; Print error message and return prterr: ldx #msglen-1 : lda errmsg,x - jsr COUT + jsr $FDED ; COUT dex bpl :- rts @@ -184,10 +242,6 @@ intrpt: cld : sec rts -; ------------------------------------------------------------------------ - - .code - ; Setup RESET vector reset: stx SOFTEV sta SOFTEV+1 @@ -201,8 +255,12 @@ reset: stx SOFTEV zpsave: .res zpspace -rvsave: .res 3 - params: .byte $02 ; Parameter count intnum: .byte $00 ; Interrupt number - .addr intrpt ; Interrupt handler \ No newline at end of file + .addr intrpt ; Interrupt handler + +; ------------------------------------------------------------------------ + + .bss + +rvsave: .res 3 diff --git a/libsrc/apple2/filedes.s b/libsrc/apple2/filedes.s index 3a480f6a2..e177acbe4 100644 --- a/libsrc/apple2/filedes.s +++ b/libsrc/apple2/filedes.s @@ -17,7 +17,6 @@ getfd: cmp #MAX_FDS bcs error - ; Convert handle to fdtab slot .assert .sizeof(FD) = 4, error asl diff --git a/libsrc/apple2/gotoxy.s b/libsrc/apple2/gotoxy.s index 9a2587f5a..0c6c800be 100644 --- a/libsrc/apple2/gotoxy.s +++ b/libsrc/apple2/gotoxy.s @@ -6,7 +6,6 @@ ; .export _gotoxy, _gotox - .import popa, VTABZ .include "apple2.inc" diff --git a/libsrc/apple2/gotoy.s b/libsrc/apple2/gotoy.s index e59de2d01..66d929c34 100644 --- a/libsrc/apple2/gotoy.s +++ b/libsrc/apple2/gotoy.s @@ -5,7 +5,6 @@ ; .export _gotoy - .import VTABZ .include "apple2.inc" diff --git a/libsrc/apple2/home.s b/libsrc/apple2/home.s new file mode 100644 index 000000000..de5334c93 --- /dev/null +++ b/libsrc/apple2/home.s @@ -0,0 +1,20 @@ +; +; Oliver Schmidt, 03.03.2007 +; +; HOME routine +; + + .export HOME + + .include "apple2.inc" + + .segment "LOWCODE" + +HOME: + ; Switch in ROM and call HOME + bit $C082 + jsr $FC58 ; Clear current text screen + + ; Switch in LC bank 2 for R/O and return + bit $C080 + rts diff --git a/libsrc/apple2/opendir.c b/libsrc/apple2/opendir.c index 5879f7448..ad415705a 100644 --- a/libsrc/apple2/opendir.c +++ b/libsrc/apple2/opendir.c @@ -57,9 +57,9 @@ extern char _cwd[FILENAME_MAX]; -DIR* __fastcall__ opendir (const char* name) +DIR* __fastcall__ opendir (register const char* name) { - DIR* dir; + register DIR* dir; /* Alloc DIR */ if ((dir = malloc (sizeof (*dir))) == NULL) { diff --git a/libsrc/apple2/rcout.s b/libsrc/apple2/rcout.s deleted file mode 100644 index 1b8cce749..000000000 --- a/libsrc/apple2/rcout.s +++ /dev/null @@ -1,10 +0,0 @@ -; -; Ullrich von Bassewitz, 2004-06-03 -; -; Rom COUT routine -; - - .export COUT - -COUT := $FDED ; Vector to user output routine - diff --git a/libsrc/apple2/rdkey.s b/libsrc/apple2/rdkey.s new file mode 100644 index 000000000..d07888844 --- /dev/null +++ b/libsrc/apple2/rdkey.s @@ -0,0 +1,20 @@ +; +; Oliver Schmidt, 03.03.2007 +; +; RDKEY routine +; + + .export RDKEY + + .include "apple2.inc" + + .segment "LOWCODE" + +RDKEY: + ; Switch in ROM and call RDKEY + bit $C082 + jsr $FD0C ; Display prompt and read key from user input routine + + ; Switch in LC bank 2 for R/O and return + bit $C080 + rts diff --git a/libsrc/apple2/readdir.c b/libsrc/apple2/readdir.c index 188d46045..eaa196bac 100644 --- a/libsrc/apple2/readdir.c +++ b/libsrc/apple2/readdir.c @@ -43,9 +43,9 @@ -struct dirent* __fastcall__ readdir (DIR* dir) +struct dirent* __fastcall__ readdir (register DIR* dir) { - unsigned char* entry; + register unsigned char* entry; /* Search for the next active directory entry */ do { diff --git a/libsrc/apple2/rewinddir.c b/libsrc/apple2/rewinddir.c index b1099a86a..083d3240b 100644 --- a/libsrc/apple2/rewinddir.c +++ b/libsrc/apple2/rewinddir.c @@ -44,7 +44,7 @@ -void __fastcall__ rewinddir (DIR* dir) +void __fastcall__ rewinddir (register DIR* dir) { /* Rewind directory file */ if (lseek (dir->fd, 0, SEEK_SET)) { diff --git a/libsrc/apple2/rom.s b/libsrc/apple2/rom.s deleted file mode 100644 index 6d5ea5d70..000000000 --- a/libsrc/apple2/rom.s +++ /dev/null @@ -1,53 +0,0 @@ -; -; Oliver Schmidt, 30.05.2004 -; -; Apple2 ROM routines -; - - .export TEXT - .export HGR2 - .export HGR - .export HCLR - .export BKGND - .export HPOSN - .export HPLOT - .export HLIN - .export HFIND - .export DRAW - .export XDRAW - .export SETHCOL - -; Graphics entry points, by cbmnut (applenut??) cbmnut@hushmail.com -TEXT := $F399 ; Return to text screen -HGR2 := $F3D8 ; Initialize and clear hi-res page 2. -HGR := $F3E2 ; Initialize and clear hi-res page 1. -HCLR := $F3F2 ; Clear the current hi-res screen to black. -BKGND := $F3F6 ; Clear the current hi-res screen to the - ; last plotted color (from ($1C). -HPOSN := $F411 ; Positions the hi-res cursor without - ; plotting a point. - ; Enter with (A) = Y-coordinate, and - ; (Y,X) = X-coordinate. -HPLOT := $F457 ; Calls HPOSN and tries to plot a dot at - ; the cursor's position. If you are - ; trying to plot a non-white color at - ; a complementary color position, no - ; dot will be plotted. -HLIN := $F53A ; Draws a line from the last plotted - ; point or line destination to: - ; (X,A) = X-coordinate, and - ; (Y) = Y-coordinate. -HFIND := $F5CB ; Converts the hi-res coursor's position - ; back to X- and Y-coordinates; stores - ; X-coordinate at $E0,E1 and Y-coordinate - ; at $E2. -DRAW := $F601 ; Draws a shape. Enter with (Y,X) = the - ; address of the shape table, and (A) = - ; the rotation factor. Uses the current - ; color. -XDRAW := $F65D ; Draws a shape by inverting the existing - ; color of the dots the shape draws over. - ; Same entry parameters as DRAW. -SETHCOL := $F6EC ; Set the hi-res color to (X), where (X) - ; must be between 0 and 7. - diff --git a/libsrc/apple2/rpread.s b/libsrc/apple2/rpread.s deleted file mode 100644 index 66514c2f5..000000000 --- a/libsrc/apple2/rpread.s +++ /dev/null @@ -1,10 +0,0 @@ -; -; Ullrich von Bassewitz, 2004-06-03 -; -; Rom PREAD routine -; - - .export PREAD - -PREAD := $FB1E ; Read paddle in X, return AD conv. value in Y - diff --git a/libsrc/apple2/rrdkey.s b/libsrc/apple2/rrdkey.s deleted file mode 100644 index 096bb759f..000000000 --- a/libsrc/apple2/rrdkey.s +++ /dev/null @@ -1,10 +0,0 @@ -; -; Ullrich von Bassewitz, 2004-06-03 -; -; Rom RDKEY routine -; - - .export RDKEY - -RDKEY := $FD0C ; Display prompt and read key from user input routine - diff --git a/libsrc/apple2/rvtabz.s b/libsrc/apple2/rvtabz.s deleted file mode 100644 index eea0ef4f6..000000000 --- a/libsrc/apple2/rvtabz.s +++ /dev/null @@ -1,9 +0,0 @@ -; -; Ullrich von Bassewitz, 2004-06-03 -; -; Rom VTABZ routine -; - - .export VTABZ - -VTABZ := $FC24 ; Generate text base address diff --git a/libsrc/apple2/tgi_mode_table.s b/libsrc/apple2/tgi_mode_table.s index 20d7820a2..f0f91483e 100644 --- a/libsrc/apple2/tgi_mode_table.s +++ b/libsrc/apple2/tgi_mode_table.s @@ -14,16 +14,14 @@ ; BEWARE: The current implementation of tgi_map_mode does not work with tables ; larger that 255 bytes! -.rodata + .rodata _tgi_mode_table: .ifdef __APPLE2ENH__ - .byte TGI_MODE_280_192_6, "A2E.HI.TGI", 0 - .byte TGI_MODE_40_40_16, "A2E.LO.TGI", 0 -; .byte TGI_MODE_560_192_2, "A2E.DHI.TGI", 0 + .byte TGI_MODE_280_192_8, "A2E.HI.TGI", 0 + .byte TGI_MODE_40_48_16, "A2E.LO.TGI", 0 .else - .byte TGI_MODE_280_192_6, "A2.HI.TGI", 0 - .byte TGI_MODE_40_40_16, "A2.LO.TGI", 0 -; .byte TGI_MODE_560_192_2, "A2.DHI.TGI", 0 + .byte TGI_MODE_280_192_8, "A2.HI.TGI", 0 + .byte TGI_MODE_40_48_16, "A2.LO.TGI", 0 .endif - .byte 0 ; End marker + .byte 0 ; End marker diff --git a/libsrc/apple2/vtabz.s b/libsrc/apple2/vtabz.s new file mode 100644 index 000000000..5ad350598 --- /dev/null +++ b/libsrc/apple2/vtabz.s @@ -0,0 +1,20 @@ +; +; Oliver Schmidt, 03.03.2007 +; +; VTABZ routine +; + + .export VTABZ + + .include "apple2.inc" + + .segment "LOWCODE" + +VTABZ: + ; Switch in ROM and call VTABZ + bit $C082 + jsr $FC24 ; Generate text base address + + ; Switch in LC bank 2 and return + bit $C080 + rts diff --git a/libsrc/apple2enh/Makefile b/libsrc/apple2enh/Makefile index 59d64c871..d3da3ca62 100644 --- a/libsrc/apple2enh/Makefile +++ b/libsrc/apple2enh/Makefile @@ -57,6 +57,7 @@ S_OBJS= _scrsize.o \ close.o \ clrscr.o \ color.o \ + cout.o \ cputc.o \ crt0.o \ ctype.o \ @@ -75,6 +76,7 @@ S_OBJS= _scrsize.o \ get_ostype.o \ gotoxy.o \ gotoy.o \ + home.o \ initcwd.o \ joy_stddrv.o \ kbhit.o \ @@ -85,14 +87,9 @@ S_OBJS= _scrsize.o \ oserrlist.o \ oserror.o \ randomize.o \ - rcout.o \ + rdkey.o \ read.o \ revers.o \ - rhome.o \ - rom.o \ - rpread.o \ - rrdkey.o \ - rvtabz.o \ rwcommon.o \ syschdir.o \ sysmkdir.o \ @@ -103,6 +100,7 @@ S_OBJS= _scrsize.o \ sysuname.o \ textframe.o \ tgi_mode_table.o\ + vtabz.o \ wherex.o \ wherey.o \ write.o @@ -110,7 +108,7 @@ S_OBJS= _scrsize.o \ #-------------------------------------------------------------------------- # Drivers -EMDS = apple2-auxmem.emd apple2-lc.emd +EMDS = apple2-auxmem.emd JOYS = apple2-stdjoy.joy @@ -118,7 +116,7 @@ MOUS = apple2-stdmou.mou SERS = apple2-ssc.ser -TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi +TGIS = apple2-280-192-8.tgi apple2-40-48-16.tgi #-------------------------------------------------------------------------- # Targets diff --git a/samples/Makefile b/samples/Makefile index 78b4ca93a..ed9cd09c5 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -83,7 +83,7 @@ gunzip65: $(CRT0) gunzip65.o $(CLIB) hello: $(CRT0) hello.o $(CLIB) @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ -# The apple machines need the start address adjusted for the mandelbrot demo +# The Apple machines need the start address adjusted for the mandelbrot demo ifeq "$(SYS)" "apple2" mandelbrot: $(CRT0) mandelbrot.o $(CLIB) @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ @@ -115,7 +115,7 @@ plasma: $(CRT0) plasma.o $(CLIB) sieve: $(CRT0) sieve.o $(CLIB) @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ -# The apple machines need the start address adjusted for the tgidemo +# The Apple machines need the start address adjusted for the tgidemo ifeq "$(SYS)" "apple2" tgidemo: $(CRT0) tgidemo.o $(CLIB) @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ diff --git a/samples/mandelbrot.c b/samples/mandelbrot.c index 507eb99dc..333fb65db 100644 --- a/samples/mandelbrot.c +++ b/samples/mandelbrot.c @@ -15,13 +15,13 @@ /* Graphics definitions */ #if defined(__APPLE2__) || defined(__APPLE2ENH__) -# define GRAPHMODE TGI_MODE_280_192_6 +# define GRAPHMODE TGI_MODE_280_192_8 #else # define GRAPHMODE TGI_MODE_320_200_2 #endif -#define SCREEN_X (tgi_getmaxx()+1) -#define SCREEN_Y (tgi_getmaxy()+1) -#define MAXCOL (tgi_getmaxcolor()+1) +#define SCREEN_X (tgi_getxres()) +#define SCREEN_Y (tgi_getyres()) +#define MAXCOL (tgi_getcolorcount()) #define maxiterations 32 #define fpshift (10) diff --git a/samples/tgidemo.c b/samples/tgidemo.c index f7ce8c118..a2ed57a96 100644 --- a/samples/tgidemo.c +++ b/samples/tgidemo.c @@ -8,15 +8,12 @@ #if defined(__APPLE2__) || defined(__APPLE2ENH__) -# define TGI_MODE TGI_MODE_280_192_6 -# define PAL_BACK 0 -# define PAL_FORE 3 -# define COLOR_LIGHTRED 0 /* Dummy */ +# define TGI_MODE TGI_MODE_280_192_8 #else -# define TGI_MODE TGI_MODE_320_200_2 -# define PAL_BACK 0 -# define PAL_FORE 1 +# define TGI_MODE TGI_MODE_320_200_2 #endif +#define COLOR_BACK COLOR_BLACK +#define COLOR_FORE COLOR_WHITE /*****************************************************************************/ @@ -33,7 +30,7 @@ static const unsigned char SinusTable[] = { 0x22,0x20,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19,0x18, 0x17,0x16,0x15,0x14,0x13,0x12,0x12,0x11,0x10,0x10, 0x0F,0x0E,0x0E,0x0D,0x0D,0x0C,0x0C,0x0C,0x0B,0x0B, - 0x0B,0x0B,0x0B,0x0B,0x0B,0x0A,0x0B,0x0B,0x0B,0x0B, + 0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B, 0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E, 0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16, 0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20, @@ -48,7 +45,7 @@ static const unsigned char SinusTable[] = { 0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0, 0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB6,0xB7,0xB8,0xB8, 0xB9,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xBD,0xBD, - 0xBD,0xBD,0xBD,0xBD,0xBD,0xBE,0xBD,0xBD,0xBD,0xBD, + 0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD, 0xBD,0xBD,0xBD,0xBC,0xBC,0xBC,0xBB,0xBB,0xBA,0xBA, 0xB9,0xB8,0xB8,0xB7,0xB6,0xB6,0xB5,0xB4,0xB3,0xB2, 0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8, @@ -61,8 +58,8 @@ static const unsigned char SinusTable[] = { /* Driver stuff */ -static unsigned XRes; -static unsigned YRes; +static unsigned MaxX; +static unsigned MaxY; @@ -99,22 +96,22 @@ static void DoWarning (void) static void DoCircles (void) { - static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_LIGHTRED }; + static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_ORANGE }; unsigned char I; - unsigned char Color = PAL_FORE; - unsigned X = XRes / 2; - unsigned Y = YRes / 2; + unsigned char Color = COLOR_FORE; + unsigned X = MaxX / 2; + unsigned Y = MaxY / 2; tgi_setpalette (Palette); while (!kbhit ()) { - tgi_setcolor (PAL_FORE); - tgi_line (0, 0, XRes-1, YRes-1); - tgi_line (0, YRes-1, XRes-1, 0); + tgi_setcolor (COLOR_FORE); + tgi_line (0, 0, MaxX, MaxY); + tgi_line (0, MaxY, MaxX, 0); tgi_setcolor (Color); for (I = 10; I < 240; I += 10) { tgi_circle (X, Y, I); } - Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE; + Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE; } cgetc (); @@ -130,22 +127,22 @@ static void DoCheckerboard (void) unsigned char Color; tgi_setpalette (Palette); - Color = PAL_BACK; + Color = COLOR_BACK; while (1) { - for (Y = 0; Y < YRes; Y += 10) { - for (X = 0; X < XRes; X += 10) { + for (Y = 0; Y <= MaxY; Y += 10) { + for (X = 0; X <= MaxX; X += 10) { tgi_setcolor (Color); tgi_bar (X, Y, X+9, Y+9); - Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE; + Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE; if (kbhit ()) { cgetc (); tgi_clear (); return; } } - Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE; + Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE; } - Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE; + Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE; } } @@ -157,14 +154,14 @@ static void DoDiagram (void) unsigned X, I; tgi_setpalette (Palette); - tgi_setcolor (PAL_FORE); - tgi_line (10, 10, 10, YRes-10); - tgi_lineto (XRes-10, YRes-10); + tgi_setcolor (COLOR_FORE); + tgi_line (10, 10, 10, MaxY-10); + tgi_lineto (MaxX-10, MaxY-10); tgi_line (8, 12, 10, 10); tgi_lineto (12, 12); - tgi_line (XRes-12, YRes-12, XRes-10, YRes-10); - tgi_lineto (XRes-12, YRes-8); - for (I = 0, X = 10; X < XRes-10; ++X) { + tgi_line (MaxX-12, MaxY-12, MaxX-10, MaxY-10); + tgi_lineto (MaxX-12, MaxY-8); + for (I = 0, X = 10; X < MaxX-10; ++X) { tgi_setpixel (X, SinusTable[I]); if (++I >= sizeof (SinusTable)) { I = 0; @@ -183,13 +180,13 @@ static void DoLines (void) unsigned X; tgi_setpalette (Palette); - tgi_setcolor (PAL_FORE); + tgi_setcolor (COLOR_FORE); - for (X = 0; X < YRes; X+=10) { - tgi_line (0, 0, YRes, X); - tgi_line (0, 0, X, YRes); - tgi_line (YRes, YRes, 0, YRes-X); - tgi_line (YRes, YRes, YRes-X, 0); + for (X = 0; X <= MaxY; X += 10) { + tgi_line (0, 0, MaxY, X); + tgi_line (0, 0, X, MaxY); + tgi_line (MaxY, MaxY, 0, MaxY-X); + tgi_line (MaxY, MaxY, MaxY-X, 0); } cgetc (); @@ -212,8 +209,8 @@ int main (void) CheckError ("tgi_init"); /* Get stuff from the driver */ - XRes = tgi_getxres (); - YRes = tgi_getyres (); + MaxX = tgi_getmaxx (); + MaxY = tgi_getmaxy (); /* Set the palette, set the border color */ Border = bordercolor (COLOR_BLACK); diff --git a/src/ld65/cfg/apple2.cfg b/src/ld65/cfg/apple2.cfg index 2461b1306..9ef6f3271 100644 --- a/src/ld65/cfg/apple2.cfg +++ b/src/ld65/cfg/apple2.cfg @@ -1,37 +1,39 @@ FEATURES { - STARTADDRESS: default = $0800; + STARTADDRESS: default = $0803; } MEMORY { - ZP: start = $0080, size = $001A, define = yes; + ZP: start = $0080, size = $001A, define = yes; HEADER: start = $0000, size = $0004, file = %O; - RAM: start = %S, size = $9600 - %S, file = %O; + RAM: start = %S, size = $9600 - %S, file = %O, define = yes; + MOVE: start = $0000, size = $FFFF, file = %O, define = yes; + LC: start = $D400, size = $0C00, define = yes; } SEGMENTS { - EXEHDR: load = HEADER, type = ro; - STARTUP: load = RAM, type = ro, define = yes; - LOWCODE: load = RAM, type = ro, optional = yes; - INIT: load = RAM, type = ro, define = yes, optional = yes; - CODE: load = RAM, type = ro; - RODATA: load = RAM, type = ro; - DATA: load = RAM, type = rw; - BSS: load = RAM, type = bss, define = yes; - HEAP: load = RAM, type = bss, optional = yes; # must sit just below stack - ZEROPAGE: load = ZP, type = zp; + ZEROPAGE: load = ZP, type = zp; + EXEHDR: load = HEADER, type = ro; + STARTUP: load = RAM, type = ro; + LOWCODE: load = RAM, type = ro; + CODE: load = RAM, type = ro; + RODATA: load = RAM, type = ro; + DATA: load = RAM, type = rw; + BSS: load = RAM, type = bss, define = yes; + INIT: load = MOVE, run = RAM, type = ro, define = yes; + HIGHCODE: load = MOVE, run = LC, type = ro, optional = yes; } FEATURES { CONDES: segment = INIT, - type = constructor, - label = __CONSTRUCTOR_TABLE__, - count = __CONSTRUCTOR_COUNT__; + type = constructor, + label = __CONSTRUCTOR_TABLE__, + count = __CONSTRUCTOR_COUNT__; CONDES: segment = RODATA, - type = destructor, - label = __DESTRUCTOR_TABLE__, - count = __DESTRUCTOR_COUNT__; + type = destructor, + label = __DESTRUCTOR_TABLE__, + count = __DESTRUCTOR_COUNT__; CONDES: type = interruptor, - segment = RODATA, - label = __INTERRUPTOR_TABLE__, - count = __INTERRUPTOR_COUNT__; + segment = RODATA, + label = __INTERRUPTOR_TABLE__, + count = __INTERRUPTOR_COUNT__; } SYMBOLS { - __STACKSIZE__ = $800; # 2K stack + __STACKSIZE__ = $0800; # 2k stack } -- 2.39.5