VM02/plasma3/test.a

178 lines
3.8 KiB
Plaintext
Executable File

; ACME COMPATIBLE OUTPUT
_SEGBEGIN
!WORD _SEGEND-_SEGBEGIN ; LENGTH OF HEADER + CODE/DATA + BYTECODE SEGMENT
!WORD $DA7E ; MAGIC #
!WORD _SUBSEG ; BYTECODE SUB-SEGMENT
; 001: ;
; 002: ; Declare all imported modules and their data/functions.
; 003: ;
; 004: import stdlib
; DCI STRING: STDLIB
!BYTE $D3,$D4,$C4,$CC,$C9,$42
; 005: predef cls, gotoxy, puts, putc
; cls -> X000
; gotoxy -> X001
; puts -> X002
; putc -> X003
; 006: end
; 007: ;
; 008: ; Predeclare and functions called before defined.
; 009: ;
; 010: predef main
!BYTE $00 ; END OF MODULE DEPENDENCIES
; 011: ;
; 012: ; Declare all global variables for this module.
; 013: ;
; 014: byte hello[] = "Hello, world.\n\n"
_D005 ; hello[] = "Hello, world.\n\n"
!BYTE $0F
!BYTE $48,$65,$6C,$6C,$6F,$2C,$20,$77
!BYTE $6F,$72,$6C,$64,$2E,$0A,$0A
; 015: word defptr = main
_D006 ; defptr = main
_F000 !WORD _C000
; 016: ;
; 017: ; Define functions.
; 018: ;
; 019:
; 020: export def ascii
_SUBSEG ; BYTECODE STARTS
_C001 ; ascii()
; 021: byte i
; i -> [2]
; 022: cls()
!BYTE $58,$03,$00 ; ENTER 3,0
!BYTE $54 ; CALL _X000
_F001 !WORD 0
!BYTE $30 ; DROP
; 023: for i = 32 to 127
!BYTE $2A,$20 ; CB 32
_B001
!BYTE $6C,$02 ; DLB [2]
!BYTE $2A,$7F ; CB 127
!BYTE $3A ; BRGT _B000
!WORD _B000-*
!BYTE $0C ; INCR
; 024: putc(i)
!BYTE $64,$02 ; LLB [2]
!BYTE $54 ; CALL _X003
_F002 !WORD 0
!BYTE $30 ; DROP
; 025: next
!BYTE $50 ; BRNCH _B001
!WORD _B001-*
_B000
!BYTE $30 ; DROP
; 026: end
!BYTE $00 ; ZERO
!BYTE $5A ; LEAVE
; 027:
; 028: export def main
_C000 ; main()
; 029: cls()
!BYTE $54 ; CALL _X000
_F003 !WORD 0
!BYTE $30 ; DROP
; 030: gotoxy(35,15)
!BYTE $2A,$23 ; CB 35
!BYTE $2A,$0F ; CB 15
!BYTE $54 ; CALL _X001
_F004 !WORD 0
!BYTE $30 ; DROP
; 031: return puts(@hello)
!BYTE $26 ; LA _D005
_F005 !WORD _D005
!BYTE $54 ; CALL _X002
_F006 !WORD 0
!BYTE $5C ; RET
; 032: end
; 033:
; 034: export def indirect
_C002 ; indirect()
; 035: word mainptr
; mainptr -> [2]
; 036: mainptr = @main
!BYTE $58,$04,$00 ; ENTER 4,0
!BYTE $26 ; LA _C000
_F007 !WORD _C000
!BYTE $76,$02 ; SLW [2]
; 037: mainptr()
!BYTE $28,$02 ; LLA [2]
!BYTE $56 ; ICAL
!BYTE $30 ; DROP
; 038: end
!BYTE $00 ; ZERO
!BYTE $5A ; LEAVE
; 039:
; 040: done
_SEGEND
;
; RE-LOCATEABLE DICTIONARY
;
!BYTE $02 ; CODE TABLE FIXUP
!WORD _C000
!BYTE $00
!BYTE $02 ; CODE TABLE FIXUP
!WORD _C001
!BYTE $00
!BYTE $02 ; CODE TABLE FIXUP
!WORD _C002
!BYTE $00
!BYTE $81 ; INTERNAL FIXUP
!WORD _F000
!BYTE $00
!BYTE $91 ; EXTERNAL FIXUP
!WORD _F001
!BYTE 0 ; ESD INDEX
!BYTE $91 ; EXTERNAL FIXUP
!WORD _F002
!BYTE 3 ; ESD INDEX
!BYTE $91 ; EXTERNAL FIXUP
!WORD _F003
!BYTE 0 ; ESD INDEX
!BYTE $91 ; EXTERNAL FIXUP
!WORD _F004
!BYTE 1 ; ESD INDEX
!BYTE $81 ; INTERNAL FIXUP
!WORD _F005
!BYTE $00
!BYTE $91 ; EXTERNAL FIXUP
!WORD _F006
!BYTE 2 ; ESD INDEX
!BYTE $81 ; INTERNAL FIXUP
!WORD _F007
!BYTE $00
!BYTE $00 ; END OF RLD
;
; EXTERNAL/ENTRY SYMBOL DICTIONARY
;
; DCI STRING: CLS
!BYTE $C3,$CC,$53
!BYTE $10 ; EXTERNAL SYMBOL FLAG
!WORD 0 ; ESD INDEX
; DCI STRING: GOTOXY
!BYTE $C7,$CF,$D4,$CF,$D8,$59
!BYTE $10 ; EXTERNAL SYMBOL FLAG
!WORD 1 ; ESD INDEX
; DCI STRING: PUTS
!BYTE $D0,$D5,$D4,$53
!BYTE $10 ; EXTERNAL SYMBOL FLAG
!WORD 2 ; ESD INDEX
; DCI STRING: PUTC
!BYTE $D0,$D5,$D4,$43
!BYTE $10 ; EXTERNAL SYMBOL FLAG
!WORD 3 ; ESD INDEX
; DCI STRING: MAIN
!BYTE $CD,$C1,$C9,$4E
!BYTE $08 ; ENTRY SYMBOL FLAG
!WORD _C000
; DCI STRING: ASCII
!BYTE $C1,$D3,$C3,$C9,$49
!BYTE $08 ; ENTRY SYMBOL FLAG
!WORD _C001
; DCI STRING: INDIRECT
!BYTE $C9,$CE,$C4,$C9,$D2,$C5,$C3,$54
!BYTE $08 ; ENTRY SYMBOL FLAG
!WORD _C002
!BYTE $00 ; END OF ESD