From 670f41833eefb09a4390e0659afd36e66321e9bc Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Sat, 29 Dec 2018 15:51:43 -0500 Subject: [PATCH] Beginning of assembly language implementation --- asm/copy.s | 20 ++++++++ asm/macros.s | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++ asm/symbols.s | 64 ++++++++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 asm/copy.s create mode 100644 asm/macros.s create mode 100644 asm/symbols.s diff --git a/asm/copy.s b/asm/copy.s new file mode 100644 index 0000000..6b2dfae --- /dev/null +++ b/asm/copy.s @@ -0,0 +1,20 @@ +* Program: Copy file +* Author: Bill Chatfield + +use symbols +use macros + +* Get source file name + +getSource + puts sourcePrompt + +* Get destination directory + + >>> puts;destPrompt + +* Variables + +sourcePrompt asc "File to copy:",00 +destPrompt asc "Directory to copy it to:",00 + diff --git a/asm/macros.s b/asm/macros.s new file mode 100644 index 0000000..15bff00 --- /dev/null +++ b/asm/macros.s @@ -0,0 +1,124 @@ +******************************** +* * +* PUTS MACRO * +* * +* APPLESOFT MUST BE IN MEMORY * +* BECAUSE THE STROUT SUB IS * +* USED. * +* * +* X & Y ARE PRESERVED * +* * +* ]1 - ADDRESS OF STRING * +* * +******************************** + +PUTS MAC + TYA ;PRESERVE Y + PHA + LDA #<]1 ;PUT LOW BYTE INTO A + LDY #>]1 ;PUT HIGH BYTE INTO Y + JSR STROUT ;CALL APPLESOFT'S STRING PRINT + PLA ;RESTORE Y + TAY + <<< + +******************************** +* * +* PUTS80 MACRO * +* * +* IN 80-COL MODE EVEN COLUMNS * +* ARE IN AUXILIARY MEMORY * +* WHILE ODD COLUMNS ARE IN * +* MAIN MEMORY. * +* * +* ]1 - CHARACTER TO DISPLAY * +* ]2 - DESIRED COLUMN * +* * +******************************** + +PUTS80 MAC + TYA ;MOVE Y TO A + PHA ;SAVE Y VALUE ON STACK + SEI ;DISABLE INTERRUPTS + STA STOR80ON ;ENABLE MAIN/AUX MEM SWITCHING + LDA ]2 ;LOAD 80-COL HORIZ CURSOR POSITN + LSR A ;DIVIDE BY 2 TO CALC PHYS COLUMN + BCC AUXMEM ;IF EVEN, COLUMN IS IN AUX MEM +MAINMEM STA PAGE2OFF ;TURN OFF AUX MEM, MAIN MEM ON + JMP CONTINUE ;AVOID AUX MEM ENABLE +AUXMEM STA PAGE2ON ;TURN ON AUX MEM, MAIN MEM OFF +CONTINUE TAY ;MOVE CURSOR POSITION TO Y + LDA ]1 ;LOAD THE CHARACTER TO DISPLAY + STA (BASL),Y ;DISPLAY THE CHARACTER + STA PAGE2OFF ;TURN MAIN MEM BACK ON + CLI ;ENABLE INTERRUPTS + PLA ;PULL Y VALUE FROM STACK + TAY ;RESTORE Y VALUE + <<< + + + + +******************************** +* * +* GETKEY MACRO * +* * +******************************** + +GETKEY MAC + BIT KBD ;TEST FOR KEY PRESSED + BPL GETKEY ;WAIT FOR KEY PRESSED + LDA KBD ;GET THE KEY THAT WAS PRESSED + BIT KBDSTRB ;CLEAR KEYBOARD STROBE + STA ]1 ;STORE THE KEY THAT WAS READ + <<< + + + +******************************** +* * +* PUTSCUSTOM MACRO * +* * +******************************** + +PUTSCUSTOM MAC + TYA ;PRESERVE Y + PHA + LDY #0 ;PREPARE LOOP INDEX +]NEXTCHR LDA ]1,Y ;LOAD A CHARACTER + CMP #0 ;CHECK FOR END OF STRING + BEQ FINISH + JSR COUT + INY + JMP ]NEXTCHR +FINISH PLA ;RESTORE Y + TAY + <<< + +******************************** +* * +* PAUSE Macro * +* * +******************************** + +PAUSE MAC + PUTS ]1 + JSR RDKEY + JSR CROUT + <<< + +******************************** +* * +* ADD_TO_ADDR MACRO * +* * +******************************** + +ADD_TO_ADDR MAC + LDA ]1 + CLC + ADC ]2 + STA ]1 + BCC DONE + INC ]1+1 +DONE <<< + diff --git a/asm/symbols.s b/asm/symbols.s new file mode 100644 index 0000000..a6b9ff1 --- /dev/null +++ b/asm/symbols.s @@ -0,0 +1,64 @@ +******************************** +* * +* SYMBOLS REFERENCING SYSTEM * +* RESOURCES * +* * +* AUTHOR: BILL CHATFIELD * +* LICENSE: GPL * +* * +******************************** + +CH EQU $24 ;HORIZ CHAR POS (40-COL) +BASL EQU $28 ;BASE ADDR FOR CURR VIDEO LINE +KSWL EQU $38 ;KEYBOARD SWITCH LOW BYTE +KSWH EQU $39 ;KEYBOARD SWITCH HIGH BYTE +IN EQU $200 ;256-CHAR INPUT BUFFER +OURCH EQU $57B ;HORIZONTAL POSITION (80-COL) +OURCV EQU $5FB ;VERTICAL POSITION (80-COL) + +* ProDOS Addresses + +MLI EQU $BF00 ;ADDRESS OF MLI ENTRY POINT + +* Memory Mapped Input/Output addresses C000 - CFFF + +KBD EQU $C000 ;KEYBOARD DATA + STROBE +STOR80ON EQU $C001 ;ENABLE AUXILIARY MEM SWITCHING +CXROMOFF EQU $C006 ;ENABLE SLOT ROMS +CXROMON EQU $C007 ;TURN ON INTERNAL ROM +KBDSTRB EQU $C010 ;CLEAR KEYBOARD STROBE +ALTCHAR EQU $C01E ;>=$80 IF IN 80-COL +PAGE2OFF EQU $C054 ;TURN ON MAIN MEMORY +PAGE2ON EQU $C055 ;TURN ON AUXILIARY MEMORY +BASICIN EQU $C305 +BINPUT EQU $C8F6 +ESCAPING EQU $C918 +NOESC EQU $C9B7 ;HANDLES KEY OTHER THAN ESC +INVERT EQU $CEDD ;80-col INVERT CHAR ON SCREEN +PICK EQU $CF01 ;80-col PICK CHAR OFF SCREEN + +* Subroutines stored in ROM addresses D000 - FFFF + +STROUT EQU $DB3A ;BAS? PRINT NULL-TERM STR IN AY +HEXDEC EQU $ED24 ;HEX-TO-DECIMAL CONVERSION +PRINTXY EQU $F940 ;MONITOR PRINT X & Y AS HEX +RDKEY EQU $FD0C ;READS 1 CHAR +KEYIN EQU $FD1B +RDCHAR EQU $FD35 +GETLN EQU $FD6A +CROUT EQU $FD8E ;PRINT A CARRIAGE RETURN +PRBYTE EQU $FDDA ;MONITOR PRINT BYTE 2 HEX DIGITS +COUT EQU $FDED ;WRITE A CHARACTER +BELL EQU $FF3A ;SUBROUTINE TO BEEP + +* Keyboard key code definitions + +ESC EQU $9B ;ESC WITH HIGH BIT SET +RTARROW EQU $95 ;RIGHT ARROW WITH HIGH BIT SET +DELETE EQU $FF ;DELETE WITH HIGH BIT SET +BKSPACE EQU $88 ;BACKSPACE WITH HIGH BIT SET + +* ProDOS command definitions + +ON_LINE EQU $C5 ;ID FOR ON_LINE MLI SYSTEM CALL +