diff --git a/.gitignore b/.gitignore index c6127b3..182fdab 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ modules.order Module.symvers Mkfile.old dkms.conf + +.vimrc +.Virtual*.po diff --git a/Makefile b/Makefile index b08e86e..6a7e8a7 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ # Space or comma separated list of cc65 supported target platforms to build for. # Default: c64 (lowercase!) -TARGETS := c64,c128,atari,apple2 +TARGETS := c64,c128,atari,apple2,apple2enh # Name of the final, single-file executable. # Default: name of the current dir with target name appended @@ -372,6 +372,16 @@ dist-apple2: $(PROGRAM).apple2 java -jar dist.apple2/ac.jar -p dist.apple2/dist.po a2.stdmou.mou rel 0 127 if 80 column store enabled +VBL := $C019 ; Vertical Blanking +READPAGE:= $C01C ; $80 = aux page +RD80VID := $C01F ; >127 if 80 column video enabled + +; Character set switches +CLRALTCHAR := $C00E ; Normal Apple II char set +SETALTCHAR := $C00F ; Norm/inv LC, no flash +ALTCHARSET := $C01E ; >127 if alt charset switched in + +; Language card switches +RDLCBNK2:= $C011 ; >127 if LC bank 2 in use +RDLCRAM := $C012 ; >127 if LC is read enabled +ROMIN := $C081 ; Swap in D000-FFFF ROM +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 +HISCR := $C055 ; Page 2 +LORES := $C056 ; Lores graphics +HIRES := $C057 ; Hires graphics +AN3 := $C05E ; Annunciator enables DHGR +AN3OFF := $C05F ; For lo-res display + +; Game controller +BUTN0 := $C061 ; Open-Apple Key +BUTN1 := $C062 ; Closed-Apple Key + +; DHGR Stuff +;HBASL := $26 ; +;HBASH := $27 ; +;HCOLOR1 := $1C ; Running color byte +;AUXFLAG := $19 ; (7)=main +;HNDX := $1E ; Horizontal offset + +;X0L := $E0 ; X-coord save +;X0H := $E1 ; after DHPSN, DHPLT +;Y0 := $E2 ; Y-coord save + +;HCOLOR := $E4 ; Color byte on entry +;HPAG := $E6 ; Hi-res page ($20 normal) +;HDFLAG := $EB ; (7)=2 colors, (6)=EOR +;HWIDE := $ED ; (7)=use 4-bit mask +;HMASK := $EE ; Hi-res color byte +;HMASKE := $EF ; Exten. byte of HMASK diff --git a/src/apple2enh/config.c b/src/apple2enh/config.c new file mode 100644 index 0000000..ced33fa --- /dev/null +++ b/src/apple2enh/config.c @@ -0,0 +1,34 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * config.c - Configuration routines + */ + +#include +#include +#include +#include +#include "../config.h" + +extern ConfigInfo config; + +#define CONFIG_DEFAULT_SERIAL_DRIVER CONFIG_SERIAL_DRIVER_SSC +#define CONFIG_DEFAULT_MOUSE_DRIVER CONFIG_MOUSE_DRIVER_STDMOU + +/** + * config_set_defaults() + * Set default values for config file + */ +void config_set_defaults(void) +{ + config.baud = SER_BAUD_2400; + config.xon_threshold=XON_THRESHOLD; + config.xoff_threshold=XOFF_THRESHOLD; + config.fill=false; + config.driver_ser=CONFIG_DEFAULT_SERIAL_DRIVER; + config.driver_mou=CONFIG_DEFAULT_MOUSE_DRIVER; + config_save(); +} diff --git a/src/apple2enh/dhgr_subs.h b/src/apple2enh/dhgr_subs.h new file mode 100644 index 0000000..3a9865c --- /dev/null +++ b/src/apple2enh/dhgr_subs.h @@ -0,0 +1,12 @@ +extern void __fastcall__ dg (void); /* Initial DHGR */ +extern void __fastcall__ dhclr(void); /* Clear DHGR screen */ +extern void __fastcall__ bkgnd(void); /* Change background color */ +extern void __fastcall__ pen(void); /* Set brush to 1-bit mask (monochrome) */ +extern void __fastcall__ hue(unsigned char c); +extern void __fastcall__ brush(void); /* Set brush to 4-bit mask */ +extern void __fastcall__ dot_at(unsigned x, unsigned char y); /* Plot pixel at x, y */ +extern void __fastcall__ line_to(unsigned x, unsigned char y); /* Draw line */ +extern void dhbar(int x1, int y1, int x2, int y2); + +#define DHGR_COLOR_BLACK 0x00 +#define DHGR_COLOR_WHITE 0x0F diff --git a/src/apple2enh/dhgr_subs.s b/src/apple2enh/dhgr_subs.s new file mode 100644 index 0000000..051ab22 --- /dev/null +++ b/src/apple2enh/dhgr_subs.s @@ -0,0 +1,922 @@ + .export _dg,_dhclr,_pen,_dot_at,_hue,_bkgnd,_brush,_line_to + .import popa,popax + .include "apple2enh.inc" + .setcpu "6502" +;******************************************************************************* +;* Double Hi-res Subs +;******************************************************************************* +;* Version 1.4 7/25/83 +;* Allen Watson III +;******************************************************************************* +;* This code is derived from the listing in Apple Orchard Jan 1984 pp26 +;* https://archive.org/details/Apple-Orchard-v5n1-1984-Jan/page/n29 +;* +;* Changes to the original listing: +;* 1) Syntax changes from Apple DOS Toolkit EdAsm to ca65 +;* 2) Applesoft ampersand support has been commented-out +;* 3) Pixels are now ORed during Mode Write and XORed during Mode Overwrite +;* to support the PLATO terminal protocol. Original always XORed. +;* +;* Michael Sternberg (@16kRAM) 2019-01-17 +;******************************************************************************* +;* +;* Soft-switch Equates +;* +;SET80COL := $C001 ; Write for dubl store +;RAMRDOFF := $C002 ; 48K RAM read off +;RAMWTOFF := $C004 ; 48K RAM write off +;W80OFF := $C00C ; Write for single display +;W80COL := $C00D ; Write for dubl display +;VBL := $C019 ; Vertical Blanking +;READPAGE := $C01C ; $80 = aux page +;TXTCLR := $C050 ; Grafix on +;MIXCLR := $C052 ; Disable 4 lines of text +;MIXSET := $C053 ; Mixed text with grafix +;LOWSCR := $C054 ; Page 2 for main +;HISCR := $C055 ; Page 2 +AUXPAGE := $C055 ; Page2 for aux. +;LORES := $C056 ; Hi-res off +;HIRES := $C057 ; Hi-res on +;AN3 := $C05E ; Enables dubl hi-res hdw. +;AN3OFF := $C05F ; For lo-res display + +;* +;* Variable equates +;* +AUXFLAG := $19 ; (7)=main +HCOLOR1 := $1C ; Running color byte +HNDX := $1E ; Horizontal offset +HBASL := $26 ; +HBASH := $27 ; +X0L := $E0 ; X-coord save +X0H := $E1 ; after DHPSN, DHPLT +Y0 := $E2 ; Y-coord save +HCOLOR := $E4 ; Color byte on entry +HPAG := $E6 ; Hi-res page ($20 normal) +HDFLAG := $EB ; (7)=2 colors, (6)=EOR +HDIR := $EC ; (7)=down, (6)=left +HWIDE := $ED ; (7)=use 4-bit mask +HMASK := $EE ; Hi-res color byte +HMASKE := $EF ; Exten. byte of HMASK +COUNTH := $F9 ; Temp: counter hi byte +DL := $FA ; Temp: diff +DH := $FB ; +DXL := $FC ; Temp: delta-X +DXH := $FD ; +DYL := $FE ; Temp: delta-Y +DYH := $FF ; + +;* +;* +;* Applesoft equates +;* +TXTPTR := $B8 ; Applesoft cmd pointer +AMPRHK := $3F5 ; Ampersand hook +ADDISP := $D998 ; Fixup line pointer +FRMEVL := $DD67 ; Formula evaluator +SYNCHR := $DEC0 ; Fixup line pointer +PRTERR := $DEC9 ; Print syntax-error message +GETBYT := $E6F8 ; Return parm in X-reg +GETADR := $E752 ; Get 2-byte value in $50,$51 +ILLQTY := $F6E6 ; Print illegal-quantity message + +;******************************** +;* +;* Program starts at $6000 +;* +; .org $6000 + +;* +;* Set Amperand hook address +;* +; LDA #>PARSR +; STA AMPRHK+1 +; LDA # err +; CMP (TXTPTR),Y ; Char. in line +; BNE PARSR3 ; no match; -> next cmd +; INY +; INX +; BNE PARSR2 ; always taken +;ERRMSG: JMP PRTERR ; Print syntax err +; +;PARSR3: INX +; LDA CMDTBL,X ; Char from table +; BNE PARSR3 ; (0=end this cmd.) +; INX ; Start of next cmd. +; INC CMDNUM +; BNE PARSR1 ; always taken +; +;CMDFND: JSR ADDISP ; Fixup TXTPTR +; ASL CMDNUM ; dubl for 2-byte addr +; LDX CMDNUM +; LDA ADDTBL+1,X ; (Hack for +; PHA ; JSR to addr +; LDA ADDTBL,X +; PHA +; RTS ; -> to addr on stack! + +;******************************** +;* +;* Local data for Parser +;* +;CMDNUM: .res 1 ; local data + + ;MSB OFF + +;CMDTBL: EQU * +;CMDTBL: .byte "DG" ; uses DHINIT +; .byte 0 +; +; .byte "GMODE" ; uses DHINIT +; .byte 0 +; +; .byte "HUE" ; uses DHCOLR +; .byte $D0 ; "=" +; .byte 0 +; +; .byte "DOT" ; uses DHPLT +; .byte $C5 ; "AT" +; .byte 0 +; +; .byte "LINE" ; uses DHLIN +; .byte $C1 ; "TO" +; .byte 0 +; +; .byte "PEN" ; uses DHPEN +; .byte 0 +; +; .byte "BRUSH" ; uses DHBRUSH +; .byte 0 +; +; .byte "BKGND" ; uses DHBKG +; .byte 0 +; +; .byte $FF ; End of table +; +;ADDTBL: .word DHINIT-1 ; & DG +; .word DHINIT-1 ; & GMODE +; .word DHCOLR-1 ; & HUE = +; .word DHPLT-1 ; & DOT AT +; .word DHLIN-1 ; & LINE TO +; .word DHPEN-1 ; & PEN +; .word DHBRUSH-1 ; & BRUSH +; .word DHBKG-1 ; & BKGND + +;***************************** +;* +;* Dupl Hi-res Initialization +;* + +_dg: +DHINIT: LDA #$20 ; Init $2000-$3FFF + STA HPAG + + LDA HIRES ; Hi-res on + LDA MIXCLR ; Graphix on + LDA TXTCLR ; No mixed + LDA RAMRDOFF ; Read main mem + LDA RAMWTOFF ; Write main mem + STA SET80COL ; Store in both + STA W80COL ; Dubl display + LDA AN3 ; Enable hdw. +;* +;* fall thru into Clear... +;* +;************************* +;* +;* Dubl Hi-res Clear +;* +_dhclr: +DHCLR: LDA #0 + BEQ DHBKG0 ; always taken + +;************************* +;* +;* Dubl Hi-res Background +;* + +_bkgnd: +DHBKG: LDA HCOLOR +DHBKG0: STA HCOLOR1 +DHBKG1: LDA HPAG ; Index hi-res + STA DH ; page using + LDY #0 ; DL, DH + STY DL + + LDA HCOLOR1 + STA DXL ; Set up color bytes + LDX #1 +DHBKG2: ASL A + ADC #0 ; (prop. carry bit) + STA DXL,X ; for fast filling + INX + CPX #4 + BCC DHBKG2 + + LDA AUXPAGE ; Aux mem first +DHBKG3: LDA DYH ; Color byte #4 + STA (DL),Y + INY + LDA DXH ; Color byte #2 + STA (DL),Y + INY + BNE DHBKG3 + INC DH + LDA DH + AND #$1F ; Test for done + BNE DHBKG3 + + LDA HPAG + STA DH ; Set up again, + LDA LOWSCR ; for main +DHBKG4: LDA DXL ; Color byte #1 + STA (DL),Y + INY + LDA DYL ; Color byte #3 + STA (DL),Y + INY + BNE DHBKG4 + INC DH + LDA DH + AND #$1F ; Test for done + BNE DHBKG4 + + RTS + +;*********************** +;* +;* Set color bytes +;* +_hue: +DHCOLR: TAX ; __fastcall__ Get color number + + LDA HDFLAG + AND #$BF ; Clear EOR mark + STA HDFLAG + + TXA + BPL DHCOLR1 + LDA HDFLAG ; Neg. color value => + ORA #$40 ; Set EOR mark + STA HDFLAG + TXA + +DHCOLR1: AND #$0F + STA HCOLOR + ASL A + ASL A + ASL A + ASL A + ORA HCOLOR ; Both nybbles + STA HCOLOR + +;* +;* Spin color for column +;* + LDA AUXFLAG + ASL A + LDA HNDX + ROL A ; Restore Y0/7 in A-reg + JMP DHSPN + +;********************** +;* +;* Set mask width +;* +;* DHPEN -> 1-bit mask +;* DHBRUSH -> 4-bit mask +;* +_pen: +DHPEN: LDA #$00 ; (7) off + STA HWIDE + RTS + +_brush: +DHBRUSH: LDA #$80 ; (7) on + STA HWIDE + RTS + +;********************* +;* +;* Dubl Hi-res Position +;* +DHPSN: STA Y0 ; At entry, Y in acc, + STX X0L ; X-lo in X-reg, + STY X0H ; and X-hi in Y-reg. + +;* +;* Vertical base calc. +;* + STA HBASH ; Y coord. value + AND #$C0 + STA HBASL + LSR A + LSR A + ORA HBASL + STA HBASL + LDA HBASH + ASL A + ASL A + ASL A + ROL HBASH + ASL A + ROL HBASH + ASL A + ROR HBASL + LDA HBASH + AND #$1F + ORA HPAG + STA HBASH + +;* +;* Horizontal position +;* + TXA ; X-lo to acc. + CPY #0 ; Test X-hi: + BEQ DHPSN2 + CPY #1 + BEQ OLDHP + LDY #$48 ; X-hi = 2 + ADC #0 ; (rem mod 7) + BCC DHPSN0 ; always taken + +OLDHP: LDY #$23 ; X-hi = 1 + ADC #3 ; (rem mod 7) + BCC DHPSN0 + LDY #$47 + ADC #3 + +DHPSN0: SEC +DHPSN1: INY ; Divide by 7 +DHPSN2: SBC #7 + BCS DHPSN1 + + STY HNDX + LSR HNDX ; byte offset + ROR AUXFLAG ; neg = aux, pos = main + + TAX ; For mask select + +;* +;* Shift color byte +;* + TYA ; (still Y0/7) + + JSR DHSPN ; Spin color for column +;* +;* Which mask table? +;* + BIT HWIDE + BMI DHPMK4 ; Use 4-bit mask +; +DHPMK1: LDA MSKTB1-249,X + STA HMASK + LDA #0 + STA HMASKE + + RTS + +DHPMK4: LDA MSKTB4-249,X + STA HMASK + LDA MSKTB5-249,X + STA HMASKE ; Exten. byte + + RTS + +;* +;* Spin color byte for column +;* +DHSPN: CLC ; (added color shift to + ADC #3 ; make 'em like lo-res) + AND #$03 + TAY ; How many shifts, mod 3 + + LDA HCOLOR +DHSPN1: STA HCOLOR1 + DEY + BMI DHSPN2 + ASL A + ADC #0 + BCC DHSPN1 ; always taken +DHSPN2: RTS + +;************************* +;* +;* Dubl Hi-res Plot +;* +_dot_at: +DHPLT: JSR DHFNS ; Get parms in A,X,Y-regs + +DHPLT0: JSR DHPSN + + LDA HNDX ; Test for out + CMP #$28 ; of bounds. + BCC DHPLT1 + + RTS ; Out of bounds + +DHPLT1: BIT AUXFLAG ; Aux or main? + BMI DHPLTM + STA AUXPAGE + BPL DHPLT2 +DHPLTM: STA LOWSCR + +DHPLT2: LDY HNDX ; Byte offset + LDA HMASK + BIT HDFLAG + BVS DHXPL1 ; Go EOR it. + + LDA HCOLOR1 + EOR (HBASL),Y ; + AND HMASK +DHXPL1: EOR (HBASL),Y ; Set and + STA (HBASL),Y ; store dot + + BIT HWIDE ; if wide mask, + BMI DHPLT3 ; go plot more + + RTS + +DHPLT3: BIT AUXFLAG ; Aux or main? + BMI DHPLTA ; Set for other: + STA LOWSCR + BPL DHPLT4 +DHPLTA: STA AUXPAGE + + INY ; Next column pair + CPY #$28 ; Past right edge? + BCC DHPLT4 + LDY #0 ; wrap to left edge + +DHPLT4: LDA HMASKE + BIT HDFLAG + BVS DHXP2 ; Go EOR it. + + LDA HCOLOR1 + ASL A ; Shift color for + ADC #0 ; next column right + EOR (HBASL),Y + AND HMASKE ; extension mask +DHXP2: EOR (HBASL),Y ; Set and + STA (HBASL),Y ; store dot + + RTS + +;************************* +;* +;* Move up (new base address) +;* +UP: CLC + LDA HBASH + BIT EQ1C + BNE UP5 ; Not end bank + ASL HBASL + BCS UP3 ; Not top row + BIT EQ3 + BEQ UP1 + ADC #$1F + SEC + BCS UP4 + +UP1: ADC #$23 + STA HBASH ; temp + LDA HBASL + ADC #$B0 + BCS UP2 + ADC #$F0 +UP2: STA HBASL + LDA HBASH + BCS UP4 ; always taken + +UP3: ADC #$1F +UP4: ROR HBASL +UP5: ADC #$FC + STA HBASH + RTS + +;************************* +;* +;* Move down (new base address) +;* +DOWN: CLC +DOWN0: LDA HBASH + ADC #4 + BIT EQ1C + BNE DOWN4 ; Not end bank + + ASL HBASL + BCC DOWN2 ; Not bottom row + + ADC #$E0 + CLC + BIT EQ4 + BEQ DOWN3 + + LDA HBASL + ADC #$50 + EOR #$F0 + BEQ DOWN1 + EOR #$F0 +DOWN1: STA HBASL + LDA HPAG + BCC DOWN3 +DOWN2: ADC #$E0 +DOWN3: ROR HBASL +DOWN4: STA HBASH + RTS + +;************************* +;* +;* Move left (new mask) +;* +LEFT: LDY HNDX + + BIT HWIDE ; Which mask width? + BPL LMSK1 ; 1-bit masks + + LDA HMASK ; 4-bit masks + BIT EQF0 ; Is it left-most? + BEQ LEFT1 ; yes + ASL A ; Throw away sign bit, + LSR HMASKE ; shift both masks + ROR A + LSR A +LR1: STA HMASK + RTS + +LMSK1: LDA HMASK ; 1-bit mask + LSR A + BNE LR1 ; Mask still OK + +;* +;* Next column to left +;* +LEFT1: BIT AUXFLAG + BPL LEFT2 ; Aux: need new index + LSR AUXFLAG ; flag -> aux + BPL LEFT4 ; always taken +LEFT2: SEC + ROR AUXFLAG ; flag -> main + +LEFT3: DEY ; New index value + BPL LEFT4 + LDY #$27 ; Wrap l. to r. edge +LEFT4: LDA #$07 ; New masks for + STA HMASKE ; right edge + LDA #$40 + STA HMASK + STY HNDX + +;* +;* Color shift for next column left +;* +CLSHFT: LDA HCOLOR1 + LSR A ; Shift color byte... + BCC CLSHFT1 + ORA #$80 ; prop. carry bit +CLSHFT1: STA HCOLOR1 + + RTS + +;************************* +;* +;* Move right (new mask) +;* +RIGHT: LDY HNDX + + LDA HMASK + ASL A + ASL A ; Shift past sign + ROL HMASKE ; for exten byte + LSR A ; undo extra shift + BEQ RMSK + STA HMASK ; Shift is OK + RTS + +RMSK: STA HMASKE ; 0-> exten byte + + BIT HWIDE ; Which mask width? + BPL RMSK1 ; 1-bit masks + LDA #$0F ; New left mask + BNE RIGHT1 ; always taken +RMSK1: LDA #$01 ; New left mask + +;* +;* Next column right +;* +RIGHT1: BIT AUXFLAG + BMI RIGHT2 + SEC + ROR AUXFLAG ; flag -> main + BMI RIGHT4 ; always taken + +RIGHT2: LSR AUXFLAG ; flag -> aux +RIGHT3: INY ; Next column + CPY #$28 + BCC RIGHT4 + LDY #0 ; Wrap r. to l. edge +RIGHT4: STA HMASK + STY HNDX + +;* +;* Color shift for next column right +;* +CRSHFT: LDA HCOLOR1 + ASL A + ADC #0 ; Prop. carry bit + STA HCOLOR1 + + RTS + +;********************** +;* +;* Dubl Hi-res Line +;* +;* NOTICE! Parms same as DHPLT: +;* Y in A-reg +;* XL in X-reg +;* XH in Y-reg +;* +_line_to: +DHLIN: JSR DHFNS ; Get parms in A,X,Y-regs + +DHLIN0: STA DL ; (temporarily) + + TXA ; (get X1L) + SEC + SBC X0L ; Compute Delta X + STA DXL + TYA ; (get X1H) + SBC X0H + STA DXH + STA HDIR ; Save sign of DX + BCS DHLIN1 ; (it's pos.) + + SEC + LDA #0 ; Make DX abs.value + SBC DXL + STA DXL + LDA #0 + SBC DXH + STA DXH + +DHLIN1: LDA DL ; (get Y1) + SEC + SBC Y0 ; Compute Delta Y + STA DYL + LDA #0 + STA DYH + BCS DHLIN2 ; DY positive + SEC + SBC DYL ; Make DY absolute value + STA DYL + CLC +DHLIN2: ROR HDIR ; (7)=down, (6)=left + + LDA DL + STA Y0 ; Update Y0 + STX X0L + STY X0H ; ...and X0 + +;* +;* Select X or Y as main direction +;* + LDA DXH + BNE XMAIN + LDA DXL + BNE DHLIN3 + CMP DYL + BNE DHLIN3 + + RTS ; DX=0 and DY=0 -> NOP! + +DHLIN3: CMP DYL + BCS XMAIN ; DX > DY + +;********************** +;* +;* Y is main direction +;* +YMAIN: SEC + LDA #0 + SBC DYL + TAX ; Count lo is X-reg. + LDA #0 + SBC #0 + STA COUNTH + + ASL DXL + ROL DXH ; DX = 2*DX (D1) + + SEC + LDA DXL + SBC DYL + STA DL + LDA DXH + SBC #0 + STA DH ; D = 2*DX - DY + + SEC + LDA DL + SBC DYL + STA DYL + LDA DH + SBC #0 + STA DYH ; DY = 2*DX - 2*DY (D2) + +;* +;* Y Line Loop: do until COUNT -> 0 +;* +YMOVE: BIT HDIR ; (7)=down + BMI YDOWN + + JSR UP ; Move plot point up + BNE BUMPY ; always taken + +YDOWN: JSR DOWN ; Move plot point down + +BUMPY: BIT DH + BPL BMPY2 + CLC + LDA DL + ADC DXL + STA DL + LDA DH + ADC DXH + STA DH + JMP YDRAW + +BMPY2: CLC + LDA DL + ADC DYL + STA DL + LDA DH + ADC DYH + STA DH + + BIT HDIR ; (6)=left + BVC YRIGHT +YLEFT: JSR LEFT ; Move plot point left + JMP YDRAW + +YRIGHT: JSR RIGHT ; Move plot point right + +YDRAW: JSR DHPLT1 ; Plot next point + + INX + BNE YMOVE + INC COUNTH + BNE YMOVE + + RTS ; -> EXIT + +;************************* +;* +;* X is main direction +;* +XMAIN: SEC + LDA #0 + SBC DXL + TAX ; Count lo in X-reg. + LDA #0 + SBC DXH + STA COUNTH + + ASL DYL + ROL DYH ; DY = 2;*DY (D1) + + SEC + LDA DYL + SBC DXL + STA DL + LDA DYH + SBC DXH + STA DH ; D = 2;*DY - DX + + SEC + LDA DL + SBC DXL + STA DXL + LDA DH + SBC DXH + STA DXH ; DX = 2;*DY - 2*DX (D2) + +;* +;* X Line Loop: do until COUNT -> 0 +;* +XMOVE: BIT HDIR ; (6)=left + BVC XRIGHT + + JSR LEFT ; Move plot point left + JMP BUMPX + +XRIGHT: JSR RIGHT ; Move plot point right + +BUMPX: BIT DH + BPL BMPX2 + CLC + LDA DL + ADC DYL + STA DL + LDA DH + ADC DYH + STA DH + JMP XDRAW + +BMPX2: CLC + LDA DL + ADC DXL + STA DL + LDA DH + ADC DXH + STA DH + + BIT HDIR ; (7)=down + BMI XDOWN +XUP: JSR UP ; Move plot point up + JMP XDRAW + +XDOWN: JSR DOWN ; Move plot point down + +XDRAW: JSR DHPLT1 + + INX + BNE XMOVE + INC COUNTH + BNE XMOVE + + RTS ; -> EXIT + +;************************ +;* +;* Local data +;* +EQ3: .byte $03 +EQ4: .byte $04 +EQ1C: .byte $1C +EQF0: .byte $F0 + +;************************ +;* +;* Bit mask tables +;* +;* One-bit masks +;* +MSKTB1: .byte %00000001 ; Left-most bit + .byte %00000010 + .byte %00000100 + .byte %00001000 + .byte %00010000 + .byte %00100000 + .byte %01000000 ; Right-most bit +;* +;* Four-bit masks +;* +MSKTB4: .byte %00001111 ; Left-most 4-bits + .byte %00011110 + .byte %00111100 + .byte %01111000 + .byte %01110000 + .byte %01100000 + .byte %01000000 ; Right-most bits + +MSKTB5: .byte %00000000 ; Exten bytes + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000001 + .byte %00000011 + .byte %00000111 ; Right-most bits +;* +;* +;**************************************** diff --git a/src/apple2enh/font.c b/src/apple2enh/font.c new file mode 100644 index 0000000..cd4b8ef --- /dev/null +++ b/src/apple2enh/font.c @@ -0,0 +1,178 @@ +/** + * Font definitions for font memories M0 and M1 + */ + +#include + +// Thanks to Nick Shcherbyna for this table saver! +#define FONTPTR(a) (((i << 1) + i) << 1) + +uint8_t FONT_SIZE_X=8; +uint8_t FONT_SIZE_Y=6; + +uint8_t font[]={ + 0x00,0x00,0x00,0x00,0x00,0x00, /* SPACE 0x20 */ + 0x08,0x08,0x08,0x00,0x08,0x00, /* ! 0x21 */ + 0x24,0x24,0x00,0x00,0x00,0x00, /* " 0x22 */ + 0x24,0x7E,0x24,0x7E,0x24,0x00, /* # 0x23 */ + 0x08,0x3E,0x38,0x0E,0x3E,0x08, /* $ 0x24 */ + 0x62,0x64,0x08,0x13,0x23,0x00, /* % 0x25 */ + 0x38,0x38,0x7E,0x48,0x77,0x00, /* & 0x26 */ + 0x08,0x08,0x00,0x00,0x00,0x00, /* ' 0x27 */ + 0x08,0x10,0x10,0x10,0x08,0x00, /* ( 0x28 */ + 0x08,0x04,0x04,0x04,0x08,0x00, /* ) 0x29 */ + 0x08,0x6B,0x1C,0x6B,0x08,0x00, /* * 0x2a */ + 0x00,0x18,0x7E,0x18,0x00,0x00, /* + 0x2b */ + 0x00,0x00,0x00,0x00,0x18,0x08, /* , 0x2c */ + 0x00,0x00,0x7E,0x00,0x00,0x00, /* - 0x2d */ + 0x00,0x00,0x00,0x00,0x18,0x00, /* . 0x2e */ + 0x02,0x04,0x08,0x10,0x20,0x00, /* / 0x2f */ + 0x3C,0x46,0x4A,0x52,0x3C,0x00, /* 0 0x30 */ + 0x08,0x38,0x08,0x08,0x3E,0x00, /* 1 0x31 */ + 0x3C,0x02,0x3C,0x40,0x7E,0x00, /* 2 0x32 */ + 0x3C,0x02,0x1C,0x02,0x3C,0x00, /* 3 0x33 */ + 0x1C,0x24,0x44,0x7E,0x04,0x00, /* 4 0x34 */ + 0x7E,0x40,0x7C,0x02,0x7C,0x00, /* 5 0x35 */ + 0x3C,0x40,0x7C,0x42,0x3C,0x00, /* 6 0x36 */ + 0x7E,0x02,0x0C,0x10,0x10,0x00, /* 7 0x37 */ + 0x3C,0x42,0x3C,0x42,0x3C,0x00, /* 8 0x38 */ + 0x3C,0x42,0x3E,0x02,0x3C,0x00, /* 9 0x39 */ + 0x00,0x00,0x18,0x00,0x18,0x00, /* : 0x3a */ + 0x00,0x00,0x18,0x00,0x18,0x08, /* ; 0x3b */ + 0x00,0x0C,0x30,0x0C,0x00,0x00, /* < 0x3c */ + 0x00,0x7E,0x00,0x7E,0x00,0x00, /* = 0x3d */ + 0x00,0x18,0x06,0x18,0x00,0x00, /* > 0x3e */ + 0x3C,0x42,0x1C,0x00,0x10,0x00, /* ? 0x3f */ + 0x3C,0x4E,0x5E,0x40,0x3E,0x00, /* @ 0x40 */ + 0x3C,0x42,0x7E,0x42,0x42,0x00, /* A 0x41 */ + 0x7C,0x42,0x7C,0x42,0x7C,0x00, /* B 0x42 */ + 0x3C,0x42,0x40,0x42,0x3C,0x00, /* C 0x43 */ + 0x78,0x44,0x42,0x44,0x78,0x00, /* D 0x44 */ + 0x7E,0x40,0x7C,0x40,0x7E,0x00, /* E 0x45 */ + 0x7E,0x40,0x7C,0x40,0x40,0x00, /* F 0x46 */ + 0x3E,0x40,0x4E,0x42,0x3E,0x00, /* G 0x47 */ + 0x42,0x42,0x7E,0x42,0x42,0x00, /* H 0x48 */ + 0x1C,0x08,0x08,0x08,0x1C,0x00, /* I 0x49 */ + 0x02,0x02,0x02,0x42,0x3C,0x00, /* J 0x4a */ + 0x46,0x48,0x78,0x44,0x42,0x00, /* K 0x4b */ + 0x40,0x40,0x40,0x40,0x7E,0x00, /* L 0x4c */ + 0x42,0x66,0x5A,0x42,0x42,0x00, /* M 0x4d */ + 0x62,0x52,0x4A,0x46,0x42,0x00, /* N 0x4e */ + 0x3C,0x42,0x42,0x42,0x3C,0x00, /* O 0x4f */ + 0x7C,0x42,0x7C,0x40,0x40,0x00, /* P 0x50 */ + 0x3C,0x42,0x4A,0x46,0x3E,0x00, /* Q 0x51 */ + 0x7C,0x42,0x7C,0x42,0x42,0x00, /* R 0x52 */ + 0x3C,0x40,0x3C,0x02,0x3C,0x00, /* S 0x53 */ + 0x7F,0x08,0x08,0x08,0x08,0x00, /* T 0x54 */ + 0x42,0x42,0x42,0x42,0x3C,0x00, /* U 0x55 */ + 0x42,0x42,0x42,0x24,0x18,0x00, /* V 0x56 */ + 0x42,0x42,0x5A,0x66,0x42,0x00, /* W 0x57 */ + 0x42,0x24,0x18,0x24,0x42,0x00, /* X 0x58 */ + 0x41,0x41,0x3E,0x08,0x08,0x00, /* Y 0x59 */ + 0x7E,0x04,0x18,0x20,0x7E,0x00, /* Z 0x5a */ + 0x38,0x20,0x20,0x20,0x38,0x00, /* [ 0x5b */ + 0x40,0x20,0x10,0x08,0x04,0x00, /* \ 0x5c */ + 0x1C,0x04,0x04,0x04,0x1C,0x00, /* ] 0x5d */ + 0x18,0x24,0x00,0x00,0x00,0x00, /* CIRCUMFLEX ^ 0x5e*/ + 0x00,0x00,0x00,0x00,0x7E,0x00, /* _ 0x5f */ + 0x30,0x08,0x00,0x00,0x00,0x00, /* GRAVE ACCENT ` 0x60 */ + 0x00,0x3C,0x02,0x3E,0X3E,0x00, /* a 0x61 */ + 0x40,0x7C,0x42,0x42,0x7C,0x00, /* b 0x62 */ + 0x00,0x3C,0x40,0x40,0x3C,0x00, /* c 0x63 */ + 0x02,0x3E,0x42,0x42,0x3E,0x00, /* d 0x64 */ + 0x00,0x3c,0x7e,0x40,0x3c,0x00, /* e 0x65 */ + 0x0E,0x10,0x3C,0x10,0x10,0x00, /* f 0x66 */ + 0x00,0x3C,0x42,0x3E,0x02,0x1C, /* g 0x67 */ + 0x40,0x7C,0x42,0x42,0x42,0x00, /* h 0x68 */ + 0x08,0x00,0x18,0x08,0x1C,0x00, /* i 0x69 */ + 0x08,0x00,0x18,0x08,0x08,0x30, /* j 0x6a */ + 0x40,0x46,0x78,0x48,0x46,0x00, /* k 0x6b */ + 0x18,0x08,0x08,0x08,0x1C,0x00, /* l 0x6c */ + 0x00,0x7E,0x49,0x49,0x49,0x00, /* m 0x6d */ + 0x00,0x7C,0x42,0x42,0x42,0x00, /* n 0x6e */ + 0x00,0x3C,0x42,0x42,0x3C,0x00, /* o 0x6f */ + 0x00,0x7C,0x42,0x42,0x7C,0x40, /* p 0x70 */ + 0x00,0x3C,0x42,0x3E,0x02,0x03, /* q 0x67 */ + 0x00,0x2E,0x30,0x20,0x20,0x00, /* r 0x72 */ + 0x00,0x1E,0x70,0x0E,0x7C,0x00, /* s 0x73 */ + 0x10,0x3E,0x10,0x10,0x0E,0x00, /* t 0x74 */ + 0x00,0x42,0x42,0x42,0x3E,0x00, /* u 0x75 */ + 0x00,0x22,0x22,0x14,0x08,0x00, /* v 0x76 */ + 0x00,0x41,0x49,0x49,0x36,0x00, /* w 0x77 */ + 0x00,0x63,0x1C,0x14,0x63,0x00, /* x 0x78 */ + 0x00,0x42,0x42,0x3E,0x02,0x1C, /* y 0x79 */ + 0x00,0x3E,0x0C,0x18,0x3E,0x00, /* z 0x7a */ + 0x0E,0x08,0x30,0x08,0x0E,0x00, /* { 0x7b */ + 0x08,0x08,0x08,0x08,0x08,0x00, /* | 0x7c */ + 0x38,0x08,0x06,0x08,0x38,0x00, /* } 0x7d */ + 0x32,0x4C,0x00,0x00,0x00,0x00, /* ~ 0x7e */ + + 0x00,0x70,0x50,0x70,0x00,0x00, /* BOX 0x7f */ /* TODO: PLATO extended characters */ + 0x00,0x00,0x00,0x00,0x00,0x00, /* SPACE 0xa0 */ + 0x00,0x10,0x20,0x40,0x80,0x00, /* / 0xa1 */ + 0x00,0xF0,0x00,0xF0,0x00,0xF0, /* EQUIVALENT 0xa2 */ + 0x00,0x00,0x00,0x00,0x68,0xB0, /* LOW TILDE 0xa3 */ + 0x20,0x70,0x80,0x70,0x20,0x00, /* ASSIGN 0xa4 */ + 0x20,0xF0,0x20,0xF0,0x40,0x00, /* NOT EQUAL 0xa5 */ + 0x00,0x20,0x70,0x20,0x20,0x00, /* UP ARROW 0xa6 */ + 0x00,0x00,0x20,0xF0,0x20,0x00, /* RIGHT ARROW 0xa7 */ + 0x00,0x20,0x20,0x70,0x20,0x00, /* DOWN ARROW 0xa8 */ + 0x00,0x00,0x40,0xF0,0x40,0x00, /* LEFT ARROW 0xa9 */ + 0x00,0x50,0x20,0x50,0x00,0x00, /* MULTIPLY 0xaa */ + 0xF0,0x80,0x60,0x80,0xF0,0x00, /* SIGMA 0xab */ + 0x00,0x20,0x50,0x88,0xF8,0x00, /* DELTA 0xac*/ + 0x00,0x90,0x90,0x60,0x00,0x00, /* UNION 0xad*/ + 0x00,0x60,0x90,0x90,0x00,0x00, /* INTERSECT 0xae */ + 0x00,0x60,0x00,0x60,0x00,0x00, /* DIVIDE 0xaf */ + 0x00,0x50,0xA0,0x70,0x00,0x00, /* ALPHA 0xb0 */ + 0x20,0x50,0xA0,0x90,0xE0,0x80, /* BETA 0xb1 */ + 0x20,0x40,0x20,0x50,0x70,0x00, /* DELTA 0xb2 */ + 0x80,0x40,0x20,0x50,0x90,0x00, /* LAMBDA 0xb3 */ + 0x00,0x00,0x50,0x50,0x60,0x80, /* MU 0xb4 */ + 0x08,0x78,0xD0,0x50,0x50,0x00, /* PI 0xb5 */ + 0x00,0x20,0x50,0x50,0xA0,0x80, /* RHO 0xb6 */ + 0x30,0x40,0xA0,0xA0,0x40,0x00, /* SIGMA 0xb7 */ + 0x00,0x00,0x90,0xB0,0x60,0x00, /* OMEGA 0xb8 */ + 0x20,0x40,0x80,0x40,0x20,0xE0, /* LESS THAN OR EQUAL 0xb9 */ + 0x80,0x40,0x20,0x40,0x80,0xE0, /* GREATER THAN OR EQUAL 0xba */ + 0x20,0x50,0x70,0x50,0x20,0x00, /* THETA 0xbb */ + 0x30,0x60,0xA0,0x60,0x30,0x00, /* l-embed 0xbc */ + 0x00,0x60,0x90,0x60,0x00,0x00, /* DEGREE 0xbd */ + 0xC0,0x60,0x50,0x60,0xC0,0x00, /* r-embed 0xbe */ + 0xC0,0xA0,0x50,0x50,0xA0,0xC0, /* ANSWER ARROW 0xbf */ + 0xFF,0x1C,0x20,0x20,0x1C,0xFF, /* COPYRIGHT 0xc0 */ + 0x50,0x00,0x00,0x00,0x00,0x00, /* DIERESIS 0xc1 */ + 0x00,0x70,0x50,0x70,0x00,0x00, /* BOX 0xc2 */ + 0x00,0x00,0x20,0x00,0x00,0x00, /* INTERPUNCT 0xc3 */ + 0x20,0x70,0xF8,0x70,0x20,0x00, /* DIAMOND 0xc4 */ + 0x00,0x50,0x20,0x50,0x00,0x00, /* MULTIPLY 0xc5 */ + 0x10,0x20,0x00,0x00,0x00,0x00, /* ACUTE ACCENT 0xc6 */ + 0x00,0x00,0x00,0x08,0x10,0x00, /* CEDILLA 0xc7 */ + 0x10,0x20,0x00,0x00,0x00,0x00, /* HACEK 0xc8 */ + 0x20,0x70,0xF8,0x70,0x20,0x00, /* DIAMOND 0xc9 */ + 0x20,0x20,0x20,0x20,0x20,0x20, /* | 0xca */ + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00 +}; + +uint8_t fontm23[768]; + diff --git a/src/apple2enh/io.c b/src/apple2enh/io.c new file mode 100644 index 0000000..3d8012d --- /dev/null +++ b/src/apple2enh/io.c @@ -0,0 +1,98 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * io.c - Input/output functions (serial/ethernet) (apple2 specific) + */ + +#include +#include +#include +#include +#include +#include +#include "../config.h" + +extern uint8_t xoff_enabled; +extern ConfigInfo config; +extern uint8_t (*io_serial_buffer_size)(void); +extern void (*io_recv_serial_flow_off)(void); +extern void (*io_recv_serial_flow_on)(void); +extern uint8_t io_load_successful; + +static uint8_t send_delay=0; /* We need a send delay for apple2, wtf? */ + +void io_recv_serial_flow_off_ssc(void); +void io_recv_serial_flow_on_ssc(void); +uint8_t io_serial_buffer_size_ssc(void); + +/** + * io_init_funcptrs() - Set up I/O function pointers + */ +void io_init_funcptrs(void) +{ + if (io_load_successful==false) + return; + + if (config.driver_ser==CONFIG_SERIAL_DRIVER_SSC) + { + io_serial_buffer_size=io_serial_buffer_size_ssc; + io_recv_serial_flow_off=io_recv_serial_flow_off_ssc; + io_recv_serial_flow_on=io_recv_serial_flow_on_ssc; + } +} + +/** + * io_send_byte(b) - Send specified byte out + */ +void io_send_byte(uint8_t b) +{ + if (io_load_successful==false) + return; + + ser_put(b); + for (send_delay=0;send_delay<200;send_delay++) + { + // sit and spin. + } +} + +/** + * Return the serial buffer size + */ +uint8_t io_serial_buffer_size_ssc(void) +{ + return 0; +} + +/** + * io_recv_serial_flow_off() - Tell modem to stop receiving. + */ +void io_recv_serial_flow_off_ssc(void) +{ + if (io_load_successful==false) + return; +} + +/** + * io_recv_serial_flow_on() - Tell modem to stop receiving. + */ +void io_recv_serial_flow_on_ssc(void) +{ + if (io_load_successful==false) + return; +} + +/** + * io_ser_driver_name() - return serial driver name given constant + */ +const char* io_ser_driver_name(unsigned char driver) +{ + switch(driver) + { + case CONFIG_SERIAL_DRIVER_SSC: + return "a2.ssc.ser"; + } +} diff --git a/src/apple2enh/key.h b/src/apple2enh/key.h new file mode 100644 index 0000000..0b8e0c7 --- /dev/null +++ b/src/apple2enh/key.h @@ -0,0 +1,409 @@ +/** + * key.h + * Keyboard Translation Tables + */ + +#include "../plato_key.h" + +#ifndef KEY_H +#define KEY_H + +/** + * + * KEY_H generated by mk_ascii_key_h.c + */ + + +unsigned char key_to_pkey[]={ + PKEY_NOKEY, /* 0x00 NUL */ + PKEY_ANS, /* 0x01 CTRL-A */ + PKEY_BACK, /* 0x02 CTRL-B */ + PKEY_COPY, /* 0x03 CTRL-C */ + PKEY_DATA, /* 0x04 CTRL-D */ + PKEY_EDIT, /* 0x05 CTRL-E */ + PKEY_FONT, /* 0x06 CTRL-F */ + PKEY_DIVIDE, /* 0x07 CTRL-G */ + PKEY_ERASE, /* 0x08 CTRL-H */ + PKEY_HELP, /* 0x09 CTRL-I */ + PKEY_NOKEY, /* 0x0a CTRL-J */ + PKEY_NOKEY, /* 0x0b CTRL-K */ + PKEY_LAB, /* 0x0c CTRL-L */ + PKEY_NEXT, /* 0x0d CTRL-M */ + PKEY_NEXT, /* 0x0e CTRL-N */ + PKEY_NOKEY, /* 0x0f CTRL-O */ + PKEY_SUPER, /* 0x10 CTRL-P */ + PKEY_SQUARE, /* 0x11 CTRL-Q */ + PKEY_ERASE, /* 0x12 CTRL-R */ + PKEY_STOP, /* 0x13 CTRL-S */ + PKEY_TERM, /* 0x14 CTRL-T */ + PKEY_NOKEY, /* 0x15 CTRL-U */ + PKEY_NOKEY, /* 0x16 CTRL-V */ + PKEY_NOKEY, /* 0x17 CTRL-W */ + PKEY_MULTIPLY, /* 0x18 CTRL-X */ + PKEY_SUB, /* 0x19 CTRL-Y */ + PKEY_NOKEY, /* 0x1a CTRL-Z */ + PKEY_NOKEY, /* 0x1b ESC */ + PKEY_NOKEY, /* 0x1c */ + PKEY_NOKEY, /* 0x1d */ + PKEY_NOKEY, /* 0x1e */ + PKEY_NOKEY, /* 0x1f */ + PKEY_SPACE, /* 0x20 SPACE */ + PKEY_EXCLAMATION, /* 0x21 ! */ + PKEY_QUOTE, /* 0x22 " */ + PKEY_POUND, /* 0x23 # */ + PKEY_DOLLAR, /* 0x24 $ */ + PKEY_PERCENT, /* 0x25 % */ + PKEY_AMPERSAND, /* 0x26 & */ + PKEY_APOSTROPHE, /* 0x27 ' */ + PKEY_PARENTHESIS_LEFT, /* 0x28 ( */ + PKEY_PARENTHESIS_RIGHT, /* 0x29 ) */ + PKEY_ASTERISK, /* 0x2a * */ + PKEY_PLUS, /* 0x2b + */ + PKEY_COMMA, /* 0x2c , */ + PKEY_MINUS, /* 0x2d - */ + PKEY_PERIOD, /* 0x2e . */ + PKEY_SLASH, /* 0x2f / */ + PKEY_0, /* 0x30 0 */ + PKEY_1, /* 0x31 1 */ + PKEY_2, /* 0x32 2 */ + PKEY_3, /* 0x33 3 */ + PKEY_4, /* 0x34 4 */ + PKEY_5, /* 0x35 5 */ + PKEY_6, /* 0x36 6 */ + PKEY_7, /* 0x37 7 */ + PKEY_8, /* 0x38 8 */ + PKEY_9, /* 0x39 9 */ + PKEY_COLON, /* 0x3a : */ + PKEY_SEMICOLON, /* 0x3b ; */ + PKEY_LESS_THAN, /* 0x3c < */ + PKEY_EQUALS, /* 0x3d = */ + PKEY_GREATER_THAN, /* 0x3e > */ + PKEY_QUESTION_MARK, /* 0x3f ? */ + PKEY_AT, /* 0x40 @ */ + PKEY_A, /* 0x41 A */ + PKEY_B, /* 0x42 B */ + PKEY_C, /* 0x43 C */ + PKEY_D, /* 0x44 D */ + PKEY_E, /* 0x45 E */ + PKEY_F, /* 0x46 F */ + PKEY_G, /* 0x47 G */ + PKEY_H, /* 0x48 H */ + PKEY_I, /* 0x49 I */ + PKEY_J, /* 0x4a J */ + PKEY_K, /* 0x4b K */ + PKEY_L, /* 0x4c L */ + PKEY_M, /* 0x4d M */ + PKEY_N, /* 0x4e N */ + PKEY_O, /* 0x4f O */ + PKEY_P, /* 0x50 P */ + PKEY_Q, /* 0x51 Q */ + PKEY_R, /* 0x52 R */ + PKEY_S, /* 0x53 S */ + PKEY_T, /* 0x54 T */ + PKEY_U, /* 0x55 U */ + PKEY_V, /* 0x56 V */ + PKEY_W, /* 0x57 W */ + PKEY_X, /* 0x58 X */ + PKEY_Y, /* 0x59 Y */ + PKEY_Z, /* 0x5a Z */ + PKEY_BRACKET_LEFT, /* 0x5b [ */ + PKEY_SLASH, /* 0x5c / */ + PKEY_BRACKET_RIGHT, /* 0x5d ] */ + PKEY_CIRCUMFLEX, /* 0x5e ^ */ + PKEY_UNDERSCORE, /* 0x5f _ */ + PKEY_GRAVE, /* 0x60 ` */ + PKEY_a, /* 0x61 a */ + PKEY_b, /* 0x62 b */ + PKEY_c, /* 0x63 c */ + PKEY_d, /* 0x64 d */ + PKEY_e, /* 0x65 e */ + PKEY_f, /* 0x66 f */ + PKEY_g, /* 0x67 g */ + PKEY_h, /* 0x68 h */ + PKEY_i, /* 0x69 i */ + PKEY_j, /* 0x6a j */ + PKEY_k, /* 0x6b k */ + PKEY_l, /* 0x6c l */ + PKEY_m, /* 0x6d m */ + PKEY_n, /* 0x6e n */ + PKEY_o, /* 0x6f o */ + PKEY_p, /* 0x70 p */ + PKEY_q, /* 0x71 q */ + PKEY_r, /* 0x72 r */ + PKEY_s, /* 0x73 s */ + PKEY_t, /* 0x74 t */ + PKEY_u, /* 0x75 u */ + PKEY_v, /* 0x76 v */ + PKEY_w, /* 0x77 w */ + PKEY_x, /* 0x78 x */ + PKEY_y, /* 0x79 y */ + PKEY_z, /* 0x7a z */ + PKEY_LEFT_CURLY_BRACE, /* 0x7b { */ + PKEY_BAR, /* 0x7c | */ + PKEY_RIGHT_CURLY_BRACE, /* 0x7d } */ + PKEY_TILDE, /* 0x7e ~ */ + PKEY_ERASE, /* 0x7f DEL */ +}; + +unsigned char shiftlock_key_to_pkey[]={ + PKEY_NOKEY, /* 0x00 NUL */ + PKEY_ANS, /* 0x01 CTRL-A */ + PKEY_BACK, /* 0x02 CTRL-B */ + PKEY_COPY, /* 0x03 CTRL-C */ + PKEY_DATA, /* 0x04 CTRL-D */ + PKEY_EDIT, /* 0x05 CTRL-E */ + PKEY_FONT, /* 0x06 CTRL-F */ + PKEY_DIVIDE, /* 0x07 CTRL-G */ + PKEY_ERASE, /* 0x08 CTRL-H */ + PKEY_HELP, /* 0x09 CTRL-I */ + PKEY_NOKEY, /* 0x0a CTRL-J */ + PKEY_NOKEY, /* 0x0b CTRL-K */ + PKEY_LAB, /* 0x0c CTRL-L */ + PKEY_NEXT, /* 0x0d CTRL-M */ + PKEY_NEXT, /* 0x0e CTRL-N */ + PKEY_NOKEY, /* 0x0f CTRL-O */ + PKEY_SUPER, /* 0x10 CTRL-P */ + PKEY_SQUARE, /* 0x11 CTRL-Q */ + PKEY_ERASE, /* 0x12 CTRL-R */ + PKEY_STOP, /* 0x13 CTRL-S */ + PKEY_TERM, /* 0x14 CTRL-T */ + PKEY_NOKEY, /* 0x15 CTRL-U */ + PKEY_NOKEY, /* 0x16 CTRL-V */ + PKEY_NOKEY, /* 0x17 CTRL-W */ + PKEY_MULTIPLY, /* 0x18 CTRL-X */ + PKEY_SUB, /* 0x19 CTRL-Y */ + PKEY_NOKEY, /* 0x1a CTRL-Z */ + PKEY_NOKEY, /* 0x1b ESC */ + PKEY_NOKEY, /* 0x1c */ + PKEY_NOKEY, /* 0x1d */ + PKEY_NOKEY, /* 0x1e */ + PKEY_NOKEY, /* 0x1f */ + PKEY_SPACE, /* 0x20 SPACE */ + PKEY_EXCLAMATION, /* 0x21 ! */ + PKEY_QUOTE, /* 0x22 " */ + PKEY_POUND, /* 0x23 # */ + PKEY_DOLLAR, /* 0x24 $ */ + PKEY_PERCENT, /* 0x25 % */ + PKEY_AMPERSAND, /* 0x26 & */ + PKEY_APOSTROPHE, /* 0x27 ' */ + PKEY_PARENTHESIS_LEFT, /* 0x28 ( */ + PKEY_PARENTHESIS_RIGHT, /* 0x29 ) */ + PKEY_ASTERISK, /* 0x2a * */ + PKEY_PLUS, /* 0x2b + */ + PKEY_COMMA, /* 0x2c , */ + PKEY_MINUS, /* 0x2d - */ + PKEY_PERIOD, /* 0x2e . */ + PKEY_SLASH, /* 0x2f / */ + PKEY_0, /* 0x30 0 */ + PKEY_1, /* 0x31 1 */ + PKEY_2, /* 0x32 2 */ + PKEY_3, /* 0x33 3 */ + PKEY_4, /* 0x34 4 */ + PKEY_5, /* 0x35 5 */ + PKEY_6, /* 0x36 6 */ + PKEY_7, /* 0x37 7 */ + PKEY_8, /* 0x38 8 */ + PKEY_9, /* 0x39 9 */ + PKEY_COLON, /* 0x3a : */ + PKEY_SEMICOLON, /* 0x3b ; */ + PKEY_LESS_THAN, /* 0x3c < */ + PKEY_EQUALS, /* 0x3d = */ + PKEY_GREATER_THAN, /* 0x3e > */ + PKEY_QUESTION_MARK, /* 0x3f ? */ + PKEY_AT, /* 0x40 @ */ + PKEY_a, /* 0x41 A */ + PKEY_b, /* 0x42 B */ + PKEY_c, /* 0x43 C */ + PKEY_d, /* 0x44 D */ + PKEY_e, /* 0x45 E */ + PKEY_f, /* 0x46 F */ + PKEY_g, /* 0x47 G */ + PKEY_h, /* 0x48 H */ + PKEY_i, /* 0x49 I */ + PKEY_j, /* 0x4a J */ + PKEY_k, /* 0x4b K */ + PKEY_l, /* 0x4c L */ + PKEY_m, /* 0x4d M */ + PKEY_n, /* 0x4e N */ + PKEY_o, /* 0x4f O */ + PKEY_p, /* 0x50 P */ + PKEY_q, /* 0x51 Q */ + PKEY_r, /* 0x52 R */ + PKEY_s, /* 0x53 S */ + PKEY_t, /* 0x54 T */ + PKEY_u, /* 0x55 U */ + PKEY_v, /* 0x56 V */ + PKEY_w, /* 0x57 W */ + PKEY_x, /* 0x58 X */ + PKEY_y, /* 0x59 Y */ + PKEY_z, /* 0x5a Z */ + PKEY_BRACKET_LEFT, /* 0x5b [ */ + PKEY_SLASH, /* 0x5c / */ + PKEY_BRACKET_RIGHT, /* 0x5d ] */ + PKEY_CIRCUMFLEX, /* 0x5e ^ */ + PKEY_UNDERSCORE, /* 0x5f _ */ + PKEY_GRAVE, /* 0x60 ` */ + PKEY_A, /* 0x61 a */ + PKEY_B, /* 0x62 b */ + PKEY_C, /* 0x63 c */ + PKEY_D, /* 0x64 d */ + PKEY_E, /* 0x65 e */ + PKEY_F, /* 0x66 f */ + PKEY_G, /* 0x67 g */ + PKEY_H, /* 0x68 h */ + PKEY_I, /* 0x69 i */ + PKEY_J, /* 0x6a j */ + PKEY_K, /* 0x6b k */ + PKEY_L, /* 0x6c l */ + PKEY_M, /* 0x6d m */ + PKEY_N, /* 0x6e n */ + PKEY_O, /* 0x6f o */ + PKEY_P, /* 0x70 p */ + PKEY_Q, /* 0x71 q */ + PKEY_R, /* 0x72 r */ + PKEY_S, /* 0x73 s */ + PKEY_T, /* 0x74 t */ + PKEY_U, /* 0x75 u */ + PKEY_V, /* 0x76 v */ + PKEY_W, /* 0x77 w */ + PKEY_X, /* 0x78 x */ + PKEY_Y, /* 0x79 y */ + PKEY_Z, /* 0x7a z */ + PKEY_LEFT_CURLY_BRACE, /* 0x7b { */ + PKEY_BAR, /* 0x7c | */ + PKEY_RIGHT_CURLY_BRACE, /* 0x7d } */ + PKEY_TILDE, /* 0x7e ~ */ + PKEY_ERASE, /* 0x7f DEL */ +}; + +unsigned char esc_key_to_pkey[]={ + PKEY_NOKEY, /* 0x00 NUL */ + PKEY_NOKEY, /* 0x01 CTRL-A */ + PKEY_BACK1, /* 0x02 CTRL-B */ + PKEY_COPY1, /* 0x03 CTRL-C */ + PKEY_DATA1, /* 0x04 CTRL-D */ + PKEY_EDIT1, /* 0x05 CTRL-E */ + PKEY_NOKEY, /* 0x06 CTRL-F */ + PKEY_NOKEY, /* 0x07 CTRL-G */ + PKEY_HELP1, /* 0x08 CTRL-H */ + PKEY_NOKEY, /* 0x09 CTRL-I */ + PKEY_NOKEY, /* 0x0a CTRL-J */ + PKEY_NOKEY, /* 0x0b CTRL-K */ + PKEY_LAB1, /* 0x0c CTRL-L */ + PKEY_NEXT1, /* 0x0d CTRL-M */ + PKEY_NEXT1, /* 0x0e CTRL-N */ + PKEY_NOKEY, /* 0x0f CTRL-O */ + PKEY_SUPER1, /* 0x10 CTRL-P */ + PKEY_ACCESS, /* 0x11 CTRL-Q */ + PKEY_ERASE1, /* 0x12 CTRL-R */ + PKEY_STOP1, /* 0x13 CTRL-S */ + PKEY_TERM, /* 0x14 CTRL-T */ + PKEY_NOKEY, /* 0x15 CTRL-U */ + PKEY_NOKEY, /* 0x16 CTRL-V */ + PKEY_NOKEY, /* 0x17 CTRL-W */ + PKEY_NOKEY, /* 0x18 CTRL-X */ + PKEY_SUB1, /* 0x19 CTRL-Y */ + PKEY_NOKEY, /* 0x1a CTRL-Z */ + PKEY_NOKEY, /* 0x1b ESC */ + PKEY_NOKEY, /* 0x1c */ + PKEY_NOKEY, /* 0x1d */ + PKEY_NOKEY, /* 0x1e */ + PKEY_NOKEY, /* 0x1f */ + PKEY_NOKEY, /* 0x20 SPACE */ + PKEY_NOKEY, /* 0x21 ! */ + PKEY_NOKEY, /* 0x22 " */ + PKEY_NOKEY, /* 0x23 # */ + PKEY_NOKEY, /* 0x24 $ */ + PKEY_NOKEY, /* 0x25 % */ + PKEY_NOKEY, /* 0x26 & */ + PKEY_NOKEY, /* 0x27 ' */ + PKEY_NOKEY, /* 0x28 ( */ + PKEY_NOKEY, /* 0x29 ) */ + PKEY_NOKEY, /* 0x2a * */ + PKEY_NOKEY, /* 0x2b + */ + PKEY_NOKEY, /* 0x2c , */ + PKEY_NOKEY, /* 0x2d - */ + PKEY_NOKEY, /* 0x2e . */ + PKEY_NOKEY, /* 0x2f / */ + PKEY_NOKEY, /* 0x30 0 */ + PKEY_NOKEY, /* 0x31 1 */ + PKEY_NOKEY, /* 0x32 2 */ + PKEY_NOKEY, /* 0x33 3 */ + PKEY_NOKEY, /* 0x34 4 */ + PKEY_NOKEY, /* 0x35 5 */ + PKEY_NOKEY, /* 0x36 6 */ + PKEY_NOKEY, /* 0x37 7 */ + PKEY_NOKEY, /* 0x38 8 */ + PKEY_NOKEY, /* 0x39 9 */ + PKEY_NOKEY, /* 0x3a : */ + PKEY_NOKEY, /* 0x3b ; */ + PKEY_NOKEY, /* 0x3c < */ + PKEY_NOKEY, /* 0x3d = */ + PKEY_NOKEY, /* 0x3e > */ + PKEY_NOKEY, /* 0x3f ? */ + PKEY_NOKEY, /* 0x40 @ */ + PKEY_NOKEY, /* 0x41 A */ + PKEY_NOKEY, /* 0x42 B */ + PKEY_NOKEY, /* 0x43 C */ + PKEY_NOKEY, /* 0x44 D */ + PKEY_NOKEY, /* 0x45 E */ + PKEY_NOKEY, /* 0x46 F */ + PKEY_NOKEY, /* 0x47 G */ + PKEY_NOKEY, /* 0x48 H */ + PKEY_NOKEY, /* 0x49 I */ + PKEY_NOKEY, /* 0x4a J */ + PKEY_NOKEY, /* 0x4b K */ + PKEY_NOKEY, /* 0x4c L */ + PKEY_NOKEY, /* 0x4d M */ + PKEY_NOKEY, /* 0x4e N */ + PKEY_NOKEY, /* 0x4f O */ + PKEY_NOKEY, /* 0x50 P */ + PKEY_NOKEY, /* 0x51 Q */ + PKEY_NOKEY, /* 0x52 R */ + PKEY_NOKEY, /* 0x53 S */ + PKEY_NOKEY, /* 0x54 T */ + PKEY_NOKEY, /* 0x55 U */ + PKEY_NOKEY, /* 0x56 V */ + PKEY_NOKEY, /* 0x57 W */ + PKEY_NOKEY, /* 0x58 X */ + PKEY_NOKEY, /* 0x59 Y */ + PKEY_NOKEY, /* 0x5a Z */ + PKEY_NOKEY, /* 0x5b [ */ + PKEY_NOKEY, /* 0x5c / */ + PKEY_NOKEY, /* 0x5d ] */ + PKEY_NOKEY, /* 0x5e ^ */ + PKEY_NOKEY, /* 0x5f _ */ + PKEY_NOKEY, /* 0x60 ` */ + PKEY_NOKEY, /* 0x61 a */ + PKEY_NOKEY, /* 0x62 b */ + PKEY_NOKEY, /* 0x63 c */ + PKEY_NOKEY, /* 0x64 d */ + PKEY_NOKEY, /* 0x65 e */ + PKEY_NOKEY, /* 0x66 f */ + PKEY_NOKEY, /* 0x67 g */ + PKEY_NOKEY, /* 0x68 h */ + PKEY_NOKEY, /* 0x69 i */ + PKEY_NOKEY, /* 0x6a j */ + PKEY_NOKEY, /* 0x6b k */ + PKEY_NOKEY, /* 0x6c l */ + PKEY_NOKEY, /* 0x6d m */ + PKEY_NOKEY, /* 0x6e n */ + PKEY_NOKEY, /* 0x6f o */ + PKEY_NOKEY, /* 0x70 p */ + PKEY_NOKEY, /* 0x71 q */ + PKEY_NOKEY, /* 0x72 r */ + PKEY_NOKEY, /* 0x73 s */ + PKEY_NOKEY, /* 0x74 t */ + PKEY_NOKEY, /* 0x75 u */ + PKEY_NOKEY, /* 0x76 v */ + PKEY_NOKEY, /* 0x77 w */ + PKEY_NOKEY, /* 0x78 x */ + PKEY_NOKEY, /* 0x79 y */ + PKEY_NOKEY, /* 0x7a z */ + PKEY_NOKEY, /* 0x7b { */ + PKEY_NOKEY, /* 0x7c | */ + PKEY_NOKEY, /* 0x7d } */ + PKEY_NOKEY, /* 0x7e ~ */ +}; + +#endif /* KEY_H */ diff --git a/src/apple2enh/keyboard.c b/src/apple2enh/keyboard.c new file mode 100644 index 0000000..20a4520 --- /dev/null +++ b/src/apple2enh/keyboard.c @@ -0,0 +1,74 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * keyboard.c - Keyboard functions (apple2) + */ + +#include +#include +#include +#include +#include "../screen.h" +#include "../prefs.h" +#include "../keyboard.h" +#include "../protocol.h" +#include "key.h" + +static uint8_t ch; +static uint8_t shift_lock=false; +static uint8_t is_escape=false; +extern uint8_t xoff_enabled; +extern padBool TTY; + +/** + * keyboard_main - Handle the keyboard presses + */ +void keyboard_main(void) +{ + if (kbhit()) + { + ch=cgetc(); + if (is_escape==true && ch==0x1B) // ESC + { + screen_beep(); + + if (shift_lock==true) + shift_lock=false; + else + shift_lock=true; + + is_escape=false; + } + else if (is_escape==false && ch==0x1B) + is_escape=true; + else if (ch==0x1A) // CTRL-Z for prefs + prefs_run(); + else if (TTY) + { + keyboard_out_tty(ch); + } + else if (is_escape==true) + { + keyboard_out(esc_key_to_pkey[ch]); + is_escape=false; + } + else if (shift_lock==true) + { + keyboard_out(shiftlock_key_to_pkey[ch]); + } + else + { + keyboard_out(key_to_pkey[ch]); + } + } +} + +/** + * keyboard_clear() - Clear the keyboard buffer + */ +void keyboard_clear(void) +{ +} diff --git a/src/apple2enh/prefs.c b/src/apple2enh/prefs.c new file mode 100644 index 0000000..ef5dbfe --- /dev/null +++ b/src/apple2enh/prefs.c @@ -0,0 +1,80 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * prefs.c - Preferences menu functions - Apple2 specific + */ + +#include +#include +#include +#include "../prefs.h" +#include "../config.h" + +extern ConfigInfo config; +extern uint8_t ch; +extern uint8_t prefs_need_updating; +extern uint8_t touch_prefs_updated; +extern uint8_t io_prefs_updated; +extern uint8_t io_load_successful; + +/** + * Show PLATOTERM READY - Press '' for setup. + */ +void prefs_show_greeting(void) +{ + if (io_load_successful==false) + prefs_display("serial driver didn't load. check ssc."); + else + prefs_display("platoterm ready - -z for setup"); +} + +/** + * prefs_touch(void) + * Preferences for selecting touch driver + */ +void prefs_touch(void) +{ + prefs_display("m)ouse b)ack: "); + + ch=prefs_get_key_matching("mbMB"); + + switch(ch) + { + case 'm': + prefs_select("mouse"); + config.driver_mou=CONFIG_MOUSE_DRIVER_STDMOU; + break; + case 'b': + prefs_select("back"); + break; + } + + prefs_check_for_touch_change(); +} + +/** + * prefs_driver(void) + * Preferences menu to select serial driver + */ +void prefs_driver(void) +{ + prefs_display("driver - s)sc b)ack: "); + + ch=prefs_get_key_matching("sbSB"); + + switch(ch) + { + case 's': + prefs_select("ssc"); + config.driver_ser=CONFIG_SERIAL_DRIVER_SSC; + break; + case 'b': + prefs_select("back"); + break; + } + prefs_check_for_io_change(); +} + diff --git a/src/apple2enh/screen.c b/src/apple2enh/screen.c new file mode 100644 index 0000000..f1252ce --- /dev/null +++ b/src/apple2enh/screen.c @@ -0,0 +1,433 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * DHGR Extensions by Michael Sternberg + * based on the work by Allen Watson III (Apple Orchard Jan 1984) + * + * screen.c - Display output functions + */ + +#include +#include +#include +#include +#include +#include "../config.h" +#include "../protocol.h" +#include "../screen.h" +#include "dhgr_subs.h" + +extern ConfigInfo config; + +extern uint8_t font[]; +extern uint8_t fontm23[]; +extern uint8_t FONT_SIZE_X; +extern uint8_t FONT_SIZE_Y; +extern padBool FastText; /* protocol.c */ +extern padPt TTYLoc; +extern uint8_t CharWide; +extern uint8_t CharHigh; + +#define outb(addr,val) (*(addr)) = (val) +#define outw(addr,val) (*(addr)) = (val) + +static uint8_t bp=0; +static uint8_t bd=0; + +extern uint16_t mul0375(uint16_t val); + +extern void (*io_recv_serial_flow_on)(void); +extern void (*io_recv_serial_flow_off)(void); + +#define FONTPTR(a) (((a << 1) + a) << 1) +#define mul05(a) ((a>>1)+12) + +/** + * screen_load_driver() + * Load the TGI driver + */ +void screen_load_driver(void) +{ + dg(); /* Initialize DHGR (Double Hi-Res Graphics) */ + pen(); /* Set brush to monochrome */ +} + +/** + * screen_init_hook() + * Called after tgi_init to set any special features, e.g. nmi trampolines. + */ +void screen_init_hook(void) +{ +} + +/** + * dhbar() + * DHGR replacement for tgi_bar() + */ +void dhbar(int x1, int y1, int x2, int y2) +{ + int i; + if (y2 < y1) + { + i = y2; + y2 = y1; + y1 = i; + } + for (i=y1; i<=y2; i++) + { + dot_at(x1, i); + line_to(x2, i); + } +} + +/** + * screen_set_pen_mode() + * Set the pen mode based on CurMode. + */ +void screen_set_pen_mode(void) +{ + if (CurMode==ModeErase || CurMode==ModeInverse) + hue(DHGR_COLOR_BLACK); + else + hue(DHGR_COLOR_WHITE); +} + +/** + * screen_block_draw(Coord1, Coord2) - Perform a block fill from Coord1 to Coord2 + */ +void screen_block_draw(padPt* Coord1, padPt* Coord2) +{ + // Block erase takes forever, manually assert flow control. + io_recv_serial_flow_off(); + + screen_set_pen_mode(); + dhbar(Coord1->x+24,mul0375(Coord1->y^0x1FF),Coord2->x+24,mul0375(Coord2->y^0x1FF)); + + io_recv_serial_flow_on(); + +} + +/** + * screen_dot_draw(Coord) - Plot a mode 0 pixel + */ +void screen_dot_draw(padPt* Coord) +{ + screen_set_pen_mode(); + dot_at(Coord->x+24,mul0375(Coord->y^0x1FF)); +} + +/** + * screen_line_draw(Coord1, Coord2) - Draw a mode 1 line + */ +void screen_line_draw(padPt* Coord1, padPt* Coord2) +{ + screen_set_pen_mode(); + dot_at(Coord1->x+24, mul0375(Coord1->y^0x01FF)); + line_to(Coord2->x+24, mul0375(Coord2->y^0x01FF)); +} + +/** + * screen_tty_char - Called to plot chars when in tty mode + */ +void screen_tty_char(padByte theChar) +{ + if ((theChar >= 0x20) && (theChar < 0x7F)) { + screen_char_draw(&TTYLoc, &theChar, 1); + TTYLoc.x += CharWide; + } + else if ((theChar == 0x0b)) /* Vertical Tab */ + { + TTYLoc.y += CharHigh; + } + else if ((theChar == 0x08) && (TTYLoc.x > 7)) /* backspace */ + { + TTYLoc.x -= CharWide; + + hue(DHGR_COLOR_BLACK); + dhbar(TTYLoc.x,mul0375(TTYLoc.y^0x1FF),TTYLoc.x+CharWide,mul0375((TTYLoc.y+CharHigh)^0x1FF)); + hue(DHGR_COLOR_WHITE); + } + else if (theChar == 0x0A) /* line feed */ + TTYLoc.y -= CharHigh; + else if (theChar == 0x0D) /* carriage return */ + TTYLoc.x = 0; + + if (TTYLoc.x + CharWide > 511) { /* wrap at right side */ + TTYLoc.x = 0; + TTYLoc.y -= CharHigh; + } + + if (TTYLoc.y < 0) { + dhclr(); /* DHGR clear screen */ + TTYLoc.y=495; + } + +} + +/** + * Set the terminal colors + */ +void screen_update_colors(void) +{ +} + +/** + * Wait(void) - Sleep for approx 16.67ms + */ +void screen_wait(void) +{ + // TODO: 60hz wait +} + +/** + * screen_beep(void) - Beep the terminal + */ +void screen_beep(void) +{ + for (bd=0;bd<75;++bd) + { + POKE(0xC030,0); + for (bp=0;bp<75;++bp) + { + } + } +} + +/** + * screen_char_draw(Coord, ch, count) - Output buffer from ch* of length count as PLATO characters + */ +void screen_char_draw(padPt* Coord, unsigned char* ch, unsigned char count) +{ + int16_t offset; /* due to negative offsets */ + uint16_t x; /* Current X and Y coordinates */ + uint16_t y; + uint16_t* px; /* Pointers to X and Y coordinates used for actual plotting */ + uint16_t* py; + uint8_t i; /* current character counter */ + uint8_t a; /* current character byte */ + uint8_t j,k; /* loop counters */ + int8_t b; /* current character row bit signed */ + uint8_t width=FONT_SIZE_X; + uint8_t height=FONT_SIZE_Y; + uint16_t deltaX=1; + uint16_t deltaY=1; + uint8_t mainColor=DHGR_COLOR_WHITE; + uint8_t altColor=DHGR_COLOR_BLACK; + uint8_t *p; + uint8_t* curfont; + + switch(CurMem) + { + case M0: + curfont=font; + offset=-32; + break; + case M1: + curfont=font; + offset=64; + break; + case M2: + curfont=fontm23; + offset=-32; + break; + case M3: + curfont=fontm23; + offset=32; + break; + } + + if (CurMode==ModeRewrite) + { + altColor=DHGR_COLOR_BLACK; + } + else if (CurMode==ModeInverse) + { + altColor=DHGR_COLOR_WHITE; + } + + if (CurMode==ModeErase || CurMode==ModeInverse) + mainColor=DHGR_COLOR_BLACK; + else + mainColor=DHGR_COLOR_WHITE; + + hue(mainColor); + + x=(Coord->x&0x1FF)+24; + y=mul0375((Coord->y+15^0x1FF)&0x1FF); + + if (ModeBold) + y=mul0375((Coord->y+30^0x1FF)&0x1FF); + else + y=mul0375((Coord->y+15^0x1FF)&0x1FF); + + if (FastText==padF) + { + goto chardraw_with_fries; + } + + if (CurMode==ModeRewrite) + { + goto chardraw_rewrite; + } + + /* the diet chardraw routine - fast text output. */ + + hue(mainColor); + for (i=0;ix+=width; + x+=width; + y-=height; + } + + return; + +} diff --git a/src/apple2enh/splash.c.converted b/src/apple2enh/splash.c.converted new file mode 100644 index 0000000..83fece0 --- /dev/null +++ b/src/apple2enh/splash.c.converted @@ -0,0 +1,144 @@ +#include "../protocol.h" + padByte splash[] = +{ +0x1B, 0x02, 0x1B, 0x0C, 0x1B, 0x12, 0x1B, 0xD1, 0xC0, 0x50, 0xC0, + 0x1B, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0xE2, 0xC0, 0xC0, + 0xC0, 0xC0, 0x1B, 0x0C, 0x1B, 0x12, 0x1D, 0xAF, 0xF0, 0xC0, + 0x1B, 0x5A, 0x1B, 0xD1, 0xC0, 0x44, 0x41, 0x1B, 0xD1, 0xC0, + 0x50, 0xC0, 0x1B, 0x0C, 0x1B, 0x12, 0x1B, 0xD1, 0xC0, 0x50, + 0xC0, 0x1B, 0x5A, 0x1B, 0x50, 0x00, 0x41, 0xC0, 0x1B, 0xD1, + 0xC0, 0x50, 0xC0, 0x1D, 0x2E, 0xF0, 0x22, 0x48, 0x1B, 0x5A, + 0x1D, 0x2D, 0xF3, 0x21, 0xD4, 0xAF, 0xED, 0xD4, 0xF0, 0x55, + 0x72, 0xD7, 0x74, 0xD8, 0xF5, 0x5A, 0xDE, 0xF5, 0x22, 0x4B, + 0x50, 0xF3, 0xD2, 0x71, 0x55, 0x6F, 0xD7, 0xED, 0xD8, 0xEB, + 0x5A, 0xE8, 0xDB, 0xE4, 0x5C, 0x2E, 0xFF, 0x5C, 0xFA, 0xDB, + 0x78, 0x59, 0xF6, 0xD8, 0x74, 0x55, 0x72, 0x53, 0x71, 0x50, + 0x6F, 0x4B, 0xEE, 0xC3, 0x42, 0x2D, 0xF3, 0x42, 0xF3, 0x21, + 0xD4, 0x1D, 0x2E, 0xFA, 0x22, 0x42, 0xAF, 0xE8, 0x42, 0x48, + 0xCA, 0x4B, 0xE7, 0x4B, 0x66, 0xCC, 0xE4, 0x4D, 0xE2, 0x4E, + 0x2E, 0xFF, 0x4D, 0x7D, 0x4B, 0x7B, 0xC9, 0xFA, 0x48, 0x42, + 0x1D, 0x2D, 0xFA, 0xA3, 0xC0, 0xAF, 0xF5, 0xC0, 0x4E, 0x2E, + 0x60, 0x4E, 0x60, 0x24, 0x41, 0x2D, 0xF3, 0x41, 0xF3, 0xA3, + 0x47, 0xC5, 0xF5, 0xC3, 0x77, 0xC0, 0xFA, 0xC0, 0x1D, 0xF3, + 0x24, 0xC0, 0xAF, 0xF0, 0xD2, 0x72, 0x53, 0xF3, 0xD4, 0xF5, + 0x55, 0x56, 0xF6, 0xD8, 0x77, 0x5A, 0x5C, 0xF6, 0xDE, 0xF5, + 0xA5, 0x41, 0xF3, 0x42, 0x71, 0x44, 0x2D, 0xF3, 0x56, 0x48, + 0x2E, 0x60, 0xC5, 0x60, 0x24, 0xD2, 0x2D, 0xF3, 0x4E, 0xC0, + 0x1D, 0x2E, 0xED, 0x55, 0xAF, 0x69, 0xDB, 0x2E, 0xED, 0xA5, + 0x41, 0xED, 0x24, 0x55, 0x1D, 0x2D, 0xF3, 0xA5, 0xDD, 0xAF, + 0x69, 0xDD, 0x50, 0xF5, 0x50, 0xF5, 0xA6, 0xD7, 0x69, 0xD7, + 0xCA, 0x2D, 0xF3, 0xCA, 0xF3, 0xA5, 0xDD, 0x1D, 0x2E, 0xF0, + 0x27, 0xD1, 0x1D, 0x2D, 0xF3, 0xD4, 0x74, 0xCC, 0xF5, 0x48, + 0xF6, 0xC5, 0xFA, 0x41, 0xFC, 0xA6, 0x5F, 0x2E, 0x60, 0x5C, + 0x63, 0x59, 0x65, 0x59, 0xE8, 0xD7, 0xEE, 0x56, 0x74, 0xD4, + 0xF5, 0xD4, 0x78, 0xD4, 0xFC, 0x55, 0xFF, 0x56, 0xAF, 0xE2, + 0xD7, 0x65, 0x59, 0xE8, 0xDB, 0xEB, 0xDD, 0x6C, 0xDE, 0xEE, + 0x27, 0xC0, 0xF0, 0xC3, 0x72, 0xC5, 0xF3, 0x47, 0xF5, 0x4B, + 0xF6, 0xD1, 0x77, 0xD7, 0xD8, 0xF6, 0xDD, 0xF5, 0x28, 0x41, + 0x74, 0xC6, 0x72, 0x48, 0x71, 0xCA, 0x6F, 0xCC, 0xED, 0x4E, + 0xEB, 0xD1, 0xE7, 0x53, 0x63, 0x55, 0x2E, 0xFF, 0xD7, 0xFA, + 0xD8, 0xF9, 0xD8, 0xF5, 0xD8, 0x72, 0xD8, 0xEE, 0xD8, 0x6A, + 0xD7, 0xE7, 0x55, 0xE4, 0xD4, 0x60, 0xD1, 0x2D, 0x7D, 0xCF, + 0xFA, 0xCC, 0x78, 0xCA, 0xF6, 0xC6, 0x74, 0xC3, 0xF3, 0x27, + 0x5F, 0xD4, 0x1D, 0xAF, 0xE8, 0xD4, 0xD7, 0xDB, 0xE7, 0xDE, + 0xE4, 0x28, 0x42, 0xE2, 0x44, 0x2E, 0xFF, 0x47, 0xFC, 0x48, + 0xF9, 0xC9, 0xF6, 0xCA, 0xF3, 0xCA, 0xEE, 0xC9, 0xEB, 0x47, + 0x69, 0xC6, 0xE7, 0x44, 0x65, 0x42, 0xE4, 0x41, 0xE2, 0x27, + 0xDD, 0xE1, 0x5A, 0x60, 0xD7, 0xD4, 0xE1, 0xD1, 0x63, 0x4D, + 0xE4, 0x4B, 0x66, 0xC9, 0xE8, 0x47, 0x6A, 0xC5, 0x6C, 0x44, + 0xEE, 0xC3, 0x71, 0xC3, 0x74, 0xC3, 0x77, 0xC3, 0xFC, 0x44, + 0xFF, 0xC6, 0xAF, 0xE1, 0x48, 0x63, 0xCA, 0xE4, 0x4B, 0x65, + 0xCC, 0x66, 0x4D, 0xE7, 0x4E, 0xE8, 0xD1, 0xD4, 0x1D, 0x2D, + 0xF3, 0xA9, 0x44, 0xAF, 0x69, 0x44, 0x69, 0x28, 0xD7, 0xF5, + 0xD7, 0xF5, 0xA9, 0xDE, 0x69, 0xDE, 0xD1, 0x2D, 0xF3, 0xD1, + 0x44, 0x1D, 0x2E, 0x60, 0xAA, 0xC3, 0xAF, 0xED, 0xC3, 0x6F, + 0x44, 0x72, 0xC5, 0xF3, 0xC6, 0x74, 0xC6, 0xF5, 0x47, 0xC9, + 0xF6, 0x4B, 0xF6, 0x2B, 0x44, 0xE8, 0x44, 0xE8, 0xAA, 0x50, + 0x2E, 0x7D, 0x50, 0x7D, 0x2B, 0xC3, 0x71, 0xC3, 0x71, 0xAA, + 0x50, 0xE1, 0x50, 0xE1, 0x2B, 0x44, 0x2D, 0xF3, 0x44, 0xF3, + 0xAA, 0xCC, 0x74, 0xC9, 0xF5, 0x48, 0xF6, 0x47, 0x77, 0xC6, + 0xF9, 0x44, 0xFA, 0xC3, 0x2E, 0x60, 0xC3, 0x1D, 0x2D, 0xF3, + 0x2B, 0xC6, 0xAF, 0xED, 0xC6, 0xF0, 0x47, 0x72, 0x48, 0xC9, + 0xF3, 0xCA, 0x74, 0xCA, 0xF5, 0x4B, 0x4D, 0xDD, 0x5F, 0xF5, + 0xAC, 0x42, 0x74, 0x44, 0xF3, 0xC6, 0x72, 0x47, 0x71, 0xC9, + 0xF0, 0xCA, 0xEE, 0x4B, 0xCC, 0xED, 0x4D, 0xEB, 0x4E, 0x6A, + 0x4E, 0xE8, 0xCF, 0x66, 0x50, 0xE4, 0x50, 0x63, 0x50, 0xE1, + 0x50, 0x2E, 0x7E, 0xCF, 0x7B, 0x4E, 0xFA, 0x4E, 0x78, 0x4D, + 0x77, 0x4B, 0xF5, 0xCA, 0x74, 0x47, 0xF3, 0xC5, 0x72, 0x44, + 0x71, 0xC3, 0x2D, 0xF3, 0xD4, 0x44, 0x2E, 0xF0, 0x2B, 0x56, + 0x71, 0x55, 0x74, 0x55, 0x77, 0x56, 0x78, 0xD7, 0xF9, 0x59, + 0xFA, 0x5A, 0xDB, 0x7B, 0xDD, 0x7D, 0x5F, 0x7E, 0xAC, 0xC0, + 0xAF, 0x60, 0x41, 0xE4, 0x41, 0x66, 0xC0, 0xE8, 0x2B, 0xDE, + 0x69, 0xDD, 0xD4, 0x2D, 0xF3, 0xD4, 0xC6, 0x1D, 0xF3, 0xAC, + 0x53, 0xAF, 0xF0, 0x53, 0xF3, 0xD4, 0xF5, 0x56, 0xD8, 0xF6, + 0x5A, 0x5C, 0xF5, 0x2D, 0xC0, 0x42, 0xF3, 0x44, 0x72, 0xC5, + 0xF0, 0xC5, 0x2E, 0x65, 0xD2, 0xAF, 0xF0, 0x5C, 0x72, 0xDD, + 0x74, 0x5F, 0xF5, 0x5F, 0xF5, 0x2E, 0xC0, 0xF6, 0x42, 0x77, + 0x44, 0x47, 0xF6, 0xCA, 0xF5, 0xCC, 0xF3, 0x4E, 0xF0, 0x50, + 0xEE, 0x50, 0x2D, 0xF3, 0x50, 0x44, 0xAF, 0xE2, 0x44, 0x2D, + 0xFA, 0x2D, 0x59, 0x77, 0xD8, 0xF5, 0xD7, 0xF3, 0x55, 0xCF, + 0xF5, 0x4D, 0xF6, 0xCC, 0x77, 0xCC, 0xFC, 0xCA, 0x2E, 0xE1, + 0x48, 0xE7, 0x47, 0x6C, 0xC5, 0xAF, 0xE1, 0xAC, 0xDE, 0x2D, + 0xF3, 0xDE, 0x53, 0x1D, 0x2E, 0xF0, 0xAF, 0xC0, 0x1B, 0xD1, + 0xC0, 0x50, 0xC0, 0x1D, 0xAC, 0x78, 0x24, 0x5C, 0x1B, 0x5A, + 0x9F, 0x1B, 0x12, 0x1B, 0xCC, 0x1B, 0xCF, 0x1B, 0xCA, 0x66, + 0x6F, 0x72, 0x1B, 0xCC, 0x1B, 0x4E, 0x1B, 0xCA, 0x1B, 0xD1, + 0xC0, 0x50, 0xC0, 0x1D, 0xA3, 0x78, 0x2B, 0xD8, 0x1B, 0x5A, + 0x1D, 0xAA, 0xED, 0xA3, 0x56, 0xAC, 0xE8, 0x56, 0xE8, 0x22, + 0x47, 0x1D, 0x2B, 0xEB, 0x50, 0x1D, 0xAC, 0xE8, 0x47, 0xE4, + 0x21, 0x5F, 0x2B, 0x7E, 0x59, 0x77, 0xD4, 0x6F, 0xD2, 0xE7, + 0xD2, 0xAA, 0xFF, 0xD4, 0x78, 0x59, 0x72, 0x5F, 0xEE, 0x22, + 0x47, 0x5C, 0x7E, 0x5C, 0x4D, 0x1D, 0x2B, 0xEB, 0x50, 0x1D, + 0xAA, 0xFF, 0xCF, 0x2B, 0x60, 0x4B, 0xE2, 0x47, 0x65, 0xC5, + 0x69, 0x44, 0xED, 0x44, 0x71, 0xC5, 0x74, 0x47, 0xF6, 0x4B, + 0x77, 0xCF, 0x77, 0xA3, 0x44, 0xAA, 0xED, 0x44, 0x56, 0x1D, + 0xA9, 0x7D, 0x5F, 0xAC, 0xE8, 0x5F, 0xE8, 0xA5, 0x4E, 0x1D, + 0x2B, 0xEB, 0xC6, 0x1D, 0xAC, 0xE8, 0xCF, 0xE4, 0xD7, 0x2B, + 0x7E, 0xDD, 0x77, 0xA6, 0x42, 0x6F, 0x44, 0xE7, 0x44, 0xAA, + 0xFF, 0x42, 0x78, 0xA5, 0xDD, 0x72, 0xD7, 0xEE, 0xCF, 0xEE, + 0x24, 0x59, 0x7E, 0x59, 0x7E, 0xA5, 0xC6, 0x1D, 0x2B, 0xEB, + 0xC5, 0x1D, 0xAA, 0xFF, 0xC6, 0x2B, 0x60, 0xCA, 0xE2, 0x4D, + 0x65, 0x50, 0x69, 0xD1, 0xED, 0xD1, 0x71, 0x50, 0x74, 0x4D, + 0xF6, 0xCA, 0x77, 0xC6, 0x77, 0x24, 0x50, 0xA9, 0x7D, 0x50, + 0x7D, 0xA3, 0x5F, 0x1D, 0x7D, 0xA6, 0xCC, 0xAC, 0xE8, 0xCC, + 0xE8, 0x27, 0xDB, 0x1D, 0x2B, 0xEB, 0x53, 0x1D, 0xAC, 0xE7, + 0xDB, 0xE4, 0x28, 0xC3, 0x2B, 0x7E, 0xC9, 0x77, 0x4E, 0x6F, + 0x50, 0xE7, 0x50, 0xAA, 0xFF, 0x4E, 0x78, 0xC9, 0x72, 0xC3, + 0x6F, 0x27, 0xDB, 0xC6, 0x7E, 0xC6, 0xD4, 0x1D, 0x2B, 0xEB, + 0xD2, 0x1D, 0xAA, 0xFF, 0xD4, 0x2B, 0x60, 0xD8, 0xE2, 0xDB, + 0x66, 0xDD, 0x69, 0xDE, 0xED, 0xDE, 0xF0, 0xDD, 0x74, 0xDB, + 0xF6, 0xD8, 0x77, 0xD4, 0x77, 0xA6, 0xDE, 0xA9, 0x7D, 0xDE, + 0xCC, 0x1D, 0xAA, 0xED, 0x28, 0x59, 0xED, 0xA9, 0xCA, 0xAC, + 0xFA, 0xCA, 0xFA, 0x28, 0x59, 0xAA, 0xED, 0x59, 0x1D, 0xED, + 0x2B, 0xD7, 0xED, 0xAA, 0xCA, 0x1D, 0x2B, 0xEB, 0xD2, 0x1D, + 0xAA, 0xEE, 0xCA, 0x71, 0x42, 0x77, 0xA9, 0xDB, 0x7E, 0x56, + 0x2B, 0xE7, 0xD4, 0x6F, 0xD4, 0x78, 0x56, 0xFF, 0xDB, 0xAC, + 0x65, 0xAA, 0x42, 0xE8, 0xCA, 0xE8, 0x2B, 0xD7, 0x2B, 0x71, + 0xD7, 0x63, 0xCA, 0x63, 0xAA, 0xD4, 0x77, 0x2B, 0x48, 0x77, + 0xAA, 0x4E, 0x1D, 0x6A, 0x50, 0x1D, 0xF6, 0x4E, 0xF5, 0xCA, + 0xF3, 0x47, 0x6F, 0xC5, 0x6C, 0x44, 0xE8, 0x44, 0x65, 0xC5, + 0xE1, 0x47, 0xAA, 0xFF, 0xCA, 0x7E, 0x4E, 0x7E, 0x2B, 0xD7, + 0xED, 0xD7, 0x1D, 0xED, 0x2D, 0xC3, 0xED, 0xAC, 0xC3, 0x7D, + 0xC3, 0xD1, 0xAC, 0x69, 0xD1, 0x42, 0xF9, 0x42, 0xF9, 0x2D, + 0xC3, 0xAA, 0xED, 0xC3, 0x1D, 0xEE, 0x48, 0xAC, 0xF9, 0x48, + 0xF9, 0x2E, 0x47, 0x69, 0x47, 0x69, 0x2D, 0xD8, 0xAA, 0x7D, + 0xD8, 0x7D, 0x2E, 0x47, 0xED, 0x47, 0xED, 0x2D, 0x48, 0x1D, + 0xA9, 0x60, 0xA0, 0xC0, 0x1B, 0x5A, 0x9F, 0x1B, 0x12, 0xC3, + 0x6F, 0xF0, 0xF9, 0x72, 0x69, 0xE7, 0xE8, 0x74, 0xA0, 0x28, + 0x1B, 0xC3, 0xC0, 0x1B, 0x42, 0xA9, 0xA0, 0xB2, 0x30, 0xB1, + 0xB8, 0xA0, 0xC9, 0xD2, 0x41, 0xD4, 0x41, 0x2E, 0xCF, 0x4E, + 0xCC, 0xC9, 0x4E, 0xC5, 0x2E, 0xA0, 0xD4, 0xE8, 0x69, 0xF3, + 0xA0, 0x74, 0x65, 0x72, 0xED, 0x69, 0xEE, 0xE1, 0x6C, 0xA0, + 0x69, 0xF3, 0xA0, 0x72, 0x65, 0x6C, 0x65, 0xE1, 0xF3, 0x65, + 0xE4, 0xA0, 0xF5, 0xEE, 0xE4, 0x65, 0x72, 0x8D, 0x74, 0xE8, + 0x65, 0xA0, 0x47, 0x4E, 0x55, 0xA0, 0x50, 0xF5, 0xE2, 0x6C, + 0x69, 0x63, 0xA0, 0xCC, 0x69, 0x63, 0x65, 0xEE, 0xF3, 0x65, + 0x2E, 0xA0, 0xD2, 0xF5, 0xEE, 0xA0, 0x74, 0xE8, 0x65, 0xA0, + 0xF0, 0x72, 0x6F, 0xE7, 0x72, 0xE1, 0xED, 0xA0, 0x47, 0x50, + 0xCC, 0xAC, 0xA0, 0x66, 0x6F, 0x72, 0xA0, 0xE4, 0x65, 0x74, + 0xE1, 0x69, 0x6C, 0xF3, 0x2E, 0x1D, 0x1B, 0x12, 0x28, 0xF0, + 0x2E, 0x48, 0x1D, 0xA9, 0x74, 0xA0, 0xC0, 0x74, 0xAF, 0x5F, + 0x1D, 0x28, 0x6C, 0xA0, 0xC0, 0x6C, 0xAF, 0x5F, 0x1D, 0x27, + 0x60, 0xA0, 0xC0, 0x1B, 0x5A, 0x1B, 0x03 }; + short splash_size = 1388; + diff --git a/src/apple2enh/terminal_char_load.c b/src/apple2enh/terminal_char_load.c new file mode 100644 index 0000000..b0e0bbe --- /dev/null +++ b/src/apple2enh/terminal_char_load.c @@ -0,0 +1,55 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * terminal_char_load.c - Character set loading routine for 8x6 font. + */ + +#include +#include +#include +#include "../terminal.h" +#include "../protocol.h" + +// Temporary PLATO character data, 8x16 matrix +static unsigned char char_data[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + +static unsigned char BTAB[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // flip one bit on (OR) + +static unsigned char curr_word; // current word +static unsigned char u; // loop counter + +extern unsigned char fontm23[768]; + +/** + * terminal_char_load - Store a character into the user definable + * character set. + */ +void terminal_char_load(padWord charNum, charData theChar) +{ + // Clear char data. + memset(char_data,0,sizeof(char_data)); + + // load and transpose character data into 8x16 array + for (curr_word=0; curr_word<8; curr_word++) + { + for (u=16; u-->0; ) + { + if (theChar[curr_word] & 1< + * + * touch.c - Touchscreen functions (apple2) + */ + +#include "../protocol.h" +#include "../convert_coordinates.h" +#include +#include "../config.h" + +/** + * touch_translate - Translate coordinates from native system to PLATO + */ +void touch_translate(padPt* Coord) +{ + Coord->x = touch_scale_256(Coord->x); + Coord->y = touch_scale_192(Coord->y); +} + +/** + * touch_driver_name() - Get the driver name for the given driver # + */ +const char* touch_driver_name(unsigned char driver) +{ + switch(driver) + { + case CONFIG_MOUSE_DRIVER_STDMOU: + return "a2.stdmou.mou"; + } +} diff --git a/src/plato.c b/src/plato.c index 69a7f29..4ad9c5d 100644 --- a/src/plato.c +++ b/src/plato.c @@ -34,8 +34,13 @@ void main(void) config_init(); touch_init(); terminal_init(); +#if defined(__APPLE2__) || defined(__APPLE2ENH__) + io_init(); + greeting(); +#else greeting(); io_init(); +#endif screen_beep(); already_started=true; diff --git a/src/prefs_base.c b/src/prefs_base.c index fd9ebf8..ca57ab0 100644 --- a/src/prefs_base.c +++ b/src/prefs_base.c @@ -25,6 +25,9 @@ #include "terminal.h" #include "config.h" #include "touch.h" +#ifdef __APPLE2ENH__ +#include "./apple2enh/dhgr_subs.h" +#endif extern ConfigInfo config; @@ -373,11 +376,17 @@ unsigned char prefs_get_key_matching1(const char* matches) void prefs_clear(void) { uint8_t c; +#ifdef __APPLE2ENH__ + hue(DHGR_COLOR_BLACK); + dhbar(0,185,519,191); + hue(DHGR_COLOR_WHITE); +#else c=tgi_getcolor(); tgi_setcolor(TGI_COLOR_BLACK); - tgi_bar(0,185,319,192); + tgi_bar(0,185,319,191); tgi_setcolor(c); ShowPLATO("\n\v",2); +#endif } /** diff --git a/src/screen_base.c b/src/screen_base.c index a2483b3..57fe9d2 100644 --- a/src/screen_base.c +++ b/src/screen_base.c @@ -17,6 +17,9 @@ #include "protocol.h" #include "config.h" #include "io.h" +#ifdef __APPLE2ENH__ +#include "./apple2enh/dhgr_subs.h" +#endif uint8_t CharWide=8; uint8_t CharHigh=16; @@ -40,9 +43,13 @@ extern uint8_t FONT_SIZE_Y; void screen_init(void) { screen_load_driver(); +#ifdef __APPLE2ENH__ + screen_init_hook(); +#else tgi_init(); screen_init_hook(); tgi_clear(); +#endif } /** @@ -68,7 +75,11 @@ void screen_splash(void) */ void screen_clear(void) { +#ifdef __APPLE2ENH__ + dhclr(); +#else tgi_clear(); +#endif screen_update_colors(); } @@ -216,6 +227,8 @@ void screen_paint(padPt* Coord) */ void screen_done(void) { +#ifndef __APPLE2ENH__ tgi_done(); tgi_uninstall(); +#endif }