IEC first partially working version
This commit is contained in:
parent
fea9fa45c2
commit
3e64f6ac69
|
@ -0,0 +1,18 @@
|
||||||
|
;=======================================================================================
|
||||||
|
; APPLE1 SPECIFIC DEFINES
|
||||||
|
;=======================================================================================
|
||||||
|
|
||||||
|
// TODO ascii encoding ?
|
||||||
|
|
||||||
|
const WOZMON = $FF1F ; enters monitor
|
||||||
|
const ECHO = $FFEF ; output ascii character in A (A not destroyed)
|
||||||
|
const PRBYTE = $FFDC ; print hex byte in A (A destroyed)
|
||||||
|
const KEY_DATA = $d010 ; read key
|
||||||
|
const KEY_CTRL = $d011 ; control port
|
||||||
|
const TERM_DATA = $d012 ; write ascii
|
||||||
|
const TERM_CTRL = $d013 ; control port
|
||||||
|
const INBUFFER = $0200 ; woz monitor input buffer
|
||||||
|
const INBUFSIZE = $80 ; woz monitor input buffer size
|
||||||
|
const CR = $0D ; carriage return
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
;=======================================================================================
|
||||||
|
; APPLE1 SPECIFIC CODE
|
||||||
|
;=======================================================================================
|
||||||
|
|
||||||
|
sub woz_puts()
|
||||||
|
ldy #0
|
||||||
|
do
|
||||||
|
lda (ptr),y
|
||||||
|
if zero then exit do
|
||||||
|
jsr ECHO
|
||||||
|
iny
|
||||||
|
loop while not zero
|
||||||
|
end sub
|
||||||
|
|
||||||
|
sub getkey()
|
||||||
|
do
|
||||||
|
lda KEY_CTRL
|
||||||
|
loop while not negative
|
||||||
|
lda KEY_DATA
|
||||||
|
and #$7f
|
||||||
|
end sub
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
processor 6502
|
||||||
|
|
||||||
|
; Kernal entries
|
||||||
|
|
||||||
|
const GETIN = $ffe4 ; getin rom kernel routine
|
||||||
|
const CLRSCN = $e544 ; clear screen
|
||||||
|
const PRNSTR = $ab1e ; print string in A/Y, 0 terminated
|
||||||
|
const GOHOME = $e566 ; go home
|
||||||
|
const PRNINT = $bdcd ; print integer in A/X
|
||||||
|
|
||||||
|
; zero page
|
||||||
|
|
||||||
|
const cursor_ptr = 209
|
||||||
|
const jiffy_clock = 162
|
||||||
|
const CRSRCOL = 646
|
||||||
|
|
||||||
|
; registers
|
||||||
|
|
||||||
|
; color costants
|
||||||
|
|
||||||
|
const color_black = 0
|
||||||
|
const color_white = 1
|
||||||
|
const color_red = 2
|
||||||
|
const color_cyan = 3
|
||||||
|
const color_magenta = 4
|
||||||
|
const color_green = 5
|
||||||
|
const color_blue = 6
|
||||||
|
const color_yellow = 7
|
||||||
|
|
||||||
|
; screen costants
|
||||||
|
|
||||||
|
const SCREEN_COLS = 40
|
||||||
|
const SCREEN_ROWS = 25
|
||||||
|
const VIDEO_MEMORY = 1024
|
||||||
|
const COLOR_MEMORY = 55296
|
||||||
|
const COLOR_PAGE_OFFSET = ((color_memory - VIDEO_MEMORY) / 256)
|
||||||
|
const BASIC_RAM = 2049
|
||||||
|
const RASTER = $d012
|
||||||
|
const ROMCHAR = 32768
|
||||||
|
|
||||||
|
; useful macros
|
||||||
|
|
||||||
|
macro cls
|
||||||
|
jsr CLRSCN
|
||||||
|
end macro
|
||||||
|
|
||||||
|
mac print
|
||||||
|
lda #[[{1}_pos]%256]
|
||||||
|
sta cursor_ptr
|
||||||
|
lda #[[{1}_pos]/256]
|
||||||
|
sta cursor_ptr+1
|
||||||
|
lda #[{1}%256]
|
||||||
|
ldy #[{1}/256]
|
||||||
|
jsr my_print
|
||||||
|
endm
|
||||||
|
|
||||||
|
macro waitkey
|
||||||
|
pha
|
||||||
|
txa : pha
|
||||||
|
tya : pha
|
||||||
|
.lab1
|
||||||
|
jsr GETIN
|
||||||
|
cmp #0
|
||||||
|
beq .lab1
|
||||||
|
pla : tay
|
||||||
|
pla : tax
|
||||||
|
pla
|
||||||
|
end macro
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 257 KiB |
Binary file not shown.
After Width: | Height: | Size: 168 KiB |
|
@ -0,0 +1,110 @@
|
||||||
|
processor 6502
|
||||||
|
|
||||||
|
#ifdef C64 then include "c64.lm"
|
||||||
|
#ifdef C64 then org 2049
|
||||||
|
|
||||||
|
#ifdef APPLE1 then include "apple1.lm"
|
||||||
|
#ifdef APPLE1 then org $280
|
||||||
|
|
||||||
|
include "macros.lm"
|
||||||
|
include "macros_16.lm"
|
||||||
|
|
||||||
|
dim ptr as word at 254 ; useful zero page pointer
|
||||||
|
|
||||||
|
#ifdef C64
|
||||||
|
basic start
|
||||||
|
10 sys {main}
|
||||||
|
basic end
|
||||||
|
#endif
|
||||||
|
|
||||||
|
main:
|
||||||
|
PRINTMSG #MSG_OK
|
||||||
|
|
||||||
|
call save_file
|
||||||
|
PRINTMSG #MSG_OK
|
||||||
|
|
||||||
|
; clears file content at absolute address
|
||||||
|
ld16 ptr, #file_content
|
||||||
|
lda #88 ;'X'
|
||||||
|
for y=#0 to #15
|
||||||
|
sta (ptr),y
|
||||||
|
next
|
||||||
|
|
||||||
|
; clears file content at relative address
|
||||||
|
ld16 ptr, #relative_buffer
|
||||||
|
lda #88 ;'X'
|
||||||
|
for y=#0 to #15
|
||||||
|
sta (ptr),y
|
||||||
|
next
|
||||||
|
|
||||||
|
; do not perform VERIFY when loading
|
||||||
|
ld VERCK, #0
|
||||||
|
|
||||||
|
; prints file content loaded at relative address
|
||||||
|
PRINTMSG #MSG_RELATIVE_IS
|
||||||
|
PRINTMSG #relative_buffer
|
||||||
|
PRINTMSG #MSG_ABSOLUTE_IS
|
||||||
|
PRINTMSG #file_content
|
||||||
|
|
||||||
|
call load_file_relative
|
||||||
|
PRINTMSG #MSG_OK
|
||||||
|
call load_file_absolute
|
||||||
|
PRINTMSG #MSG_OK
|
||||||
|
|
||||||
|
; prints file content loaded at relative address
|
||||||
|
PRINTMSG #MSG_RELATIVE_IS
|
||||||
|
PRINTMSG #relative_buffer
|
||||||
|
PRINTMSG #MSG_ABSOLUTE_IS
|
||||||
|
PRINTMSG #file_content
|
||||||
|
rts
|
||||||
|
|
||||||
|
save_file:
|
||||||
|
JSR InitPia
|
||||||
|
ld16 FNADR, #file_name_test
|
||||||
|
call CalcFileNameLength
|
||||||
|
ld16 STAL, #file_content
|
||||||
|
ld16 EAL, #file_content_end
|
||||||
|
ld FA, #8
|
||||||
|
ld SA, #1
|
||||||
|
call SAVE
|
||||||
|
rts
|
||||||
|
|
||||||
|
load_file_relative:
|
||||||
|
JSR InitPia
|
||||||
|
ld16 FNADR, #file_name_test
|
||||||
|
call CalcFileNameLength
|
||||||
|
ld16 MEMUSS, #relative_buffer
|
||||||
|
ld FA, #8
|
||||||
|
ld SA, #0
|
||||||
|
call LOAD
|
||||||
|
rts
|
||||||
|
|
||||||
|
load_file_absolute:
|
||||||
|
JSR InitPia
|
||||||
|
ld16 FNADR, #file_name_test
|
||||||
|
call CalcFileNameLength
|
||||||
|
ld FA, #8
|
||||||
|
ld SA, #1
|
||||||
|
call LOAD
|
||||||
|
rts
|
||||||
|
|
||||||
|
include "kernal.lm"
|
||||||
|
|
||||||
|
#ifdef APPLE1 then include "apple1_code.lm"
|
||||||
|
|
||||||
|
file_name_test:
|
||||||
|
byte "prova",0
|
||||||
|
|
||||||
|
file_content:
|
||||||
|
byte "0123456789ABCDEF"
|
||||||
|
file_content_end:
|
||||||
|
byte 13,0 ; filler that allows print as string
|
||||||
|
|
||||||
|
relative_buffer:
|
||||||
|
byte "----------------"
|
||||||
|
relative_buffer_end:
|
||||||
|
byte 13,0 ; filler that allows print as string
|
||||||
|
|
||||||
|
MSG_OK: byte "OK", 13, 13, 0
|
||||||
|
MSG_RELATIVE_IS: byte "RELATIVE IS: ",0
|
||||||
|
MSG_ABSOLUTE_IS: byte "ABSOLUTE IS: ",0
|
|
@ -0,0 +1,174 @@
|
||||||
|
; Adapted from https://commodore.international/kim-iec/kim1541_public.asm
|
||||||
|
|
||||||
|
; zero page locations
|
||||||
|
STATUS = $90 ;I/O OPERATION STATUS BYTE
|
||||||
|
C3P0 = $94 ;IEEE BUFFERED CHAR FLAG
|
||||||
|
BSOUR = $95 ;CHAR BUFFER FOR IEEE
|
||||||
|
R2D2 = $A3 ;SERIAL BUS USAGE
|
||||||
|
BSOUR1 = $A4 ;TEMP USED BY SERIAL ROUTINE
|
||||||
|
COUNT = $A5 ;TEMP USED BY SERIAL ROUTINE
|
||||||
|
FNLEN = $B7 ;FILENAME LENGTH
|
||||||
|
FNADR = $BB ;FILENAME ADDRESS
|
||||||
|
FA = $BA ;FILE PRIMARY ADDRESS
|
||||||
|
SA = $B9 ;FILE SECONDARY ADDRESS
|
||||||
|
STAL = $AA ;SAVE END ADDR LOW BYTE FOR SAVE ROUTINE
|
||||||
|
STAH = $AB ;SAVE END ADDR HIGH BYTE FOR SAVE ROUTINE
|
||||||
|
SAL = $AC ;START ADDR LOW BYTE FOR SAVE ROUTINE
|
||||||
|
SAH = $AD ;START ADDR HIGH BYTE FOR SAVE ROUTINE
|
||||||
|
EAL = $AE ;END ADDRESS LOW BYTE
|
||||||
|
EAH = $AF ;END ADDRESS HIGH BYTE
|
||||||
|
MEMUSS = $C3 ;USER SPECIFIED FILE LOAD ADDRESS
|
||||||
|
VERCK = $0A ;LOAD OR VERIFY FLAG
|
||||||
|
SPERR = 16 ;VERIFY ERROR IN STATUS
|
||||||
|
FNAME = $27 ;FILENAME
|
||||||
|
|
||||||
|
#ifdef C64
|
||||||
|
const D2PRA = $DD00 ;CIA2 PERIPHERAL DATA REGISTER A ON C64
|
||||||
|
const D2DDRA = $DD02 ;CIA2 PERIPHERAL DATA DIR REGISTER A ON C64
|
||||||
|
const D1T2H = $DC07 ;CIA1 TIMER B HIGH BYTE VALUE
|
||||||
|
const D1ICR = $DC0D ;CIA1 INTERRUPT CONTROL REGISTER
|
||||||
|
const D1CRB = $DC0F ;CIA1 CONTROL REGISTER TIMER B
|
||||||
|
const TIMRB = $19 ;6526 CRB ENABLE ONE-SHOT TB
|
||||||
|
|
||||||
|
const BIT_ATN_OUT = %00001000 ; ($08) CIA2 at $DD00 Bit 3: ATN OUT
|
||||||
|
const BIT_CLK_OUT = %00010000 ; ($10) CIA2 at $DD00 Bit 4: CLOCK OUT
|
||||||
|
const BIT_DATA_OUT = %00100000 ; ($20) CIA2 at $DD00 Bit 5: DATA OUT
|
||||||
|
const BIT_CLK_IN = %01000000 ; ($40) CIA2 at $DD00 Bit 6: CLOCK IN
|
||||||
|
const BIT_DATA_IN = %10000000 ; ($80) CIA2 at $DD00 Bit 7: DATA IN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef APPLE1
|
||||||
|
const D2PRA = $A000 ;VIA PORT B ON APPLE1
|
||||||
|
const D2DDRA = $A002 ;VIA PORT B DATA DIRECTION REGISTER ON APPLE1
|
||||||
|
const D1ACR = $A00B ;VIA ACR ON APPLE1
|
||||||
|
const D2IFR = $A00D ;VIA IFR ON APPLE1
|
||||||
|
const D2T2H = $A009 ;VIA TIMER 2 HIGH BYTE
|
||||||
|
|
||||||
|
const TIMRB = #%01000000 ; FREE RUNNING T1 T2 ONESHOT D1
|
||||||
|
|
||||||
|
const BIT_ATN_OUT = %00000100 ; Bit 2: ATN OUT
|
||||||
|
const BIT_CLK_OUT = %00001000 ; Bit 3: CLOCK OUT
|
||||||
|
const BIT_DATA_OUT = %00010000 ; Bit 4: DATA OUT
|
||||||
|
const BIT_CLK_IN = %00100000 ; Bit 5: CLOCK IN
|
||||||
|
const BIT_DATA_IN = %01000000 ; Bit 6: DATA IN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
byte *const VIA_PORTB = (byte *) 0xA000; // port B register
|
||||||
|
byte *const VIA_PORTA = (byte *) 0xA001; // port A register
|
||||||
|
byte *const VIA_DDRB = (byte *) 0xA002; // port A data direction register
|
||||||
|
byte *const VIA_DDRA = (byte *) 0xA003; // port B data direction register
|
||||||
|
byte *const VIA_T1CL = (byte *) 0xA004; //
|
||||||
|
byte *const VIA_T1CH = (byte *) 0xA005; //
|
||||||
|
byte *const VIA_T1LL = (byte *) 0xA006; //
|
||||||
|
byte *const VIA_T1LH = (byte *) 0xA007; //
|
||||||
|
byte *const VIA_T2CL = (byte *) 0xA008; //
|
||||||
|
byte *const VIA_T2CH = (byte *) 0xA009; //
|
||||||
|
byte *const VIA_SR = (byte *) 0xA00A; //
|
||||||
|
byte *const VIA_ACR = (byte *) 0xA00B; //
|
||||||
|
byte *const VIA_PCR = (byte *) 0xA00C; //
|
||||||
|
byte *const VIA_IFR = (byte *) 0xA00D; //
|
||||||
|
byte *const VIA_IER = (byte *) 0xA00E; //
|
||||||
|
byte *const VIA_PORTANH = (byte *) 0xA00F; //
|
||||||
|
*/
|
||||||
|
|
||||||
|
const PRA_INIT_VALUE = $FF-BIT_ATN_OUT-BIT_CLK_OUT-BIT_DATA_OUT-BIT_CLK_IN-BIT_DATA_IN ; all IEC bits to "0"
|
||||||
|
const PRA_INIT_DIR = $FF-BIT_CLK_IN-BIT_DATA_IN ; CLK_IN AND DATA_IN "0", others "1"
|
||||||
|
|
||||||
|
; make "ASL A" compatible with "ASL"
|
||||||
|
MACRO ASL "A"
|
||||||
|
ASL
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
include "kernal_serial.lm"
|
||||||
|
include "kernal_load.lm"
|
||||||
|
include "kernal_save.lm"
|
||||||
|
|
||||||
|
MACRO PRINTMSG const
|
||||||
|
#ifdef APPLE1
|
||||||
|
LD16 ptr, #{1}
|
||||||
|
call print_string
|
||||||
|
#endif
|
||||||
|
#ifdef C64
|
||||||
|
LD16 ptr, #{1}
|
||||||
|
call print_string
|
||||||
|
#endif
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
LUKING:
|
||||||
|
PRINTMSG #MSG_SEARCHING
|
||||||
|
RTS
|
||||||
|
|
||||||
|
LODING:
|
||||||
|
PRINTMSG #MSG_LOADING
|
||||||
|
RTS
|
||||||
|
|
||||||
|
SAVING:
|
||||||
|
PRINTMSG #MSG_SAVING
|
||||||
|
RTS
|
||||||
|
|
||||||
|
ERROR8:
|
||||||
|
PRINTMSG #MSG_MISSING
|
||||||
|
RTS
|
||||||
|
|
||||||
|
ERROR4:
|
||||||
|
PRINTMSG #MSG_NOT_FOUND
|
||||||
|
RTS
|
||||||
|
|
||||||
|
ERROR5:
|
||||||
|
PRINTMSG #MSG_DEVICE_NP
|
||||||
|
RTS
|
||||||
|
|
||||||
|
MSG_SEARCHING: BYTE "searching",13,0
|
||||||
|
MSG_LOADING: BYTE "loading",13,0
|
||||||
|
MSG_SAVING: BYTE "saving",13,0
|
||||||
|
MSG_MISSING: BYTE "?missing file name",13,0
|
||||||
|
MSG_NOT_FOUND: BYTE "?file not found",13,0
|
||||||
|
MSG_DEVICE_NP: BYTE "?device not present",13,0
|
||||||
|
|
||||||
|
SUB print_string()
|
||||||
|
tya : pha
|
||||||
|
txa : pha
|
||||||
|
#ifdef APPLE1
|
||||||
|
call woz_puts
|
||||||
|
#endif
|
||||||
|
#ifdef C64
|
||||||
|
lda ptr
|
||||||
|
ldy ptr+1
|
||||||
|
call PRNSTR
|
||||||
|
#endif
|
||||||
|
pla : tax
|
||||||
|
pla : tay
|
||||||
|
END SUB
|
||||||
|
|
||||||
|
SUB CalcFileNameLength()
|
||||||
|
LDY #$FF
|
||||||
|
DO
|
||||||
|
INY
|
||||||
|
LDA (FNADR),Y
|
||||||
|
LOOP WHILE NOT ZERO
|
||||||
|
STY FNLEN
|
||||||
|
END SUB
|
||||||
|
|
||||||
|
SUB InitPia()
|
||||||
|
CLD ; NO DECIMAL MODE
|
||||||
|
SEI ; NO INTERRUPTS
|
||||||
|
|
||||||
|
#ifdef C64
|
||||||
|
LD D2PRA, #PRA_INIT_VALUE ;SETS ALL IEC BITS TO LOW ($07) (#%00000111)
|
||||||
|
LD D2DDRA, #PRA_INIT_DIR ;SET DATA DIRECTION FOR REGISTER A ($3f) (#%00111111)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef APPLE1
|
||||||
|
LD D2PRA, #PRA_INIT_VALUE ;SETS ALL IEC BITS TO LOW
|
||||||
|
LD D2DDRA, #PRA_INIT_DIR ;SET DATA DIRECTION FOR REGISTER A
|
||||||
|
LD D1ACR, #TIMRB ;FREE RUNNING T1 T2 ONESHOT D1 (#%01000000)
|
||||||
|
lda #0
|
||||||
|
sta STATUS
|
||||||
|
sta C3P0
|
||||||
|
sta BSOUR
|
||||||
|
sta R2D2
|
||||||
|
sta BSOUR1
|
||||||
|
;sta COUNT
|
||||||
|
#endif
|
||||||
|
END SUB
|
|
@ -0,0 +1,148 @@
|
||||||
|
LOAD
|
||||||
|
;********************************
|
||||||
|
;* C64 KERNAL IEEE LOAD ROUTINE *
|
||||||
|
;********************************
|
||||||
|
;LOAD FROM CBM IEEE DEVICE
|
||||||
|
;
|
||||||
|
LDY FNLEN ;MUST HAVE FILE NAME
|
||||||
|
BNE LD25 ;YES...OK
|
||||||
|
;
|
||||||
|
JMP ERROR8 ;MISSING FILE NAME
|
||||||
|
;
|
||||||
|
LD25 LDX SA ;SAVE SA IN .X
|
||||||
|
JSR LUKING ;TELL USER LOOKING
|
||||||
|
LDA #$60 ;SPECIAL LOAD COMMAND
|
||||||
|
STA SA
|
||||||
|
JSR OPENI ;OPEN THE FILE
|
||||||
|
;
|
||||||
|
LDA FA
|
||||||
|
JSR TALK ;ESTABLISH THE CHANNEL
|
||||||
|
LDA SA
|
||||||
|
JSR TKSA ;TELL IT TO LOAD
|
||||||
|
;
|
||||||
|
JSR ACPTR ;GET FIRST BYTE
|
||||||
|
STA EAL
|
||||||
|
;
|
||||||
|
LDA STATUS ;TEST STATUS FOR ERROR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
BCS LD90 ;FILE NOT FOUND...
|
||||||
|
JSR ACPTR ;GET SECOND BYTE
|
||||||
|
STA EAH
|
||||||
|
;
|
||||||
|
TXA ;FIND OUT OLD SA
|
||||||
|
BNE LD30 ;SA<>0 USE DISK ADDRESS
|
||||||
|
LDA MEMUSS ;ELSE LOAD WHERE USER WANTS
|
||||||
|
STA EAL
|
||||||
|
LDA MEMUSS+1
|
||||||
|
STA EAH
|
||||||
|
LD30 JSR LODING ;TELL USER LOADING
|
||||||
|
;
|
||||||
|
LD40 LDA #$FD ;MASK OFF TIMEOUT
|
||||||
|
AND STATUS
|
||||||
|
STA STATUS
|
||||||
|
;
|
||||||
|
;JSR STOP ;STOP KEY?
|
||||||
|
;BNE LD45 ;NO...
|
||||||
|
;
|
||||||
|
;JMP BREAK ;STOP KEY PRESSED
|
||||||
|
;
|
||||||
|
LD45 JSR ACPTR ;GET BYTE OFF IEEE
|
||||||
|
TAX
|
||||||
|
LDA STATUS ;WAS THERE A TIMEOUT?
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
BCS LD40 ;YES...TRY AGAIN
|
||||||
|
TXA
|
||||||
|
LDY VERCK ;PERFORMING VERIFY?
|
||||||
|
BEQ LD50 ;NO...LOAD
|
||||||
|
LDY #0
|
||||||
|
CMP (EAL),Y ;VERIFY IT
|
||||||
|
BEQ LD60 ;O.K....
|
||||||
|
LDA #SPERR ;NO GOOD...VERIFY ERROR
|
||||||
|
JSR UDST ;UPDATE STATUS
|
||||||
|
.BYTE $2C ;SKIP NEXT STORE
|
||||||
|
;
|
||||||
|
LD50 STA (EAL),Y
|
||||||
|
LD60 INC EAL ;INCREMENT STORE ADDR
|
||||||
|
BNE LD64
|
||||||
|
INC EAH
|
||||||
|
LD64 BIT STATUS ;EOI?
|
||||||
|
BVC LD40 ;NO...CONTINUE LOAD
|
||||||
|
;
|
||||||
|
JSR UNTLK ;CLOSE CHANNEL
|
||||||
|
JSR CLSEI ;CLOSE THE FILE
|
||||||
|
BCC LD180 ;BRANCH ALWAYS
|
||||||
|
;
|
||||||
|
LD90 JMP ERROR4 ;FILE NOT FOUND
|
||||||
|
;
|
||||||
|
OPENI LDA SA
|
||||||
|
BMI OP175 ;NO SA...DONE
|
||||||
|
|
||||||
|
LDY FNLEN
|
||||||
|
BEQ OP175 ;NO FILE NAME...DONE
|
||||||
|
;
|
||||||
|
LDA #0 ;CLEAR THE SERIAL STATUS
|
||||||
|
STA STATUS
|
||||||
|
;
|
||||||
|
LDA FA
|
||||||
|
JSR LISTN ;DEVICE LA TO LISTEN
|
||||||
|
;
|
||||||
|
LDA SA
|
||||||
|
ORA #$F0
|
||||||
|
JSR SECND
|
||||||
|
;
|
||||||
|
LDA STATUS ;ANYBODY HOME?
|
||||||
|
BPL OP35 ;YES...CONTINUE
|
||||||
|
;
|
||||||
|
;THIS ROUTINE IS CALLED BY OTHER
|
||||||
|
;KERNAL ROUTINES WHICH ARE CALLED
|
||||||
|
;DIRECTLY BY OS. KILL RETURN
|
||||||
|
;ADDRESS TO RETURN TO OS.
|
||||||
|
;
|
||||||
|
PLA
|
||||||
|
PLA
|
||||||
|
JMP ERROR5 ;DEVICE NOT PRESENT
|
||||||
|
;
|
||||||
|
OP35 LDA FNLEN
|
||||||
|
BEQ OP45 ;NO NAME...DONE SEQUENCE
|
||||||
|
;
|
||||||
|
;SEND FILE NAME OVER SERIAL
|
||||||
|
;
|
||||||
|
LDY #0
|
||||||
|
OP40 LDA (FNADR),Y
|
||||||
|
JSR CIOUT
|
||||||
|
INY
|
||||||
|
CPY FNLEN
|
||||||
|
BNE OP40
|
||||||
|
;
|
||||||
|
OP45 JMP CUNLSN ;JSR UNLSN: CLC: RTS
|
||||||
|
;
|
||||||
|
UDST ORA STATUS
|
||||||
|
STA STATUS
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
CLSEI BIT SA
|
||||||
|
BMI CLSEI2
|
||||||
|
LDA FA
|
||||||
|
JSR LISTN
|
||||||
|
LDA SA
|
||||||
|
AND #$EF
|
||||||
|
ORA #$E0
|
||||||
|
JSR SECND
|
||||||
|
;
|
||||||
|
CUNLSN JSR UNLSN ;ENTRY FOR OPENI
|
||||||
|
;
|
||||||
|
CLSEI2 CLC
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
LD180 CLC ;GOOD EXIT
|
||||||
|
;
|
||||||
|
; SET UP END LOAD ADDRESS
|
||||||
|
;
|
||||||
|
LDX EAL
|
||||||
|
LDY EAH
|
||||||
|
;
|
||||||
|
OP175 CLC ;FLAG GOOD OPEN
|
||||||
|
OP180 RTS ;EXIT IN PEACE
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
SAVE
|
||||||
|
LDA #$61 ; "OPEN" COMMAND CHANNEL 1
|
||||||
|
STA SA
|
||||||
|
LDY FNLEN
|
||||||
|
BNE SV25
|
||||||
|
;
|
||||||
|
JMP ERROR8 ;MISSING FILE NAME
|
||||||
|
;
|
||||||
|
SV25 JSR OPENI
|
||||||
|
JSR SAVING
|
||||||
|
LDA FA
|
||||||
|
JSR LISTN
|
||||||
|
LDA SA
|
||||||
|
JSR SECND
|
||||||
|
LDY #0
|
||||||
|
JSR RD300
|
||||||
|
LDA SAL
|
||||||
|
JSR CIOUT
|
||||||
|
LDA SAH
|
||||||
|
JSR CIOUT
|
||||||
|
SV30 JSR CMPSTE ;COMPARE START TO END
|
||||||
|
BCS SV50 ;HAVE REACHED END
|
||||||
|
LDA (SAL),Y
|
||||||
|
JSR CIOUT
|
||||||
|
;JSR STOP
|
||||||
|
;BNE SV40
|
||||||
|
;
|
||||||
|
;BREAK JSR CLSEI
|
||||||
|
; LDA #0
|
||||||
|
; SEC
|
||||||
|
; RTS
|
||||||
|
;
|
||||||
|
SV40 JSR INCSAL ;INCREMENT CURRENT ADDR.
|
||||||
|
BNE SV30
|
||||||
|
SV50 JSR UNLSN
|
||||||
|
JSR CLSEI
|
||||||
|
;
|
||||||
|
JMP CUNLSN
|
||||||
|
;
|
||||||
|
RD300 LDA STAH ; RESTORE STARTING ADDRESS...
|
||||||
|
STA SAH ;...POINTERS (SAH & SAL)
|
||||||
|
LDA STAL
|
||||||
|
STA SAL
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;COMPARE START AND END LOAD/SAVE
|
||||||
|
;ADDRESSES. SUBROUTINE CALLED BY
|
||||||
|
;TAPE READ, SAVE, TAPE WRITE
|
||||||
|
;
|
||||||
|
CMPSTE SEC
|
||||||
|
LDA SAL
|
||||||
|
SBC EAL
|
||||||
|
LDA SAH
|
||||||
|
SBC EAH
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
INCSAL INC SAL
|
||||||
|
BNE INCR
|
||||||
|
INC SAH
|
||||||
|
INCR RTS
|
|
@ -0,0 +1,336 @@
|
||||||
|
;adapted from https://github.com/mist64/cbmsrc/blob/master/KERNAL_C64_02/serial4.0
|
||||||
|
;.PAG 'SERIAL ROUTINES'
|
||||||
|
;COMMAND SERIAL BUS DEVICE TO TALK
|
||||||
|
;
|
||||||
|
TALK ORA #$40 ;MAKE A TALK ADR
|
||||||
|
.BYTE $2C ;SKIP TWO BYTES
|
||||||
|
;
|
||||||
|
;COMMAND SERIAL BUS DEVICE TO LISTEN
|
||||||
|
;
|
||||||
|
LISTN ORA #$20 ;MAKE A LISTEN ADR
|
||||||
|
; @@@ JSR RSP232 ;PROTECT SELF FROM RS232 NMI'S --- disabled
|
||||||
|
LIST1 PHA
|
||||||
|
;
|
||||||
|
;
|
||||||
|
BIT C3P0 ;CHARACTER LEFT IN BUF?
|
||||||
|
BPL LIST2 ;NO...
|
||||||
|
;
|
||||||
|
;SEND BUFFERED CHARACTER
|
||||||
|
;
|
||||||
|
SEC ;SET EOI FLAG
|
||||||
|
ROR R2D2
|
||||||
|
;
|
||||||
|
JSR ISOUR ;SEND LAST CHARACTER
|
||||||
|
;
|
||||||
|
LSR C3P0 ;BUFFER CLEAR FLAG
|
||||||
|
LSR R2D2 ;CLEAR EOI FLAG
|
||||||
|
;
|
||||||
|
;
|
||||||
|
LIST2 PLA ;TALK/LISTEN ADDRESS
|
||||||
|
STA BSOUR
|
||||||
|
; @@@ SEI
|
||||||
|
JSR DATAHI
|
||||||
|
CMP #$3F ;CLKHI ONLY ON UNLISTEN --- is this a bug?
|
||||||
|
BNE LIST5
|
||||||
|
JSR CLKHI
|
||||||
|
;
|
||||||
|
LIST5 LDA D2PRA ;ASSERT ATTENTION
|
||||||
|
ORA #BIT_ATN_OUT
|
||||||
|
STA D2PRA
|
||||||
|
;
|
||||||
|
ISOURA NOP ; @@@ SEI
|
||||||
|
JSR CLKLO ;SET CLOCK LINE LOW
|
||||||
|
JSR DATAHI
|
||||||
|
JSR W1MS ;DELAY 1 MS
|
||||||
|
;
|
||||||
|
ISOUR NOP ; @@@ SEI ;NO IRQ'S ALLOWED
|
||||||
|
JSR DATAHI ;MAKE SURE DATA IS RELEASED
|
||||||
|
JSR DEBPIA ;DATA SHOULD BE LOW
|
||||||
|
BCS NODEV
|
||||||
|
JSR CLKHI ;CLOCK LINE HIGH
|
||||||
|
BIT R2D2 ;EOI FLAG TEST
|
||||||
|
BPL NOEOI
|
||||||
|
; DO THE EOI
|
||||||
|
ISR02 JSR DEBPIA ;WAIT FOR DATA TO GO HIGH
|
||||||
|
BCC ISR02
|
||||||
|
;
|
||||||
|
ISR03 JSR DEBPIA ;WAIT FOR DATA TO GO LOW
|
||||||
|
BCS ISR03
|
||||||
|
;
|
||||||
|
NOEOI JSR DEBPIA ;WAIT FOR DATA HIGH
|
||||||
|
BCC NOEOI
|
||||||
|
JSR CLKLO ;SET CLOCK LOW
|
||||||
|
;
|
||||||
|
; SET TO SEND DATA
|
||||||
|
;
|
||||||
|
LDA #$08 ;COUNT 8 BITS
|
||||||
|
STA COUNT
|
||||||
|
;
|
||||||
|
ISR01
|
||||||
|
LDA D2PRA ;DEBOUNCE THE BUS
|
||||||
|
CMP D2PRA
|
||||||
|
BNE ISR01
|
||||||
|
ASL A ;SET THE FLAGS
|
||||||
|
#ifdef APPLE1 then ASL
|
||||||
|
BCC FRMERR ;DATA MUST BE HI
|
||||||
|
;
|
||||||
|
ROR BSOUR ;NEXT BIT INTO CARRY
|
||||||
|
BCS ISRHI
|
||||||
|
JSR DATALO
|
||||||
|
BNE ISRCLK
|
||||||
|
ISRHI JSR DATAHI
|
||||||
|
ISRCLK JSR CLKHI ;CLOCK HI
|
||||||
|
NOP
|
||||||
|
NOP
|
||||||
|
NOP
|
||||||
|
NOP
|
||||||
|
LDA D2PRA
|
||||||
|
AND #$FF-BIT_DATA_OUT ;DATA HIGH
|
||||||
|
ORA #BIT_CLK_OUT ;CLOCK LOW
|
||||||
|
STA D2PRA
|
||||||
|
DEC COUNT
|
||||||
|
BNE ISR01
|
||||||
|
|
||||||
|
#ifdef C64
|
||||||
|
LDA #$04 ;SET TIMER FOR 1MS
|
||||||
|
STA D1T2H
|
||||||
|
LDA #TIMRB ;TRIGGER TIMER
|
||||||
|
STA D1CRB ;--- timer starts here
|
||||||
|
LDA D1ICR ;CLEAR THE TIMER FLAGS<<<<<<<<<<<<<
|
||||||
|
ISR04 LDA D1ICR ;--- read timer flag
|
||||||
|
AND #$02 ;--- $02 is underflow timer B (ICR bit 1)
|
||||||
|
BNE FRMERR
|
||||||
|
JSR DEBPIA
|
||||||
|
BCS ISR04
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef APPLE1
|
||||||
|
LDA #$04 ;SET TIMER FOR 1MS
|
||||||
|
STA D2T2H ;--- timer starts here, flag cleared
|
||||||
|
ISR04 LDA D2IFR ;--- read timer flag
|
||||||
|
AND #$20 ;--- $20 is timer 2 (IFR bit 5)
|
||||||
|
BNE FRMERR
|
||||||
|
JSR DEBPIA
|
||||||
|
BCS ISR04
|
||||||
|
#endif
|
||||||
|
|
||||||
|
; @@@ CLI ;LET IRQ'S CONTINUE
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
NODEV ;DEVICE NOT PRESENT ERROR
|
||||||
|
LDA #$80
|
||||||
|
.BYTE $2C
|
||||||
|
FRMERR ;FRAMING ERROR
|
||||||
|
LDA #$03
|
||||||
|
CSBERR JSR UDST ;COMMODORE SERIAL BUSS ERROR ENTRY
|
||||||
|
; @@@ CLI ;IRQ'S WERE OFF...TURN ON
|
||||||
|
CLC ;MAKE SURE NO KERNAL ERR
|
||||||
|
BCC DLABYE ;TURN ATN OFF ,RELEASE ALL LINES
|
||||||
|
;
|
||||||
|
;SEND SECONDARY ADDRESS AFTER LISTEN
|
||||||
|
;
|
||||||
|
SECND STA BSOUR ;BUFFER CHARACTER
|
||||||
|
JSR ISOURA ;SEND IT
|
||||||
|
;RELEASE ATTENTION AFTER LISTEN
|
||||||
|
;
|
||||||
|
SCATN LDA D2PRA
|
||||||
|
AND #$FF-BIT_ATN_OUT
|
||||||
|
STA D2PRA ;RELEASE ATTENTION
|
||||||
|
RTS
|
||||||
|
;TALK SECOND ADDRESS
|
||||||
|
;
|
||||||
|
TKSA STA BSOUR ;BUFFER CHARACTER
|
||||||
|
JSR ISOURA ;SEND SECOND ADDR
|
||||||
|
TKATN ;SHIFT OVER TO LISTENER
|
||||||
|
; @@@ SEI ;NO IRQ'S HERE
|
||||||
|
JSR DATALO ;DATA LINE LOW
|
||||||
|
JSR SCATN
|
||||||
|
JSR CLKHI ;CLOCK LINE HIGH JSR/RTS
|
||||||
|
TKATN1 JSR DEBPIA ;WAIT FOR CLOCK TO GO LOW
|
||||||
|
BMI TKATN1
|
||||||
|
; @@@ CLI ;IRQ'S OKAY NOW
|
||||||
|
RTS
|
||||||
|
;BUFFERED OUTPUT TO SERIAL BUS
|
||||||
|
;
|
||||||
|
CIOUT BIT C3P0 ;BUFFERED CHAR?
|
||||||
|
BMI CI2 ;YES...SEND LAST
|
||||||
|
;
|
||||||
|
SEC ;NO...
|
||||||
|
ROR C3P0 ;SET BUFFERED CHAR FLAG
|
||||||
|
BNE CI4 ;BRANCH ALWAYS
|
||||||
|
;
|
||||||
|
CI2 PHA ;SAVE CURRENT CHAR
|
||||||
|
JSR ISOUR ;SEND LAST CHAR
|
||||||
|
PLA ;RESTORE CURRENT CHAR
|
||||||
|
CI4 STA BSOUR ;BUFFER CURRENT CHAR
|
||||||
|
CLC ;CARRY-GOOD EXIT
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;SEND UNTALK COMMAND ON SERIAL BUS
|
||||||
|
;
|
||||||
|
UNTLK NOP ; @@@ SEI
|
||||||
|
JSR CLKLO
|
||||||
|
LDA D2PRA ;PULL ATN
|
||||||
|
ORA #BIT_ATN_OUT
|
||||||
|
STA D2PRA
|
||||||
|
LDA #$5F ;UNTALK COMMAND
|
||||||
|
.BYTE $2C ;SKIP TWO BYTES
|
||||||
|
;SEND UNLISTEN COMMAND ON SERIAL BUS
|
||||||
|
;
|
||||||
|
UNLSN LDA #$3F ;UNLISTEN COMMAND
|
||||||
|
JSR LIST1 ;SEND IT
|
||||||
|
;
|
||||||
|
; RELEASE ALL LINES
|
||||||
|
DLABYE JSR SCATN ;ALWAYS RELEASE ATN
|
||||||
|
; DELAY THEN RELEASE CLOCK AND DATA
|
||||||
|
;
|
||||||
|
DLADLH TXA ;DELAY APPROX 60 US
|
||||||
|
LDX #10
|
||||||
|
DLAD00 DEX
|
||||||
|
BNE DLAD00
|
||||||
|
TAX
|
||||||
|
JSR CLKHI
|
||||||
|
JMP DATAHI
|
||||||
|
|
||||||
|
;INPUT A BYTE FROM SERIAL BUS
|
||||||
|
;
|
||||||
|
ACPTR
|
||||||
|
SEI ;NO IRQ ALLOWED
|
||||||
|
LDA #$00 ;SET EOI/ERROR FLAG
|
||||||
|
STA COUNT
|
||||||
|
JSR CLKHI ;MAKE SURE CLOCK LINE IS RELEASED
|
||||||
|
ACP00A JSR DEBPIA ;WAIT FOR CLOCK HIGH
|
||||||
|
BPL ACP00A
|
||||||
|
|
||||||
|
#ifdef C64
|
||||||
|
EOIACP
|
||||||
|
LDA #$01 ;SET TIMER 2 FOR 256US
|
||||||
|
STA D1T2H
|
||||||
|
LDA #TIMRB
|
||||||
|
STA D1CRB
|
||||||
|
JSR DATAHI ;DATA LINE HIGH (MAKES TIMMING MORE LIKE VIC-20
|
||||||
|
LDA D1ICR ;CLEAR THE TIMER FLAGS<<<<<<<<<<<<
|
||||||
|
ACP00 LDA D1ICR
|
||||||
|
AND #$02 ;CHECK THE TIMER
|
||||||
|
BNE ACP00B ;RAN OUT.....
|
||||||
|
JSR DEBPIA ;CHECK THE CLOCK LINE
|
||||||
|
BMI ACP00 ;NO NOT YET
|
||||||
|
BPL ACP01 ;YES.....
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef APPLE1
|
||||||
|
EOIACP LDA #$01 ;SET TIMER 2 FOR 256US
|
||||||
|
STA D2T2H
|
||||||
|
JSR DATAHI ;DATA LINE HIGH (MAKES TIMMING MORE LIKE VIC-20
|
||||||
|
ACP00 LDA D2IFR
|
||||||
|
AND #$20 ;CHECK THE TIMER
|
||||||
|
BNE ACP00B ;RAN OUT.....
|
||||||
|
JSR DEBPIA ;CHECK THE CLOCK LINE
|
||||||
|
BMI ACP00 ;NO NOT YET
|
||||||
|
BPL ACP01 ;YES.....
|
||||||
|
#endif
|
||||||
|
|
||||||
|
;
|
||||||
|
ACP00B LDA COUNT ;CHECK FOR ERROR (TWICE THRU TIMEOUTS)
|
||||||
|
BEQ ACP00C
|
||||||
|
LDA #2
|
||||||
|
JMP CSBERR ; ST = 2 READ TIMEOUT
|
||||||
|
;
|
||||||
|
; TIMER RAN OUT DO AN EOI THING
|
||||||
|
;
|
||||||
|
ACP00C JSR DATALO ;DATA LINE LOW
|
||||||
|
JSR CLKHI ; DELAY AND THEN SET DATAHI (FIX FOR 40US C64)
|
||||||
|
LDA #$40
|
||||||
|
JSR UDST ;OR AN EOI BIT INTO STATUS
|
||||||
|
INC COUNT ;GO AROUND AGAIN FOR ERROR CHECK ON EOI
|
||||||
|
BNE EOIACP
|
||||||
|
;
|
||||||
|
; DO THE BYTE TRANSFER
|
||||||
|
;
|
||||||
|
ACP01 LDA #8 ;SET UP COUNTER
|
||||||
|
STA COUNT
|
||||||
|
;
|
||||||
|
ACP03 LDA D2PRA ;WAIT FOR CLOCK HIGH
|
||||||
|
CMP D2PRA ;DEBOUNCE
|
||||||
|
BNE ACP03
|
||||||
|
ASL A ;SHIFT DATA INTO CARRY
|
||||||
|
#ifdef APPLE1 then ASL
|
||||||
|
BPL ACP03 ;CLOCK STILL LOW...
|
||||||
|
ROR BSOUR1 ;ROTATE DATA IN
|
||||||
|
;
|
||||||
|
ACP03A LDA D2PRA ;WAIT FOR CLOCK LOW
|
||||||
|
CMP D2PRA ;DEBOUNCE
|
||||||
|
BNE ACP03A
|
||||||
|
ASL A
|
||||||
|
#ifdef APPLE1 then ASL
|
||||||
|
BMI ACP03A
|
||||||
|
DEC COUNT
|
||||||
|
BNE ACP03 ;MORE BITS.....
|
||||||
|
;...EXIT...
|
||||||
|
JSR DATALO ;DATA LOW
|
||||||
|
BIT STATUS ;CHECK FOR EOI
|
||||||
|
BVC ACP04 ;NONE...
|
||||||
|
;
|
||||||
|
JSR DLADLH ;DELAY THEN SET DATA HIGH
|
||||||
|
;
|
||||||
|
ACP04 LDA BSOUR1
|
||||||
|
; @@@ CLI ;IRQ IS OK
|
||||||
|
CLC ;GOOD EXIT
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
CLKHI ;SET CLOCK LINE HIGH (INVERTED)
|
||||||
|
LDA D2PRA
|
||||||
|
AND #$FF-BIT_CLK_OUT
|
||||||
|
STA D2PRA
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
CLKLO ;SET CLOCK LINE LOW (INVERTED)
|
||||||
|
LDA D2PRA
|
||||||
|
ORA #BIT_CLK_OUT
|
||||||
|
STA D2PRA
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
DATAHI ;SET DATA LINE HIGH (INVERTED)
|
||||||
|
LDA D2PRA
|
||||||
|
AND #$FF-BIT_DATA_OUT
|
||||||
|
STA D2PRA
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
DATALO ;SET DATA LINE LOW (INVERTED)
|
||||||
|
LDA D2PRA
|
||||||
|
ORA #BIT_DATA_OUT
|
||||||
|
STA D2PRA
|
||||||
|
RTS
|
||||||
|
;
|
||||||
|
DEBPIA LDA D2PRA ;DEBOUNCE THE PIA
|
||||||
|
CMP D2PRA
|
||||||
|
BNE DEBPIA
|
||||||
|
#ifdef APPLE1 then ASL
|
||||||
|
ASL A ;SHIFT THE DATA BIT INTO THE CARRY...
|
||||||
|
RTS ;...AND THE CLOCK INTO NEG FLAG
|
||||||
|
;
|
||||||
|
W1MS ;DELAY 1MS USING LOOP
|
||||||
|
TXA ;SAVE .X
|
||||||
|
LDX #200-16 ;1000US-(1000/500*8=#40US HOLDS)
|
||||||
|
W1MS1 DEX ;5US LOOP
|
||||||
|
BNE W1MS1
|
||||||
|
TAX ;RESTORE .X
|
||||||
|
RTS
|
||||||
|
;.END
|
||||||
|
;*******************************
|
||||||
|
;WRITTEN 8/11/80 BOB FAIRBAIRN
|
||||||
|
;TEST SERIAL0.6 8/12/80 RJF
|
||||||
|
;CHANGE I/O STRUCTURE 8/21/80 RJF
|
||||||
|
;MORE I/O CHANGES 8/24/80 RJF
|
||||||
|
;FINAL RELEASE INTO KERNAL 8/26/80 RJF
|
||||||
|
;SOME CLEAN UP 9/8/80 RSR
|
||||||
|
;ADD IRQ PROTECT ON ISOUR AND TKATN 9/22/80 RSR
|
||||||
|
;FIX UNTALK 10/7/80 RSR
|
||||||
|
;MODIFY FOR VIC-40 I/O SYSTEM 12/08/81 RSR
|
||||||
|
;ADD SEI TO (UNTLK,ISOURA,LIST2) 12/14/81 RSR
|
||||||
|
;MODIFY FOR 6526 FLAGS FIX ERRS 12/31/81 RSR
|
||||||
|
;MODIFY FOR COMMODORE 64 I/O 3/11/82 RSR
|
||||||
|
;CHANGE ACPTR EOI FOR BETTER RESPONSE 3/28/82 RSR
|
||||||
|
;CHANGE WAIT 1 MS ROUTINE FOR LESS CODE 4/8/82 RSR
|
||||||
|
;******************************
|
||||||
|
;.END
|
|
@ -0,0 +1,18 @@
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
set DASM=C:\Users\Nino1\Desktop\USB\compilers\dasm\dasm.exe
|
||||||
|
set ASMPROC=call asmproc
|
||||||
|
rem set ASMPROC=node ..\..\asmproc\dist\asmproc
|
||||||
|
|
||||||
|
%ASMPROC% -i iec.lm -o iec.asm -t dasm -d APPLE1
|
||||||
|
if %errorlevel% == -1 goto fine
|
||||||
|
|
||||||
|
%DASM% iec.asm -f1 -liec.lst -oiec.prg
|
||||||
|
if %errorlevel% == -1 goto fine
|
||||||
|
|
||||||
|
call node ..\..\tools\prg2bin.js -i iec.prg -o iec#060280
|
||||||
|
|
||||||
|
echo "ALL OK!"
|
||||||
|
|
||||||
|
:fine
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
;
|
||||||
|
; Aliases
|
||||||
|
;
|
||||||
|
|
||||||
|
MACRO poke mem, const
|
||||||
|
lda #{2}
|
||||||
|
sta {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO call mem
|
||||||
|
jsr {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
macro ret
|
||||||
|
rts
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro push "a"
|
||||||
|
pha
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro pop "a"
|
||||||
|
pla
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro or mem
|
||||||
|
ora {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro or const
|
||||||
|
ora #{1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
;
|
||||||
|
; Easy loads
|
||||||
|
;
|
||||||
|
|
||||||
|
macro ld "a", mem
|
||||||
|
lda {2}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "a", const
|
||||||
|
lda #{2}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "a", indirect
|
||||||
|
ldy #0
|
||||||
|
lda {2},y
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "x", mem
|
||||||
|
ldx {2}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "x", const
|
||||||
|
ldx #{2}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "y", mem
|
||||||
|
ldy {2}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "y", const
|
||||||
|
ldy #{2}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld mem, "a"
|
||||||
|
sta {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld mem, "x"
|
||||||
|
stx {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld mem, "y"
|
||||||
|
sty {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "a", "x"
|
||||||
|
txa
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "a", "y"
|
||||||
|
tya
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "x", "a"
|
||||||
|
tax
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld "y", "a"
|
||||||
|
tay
|
||||||
|
end macro
|
||||||
|
|
||||||
|
MACRO ld "ya", const
|
||||||
|
lda #(({2}) MOD 256)
|
||||||
|
ldy #(({2})/256)
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO ld "ya", mem
|
||||||
|
lda {1}
|
||||||
|
ldy {1}+1
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
macro ld mem, mem
|
||||||
|
lda {2}
|
||||||
|
sta {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld mem, const
|
||||||
|
lda #{2}
|
||||||
|
sta {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld indirect, "a"
|
||||||
|
ldy #0
|
||||||
|
sta {1},y
|
||||||
|
end macro
|
||||||
|
|
||||||
|
;
|
||||||
|
; Easy add and sub
|
||||||
|
;
|
||||||
|
|
||||||
|
MACRO add mem
|
||||||
|
clc
|
||||||
|
adc {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO add const
|
||||||
|
clc
|
||||||
|
adc #{1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO add mem, const
|
||||||
|
clc
|
||||||
|
lda {1}
|
||||||
|
adc #{2}
|
||||||
|
sta {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO add mem, mem
|
||||||
|
clc
|
||||||
|
lda {1}
|
||||||
|
adc {2}
|
||||||
|
sta {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO sub mem
|
||||||
|
sec
|
||||||
|
sbc {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO sub const
|
||||||
|
sec
|
||||||
|
sbc #{1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO sub mem, const
|
||||||
|
sec
|
||||||
|
lda {1}
|
||||||
|
sbc #{2}
|
||||||
|
sta {1}
|
||||||
|
END MACRO
|
||||||
|
|
||||||
|
MACRO sub mem, mem
|
||||||
|
sec
|
||||||
|
lda {1}
|
||||||
|
sbc {2}
|
||||||
|
sta {1}
|
||||||
|
END MACRO
|
|
@ -0,0 +1,271 @@
|
||||||
|
; ======================================================
|
||||||
|
; Macros for 16 bit operations
|
||||||
|
; The suffix "16" is added to common opcodes, eg "add16"
|
||||||
|
; Only the A register is used (except ld16 (indirect))
|
||||||
|
; ======================================================
|
||||||
|
|
||||||
|
; Summary
|
||||||
|
; add16, adc16
|
||||||
|
; sub16, sbc16
|
||||||
|
; inc16, dec16
|
||||||
|
; ld16
|
||||||
|
; cmp16
|
||||||
|
; shr16, shl16
|
||||||
|
; push16, pop16
|
||||||
|
|
||||||
|
macro add16 mem, const
|
||||||
|
lda {1}
|
||||||
|
clc
|
||||||
|
adc #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
#if {2} < 256
|
||||||
|
if carry then inc {1}+1
|
||||||
|
#else
|
||||||
|
adc #(({2})/256)
|
||||||
|
sta {1}+1
|
||||||
|
#endif
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro add16 mem, mem
|
||||||
|
lda {1}
|
||||||
|
clc
|
||||||
|
adc {2}
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
adc {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro add16 mem, const, "1"
|
||||||
|
lda {1}
|
||||||
|
sec
|
||||||
|
adc #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
adc #({2}/256)
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro add16 mem, mem, "1"
|
||||||
|
lda {1}
|
||||||
|
sec
|
||||||
|
adc {2}
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
adc {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro adc16 mem, const
|
||||||
|
lda {1}
|
||||||
|
adc #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
#if {2} < 256
|
||||||
|
bcc .local_out
|
||||||
|
inc {1}+1
|
||||||
|
#else
|
||||||
|
adc #(({2})/256)
|
||||||
|
sta {1}+1
|
||||||
|
#endif
|
||||||
|
.local_out:
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro adc16 mem, mem
|
||||||
|
lda {1}
|
||||||
|
adc {2}
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
adc {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro sub16 mem, const
|
||||||
|
lda {1}
|
||||||
|
sec
|
||||||
|
sbc #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
sbc #(({2})/256)
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro sub16 mem, mem
|
||||||
|
lda {1}
|
||||||
|
sec
|
||||||
|
sbc {2}
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
sbc {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro sub16 mem, const, "1"
|
||||||
|
lda {1}
|
||||||
|
clc
|
||||||
|
sbc #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
sbc #(({2})/256)
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro sub16 mem, mem, "1"
|
||||||
|
lda {1}
|
||||||
|
clc
|
||||||
|
sbc {2}
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
sbc {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro sbc16 mem, const
|
||||||
|
lda {1}
|
||||||
|
sbc #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
sbc #(({2})/256)
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro sbc16 mem, mem
|
||||||
|
lda {1}
|
||||||
|
sbc {2}
|
||||||
|
sta {1}
|
||||||
|
lda {1}+1
|
||||||
|
sbc {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro inc16 mem
|
||||||
|
inc {1}
|
||||||
|
if zero then inc {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro dec16 mem
|
||||||
|
dec {1}
|
||||||
|
if negative then dec {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 "ay", const
|
||||||
|
lda #(({2}) MOD 256)
|
||||||
|
ldy #(({2})/256)
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 "ay", mem
|
||||||
|
lda {2}
|
||||||
|
ldy {2}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 "ax", const
|
||||||
|
lda #(({2}) MOD 256)
|
||||||
|
ldx #(({2})/256)
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 "ax", mem
|
||||||
|
lda {2}
|
||||||
|
ldx {2}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 mem, "ay"
|
||||||
|
sta {1}
|
||||||
|
sty {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 mem, "ax"
|
||||||
|
sta {1}
|
||||||
|
stx {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 mem, const
|
||||||
|
lda #(({2}) MOD 256)
|
||||||
|
sta {1}
|
||||||
|
#if (({2}) MOD 256) != (({2})/256)
|
||||||
|
lda #(({2})/256)
|
||||||
|
#endif
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 mem, mem
|
||||||
|
lda {2}
|
||||||
|
sta {1}
|
||||||
|
lda {2}+1
|
||||||
|
sta {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 indirect, mem
|
||||||
|
ldy #0
|
||||||
|
lda {2}
|
||||||
|
sta ({1}),y
|
||||||
|
lda {2}+1
|
||||||
|
iny
|
||||||
|
sta ({1}),y
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro ld16 indirect, const
|
||||||
|
ldy #0
|
||||||
|
lda #({2} MOD 256)
|
||||||
|
sta ({1}),y
|
||||||
|
lda #({2}/256)
|
||||||
|
iny
|
||||||
|
sta ({1}),y
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro cmp16 mem, const
|
||||||
|
lda {1}+1
|
||||||
|
cmp #(({2})/256)
|
||||||
|
if zero then
|
||||||
|
lda {1}
|
||||||
|
cmp #(({2}) MOD 256)
|
||||||
|
end if
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro cmp16 mem, mem
|
||||||
|
lda {1}+1
|
||||||
|
cmp {2}+1
|
||||||
|
if zero then
|
||||||
|
lda {1}
|
||||||
|
cmp {2}
|
||||||
|
end if
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro shl16 mem
|
||||||
|
asl {1}
|
||||||
|
rol {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro shr16 mem
|
||||||
|
lsr {1}
|
||||||
|
ror {1}+1
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro push16 mem
|
||||||
|
lda {1}
|
||||||
|
pha
|
||||||
|
lda {1}+1
|
||||||
|
pha
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro push16 const
|
||||||
|
lda #(({1}) MOD 256)
|
||||||
|
pha
|
||||||
|
lda #(({1})/256)
|
||||||
|
pha
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro pop16 mem
|
||||||
|
pla
|
||||||
|
sta {1}+1
|
||||||
|
pla
|
||||||
|
sta {1}
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro mul16 mem, const
|
||||||
|
ECHO "to be implemented"
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro mul16 mem, mem
|
||||||
|
ECHO "to be implemented"
|
||||||
|
end macro
|
|
@ -0,0 +1,105 @@
|
||||||
|
//
|
||||||
|
// this is an example of reading a file with the high-level kernal routines
|
||||||
|
//
|
||||||
|
|
||||||
|
/*
|
||||||
|
basic start
|
||||||
|
5 POKE 36879,8:PRINT "{clr}{wht}";
|
||||||
|
6 REM the ReadFile() function does something like this:
|
||||||
|
10 LA=7680
|
||||||
|
20 OPEN 1,8,2,"iec"
|
||||||
|
30 IF ST<>0 THEN GOTO 60
|
||||||
|
40 GET#1,A$:IF A$="" THEN A$=CHR$(0)
|
||||||
|
50 POKE LA,ASC(A$):LA=LA+1:GOTO 30
|
||||||
|
60 CLOSE 1
|
||||||
|
basic end
|
||||||
|
*/
|
||||||
|
|
||||||
|
basic start
|
||||||
|
5 POKE 36879,8:PRINT "{clr}{wht}";
|
||||||
|
10 print "{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}disk drive test"
|
||||||
|
20 sys {main}
|
||||||
|
basic end
|
||||||
|
|
||||||
|
main:
|
||||||
|
call ReadFile
|
||||||
|
rts
|
||||||
|
|
||||||
|
const SETNAM = $FFBD ; Kernal Set Filename
|
||||||
|
const SETLFS = $FFBA ; Kernal Set Logical First and Secondary
|
||||||
|
const ICHKIN = $FFC6 ; Kernal Set Input
|
||||||
|
const READST = $FFB7 ; Kernal read status byte
|
||||||
|
const ICHRIN = $FFCF ; Kernal read a byte from file
|
||||||
|
const ICLOSE = $FFC3 ; Kernal close
|
||||||
|
const ICLRCH = $FFCC ; Kernal clear channel
|
||||||
|
|
||||||
|
#ifdef C64
|
||||||
|
const load_address = 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VIC20
|
||||||
|
const load_address = 7680
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sub ReadFile()
|
||||||
|
ld16 $ae, #load_address ; destination buffer
|
||||||
|
|
||||||
|
LDA #fname_end-fname
|
||||||
|
LDX #<fname
|
||||||
|
LDY #>fname
|
||||||
|
JSR SETNAM
|
||||||
|
|
||||||
|
LDA #$02 ; file number 2
|
||||||
|
LDX #$08 ; default to device 8
|
||||||
|
LDY #$02 ; secondary address 2
|
||||||
|
JSR $FFBA ; call SETLFS
|
||||||
|
JSR $FFC0 ; call OPEN
|
||||||
|
|
||||||
|
; check if the file could not be opened
|
||||||
|
if carry then
|
||||||
|
jsr open_error ; handle open error
|
||||||
|
jmp close ; even if OPEN failed, the file has to be closed
|
||||||
|
end if
|
||||||
|
|
||||||
|
LDX #$02 ; filenumber 2
|
||||||
|
JSR ICHKIN ; file 2 now used as input
|
||||||
|
|
||||||
|
LDY #$00 ; keep y indexing at 0
|
||||||
|
do
|
||||||
|
JSR READST ; read status byte
|
||||||
|
if not zero then exit do ; either EOF or read error
|
||||||
|
JSR ICHRIN ; get a byte from file
|
||||||
|
STA ($AE),Y ; write byte to memory
|
||||||
|
inc16 $ae ; increment pointer
|
||||||
|
loop while not zero
|
||||||
|
|
||||||
|
AND #$40 ; end of file?
|
||||||
|
if zero then jsr read_error
|
||||||
|
|
||||||
|
close:
|
||||||
|
LDA #$02 ; filenumber 2
|
||||||
|
JSR ICLOSE
|
||||||
|
JSR ICLRCH
|
||||||
|
RTS
|
||||||
|
|
||||||
|
open_error:
|
||||||
|
; Akkumulator contains BASIC error code
|
||||||
|
; most likely errors:
|
||||||
|
; A = $05 (DEVICE NOT PRESENT)
|
||||||
|
;... error handling for open errors ...
|
||||||
|
lda #00
|
||||||
|
sta load_address
|
||||||
|
rts
|
||||||
|
|
||||||
|
read_error:
|
||||||
|
; for further information, the drive error channel has to be read
|
||||||
|
;... error handling for read errors ...
|
||||||
|
lda #01
|
||||||
|
sta load_address
|
||||||
|
rts
|
||||||
|
end sub
|
||||||
|
|
||||||
|
fname:
|
||||||
|
byte "iec"
|
||||||
|
fname_end:
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
basic start
|
||||||
|
100 print "{wht}saving file"
|
||||||
|
110 sys {save_file}
|
||||||
|
120 GOSUB 2000:rem stampa ST
|
||||||
|
130 gosub 1000:rem read file with basic
|
||||||
|
140 gosub 200:rem read file with lm
|
||||||
|
150 end
|
||||||
|
|
||||||
|
200 rem =============================
|
||||||
|
205 print "loading file at $2000"
|
||||||
|
210 sys {load_file}
|
||||||
|
220 print "load ok"
|
||||||
|
230 l={file_content_end}-{file_content_start}
|
||||||
|
240 for t=0 to l-1
|
||||||
|
250 poke 1024+t,peek(8192+t)
|
||||||
|
260 next
|
||||||
|
270 return
|
||||||
|
|
||||||
|
1000 rem ========================
|
||||||
|
1005 REM reads the file "prova"
|
||||||
|
1006 print "reading back file"
|
||||||
|
1007 C=0
|
||||||
|
1010 OPEN 1,8,2,"prova"
|
||||||
|
1020 IF ST<>0 THEN GOTO 1050
|
||||||
|
1030 GET#1,A$:IF A$="" THEN A$=CHR$(0)
|
||||||
|
1040 PRINT A$;:C=C+1:GOTO 1020
|
||||||
|
1050 PRINT:GOSUB 2000
|
||||||
|
1055 PRINT "bytes=";C
|
||||||
|
1060 CLOSE 1
|
||||||
|
1070 RETURN
|
||||||
|
|
||||||
|
2000 PRINT "st=";ST;
|
||||||
|
2001 IF (ST AND 2)<>0 THEN PRINT "timeout ";
|
||||||
|
2010 IF (ST AND 16)<>0 THEN PRINT "verify error";
|
||||||
|
2020 IF (ST AND 64)<>0 THEN PRINT "eof ";
|
||||||
|
2030 IF (ST AND 128)<>0 THEN PRINT "device not present ";
|
||||||
|
2035 PRINT
|
||||||
|
2040 RETURN
|
||||||
|
basic end
|
Loading…
Reference in New Issue