622 lines
12 KiB
ArmAsm
622 lines
12 KiB
ArmAsm
*********************************
|
|
* CHARACTER GENERATOR *
|
|
* FOR HGR SCREEN *
|
|
* APPLE // BASED VERSION 4.02 *
|
|
* (C) 1989 BY URS HOCHSTRASSER *
|
|
* *
|
|
* PARAMETERS: *
|
|
* -CHAR DEF ADDR IN $8006 *
|
|
* -TEXT WINDOW BOTTOM IN $0023 *
|
|
* -HGR PAGE IN $8008 *
|
|
* $20 FOR P.1, $40 FOR P.2 *
|
|
* -PROTOCFLAG IN $8009 *
|
|
* -BOLD FLAG IN $800A *
|
|
* -UNDERLINE FLAG IN $800B *
|
|
* -80 COLUMN FLAG IN $800E *
|
|
* -RGB FLAG (0=DEFLT) IN $8014 *
|
|
* 1= COLOR SHIFT ENABLED *
|
|
* -HILINE MODE FLAG IN $8015 *
|
|
* -INDEPNDNT MODE FLAG IN $8016 *
|
|
* -INVFLG IN $8017 *
|
|
* -CV1 IN $8018 *
|
|
* -CV2 IN $8019 *
|
|
* *
|
|
* VERSION 2.2: FASTER CALCADR *
|
|
* *
|
|
*********************************
|
|
|
|
* FOR RAM ONLY *
|
|
|
|
ORG $8000
|
|
|
|
INVERSE EQU $3F
|
|
FLASH EQU $80
|
|
NORMAL EQU $FF
|
|
|
|
CTRB EQU $82
|
|
BACKSPC EQU $88
|
|
CTRI EQU $89
|
|
LF EQU $8A
|
|
FF EQU $8C
|
|
CR EQU $8D
|
|
CTRN EQU $8E
|
|
CTRP EQU $90
|
|
DC1 EQU $91
|
|
DC2 EQU $92
|
|
SPC EQU $A0
|
|
DEL EQU $FF
|
|
|
|
WNDLFT EQU $20
|
|
WNDWDTH EQU $21
|
|
WNDTOP EQU $22
|
|
WNDBTM EQU $23
|
|
CH EQU $24
|
|
CH80 EQU $57B ;OURCH
|
|
CV EQU $25
|
|
BASL EQU $28
|
|
BASH EQU $29
|
|
BAS2L EQU $2A
|
|
BAS2H EQU $2B
|
|
INVFLG EQU $32
|
|
CSWL EQU $36
|
|
CSWH EQU $37
|
|
KSWL EQU $38
|
|
KSWH EQU $39
|
|
HCOLOR EQU $E4
|
|
|
|
JMP HOOK
|
|
RTS
|
|
NOP
|
|
NOP
|
|
|
|
CHRDEF1 DA $8500
|
|
PAGE HEX 40
|
|
PROTOC DFB 0
|
|
BOLD DFB 0
|
|
UNDERL DFB 0
|
|
FONTTBL DA 0
|
|
EXT80 DFB 0
|
|
INT80 DFB 0
|
|
OUT DA $FDF0
|
|
IN DA $FD1B
|
|
RGB DFB 0
|
|
HILINE DFB 0
|
|
INDEP DFB 0
|
|
INVFL2 DFB 0
|
|
CV1 DFB 0
|
|
CV2 DFB 0
|
|
CH1 DFB 0
|
|
CHRSIZE DFB 8
|
|
HBASL DA 0
|
|
XTEMP DFB 0
|
|
XT2 DFB 0
|
|
ACCU DFB 0
|
|
ACCU2 DFB 0
|
|
X DFB 0
|
|
Y DFB 0
|
|
SAV28 DFB 0
|
|
SAV29 DFB 0
|
|
SAV2A DFB 0
|
|
SAV2B DFB 0
|
|
X3 DFB 0
|
|
Y3 DFB 0
|
|
A3 DFB 0
|
|
CH2 DFB 0
|
|
|
|
*** HOOK ***
|
|
HOOK LDA #0 ;INIT INTERNAL 80COL FLAG
|
|
STA INT80
|
|
LDA EXT80 ;LOOK WHAT THE USER WANTS
|
|
BEQ NO80 ;40 COL
|
|
EXTRAM? LDA 0 ;IS THERE AUX RAM?
|
|
STA A3
|
|
LDA #$AA
|
|
STA 0
|
|
STA RWAUX0
|
|
LDA 0
|
|
CMP #$AA
|
|
BEQ NOEXT ;NO DHIRES POSSIBLE...
|
|
LDA #1 ;80 COL
|
|
STA INT80
|
|
NOEXT STA RWMAIN0
|
|
LDA A3
|
|
STA 0
|
|
NO80 LDA #<START ;INSTALL I/O VECTORS
|
|
STA CSWL
|
|
LDA #>START
|
|
STA CSWH
|
|
LDA #<RSTART
|
|
STA KSWL
|
|
LDA #>RSTART
|
|
STA KSWH
|
|
LDA PROCHK ;FOR PRODOS...
|
|
CMP #76 ;...AND DOS 3.3
|
|
BEQ PRODOS
|
|
DOS33 JSR DOS
|
|
JMP HOOK6
|
|
PRODOS LDA BSCHK ;BASIC.SYSTEM?
|
|
CMP #76
|
|
BNE HOOK6
|
|
JSR PCONNECT ;YEAH, SO CONNECT THAT BUGGER
|
|
HOOK6 BIT SINGLE ;FOR IIGS WITH RGB
|
|
LDA RGB
|
|
BNE HOOK7
|
|
BIT DOUBLE
|
|
HOOK7 LDA INT80
|
|
BEQ HOOK4
|
|
LDA #$20 ;FORCE PAGE #1 FOR DHIRES
|
|
STA PAGE
|
|
HOOK4 LDA PAGE
|
|
CMP #$40
|
|
BNE HOOK1
|
|
BIT PAGE2
|
|
JMP HOOK2
|
|
HOOK1 BIT PAGE1
|
|
HOOK2 BIT HIRES
|
|
BIT NOMIX
|
|
BIT GRAPH
|
|
STA STORE40
|
|
STA DISP40
|
|
LDA INT80
|
|
BEQ HOOK5
|
|
STA STORE80
|
|
STA DISP80
|
|
BIT DOUBLE
|
|
LDA WNDWDTH
|
|
CMP #$28
|
|
BNE HOOK5
|
|
LDA #$50
|
|
STA WNDWDTH
|
|
HOOK5 LDA #0 ;RESET TEXT MODES
|
|
STA BOLD
|
|
STA PROTOC
|
|
STA UNDERL
|
|
LDA #$7F
|
|
STA HCOLOR ;INIT TO WHITE
|
|
RTS
|
|
|
|
*** UNHOOK*** (REMOVED)
|
|
|
|
*** BLINK CURSOR ***
|
|
RSTART STX X3
|
|
STY Y3
|
|
JSR INVERT
|
|
R1 LDA KBD
|
|
BPL R1
|
|
BIT KBDSTRB
|
|
PHA
|
|
JSR INVERT
|
|
PLA
|
|
LDX X3
|
|
LDY Y3
|
|
RTS
|
|
|
|
*** SAVE28***
|
|
SAVE28 LDA BASL
|
|
STA SAV28
|
|
LDA BASH
|
|
STA SAV29
|
|
LDA BAS2L
|
|
STA SAV2A
|
|
LDA BAS2H
|
|
STA SAV2B
|
|
RTS
|
|
|
|
*** REST28 ***
|
|
REST28 LDA SAV28
|
|
STA BASL
|
|
LDA SAV29
|
|
STA BASH
|
|
LDA SAV2A
|
|
STA BAS2L
|
|
LDA SAV2B
|
|
STA BAS2H
|
|
RTS
|
|
|
|
* BASE ADDRESS TABLE:
|
|
BASADR HEX 0000800000018001
|
|
HEX 0002800200038003
|
|
HEX 2800A8002801A801
|
|
HEX 2802A8022803A803
|
|
HEX 5000D0005001D001
|
|
HEX 5002D0025003D003
|
|
|
|
DOS EQU $03EA
|
|
PCONNECT EQU $9A8D
|
|
PROCHK EQU $BF00
|
|
BSCHK EQU $BE00
|
|
KBD EQU $C000
|
|
STORE40 EQU $C000
|
|
STORE80 EQU $C001
|
|
RWMAIN0 EQU $C008
|
|
RWAUX0 EQU $C009
|
|
KBDSTRB EQU $C010
|
|
DISP40 EQU $C00C
|
|
DISP80 EQU $C00D
|
|
GRAPH EQU $C050
|
|
TEXT EQU $C051
|
|
NOMIX EQU $C052
|
|
PAGE1 EQU $C054
|
|
PAGE2 EQU $C055
|
|
HIRES EQU $C057
|
|
DOUBLE EQU $C05E
|
|
SINGLE EQU $C05F
|
|
SW80 EQU $C060
|
|
INTERPR EQU $E006
|
|
STOADV EQU $FBF0
|
|
HOME EQU $FC58
|
|
SCROLL EQU $FC70
|
|
IOSAVE EQU $FF4A
|
|
IOREST EQU $FF3F
|
|
BASCALC EQU $FBC1
|
|
BELL1 EQU $FBD9
|
|
|
|
*** SUBROUTINE CALCLINE ***
|
|
* IN: CURSOR LINE IN X
|
|
* OUT: HGR.Y IN CV1
|
|
* USES: A
|
|
|
|
CALCLINE LDA HILINE ;TEST HILINE FLAG
|
|
BEQ CALCL3
|
|
RTS
|
|
CALCL3 LDA #0
|
|
STX XTEMP
|
|
LDX CHRSIZE
|
|
CALCL2 BEQ CALCL1 ;ST FLGS
|
|
CLC
|
|
ADC XTEMP
|
|
DEX
|
|
JMP CALCL2
|
|
CALCL1 STA CV1
|
|
RTS
|
|
|
|
*** SUBROUTINE HBASCALC ***
|
|
* IN: HGR.Y IN A
|
|
* OUT: HIRES BASADR IN HBASL,H
|
|
|
|
*---------OFF SCREEN?
|
|
HBASCALC CMP #$C0
|
|
BCS HBAS1 ;Y:LEAVE
|
|
PHA
|
|
*---------CF APPLE REF.MAN. P.21
|
|
LSR ;Y/8:BOX
|
|
LSR
|
|
AND #$FE
|
|
*---------CALC TEXT BASE ADDRESS
|
|
STX XT2
|
|
TAX
|
|
LDA BASADR,X
|
|
STA HBASL
|
|
LDA BASADR+1,X
|
|
CLC
|
|
*---------ADD CONST FOR HGR PAGE
|
|
ADC PAGE
|
|
STA HBASL+1
|
|
LDX XT2
|
|
PLA
|
|
*---------CALC LINE ADDR IN BOX
|
|
AND #7
|
|
ASL
|
|
ASL
|
|
CLC
|
|
ADC HBASL+1
|
|
STA HBASL+1
|
|
*---------CARRY IS ERROR FLAG
|
|
HBAS1 RTS
|
|
|
|
*** SUBROUTINE HSCROLL ***
|
|
|
|
HSCR10 LDY WNDWDTH
|
|
LDA INT80
|
|
BEQ HSCR7
|
|
TYA
|
|
LSR
|
|
TAY
|
|
HSCR7 DEY
|
|
RTS
|
|
|
|
HSCR6 JSR HSCR10
|
|
SCFROM LDA (BAS2L),Y
|
|
STA (BASL),Y
|
|
DEY
|
|
BPL SCFROM
|
|
RTS
|
|
|
|
HSCR8 JSR HSCR10
|
|
LDA #0
|
|
HSCR2 STA (BASL),Y
|
|
DEY
|
|
BPL HSCR2
|
|
RTS
|
|
|
|
HSCROLL JSR SCROLL
|
|
JSR SAVE28
|
|
LDX WNDTOP
|
|
JSR CALCLINE
|
|
LDX CV1
|
|
HSCR1 TXA
|
|
PHA
|
|
JSR HBASCALC
|
|
LDA HBASL
|
|
STA BASL
|
|
LDA HBASL+1
|
|
STA BASH
|
|
PLA
|
|
CLC
|
|
ADC CHRSIZE
|
|
JSR HBASCALC
|
|
LDA HBASL
|
|
STA BAS2L
|
|
LDA HBASL+1
|
|
STA BAS2H
|
|
JSR HSCR6
|
|
LDA INT80
|
|
BEQ HSCR5
|
|
BIT PAGE2
|
|
JSR HSCR6
|
|
BIT PAGE1
|
|
HSCR5 INX
|
|
CPX CV2
|
|
BCC HSCR1
|
|
LDX CV
|
|
JSR CALCLINE
|
|
LDX CV1
|
|
*---------VOR AUFRUF:JSR SAVE28
|
|
HSCR3 TXA
|
|
JSR HBASCALC
|
|
LDA HBASL
|
|
STA BASL
|
|
LDA HBASL+1
|
|
STA BASH
|
|
JSR HSCR8
|
|
LDA INT80
|
|
BEQ HSCR4
|
|
BIT PAGE2
|
|
JSR HSCR8
|
|
BIT PAGE1
|
|
HSCR4 INX
|
|
CPX CV2
|
|
BCC HSCR3
|
|
JSR REST28
|
|
RTS
|
|
|
|
*** SUBROUTINE HHOME ***
|
|
|
|
HHOME LDX WNDTOP
|
|
JSR CALCLINE
|
|
LDX CV1
|
|
JSR SAVE28
|
|
JSR HSCR3
|
|
JSR HOME
|
|
JMP END1
|
|
|
|
*** SUBROUTINE INVERT ***
|
|
|
|
INVERT JSR SAVE28
|
|
LDX CV
|
|
LDY CH
|
|
LDA INT80
|
|
BEQ INV4
|
|
TYA
|
|
LSR
|
|
BCS INV5
|
|
BIT PAGE2
|
|
INV5 TAY
|
|
INV4 JSR CALCLINE
|
|
LDX #0
|
|
INV3 CLC
|
|
TXA
|
|
ADC CV1
|
|
JSR HBASCALC
|
|
LDA HBASL
|
|
STA BASL
|
|
LDA HBASL+1
|
|
STA BASH
|
|
INV1 LDA (BASL),Y
|
|
EOR #$7F
|
|
INV2 STA (BASL),Y
|
|
INX
|
|
CPX CHRSIZE
|
|
BCC INV3
|
|
JSR REST28
|
|
LDA INT80
|
|
BEQ INV6
|
|
BIT PAGE1
|
|
INV6 RTS
|
|
|
|
*** SUBROUTINE TOGGLE ***
|
|
|
|
TOGGLE CMP #CTRB
|
|
BNE NOBO
|
|
LDA #1
|
|
STA BOLD
|
|
LDA ACCU
|
|
NOBO CMP #CTRI
|
|
BNE NOUN
|
|
LDA #1
|
|
STA UNDERL
|
|
LDA ACCU
|
|
NOUN CMP #CTRP
|
|
BNE NOPR
|
|
LDA #1
|
|
STA PROTOC
|
|
LDA ACCU
|
|
NOPR CMP #CTRN
|
|
BNE NONO
|
|
LDA #0
|
|
STA BOLD
|
|
STA UNDERL
|
|
LDA ACCU
|
|
NONO RTS
|
|
|
|
HHOM2 JMP HHOME
|
|
BELL1A JSR BELL1
|
|
JMP END1
|
|
HCR1 JMP HCR
|
|
HLF1 JMP HLF
|
|
SCROLL1 JSR HSCROLL
|
|
JMP NOSCROLL
|
|
|
|
BS DEC CH
|
|
BPL UP1
|
|
LDA WNDWDTH
|
|
STA CH
|
|
DEC CH
|
|
UP LDA WNDTOP
|
|
CMP CV
|
|
BCS UP1
|
|
DEC CV
|
|
UP1 JMP END1
|
|
|
|
**** MAIN PROGRAM ****
|
|
|
|
START STA ACCU
|
|
STX X
|
|
STY Y
|
|
*NEW CODE START
|
|
CMP #DEL
|
|
BNE NODEL
|
|
LDA PROTOC
|
|
BEQ NODEL
|
|
LDA #0
|
|
STA PROTOC
|
|
JMP END1
|
|
*END NEW CODE
|
|
NODEL LDA INVFLG
|
|
CMP #FLASH
|
|
BCS NORM?
|
|
LDX #$FF
|
|
STX INVFL2
|
|
NORM? CMP #NORMAL
|
|
BNE STRT1
|
|
LDX #0
|
|
STX INVFL2
|
|
STRT1 LDX WNDBTM
|
|
JSR CALCLINE
|
|
STA CV2
|
|
LDA PROTOC
|
|
BNE STORADV
|
|
LDA ACCU
|
|
JSR TOGGLE
|
|
CMP #SPC
|
|
BCS STORADV
|
|
TAY
|
|
BPL STORADV
|
|
CMP #CR
|
|
BEQ HCR1
|
|
CMP #LF
|
|
BEQ HLF1
|
|
CMP #FF
|
|
BEQ HHOM2
|
|
CMP #BACKSPC
|
|
BNE BELL1A
|
|
JSR BS
|
|
JMP END1
|
|
NOSCROLL LDA ACCU
|
|
STORADV JSR SAVE28
|
|
LDA CHRDEF1
|
|
STA BASL
|
|
LDA CHRDEF1+1
|
|
STA BASH
|
|
LDY #0
|
|
LDA (BASL),Y
|
|
STA CHRSIZE
|
|
INC BASL
|
|
BNE CHRDEF
|
|
INC BASH
|
|
CHRDEF LDA ACCU
|
|
CHRD1 STA ACCU2
|
|
LDX CHRSIZE
|
|
*---------CALC ADDR OF CHRDEF TBL
|
|
CALCADR LDA #0
|
|
LDX #8
|
|
CALCAD1 ASL
|
|
ROL ACCU2
|
|
BCC CALCAD2
|
|
CLC
|
|
ADC CHRSIZE
|
|
BCC CALCAD2
|
|
INC ACCU2
|
|
CALCAD2 DEX
|
|
BNE CALCAD1
|
|
CLC
|
|
ADC BASL
|
|
STA BASL
|
|
LDA ACCU2
|
|
ADC BASH
|
|
STA BASH
|
|
LDX CV
|
|
JSR CALCLINE
|
|
DRAW LDY #0
|
|
DRAW1 CLC
|
|
TYA
|
|
ADC CV1
|
|
JSR HBASCALC
|
|
LDA CH
|
|
LDX INT80
|
|
BEQ DRAW8
|
|
LSR
|
|
BCS DRAW8
|
|
BIT PAGE2
|
|
DRAW8 STA CH2
|
|
CLC
|
|
ADC WNDLFT
|
|
ADC HBASL
|
|
STA BAS2L
|
|
LDA HBASL+1
|
|
STA BAS2H
|
|
DRAW2 LDA (BASL),Y
|
|
STY XTEMP
|
|
LDX BOLD
|
|
BEQ DRAW6
|
|
STA A3
|
|
ASL
|
|
AND #$7F
|
|
ORA A3
|
|
DRAW6 LDX INVFL2
|
|
*---------IF ZERO NOT INVERSE
|
|
BEQ DRAW5
|
|
EOR #$7F
|
|
DRAW5 LDY #0
|
|
AND HCOLOR ;NEW...
|
|
DRAW3 STA (BAS2L),Y
|
|
LDY XTEMP
|
|
INY
|
|
CPY CHRSIZE
|
|
BCC DRAW1
|
|
LDA UNDERL
|
|
BEQ DRAW7
|
|
LDA #$7F
|
|
LDY #0
|
|
EOR (BAS2L),Y
|
|
STA (BAS2L),Y
|
|
DRAW7 JSR REST28
|
|
LDA CV
|
|
JSR BASCALC
|
|
ADC WNDLFT
|
|
STA BASL
|
|
LDA ACCU
|
|
LDY CH2
|
|
STA (BASL),Y
|
|
LDA INT80
|
|
BEQ ADVANCE
|
|
BIT PAGE1
|
|
ADVANCE INC CH
|
|
LDA CH
|
|
CMP WNDWDTH
|
|
BCS HCR
|
|
JMP END1
|
|
HCR LDA #0
|
|
STA CH
|
|
HLF INC CV
|
|
LDA CV
|
|
CMP WNDBTM
|
|
BCS LF1
|
|
JMP END1
|
|
LF1 DEC CV
|
|
JSR HSCROLL
|
|
END1 LDA ACCU
|
|
LDY Y
|
|
LDX X
|
|
RTS
|
|
END |