mirror of
https://github.com/gungwald/prodos-more.git
synced 2024-11-25 11:35:18 +00:00
First check-in
This commit is contained in:
parent
7f4357d106
commit
c044ae5548
BIN
AppleCommander-1.3.5-ac.jar
Normal file
BIN
AppleCommander-1.3.5-ac.jar
Normal file
Binary file not shown.
50
Makefile
Normal file
50
Makefile
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Require-mints:
|
||||||
|
#
|
||||||
|
# GNU make
|
||||||
|
# - To execute this make file
|
||||||
|
#
|
||||||
|
# merlin32
|
||||||
|
# - to assemble the source code
|
||||||
|
# https://www.brutaldeluxe.fr/products/crossdevtools/merlin/
|
||||||
|
#
|
||||||
|
# AppleCommander (included)
|
||||||
|
# - To create the Apple II disk image
|
||||||
|
#
|
||||||
|
# AppleWin
|
||||||
|
# - To load the disk and test the program
|
||||||
|
#
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
COPY=copy
|
||||||
|
APPLEWIN="c:\opt\AppleWin1.26.2.3\applewin.exe"
|
||||||
|
else
|
||||||
|
COPY=cp
|
||||||
|
APPLEWIN=applewin
|
||||||
|
endif
|
||||||
|
|
||||||
|
# It is necessary to use this older version of AppleCommander to support
|
||||||
|
# the PowerBook G4 and iBook G3. This version only requires Java 1.3.
|
||||||
|
AC=java -jar AppleCommander-1.3.5-ac.jar
|
||||||
|
SRC=more.s
|
||||||
|
PGM=more
|
||||||
|
BASE_DSK=prodos-2.0.3-boot.dsk
|
||||||
|
VOL=$(PGM)
|
||||||
|
DSK=$(PGM).dsk
|
||||||
|
|
||||||
|
# There is some kind of problem with turning this into a boot disk
|
||||||
|
# after it is created by AppleCommander. So, copy an existing boot
|
||||||
|
# disk instead.
|
||||||
|
#$(AC) -pro140 $(DSK) $(VOL)
|
||||||
|
|
||||||
|
$(DSK): $(PGM)
|
||||||
|
$(COPY) $(BASE_DSK) $(DSK)
|
||||||
|
$(AC) -p $(DSK) $(PGM) BIN 0x0800 < $(PGM)
|
||||||
|
|
||||||
|
$(PGM): $(SRC) Makefile
|
||||||
|
merlin32 --verbose $(SRC)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(DSK) $(PGM) *.zip _FileInformation.txt $(PGM)_Output.txt
|
||||||
|
|
||||||
|
test: $(DSK)
|
||||||
|
$(APPLEWIN) -d1 $(DSK)
|
||||||
|
|
301
more.s
Normal file
301
more.s
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
*
|
||||||
|
* more - Text viewer
|
||||||
|
*
|
||||||
|
|
||||||
|
* BEQ - Branch if Equal
|
||||||
|
* Branches if the zero flag (Z) is set to 1. This happens if:
|
||||||
|
* - A 0 value is loaded into the accumulator via LDA
|
||||||
|
* - A CMP is done on two equal values
|
||||||
|
* - A SBC is done on two equal values?
|
||||||
|
* BCC - Branch if Carry Flag is Clear
|
||||||
|
* Equivalent to Branch if Less Than (BLT), meaning that the
|
||||||
|
* accumulator (A) is less than the parameter: A < Param
|
||||||
|
* BGE - Branch if Accum >= Param is BCS
|
||||||
|
|
||||||
|
|
||||||
|
* System subroutines stored in ROM
|
||||||
|
CROUT equ $fd8e ; Outputs a carriage return
|
||||||
|
PRBYTE equ $fdda ; Outputs a byte
|
||||||
|
COUT equ $fded ; Outputs a character
|
||||||
|
|
||||||
|
* MLI stands for Machine Language Interface
|
||||||
|
* It is the ProDOS system call entry point
|
||||||
|
MLI equ $bf00
|
||||||
|
|
||||||
|
* ProDOS system call command codes
|
||||||
|
OPEN equ $c8
|
||||||
|
CLOSE equ $cc
|
||||||
|
|
||||||
|
* Constants
|
||||||
|
ADDR equ $06
|
||||||
|
MAX_EC equ $5a ; The largest error code
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_CHAR mac
|
||||||
|
if #=]1
|
||||||
|
lda ]1
|
||||||
|
else
|
||||||
|
lda #]1
|
||||||
|
fin
|
||||||
|
jsr COUT
|
||||||
|
eom
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_BYTE mac
|
||||||
|
lda ]1
|
||||||
|
jsr PRBYTE
|
||||||
|
eom
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_ASC mac
|
||||||
|
tya ; Preserve Y by transferring it to A
|
||||||
|
pha ; and pushing it onto the stack
|
||||||
|
ldy #0 ; Prepare loop index
|
||||||
|
nextch lda ]1,Y ; Load a character into A
|
||||||
|
beq finish ; Branch if lda loaded a zero value
|
||||||
|
jsr COUT ; Write the character in A
|
||||||
|
iny ; Increment Y
|
||||||
|
jmp nextch ; Go back and load the next character
|
||||||
|
finish pla ; Restore Y by pulling stack into A
|
||||||
|
tay ; and transferring it to Y
|
||||||
|
eom
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_STR mac
|
||||||
|
tya ; Preserve Y
|
||||||
|
pha
|
||||||
|
lda ]1 ; Length byte
|
||||||
|
sta len
|
||||||
|
ldy #1 ; Prepare loop index
|
||||||
|
nextch cpy len ; Check if beyond end of string
|
||||||
|
bcc writech ; Y is Less than
|
||||||
|
beq writech ; Or equal to len
|
||||||
|
jmp finish
|
||||||
|
writech lda ]1,y ; Load a character
|
||||||
|
jsr COUT
|
||||||
|
iny
|
||||||
|
jmp nextch
|
||||||
|
len db 0
|
||||||
|
finish pla ; Restore Y
|
||||||
|
tay
|
||||||
|
eom
|
||||||
|
|
||||||
|
|
||||||
|
COPY_BYTE mac
|
||||||
|
lda ]1
|
||||||
|
sta ]2
|
||||||
|
eom
|
||||||
|
|
||||||
|
|
||||||
|
mainProgram
|
||||||
|
org $800
|
||||||
|
|
||||||
|
lda #<fileName
|
||||||
|
sta oPathPtr
|
||||||
|
lda #>fileName
|
||||||
|
sta oPathPtr+1
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
db OPEN
|
||||||
|
da openParams
|
||||||
|
bne openErrorHandler
|
||||||
|
pmc COPY_BYTE,fileNum;closeNum
|
||||||
|
jsr MLI
|
||||||
|
db CLOSE
|
||||||
|
dw closeParams
|
||||||
|
bne closeErrorHandler
|
||||||
|
jmp endMain
|
||||||
|
openErrorHandler
|
||||||
|
sta errorCode
|
||||||
|
pmc WRITE_ASC,openFailureText
|
||||||
|
jmp errorHandler
|
||||||
|
closeErrorHandler
|
||||||
|
sta errorCode
|
||||||
|
pmc WRITE_ASC,closeFailureText
|
||||||
|
errorHandler
|
||||||
|
pmc WRITE_STR,fileName
|
||||||
|
pmc WRITE_CHAR,":"
|
||||||
|
pmc WRITE_CHAR," "
|
||||||
|
lda errorCode
|
||||||
|
cmp #MAX_EC ; Compare by A - MAX_EC
|
||||||
|
bcs unknownError ; Branch if A >= MAX_EC
|
||||||
|
lda errorCode ; Necessary?
|
||||||
|
clc ; Prepare for addition
|
||||||
|
adc errorCode ; Double for indexing addresses
|
||||||
|
tax
|
||||||
|
lda errorMessages,x
|
||||||
|
sta ADDR
|
||||||
|
inx
|
||||||
|
lda errorMessages,x
|
||||||
|
sta ADDR+1
|
||||||
|
bne writeError
|
||||||
|
lda ADDR
|
||||||
|
bne writeError
|
||||||
|
unknownError
|
||||||
|
pmc WRITE_ASC,unknownErrorCodeText
|
||||||
|
pmc WRITE_CHAR,"$"
|
||||||
|
pmc WRITE_BYTE,errorCode
|
||||||
|
jsr CROUT
|
||||||
|
jmp endMain
|
||||||
|
writeError
|
||||||
|
pmc WRITE_ASC,(ADDR)
|
||||||
|
pmc WRITE_CHAR," "
|
||||||
|
pmc WRITE_ASC,errorCodeText
|
||||||
|
pmc WRITE_CHAR,"$"
|
||||||
|
pmc WRITE_BYTE,errorCode
|
||||||
|
pmc WRITE_CHAR,")"
|
||||||
|
jsr CROUT
|
||||||
|
endMain
|
||||||
|
rts
|
||||||
|
|
||||||
|
* DAT-uh
|
||||||
|
|
||||||
|
openParams db 3 ; Parameter count
|
||||||
|
oPathPtr ds 2 ; Input param - file to open
|
||||||
|
oBufPtr da inBuf ; Input param - I/O buffer
|
||||||
|
fileNum ds 1 ; Output param - file ref num
|
||||||
|
|
||||||
|
closeParams db 1 ; Parameter count
|
||||||
|
closeNum db 0 ; Input param - ref num to close
|
||||||
|
|
||||||
|
fileName db 4
|
||||||
|
asc "BLAH"
|
||||||
|
|
||||||
|
errorCode db 0
|
||||||
|
openFailureText asc "FAILED TO OPEN FILE ",00
|
||||||
|
closeFailureText asc "FAILED TO CLOSE FILE ",00
|
||||||
|
errorCodeText asc "(ERROR CODE ",00
|
||||||
|
|
||||||
|
unknownErrorCodeText asc "UNKNOWN ERROR CODE: ",00
|
||||||
|
em00 asc "NO ERROR",00
|
||||||
|
em01 asc "BAD SYSTEM CALL NUMBER",00
|
||||||
|
em03 asc "NO DEVICE CONNECTED",00 ; Bug in AppleWin < 1.26.3.0
|
||||||
|
em04 asc "BAD SYSTEM CALL PARAMETER COUNT",00
|
||||||
|
em25 asc "INTERRUPT VECTOR TABLE FULL",00
|
||||||
|
em27 asc "I/O ERROR",00
|
||||||
|
em28 asc "DEVICE NOT CONNECTED",00
|
||||||
|
em2b asc "DISK WRITE PROTECTED",00
|
||||||
|
em2e asc "DISK SWITCHED WHILE FILE STILL OPEN",00
|
||||||
|
em40 asc "PATH CONTAINS ILLEGAL CHARACTERS",00
|
||||||
|
em42 asc "CANNOT EXCEED 8 OPEN FILES",00
|
||||||
|
em44 asc "PATH NOT FOUND",00
|
||||||
|
em45 asc "VOLUME DIRECTORY NOT FOUND",00
|
||||||
|
em46 asc "FILE NOT FOUND",00
|
||||||
|
em47 asc "DUPLICATE FILENAME",00
|
||||||
|
em48 asc "DISK IS FULL",00
|
||||||
|
em49 asc "CANNOT EXCEED 51 DIRECTORY ENTRIES",00
|
||||||
|
em4a asc "INCOMPATIBLE FILE FORMAT",00
|
||||||
|
em4b asc "UNSUPPORTED STORAGE TYPE",00
|
||||||
|
em4c asc "END OF FILE",00
|
||||||
|
em4d asc "FILE POSITION OUT OF RANGE",00
|
||||||
|
em4e asc "FILE ATTRIBUTE FORBIDS OPERATION",00
|
||||||
|
em50 asc "FILE IS OPEN",00
|
||||||
|
em51 asc "DIRECTORY COUNT ERROR",00
|
||||||
|
em52 asc "NOT A PRODOS DISK",00
|
||||||
|
em55 asc "VOLUME CONTROL BLOCK FULL",00
|
||||||
|
em56 asc "BAD BUFFER ADDRESS",00
|
||||||
|
em57 asc "DUPLICATE VOLUME",00
|
||||||
|
em5a asc "BIT MAP DISK ADDRESS IS IMPOSSIBLE",00
|
||||||
|
*
|
||||||
|
* ERROR CODE TO MESSAGE TRANSLATION TABLE
|
||||||
|
*
|
||||||
|
errorMessages
|
||||||
|
ec00 da em00
|
||||||
|
ec01 da em01
|
||||||
|
ec02 da $0000
|
||||||
|
ec03 da em03 ; Bug in AppleWin < 1.26.3.0
|
||||||
|
ec04 da em04
|
||||||
|
ec05 da $0000
|
||||||
|
ec06 da $0000
|
||||||
|
ec07 da $0000
|
||||||
|
ec08 da $0000
|
||||||
|
ec09 da $0000
|
||||||
|
ec0a da $0000
|
||||||
|
ec0b da $0000
|
||||||
|
ec0c da $0000
|
||||||
|
ec0d da $0000
|
||||||
|
ec0e da $0000
|
||||||
|
ec0f da $0000
|
||||||
|
ec10 da $0000
|
||||||
|
ec11 da $0000
|
||||||
|
ec12 da $0000
|
||||||
|
ec13 da $0000
|
||||||
|
ec14 da $0000
|
||||||
|
ec15 da $0000
|
||||||
|
ec16 da $0000
|
||||||
|
ec17 da $0000
|
||||||
|
ec18 da $0000
|
||||||
|
ec19 da $0000
|
||||||
|
ec1a da $0000
|
||||||
|
ec1b da $0000
|
||||||
|
ec1c da $0000
|
||||||
|
ec1d da $0000
|
||||||
|
ec1e da $0000
|
||||||
|
ec1f da $0000
|
||||||
|
ec20 da $0000
|
||||||
|
ec21 da $0000
|
||||||
|
ec22 da $0000
|
||||||
|
ec23 da $0000
|
||||||
|
ec24 da $0000
|
||||||
|
ec25 da $0000
|
||||||
|
ec26 da $0000
|
||||||
|
ec27 DA em27
|
||||||
|
ec28 DA em28
|
||||||
|
ec29 da $0000
|
||||||
|
ec2a da $0000
|
||||||
|
ec2b da $0000
|
||||||
|
ec2c da $0000
|
||||||
|
ec2d da $0000
|
||||||
|
ec2e DA em2e
|
||||||
|
ec2f da $0000
|
||||||
|
ec30 da $0000
|
||||||
|
ec31 da $0000
|
||||||
|
ec32 da $0000
|
||||||
|
ec33 da $0000
|
||||||
|
ec34 da $0000
|
||||||
|
ec35 da $0000
|
||||||
|
ec36 da $0000
|
||||||
|
ec37 da $0000
|
||||||
|
ec38 da $0000
|
||||||
|
ec39 da $0000
|
||||||
|
ec3a da $0000
|
||||||
|
ec3b da $0000
|
||||||
|
ec3c da $0000
|
||||||
|
ec3d da $0000
|
||||||
|
ec3e da $0000
|
||||||
|
ec3f da $0000
|
||||||
|
ec40 da em40
|
||||||
|
ec42 da em42
|
||||||
|
ec43 da $0000
|
||||||
|
ec44 da em44
|
||||||
|
ec45 da em45
|
||||||
|
ec46 da em46
|
||||||
|
ec47 da em47
|
||||||
|
ec48 da em48
|
||||||
|
ec49 da em49
|
||||||
|
ec4a da em4a
|
||||||
|
ec4b da em4b
|
||||||
|
ec4c da em4c
|
||||||
|
ec4d da em4d
|
||||||
|
ec4e da em4e
|
||||||
|
ec4f da $0000
|
||||||
|
ec50 da em50
|
||||||
|
ec51 da em51
|
||||||
|
ec52 da em52
|
||||||
|
ec53 da $0000
|
||||||
|
ec54 da $0000
|
||||||
|
ec55 da em55
|
||||||
|
ec56 da em56
|
||||||
|
ec57 da em57
|
||||||
|
ec58 da $0000
|
||||||
|
ec59 da $0000
|
||||||
|
ec5a da em5a
|
||||||
|
*
|
||||||
|
* Consume all bytes up to next page boundary
|
||||||
|
*
|
||||||
|
filler ds \,$00
|
||||||
|
*
|
||||||
|
* Must start on page boundary
|
||||||
|
*
|
||||||
|
inBuf ds 1024
|
||||||
|
|
BIN
prodos-2.0.3-boot.dsk
Normal file
BIN
prodos-2.0.3-boot.dsk
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user