Funciona como el SYMBOL de Locomotive Basic pero usando solo espacios como separador.
Usa la rutina del firmware, así que es solamente para CPC.
Se pueden redefinir todos los caracteres, como con SYMBOL AFTER 0 en Basic.
SYMBOL.ASM
Código: Seleccionar todo
; Symbol
; The Basic SYMBOL command in Amstrad CPC CP/M PLus
; CP/M page 0 address
bios_jumps equ 1
argline equ 00080h
; CPC firmware address
txt_set_matrix equ 0BBA8h
start:
org 100h
call init_data
ld hl, argline + 1
call skip_spaces
call get_num
ld a, b
ld [charcode], a
ld de, chartable
nextvalue:
call skip_spaces
or a
jr z, doit
cp 0Dh
jr z, doit
call get_num
ld a, b
ld [de], a
inc de
jr nextvalue
doit:
ld a, [charcode]
ld hl, chartable
call do_userf
dw txt_set_matrix
call 0
skip_spaces:
ld a, [hl]
cp ' '
ret nz
inc hl
jr skip_spaces
get_num:
ld b, 0
digit:
; Multipliy by 10
ld a, b
add a, a
ld b, a
add a, a
add a, a
add a, b
ld b, a
; Add current digit
ld a, [hl]
sub '0'
add a, b
ld b, a
inc hl
ld a, [hl]
cp ' '
ret z
cp 0Dh
ret z
cp 0
ret z
jr digit
init_data:
; Fill the character data with 0
ld hl, chartable
xor a
ld b, 8
init_more:
ld [hl], a
inc hl
djnz init_more
ret
;---------------------------------------
do_userf:
push hl
push de
ld hl, [bios_jumps]
ld de, 057h ; Offset to USERF
add hl, de
pop de
ex [sp], hl
ret
;---------------------------------------
charcode db 0
; Must be in the high 16K
chartable equ 0C000h
end start
;---------------------------------------
SYMBOL.HEX
Código: Seleccionar todo
:10010000CD5501218100CD3301CD3A0178326C010A
:100110001100C0CD3301B7280CFE0D2808CD3A01DF
:1001200078121318EE3A6C012100C0CD6001A8BB13
:10013000CD00007EFE20C02318F90600788747878F
:100140008780477ED6308047237EFE20C8FE0DC8BC
:10015000FE00C818E72100C0AF0608772310FCC9CD
:0D016000E5D52A010011570019D1E3C900AF
:00000001FF