;
-; Oric atmos zeropage and ROM definitions
+; Oric Atmos definitions
+; BASIC 1.1 addresses
;
+; ---------------------------------------------------------------------------
+; Constants
+
+FNAME_LEN = 16 ; maximum length of file-name
+
+
; ---------------------------------------------------------------------------
; Zero page
+BASIC_BUF := $35
; ---------------------------------------------------------------------------
; Low memory
CAPSLOCK := $20C
+PATTERN := $213
IRQVec := $245
CURS_Y := $268
CURS_X := $269
STATUS := $26A
TIMER3 := $276
+CFOUND_NAME := $293
KEYBUF := $2DF
+PARAM1 := $2E1 ; & $2E2
+PARAM2 := $2E3 ; & $2E4
+PARAM3 := $2E5 ; & $2E6
; ---------------------------------------------------------------------------
-; ROM entries
+; I/O locations
-PRINT := $F77C
+; 6522
+.struct VIA ; Versatile Interface Adapter
+ .res $0300
+PRB .byte ; Port Register B
+PRA .byte ; Port Register A
+DDRB .byte ; Data Direction Register B
+DDRA .byte ; Data Direction Register A
+T1 .word ; Timer 1
+T1L .word ; Timer 1 Latch
+T2 .word ; Timer 2
+SR .byte ; Shift Register
+ACR .byte ; Auxiliary Control Register
+PCR .byte ; Peripheral Control Register
+IFR .byte ; Interrupt Flags Register
+IER .byte ; Interrupt Enable Register
+PRA2 .byte ; Port Register A without handshaking
+.endstruct
+
+; 6551
+.struct ACIA ; Asynchronous Communications Interface Adapter
+ .res $031C
+DATA .byte
+STATUS .byte
+CMD .byte ; Command register
+CTRL .byte ; Control register
+.endstruct
+
+SCREEN := $BB80
; ---------------------------------------------------------------------------
-; I/O
+; ROM entries
-SCREEN := $BB80
+TEXT := $EC21
+HIRES := $EC33
+CURSET := $F0C8
+CURMOV := $F0FD
+DRAW := $F110
+CHAR := $F12D
+POINT := $F1C8
+PAPER := $F204
+INK := $F210
+PRINT := $F77C
;
; P.A.S.E. joystick driver for the Atmos
-; May be used multiple times when linked to the statically application.
+; Can be used multiple times when statically linked to the application.
;
-; Stefan Haubenthal, 2009-12-21
-; Based on Ullrich von Bassewitz, 2002-12-20
+; 2002-12-20, Based on Ullrich von Bassewitz's code.
+; 2009-12-21, Stefan Haubenthal
+; 2013-07-15, Greg King
;
.include "joy-kernel.inc"
.include "joy-error.inc"
-; .include "atmos.inc"
+ .include "atmos.inc"
; ------------------------------------------------------------------------
JOY_COUNT = 2 ; Number of joysticks we support
-PRA = $0301
-DDRA = $0303
-PRA2 = $030F
-
; ------------------------------------------------------------------------
; Data.
READ:
tay
- lda PRA
+ lda VIA::PRA
pha
- lda DDRA
+ lda VIA::DDRA
pha
lda #%11000000
- sta DDRA
+ sta VIA::DDRA
lda #%10000000
- sta PRA2
- lda PRA2
+ sta VIA::PRA2
+ lda VIA::PRA2
sta temp1
lda #%01000000
- sta PRA2
- lda PRA
+ sta VIA::PRA2
+ lda VIA::PRA
sta temp2
pla
- sta DDRA
+ sta VIA::DDRA
pla
- sta PRA2
+ sta VIA::PRA2
ldx #0
tya
;
-; Ullrich von Bassewitz, 2003-03-07
-; Stefan Haubenthal, 2011-01-28
+; 2003-03-07, Ullrich von Bassewitz
+; 2011-01-28, Stefan Haubenthal
+; 2013-07-15, Greg King
;
; Setup arguments for main
;
.constructor initmainargs, 24
.import __argc, __argv
+
+ .include "atmos.inc"
.macpack generic
MAXARGS = 10 ; Maximum number of arguments allowed
REM = $9d ; BASIC token-code
-NAME_LEN = 16 ; maximum length of command-name
-BASIC_BUF = $35
-FNAM = $293
;---------------------------------------------------------------------------
; Because the buffer, that we're copying into, was zeroed out,
; we don't need to add a NUL character.
;
- ldy #NAME_LEN - 1 ; limit the length
-L0: lda FNAM,y
+ ldy #FNAME_LEN - 1 ; limit the length
+L0: lda CFOUND_NAME,y
sta name,y
dey
bpl L0
;
.bss
term: .res 1
-name: .res NAME_LEN + 1
+name: .res FNAME_LEN + 1
.data
argv: .addr name
; Serial driver for the Telestrat integrated serial controller and the
; Atmos with a serial add-on.
;
-; Stefan Haubenthal, 2012-03-05
+; 2012-03-05, Stefan Haubenthal
+; 2013-07-15, Greg King
;
; The driver is based on the cc65 rs232 module, which in turn is based on
; Craig Bruce device driver for the Switftlink/Turbo-232.
.include "zeropage.inc"
.include "ser-kernel.inc"
.include "ser-error.inc"
+ .include "atmos.inc"
; ------------------------------------------------------------------------
; Header. Includes jump table
.addr CLOSE
.addr GET
.addr PUT
- .addr STATUS
+ .addr SER_STATUS
.addr IOCTL
.addr IRQ
-;----------------------------------------------------------------------------
-; I/O definitions
-
-ACIA = $031C
-ACIA_DATA = ACIA+0 ; Data register
-ACIA_STATUS = ACIA+1 ; Status register
-ACIA_CMD = ACIA+2 ; Command register
-ACIA_CTRL = ACIA+3 ; Control register
-
;----------------------------------------------------------------------------
; Global variables
; Deactivate DTR and disable 6551 interrupts
lda #%00001010
- sta ACIA_CMD,x
+ sta ACIA::CMD,x
; Done, return an error code
: lda #<SER_ERR_OK
lda StopTable,y
ora tmp1
ora #%00010000 ; Receiver clock source = baudrate
- sta ACIA_CTRL
+ sta ACIA::CTRL
; Set the value for the command register. We remember the base value
- ; in RtsOff, since we will have to manipulate ACIA_CMD often.
+ ; in RtsOff, since we will have to manipulate ACIA::CMD often.
ldy #SER_PARAMS::PARITY ; Parity
lda (ptr1),y
tay
ora #%00000001 ; DTR active
sta RtsOff
ora #%00001000 ; Enable receive interrupts
- sta ACIA_CMD
+ sta ACIA::CMD
; Done
stx Index ; Mark port as open
sta Stopped
lda RtsOff
ora #%00001000
- sta ACIA_CMD
+ sta ACIA::CMD
; Get byte from buffer
: ldy RecvHead ; (41)
rts
;----------------------------------------------------------------------------
-; STATUS: Return the status in the variable pointed to by ptr1.
+; SER_STATUS: Return the status in the variable pointed to by ptr1.
; Must return an SER_ERR_xx code in a/x.
-STATUS:
- lda ACIA_STATUS
+SER_STATUS:
+ lda ACIA::STATUS
ldx #$00
sta (ptr1,x)
txa ; SER_ERR_OK
IRQ:
ldx Index ; Check for open port
beq Done
- lda ACIA_STATUS,x ; Check ACIA status for receive interrupt
+ lda ACIA::STATUS,x ; Check ACIA status for receive interrupt
and #$08
beq Done ; Jump if no ACIA interrupt
- lda ACIA_DATA,x ; Get byte from ACIA
+ lda ACIA::DATA,x ; Get byte from ACIA
ldy RecvFreeCnt ; Check if we have free space left
beq Flow ; Jump if no space in receive buffer
ldy RecvTail ; Load buffer pointer
; Assert flow control if buffer space too low
Flow: lda RtsOff
- sta ACIA_CMD,x
+ sta ACIA::CMD,x
sta Stopped
sec ; Interrupt handled
Done: rts
bne Quit ; Bail out
; Check that ACIA is ready to send
- lda ACIA_STATUS
+ lda ACIA::STATUS
and #$10
bne Send
bit tmp1 ; Keep trying if must try hard
; Send byte and try again
Send: ldy SendHead
lda SendBuf,y
- sta ACIA_DATA
+ sta ACIA::DATA
inc SendHead
inc SendFreeCnt
jmp Again
; Graphics driver for the 228x200x3 palette mode on the Atmos
;
; Stefan Haubenthal <polluks@sdf.lonestar.org>
-; 2012-08-11, Greg King <greg.king5@verizon.net>
+; 2013-07-15, Greg King <gregdk@users.sf.net>
;
.include "zeropage.inc"
MODE: .res 1 ; Graphics mode
PALETTE: .res 2
-; Constants and table
-; BASIC 1.1 addresses
-PATTERN := $213
-PARAM1 := $2E1 ; & $2E2
-PARAM2 := $2E3 ; & $2E4
-PARAM3 := $2E5 ; & $2E6
-TEXT := $EC21
-HIRES := $EC33
-CURSET := $F0C8
-CURMOV := $F0FD
-DRAW := $F110
-CHAR := $F12D
-POINT := $F1C8
-PAPER := $F204
-INK := $F210
+; Constant table
.rodata
; Graphics driver for the 240x200x2 monochrome mode on the Atmos
;
; Stefan Haubenthal <polluks@sdf.lonestar.org>
-; 2012-08-11, Greg King <greg.king5@verizon.net>
+; 2013-07-15, Greg King <gregdk@users.sf.net>
;
.include "zeropage.inc"
; Variables mapped to the zero page segment variables. Some of these are
; used for passing parameters to the driver.
-X1 = ptr1
-Y1 = ptr2
-X2 = ptr3
-Y2 = ptr4
+X1 := ptr1
+Y1 := ptr2
+X2 := ptr3
+Y2 := ptr4
; Absolute variables used in the code
ERROR: .res 1 ; Error code
MODE: .res 1 ; Graphics mode
-; Constants and tables
-PARAM1 = $2E1
-PARAM2 = $2E3
-PARAM3 = $2E5
-TEXT = $EC21
-HIRES = $EC33
-CURSET = $F0C8
-CURMOV = $F0FD
-DRAW = $F110
-CHAR = $F12D
-POINT = $F1C8
-PAPER = $F204
-INK = $F210
+; Constant table
.rodata
; Must set an error code: NO
;
-DONE = TEXT
+DONE := TEXT
; ------------------------------------------------------------------------
; GETERROR: Return the error code in A and clear it.
; Must set an error code: NO
;
-CLEAR = HIRES
+CLEAR := HIRES
; ------------------------------------------------------------------------
; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n).