Make it build with Merlin32

This commit is contained in:
Bill Chatfield 2018-08-04 03:02:16 -04:00
parent faa318ab4f
commit 9094ecf0ef
4 changed files with 264 additions and 228 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.dsk
*.swp

BIN
AppleCommander-ac-1.4.0.jar Normal file

Binary file not shown.

34
Makefile Normal file
View File

@ -0,0 +1,34 @@
# Compiles with https://www.brutaldeluxe.fr/products/crossdevtools/merlin/
#
ifeq ($(OS),Windows_NT)
MERLIN_DIR=C:/opt/Merlin32_v1.0
MERLIN_LIB=$(MERLIN_DIR)/Library
MERLIN=$(MERLIN_DIR)/Windows/Merlin32
RM=del /s
else
MERLIN_DIR=$(HOME)/opt/Merlin32_v1.0
MERLIN_LIB=$(MERLIN_DIR)/Library
MERLIN=$(MERLIN_DIR)/Linux64/Merlin32
RM=rm -f
endif
AC=java -jar AppleCommander-ac-1.4.0.jar
SRC=delhndlr.s
PGM=DELHNDLR
VOL=$(PGM)
DSK=$(PGM).dsk
$(DSK): $(PGM)
$(AC) -pro140 $(DSK) $(VOL)
$(AC) -p $(DSK) $(PGM) SYS < $(PGM)
$(PGM): $(SRC)
$(MERLIN) $(MERLIN_LIB) $(SRC)
@# Merlin fails to provide a non-0 exit code on failure so
@# it needs to be simulated by checking for the error_output.txt
@# file.
@test -e $(PGM)
clean:
$(RM) $(DSK) $(PGM) error_output.txt _FileInformation.txt

View File

@ -1,228 +1,228 @@
******************************** ********************************
* * * *
* DELETE KEY HANDLER * * DELETE KEY HANDLER *
* * * *
* AUTHOR: BILL CHATFIELD * * AUTHOR: BILL CHATFIELD *
* LICENSE: GPL * * LICENSE: GPL *
* * * *
******************************** ********************************
ORG $801 ORG $801
DSK /HD1/SRC/DELHNDLR DSK DELHNDLR
CH EQU $24 ;HORIZ CHAR POS (40-COL) CH EQU $24 ;HORIZ CHAR POS (40-COL)
BASL EQU $28 ;BASE ADDR FOR CURR VIDEO LINE BASL EQU $28 ;BASE ADDR FOR CURR VIDEO LINE
KSWL EQU $38 ;KEYBOARD SWITCH LOW BYTE KSWL EQU $38 ;KEYBOARD SWITCH LOW BYTE
KSWH EQU $39 ;KEYBOARD SWITCH HIGH BYTE KSWH EQU $39 ;KEYBOARD SWITCH HIGH BYTE
OURCH EQU $57B ;HORIZONTAL POSITION (80-COL) OURCH EQU $57B ;HORIZONTAL POSITION (80-COL)
OURCV EQU $5FB ;VERTICAL POSITION (80-COL) OURCV EQU $5FB ;VERTICAL POSITION (80-COL)
KBD EQU $C000 ;KEYBOARD DATA + STROBE KBD EQU $C000 ;KEYBOARD DATA + STROBE
KBDSTRB EQU $C010 ;CLEAR KEYBOARD STROBE KBDSTRB EQU $C010 ;CLEAR KEYBOARD STROBE
CXROMON EQU $C007 ;TURN ON INTERNAL ROM CXROMON EQU $C007 ;TURN ON INTERNAL ROM
CXROMOFF EQU $C006 ;ENABLE SLOT ROMS CXROMOFF EQU $C006 ;ENABLE SLOT ROMS
ALTCHAR EQU $C01E ;>=$80 IF IN 80-COL ALTCHAR EQU $C01E ;>=$80 IF IN 80-COL
COUT EQU $FDED ;WRITE A CHARACTER COUT EQU $FDED ;WRITE A CHARACTER
* 80-COL SUBS INSIDE THE INTERNAL ROM * 80-COL SUBS INSIDE THE INTERNAL ROM
INVERT EQU $CEDD ;INVERT CHAR ON SCREEN INVERT EQU $CEDD ;INVERT CHAR ON SCREEN
PICK EQU $CF01 ;PICK CHAR OFF SCREEN PICK EQU $CF01 ;PICK CHAR OFF SCREEN
* INPUT SUBS * INPUT SUBS
RDKEY EQU $FD0C RDKEY EQU $FD0C
RDCHAR EQU $FD35 RDCHAR EQU $FD35
KEYIN EQU $FD1B KEYIN EQU $FD1B
BASICIN EQU $C305 BASICIN EQU $C305
GETLN EQU $FD6A GETLN EQU $FD6A
NOESC EQU $C9B7 ;HANDLES KEY OTHER THAN ESC NOESC EQU $C9B7 ;HANDLES KEY OTHER THAN ESC
BINPUT EQU $C8F6 BINPUT EQU $C8F6
ESCAPING EQU $C918 ESCAPING EQU $C918
IN EQU $200 ;256-CHAR INPUT BUFFER IN EQU $200 ;256-CHAR INPUT BUFFER
ESC EQU $9B ;ESC WITH HIGH BIT SET ESC EQU $9B ;ESC WITH HIGH BIT SET
RTARROW EQU $95 ;RIGHT ARROW WITH HIGH BIT SET RTARROW EQU $95 ;RIGHT ARROW WITH HIGH BIT SET
DELETE EQU $FF ;DELETE WITH HIGH BIT SET DELETE EQU $FF ;DELETE WITH HIGH BIT SET
BKSPACE EQU $88 ;BACKSPACE WITH HIGH BIT SET BKSPACE EQU $88 ;BACKSPACE WITH HIGH BIT SET
HEXDEC EQU $ED24 ;HEX-TO-DECIMAL CONVERSION HEXDEC EQU $ED24 ;HEX-TO-DECIMAL CONVERSION
CROUT EQU $FD8E ;PRINT A CARRIAGE RETURN CROUT EQU $FD8E ;PRINT A CARRIAGE RETURN
STROUT EQU $DB3A ;PRINT NULL-TERM STRING IN AY STROUT EQU $DB3A ;PRINT NULL-TERM STRING IN AY
* MONITOR SUBS * MONITOR SUBS
PRINTXY EQU $F940 ;PRINT X & Y AS HEX PRINTXY EQU $F940 ;PRINT X & Y AS HEX
PRBYTE EQU $FDDA ;PRINT BYTE AS 2 HEX DIGITS PRBYTE EQU $FDDA ;PRINT BYTE AS 2 HEX DIGITS
STOR80ON EQU $C001 ;ENABLE AUXILIARY MEM SWITCHING STOR80ON EQU $C001 ;ENABLE AUXILIARY MEM SWITCHING
PAGE2OFF EQU $C054 ;TURN ON MAIN MEMORY PAGE2OFF EQU $C054 ;TURN ON MAIN MEMORY
PAGE2ON EQU $C055 ;TURN ON AUXILIARY MEMORY PAGE2ON EQU $C055 ;TURN ON AUXILIARY MEMORY
DEBUG EQU 1 DEBUG EQU 1
DEBUG2 EQU 0 DEBUG2 EQU 0
******************************** ********************************
* * * *
* PUTS MACRO * * PUTS MACRO *
* * * *
* APPLESOFT MUST BE IN MEMORY * * APPLESOFT MUST BE IN MEMORY *
* BECAUSE THE STROUT SUB IS * * BECAUSE THE STROUT SUB IS *
* USED. * * USED. *
* * * *
* X & Y ARE PRESERVED * * X & Y ARE PRESERVED *
* * * *
* ]1 - ADDRESS OF STRING * * ]1 - ADDRESS OF STRING *
* * * *
******************************** ********************************
PUTS MAC PUTS MAC
TYA ;PRESERVE Y TYA ;PRESERVE Y
PHA PHA
LDA #<]1 ;PUT LOW BYTE INTO A LDA #<]1 ;PUT LOW BYTE INTO A
LDY #>]1 ;PUT HIGH BYTE INTO Y LDY #>]1 ;PUT HIGH BYTE INTO Y
JSR STROUT ;CALL APPLESOFT'S STRING PRINT JSR STROUT ;CALL APPLESOFT'S STRING PRINT
PLA ;RESTORE Y PLA ;RESTORE Y
TAY TAY
EOM <<<
******************************** ********************************
* * * *
* PUT80 MACRO * * PUT80 MACRO *
* * * *
* IN 80-COL MODE EVEN COLUMNS * * IN 80-COL MODE EVEN COLUMNS *
* ARE IN AUXILIARY MEMORY * * ARE IN AUXILIARY MEMORY *
* WHILE ODD COLUMNS ARE IN * * WHILE ODD COLUMNS ARE IN *
* MAIN MEMORY. * * MAIN MEMORY. *
* * * *
* ]1 - CHARACTER TO DISPLAY * * ]1 - CHARACTER TO DISPLAY *
* ]2 - DESIRED COLUMN * * ]2 - DESIRED COLUMN *
* * * *
******************************** ********************************
PUT80 MAC PUT80 MAC
TYA ;MOVE Y TO A TYA ;MOVE Y TO A
PHA ;SAVE Y VALUE ON STACK PHA ;SAVE Y VALUE ON STACK
SEI ;DISABLE INTERRUPTS SEI ;DISABLE INTERRUPTS
STA STOR80ON ;ENABLE MAIN/AUX MEM SWITCHING STA STOR80ON ;ENABLE MAIN/AUX MEM SWITCHING
LDA ]2 ;LOAD 80-COL HORIZ CURSOR POSITN LDA ]2 ;LOAD 80-COL HORIZ CURSOR POSITN
LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN
BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM
MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON
JMP CONTINUE ;AVOID AUX MEM ENABLE JMP CONTINUE ;AVOID AUX MEM ENABLE
AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF
CONTINUE TAY ;MOVE CURSOR POSITION TO Y CONTINUE TAY ;MOVE CURSOR POSITION TO Y
LDA ]1 ;LOAD THE CHARACTER TO DISPLAY LDA ]1 ;LOAD THE CHARACTER TO DISPLAY
STA (BASL),Y ;DISPLAY THE CHARACTER STA (BASL),Y ;DISPLAY THE CHARACTER
STA PAGE2OFF ;TURN MAIN MEM BACK ON STA PAGE2OFF ;TURN MAIN MEM BACK ON
CLI ;ENABLE INTERRUPTS CLI ;ENABLE INTERRUPTS
PLA ;PULL Y VALUE FROM STACK PLA ;PULL Y VALUE FROM STACK
TAY ;RESTORE Y VALUE TAY ;RESTORE Y VALUE
EOM <<<
******************************** ********************************
* * * *
* INSTALL VECTOR TO HANDLER * * INSTALL VECTOR TO HANDLER *
* * * *
******************************** ********************************
MAIN MAIN
LDA #<DELHNDLR LDA #<DELHNDLR
STA KSWL STA KSWL
LDA #>DELHNDLR LDA #>DELHNDLR
STA KSWH STA KSWH
PUTS LOADMSG PUTS LOADMSG
RTS RTS
******************************** ********************************
* * * *
* KEYBOARD INPUT ROUTINE * * KEYBOARD INPUT ROUTINE *
* * * *
* PRECONDITIONS: * * PRECONDITIONS: *
* 1. CURSOR AT CH & BASL * * 1. CURSOR AT CH & BASL *
* 2. ACCUM = ORIG SCREEN BYTE * * 2. ACCUM = ORIG SCREEN BYTE *
* 3. Y = VALUE IN CH * * 3. Y = VALUE IN CH *
* * * *
* POSTCONDITIONS: * * POSTCONDITIONS: *
* 1. MUST RETURN CHAR IN ACCUM * * 1. MUST RETURN CHAR IN ACCUM *
* 2. X & Y MUST NOT BE CHANGED * * 2. X & Y MUST NOT BE CHANGED *
* * * *
******************************** ********************************
DELHNDLR DELHNDLR
STA ORIGCURS ;STORE THE ORIGINAL CURSOR CHAR STA ORIGCURS ;STORE THE ORIGINAL CURSOR CHAR
TXA ;SAVE X TXA ;SAVE X
PHA PHA
TYA ;SAVE Y TYA ;SAVE Y
PHA PHA
BIT ALTCHAR ;TEST FOR 80-COL ON BIT ALTCHAR ;TEST FOR 80-COL ON
BMI COL80 BMI COL80
COL40 COL40
JSR GETKEY ;LOAD "KEY" VARIABLE JSR GETKEY ;LOAD "KEY" VARIABLE
JSR DEL2BS ;CONVERT DELETE TO BACKSPACE JSR DEL2BS ;CONVERT DELETE TO BACKSPACE
LDA ORIGCURS LDA ORIGCURS
STA (BASL),Y ;REMOVE CURSOR STA (BASL),Y ;REMOVE CURSOR
JMP FINISH JMP FINISH
COL80 COL80
PUT80 #' ';OURCH ;DISPLAY OUR CURSOR, INVERSE SPC PUT80 #' ';OURCH ;DISPLAY OUR CURSOR, INVERSE SPC
NEXTKEY NEXTKEY
JSR GETKEY ;LOAD "KEY" VARIABLE JSR GETKEY ;LOAD "KEY" VARIABLE
JSR DEL2BS ;CONVERT DELETE TO BACKSPACE JSR DEL2BS ;CONVERT DELETE TO BACKSPACE
CMP #ESC ;IS IT ESC? CMP #ESC ;IS IT ESC?
BEQ NEXTKEY ;IGNORE ESC BEQ NEXTKEY ;IGNORE ESC
CMP #RTARROW ;IS IT A RIGHT ARROW CMP #RTARROW ;IS IT A RIGHT ARROW
BNE CLRCURS ;NOT RIGHT ARROW THEN DONE BNE CLRCURS ;NOT RIGHT ARROW THEN DONE
LDY OURCH ;GET HORIZONTAL CURSOR POSITION LDY OURCH ;GET HORIZONTAL CURSOR POSITION
JSR PICK ;GRAB CHAR FROM SCREEN JSR PICK ;GRAB CHAR FROM SCREEN
ORA #$80 ;SET HIGH BIT ORA #$80 ;SET HIGH BIT
STA KEY STA KEY
CLRCURS CLRCURS
PUT80 #" ";OURCH ;ERASE CURSOR PUT80 #" ";OURCH ;ERASE CURSOR
FINISH FINISH
PLA ;RESTORE Y PLA ;RESTORE Y
TAY TAY
PLA ;RESTORE X PLA ;RESTORE X
TAX TAX
LDA KEY ;LOAD RETURN VALUE LDA KEY ;LOAD RETURN VALUE
RTS RTS
******************************** ********************************
* * * *
* GETKEY SUBROUTINE * * GETKEY SUBROUTINE *
* * * *
******************************** ********************************
GETKEY GETKEY
BIT KBD ;TEST FOR KEY PRESSED BIT KBD ;TEST FOR KEY PRESSED
BPL GETKEY ;WAIT FOR KEY PRESSED BPL GETKEY ;WAIT FOR KEY PRESSED
LDA KBD ;GET THE KEY THAT WAS PRESSED LDA KBD ;GET THE KEY THAT WAS PRESSED
BIT KBDSTRB ;CLEAR KEYBOARD STROBE BIT KBDSTRB ;CLEAR KEYBOARD STROBE
STA KEY ;STORE THE KEY THAT WAS READ STA KEY ;STORE THE KEY THAT WAS READ
RTS RTS
******************************** ********************************
* * * *
* DEL2BS SUBROUTINE * * DEL2BS SUBROUTINE *
* * * *
******************************** ********************************
DEL2BS DEL2BS
CMP #DELETE ;IS THE KEY IN A THE DELETE KEY CMP #DELETE ;IS THE KEY IN A THE DELETE KEY
BNE D2BDONE BNE D2BDONE
LDA #BKSPACE LDA #BKSPACE
STA KEY STA KEY
D2BDONE D2BDONE
RTS RTS
******************************** ********************************
* * * *
* DATA * * DATA *
* * * *
******************************** ********************************
LOADMSG ASC "LOADED DELETE HANDLER",0D,00 LOADMSG ASC "LOADED DELETE HANDLER",0D,00
KEY DB 0 KEY DB 0
ORIGCURS DB 0 ORIGCURS DB 0