From 11fbab1281a5f25a6e0b498a42080d49956cba84 Mon Sep 17 00:00:00 2001 From: Curtis F Kaylor Date: Wed, 7 Nov 2018 00:11:09 -0500 Subject: [PATCH] Updated standard library include files --- include/appl2std.a02 | 8 +-- include/appl2std.h02 | 6 +- include/atari/color.a02 | 43 ++++++++++++ include/atari/joystk.a02 | 22 +++++++ include/atari/joystk.h02 | 15 +++++ include/atari/lgtpen.a02 | 21 ++++++ include/atari/lgtpen.h02 | 5 ++ include/atari/paddle.a02 | 33 ++++++++++ include/atari/paddle.h02 | 20 ++++++ include/atari/screen.a02 | 3 +- include/c64.a02 | 18 +---- include/c64/joystk.a02 | 15 +++-- include/comm.h02 | 88 +++++++++++++++++++++++++ include/header.a02 | 34 +++++++--- include/header.h02 | 10 ++- include/intrpt.a02 | 24 +++++++ include/old/plus4.a02 | 71 +++++++++----------- include/oric.a02 | 33 +++------- include/oric/color.a02 | 106 ++++++++++++++++++++++++++++++ include/oric/color.h02 | 84 ++++++++++++++++++++++++ include/prbyte.a02 | 20 ++++++ include/py65.a02 | 61 ++++------------- include/py65min.a02 | 12 ++-- include/py65min.h02 | 6 +- include/py65win.a02 | 16 ++--- include/templates/keybrd.a02 | 27 ++++++++ include/vic.a02 | 18 +---- include/vic/color.a02 | 124 +++++++++++++++++++++++++++++++++++ include/vic/color.h02 | 83 +++++++++++++++++++++++ 29 files changed, 833 insertions(+), 193 deletions(-) create mode 100644 include/atari/color.a02 create mode 100644 include/atari/joystk.a02 create mode 100644 include/atari/joystk.h02 create mode 100644 include/atari/lgtpen.a02 create mode 100644 include/atari/lgtpen.h02 create mode 100644 include/atari/paddle.a02 create mode 100644 include/atari/paddle.h02 create mode 100644 include/comm.h02 create mode 100644 include/intrpt.a02 create mode 100644 include/oric/color.a02 create mode 100644 include/oric/color.h02 create mode 100644 include/prbyte.a02 create mode 100644 include/templates/keybrd.a02 create mode 100644 include/vic/color.a02 create mode 100644 include/vic/color.h02 diff --git a/include/appl2std.a02 b/include/appl2std.a02 index 876a574..390b60d 100644 --- a/include/appl2std.a02 +++ b/include/appl2std.a02 @@ -46,7 +46,7 @@ STORY EQU $C3B3 ;Store Accumulator at Current Screen Position PRBLNK EQU $F94C ;Print 3 blanks PRBLNX EQU $F94C ;Print X blanks PRBLAX EQU $F94C ;Print character in A followed by X-1 blanks -RDKEY EQU $FD0C ;Waits for keypress and return in A +GETCHR EQU $FD0C ;Waits for keypress and return in A KEYIN EQU $FD1B ;Waits for keypress and cycle random-number generator RDCHAR EQU $FD35 ;Read keyboard (processing escapes) GETLIN EQU $FD6A ;Get Line from Keyboard into Input Buffer @@ -74,13 +74,13 @@ PLKEY: LDA #0 ;Clear Accumulator PLKEYR: RTS ;Read Keyboard -GETKEY JSR PLKEY ;Poll Keyboard +GETKEY JSR POLKEY ;Poll Keyboard BEQ GETKEY ;Loop if No Key AND #$7F ;Strip High Bit RTS ;Print Character to Screen -PRCHR: ORA #$80 ;Set High Bit +PUTCHR ORA #$80 ;Set High Bit CMP #$E0 ; BCC PRCHRX ;If Lower Case AND #$1F ; Convert to Inverse @@ -91,7 +91,7 @@ DELCHR: LDX #2 ;Two Characters Total LDA #$88 ;Load Backspace Character JSR PRBLAX ;Print Accumulator and X-1 Blanks LDA #$88 ;Load Backspace Character - JMP PRCHR ;and Print it + JMP PUTCHR ;and Print it ;Advance Character to Next line NEWLIN EQU CROUT ;Alias to Monitor Routine diff --git a/include/appl2std.h02 b/include/appl2std.h02 index c068587..9d5fbdd 100644 --- a/include/appl2std.h02 +++ b/include/appl2std.h02 @@ -27,10 +27,10 @@ void prbyte(); //Print Accumulator as Hexadadecimal number void prhex(); //Print Low Nybble of Accumulator as Hex Digit //System Subroutines -char plkey(); //Poll Console for character -char rdkey(); //Wait for character from Console +char polkey(); //Poll Console for character +char getchr(); //Wait for character from Console char getkey(); //Read ASCII character from Console void newlin(); //Advance cursor to beginning of next line -void prchr(); //Print ASCII character to Console +char putchr(); //Print ASCII character to Console void setdst(); //Set Destination Pointer void setsrc(); //Set Source Pointer diff --git a/include/atari/color.a02 b/include/atari/color.a02 new file mode 100644 index 0000000..13a4946 --- /dev/null +++ b/include/atari/color.a02 @@ -0,0 +1,43 @@ +;Color and Character Assembly Language Equates for Atari 400 & 800 + +; Display Colors +BLACK EQU $00 Black +RED EQU $00 Red +GREEN EQU $00 Green +YELLOW EQU $00 Yellow +BLUE EQU $00 Blue +MAGENT EQU $00 Magenta +CYAN EQU $00 Cyan +WHITE EQU $00 White + +;ASCII Screen Control Characters +CHRBCK EQU $7E Backspace +CHRBEL EQU $FD Beep (Buzzer) +CHRCLR EQU $7D Clear Screen +CHRDEL EQU $FE Delete (Character) +CHRDWN EQU $1C Cursor Down +CHRFLS EQU $00 Flash On +CHRHOM EQU $00 Home (None) +CHRINS EQU $FF Insert (Character) +CHRLFT EQU $1E Cursor Left +CHRRGT EQU $1F Cursor Right +CHRRTN EQU $9B Return (End of Line) +CHRTAB EQU $7F Tab +CHRUP EQU $1B Cursor Up + +;ATASCII Symbolic Characters +CHRBLK EQU $A0 Block + +;ASCII Box Drawing Characters +BOXBLC EQU $0A Bottom Left Corner +BOXBRC EQU $03 Bottom Right Corner +BOXBCT EQU $18 Bottom to Cetter Tee +BOXCTR EQU $13 Center Cross +BOXHLN EQU $12 Horizontal Line +BOXLCT EQU $01 Left To Center T) +BOXRCT EQU $04 Right To Center T +BOXTLC EQU $11 Top Left Corner +BOXTRC EQU $05 Top Right Corner +BOXTCT EQU $17 Top to Center T +BOXVLN EQU $7C Vertical Line (|) + diff --git a/include/atari/joystk.a02 b/include/atari/joystk.a02 new file mode 100644 index 0000000..106492c --- /dev/null +++ b/include/atari/joystk.a02 @@ -0,0 +1,22 @@ +;Joystick Assembly Language Module for Atari 400 & 800 + +JYSTKS EQU $02 ;Number of Joysticks + +;Joystick Bit Masks +JOYUP EQU $01 ;Bit 0 - Up +JOYDN EQU $02 ;Bit 1 - Down +JOYLF EQU $04 ;Bit 2 - Left +JOYRT EQU $08 ;Bit 3 - Right +JOYB0 EQU $10 ;Bit 4 - Button + +;Read Joystick +JOYSTK: CMP #JYSTKS ;If Invalid Joystick# + BCS JOYSTZ ; Return Error + EOR #$01 ;Invert Joystick Number + TAX ;and Copy to X Register + LDA $DC00,X ;Read Joystick + EOR #$FF ;Invert and + AND #$1F ;Mask Bits + RTS +JOYSTZ: LDA #$FF ;Return Error + RTS diff --git a/include/atari/joystk.h02 b/include/atari/joystk.h02 new file mode 100644 index 0000000..4d172d4 --- /dev/null +++ b/include/atari/joystk.h02 @@ -0,0 +1,15 @@ +/* Joystick Module Header File for Atari 400 & 800 */ + +#define JYSTKS 4 //Number of Joysticks + +#define JOYUP $01 //Bit 0 - Up +#define JOYDN $02 //Bit 1 - Down +#define JOYLF $04 //Bit 2 - Left +#define JOYRT $08 //Bit 3 - Right +#define JOYB0 $10 //Bit 4 - Button + +/* Read Joystick State * + * Args: n = Joystick Number * + * Returns: Joystick Status * + * $FF = Invalid Argument */ +char joystk(); diff --git a/include/atari/lgtpen.a02 b/include/atari/lgtpen.a02 new file mode 100644 index 0000000..026043d --- /dev/null +++ b/include/atari/lgtpen.a02 @@ -0,0 +1,21 @@ +;Lightpen Assembly Language Module for Atari 400 & 800 + +LGTPNS EQU #$FF ;Light Pen Status (Supported) + +;Read Light Pen +;Returns: A = X Position / 2 +; Y = Y Position +; X = Trigger Status ($FF = Pressed) +LGTPEN: LDX #0 ;Initialize X to FALSE (0) + LDA $0284 ;Check Joystick Button + EOR #$FF ;Invert and + AND #$01 ;Mask Bits + BEQ LGTPET ;If Trigger Pulled, Set X to $FF + LDA $0278 ;Read Joystick Switches + EOR #$FF ;Invert and + AND #$0F ;Mask Bits + BEQ LGTPEP ;If Trigger Pulled +LGTPET: DEX ; Set X to TRUE ($FF) +LGTPEP: LDY $0234 ;Read Y Position into Y + LDA $0235 ;Read X Position into A + RTS diff --git a/include/atari/lgtpen.h02 b/include/atari/lgtpen.h02 new file mode 100644 index 0000000..bf9a784 --- /dev/null +++ b/include/atari/lgtpen.h02 @@ -0,0 +1,5 @@ +/* Lightpen Module Header File for Atari 400 & 800 */ + +#define LGTPNS $FF //Light Pen Status (Supported) + +char lgtpen(); //Read Light Pen diff --git a/include/atari/paddle.a02 b/include/atari/paddle.a02 new file mode 100644 index 0000000..da8348f --- /dev/null +++ b/include/atari/paddle.a02 @@ -0,0 +1,33 @@ +;Paddle Controller Constants and Functions for Atari 400 & 800 + +PADDLS EQU #$08 ;Maximum Numbers of Paddles + +;Read Paddle +;Args: A = Paddle # +;Affects: X +;Returns: A = Paddle Value +; 0 and Carry Set if Paddle # Invalid +PADDLE: CMP #PADDLS ;If Invalid Paddle # + BCS BUTTOZ ; Return 0 & Carry Set + TAX ;Copy Paddle # to X + LDA $0270,X ;Read Paddle Shadow Register + RTS + +BUTTNS EQU #$04 ;Maximum Numbers of Paddle Buttons + +;Read Paddle Button +;Args: A = Button # +;Affects: X,Y +;Returns: A = $FF if Paddle Button Pressed +; $00 if Paddle Button Not Pressed +; Carry Set if Button Number Invalid +BUTTON: CMP #BUTTNS ;If Button# >= # of Buttons + BCS BUTTOZ ; Return FALSE & Carry Set + TAX ;and Copy to X Register + LDA $027C,Y ;Read Button Shadow Register + AND #$01 ;Mask off Relevant Bit + BNE BUTTOZ ;If Bit is 0 + LDA #$FF ; Return TRUE + RTS ;Else +BUTTOZ: LDA #$00 ; Return FALSE + RTS diff --git a/include/atari/paddle.h02 b/include/atari/paddle.h02 new file mode 100644 index 0000000..469c9bf --- /dev/null +++ b/include/atari/paddle.h02 @@ -0,0 +1,20 @@ +/* Psddle Controllers Header File for Atari 400 & 800 */ + +#define BUTTNS 4 //Number of Paddle Buttons +#define PADDLS 4 //Number of Paddles + +/* Get Paddle Button Status * + * Args: b = Button Number * + * Same as Paddle Number * + * Returns: $FF if Button Pressed * + * $00 if Not Pressed */ +void button(); + +/* Get Paddle Status * + * Args: p = Paddle Number * + * 0 - Port 1 Paddle X * + * 1 - Port 1 Paddle Y * + * 2 - Port 2 Paddle X * + * 3 - Port 2 Paddle Y * + * Returns: Paddle Value (0-255) */ +void paddle(); diff --git a/include/atari/screen.a02 b/include/atari/screen.a02 index 6465831..955bb50 100644 --- a/include/atari/screen.a02 +++ b/include/atari/screen.a02 @@ -1,4 +1,5 @@ -;Screen Control Assembly Language Routines for Oric-1 +;Screen Control Assembly Language Routines for Atari 400 & 800 +;*** Incomplete - Copied from Oric-1 *** ; Display Colors BLACK EQU $00 Black diff --git a/include/c64.a02 b/include/c64.a02 index 9810d86..4d50bb2 100644 --- a/include/c64.a02 +++ b/include/c64.a02 @@ -90,20 +90,4 @@ NEWLIN: LDX #0 ;Store 0 STX $D3 ;in Cursor Column and JMP $E87C ;Execute NXTLINE Routine -;Print Byte as Two-Digit Hex Number to Console -PRBYTE: PHA ;Save Accumulater - LSR ;Shift Hi Nybble to Low Nybble - LSR - LSR - LSR - JSR PRHEX ; and Print it - PLA ;Restore Accumulator - ; and fall into prhex - -;Print Low Nybble as Hex Digit to Console -PRHEX: AND #$0F ;Strip High Nybble - CMP #$0A ;If Low Nybble >= 10 - BCC PRHEXC ; - ADC #$06 ; Convert ':' to 'A'... -PRHEXC: ADC #$30 ;Convert to ASCII Character - JMP PUTCHR ;Print Hex Digit and Return + INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routine diff --git a/include/c64/joystk.a02 b/include/c64/joystk.a02 index 84d7951..97969ec 100644 --- a/include/c64/joystk.a02 +++ b/include/c64/joystk.a02 @@ -1,6 +1,6 @@ ;Joystick Assembly Language Module for C64 -JYSTKS EQU $02 ;Number of Joysticks +JYSTKS EQU $04 ;Number of Joysticks ;Joystick Bit Masks JOYUP EQU $01 ;Bit 0 - Up @@ -12,11 +12,14 @@ JOYB0 EQU $10 ;Bit 4 - Button ;Read Joystick JOYSTK: CMP #JYSTKS ;If Invalid Joystick# BCS JOYSTZ ; Return Error - EOR #$01 ;Invert Joystick Number - TAX ;and Copy to X Register - LDA $DC00,X ;Read Joystick + TAX ;Copy Joystick # to X + LDA $0284,X ;Read Trigger Control Register + ROR ;Move Bit 0 into Carry + LDA $DC00,X ;Read Joystick Shadow Register EOR #$FF ;Invert and - AND #$1F ;Mask Bits - RTS + AND #$0F ;Mask Bits + BCS JOYSTX ;If Trigger Pressed + ORA #$10 ; Set Bit 4 +HOYSTX: RTS JOYSTZ: LDA #$FF ;Return Error RTS diff --git a/include/comm.h02 b/include/comm.h02 new file mode 100644 index 0000000..99e9fad --- /dev/null +++ b/include/comm.h02 @@ -0,0 +1,88 @@ +/*********************************************** + * comm - Serial Communication Library for C02 * + ***********************************************/ + +/* Command Register Constants */ +#define BR50 = $01 //Baud Rate - 50 BPS +#define BR75 = $02 //Baud Rate - 75 BPS +#define BR110 = $03 //Baud Rate - 110 BPS +#define BR134 = $04 //Baud Rate - 134 BPS +#define BR150 = $05 //Baud Rate - 140 BPS +#define BR300 = $06 //Baud Rate - 300 BPS +#define BR600 = $07 //Baud Rate - 300 BPS +#define BR1200 = $08 //Baud Rate - 1200 BPS +#define BR1800 = $09 //Baud Rate - 1800 BPS +#define BR2400 = $0A //Baud Rate - 2400 BPS +#define BR4800 = $0B //Baud Rate - 4800 BPS +#define BR9600 = $0C //Baud Rate - 9600 BPS + +#define SBITS1 = $00 //1 Stop Bit +#define SBITS2 = $80 //2 Stop Bits + +#define WRDLN5 = $60 //Word Length - 5 Bits +#define WRDLN6 = $40 //Word Length - 5 Bits +#define WRDLN7 = $20 //Word Length - 5 Bits +#define WRDLN8 = $00 //Word Length - 5 Bits + +/* Control Register Constants */ +#define PTYOFF = $00 //Parity - Disable +#define PTYODD = $01 //Parity - Odd +#define PTYEVN = $02 //Parity - Even +#define PTYMRK = $03 //Parity - Mark +#define PTYSPC = $04 //Parity - Space + +#define DPXFUL = $00 //Duplex - Full +#define DPXHLF = $80 //Duplex - Half + +#define XLTNON = $00 //No Translation +#define XTLASC = $10 //ASCII Translation + +#define LFNONE = $00 //No LF after CR +#define LFSEND = $40 //Send LF after CR + +#define SHKSFT = $00 //Handshake - Software +#define SHKHRD = $80 //Handshake - Hardware + +/* Return Serial Buffer Status * + * Args: fp - file pointer * + * Returns: tuple: number of characters in * + input buffer and output buffer */ +char cbffrs(); + +/* Close Serial Port * + * Args: fp - file pointer * + * Returns: 0 if successful * + * 255 if error */ + char cclose(); + +/* Get Serial Port Error Status * + * Returns: Error Code * + * 0 if No Error */ + char cerror(); + +/* Read Character from Serial Port * + * Args: fp - file pointer * + * Returns: character read */ +char cgetc(); + +/* Open Serial Port for Communication * + * Args: prt - Serial Port Number * + * cmd - Command Register * + * ctl - Control Register * + * Returns: File Pointer for Opened Port * + * 0 if Error */ + char copen(); + +/* Write Character to Serial Port * + * Args: fp - file pointer * + * c - character to write * + * Returns: 0 if successful * + 255 if error */ +char cputc(); + +/* Write String to Serial Port * + * Args: fp - file pointer * + * &s - string to write * + * Returns: 0 if successful * + 255 if error */ +char cputs(); diff --git a/include/header.a02 b/include/header.a02 index 20eaba6..7f9e2f7 100644 --- a/include/header.a02 +++ b/include/header.a02 @@ -42,6 +42,14 @@ START: NOP ;System specific initialization code STX STKSAV ; the Stack Pointer should be preserved JMP MAIN ;Execute Program + +;Exit Program and Return to Operating System or Monitor +EXIT: BRK ;Usually BRK if returning to Monitor + LDX STKSAV ;If an RTS is used to return to the Operating System, + TXS ; the Stack Pointer should be restored to original state + RTS ; in case program exits in the middle of a Function + JMP WSTART ;Or it may just execute the BASIC Warm Start Routine + ;Poll Character from Keyboard PLKEY: INC RDSEED ;Cycle the Random Seed (if not provided by system) NOP ;Code Read from Keyboad @@ -52,8 +60,8 @@ GETKEY; ;Usually Drops into RDKEY, but may need to call RDKEY ; then clean/convert returned value (e.g. Apple-1) ;Wait for Character from Console -RDKEY: JSR PLKEY ;Usually calls PLKEY - BEQ RDKEY ; until a non-zero is returned +GETCHR: JSR POLKEY ;Usually calls POLKEY + BEQ GETCHR ; until a non-zero is returned RTS ;Delete Previous Character @@ -65,13 +73,19 @@ NEWLIN: RTS ;Code to move Cursor to beginning of next line ;May emit Carriage Return, Line Feed, or both ;Print Character to Screen -PRCHR: RTS ;Code to write ASCII character to Screen +PUTCHR RTS ;Code to write ASCII character to Screen -;Exit Program and Return to Operating System or Monitor -EXIT: BRK ;Usually BRK if returning to Monitor - LDX STKSAV ;If an RTS is used to return to the Operating System, - TXS ; the Stack Pointer should be restored to original state - RTS ; in case program exits in the middle of a Function +;Clear the Screen +CLRSCR: RTS ;Code to Clear Screen + +;Move Cursor to Specified Coordinates +SETPOS: RTS ;Move Cursor to Column A, Row Y + +;Get Cursor Position +GETPOS: RTS ;Return Cursor Column in A, Row in Y + +;Get Screen Size +GETSIZ: RTS ;Return Screen Width in A, Height in Y ;Note: The following two functions replicate calls available ;in the Apple-1 monitor and are included for test purposes @@ -94,7 +108,7 @@ PRHEX: AND #$0F ;Strip High Nybb ADC #$90 ;Convert to $90-$99,$00-$05 ADC #$40 ;Convert to $30-$39,$41-$46 CLD ;Clear Decimal Flag - JMP PRCHR ;Print Hex Digit and Return + JMP PUTCHR ;Print Hex Digit and Return ;Alternate Code for Systems with Interrupts that don't CLD PRHEX: AND #$0F ;Strip High Nybble @@ -102,4 +116,4 @@ PRHEX: AND #$0F ;Strip High Nybble BCC PRHEXC ; ADC #$06 ; Convert ':' to 'A'... PRHEXC: ADC #$30 ;Convert to ASCII Character - JMP PRCHR ;Print Hex Digit and Return + JMP PUTCHR ;Print Hex Digit and Return diff --git a/include/header.h02 b/include/header.h02 index 81ad9cc..fe2dadf 100644 --- a/include/header.h02 +++ b/include/header.h02 @@ -34,10 +34,14 @@ char random; //Last Result of Pseudo-Random Number Generator char rdseed; //System Seed for Pseudo-Random Number Generator //System Subroutines -char plkey(); //Poll Console for character -char rdkey(); //Wait for character from Console +void delchr(); //Delete previous character char getkey(); //Read ASCII character from Console +char getpos(); //Get Cursor Position +char getsiz(); //Get Screen Size void newlin(); //Advance cursor to beginning of next line -void prchr(); //Print ASCII character to Console +char polkey(); //Poll Console for character +char putchr(); //Print ASCII character to Console void prbyte(); //Print Accumulator as Hexadadecimal number void prhex(); //Print Low Nybble of Accumulator as Hex Digit +char getchr(); //Wait for character from Console +void setpos(); //Set Cursor Position diff --git a/include/intrpt.a02 b/include/intrpt.a02 new file mode 100644 index 0000000..c871d8f --- /dev/null +++ b/include/intrpt.a02 @@ -0,0 +1,24 @@ +;Interrupt Vector Manipulation Routines + +;Interrupt Vectors +NMILO EQU $FFFA ;Non-Maskable Interrupt +NMIHI EQU $FFFB +RSTLO EQU $FFFC ;Reset +RSTHI EQU $FFFD +IRQLO EQU $FFFE ;Maskable Interrupt +IRQHI EQU $FFFF + +;Set Non-Maskable Interrupt Handler +SETNMI: STY NMIHI + STX NMILO + RTS + +;Set Reset Handler +SETRST: STY RSTHI + STX RSTLO + RTS + +;Set Maskable Interrupt Handler +SETIRQ: STY IRQHI + STX IRQLO + RTS diff --git a/include/old/plus4.a02 b/include/old/plus4.a02 index c169208..90d5aaf 100644 --- a/include/old/plus4.a02 +++ b/include/old/plus4.a02 @@ -1,39 +1,30 @@ ; c02 Program Initialization Code for Commodore Plus/4 & 16 -;ASCII Control Codes Equivalents -CR EQU $0D ;Carriage Return -LF EQU $11 ;Line Feed (Cursor Down) -DEL EQU $14 ;Delete -HT EQU $1D ;Horizontal Tab (Cursor Right) -VT EQU $91 ;Vertical Tab (Cursor Up) -FF EQU $93 ;Form Feed (Clear Screen) -BS EQU $9D ;Backspace (Cursor Left) - ;PETSCII Key Mappings DELKEY EQU $14 ;Delete/Backspace Key (Delete) ESCKEY EQU $03 ;Escape/Stop Key (RUN/STOP) RTNKEY EQU $0D ;Return/Enter Key (RETURN) ;Zero Page Locations -strlo EQU $FE ;String Pointer (stdio.asm) -strhi EQU $FF ; +STRLO EQU $FE ;String Pointer (stdio.asm) +STRHI EQU $FF ; ;Other RAM Locations -tbffr EQU $0333 ;Cassette I/O Buffer +TBFFR EQU $0333 ;Cassette I/O Buffer ;Video RAM and ROM -vidscn EQU $0C00 ;Video Screen Memory Area -chrrom EQU $D000 ;Character Generator ROM -vidclr EQU $0800 ;Color RAM +VIDSCN EQU $0C00 ;Video Screen Memory Area +CHRROM EQU $D000 ;Character Generator ROM +VIDCLR EQU $0800 ;Color RAM ;Kernal Routines -chrin EQU $FFCF ;Input Character to Channel -chrout EQU $FFD2 ;Output Character to Channel -getin EQU $FFE4 ;Read Character from Keyboard Buffer +CHROUT EQU $FFD2 ;Output Character to Channel +GETIN EQU $FFE4 ;Read Character from Keyboard Buffer +CHRIN EQU $FFCF ;Input Character to Channel ;Machine Language Basic Stub ORG $1001 ;Start -basic: DC $0C, $10 ; Pointer to Next Line (4108) +BASIC: DC $0C, $10 ; Pointer to Next Line (4108) DC $00, $00 ; Line Number (0) DC $9E ; SYS DC $20 ; ' ' @@ -41,46 +32,44 @@ basic: DC $0C, $10 ; Pointer to Next Line (4108) DC $00 ;End of Line Marker DC $00, $00 ;End of Basic Program -start: TSX ;Get Stack Pointer +START: TSX ;Get Stack Pointer STX user15 ;and Save for Exit JMP main ;Execute Program -exit: LDX user15 ;Retrieve Saved Stack Pointer +EXIT: LDX user15 ;Retrieve Saved Stack Pointer TXS ;and Restore It RTS ;Return to BASIC ;Poll Keyboard for Character -plkey EQU getin ;Read Character from Keyboard Buffer +POLKEY EQU $FFE4 ;Alias to Kernal Routine GETIN ;Get Character from Keyboard -getkey: +GETKEY EQU POLKEY ;Wait for Character from Keyboard -rdkey: JSR plkey ;Poll Keyboard - BEQ getkey ;If No Key, Loop +GETCHR: JSR POLKEY ;Poll Keyboard + BEQ GETCHR ;If No Key, Loop RTS -;Delete Previous Character -delchr: RTS - ;Advance Character to Next line -newlin: LDA #$0D ;Load C/R into Accumulator +NEWLIN: LDA #$0D ;Load C/R into Accumulator + JMP PUTCHR ;Print Character to Console -prchr EQU chrout ; +PUTCHR EQU $FFD2 ;Alias to Kernal Routine CHROUT ;Delete Previous Character -delchr: LDA #$9D ;Load Cursor Left into Accumulator - JSR prchr ; and Print it +DELCJR: LDA #$9D ;Load Cursor Left into Accumulator + JSR PUTCHR ; and Print it LDA #$14 ;Load Delete into Accumulater - JMP prchr ; and Print it + JMP PUTCHR ; and Print it ;Advance Character to Next line -newlin: LDA #$0D ;Load C/R into Accumulator - JMP prchr ; and Print it +NEWLIN: LDA #$0D ;Load C/R into Accumulator + JMP PUTCHR ; and Print it ;Print Byte as Two-Digit Hex Number to Console -prbyte: PHA ;Save Accumulater +PRBYTE: PHA ;Save Accumulater LSR ;Shift Hi Nybble to Low Nybble LSR LSR @@ -90,12 +79,12 @@ prbyte: PHA ;Save Accumulater ; and fall into prhex ;Print Low Nybble as Hex Digit to Console -prhex: AND #$0F ;Strip High Nybble +PRHEX: AND #$0F ;Strip High Nybble CMP #$0A ;If Low Nybble >= 10 - BCC prhexc ; + BCC PRHEXC ; ADC #$06 ; Convert ':' to 'A'... -prhexc: ADC #$30 ;Convert to ASCII Character - JMP prchr ;Print Hex Digit and Return +PRHEXC: ADC #$30 ;Convert to ASCII Character + JMP PUTCHR ;Print Hex Digit and Return -exit: RTS ;Return to Monitor +EXIT: RTS ;Return to BASIC diff --git a/include/oric.a02 b/include/oric.a02 index 8f6b4ef..f98d9e4 100644 --- a/include/oric.a02 +++ b/include/oric.a02 @@ -66,7 +66,7 @@ POLKEY: INC RDSEED ;Cycle the Random Seed GETKEY EQU POLKEY ;Aliased to POLKEY ;Wait for Character from Console -GETCHR JSR POLKEY ;Calls POLKEY +GETCHR: JSR GETKEY ;Calls GETKEY BEQ GETCHR ; until a non-zero is returned RTS @@ -81,32 +81,17 @@ NEWLIN EQU $CB9F ;Basic NEWLINE Routine ($CBF0 for ATMOS) ; LDA #$0A ;Load Line Feed and fall through to PRCHR ;Print Character to Screen -PUTCHR TAX ;Transfer Character to X Register +PUTCHR: TAX ;Transfer Character to X Register JMP $F409 ;Execute VDU Routine +;Get End of Free Memory +RAMTOP: LDX $A6 ;Load HIMEM LSB + LDY $A7 ;Load HIMEM MSB + RTS + ;Exit Program and Return to Operating System or Monitor -EXIT LDA #255 ;Set Caps Lock On +EXIT: LDA #255 ;Set Caps Lock On STA $020C JMP $C003 ;BASIC Warm Start -; -;Note: The following two functions replicate calls available -;in the Apple-1 monitor and are included for test purposes -;They will likely be removed before the final release -;Print Byte as Two-Digit Hex Number to Console -PRBYTE: PHA ;Save Accumulater - LSR ;Shift Hi Nybble to Low Nybble - LSR - LSR - LSR - JSR PRHEX ; and Print it - PLA ;Restore Accumulator - ; and fall into PRHEX - -;Print Low Nybble as Hex Digit to Console -PRHEX: AND #$0F ;Strip High Nybble - CMP #$0A ;If Low Nybble >= 10 - BCC PRHEXC ; - ADC #$06 ; Convert ':' to 'A'... -PRHEXC: ADC #$30 ;Convert to ASCII Character - JMP PUTCHR ;Print Hex Digit and Return + INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routines diff --git a/include/oric/color.a02 b/include/oric/color.a02 new file mode 100644 index 0000000..d1af032 --- /dev/null +++ b/include/oric/color.a02 @@ -0,0 +1,106 @@ +;Screen Control Assembly Language Routines for Oric-1 + +; Display Colors +BLACK EQU 0 Black +RED EQU 1 Red +GREEN EQU 2 Green +YELLOW EQU 3 Yellow +BLUE EQU 4 Blue +MAGENT EQU 5 Magenta +CYAN EQU 6 Cyan +WHITE EQU 7 White + +;ASCII Screen Control Characters +CHRBEL EQU $07 Beep (Bell) +CHRBLK EQU $FF Block +CHRCAP EQU $14 Caps Lock () +CHRCKR EQU $7E Checkerboard +CHRCLR EQU $0C Clear (Form Feed) +CHRDEL EQU $7F Delete (Delete) +CHRDWN EQU $0A Cursor Down (Line Feed) +CHRFLS EQU 140 Flash On +CHRHOM EQU $00 Home (None) +CHRINS EQU $00 Insert +CHRLFT EQU $08 Cursor Left (Backspace) +CHRRGT EQU $09 Cursor Right (Tab) +CHRRTN EQU $0D Return (Carriage Return) +CHRRVF EQU $00 Reverse Off +CHRRVN EQU $00 Reverse On +CHRUP EQU $0B Cursor Up (Vertical Tab) + +;ASCII Box Drawing Characters +BOXBLC EQU 43 Bottom Left Corner (+) +BOXBRC EQU 43 Bottom Right Corner (+) +BOXBCT EQU 45 Bottom to Cetter Tee (-) +BOXCTR EQU 123 Center Cross (+) +BOXHLN EQU 45 Horizontal Line (-) +BOXLCT EQU 124 Left To Center T (|) +BOXRCT EQU 124 Right To Center T (|) +BOXTLC EQU 43 Top Left Corner (+) +BOXTRC EQU 43 Top Right Corner (+) +BOXTCT EQU 45 Top to Center T (-) +BOXVLN EQU 124 Vertical Line (|) + +;ASCII Color Code Table +CLRCDS DC 128, 129, 130, 131, 132, 133, 134, 136 + +;Set Background Color +;Args: A = Oric Color Code +;Uses: TEMP0 - Temporary Storage +;Affects: A,C,N,Z +SCRBKG: AND $07 ;Strip High Bits + ORA $90 ;Convert to Control Character + JMP PRCHR ;Print Character and Return + +;Set Text Color +;Args: A = Vic color code +;Affects: A,X,C,N,Z +SCRTXT: AND $07 ;Strip High Bits + ORA $80 ;Convert to Control Character + JMP PRCHR ;Print Character and Return + +;Clear Screen +;Affects A,C,N,Z +SCRCLR: LDA #CHRCLR ;Load Clear Screen Character + JMP PRCHR ;Print it and Return + +;Move Cursor Down +;Affects A,C,N,Z +SCRDWN: LDA #CHRDWN ;Load Cursor Down Character + JMP PRCHR ;Print it and Return + +;Move Cursor To Home Position +;Affects A,C,N,Z +SCRHOM: LDA #0 ;Column 0 + TAY ;Row 0 + BEQ SRCMOV ;Move Cursor + +;Move Cursor Left +;Affects A,C,N,Z +SCRLFT: LDA #CHRLFT ;Load Cursor Left Character + JMP PRCHR ;Print it and Return + +;Move Cursor Right +;Affects A,C,N,Z +SCRRGT: LDA #CHRRGT ;Load Cursor Left Character + JMP PRCHR ;Print it and Return + +;Move Cursor Up +;Affects A,C,N,Z +SCRUP: LDA #CHRUP ;Load Cursor Left Character + JMP PRCHR ;Print it and Return + +;Move Cursor to Specified Coordinates +;Args: A = screen column (0 = top) +; Y = screen line (0 = left) +SCRMOV: RTS ;Not Yet Implemented + +;Get Cursor Position +;Returns: A = current cursor column +; Y = current cursor row +SCRPOS: RTS ;Not Yet Implemented + +;Get Screen Size +;Returns: A = width of screen in columns +; Y = height of screen in rows +SCRSIZ: RTS ;Not Yet Implemented diff --git a/include/oric/color.h02 b/include/oric/color.h02 new file mode 100644 index 0000000..252cf07 --- /dev/null +++ b/include/oric/color.h02 @@ -0,0 +1,84 @@ +/***************************************************** + * Screen Control Functions and Constants for Oric-1 * + * INCOMPLETE: Copied from VIC20/C64 * + *****************************************************/ + +/* Display Colors */ +enum {BLACK, WHITE, RED, CYAN, MAGENT, GREEN, BLUE, YELLOW}; + +/* PETSCII Color Code Table */ +const char clrtbl = {144, 5, 28, 159, 156, 30, 32, 158}; + +;PETSCII Screen Control Characters +CHRCLR EQU 147 Clear (CLR) +CHRDEL EQU 20 Delete (DEL) +CHRDN EQU 17 Cursor Down +CHRRTN EQU 13 Return +CHRFN1 EQU 133 Function Key 1 (F1) +CHRFN2 EQU 137 Function Key 2 (F2) +CHRFN3 EQU 134 Function Key 3 (F3) +CHRFN4 EQU 138 Function Key 4 (F4) +CHRFN5 EQU 135 Function Key 5 (F5) +CHRFN6 EQU 139 Function Key 6 (F6) +CHRFN7 EQU 136 Function Key 7 (F7) +CHRFN8 EQU 140 Function Key 8 (F8) +CHRHOM EQU 19 Home +CHRINS EQU 148 Insert +CHRLFT EQU 157 Cursor Left +CHRRGT EQU 29 Cursor Left +CHRRVF EQU 146 Reverse Off +CHRRVN EQU 18 Reverse On +CHRUP EQU 145 Cursor Up + + +/* PETSCII Box Drawing Characters */ +#define BOXBLC = 173 //Bottom Left Corner +#define BOXBRC = 189 //Bottom Right Corner +#define BOXBCT = 177 //Bottom to Cetter Tee +#define BOXCTR = 123 //Center Cross +#define BOXHLN = 96 //Horizontal Line +#define BOXLCT = 171 //Left To Center T +#define BOXRCT = 179 //Right To Center T +#define BOXTLC = 176 //Top Left Corner +#define BOXTRC = 174 //Top Right Corner +#define BOXTCT = 178 //Top to Center T +#define BOXVLN = 98 //Verical Line + +/* Set Background Color * + * Args: c - color */ +char scrbkg(); + +/* Clear Screen*/ +char scrclr(); + +/* Move Cursor Down */ +char scrdwn(); + +/* Move Cursor Home */ +char scrhom(); + +/* Move Cursor Left */ +char scrlft(); + +/* Move Cursor * + * Args: col - column * + * row - row */ +char scrmov(); + +/* Get Cursor Position * + * Returns: column, row */ +char scrpos(); + +/* Move Cursor Right */ +char scrrgt(); + +/* Get Screen Size * + * Returns: width, height */ +char scrsiz(); + +/* Set Text Color * + * Args: c - color */ +char scrtxt(); + +/* Move Cursor Upt */ +char scrup(); diff --git a/include/prbyte.a02 b/include/prbyte.a02 new file mode 100644 index 0000000..2a8a9f1 --- /dev/null +++ b/include/prbyte.a02 @@ -0,0 +1,20 @@ +;Assembly Header Include File for platforms +;that do not have PRBYTE amnd PRHEX routines in ROM + +;Print Byte as Two-Digit Hex Number to Console +PRBYTE: PHA ;Save Accumulater + LSR ;Shift Hi Nybble to Low Nybble + LSR + LSR + LSR + JSR PRHEX ; and Print it + PLA ;Restore Accumulator + ; and fall into prhex + +;Print Low Nybble as Hex Digit to Console +PRHEX: AND #$0F ;Strip High Nybble + CMP #$0A ;If Low Nybble >= 10 + BCC PRHEXC ; + ADC #$06 ; Convert ':' to 'A'... +PRHEXC: ADC #$30 ;Convert to ASCII Character + JMP PUTCHR ;Print Hex Digit and Return diff --git a/include/py65.a02 b/include/py65.a02 index 4bae7b3..dacb44f 100644 --- a/include/py65.a02 +++ b/include/py65.a02 @@ -38,14 +38,6 @@ STKEHI EQU $4F PUTCON EQU $F001 ;Write Character to Console GETCON EQU $F004 ;Read Character from Console -;Interrupt Vectors -NMILO EQU $FFFA ;Non-Maskable Interrupt -NMIHI EQU $FFFB -RSTLO EQU $FFFC ;Reset -RSTHI EQU $FFFD -IRQLO EQU $FFFE ;Maskable Interrupt -IRQHI EQU $FFFF - ORG $0200 ;START Directly Above Stack START: JMP MAIN ;Execute Program @@ -53,19 +45,20 @@ START: JMP MAIN ;Execute Program ;Poll Character from Keyboard POLKEY: INC RDSEED ;Cycle the RANDOM Seed (if not provided by system) LDA GETCON ;Read Character from Console - CMP #$E0 - BEQ POLKEX ;If Not E0 Extended Key - ORA #$00 ; Set Status Flags - RTS ; and Return -POLKEX: LDA GETCON ;Else Get Second Byte - ORA #$80 ; Set High Byte - RTS ; and Return + RTS ;Read Character from Console -GETKEY ;Same As RDKEY +GETKEY JSR POLKEY ;Get Raw Key Character + CMP #$E0 + BEQ GETKEX ;If Not E0 Extended Key + ORA #$00 ; Set Status Flags + RTS ; and Return +GETKEX: JSR POLKEY ;Else Get Second Byte + ORA #$80 ; Set High Bit + RTS ; and Return ;Wait for Character from Console -GETCHR: JSR POLKEY ;Read Character from Console +GETCHR: JSR GETKEY ;Read Character from Console BEQ GETCHR ; Loop if None Received RTS @@ -89,36 +82,4 @@ PUTCHR STA PUTCON ;Write Character to Console EXIT: BRK ;Return to Monitor -;Print Byte as Two-Digit Hex Number to Console -PRBYTE: PHA ;Save Accumulater - LSR ;Shift Hi Nybble to Low Nybble - LSR - LSR - LSR - JSR PRHEX ; and Print it - PLA ;Restore Accumulator - ; and fall into PRHEX - -;Print Low Nybble as Hex Digit to Console -PRHEX: AND #$0F ;Strip High Nybb - SED ;Set Decimal Flag for - CLC ; Addition Wizardry - ADC #$90 ;Convert to $90-$99,$00-$05 - ADC #$40 ;Convert to $30-$39,$41-$46 - CLD ;Clear Decimal Flag - JMP PUTCHR ;Print Hex Digit and Return - -;Set Non-Maskable Interrupt Handler -SETNMI: STY NMIHI - STX NMILO - RTS - -;Set Reset Handler -SETRST: STY RSTHI - STX RSTLO - RTS - -;Set Maskable Interrupt Handler -SETIRQ: STY IRQHI - STX IRQLO - RTS + INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routines diff --git a/include/py65min.a02 b/include/py65min.a02 index 0c58838..84d75ee 100644 --- a/include/py65min.a02 +++ b/include/py65min.a02 @@ -16,17 +16,17 @@ START: JMP MAIN ;Execute Program ;Delete Previous Character DELCHR: JSR DELCHB ;Print Backspace LDA #$20 ;Load Space into Accumulater - JSR PRCHR ; and Print it + JSR PUTCHR ; and Print it DELCHB: LDA #$08 ;Load Backspace into Accumulator - BNE PRCHR ; and Print it + BNE PUTCHR ; and Print it ;Advance Character to Next line NEWLIN: LDA #$0D ;Load C/R into Accumulator - JSR PRCHR ; and Print it + JSR PUTCHR ; and Print it LDA #$0A ;Load L/F into Accumulater ; and fall into PRCHR ;Print Character to Console -PRCHR: STA PUTCON ;Write Character to Console +PUTCHR STA PUTCON ;Write Character to Console RTS ;Poll Keyboard for Keypress @@ -34,8 +34,8 @@ PLKEY: LDA GETCON ;Read Character from Console RTS ;Wait for Character from Console -RDKEY: JSR PLKEY ;Read Character from Console - BEQ RDKEY ; Loop if None Received +GETCHR: JSR POLKEY ;Read Character from Console + BEQ GETCHR ; Loop if None Received RTS EXIT: BRK ;Return to Monitor diff --git a/include/py65min.h02 b/include/py65min.h02 index f5f314e..0b1b754 100644 --- a/include/py65min.h02 +++ b/include/py65min.h02 @@ -11,8 +11,8 @@ char getc; //Read Character from Console //System Subroutines void newlin(); //Advance cursor to beginning of next line void delchr(); //Delete previous character -char plkey(); //Poll Console for character -char rdkey(); //Wait for character from Console +char polkey(); //Poll Console for character +char getchr(); //Wait for character from Console char getkey(); //Read ASCII character from Console -void prchr(); //Print ASCII character to Console +char putchr(); //Print ASCII character to Console diff --git a/include/py65win.a02 b/include/py65win.a02 index 358444e..268cb08 100644 --- a/include/py65win.a02 +++ b/include/py65win.a02 @@ -55,26 +55,26 @@ PLKEYX: RTS GETKEY ;Same As RDKEY ;Wait for Character from Console -RDKEY: JSR PLKEY ;Read Character from Console - BEQ RDKEY ; Loop if None Received +GETCHR: JSR POLKEY ;Read Character from Console + BEQ GETCHR ; Loop if None Received RTS ;Delete Previous Character DELCHR: LDA #$08 ;Load Backspace into Accumulator - JSR PRCHR ; and Print it + JSR PUTCHR ; and Print it LDA #$20 ;Load Space into Accumulater - JSR PRCHR ; and Print it + JSR PUTCHR ; and Print it LDA #$08 ;Load Backspace into Accumulator - JMP PRCHR ; and Print it + JMP PUTCHR ; and Print it ;Advance Character to Next line NEWLIN: LDA #$0D ;Load C/R into Accumulator - JSR PRCHR ; and Print it + JSR PUTCHR ; and Print it LDA #$0A ;Load L/F into Accumulater ; and fall into PRCHR ;Print Character to Console -PRCHR: STA PUTCON ;Write Character to Console +PUTCHR STA PUTCON ;Write Character to Console RTS EXIT: BRK ;Return to Monitor @@ -96,4 +96,4 @@ PRHEX: AND #$0F ;Strip High Nybb ADC #$90 ;Convert to $90-$99,$00-$05 ADC #$40 ;Convert to $30-$39,$41-$46 CLD ;Clear Decimal Flag - JMP PRCHR ;Print Hex Digit and Return + JMP PUTCHR ;Print Hex Digit and Return diff --git a/include/templates/keybrd.a02 b/include/templates/keybrd.a02 new file mode 100644 index 0000000..d11ba7b --- /dev/null +++ b/include/templates/keybrd.a02 @@ -0,0 +1,27 @@ +;Keyboard Assembly Language Equates for Oric-1 + +;ASCII Keyboard Codes +KEYBCK EQU $00 Backspace +KEYBRK EQU $03 Break +KEYCLR EQU $0C Clear +KEYCPY EQU $0C Copy (Acorn Atom) +KEYDEL EQU $7F Delete +KEYDN EQU $0A Cursor Down +KEYESC EQU $1B Escape +KEYFN1 EQU $00 Function Key 1 +KEYFN2 EQU $00 Function Key 2 +KEYFN3 EQU $00 Function Key 3 +KEYFN4 EQU $00 Function Key 4 +KEYFN5 EQU $00 Function Key 5 +KEYFN6 EQU $00 Function Key 6 +KEYFN7 EQU $00 Function Key 7 +KEYFN8 EQU $00 Function Key 8 +KEYFN9 EQU $00 Function Key 9 +KEYFNA EQU $00 Function Key 10 +KEYHOM EQU $00 Home +KEYINS EQU $00 Insert +KEYLFT EQU $08 Cursor Left +KEYRGT EQU $09 Cursor Right +KEYRTN EQU $0D Return +KEYTAB EQU $09 Tab +KEYUP EQU $0B Cursor Up diff --git a/include/vic.a02 b/include/vic.a02 index 127ac9a..847c7ba 100644 --- a/include/vic.a02 +++ b/include/vic.a02 @@ -95,20 +95,4 @@ NEWLIN: LDX #0 ;Store 0 STX $D3 ;in Cursor Column and JMP $E8C3 ;Execute NXTLINE Routine -;Print Byte as Two-Digit Hex Number to Console -PRBYTE: PHA ;Save Accumulater - LSR ;Shift Hi Nybble to Low Nybble - LSR - LSR - LSR - JSR PRHEX ; and Print it - PLA ;Restore Accumulator - ; and fall into prhex - -;Print Low Nybble as Hex Digit to Console -PRHEX: AND #$0F ;Strip High Nybble - CMP #$0A ;If Low Nybble >= 10 - BCC PRHEXC ; - ADC #$06 ; Convert ':' to 'A'... -PRHEXC: ADC #$30 ;Convert to ASCII Character - JMP PUTCHR ;Print Hex Digit and Return + INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routines \ No newline at end of file diff --git a/include/vic/color.a02 b/include/vic/color.a02 new file mode 100644 index 0000000..ab0daa5 --- /dev/null +++ b/include/vic/color.a02 @@ -0,0 +1,124 @@ +;Screen Control Assembly Lanuage Routines for C02 + +;Vic Display Colors +BLACK EQU 0 Black +WHITE EQU 1 White +RED EQU 2 Red +CYAN EQU 3 Cyan +MAGENT EQU 4 Purple +GREEN EQU 5 Green +BLUE EQU 6 Blue +YELLOW EQU 7 Yellow + +;PETSCII Screen Control Characters +CHRCLR EQU 147 Clear (CLR) +CHRDEL EQU 20 Delete (DEL) +CHRDN EQU 17 Cursor Down +CHRRTN EQU 13 Return +CHRFN1 EQU 133 Function Key 1 (F1) +CHRFN2 EQU 137 Function Key 2 (F2) +CHRFN3 EQU 134 Function Key 3 (F3) +CHRFN4 EQU 138 Function Key 4 (F4) +CHRFN5 EQU 135 Function Key 5 (F5) +CHRFN6 EQU 139 Function Key 6 (F6) +CHRFN7 EQU 136 Function Key 7 (F7) +CHRFN8 EQU 140 Function Key 8 (F8) +CHRHOM EQU 19 Home +CHRINS EQU 148 Insert +CHRLFT EQU 157 Cursor Left +CHRRGT EQU 29 Cursor Left +CHRRVF EQU 146 Reverse Off +CHRRVN EQU 18 Reverse On +CHRUP EQU 145 Cursor Up + +;PETSCII Box Drawing Characters +BOXBLC EQU 173 Bottom Left Corner +BOXBRC EQU 189 Bottom Right Corner +BOXBCT EQU 177 Bottom to Cetter Tee +BOXCTR EQU 123 Center Cross +BOXHLN EQU 96 Horizontal Line +BOXLCT EQU 171 Left To Center T +BOXRCT EQU 179 Right To Center T +BOXTLC EQU 176 Top Left Corner +BOXTRC EQU 174 Top Right Corner +BOXTCT EQU 178 Top to Center T +BOXVLN EQU 98 Verical Line + +;PETSCII Color Code Table +CLRCDS DC 144, 5, 28, 159, 156, 30, 32, 158 + +;Set Background Color +;Args: A = Vic Color Code +;Uses: TEMP0 - Temporary Storage +;Affects: A,C,N,Z +SCRBKG: LSR ;Shift Color Code 4 Bits Left + LSR + LSR + LSR + STA TEMP0 ;Save it + LDA $900F ;Read VIC Color Control Register + AND #$15 ;Strip Existing Backround Color + ORA ;Add in Background Color + STA $900F ;Write back to VIC Chip + RTS + +;Set Text Color +;Args: A = Vic color code +;Affects: A,X,C,N,Z +SCRTXT: TAX ;Transfer Color Code to Index + LDA CLRTBL,X ;Load PETSCII Color Control Character + JMP PRCHR ;Print Character and Return + +;Clear Screen +;Affects A,C,N,Z +SCRCLR: LDA #CLEAR ;Load Clear Screen Character + JMP PRCHR ;Print it and Return + +;Move Cursor Down +;Affects A,C,N,Z +SCRDWN: LDA #DOWN ;Load Cursor Down Character + JMP PRCHR ;Print it and Return + +;Move Cursor To Home Position +;Affects A,C,N,Z +SRCHOM: LDA #HOME ;Load Cursor Home Character + JMP PRCHR ;Print it and Return + +;Move Cursor Left +;Affects A,C,N,Z +SCRLFT: LDA #LEFT ;Load Cursor Left Character + JMP PRCHR ;Print it and Return + +;Move Cursor Right +;Affects A,C,N,Z +SCRRGT: LDA #RIGHT ;Load Cursor Left Character + JMP PRCHR ;Print it and Return + +;Move Cursor Up +;Affects A,C,N,Z +SCRUP: LDA #UP ;Load Cursor Left Character + JMP PRCHR ;Print it and Return + +;Move Cursor to Specified Coordinates +;Args: A = screen column (0 = top) +; Y = screen line (0 = left) +SCRMOV: TAX ;Transfer Column to X Register + CLC ;Clear Carry Flag + JMP $FFF0 ;Call PLOT Kernal Routine and Return + +;Get Cursor Position +;Returns: A = current cursor column +; Y = current cursor row +; X = current cursor column +SCRPOS: SEC ;Set Carry Flag + JSR $FFF0 ;Call PLOT Kernal Routine + TXA ;Transfer Column to Accumulator + RTS + +;Get Screen Size +;Returns: A = width of screen in columns +; Y = height of screen in rows +; X = width of screen in columns +SCRSIZ: JSR $FFED ;Call SCREEN Kernal Routine + TXA ;Transfer Width to Accumulator + RTS diff --git a/include/vic/color.h02 b/include/vic/color.h02 new file mode 100644 index 0000000..d1574df --- /dev/null +++ b/include/vic/color.h02 @@ -0,0 +1,83 @@ +/***************************************************** + * Screen Control Functions and Constants for VIC-20 * + *****************************************************/ + +/* Display Colors */ +enum {BLACK, WHITE, RED, CYAN, MAGENT, GREEN, BLUE, YELLOW}; + +/* PETSCII Color Code Table */ +const char clrtbl = {144, 5, 28, 159, 156, 30, 32, 158}; + +;PETSCII Screen Control Characters +CHRCLR EQU 147 Clear (CLR) +CHRDEL EQU 20 Delete (DEL) +CHRDN EQU 17 Cursor Down +CHRRTN EQU 13 Return +CHRFN1 EQU 133 Function Key 1 (F1) +CHRFN2 EQU 137 Function Key 2 (F2) +CHRFN3 EQU 134 Function Key 3 (F3) +CHRFN4 EQU 138 Function Key 4 (F4) +CHRFN5 EQU 135 Function Key 5 (F5) +CHRFN6 EQU 139 Function Key 6 (F6) +CHRFN7 EQU 136 Function Key 7 (F7) +CHRFN8 EQU 140 Function Key 8 (F8) +CHRHOM EQU 19 Home +CHRINS EQU 148 Insert +CHRLFT EQU 157 Cursor Left +CHRRGT EQU 29 Cursor Left +CHRRVF EQU 146 Reverse Off +CHRRVN EQU 18 Reverse On +CHRUP EQU 145 Cursor Up + + +/* PETSCII Box Drawing Characters */ +#define BOXBLC = 173 //Bottom Left Corner +#define BOXBRC = 189 //Bottom Right Corner +#define BOXBCT = 177 //Bottom to Cetter Tee +#define BOXCTR = 123 //Center Cross +#define BOXHLN = 96 //Horizontal Line +#define BOXLCT = 171 //Left To Center T +#define BOXRCT = 179 //Right To Center T +#define BOXTLC = 176 //Top Left Corner +#define BOXTRC = 174 //Top Right Corner +#define BOXTCT = 178 //Top to Center T +#define BOXVLN = 98 //Verical Line + +/* Set Background Color * + * Args: c - color */ +char scrbkg(); + +/* Clear Screen*/ +char scrclr(); + +/* Move Cursor Down */ +char scrdwn(); + +/* Move Cursor Home */ +char scrhom(); + +/* Move Cursor Left */ +char scrlft(); + +/* Move Cursor * + * Args: col - column * + * row - row */ +char scrmov(); + +/* Get Cursor Position * + * Returns: column, row */ +char scrpos(); + +/* Move Cursor Right */ +char scrrgt(); + +/* Get Screen Size * + * Returns: width, height */ +char scrsiz(); + +/* Set Text Color * + * Args: c - color */ +char scrtxt(); + +/* Move Cursor Upt */ +char scrup();