mirror of
https://github.com/dschmenk/PLASMA.git
synced 2026-04-20 01:16:36 +00:00
80 column editor support for Apple ///
This commit is contained in:
+16
-27
@@ -3,6 +3,7 @@ WELCOME TO THE PLASMA EDITOR!
|
||||
|
||||
FIRST THINGS FIRST:
|
||||
TO NAVIGATE, USE THE ARROW KEYS.
|
||||
|
||||
ON THE APPLE ][:
|
||||
|
||||
CTRL-K = UP
|
||||
@@ -24,18 +25,13 @@ EXIT BY ENTERING 'Q' AND 'RETURN'.
|
||||
YOU CAN ALSO RETURN TO THE EDITOR BY
|
||||
JUST PRESSING 'RETURN'.
|
||||
|
||||
-------
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
THE PLASMA EDITOR IS A SIMPLE TEXT
|
||||
EDITOR FOR ENTERING AND MANIPULATING
|
||||
TEXT AND SOURCE CODE FILES. THE
|
||||
EDITOR ONLY SUPPORTS 40 COLUMN TEXT
|
||||
ALTHOUGH LINES CAN BE UP TO 79
|
||||
CHARACTERS LONG. THE SCREEN WILL
|
||||
SCROLL HORIZONTALLY AS THE CURSOR
|
||||
MOVES. THERE IS ABOUT 16K TO 30K
|
||||
OF MEMORY FOR THE TEXT BUFFER,
|
||||
DEPENDING ON YOUR CONFIGURATION.
|
||||
THE PLASMA EDITOR IS A SIMPLE TEXT EDITOR FOR ENTERING AND MANIPULATING
|
||||
TEXT AND SOURCE CODE FILES. THE EDITOR SUPPORTS FROM 40 TO 128 COLUMN MODE
|
||||
WITH LINES THAT CAN BE UP TO 127 CHARACTERS LONG. THE SCREEN WILL SCROLL
|
||||
HORIZONTALLY AS THE CURSOR MOVES, IF NEDED. THERE IS ABOUT 16K TO 30K OF
|
||||
MEMORY FOR THE TEXT BUFFER, DEPENDING ON YOUR CONFIGURATION.
|
||||
|
||||
IT HAS TWO MODES, COMMAND AND EDIT.
|
||||
|
||||
@@ -80,24 +76,19 @@ EDIT COMMANDS:
|
||||
CTRL-L = SHIFT LOCK
|
||||
SHIFT-LEFT ARROW = DELETE (SHIFT-MOD)
|
||||
|
||||
WITH THE SHIFT-KEY MOD ON AN
|
||||
APPLE ][, UPPER AND LOWER CASE
|
||||
ENTRY WORKS AS EXPECTED.
|
||||
WITH THE SHIFT-KEY MOD ON AN APPLE ][, UPPER AND LOWER CASE ENTRY WORKS
|
||||
AS EXPECTED.
|
||||
|
||||
ESC T C = FORCE LOWER-CASE CHARS
|
||||
|
||||
If you have a lower-case character
|
||||
generator installed, you can force
|
||||
lower-case display. Otherwise,
|
||||
upper case will be displayed normally
|
||||
but lower-case will be displayed in
|
||||
inverse. This is the default.
|
||||
If you have a lower-case character generator installed, you can force
|
||||
lower-case display. Otherwise, upper case will be displayed normally
|
||||
but lower-case will be displayed in inverse. This is the default.
|
||||
|
||||
Apple //e AND //c FEATURES:
|
||||
---------------------------
|
||||
|
||||
The 'SOLID-APPLE' key will modify
|
||||
these keys:
|
||||
The 'SOLID-APPLE' key will modify these keys:
|
||||
|
||||
SA-RETURN = OPEN FOLLOWING LINE
|
||||
SA-LEFT ARROW = JUMP LEFT
|
||||
@@ -109,8 +100,7 @@ EDIT COMMANDS:
|
||||
Apple /// FEATURES:
|
||||
-------------------
|
||||
|
||||
The 'OPEN-APPLE' key will modify
|
||||
these keys:
|
||||
The 'OPEN-APPLE' key will modify these keys:
|
||||
|
||||
OA-\ = DELETE CHAR LEFT
|
||||
OA-RETURN = OPEN FOLLOWING LINE
|
||||
@@ -123,9 +113,8 @@ EDIT COMMANDS:
|
||||
Apple //e Platinum AND /// FEATURES:
|
||||
------------------------------------
|
||||
|
||||
On the keypad, 'OPTION' on //e Plat
|
||||
or 'OPEN-APPLE' on the /// allows
|
||||
the keys for navigation and misc:
|
||||
On the keypad, 'OPTION' on //e Platinum or 'OPEN-APPLE' on the ///
|
||||
allows the keys for navigation and misc operations:
|
||||
|
||||
OA-4 = MOVE CHAR LEFT
|
||||
OA-6 = MOVE CHAR RIGHT
|
||||
|
||||
Binary file not shown.
Binary file not shown.
+123
-53
@@ -107,10 +107,8 @@ byte[] UltraTermHeight = 24, 24, 24, 24, 32, 48, 24, 32
|
||||
//
|
||||
// Apple 3 console codes.
|
||||
//
|
||||
byte textbwmode[] = 2, 16, 0
|
||||
byte textclrmode[] = 2, 16, 1
|
||||
byte grcharset[] = 1, 0, $7F, $7F, $7F, $7F, $00, $00, $00, $00
|
||||
byte a3keyqueue = 0
|
||||
byte grcharset[] = 1, 0, $7F, $7F, $7F, $7F, $00, $00, $00, $00
|
||||
byte a3keyqueue = 0
|
||||
//
|
||||
// Random number for Apple 1 and III.
|
||||
//
|
||||
@@ -178,7 +176,7 @@ asm a2grplot(x, y)
|
||||
INX
|
||||
RTS
|
||||
end
|
||||
asm cout(chr)#0
|
||||
asm a2cout(chr)#0
|
||||
LCRDEN = $C080
|
||||
LCWTEN = $C081
|
||||
ROMEN = $C082
|
||||
@@ -364,6 +362,25 @@ PAGE1X = $C055
|
||||
INX
|
||||
RTS
|
||||
end
|
||||
asm vid3cpy(dstrow, srcrow)#0
|
||||
LDA ESTKL+1,X
|
||||
STA DSTL
|
||||
LDA ESTKH+1,X
|
||||
STA DSTH
|
||||
LDA ESTKL,X
|
||||
STA SRCL
|
||||
LDA ESTKH,X
|
||||
STA SRCH
|
||||
LDY #40
|
||||
DEY
|
||||
- LDA (SRC),Y
|
||||
STA (DST),Y
|
||||
DEY
|
||||
BPL -
|
||||
INX
|
||||
INX
|
||||
RTS
|
||||
end
|
||||
//
|
||||
// Apple 1 routines.
|
||||
//
|
||||
@@ -525,13 +542,13 @@ end
|
||||
def a2clear80(clr)
|
||||
when clr
|
||||
is cleol // clear EOL
|
||||
cout(29) // GS
|
||||
a2cout(29) // GS
|
||||
break
|
||||
is cls // home
|
||||
cout(12) // FF
|
||||
a2cout(12) // FF
|
||||
break
|
||||
is cleos // clear OES
|
||||
cout(11) // VT
|
||||
a2cout(11) // VT
|
||||
break
|
||||
wend
|
||||
return 0
|
||||
@@ -545,7 +562,7 @@ def a2gotoxy80e(x, y)
|
||||
return call($FB5B, y + ^WNDTOP, 0, 0, 0) // TABV
|
||||
end
|
||||
def a2gotoxy80v(x, y)
|
||||
cout(30); cout(x + ' '); cout(y + ' ')
|
||||
a2cout(30); a2cout(x + ' '); a2cout(y + ' ')
|
||||
return 0
|
||||
end
|
||||
def a2viewport(left, top, width, height)
|
||||
@@ -675,9 +692,9 @@ def a2ctrl80v(code, param)#1
|
||||
^$C0B0 = $0A
|
||||
^$C0B1 = $20
|
||||
elsif flags & txt80a
|
||||
cout(20) // Ctrl-T
|
||||
cout('C')
|
||||
cout('7')
|
||||
a2cout(20) // Ctrl-T
|
||||
a2cout('C')
|
||||
a2cout('7')
|
||||
fin
|
||||
break
|
||||
is INVERSE
|
||||
@@ -685,9 +702,9 @@ def a2ctrl80v(code, param)#1
|
||||
^$C0B0 = $0A
|
||||
^$C0B1 = $00
|
||||
elsif flags & txt80a
|
||||
cout(20) // Ctrl-T
|
||||
cout('C')
|
||||
cout('3')
|
||||
a2cout(20) // Ctrl-T
|
||||
a2cout('C')
|
||||
a2cout('3')
|
||||
fin
|
||||
break
|
||||
otherwise
|
||||
@@ -695,16 +712,16 @@ def a2ctrl80v(code, param)#1
|
||||
^$C0B0 = $0A
|
||||
^$C0B1 = $C0
|
||||
elsif flags & txt80a
|
||||
cout(20) // Ctrl-T
|
||||
cout('C')
|
||||
cout('3')
|
||||
a2cout(20) // Ctrl-T
|
||||
a2cout('C')
|
||||
a2cout('3')
|
||||
fin
|
||||
wend
|
||||
handled = TRUE
|
||||
break
|
||||
is ctrlscroll
|
||||
if param == UP
|
||||
cout(30); cout(' '); cout(^WNDBOTTOM + ' ' - 1); cout(10)
|
||||
a2cout(30); a2cout(' '); a2cout(^WNDBOTTOM + ' ' - 1); a2cout(10)
|
||||
handled = TRUE
|
||||
fin
|
||||
break
|
||||
@@ -739,10 +756,10 @@ def a2textmode(columns)
|
||||
^$C059
|
||||
if columns > 80 and columns <= 88 \
|
||||
and ^$C304 == $39 // Check for UltraTerm modes
|
||||
cout(22); cout(columns - 80 + '0')
|
||||
a2cout(22); a2cout(columns - 80 + '0')
|
||||
^WNDBOTTOM = UltraTermHeight[columns - 81]
|
||||
else
|
||||
cout(22); cout('1') // Ensure 80x24
|
||||
a2cout(22); a2cout('1') // Ensure 80x24
|
||||
columns = 80
|
||||
fin
|
||||
fin
|
||||
@@ -751,12 +768,12 @@ def a2textmode(columns)
|
||||
else
|
||||
if flags & txt80
|
||||
if flags & txt80e // IIe disable
|
||||
cout(21)
|
||||
a2cout(21)
|
||||
elsif flags & txt80v // Videx disable
|
||||
cout(26); cout('1')
|
||||
a2cout(26); a2cout('1')
|
||||
^$C058
|
||||
elsif flags & txt80a // ALS SmartTerm disable
|
||||
cout(20); cout('A'); cout('1')
|
||||
a2cout(20); a2cout('A'); a2cout('1')
|
||||
fin
|
||||
*CSW = cswsave
|
||||
*KSW = kswsave
|
||||
@@ -836,25 +853,55 @@ def a3getkey
|
||||
a3keyqueue = 0
|
||||
return keycode
|
||||
end
|
||||
def a3putchar(chr)#0
|
||||
byte params[6]
|
||||
|
||||
params.0 = 3
|
||||
params.1 = cmdsys.refcons
|
||||
params:2 = @chr
|
||||
params:4 = 1
|
||||
syscall($CB, @params)
|
||||
end
|
||||
def a3putchars(cnt, chrs)
|
||||
byte params[6]
|
||||
byte c
|
||||
|
||||
if chrs < 256
|
||||
for c = 1 to cnt
|
||||
putc(chrs)
|
||||
next
|
||||
params.0 = 3
|
||||
params.1 = cmdsys.refcons
|
||||
if chrs & $FF00
|
||||
params:2 = chrs
|
||||
params:4 = cnt
|
||||
syscall($CB, @params)
|
||||
else
|
||||
for c = 0 to cnt-1
|
||||
putc(chrs->[c])
|
||||
params:2 = @chrs
|
||||
params:4 = 1
|
||||
for c = 1 to cnt
|
||||
syscall($CB, @params)
|
||||
next
|
||||
fin
|
||||
return cnt
|
||||
end
|
||||
def a3clear(clr)
|
||||
when clr
|
||||
is cleol // clear EOL
|
||||
a3putchar(31) // GS
|
||||
break
|
||||
is cls // home
|
||||
a3putchar(28) // FF
|
||||
break
|
||||
is cleos // clear OES
|
||||
a3putchar(29) // VT
|
||||
break
|
||||
wend
|
||||
return 0
|
||||
end
|
||||
def a3gotoxy(x, y)
|
||||
putc(24)
|
||||
putc(x)
|
||||
putc(25)
|
||||
putc(y)
|
||||
char chrs[3]
|
||||
|
||||
chrs[0] = 26
|
||||
chrs[1] = x
|
||||
chrs[2] = y
|
||||
a3putchars(3, @chrs)
|
||||
return 0
|
||||
end
|
||||
def a3viewport(left, top, width, height)
|
||||
@@ -867,43 +914,66 @@ def a3viewport(left, top, width, height)
|
||||
width = 40//textcols
|
||||
height = 24
|
||||
fin
|
||||
putc(1) // Reset viewport
|
||||
putc(26)
|
||||
putc(left)
|
||||
putc(top)
|
||||
putc(2)
|
||||
putc(26)
|
||||
putc(left + width - 1)
|
||||
putc(top + height - 1)
|
||||
putc(3)
|
||||
a3putchar(1) // Reset viewport
|
||||
a3putchar(26)
|
||||
a3putchar(left)
|
||||
a3putchar(top)
|
||||
a3putchar(2)
|
||||
a3putchar(26)
|
||||
a3putchar(left + width - 1)
|
||||
a3putchar(top + height - 1)
|
||||
a3putchar(3)
|
||||
return a3gotoxy(0, 0)
|
||||
end
|
||||
def a3ctrl(code, param)#1
|
||||
word handled
|
||||
byte row
|
||||
|
||||
handled = FALSE
|
||||
when code
|
||||
is ctrlattr
|
||||
a3putchar(param == INVERSE ?? 18 :: 17)
|
||||
break
|
||||
is ctrlecho
|
||||
param = param & $80
|
||||
param = param ?? $80 :: 0
|
||||
dev_control(cmdsys.devcons, 11, @param)
|
||||
handled = TRUE
|
||||
break
|
||||
is ctrlcursor
|
||||
a3putchar(param == OFF ?? 6 :: 5)
|
||||
handled = TRUE
|
||||
break
|
||||
is ctrlscroll
|
||||
if param > 0
|
||||
for row = 0 to 23 - param
|
||||
vid3cpy(txt1scrn[row], txt1scrn[row + param])
|
||||
vid3cpy(txt2scrn[row], txt2scrn[row + param])
|
||||
next
|
||||
elsif param < 0
|
||||
for row = 23 downto -param
|
||||
vid3cpy(txt1scrn[row], txt1scrn[row + param])
|
||||
vid3cpy(txt2scrn[row], txt2scrn[row + param])
|
||||
next
|
||||
fin
|
||||
handled = TRUE
|
||||
break
|
||||
wend
|
||||
return handled
|
||||
end
|
||||
def a3textmode(columns)
|
||||
puts(@textbwmode)
|
||||
if columns > 40
|
||||
a3viewport(0, 0, 80, 24)
|
||||
a3putchar(16)
|
||||
if columns >= 80
|
||||
a3putchar(2)
|
||||
columns = 80
|
||||
else
|
||||
a3viewport(0, 0, 40, 24)
|
||||
a3putchar(0)
|
||||
columns = 40
|
||||
fin
|
||||
putc(28)
|
||||
return 0
|
||||
a3putchar(1) // Reset viewport
|
||||
a3putchar(28) // CLS
|
||||
a3ctrl(ctrlecho, ON)
|
||||
a3ctrl(ctrlcursor, OFF)
|
||||
return columns
|
||||
end
|
||||
def a3grmode(mix)
|
||||
byte i
|
||||
@@ -912,10 +982,10 @@ def a3grmode(mix)
|
||||
else
|
||||
mix = 23
|
||||
fin
|
||||
puts(@textclrmode)
|
||||
a3putchar(16); putc(1) // TEXT 40 COLOR MODE
|
||||
dev_control(cmdsys.devcons, 17, @grcharset)
|
||||
a3viewport(0, 20, 40, 4)
|
||||
putc(28)
|
||||
a3putchar(28)
|
||||
for i = 0 to mix
|
||||
memset(txt1scrn[i], $0000, 40) // text screen
|
||||
memset(txt2scrn[i], $0000, 40) // color screen
|
||||
@@ -946,7 +1016,7 @@ when MACHID & MACHID_MODEL
|
||||
conio:keypressed = @a3keypressed
|
||||
conio:getkey = @a3getkey
|
||||
conio:putchars = @a3putchars
|
||||
conio:clear = @a2clear80
|
||||
conio:clear = @a3clear
|
||||
conio:gotoxy = @a3gotoxy
|
||||
conio:viewport = @a3viewport
|
||||
conio:textctrl = @a3ctrl
|
||||
|
||||
@@ -27,7 +27,6 @@ cat rel/apple/VBLANK#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/VBLANK
|
||||
#cat rel/apple/TYPE#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/TYPE REL
|
||||
#cat rel/apple/MATCHFILES#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/MATCHFILES REL
|
||||
#cat rel/ARGS#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/ARGS REL
|
||||
cat rel/apple/INITSLOT#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/INITSLOT REL
|
||||
cat rel/ED#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/ED REL
|
||||
cat rel/FIBER#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/FIBER REL
|
||||
#cat rel/LONGJMP#FE1000 | java -jar ac.jar -p $PO_IMAGE sys/LONGJMP REL
|
||||
|
||||
Reference in New Issue
Block a user