Files
2026-04-04 21:23:23 +02:00

550 lines
12 KiB
ArmAsm

*
* SerialIntrMgr
* by ?
* published by ?
* date ?
* purpose ?
*
mx %00
rel
lst off
typ PIF
dsk sim
*-------------------------------
* EQUATES
*-------------------------------
INTMGRV = $E10010
IRQ_APTALK = $E10020
GSOS = $E100A8
*-------------------------------
* CODE
*-------------------------------
PHB
PHK
PLB
LDA #$0000
STA L0409
STA L040B
STA L040D
STA L040F
STA L0405
PHP
SEI
JSR L033A ; get ROM version
CMP #$0000
BEQ L0034
CMP #$0001
BEQ L0034
LDA L006D ; patch for ROM 3
STAL INTMGRV
LDA L006D+2
STAL INTMGRV+2
BRA L0042
L0034 LDA L0069 ; patch for ROM 00/01
STAL INTMGRV
LDA L0069+2
STAL INTMGRV+2
L0042 PLP
PEA ^L03EE
PEA L03EE
PHA
_MMStartUp
PLA
STA L0407
PHA
PEA ^L01F8
PEA L01F8
_AcceptRequests
JSL L0354 ; get AppleTalk port
PLB
RTL
L0069 JMPL L0140
L006D JMPL L0071
*-------------------------------
* INT MGR ROM 3
*-------------------------------
L0071 CLC
XCE
REP #$30
PHP
PHB
PEA $E1E1
PLB
STA $0108
LDA $C035
STA $0119
ORA #$8000
AND #$9F3E
STA $C035
STX $010A
STY $010C
TDC
STA $0110
LDA #$0000
TCD
SEP #$30
BCC L00A5
LDA $04,S
AND #$10
ADC #$70
L00A5 BVC L00AB
JMPL $FFBD16
L00AB LDA #$03
STA $C039
LDA $C039
BIT $0103
BEQ L00EF
PHA
AND #$07
BNE L00CF
LDA $C03B
STA $0105
LDA $C03B
STA $0106
JSL IRQ_APTALK
BRA L00DF
L00CF LDA $C03A
STA $0105
LDA $C03A
STA $0106
JSL IRQ_APTALK
L00DF LDAL $010101
STA $011C
LDA #$00
ROR
STA $0101
PLA
BRA L0102
L00EF PHA
LDAL $010101
STA $011C
STZ $0101
JSL $E1021C
PLA
BCC L0139
CLC
L0102 PHA
ANDL L0405
BEQ L0133
LDA $01,S
BIT #$07
BEQ L0116
JSL L040D
ROL $0101
L0116 LDA $01,S
ANDL L0405
BEQ L0129
BIT #$38
BEQ L0129
JSL L0409
ROL $0101
L0129 PLA
LDA $0101
BEQ L0139
JMPL $FFBD15
L0133 LDA $01,S
JMPL $FFBCFA
L0139 REP #$30
PLB
JMPL $FFBF58
*-------------------------------
* INT MGR ROM 00 / 01
*-------------------------------
L0140 CLC
XCE
REP #$30
PHP
PHB
PEA $E1E1
PLB
STA $0108
LDA $C035
STA $0119
ORA #$8000
AND #$9F1E
STA $C035
STX $010A
STY $010C
TDC
STA $0110
LDA #$0000
TCD
SEP #$30
BCC L0174
LDA $04,S
AND #$10
ADC #$70
L0174 BVC L017A
JMPL $FFB85F
L017A LDA #$03
STA $C039
LDA $C039
BIT $0103
BEQ L01B7
PHA
AND #$07
BNE L019E
LDA $C03B
STA $0105
LDA $C03B
STA $0106
JSL IRQ_APTALK
BRA L01AE
L019E LDA $C03A
STA $0105
LDA $C03A
STA $0106
JSL IRQ_APTALK
L01AE LDA #$00
ROR
STA $0101
PLA
BRA L01BA
L01B7 STZ $0101
L01BA PHA
ANDL L0405
BEQ L01F2
LDA $01,S
BIT #$07
BEQ L01CE
JSL L040D
ROL $0101
L01CE LDA $01,S
ANDL L0405
BEQ L01E1
BIT #$38
BEQ L01E1
JSL L0409
ROL $0101
L01E1 PLA
LDA $0101
BEQ L01EB
JMPL $FFB85E
L01EB REP #$30
PLB
JMPL $FFBA86
L01F2 LDA $01,S
JMPL $FFB843
*-------------------------------
* ACCEPT REQUESTS
*-------------------------------
*
* $8000:
* $8001:
* $8002:
L01F8 PHB
PHK
PLB
PHD
TSC
TCD
LDA $0F
CMP #$8003
BCC L0208
JMP L0310
L0208 CMP #$8000
BCS L0210
JMP L0310
L0210 AND #$00FF
ASL
TAX
JMP (L0218,X)
L0218 DA L021E ; $8000
DA L029C ; $8001
DA L02FE ; $8002
*-----------------
* $8000
*-----------------
L021E LDY #$0000
LDA [$0B],Y
JSR L032C ; check port 1 or 2
BCS L028C
CMP thePORT
BEQ L0287
DEC
ASL
ASL
TAX
LDA L0409,X
ORA L040B,X
BNE L0291
PHP
SEI
LDA #$005C
STA L0409,X
LDY #$0002
LDA [$0B],Y
STA L0409+1,X
LDY #$0003
LDA [$0B],Y
STA L040B,X
LDX #$0007
LDY #$0000
LDA [$0B],Y
CMP #$0002
BEQ L0261
LDX #$0038
L0261 TXA
ORA L0405
STA L0405
LDX #$00F8
LDY #$0000
LDA [$0B],Y
CMP #$0002
BEQ L0278
LDX #$00C7
L0278 TXA
ANDL $E10104 ; SERFLAG - Ser int msk-$07=chanB-$38=chanA-$3F=both
STAL $E10104 ; SERFLAG - Ser int msk-$07=chanB-$38=chanA-$3F=both
PLP
LDA #$0000
BRA L0294
L0287 LDA #$0003
BRA L0294
L028C LDA #$0005
BRA L0294
L0291 LDA #$0001
L0294 LDY #$0002
STA [$07],Y
JMP L0317
*-----------------
* $8001
*-----------------
L029C LDY #$0000
LDA [$0B],Y
JSR L032C ; check port 1 or 2
BCS L028C
DEC
ASL
ASL
TAX
LDA L0409,X
ORA L040B,X
BEQ L02F3
LDA L0409+1,X
LDY #$0002
CMP [$0B],Y
BNE L02EE
LDA L040B,X
LDY #$0003
CMP [$0B],Y
BNE L02EE
PHP
SEI
LDA #$0000
STA L0409,X
STA L040B,X
LDX #$00F8
LDY #$0000
LDA [$0B],Y
CMP #$0002
BEQ L02E1
LDX #$00C7
L02E1 TXA
AND L0405
STA L0405
PLP
LDA #$0000
BRA L02F6
L02EE LDA #$0002
BRA L0294
L02F3 LDA #$0004
L02F6 LDY #$0002
STA [$07],Y
JMP L0317
*-----------------
* $8002
*-----------------
L02FE LDA #$0100
LDY #$0004
STA [$07],Y
LDA #$0000
LDY #$0002
STA [$07],Y
BRA L0317
*-----------------
* EXIT
*-----------------
L0310 LDA #$0000 ; request was not handled
STA $11
BRA L031C
L0317 LDA #$8000 ; request was handled
STA $11
L031C PLD
PLB
LDA $02,S
STA $0C,S
LDA $01,S
STA $0B,S
PLY
PLY
PLY
PLY
PLY
RTL
*-------------------------------
* CHECK VALID PORT (1 OR 2)
*-------------------------------
L032C CMP #$0001
BEQ L0338
CMP #$0002
BEQ L0338
SEC
RTS
L0338 CLC
RTS
*-------------------------------
* GET ROM VERSION
*-------------------------------
L033A PHA
PHA
PHA
PHA
LDA #$0000
PHA
PHA
PHA
PEA $FE1F
_FWEntry
PLY
PLA
PLA
PLA
TYA
RTS
*-------------------------------
* GET APPLETALK PORT
*-------------------------------
L0354 PHB
PHK
PLB
LDA #$0001 ; device 1
STA L03A1
L035D JSL GSOS
DW $202C ; DInfo
ADRL L039F
BCS L038E
LDA L03B3
CMP #$001D ; AppleTalk main driver?
BEQ L0376
INC L03A1 ; no, next device, pleae
BRA L035D
L0376 LDA L03A1 ; yes, get the AppleTalk port
STA L03DA
JSL GSOS
DW $202D ; DStatus
ADRL L03D8
LDA L03EA ; get the port
STA thePORT ; save it
BRA L0398
L038E CMP #$0011 ; no more device?
BEQ L0393 ; yup, exit
L0393 STZ thePORT ; tell not found
BRA L0398
L0398 LDA thePORT ; return the port
PLB
RTL
thePORT DW $0000 ; AppleTalk port: 0: none, 1: port 1, 2: port 2
L039F DW $0008 ; Parms for DInfo
L03A1 DW $0001 ; device num
ADRL L03B5 ; device name
DW $0000 ; characteristics
ADRL $00000000 ; total blocks
DW $0000 ; slot
DW $0000 ; unit
DW $0000 ; version number
L03B3 DW $0000 ; device id
L03B5 DW $001F
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
L03D8 DW $0005 ; Parms for DStatus
L03DA DW $0000 ; device num
DW $8001 ; status code = Get Port
ADRL L03EA ; status list
ADRL $00000002 ; request count
ADRL $00000000 ; transfer count
L03EA DW $0000
DW $0000
L03EE STR 'SerialIntrMgr~Entry~'
DB $00
DB $00
L0405 DW $0000
L0407 DW $0000
L0409 DW $0000
L040B DW $0000
L040D DW $0000
L040F DW $0000