Navigation überspringen

Harald Markus Wirth


Seiteninhalt:

Acme ASM Template (C-64)


;==============================================================================
; ACME_TEMPLATE - copy(l)eft 2018 http://harald.ist.org/
;==============================================================================

;;!cpu 6510                     ; Enable illegal opcodes
!to "../acme_template cbm       ; Output file
!sl "../acme_template.sym               ; Symbols table
!convtab PET                    ; Character constants are PETSCII

!macro S_PROGRAM_VERSION .dummy {
        !pet "v0.0a"
}

;==============================================================================
!zone BASIC_START_PROGRAM
;==============================================================================
*= $0801                        ; Load point $0801 (BASIC START)
_FSTART                         ; This binary must begin with the bytes
                                ; representing the BASIC program: 0 SYS2061
BASIC_program
        !byte $0b,$08           ; $0801 Pointer to next line
        !byte $00,$00           ; $0803 Line number (0)
        !byte $9e               ; $0805 SYS
!byte 48+(entry_point/1000)%10  ; Decimal address of program entry point
!byte 48+(entry_point/100)%10
!byte 48+(entry_point/10)%10
!byte 48+(entry_point/1)%10
        !byte $00               ; $080a End of BASIC line
        !byte $00,$00           ; $080b End of BASIC program
entry_point     ;JMP boot       ; $080d First byte after the BASIC program


;==============================================================================
!zone BOOT
;==============================================================================
boot            JSR init
                JSR main
                JSR exit
                RTS                     ; Return to BASIC


;==============================================================================
!zone INIT
;==============================================================================

init
;==============================================================================
                JSR clear_heap
                JSR save_zeropage

                LDA #$0e                ; Lower case font
                JSR $ffd2               ; BSOUT
                LDA #$08                ; Font case toggle disabled
                JSR $ffd2               ; BSOUT

                LDA #$00                ; Black
                STA $d021               ; Border
                STA $d020               ; Background

                LDA #$01                ; White
                STA $0286               ; Text color
                JSR $e544               ; CLSR

                RTS


;==============================================================================
!zone MAIN
;==============================================================================

main
;------------------------------------------------------------------------------
                RTS


;==============================================================================
!zone EXIT
;==============================================================================

exit
;------------------------------------------------------------------------------
                LDA #$8e                ; Upper case font
                JSR $ffd2               ; BSOUT
                LDA #$09                ; Font case toggle enable
                JSR $ffd2               ; BSOUT

                LDA #$0e                ; Blue
                STA $d020               ; Background
                LDA #$06                ; Light blue
                STA $d021               ; Border

                LDA #$0e                ; Light blue
                STA $0286               ; Text color
                JSR $e544               ; CLSR

                ;LDX #<s_exit_message
                ;LDA #>s_exit_message
                ;JSR cputs
;------------------------------------------------------------------------------
.loop           LDA $cb                 ; Currently pressed key
                CMP #$40                ; $40 = no key pressed
                BNE .loop               ; Wait until key released
                LDA #$00
                STA $c6                 ; Nr. keys in input buffer

                JSR restore_zeropage    ; Clean up the mess, we created

                LDY # 5
                LDX # 0
                STY $d6                 ; Store x-pos
                STX $d3                 ; Store y-pos
                JSR $e56c               ; Set cursor


                RTS


;==============================================================================
!zone SAVE_RESTORE_ZEROPAGE
;==============================================================================
; Save/restore $0000..$00ff to/from heap. Enables return to BASIC.


save_zeropage
;------------------------------------------------------------------------------
                LDY #$00
.save_loop      LDA $00,Y
                STA zp_backup,Y
                INY
                BNE .save_loop
                RTS


restore_zeropage
;------------------------------------------------------------------------------
                TYA
                PHA

                LDY #$00
.restore_loop   LDA zp_backup,Y
                STA $00,Y
                INY
                BNE .restore_loop

                PLA
                TAY
                RTS


;==============================================================================
!zone CLEAR_HEAP
;==============================================================================

        .tptr = $f7

clear_heap
;------------------------------------------------------------------------------
                ; Clear heap variables

                LDA .tptr
                PHA
                LDA .tptr+1
                PHA

                LDY #<heap_vars_start

                LDA #>heap_vars_start
                STA .tptr+1
                LDA # 0
                STA .tptr

.loop           STA (.tptr),Y
                INY
                BNE .loop

                INC .tptr+1

                LDX #>heap_vars_end
                CPX .tptr+1
                BCS .loop

                PLA
                STA .tptr+1
                PLA
                STA .tptr

                RTS


;==============================================================================
!zone STATIC_DATA
;==============================================================================

s_exit_message  !pet petscii_home, petscii_lblue, petscii_rvs_off, 13
                !pet "asm-template", 13
                !pet "------------------------", 13
                !pet "http://harald.ist.org/", 13
                !pet "copy(l)eft 2019"
                !pet 0


;==============================================================================
!zone HEAP
;==============================================================================
heap_vars_start
zp_backup       *=zp_backup     + 256
heap_vars_end


;==============================================================================
!eof


Content Management:

μCMS α1.6